From f087bb7623f3dd94fdb7a06744818168b6c95e69 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 9 Mar 2018 01:38:00 -0800 Subject: [PATCH] Adjust the freeze view and start drawing the views better --- .../src/workload/GameWorkloadRenderer.cpp | 42 +++++++++++++++---- interface/src/workload/GameWorkloadRenderer.h | 4 ++ .../render-utils/src/drawWorkloadView.slv | 39 ++++++++--------- libraries/workload/src/workload/ViewTask.cpp | 13 ++++-- libraries/workload/src/workload/ViewTask.h | 20 +++++---- .../developer/utilities/workload/workload.qml | 4 +- 6 files changed, 80 insertions(+), 42 deletions(-) diff --git a/interface/src/workload/GameWorkloadRenderer.cpp b/interface/src/workload/GameWorkloadRenderer.cpp index 155369e430..85b3a03739 100644 --- a/interface/src/workload/GameWorkloadRenderer.cpp +++ b/interface/src/workload/GameWorkloadRenderer.cpp @@ -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(); @@ -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 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(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); diff --git a/interface/src/workload/GameWorkloadRenderer.h b/interface/src/workload/GameWorkloadRenderer.h index 27733ce570..7a0800d40c 100644 --- a/interface/src/workload/GameWorkloadRenderer.h +++ b/interface/src/workload/GameWorkloadRenderer.h @@ -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 }; diff --git a/libraries/render-utils/src/drawWorkloadView.slv b/libraries/render-utils/src/drawWorkloadView.slv index 09dc41e471..d82a47bd7a 100644 --- a/libraries/render-utils/src/drawWorkloadView.slv +++ b/libraries/render-utils/src/drawWorkloadView.slv @@ -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); diff --git a/libraries/workload/src/workload/ViewTask.cpp b/libraries/workload/src/workload/ViewTask.cpp index 3f7a9b740d..705f517243 100644 --- a/libraries/workload/src/workload/ViewTask.cpp +++ b/libraries/workload/src/workload/ViewTask.cpp @@ -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); } diff --git a/libraries/workload/src/workload/ViewTask.h b/libraries/workload/src/workload/ViewTask.h index b85cb95ded..2b77aaf273 100644 --- a/libraries/workload/src/workload/ViewTask.h +++ b/libraries/workload/src/workload/ViewTask.h @@ -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 diff --git a/scripts/developer/utilities/workload/workload.qml b/scripts/developer/utilities/workload/workload.qml index e4fa244f9d..020df0f83a 100644 --- a/scripts/developer/utilities/workload/workload.qml +++ b/scripts/developer/utilities/workload/workload.qml @@ -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 {