From fd232b7d3269e7c40a35d1b9011e01e63803c0ec Mon Sep 17 00:00:00 2001 From: samcake Date: Sun, 4 Oct 2015 22:27:48 -0700 Subject: [PATCH] ONe more file to deal with the Model rendering --- libraries/render-utils/src/Model.cpp | 76 +------------------ .../render-utils/src/ModelRenderPayload.cpp | 55 ++++++++++++++ .../render-utils/src/ModelRenderPayload.h | 68 +++++++++++++++++ 3 files changed, 124 insertions(+), 75 deletions(-) create mode 100644 libraries/render-utils/src/ModelRenderPayload.cpp create mode 100644 libraries/render-utils/src/ModelRenderPayload.h diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index d2fbbc1e43..cb7b2b4b0c 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -20,13 +20,12 @@ #include #include #include -#include -#include #include "AbstractViewStateInterface.h" #include "AnimationHandle.h" #include "DeferredLightingEffect.h" #include "Model.h" +#include "ModelRenderPayload.h" #include "model_vert.h" #include "model_shadow_vert.h" @@ -744,79 +743,6 @@ void Model::renderSetup(RenderArgs* args) { } } - -class MeshPartPayload { -public: - MeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex) : - model(model), url(model->getURL()), meshIndex(meshIndex), partIndex(partIndex), _shapeID(shapeIndex) { } - - typedef render::Payload Payload; - typedef Payload::DataPointer Pointer; - - Model* model; - QUrl url; - int meshIndex; - int partIndex; - int _shapeID; - - // Render Item interface - render::Item::Bound getBound() const; - void render(RenderArgs* args) const; - - - mutable render::Item::Bound _bound; - mutable bool _isBoundInvalid = true; -}; - - -render::Item::Bound MeshPartPayload::getBound() const { - if (_isBoundInvalid) { - model->getPartBounds(meshIndex, partIndex); - _isBoundInvalid = false; - } - return _bound; -} -void MeshPartPayload::render(RenderArgs* args) const { - return model->renderPart(args, meshIndex, partIndex, _shapeID); -} - -namespace render { - template <> const ItemKey payloadGetKey(const MeshPartPayload::Pointer& payload) { - if (!payload->model->isVisible()) { - return ItemKey::Builder().withInvisible().build(); - } - auto geometry = payload->model->getGeometry(); - if (!geometry.isNull()) { - auto drawMaterial = geometry->getShapeMaterial(payload->_shapeID); - if (drawMaterial) { - auto matKey = drawMaterial->_material->getKey(); - if (matKey.isTransparent() || matKey.isTransparentMap()) { - return ItemKey::Builder::transparentShape(); - } else { - return ItemKey::Builder::opaqueShape(); - } - } - } - - // Return opaque for lack of a better idea - return ItemKey::Builder::opaqueShape(); - } - - template <> const Item::Bound payloadGetBound(const MeshPartPayload::Pointer& payload) { - if (payload) { - return payload->getBound(); - } - return render::Item::Bound(); - } - template <> void payloadRender(const MeshPartPayload::Pointer& payload, RenderArgs* args) { - return payload->render(args); - } - - /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) { - return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex); - }*/ -} - void Model::setVisibleInScene(bool newValue, std::shared_ptr scene) { if (_isVisible != newValue) { _isVisible = newValue; diff --git a/libraries/render-utils/src/ModelRenderPayload.cpp b/libraries/render-utils/src/ModelRenderPayload.cpp new file mode 100644 index 0000000000..c8961c0c4f --- /dev/null +++ b/libraries/render-utils/src/ModelRenderPayload.cpp @@ -0,0 +1,55 @@ +// +// ModelRenderPayload.cpp +// interface/src/renderer +// +// Created by Sam Gateau on 10/3/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ModelRenderPayload.h" + +#include "Model.h" + +using namespace render; + +MeshPartPayload::MeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex) : + model(model), url(model->getURL()), meshIndex(meshIndex), partIndex(partIndex), _shapeID(shapeIndex) +{ +} + +render::ItemKey MeshPartPayload::getKey() const { + if (!model->isVisible()) { + return ItemKey::Builder().withInvisible().build(); + } + auto geometry = model->getGeometry(); + if (!geometry.isNull()) { + auto drawMaterial = geometry->getShapeMaterial(_shapeID); + if (drawMaterial) { + auto matKey = drawMaterial->_material->getKey(); + if (matKey.isTransparent() || matKey.isTransparentMap()) { + return ItemKey::Builder::transparentShape(); + } else { + return ItemKey::Builder::opaqueShape(); + } + } + } + + // Return opaque for lack of a better idea + return ItemKey::Builder::opaqueShape(); +} + +render::Item::Bound MeshPartPayload::getBound() const { + if (_isBoundInvalid) { + model->getPartBounds(meshIndex, partIndex); + _isBoundInvalid = false; + } + return _bound; +} + +void MeshPartPayload::render(RenderArgs* args) const { + return model->renderPart(args, meshIndex, partIndex, _shapeID); +} + diff --git a/libraries/render-utils/src/ModelRenderPayload.h b/libraries/render-utils/src/ModelRenderPayload.h new file mode 100644 index 0000000000..fe38415edc --- /dev/null +++ b/libraries/render-utils/src/ModelRenderPayload.h @@ -0,0 +1,68 @@ +// +// ModelRenderPayload.h +// interface/src/renderer +// +// Created by Sam Gateau on 10/3/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ModelRenderPayload_h +#define hifi_ModelRenderPayload_h + +#include +#include + +class Model; + +class MeshPartPayload { +public: + MeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex); + + typedef render::Payload Payload; + typedef Payload::DataPointer Pointer; + + Model* model; + QUrl url; + int meshIndex; + int partIndex; + int _shapeID; + + // Render Item interface + render::ItemKey getKey() const; + render::Item::Bound getBound() const; + void render(RenderArgs* args) const; + + + mutable render::Item::Bound _bound; + mutable bool _isBoundInvalid = true; +}; + +namespace render { + template <> const ItemKey payloadGetKey(const MeshPartPayload::Pointer& payload) { + if (payload) { + return payload->getKey(); + } + // Return opaque for lack of a better idea + return ItemKey::Builder::opaqueShape(); + } + + template <> const Item::Bound payloadGetBound(const MeshPartPayload::Pointer& payload) { + if (payload) { + return payload->getBound(); + } + return render::Item::Bound(); + } + template <> void payloadRender(const MeshPartPayload::Pointer& payload, RenderArgs* args) { + return payload->render(args); + } + + /* template <> const model::MaterialKey& shapeGetMaterialKey(const MeshPartPayload::Pointer& payload) { + return payload->model->getPartMaterial(payload->meshIndex, payload->partIndex); + }*/ +} + + +#endif // hifi_ModelRenderPayload_h \ No newline at end of file