From 037246ee3cb60b0f0b35f7abf3645907df85b710 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 1 Jun 2015 15:58:43 -0700 Subject: [PATCH] implement meta item for model entities --- .../src/RenderableModelEntityItem.cpp | 59 ++++++++++++++----- .../src/RenderableModelEntityItem.h | 2 + 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 97a756e181..c4930f1225 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "EntityTreeRenderer.h" #include "EntitiesRendererLogging.h" @@ -136,21 +137,63 @@ bool RenderableModelEntityItem::readyToAddToScene(RenderArgs* renderArgs) { return ready; } +class RenderableModelEntityItemMeta { +public: + RenderableModelEntityItemMeta(EntityItemPointer entity) : entity(entity){ } + typedef render::Payload Payload; + typedef Payload::DataPointer Pointer; + + EntityItemPointer entity; +}; + +namespace render { + template <> const ItemKey payloadGetKey(const RenderableModelEntityItemMeta::Pointer& payload) { + return ItemKey::Builder::opaqueShape(); + } + + template <> const Item::Bound payloadGetBound(const RenderableModelEntityItemMeta::Pointer& payload) { + if (payload && payload->entity) { + return payload->entity->getAABox(); + } + return render::Item::Bound(); + } + template <> void payloadRender(const RenderableModelEntityItemMeta::Pointer& payload, RenderArgs* args) { + if (args) { + args->_elementsTouched++; + if (payload && payload->entity) { + payload->entity->render(args); + } + } + } +} + bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { + _myMetaItem = scene->allocateID(); + + auto renderData = RenderableModelEntityItemMeta::Pointer(new RenderableModelEntityItemMeta(self)); + auto renderPayload = render::PayloadPointer(new RenderableModelEntityItemMeta::Payload(renderData)); + + pendingChanges.resetItem(_myMetaItem, renderPayload); + if (_model) { return _model->addToScene(scene, pendingChanges); } - return false; + + return true; } void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { + pendingChanges.removeItem(_myMetaItem); if (_model) { _model->removeFromScene(scene, pendingChanges); } } + +// NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items, and it handles +// the per frame simulation/update that might be required if the models properties changed. void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RMEIrender"); assert(getType() == EntityTypes::Model); @@ -209,20 +252,6 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } _needsInitialSimulation = false; } - - if (_model->isActive()) { - // TODO: this is the majority of model render time. And rendering of a cube model vs the basic Box render - // is significantly more expensive. Is there a way to call this that doesn't cost us as much? - PerformanceTimer perfTimer("model->render"); - // filter out if not needed to render - if (args && (args->_renderMode == RenderArgs::SHADOW_RENDER_MODE)) { - if (movingOrAnimating) { - _model->renderInScene(alpha, args); - } - } else { - _model->renderInScene(alpha, args); - } - } } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 55044e5d4d..837890a960 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -77,6 +77,8 @@ private: QStringList _originalTextures; bool _originalTexturesRead; QVector> _points; + + render::ItemID _myMetaItem; }; #endif // hifi_RenderableModelEntityItem_h