mirror of
https://github.com/lubosz/overte.git
synced 2025-04-11 13:42:07 +02:00
Adjust the freeze view and start drawing the views better
This commit is contained in:
parent
d619b2578f
commit
f087bb7623
6 changed files with 80 additions and 42 deletions
|
@ -59,9 +59,7 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext,
|
|||
space->copyProxyValues(proxies.data(), (uint32_t)proxies.size());
|
||||
|
||||
workload::Views views(space->getNumViews());
|
||||
if (!freezeViews) {
|
||||
space->copyViews(views);
|
||||
}
|
||||
space->copyViews(views);
|
||||
|
||||
// Valid space, let's display its content
|
||||
if (!render::Item::isValidID(_spaceRenderItemID)) {
|
||||
|
@ -77,9 +75,7 @@ void GameSpaceToRender::run(const workload::WorkloadContextPointer& runContext,
|
|||
item.showProxies(showProxies);
|
||||
item.setAllProxies(proxies);
|
||||
item.showViews(showViews);
|
||||
if (!freezeViews) {
|
||||
item.setAllViews(views);
|
||||
}
|
||||
item.setAllViews(views);
|
||||
});
|
||||
|
||||
scene->enqueueTransaction(transaction);
|
||||
|
@ -187,6 +183,7 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getViewsPipeline() {
|
|||
|
||||
gpu::Shader::BindingSet slotBindings;
|
||||
slotBindings.insert(gpu::Shader::Binding("workloadViewsBuffer", 1));
|
||||
slotBindings.insert(gpu::Shader::Binding("drawMeshBuffer", 0));
|
||||
gpu::Shader::makeProgram(*program, slotBindings);
|
||||
|
||||
auto state = std::make_shared<gpu::State>();
|
||||
|
@ -201,6 +198,32 @@ const gpu::PipelinePointer GameWorkloadRenderItem::getViewsPipeline() {
|
|||
}
|
||||
return _drawAllViewsPipeline;
|
||||
}
|
||||
|
||||
const gpu::BufferPointer GameWorkloadRenderItem::getDrawViewBuffer() {
|
||||
if (!_drawViewBuffer) {
|
||||
int numSegments = 64;
|
||||
float angleStep = M_PI * 2.0 / (float)numSegments;
|
||||
|
||||
struct Vert {
|
||||
glm::vec4 p;
|
||||
};
|
||||
std::vector<Vert> verts(numSegments + 1);
|
||||
for (int i = 0; i < numSegments; i++) {
|
||||
float angle = (float)i * angleStep;
|
||||
verts[i].p.x = cos(angle);
|
||||
verts[i].p.y = sin(angle);
|
||||
verts[i].p.z = angle;
|
||||
verts[i].p.w = 1.0;
|
||||
}
|
||||
verts[numSegments] = verts[0];
|
||||
verts[numSegments].p.w = 0.0;
|
||||
|
||||
_drawViewBuffer = std::make_shared<gpu::Buffer>(verts.size() * sizeof(Vert), (const gpu::Byte*) verts.data());
|
||||
_numDrawViewVerts = numSegments + 1;
|
||||
}
|
||||
return _drawViewBuffer;
|
||||
}
|
||||
|
||||
void GameWorkloadRenderItem::render(RenderArgs* args) {
|
||||
gpu::Batch& batch = *(args->_batch);
|
||||
|
||||
|
@ -221,8 +244,11 @@ void GameWorkloadRenderItem::render(RenderArgs* args) {
|
|||
if (_showViews) {
|
||||
batch.setPipeline(getViewsPipeline());
|
||||
|
||||
static const int NUM_VERTICES_PER_VIEW = 27;
|
||||
batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_VIEW * _numAllViews, 0);
|
||||
batch.setUniformBuffer(0, getDrawViewBuffer());
|
||||
// static const int NUM_VERTICES_PER_VIEW = 27;
|
||||
// batch.draw(gpu::TRIANGLES, NUM_VERTICES_PER_VIEW * _numAllViews, 0);
|
||||
batch.draw(gpu::TRIANGLES, _numDrawViewVerts * 4, 0);
|
||||
|
||||
}
|
||||
|
||||
batch.setResourceBuffer(0, nullptr);
|
||||
|
|
|
@ -85,6 +85,10 @@ protected:
|
|||
gpu::PipelinePointer _drawAllViewsPipeline;
|
||||
const gpu::PipelinePointer getViewsPipeline();
|
||||
|
||||
uint32_t _numDrawViewVerts{ 0 };
|
||||
gpu::BufferPointer _drawViewBuffer;
|
||||
const gpu::BufferPointer getDrawViewBuffer();
|
||||
|
||||
render::ItemKey _key;
|
||||
bool _showProxies{ true };
|
||||
bool _showViews{ true };
|
||||
|
|
|
@ -49,12 +49,17 @@ WorkloadView getWorkloadView(int i) {
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
out vec4 varColor;
|
||||
out vec3 varTexcoord;
|
||||
|
||||
const int NUM_VERTICES_PER_VIEW = 27;
|
||||
const int NUM_REGIONS_PER_VIEW = 3;
|
||||
const int NUM_VERTICES_PER_VIEW_REGION = NUM_VERTICES_PER_VIEW / NUM_REGIONS_PER_VIEW;
|
||||
layout(std140) uniform drawMeshBuffer {
|
||||
vec4 verts[65];
|
||||
};
|
||||
|
||||
void main(void) {
|
||||
const vec4 UNIT_SPRITE[NUM_VERTICES_PER_VIEW_REGION] = vec4[NUM_VERTICES_PER_VIEW_REGION](
|
||||
|
@ -89,32 +94,24 @@ void main(void) {
|
|||
vec4 region = view.regions[regionID];
|
||||
|
||||
vec4 proxyPosWorld = vec4(region.xyz, 1.0);
|
||||
float regionRadius = region.w;
|
||||
|
||||
// Define the sprite space
|
||||
vec3 dirZ = vec3(0.0, 0.0, 1.0);
|
||||
vec3 dirX = vec3(1.0, 0.0, 0.0);
|
||||
vec3 dirY = vec3(0.0, 1.0, 0.0);
|
||||
|
||||
vec3 originSpaceVert = regionRadius * (dirX * spriteVert.x + dirY * spriteVert.y + dirZ * spriteVert.z);
|
||||
|
||||
vec4 pos = vec4(proxyPosWorld.xyz + originSpaceVert, 1.0);
|
||||
varTexcoord = spriteVert.xyz;
|
||||
|
||||
// standard transform, bring proxy in view space
|
||||
TransformCamera cam = getTransformCamera();
|
||||
TransformObject obj = getTransformObject();
|
||||
vec4 proxyPosEye;
|
||||
<$transformModelToEyePos(cam, obj, proxyPosWorld, proxyPosEye)$>
|
||||
|
||||
// Define the billboarded space
|
||||
vec3 dirZ = vec3(0.0, 0.0, 1.0);
|
||||
vec3 dirX = vec3(1.0, 0.0, 0.0);
|
||||
vec3 dirY = vec3(0.0, 1.0, 0.0);
|
||||
|
||||
/*normalize(cross(vec3(0.0, 1.0, 0.0), dirZ));
|
||||
if (dot(proxyPosEye.xyz, proxyPosEye.xyz) > 0.01) {
|
||||
dirZ = -normalize(proxyPosEye.xyz);
|
||||
}
|
||||
vec3 dirX = normalize(cross(vec3(0.0, 1.0, 0.0), dirZ));
|
||||
vec3 dirY = normalize(cross(dirZ, dirX));
|
||||
*/
|
||||
float regionRadius = region.w;
|
||||
|
||||
vec3 originSpaceVert = dirY * (-0.02) + regionRadius * ( dirX * spriteVert.x + dirY * spriteVert.y + dirZ * spriteVert.z);
|
||||
|
||||
vec4 pos = vec4(proxyPosEye.xyz + originSpaceVert, 1.0);
|
||||
varTexcoord = spriteVert.xyz;
|
||||
<$transformEyeToClipPos(cam, pos, gl_Position)$>
|
||||
<$transformModelToEyePos(cam, obj, pos, proxyPosEye)$>
|
||||
<$transformEyeToClipPos(cam, proxyPosEye, gl_Position)$>
|
||||
|
||||
// Convert region to color
|
||||
varColor = vec4(colorWheel(float(regionID) / 4.0), regionRadius);
|
||||
|
|
|
@ -18,12 +18,17 @@ void SetupViews::configure(const Config& config) {
|
|||
}
|
||||
|
||||
void SetupViews::run(const WorkloadContextPointer& renderContext, const Input& inputs) {
|
||||
|
||||
Views views = inputs;
|
||||
for (auto& v : views) {
|
||||
// If views are frozen don't use the input
|
||||
if (!data.freezeViews) {
|
||||
_views = inputs;
|
||||
}
|
||||
|
||||
// Update regions based on the current config
|
||||
for (auto& v : _views) {
|
||||
View::updateRegions(v, (float*) &data);
|
||||
}
|
||||
|
||||
renderContext->_space->setViews(views);
|
||||
// Views are setup, assign to the Space
|
||||
renderContext->_space->setViews(_views);
|
||||
}
|
||||
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
namespace workload {
|
||||
class SetupViewsConfig : public Job::Config{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(float r1Front READ getR1Front WRITE setR1Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r1Back READ getR1Back WRITE setR1Back NOTIFY dirty)
|
||||
Q_PROPERTY(float r2Front READ getR2Front WRITE setR2Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r2Back READ getR2Back WRITE setR2Back NOTIFY dirty)
|
||||
Q_PROPERTY(float r3Front READ getR3Front WRITE setR3Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r3Back READ getR3Back WRITE setR3Back NOTIFY dirty)
|
||||
Q_PROPERTY(float r1Front READ getR1Front WRITE setR1Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r1Back READ getR1Back WRITE setR1Back NOTIFY dirty)
|
||||
Q_PROPERTY(float r2Front READ getR2Front WRITE setR2Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r2Back READ getR2Back WRITE setR2Back NOTIFY dirty)
|
||||
Q_PROPERTY(float r3Front READ getR3Front WRITE setR3Front NOTIFY dirty)
|
||||
Q_PROPERTY(float r3Back READ getR3Back WRITE setR3Back NOTIFY dirty)
|
||||
Q_PROPERTY(bool freezeViews READ getFreezeView WRITE setFreezeView NOTIFY dirty)
|
||||
public:
|
||||
SetupViewsConfig() : Job::Config(true) {}
|
||||
|
||||
|
||||
float getR1Front() const { return data.r1Front; }
|
||||
|
@ -40,6 +40,9 @@ namespace workload {
|
|||
void setR3Front(float d) { data.r3Front = d; emit dirty(); }
|
||||
void setR3Back(float d) { data.r3Back = d; emit dirty(); }
|
||||
|
||||
bool getFreezeView() const { return data.freezeViews; }
|
||||
void setFreezeView(bool freeze) { data.freezeViews = freeze; emit dirty(); }
|
||||
|
||||
struct Data {
|
||||
float r1Back { 2.0f };
|
||||
float r1Front { 10.0f };
|
||||
|
@ -49,6 +52,8 @@ namespace workload {
|
|||
|
||||
float r3Back{ 10.0f };
|
||||
float r3Front{ 100.0f };
|
||||
|
||||
bool freezeViews{ false };
|
||||
} data;
|
||||
|
||||
signals:
|
||||
|
@ -66,6 +71,7 @@ namespace workload {
|
|||
|
||||
protected:
|
||||
Config::Data data;
|
||||
Views _views;
|
||||
};
|
||||
|
||||
} // namespace workload
|
||||
|
|
|
@ -37,8 +37,8 @@ Rectangle {
|
|||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Freeze Views"
|
||||
checked: workload.spaceToRender["freezeViews"]
|
||||
onCheckedChanged: { workload.spaceToRender["freezeViews"] = checked, workload.setupViews.enabled = !checked; }
|
||||
checked: workload.setupViews["freezeViews"]
|
||||
onCheckedChanged: { workload.spaceToRender["freezeViews"] = checked, workload.setupViews["freezeViews"] = checked; }
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
|
|
Loading…
Reference in a new issue