From 12fcb357171e81fc8fb1e7af1b4c037cbcf92e7d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 4 May 2015 17:22:46 +0200 Subject: [PATCH 01/19] Made RenderArgs a default ctor --- interface/src/ui/overlays/Overlays.cpp | 18 +++++------ .../src/EntityTreeRenderer.cpp | 4 +-- libraries/octree/src/OctreeRenderer.cpp | 4 +-- libraries/shared/src/RenderArgs.h | 32 +++++++++++++++++-- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index a9eb9184dd..eb2c0d77a7 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -87,11 +87,10 @@ void Overlays::renderHUD() { QReadLocker lock(&_lock); auto lodManager = DependencyManager::get(); - RenderArgs args = { NULL, Application::getInstance()->getViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + RenderArgs args(NULL, Application::getInstance()->getViewFrustum(), + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); foreach(Overlay* thisOverlay, _overlaysHUD) { if (thisOverlay->is3D()) { @@ -125,11 +124,10 @@ void Overlays::renderWorld(bool drawFront, float myAvatarScale = 1.0f; auto lodManager = DependencyManager::get(); - RenderArgs args = { NULL, Application::getInstance()->getDisplayViewFrustum(), - lodManager->getOctreeSizeScale(), - lodManager->getBoundaryLevelAdjust(), - renderMode, renderSide, renderDebugFlags, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + RenderArgs args(NULL, Application::getInstance()->getDisplayViewFrustum(), + lodManager->getOctreeSizeScale(), + lodManager->getBoundaryLevelAdjust(), + renderMode, renderSide, renderDebugFlags); foreach(Overlay* thisOverlay, _overlaysWorld) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c9a968a58e..041dde70bf 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -392,8 +392,8 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, ViewFrustum* frustum = (renderMode == RenderArgs::SHADOW_RENDER_MODE) ? _viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum(); - RenderArgs args = { this, frustum, getSizeScale(), getBoundaryLevelAdjust(), renderMode, renderSide, - renderDebugFlags, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + RenderArgs args(this, frustum, getSizeScale(), getBoundaryLevelAdjust(), + renderMode, renderSide, renderDebugFlags); _tree->lockForRead(); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 4347934d87..946ad3aa1b 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -167,8 +167,8 @@ bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) { void OctreeRenderer::render(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide, RenderArgs::DebugFlags renderDebugFlags) { - RenderArgs args = { this, _viewFrustum, getSizeScale(), getBoundaryLevelAdjust(), renderMode, renderSide, - renderDebugFlags, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + RenderArgs args(this, _viewFrustum, getSizeScale(), getBoundaryLevelAdjust(), + renderMode, renderSide, renderDebugFlags); if (_tree) { _tree->lockForRead(); _tree->recurseTreeWithOperation(renderOperation, &args); diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index bc3e2edb6d..d2e7298d0f 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -22,10 +22,36 @@ public: enum RenderSide { MONO, STEREO_LEFT, STEREO_RIGHT }; enum DebugFlags { - RENDER_DEBUG_NONE=0, - RENDER_DEBUG_HULLS=1, - RENDER_DEBUG_SIMULATION_OWNERSHIP=2 + RENDER_DEBUG_NONE = 0, + RENDER_DEBUG_HULLS = 1, + RENDER_DEBUG_SIMULATION_OWNERSHIP = 2, }; + + RenderArgs(OctreeRenderer* _renderer = nullptr, + ViewFrustum* _viewFrustum = nullptr, + float _sizeScale = 1.0f, + int _boundaryLevelAdjust = 0, + RenderMode _renderMode = DEFAULT_RENDER_MODE, + RenderSide _renderSide = MONO, + DebugFlags _debugFlags = RENDER_DEBUG_NONE, + + int _elementsTouched = 0, + int _itemsRendered = 0, + int _itemsOutOfView = 0, + int _itemsTooSmall = 0, + + int _meshesConsidered = 0, + int _meshesRendered = 0, + int _meshesOutOfView = 0, + int _meshesTooSmall = 0, + + int _materialSwitches = 0, + int _trianglesRendered = 0, + int _quadsRendered = 0, + + int _translucentMeshPartsRendered = 0, + int _opaqueMeshPartsRendered = 0) { + } OctreeRenderer* _renderer; ViewFrustum* _viewFrustum; From 34a39250f205e6a89ed1be0cc557d69cd022598f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 15:13:00 +0200 Subject: [PATCH 02/19] Add basic render to zones --- .../entities-renderer/src/RenderableZoneEntityItem.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 0b51cf75f2..82c736ad75 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -13,6 +13,7 @@ #include #include +#include EntityItem* RenderableZoneEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return new RenderableZoneEntityItem(entityID, properties); @@ -76,7 +77,10 @@ void RenderableZoneEntityItem::initialSimulation() { void RenderableZoneEntityItem::render(RenderArgs* args) { if (_drawZoneBoundaries) { - // TODO: Draw the zone boundaries... + if (_model->isActive()) { + PerformanceTimer perfTimer("zone->render"); + _model->renderInScene(getLocalRenderAlpha(), args); + } } } From 0e3061f05223edc3a5498cac7c40e8023dc62393 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 15:14:29 +0200 Subject: [PATCH 03/19] Add isWireframe to model class --- libraries/render-utils/src/Model.cpp | 7 ++++--- libraries/render-utils/src/Model.h | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 7528d1db4d..260efe306f 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -84,6 +84,7 @@ Model::Model(QObject* parent) : _calculatedMeshBoxesValid(false), _calculatedMeshTrianglesValid(false), _meshGroupsKnown(false), + _isWireframe(false), _renderCollisionHull(false) { // we may have been created in the network thread, but we live in the main thread @@ -100,8 +101,8 @@ Model::RenderPipelineLib Model::_renderPipelineLib; const GLint MATERIAL_GPU_SLOT = 3; void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, - gpu::ShaderPointer& vertexShader, - gpu::ShaderPointer& pixelShader ) { + gpu::ShaderPointer& vertexShader, + gpu::ShaderPointer& pixelShader ) { gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); @@ -2072,7 +2073,7 @@ void Model::segregateMeshGroups() { } _meshGroupsKnown = true; -} +} QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned) { PROFILE_RANGE(__FUNCTION__); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index dba8f5277f..1c663eceb5 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -116,6 +116,9 @@ public: Q_INVOKABLE void setCollisionModelURL(const QUrl& url); const QUrl& getCollisionURL() const { return _collisionUrl; } + void setIsWireframe(bool isWireframe) { _isWireframe = isWireframe; } + bool isWireframe() const { return _isWireframe; } + /// Sets the distance parameter used for LOD computations. void setLODDistance(float distance) { _lodDistance = distance; } @@ -350,6 +353,7 @@ private: void segregateMeshGroups(); // used to calculate our list of translucent vs opaque meshes bool _meshGroupsKnown; + bool _isWireframe; // debug rendering support From bc04685dbf78d6afbdc477ca8ea1cb2250736f43 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 15:15:18 +0200 Subject: [PATCH 04/19] Add isWireframe to RenderKey --- libraries/render-utils/src/Model.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 1c663eceb5..6bd803d69c 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -404,7 +404,8 @@ private: IS_DEPTH_ONLY_FLAG, IS_SHADOW_FLAG, IS_MIRROR_FLAG, //THis means that the mesh is rendered mirrored, not the same as "Rear view mirror" - + IS_WIREFRAME_FLAG, + NUM_FLAGS, }; @@ -419,7 +420,7 @@ private: IS_DEPTH_ONLY = (1 << IS_DEPTH_ONLY_FLAG), IS_SHADOW = (1 << IS_SHADOW_FLAG), IS_MIRROR = (1 << IS_MIRROR_FLAG), - + IS_WIREFRAME = (1 << IS_WIREFRAME_FLAG) }; typedef unsigned short Flags; @@ -437,6 +438,7 @@ private: bool isDepthOnly() const { return isFlag(IS_DEPTH_ONLY); } bool isShadow() const { return isFlag(IS_SHADOW); } // = depth only but with back facing bool isMirror() const { return isFlag(IS_MIRROR); } + bool isWireFrame() const { return isFlag(IS_WIREFRAME); } Flags _flags = 0; short _spare = 0; @@ -446,22 +448,24 @@ private: RenderKey( bool translucent, bool hasLightmap, - bool hasTangents, bool hasSpecular, bool isSkinned) : + bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe) : RenderKey( (translucent ? IS_TRANSLUCENT : 0) | (hasLightmap ? HAS_LIGHTMAP : 0) | (hasTangents ? HAS_TANGENTS : 0) | (hasSpecular ? HAS_SPECULAR : 0) | (isSkinned ? IS_SKINNED : 0) + | (isWireframe ? IS_WIREFRAME : 0) ) {} RenderKey(RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, - bool hasTangents, bool hasSpecular, bool isSkinned) : + bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe) : RenderKey( ((translucent && (alphaThreshold == 0.0f) && (mode != RenderArgs::SHADOW_RENDER_MODE)) ? IS_TRANSLUCENT : 0) | (hasLightmap && (mode != RenderArgs::SHADOW_RENDER_MODE) ? HAS_LIGHTMAP : 0) // Lightmap, tangents and specular don't matter for depthOnly | (hasTangents && (mode != RenderArgs::SHADOW_RENDER_MODE) ? HAS_TANGENTS : 0) | (hasSpecular && (mode != RenderArgs::SHADOW_RENDER_MODE) ? HAS_SPECULAR : 0) | (isSkinned ? IS_SKINNED : 0) + | (isWireframe ? IS_WIREFRAME : 0) | ((mode == RenderArgs::SHADOW_RENDER_MODE) ? IS_DEPTH_ONLY : 0) | ((mode == RenderArgs::SHADOW_RENDER_MODE) ? IS_SHADOW : 0) | ((mode == RenderArgs::MIRROR_RENDER_MODE) ? IS_MIRROR :0) From 6fdb594dfdfb43f62d4be636977feb0f6b28e3d1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 16:40:16 +0200 Subject: [PATCH 05/19] Forgot member initialisation --- libraries/shared/src/RenderArgs.h | 64 +++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index d2e7298d0f..3019535d2a 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -27,30 +27,54 @@ public: RENDER_DEBUG_SIMULATION_OWNERSHIP = 2, }; - RenderArgs(OctreeRenderer* _renderer = nullptr, - ViewFrustum* _viewFrustum = nullptr, - float _sizeScale = 1.0f, - int _boundaryLevelAdjust = 0, - RenderMode _renderMode = DEFAULT_RENDER_MODE, - RenderSide _renderSide = MONO, - DebugFlags _debugFlags = RENDER_DEBUG_NONE, + RenderArgs(OctreeRenderer* renderer = nullptr, + ViewFrustum* viewFrustum = nullptr, + float sizeScale = 1.0f, + int boundaryLevelAdjust = 0, + RenderMode renderMode = DEFAULT_RENDER_MODE, + RenderSide renderSide = MONO, + DebugFlags debugFlags = RENDER_DEBUG_NONE, - int _elementsTouched = 0, - int _itemsRendered = 0, - int _itemsOutOfView = 0, - int _itemsTooSmall = 0, + int elementsTouched = 0, + int itemsRendered = 0, + int itemsOutOfView = 0, + int itemsTooSmall = 0, - int _meshesConsidered = 0, - int _meshesRendered = 0, - int _meshesOutOfView = 0, - int _meshesTooSmall = 0, + int meshesConsidered = 0, + int meshesRendered = 0, + int meshesOutOfView = 0, + int meshesTooSmall = 0, - int _materialSwitches = 0, - int _trianglesRendered = 0, - int _quadsRendered = 0, + int materialSwitches = 0, + int trianglesRendered = 0, + int quadsRendered = 0, - int _translucentMeshPartsRendered = 0, - int _opaqueMeshPartsRendered = 0) { + int translucentMeshPartsRendered = 0, + int opaqueMeshPartsRendered = 0) : + _renderer(renderer), + _viewFrustum(viewFrustum), + _sizeScale(sizeScale), + _boundaryLevelAdjust(boundaryLevelAdjust), + _renderMode(renderMode), + _renderSide(renderSide), + _debugFlags(debugFlags), + + _elementsTouched(elementsTouched), + _itemsRendered(itemsRendered), + _itemsOutOfView(itemsOutOfView), + _itemsTooSmall(itemsTooSmall), + + _meshesConsidered(meshesConsidered), + _meshesRendered(meshesRendered), + _meshesOutOfView(meshesOutOfView), + _meshesTooSmall(meshesTooSmall), + + _materialSwitches(materialSwitches), + _trianglesRendered(trianglesRendered), + _quadsRendered(quadsRendered), + + _translucentMeshPartsRendered(translucentMeshPartsRendered), + _opaqueMeshPartsRendered(opaqueMeshPartsRendered) { } OctreeRenderer* _renderer; From 40295ab04eeb288eb768ace315616c86c9add1a4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 17:19:42 +0200 Subject: [PATCH 06/19] Cleanup RenderableZoneEntityItem --- .../src/RenderableZoneEntityItem.cpp | 36 ++++++++++++------- .../src/RenderableZoneEntityItem.h | 1 + 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 82c736ad75..050fb364b4 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -28,10 +28,12 @@ void RenderableZoneEntityItem::changeProperties(Lambda setNewProperties) { setNewProperties(); if (oldShapeURL != getCompoundShapeURL()) { - if (!_model) { - _model = getModel(); - _needsInitialSimulation = true; + if (_model) { + delete _model; } + + _model = getModel(); + _needsInitialSimulation = true; _model->setURL(getCompoundShapeURL(), QUrl(), true, true); } if (oldPosition != getPosition() || @@ -62,6 +64,7 @@ int RenderableZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch Model* RenderableZoneEntityItem::getModel() { Model* model = new Model(); + model->setIsWireframe(true); model->init(); return model; } @@ -75,11 +78,25 @@ void RenderableZoneEntityItem::initialSimulation() { _needsInitialSimulation = false; } +void RenderableZoneEntityItem::updateGeometry() { + if (_model && !_model->isActive() && hasCompoundShapeURL()) { + // Since we have a delayload, we need to update the geometry if it has been downloaded + _model->setURL(getCompoundShapeURL(), QUrl(), true); + } + if (_model && _model->isActive() && _needsInitialSimulation) { + initialSimulation(); + } +} + void RenderableZoneEntityItem::render(RenderArgs* args) { - if (_drawZoneBoundaries) { - if (_model->isActive()) { + if (_drawZoneBoundaries || true) { + updateGeometry(); + + if (_model && _model->isActive()) { PerformanceTimer perfTimer("zone->render"); + glPushMatrix(); _model->renderInScene(getLocalRenderAlpha(), args); + glPopMatrix(); } } } @@ -88,16 +105,9 @@ bool RenderableZoneEntityItem::contains(const glm::vec3& point) const { if (getShapeType() != SHAPE_TYPE_COMPOUND) { return EntityItem::contains(point); } - - if (_model && !_model->isActive() && hasCompoundShapeURL()) { - // Since we have a delayload, we need to update the geometry if it has been downloaded - _model->setURL(getCompoundShapeURL(), QUrl(), true); - } + const_cast(this)->updateGeometry(); if (_model && _model->isActive() && EntityItem::contains(point)) { - if (_needsInitialSimulation) { - const_cast(this)->initialSimulation(); - } return _model->convexHullContains(point); } diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index 18840e274b..90a16a8a9f 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -38,6 +38,7 @@ public: private: Model* getModel(); void initialSimulation(); + void updateGeometry(); template void changeProperties(Lambda functor); From 46cd1f458b16fbc65096f1c2d7b75c95ef5e2608 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 17:20:27 +0200 Subject: [PATCH 07/19] Actually call render on zone entities from tree --- .../src/EntityTreeRenderer.cpp | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 041dde70bf..273f2d67e5 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -641,8 +641,7 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) if (entityItem->isVisible()) { - // NOTE: Zone Entities are a special case we handle here... Zones don't render - // like other entity types. So we will skip the normal rendering tests + // NOTE: Zone Entities are a special case we handle here... if (entityItem->getType() == EntityTypes::Zone) { if (entityItem->contains(_viewState->getAvatarPosition())) { float entityVolumeEstimate = entityItem->getVolumeEstimate(); @@ -663,42 +662,42 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) } } } - } else { - // render entityItem - AABox entityBox = entityItem->getAABox(); - - // TODO: some entity types (like lights) might want to be rendered even - // when they are outside of the view frustum... - float distance = args->_viewFrustum->distanceToCamera(entityBox.calcCenter()); + } - bool outOfView = args->_viewFrustum->boxInFrustum(entityBox) == ViewFrustum::OUTSIDE; - if (!outOfView) { - bool bigEnoughToRender = _viewState->shouldRenderMesh(entityBox.getLargestDimension(), distance); + // render entityItem + AABox entityBox = entityItem->getAABox(); + + // TODO: some entity types (like lights) might want to be rendered even + // when they are outside of the view frustum... + float distance = args->_viewFrustum->distanceToCamera(entityBox.calcCenter()); + + bool outOfView = args->_viewFrustum->boxInFrustum(entityBox) == ViewFrustum::OUTSIDE; + if (!outOfView) { + bool bigEnoughToRender = _viewState->shouldRenderMesh(entityBox.getLargestDimension(), distance); - if (bigEnoughToRender) { - renderProxies(entityItem, args); - - Glower* glower = NULL; - if (entityItem->getGlowLevel() > 0.0f) { - glower = new Glower(entityItem->getGlowLevel()); - } - entityItem->render(args); - args->_itemsRendered++; - if (glower) { - delete glower; - } - } else { - args->_itemsTooSmall++; + if (bigEnoughToRender) { + renderProxies(entityItem, args); + + Glower* glower = NULL; + if (entityItem->getGlowLevel() > 0.0f) { + glower = new Glower(entityItem->getGlowLevel()); + } + entityItem->render(args); + args->_itemsRendered++; + if (glower) { + delete glower; } } else { - args->_itemsOutOfView++; + args->_itemsTooSmall++; } + } else { + args->_itemsOutOfView++; } } } } -float EntityTreeRenderer::getSizeScale() const { +float EntityTreeRenderer::getSizeScale() const { return _viewState->getSizeScale(); } From e0f3a8212f523378f6a390de9456b194ceff60a7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 17:23:10 +0200 Subject: [PATCH 08/19] Add wireframe arg to render fct --- libraries/render-utils/src/Model.cpp | 132 +++++++++++++-------------- libraries/render-utils/src/Model.h | 8 +- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 260efe306f..00c5f57b07 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -809,19 +809,19 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { //renderMeshes(batch, mode, translucent, alphaThreshold, hasTangents, hasSpecular, isSkinned, args, forceRenderMeshes); int opaqueMeshPartsRendered = 0; - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, true, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, true, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, true, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, true, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, true, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, true, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, true, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, true, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, args, true); - opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, false, args, true); + opaqueMeshPartsRendered += renderMeshes(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, false, args, true); // render translucent meshes afterwards //DependencyManager::get()->setPrimaryDrawBuffers(false, true, true); @@ -835,14 +835,14 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { int translucentMeshPartsRendered = 0; const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, false, args, true); { GLenum buffers[1]; @@ -856,14 +856,14 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { // batch.setFramebuffer(DependencyManager::get()->getPrimaryTransparentFramebuffer()); const float MOSTLY_TRANSPARENT_THRESHOLD = 0.0f; - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, true, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, false, args, true); - translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, true, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, true, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, false, false, args, true); + translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, true, false, args, true); // batch.setFramebuffer(DependencyManager::get()->getPrimaryOpaqueFramebuffer()); } @@ -1111,7 +1111,7 @@ void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bo // if so instructed, keep the current geometry until the new one is loaded _nextBaseGeometry = _nextGeometry = DependencyManager::get()->getGeometry(url, fallback, delayLoad); _nextLODHysteresis = NetworkGeometry::NO_HYSTERESIS; - if (!retainCurrent || !isActive() || _nextGeometry->isLoaded()) { + if (!retainCurrent || !isActive() || (_nextGeometry && _nextGeometry->isLoaded())) { applyNextGeometry(); } } @@ -1874,19 +1874,19 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { int opaqueMeshPartsRendered = 0; // now, for each model in the scene, render the mesh portions - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, true, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, true, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, true, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, true, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, true, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, true, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, true, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, true, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, false, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, false, args); // render translucent meshes afterwards { @@ -1899,14 +1899,14 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { int translucentParts = 0; const float MOSTLY_OPAQUE_THRESHOLD = 0.75f; - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, false, args); { @@ -1922,14 +1922,14 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { // batch.setFramebuffer(DependencyManager::get()->getPrimaryTransparentFramebuffer()); const float MOSTLY_TRANSPARENT_THRESHOLD = 0.0f; - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, true, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, false, args); - translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, true, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, true, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, false, false, args); + translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, true, false, args); // batch.setFramebuffer(DependencyManager::get()->getPrimaryOpaqueFramebuffer()); } @@ -2059,7 +2059,7 @@ void Model::segregateMeshGroups() { qCDebug(renderutils) << "materialID:" << materialID << "parts:" << mesh.parts.size(); } - RenderKey key(translucentMesh, hasLightmap, hasTangents, hasSpecular, isSkinned); + RenderKey key(translucentMesh, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe()); // reuse or create the bucket corresponding to that key and insert the mesh as unsorted _renderBuckets[key.getRaw()]._unsortedMeshes.insertMulti(materialID, i); @@ -2081,7 +2081,7 @@ QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool h // depending on which parameters we were called with, pick the correct mesh group to render QVector* whichList = NULL; - RenderKey key(translucent, hasLightmap, hasTangents, hasSpecular, isSkinned); + RenderKey key(translucent, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe()); auto bucket = _renderBuckets.find(key.getRaw()); if (bucket != _renderBuckets.end()) { @@ -2092,10 +2092,10 @@ QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool h } void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args, + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args, Locations*& locations) { - RenderKey key(mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned); + RenderKey key(mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe); auto pipeline = _renderPipelineLib.find(key.getRaw()); if (pipeline == _renderPipelineLib.end()) { qDebug() << "No good, couldn't find a pipeline from the key ?" << key.getRaw(); @@ -2120,7 +2120,7 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f } int Model::renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args) { + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); int meshPartsRendered = 0; @@ -2134,7 +2134,7 @@ int Model::renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool QVector& list = *whichList; if (list.size() > 0) { if (pickProgramsNeeded) { - pickPrograms(batch, mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, args, locations); + pickPrograms(batch, mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe, args, locations); pickProgramsNeeded = false; } @@ -2148,7 +2148,7 @@ int Model::renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool } int Model::renderMeshes(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args, + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args, bool forceRenderSomeMeshes) { PROFILE_RANGE(__FUNCTION__); @@ -2167,9 +2167,9 @@ int Model::renderMeshes(gpu::Batch& batch, RenderMode mode, bool translucent, fl } Locations* locations = nullptr; - pickPrograms(batch, mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, + pickPrograms(batch, mode, translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe, args, locations); - meshPartsRendered = renderMeshesFromList(list, batch, mode, translucent, alphaThreshold, + meshPartsRendered = renderMeshesFromList(list, batch, mode, translucent, alphaThreshold, args, locations, forceRenderSomeMeshes); return meshPartsRendered; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 6bd803d69c..83d52d390c 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -370,8 +370,8 @@ private: // helper functions used by render() or renderInScene() void renderSetup(RenderArgs* args); bool renderCore(float alpha, RenderArgs::RenderMode mode, RenderArgs* args); - int renderMeshes(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args = NULL, + int renderMeshes(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args = NULL, bool forceRenderMeshes = false); void setupBatchTransform(gpu::Batch& batch, RenderArgs* args); @@ -382,11 +382,11 @@ private: bool forceRenderSomeMeshes = false); static void pickPrograms(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args, + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args, Locations*& locations); static int renderMeshesForModelsInScene(gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, - bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args); + bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe, RenderArgs* args); static AbstractViewStateInterface* _viewState; From 73b7530ec6a2477b4dbdfc757254930de9598cc8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 21:50:06 +0200 Subject: [PATCH 09/19] Add wireframe pipelines --- libraries/render-utils/src/Model.cpp | 30 ++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 00c5f57b07..a022151c7d 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -120,7 +120,7 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - + // Backface on shadow if (key.isShadow()) { state->setCullMode(gpu::State::CULL_FRONT); @@ -141,7 +141,20 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, // Good to go add the brand new pipeline auto pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); insert(value_type(key.getRaw(), RenderPipeline(pipeline, locations))); - + + + if (!key.isWireFrame()) { + + RenderKey wireframeKey(key.getRaw() | RenderKey::IS_WIREFRAME); + gpu::StatePointer wireframeState = gpu::StatePointer(new gpu::State(state->getValues())); + + wireframeState->setFillMode(gpu::State::FILL_LINE); + + // create a new RenderPipeline with the same shader side and the mirrorState + auto wireframePipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, wireframeState)); + insert(value_type(wireframeKey.getRaw(), RenderPipeline(wireframePipeline, locations))); + } + // If not a shadow pass, create the mirror version from the same state, just change the FrontFace if (!key.isShadow()) { @@ -153,6 +166,17 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey key, // create a new RenderPipeline with the same shader side and the mirrorState auto mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, mirrorState)); insert(value_type(mirrorKey.getRaw(), RenderPipeline(mirrorPipeline, locations))); + + if (!key.isWireFrame()) { + RenderKey wireframeKey(key.getRaw() | RenderKey::IS_MIRROR | RenderKey::IS_WIREFRAME); + gpu::StatePointer wireframeState = gpu::StatePointer(new gpu::State(state->getValues()));; + + wireframeState->setFillMode(gpu::State::FILL_LINE); + + // create a new RenderPipeline with the same shader side and the mirrorState + auto wireframePipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, wireframeState)); + insert(value_type(wireframeKey.getRaw(), RenderPipeline(wireframePipeline, locations))); + } } } @@ -1887,6 +1911,8 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, false, args); + + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, true, true, args); // render translucent meshes afterwards { From 863280300e5d52308f8df946185b80ea4e4d54a1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 22:37:00 +0200 Subject: [PATCH 10/19] Fix pickMeshList incorrect arguments --- libraries/render-utils/src/Model.cpp | 16 ++++++++-------- libraries/render-utils/src/Model.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index a022151c7d..b966820517 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1906,13 +1906,13 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, true, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, true, false, args); - + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, false, false, args); opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, false, false, args); - opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, true, true, args); + opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, false, true, args); // render translucent meshes afterwards { @@ -2044,7 +2044,7 @@ bool Model::renderInScene(float alpha, RenderArgs* args) { updateGeometry(); simulate(0.0, true); } - + renderSetup(args); _modelsInScene.push_back(this); return true; @@ -2084,7 +2084,7 @@ void Model::segregateMeshGroups() { if (wantDebug) { qCDebug(renderutils) << "materialID:" << materialID << "parts:" << mesh.parts.size(); } - + RenderKey key(translucentMesh, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe()); // reuse or create the bucket corresponding to that key and insert the mesh as unsorted @@ -2101,13 +2101,13 @@ void Model::segregateMeshGroups() { _meshGroupsKnown = true; } -QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned) { +QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe) { PROFILE_RANGE(__FUNCTION__); // depending on which parameters we were called with, pick the correct mesh group to render QVector* whichList = NULL; - RenderKey key(translucent, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe()); + RenderKey key(translucent, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe); auto bucket = _renderBuckets.find(key.getRaw()); if (bucket != _renderBuckets.end()) { @@ -2155,7 +2155,7 @@ int Model::renderMeshesForModelsInScene(gpu::Batch& batch, RenderMode mode, bool Locations* locations = nullptr; foreach(Model* model, _modelsInScene) { - QVector* whichList = model->pickMeshList(translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned); + QVector* whichList = model->pickMeshList(translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe); if (whichList) { QVector& list = *whichList; if (list.size() > 0) { @@ -2181,7 +2181,7 @@ int Model::renderMeshes(gpu::Batch& batch, RenderMode mode, bool translucent, fl int meshPartsRendered = 0; //Pick the mesh list with the requested render flags - QVector* whichList = pickMeshList(translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned); + QVector* whichList = pickMeshList(translucent, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, isWireframe); if (!whichList) { return 0; } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 83d52d390c..9aa856312d 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -375,7 +375,7 @@ private: bool forceRenderMeshes = false); void setupBatchTransform(gpu::Batch& batch, RenderArgs* args); - QVector* pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned); + QVector* pickMeshList(bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, bool isWireframe); int renderMeshesFromList(QVector& list, gpu::Batch& batch, RenderArgs::RenderMode mode, bool translucent, float alphaThreshold, RenderArgs* args, Locations* locations, From 8b2442ce6e79d12abf97696fc8ac9c879d582177 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 5 May 2015 22:56:37 +0200 Subject: [PATCH 11/19] clear list after loop --- libraries/render-utils/src/Model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index b966820517..b175d972ac 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2094,8 +2094,8 @@ void Model::segregateMeshGroups() { for(auto& b : _renderBuckets) { foreach(auto i, b.second._unsortedMeshes) { b.second._meshes.append(i); - b.second._unsortedMeshes.clear(); } + b.second._unsortedMeshes.clear(); } _meshGroupsKnown = true; From 52191f922ccd8cd8d612e4159b07cd781082c64e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 6 May 2015 16:57:53 +0200 Subject: [PATCH 12/19] Render Sphere/Box zones --- .../src/RenderableZoneEntityItem.cpp | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 050fb364b4..6e4f4bae53 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -11,6 +11,7 @@ #include "RenderableZoneEntityItem.h" +#include #include #include #include @@ -90,13 +91,53 @@ void RenderableZoneEntityItem::updateGeometry() { void RenderableZoneEntityItem::render(RenderArgs* args) { if (_drawZoneBoundaries || true) { - updateGeometry(); - - if (_model && _model->isActive()) { - PerformanceTimer perfTimer("zone->render"); - glPushMatrix(); - _model->renderInScene(getLocalRenderAlpha(), args); - glPopMatrix(); + switch (getShapeType()) { + case SHAPE_TYPE_COMPOUND: { + updateGeometry(); + + if (_model && _model->isActive()) { + PerformanceTimer perfTimer("zone->renderCompound"); + glPushMatrix(); + _model->renderInScene(getLocalRenderAlpha(), args); + glPopMatrix(); + } + break; + } + case SHAPE_TYPE_BOX: + case SHAPE_TYPE_SPHERE: { + PerformanceTimer perfTimer("zone->renderPrimitive"); + glm::vec3 position = getPosition(); + glm::vec3 center = getCenter(); + glm::vec3 dimensions = getDimensions(); + glm::quat rotation = getRotation(); + + glm::vec4 DEFAULT_COLOR(1.0f, 1.0f, 1.0f, getLocalRenderAlpha()); + + glPushMatrix(); { + glTranslatef(position.x, position.y, position.z); + glm::vec3 axis = glm::axis(rotation); + glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + glPushMatrix(); { + glm::vec3 positionToCenter = center - position; + glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z); + glScalef(dimensions.x, dimensions.y, dimensions.z); + + auto deferredLightingEffect = DependencyManager::get(); + + if (getShapeType() == SHAPE_TYPE_SPHERE) { + const int SLICES = 15; + const int STACKS = 15; + deferredLightingEffect->renderWireSphere(0.5f, SLICES, STACKS, DEFAULT_COLOR); + } else { + deferredLightingEffect->renderWireCube(1.0f, DEFAULT_COLOR); + } + } glPopMatrix(); + } glPopMatrix(); + break; + } + default: + // Not handled + break; } } } From 50ba154615c64ba90a3ddbb6ba3c25f2ed29e4de Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 6 May 2015 17:04:01 +0200 Subject: [PATCH 13/19] Correctly wire setDrawZones --- examples/libraries/zoneOverlayManager.js | 1 + libraries/entities-renderer/src/RenderableZoneEntityItem.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/libraries/zoneOverlayManager.js b/examples/libraries/zoneOverlayManager.js index aac3af119b..92694f8e07 100644 --- a/examples/libraries/zoneOverlayManager.js +++ b/examples/libraries/zoneOverlayManager.js @@ -35,6 +35,7 @@ ZoneOverlayManager = function(isEntityFunc, entityAddedFunc, entityRemovedFunc, this.setVisible = function(isVisible) { if (visible != isVisible) { visible = isVisible; + Entities.setDrawZoneBoundaries(visible); for (var id in entityOverlays) { Overlays.editOverlay(entityOverlays[id].solid, { visible: visible }); Overlays.editOverlay(entityOverlays[id].outline, { visible: visible }); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 6e4f4bae53..d9bc0f0b4a 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -90,7 +90,7 @@ void RenderableZoneEntityItem::updateGeometry() { } void RenderableZoneEntityItem::render(RenderArgs* args) { - if (_drawZoneBoundaries || true) { + if (_drawZoneBoundaries) { switch (getShapeType()) { case SHAPE_TYPE_COMPOUND: { updateGeometry(); From 8de5e636bbf1b2d0f35430c6742fbbadeaa1133c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 6 May 2015 17:39:18 +0200 Subject: [PATCH 14/19] Bit of cleanup --- libraries/entities/src/ZoneEntityItem.cpp | 8 +++----- libraries/entities/src/ZoneEntityItem.h | 7 +------ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index c4646bebdf..52dea2cf2c 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -247,17 +247,15 @@ void ZoneEntityItem::debugDump() const { ShapeType ZoneEntityItem::getShapeType() const { // Zones are not allowed to have a SHAPE_TYPE_NONE... they are always at least a SHAPE_TYPE_BOX if (_shapeType == SHAPE_TYPE_COMPOUND) { - return hasCompoundShapeURL() ? SHAPE_TYPE_COMPOUND : SHAPE_TYPE_BOX; + return hasCompoundShapeURL() ? SHAPE_TYPE_COMPOUND : DEFAULT_SHAPE_TYPE; } else { - return _shapeType == SHAPE_TYPE_NONE ? SHAPE_TYPE_BOX : _shapeType; + return _shapeType == SHAPE_TYPE_NONE ? DEFAULT_SHAPE_TYPE : _shapeType; } } void ZoneEntityItem::setCompoundShapeURL(const QString& url) { _compoundShapeURL = url; - if (!_compoundShapeURL.isEmpty()) { - updateShapeType(SHAPE_TYPE_COMPOUND); - } else if (_shapeType == SHAPE_TYPE_COMPOUND) { + if (_compoundShapeURL.isEmpty() && _shapeType == SHAPE_TYPE_COMPOUND) { _shapeType = DEFAULT_SHAPE_TYPE; } } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 147cad7e45..eaf4c137b4 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -44,11 +44,6 @@ public: ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData); - // NOTE: Apparently if you begin to return a shape type, then the physics system will prevent an avatar - // from penetrating the walls of the entity. This fact will likely be important to Clement as he works - // on better defining the shape/volume of a zone. - //virtual ShapeType getShapeType() const { return SHAPE_TYPE_BOX; } - xColor getKeyLightColor() const { xColor color = { _keyLightColor[RED_INDEX], _keyLightColor[GREEN_INDEX], _keyLightColor[BLUE_INDEX] }; return color; } void setKeyLightColor(const xColor& value) { _keyLightColor[RED_INDEX] = value.red; @@ -144,7 +139,7 @@ protected: uint16_t _stageDay; float _stageHour; - ShapeType _shapeType = SHAPE_TYPE_NONE; + ShapeType _shapeType = DEFAULT_SHAPE_TYPE; QString _compoundShapeURL; BackgroundMode _backgroundMode = BACKGROUND_MODE_INHERIT; From 721eeccce2d9364154279f438e0e199bcbb5a3bf Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 May 2015 12:01:22 +0200 Subject: [PATCH 15/19] Restaure GL to default after we render a batch --- libraries/gpu/src/gpu/GLBackend.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 3c0ff4b309..5cb2e8b917 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -93,6 +93,11 @@ void GLBackend::render(Batch& batch) { command++; offset++; } + + // Restaure GL default state + for (auto command : gpu::GLBackend::GLState::_resetStateCommands) { + command->run(this); + } } void GLBackend::renderBatch(Batch& batch) { From 366964e4248582f0db975adbf81259aeb4576c6b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 May 2015 13:00:56 +0200 Subject: [PATCH 16/19] Fix static initialisation fiasco --- libraries/gpu/src/gpu/GLBackendState.cpp | 71 ++++++++++++++---------- libraries/gpu/src/gpu/State.cpp | 2 + 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackendState.cpp b/libraries/gpu/src/gpu/GLBackendState.cpp index 2d3eacd37f..23cfef7764 100644 --- a/libraries/gpu/src/gpu/GLBackendState.cpp +++ b/libraries/gpu/src/gpu/GLBackendState.cpp @@ -31,36 +31,51 @@ typedef GLBackend::GLState::Command1 CommandDepthTest; typedef GLBackend::GLState::Command3 CommandStencil; typedef GLBackend::GLState::Command1 CommandBlend; -// The state commands to reset to default, -// WARNING depending on the order of the State::Field enum -const GLBackend::GLState::Commands GLBackend::GLState::_resetStateCommands = { - CommandPointer(new Command1I(&GLBackend::do_setStateFillMode, State::DEFAULT.fillMode)), - CommandPointer(new Command1I(&GLBackend::do_setStateCullMode, State::DEFAULT.cullMode)), - CommandPointer(new Command1B(&GLBackend::do_setStateFrontFaceClockwise, State::DEFAULT.frontFaceClockwise)), - CommandPointer(new Command1B(&GLBackend::do_setStateDepthClipEnable, State::DEFAULT.depthClipEnable)), - CommandPointer(new Command1B(&GLBackend::do_setStateScissorEnable, State::DEFAULT.scissorEnable)), - CommandPointer(new Command1B(&GLBackend::do_setStateMultisampleEnable, State::DEFAULT.multisampleEnable)), - CommandPointer(new Command1B(&GLBackend::do_setStateAntialiasedLineEnable, State::DEFAULT.antialisedLineEnable)), +const GLBackend::GLState::Commands makeResetStateCommands(); +const GLBackend::GLState::Commands GLBackend::GLState::_resetStateCommands = makeResetStateCommands(); - // Depth bias has 2 fields in State but really one call in GLBackend - CommandPointer(new CommandDepthBias(&GLBackend::do_setStateDepthBias, Vec2(State::DEFAULT.depthBias, State::DEFAULT.depthBiasSlopeScale))), - CommandPointer(new CommandDepthBias(&GLBackend::do_setStateDepthBias, Vec2(State::DEFAULT.depthBias, State::DEFAULT.depthBiasSlopeScale))), - - CommandPointer(new CommandDepthTest(&GLBackend::do_setStateDepthTest, State::DEFAULT.depthTest)), - // Depth bias has 3 fields in State but really one call in GLBackend - CommandPointer(new CommandStencil(&GLBackend::do_setStateStencil, State::DEFAULT.stencilActivation, State::DEFAULT.stencilTestFront, State::DEFAULT.stencilTestBack)), - CommandPointer(new CommandStencil(&GLBackend::do_setStateStencil, State::DEFAULT.stencilActivation, State::DEFAULT.stencilTestFront, State::DEFAULT.stencilTestBack)), - CommandPointer(new CommandStencil(&GLBackend::do_setStateStencil, State::DEFAULT.stencilActivation, State::DEFAULT.stencilTestFront, State::DEFAULT.stencilTestBack)), - - CommandPointer(new Command1B(&GLBackend::do_setStateAlphaToCoverageEnable, State::DEFAULT.alphaToCoverageEnable)), - - CommandPointer(new Command1U(&GLBackend::do_setStateSampleMask, State::DEFAULT.sampleMask)), - - CommandPointer(new CommandBlend(&GLBackend::do_setStateBlend, State::DEFAULT.blendFunction)), - - CommandPointer(new Command1U(&GLBackend::do_setStateColorWriteMask, State::DEFAULT.colorWriteMask)) -}; +const GLBackend::GLState::Commands makeResetStateCommands() { + // Since State::DEFAULT is a static defined in another .cpp the initialisation order is random + // and we have a 50/50 chance that State::DEFAULT is not yet initialized. + // Since State::DEFAULT = State::Data() it is much easier to not use the actual State::DEFAULT + // but another State::Data object with a default initialization. + State::Data DEFAULT = State::Data(); + + CommandPointer depthBiasCommand = CommandPointer(new CommandDepthBias(&GLBackend::do_setStateDepthBias, Vec2(DEFAULT.depthBias, DEFAULT.depthBiasSlopeScale))); + CommandPointer stencilCommand = CommandPointer(new CommandStencil(&GLBackend::do_setStateStencil, DEFAULT.stencilActivation, DEFAULT.stencilTestFront, DEFAULT.stencilTestBack)); + + // The state commands to reset to default, + // WARNING depending on the order of the State::Field enum + return { + CommandPointer(new Command1I(&GLBackend::do_setStateFillMode, DEFAULT.fillMode)), + CommandPointer(new Command1I(&GLBackend::do_setStateCullMode, DEFAULT.cullMode)), + CommandPointer(new Command1B(&GLBackend::do_setStateFrontFaceClockwise, DEFAULT.frontFaceClockwise)), + CommandPointer(new Command1B(&GLBackend::do_setStateDepthClipEnable, DEFAULT.depthClipEnable)), + CommandPointer(new Command1B(&GLBackend::do_setStateScissorEnable, DEFAULT.scissorEnable)), + CommandPointer(new Command1B(&GLBackend::do_setStateMultisampleEnable, DEFAULT.multisampleEnable)), + CommandPointer(new Command1B(&GLBackend::do_setStateAntialiasedLineEnable, DEFAULT.antialisedLineEnable)), + + // Depth bias has 2 fields in State but really one call in GLBackend + CommandPointer(depthBiasCommand), + CommandPointer(depthBiasCommand), + + CommandPointer(new CommandDepthTest(&GLBackend::do_setStateDepthTest, DEFAULT.depthTest)), + + // Depth bias has 3 fields in State but really one call in GLBackend + CommandPointer(stencilCommand), + CommandPointer(stencilCommand), + CommandPointer(stencilCommand), + + CommandPointer(new Command1B(&GLBackend::do_setStateAlphaToCoverageEnable, DEFAULT.alphaToCoverageEnable)), + + CommandPointer(new Command1U(&GLBackend::do_setStateSampleMask, DEFAULT.sampleMask)), + + CommandPointer(new CommandBlend(&GLBackend::do_setStateBlend, DEFAULT.blendFunction)), + + CommandPointer(new Command1U(&GLBackend::do_setStateColorWriteMask, DEFAULT.colorWriteMask)) + }; +} void generateFillMode(GLBackend::GLState::Commands& commands, State::FillMode fillMode) { commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateFillMode, int32(fillMode)))); diff --git a/libraries/gpu/src/gpu/State.cpp b/libraries/gpu/src/gpu/State.cpp index 76a444a2e6..ca254626e9 100755 --- a/libraries/gpu/src/gpu/State.cpp +++ b/libraries/gpu/src/gpu/State.cpp @@ -20,6 +20,8 @@ State::State() { State::~State() { } +// WARNING: GLBackend::GLState::_resetStateCommands heavily relies on the fact that State::DEFAULT = State::Data() +// Please make sure to go check makeResetStateCommands() before modifying this value const State::Data State::DEFAULT = State::Data(); State::Signature State::evalSignature(const Data& state) { From cafaeed82255f12c65985d5eeee828362966c1ae Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 May 2015 13:34:22 +0200 Subject: [PATCH 17/19] Restore polygon mode after entities rendering Default setting are causing issues so we just reset the polygon mode since this won't matter once everything has moved to the new rendering pipeline. --- interface/src/Application.cpp | 5 +++++ libraries/gpu/src/gpu/GLBackend.cpp | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 021981a80e..cc99181fe1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3254,6 +3254,11 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs renderMode = RenderArgs::MIRROR_RENDER_MODE; } _entities.render(renderMode, renderSide, renderDebugFlags); + + if (!Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { + // Restaure polygon mode + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } } // render JS/scriptable overlays diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 5cb2e8b917..3c0ff4b309 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -93,11 +93,6 @@ void GLBackend::render(Batch& batch) { command++; offset++; } - - // Restaure GL default state - for (auto command : gpu::GLBackend::GLState::_resetStateCommands) { - command->run(this); - } } void GLBackend::renderBatch(Batch& batch) { From 591548dc38f878d53fbf2606ecfee5e5bb6ca754 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 May 2015 20:15:40 +0200 Subject: [PATCH 18/19] Missing comma --- libraries/render-utils/src/Model.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 9aa856312d..126e8ad4d1 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -420,7 +420,7 @@ private: IS_DEPTH_ONLY = (1 << IS_DEPTH_ONLY_FLAG), IS_SHADOW = (1 << IS_SHADOW_FLAG), IS_MIRROR = (1 << IS_MIRROR_FLAG), - IS_WIREFRAME = (1 << IS_WIREFRAME_FLAG) + IS_WIREFRAME = (1 << IS_WIREFRAME_FLAG), }; typedef unsigned short Flags; From f761ba521a13935252584c2bd6fe6eef4e50cf14 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 May 2015 20:16:03 +0200 Subject: [PATCH 19/19] Quiet compiler --- interface/src/ui/ApplicationOverlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 71fe528700..5c878b484c 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -685,7 +685,7 @@ void ApplicationOverlay::renderControllerPointers() { } //If the cursor is out of the screen then don't render it - if (mouseX < 0 || mouseX >= canvasSize.x || mouseY < 0 || mouseY >= canvasSize.y) { + if (mouseX < 0 || mouseX >= (int)canvasSize.x || mouseY < 0 || mouseY >= (int)canvasSize.y) { _reticleActive[index] = false; continue; } @@ -998,7 +998,7 @@ void ApplicationOverlay::renderDomainConnectionStatusBorder() { if (nodeList && !nodeList->getDomainHandler().isConnected()) { auto geometryCache = DependencyManager::get(); auto canvasSize = qApp->getCanvasSize(); - if (canvasSize.x != _previousBorderWidth || canvasSize.y != _previousBorderHeight) { + if ((int)canvasSize.x != _previousBorderWidth || (int)canvasSize.y != _previousBorderHeight) { glm::vec4 color(CONNECTION_STATUS_BORDER_COLOR[0], CONNECTION_STATUS_BORDER_COLOR[1], CONNECTION_STATUS_BORDER_COLOR[2], 1.0f);