From dffb83a488560235e6ced4ee9a770f4c70cc3230 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 10 Dec 2015 16:31:00 -0800 Subject: [PATCH] Potentially working correctly --- libraries/render-utils/src/MeshPartPayload.cpp | 16 +++++++++------- libraries/render-utils/src/MeshPartPayload.h | 6 ++++-- libraries/render-utils/src/Model.cpp | 18 +++++++++++++++--- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 42924b4a1b..4c9adb405b 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -39,11 +39,11 @@ namespace render { using namespace render; -MeshPartPayload::MeshPartPayload(model::MeshPointer mesh, int partIndex, model::MaterialPointer material, const Transform& transform) { +MeshPartPayload::MeshPartPayload(model::MeshPointer mesh, int partIndex, model::MaterialPointer material, const Transform& transform, const Transform& offsetTransform) { updateMeshPart(mesh, partIndex); updateMaterial(material); - updateTransform(transform); + updateTransform(transform, offsetTransform); } void MeshPartPayload::updateMeshPart(model::MeshPointer drawMesh, int partIndex) { @@ -57,8 +57,10 @@ void MeshPartPayload::updateMeshPart(model::MeshPointer drawMesh, int partIndex) } } -void MeshPartPayload::updateTransform(const Transform& transform) { - _drawTransform = transform; +void MeshPartPayload::updateTransform(const Transform& transform, const Transform& offsetTransform) { + _transform = transform; + _offsetTransform = offsetTransform; + Transform::mult(_drawTransform, _transform, _offsetTransform); _worldBound = _localBound; _worldBound.transform(_drawTransform); } @@ -342,7 +344,7 @@ render::ItemKey ModelMeshPartPayload::getKey() const { render::Item::Bound ModelMeshPartPayload::getBound() const { // NOTE: we can't cache this bounds because we need to handle the case of a moving // entity or mesh part. - return _model->getPartBounds(_meshIndex, _partIndex, _modelPosition, _modelOrientation); + return _model->getPartBounds(_meshIndex, _partIndex, _transform.getTranslation(), _transform.getRotation()); } void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) const { @@ -387,7 +389,7 @@ void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ModelRender::L } } // transform.preTranslate(_modelPosition); - transform.preTranslate(_drawTransform.getTranslation()); + transform.preTranslate(_transform.getTranslation()); batch.setModelTransform(transform); } @@ -412,7 +414,7 @@ void ModelMeshPartPayload::render(RenderArgs* args) const { } // Back to model to update the cluster matrices right now - _model->updateClusterMatrices(_modelPosition, _modelOrientation); + _model->updateClusterMatrices(_transform.getTranslation(), _transform.getRotation()); const FBXMesh& mesh = geometry.meshes.at(_meshIndex); diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 9cfda4927f..c5b1e492d8 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -25,7 +25,7 @@ class Model; class MeshPartPayload { public: MeshPartPayload() {} - MeshPartPayload(model::MeshPointer mesh, int partIndex, model::MaterialPointer material, const Transform& transform); + MeshPartPayload(model::MeshPointer mesh, int partIndex, model::MaterialPointer material, const Transform& transform, const Transform& offsetTransform); typedef render::Payload Payload; typedef Payload::DataPointer Pointer; @@ -33,7 +33,7 @@ public: virtual void updateMeshPart(model::MeshPointer drawMesh, int partIndex); virtual void notifyLocationChanged() {} - virtual void updateTransform(const Transform& transform); + virtual void updateTransform(const Transform& transform, const Transform& offsetTransform); virtual void updateMaterial(model::MaterialPointer drawMaterial); @@ -57,6 +57,8 @@ public: model::Box _localBound; Transform _drawTransform; + Transform _transform; + Transform _offsetTransform; mutable model::Box _worldBound; bool _hasColorAttrib = false; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ce30e99047..545afea681 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -114,10 +114,14 @@ void Model::enqueueLocationChange() { transform.setTranslation(_translation); transform.setRotation(_rotation); + Transform offset; + offset.setScale(_scale); + offset.postTranslate(_offset); + render::PendingChanges pendingChanges; foreach (auto itemID, _renderItems.keys()) { pendingChanges.updateItem(itemID, [=](MeshPartPayload& data) { - data.updateTransform(transform); + data.updateTransform(transform, offset); data.notifyLocationChanged(); }); } @@ -1164,6 +1168,10 @@ void Model::segregateMeshGroups() { transform.setTranslation(_translation); transform.setRotation(_rotation); + Transform offset; + offset.setScale(_scale); + offset.postTranslate(_offset); + // Run through all of the meshes, and place them into their segregated, but unsorted buckets int shapeID = 0; for (int i = 0; i < (int)networkMeshes.size(); i++) { @@ -1174,7 +1182,7 @@ void Model::segregateMeshGroups() { int totalParts = mesh.parts.size(); for (int partIndex = 0; partIndex < totalParts; partIndex++) { if (showingCollisionHull) { - _renderItemsSet << std::make_shared(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform); + _renderItemsSet << std::make_shared(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform, offset); } else { _renderItemsSet << std::make_shared(this, i, partIndex, shapeID, _translation, _rotation); @@ -1196,6 +1204,10 @@ bool Model::initWhenReady(render::ScenePointer scene) { transform.setTranslation(_translation); transform.setRotation(_rotation); + Transform offset; + offset.setScale(_scale); + offset.postTranslate(_offset); + foreach (auto renderItem, _renderItemsSet) { auto item = scene->allocateID(); auto renderData = MeshPartPayload::Pointer(renderItem); @@ -1203,7 +1215,7 @@ bool Model::initWhenReady(render::ScenePointer scene) { _renderItems.insert(item, renderPayload); pendingChanges.resetItem(item, renderPayload); pendingChanges.updateItem(item, [&](MeshPartPayload& data) { - data.updateTransform(transform); + data.updateTransform(transform, offset); data.notifyLocationChanged(); }); }