diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index cc6693133f..fde888b48e 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -493,45 +493,27 @@ void EntityTreeRenderer::render(RenderArgs* renderArgs) { if (_tree && !_shuttingDown) { renderArgs->_renderer = this; - checkPendingAddToScene(renderArgs); - Model::startScene(renderArgs->_renderSide); ViewFrustum* frustum = (renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) ? _viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum(); - // Setup batch transform matrices - gpu::Batch batch; // FIX ME - this is very suspicious! - glm::mat4 projMat; - Transform viewMat; - frustum->evalProjectionMatrix(projMat); - frustum->evalViewTransform(viewMat); - batch.setProjectionTransform(projMat); - batch.setViewTransform(viewMat); - - renderArgs->_batch = &batch; // FIX ME - this is very suspicious! - _tree->lockForRead(); // Whenever you're in an intersection between zones, we will always choose the smallest zone. _bestZone = NULL; // NOTE: Is this what we want? _bestZoneVolume = std::numeric_limits::max(); + + // FIX ME: right now the renderOperation does the following: + // 1) determining the best zone (not really rendering) + // 2) render the debug cell details + // we should clean this up _tree->recurseTreeWithOperation(renderOperation, renderArgs); applyZonePropertiesToScene(_bestZone); - // we must call endScene while we still have the tree locked so that no one deletes a model - // on us while rendering the scene - Model::endScene(renderArgs); _tree->unlock(); - // FIX ME - this is very suspicious! - // glPushMatrix(); - // renderArgs->_context->render(batch); - // glPopMatrix(); - - renderArgs->_batch = nullptr; - // stats... _meshesConsidered = renderArgs->_meshesConsidered; _meshesRendered = renderArgs->_meshesRendered; @@ -715,39 +697,6 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args) } } } - - // hack for models and other entities that don't yet play well with others. :( - if (!entityItem->canRenderInScene()) { - // 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(args, entityItem->getGlowLevel()); - } - entityItem->render(args); - args->_itemsRendered++; - if (glower) { - delete glower; - } - } else { - args->_itemsTooSmall++; - } - } else { - args->_itemsOutOfView++; - } - } } } } @@ -1093,34 +1042,14 @@ void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) { void EntityTreeRenderer::addEntityToScene(EntityItemPointer entity) { // here's where we add the entity payload to the scene - if (entity && entity->canRenderInScene()) { - if (entity->readyToAddToScene()) { - render::PendingChanges pendingChanges; - auto scene = _viewState->getMain3DScene(); - if (entity->addToScene(entity, scene, pendingChanges)) { - _entitiesInScene.insert(entity); - } - scene->enqueuePendingChanges(pendingChanges); - } else { - if (!_pendingAddToScene.contains(entity)) { - _pendingAddToScene << entity; - } - } + render::PendingChanges pendingChanges; + auto scene = _viewState->getMain3DScene(); + if (entity->addToScene(entity, scene, pendingChanges)) { + _entitiesInScene.insert(entity); } + scene->enqueuePendingChanges(pendingChanges); } -void EntityTreeRenderer::checkPendingAddToScene(RenderArgs* renderArgs) { - QSet addedToScene; - foreach (auto entity, _pendingAddToScene) { - if (entity->readyToAddToScene(renderArgs)) { - addEntityToScene(entity); - addedToScene << entity; - } - } - foreach (auto addedEntity, addedToScene) { - _pendingAddToScene.remove(addedEntity); - } -} void EntityTreeRenderer::entitySciptChanging(const EntityItemID& entityID) { if (_tree && !_shuttingDown) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 2c1c5ef928..55c889d1c1 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -123,9 +123,7 @@ protected: virtual Octree* createTree() { return new EntityTree(true); } private: - void checkPendingAddToScene(RenderArgs* renderArgs); void addEntityToScene(EntityItemPointer entity); - QSet _pendingAddToScene; void applyZonePropertiesToScene(std::shared_ptr zone); void renderElementProxy(EntityTreeElement* entityTreeElement, RenderArgs* args); diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index 92eef7e8ea..2037788ace 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -56,7 +56,6 @@ private: #define SIMPLE_RENDERABLE() \ public: \ - virtual bool canRenderInScene() { return true; } \ virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { return _renderHelper.addToScene(self, scene, pendingChanges); } \ virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { _renderHelper.removeFromScene(self, scene, pendingChanges); } \ private: \ diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.h b/libraries/entities-renderer/src/RenderableLineEntityItem.h index 8a25196ec5..a4cfe0563f 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.h @@ -28,7 +28,7 @@ public: virtual void render(RenderArgs* args); - SIMPLE_RENDERABLE() + SIMPLE_RENDERABLE(); protected: int _lineVerticesID; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index c4930f1225..29da23702c 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -15,6 +15,7 @@ #include +#include #include #include #include @@ -210,6 +211,19 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } if (hasModel()) { + if (_model) { + // check to see if when we added our models to the scene they were ready, if they were not ready, then + // fix them up in the scene + render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); + render::PendingChanges pendingChanges; + if (_model->needsFixupInScene()) { + _model->removeFromScene(scene, pendingChanges); + _model->addToScene(scene, pendingChanges); + } + scene->enqueuePendingChanges(pendingChanges); + } + + remapTextures(); { float alpha = getLocalRenderAlpha(); diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h index 66505a2cd2..4ecea45ad0 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.h @@ -23,7 +23,7 @@ public: void updateQuads(RenderArgs* args, bool textured); - SIMPLE_RENDERABLE() + SIMPLE_RENDERABLE(); protected: diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h index c8f1b4a49d..77aeb24f2a 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.h @@ -16,6 +16,7 @@ #include "PolyVoxEntityItem.h" #include "RenderableDebugableEntityItem.h" +#include "RenderableEntityItem.h" class RenderablePolyVoxEntityItem : public PolyVoxEntityItem { public: @@ -70,6 +71,8 @@ public: virtual void setAll(uint8_t toValue); virtual void setVoxelInVolume(glm::vec3 position, uint8_t toValue); + + SIMPLE_RENDERABLE(); private: // The PolyVoxEntityItem class has _voxelData which contains dimensions and compressed voxel data. The dimensions diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.h b/libraries/entities-renderer/src/RenderableSphereEntityItem.h index b6f7ff996e..6331b35706 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.h +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.h @@ -26,7 +26,7 @@ public: virtual void render(RenderArgs* args); - SIMPLE_RENDERABLE() + SIMPLE_RENDERABLE(); }; diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.h b/libraries/entities-renderer/src/RenderableTextEntityItem.h index 5db22f3045..de1d745875 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.h +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.h @@ -15,6 +15,8 @@ #include #include +#include "RenderableEntityItem.h" + const int FIXED_FONT_POINT_SIZE = 40; class RenderableTextEntityItem : public TextEntityItem { @@ -27,7 +29,8 @@ public: ~RenderableTextEntityItem() { delete _textRenderer; } virtual void render(RenderArgs* args); - virtual bool canRenderInScene() { return false; } // we don't yet play well with others + + SIMPLE_RENDERABLE(); private: TextRenderer3D* _textRenderer = TextRenderer3D::getInstance(SANS_FONT_FAMILY, FIXED_FONT_POINT_SIZE / 2.0f); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 2ad4d799b6..05ad3a4088 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -13,6 +13,8 @@ #include +#include "RenderableEntityItem.h" + class OffscreenQmlSurface; class RenderableWebEntityItem : public WebEntityItem { @@ -24,7 +26,8 @@ public: virtual void render(RenderArgs* args); virtual void setSourceUrl(const QString& value); - virtual bool canRenderInScene() { return false; } // we don't yet play well with others + + SIMPLE_RENDERABLE(); private: OffscreenQmlSurface* _webSurface{ nullptr }; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 878d0bed7c..a189c944ae 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -157,8 +157,6 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { return 0; } - virtual bool canRenderInScene() { return false; } // does your entity property render using Render Items and Payloads - virtual bool readyToAddToScene(RenderArgs* renderArgs = nullptr) { return true; } // we assume you're ready to add virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 85c03c4cd6..16b298bf3b 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -925,7 +925,7 @@ void Model::removeFromScene(std::shared_ptr scene, render::Pendin } bool Model::render(RenderArgs* renderArgs, float alpha) { - return; // + return true; // PROFILE_RANGE(__FUNCTION__); // render the attachments