Potentially working correctly

This commit is contained in:
samcake 2015-12-10 16:31:00 -08:00
parent 5805cc8f2b
commit dffb83a488
3 changed files with 28 additions and 12 deletions

View file

@ -39,11 +39,11 @@ namespace render {
using 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); updateMeshPart(mesh, partIndex);
updateMaterial(material); updateMaterial(material);
updateTransform(transform); updateTransform(transform, offsetTransform);
} }
void MeshPartPayload::updateMeshPart(model::MeshPointer drawMesh, int partIndex) { 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) { void MeshPartPayload::updateTransform(const Transform& transform, const Transform& offsetTransform) {
_drawTransform = transform; _transform = transform;
_offsetTransform = offsetTransform;
Transform::mult(_drawTransform, _transform, _offsetTransform);
_worldBound = _localBound; _worldBound = _localBound;
_worldBound.transform(_drawTransform); _worldBound.transform(_drawTransform);
} }
@ -342,7 +344,7 @@ render::ItemKey ModelMeshPartPayload::getKey() const {
render::Item::Bound ModelMeshPartPayload::getBound() const { render::Item::Bound ModelMeshPartPayload::getBound() const {
// NOTE: we can't cache this bounds because we need to handle the case of a moving // NOTE: we can't cache this bounds because we need to handle the case of a moving
// entity or mesh part. // 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 { 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(_modelPosition);
transform.preTranslate(_drawTransform.getTranslation()); transform.preTranslate(_transform.getTranslation());
batch.setModelTransform(transform); batch.setModelTransform(transform);
} }
@ -412,7 +414,7 @@ void ModelMeshPartPayload::render(RenderArgs* args) const {
} }
// Back to model to update the cluster matrices right now // 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); const FBXMesh& mesh = geometry.meshes.at(_meshIndex);

View file

@ -25,7 +25,7 @@ class Model;
class MeshPartPayload { class MeshPartPayload {
public: public:
MeshPartPayload() {} 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<MeshPartPayload> Payload; typedef render::Payload<MeshPartPayload> Payload;
typedef Payload::DataPointer Pointer; typedef Payload::DataPointer Pointer;
@ -33,7 +33,7 @@ public:
virtual void updateMeshPart(model::MeshPointer drawMesh, int partIndex); virtual void updateMeshPart(model::MeshPointer drawMesh, int partIndex);
virtual void notifyLocationChanged() {} virtual void notifyLocationChanged() {}
virtual void updateTransform(const Transform& transform); virtual void updateTransform(const Transform& transform, const Transform& offsetTransform);
virtual void updateMaterial(model::MaterialPointer drawMaterial); virtual void updateMaterial(model::MaterialPointer drawMaterial);
@ -57,6 +57,8 @@ public:
model::Box _localBound; model::Box _localBound;
Transform _drawTransform; Transform _drawTransform;
Transform _transform;
Transform _offsetTransform;
mutable model::Box _worldBound; mutable model::Box _worldBound;
bool _hasColorAttrib = false; bool _hasColorAttrib = false;

View file

@ -114,10 +114,14 @@ void Model::enqueueLocationChange() {
transform.setTranslation(_translation); transform.setTranslation(_translation);
transform.setRotation(_rotation); transform.setRotation(_rotation);
Transform offset;
offset.setScale(_scale);
offset.postTranslate(_offset);
render::PendingChanges pendingChanges; render::PendingChanges pendingChanges;
foreach (auto itemID, _renderItems.keys()) { foreach (auto itemID, _renderItems.keys()) {
pendingChanges.updateItem<MeshPartPayload>(itemID, [=](MeshPartPayload& data) { pendingChanges.updateItem<MeshPartPayload>(itemID, [=](MeshPartPayload& data) {
data.updateTransform(transform); data.updateTransform(transform, offset);
data.notifyLocationChanged(); data.notifyLocationChanged();
}); });
} }
@ -1164,6 +1168,10 @@ void Model::segregateMeshGroups() {
transform.setTranslation(_translation); transform.setTranslation(_translation);
transform.setRotation(_rotation); 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 // Run through all of the meshes, and place them into their segregated, but unsorted buckets
int shapeID = 0; int shapeID = 0;
for (int i = 0; i < (int)networkMeshes.size(); i++) { for (int i = 0; i < (int)networkMeshes.size(); i++) {
@ -1174,7 +1182,7 @@ void Model::segregateMeshGroups() {
int totalParts = mesh.parts.size(); int totalParts = mesh.parts.size();
for (int partIndex = 0; partIndex < totalParts; partIndex++) { for (int partIndex = 0; partIndex < totalParts; partIndex++) {
if (showingCollisionHull) { if (showingCollisionHull) {
_renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform); _renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform, offset);
} else { } else {
_renderItemsSet << std::make_shared<ModelMeshPartPayload>(this, i, partIndex, shapeID, _translation, _rotation); _renderItemsSet << std::make_shared<ModelMeshPartPayload>(this, i, partIndex, shapeID, _translation, _rotation);
@ -1196,6 +1204,10 @@ bool Model::initWhenReady(render::ScenePointer scene) {
transform.setTranslation(_translation); transform.setTranslation(_translation);
transform.setRotation(_rotation); transform.setRotation(_rotation);
Transform offset;
offset.setScale(_scale);
offset.postTranslate(_offset);
foreach (auto renderItem, _renderItemsSet) { foreach (auto renderItem, _renderItemsSet) {
auto item = scene->allocateID(); auto item = scene->allocateID();
auto renderData = MeshPartPayload::Pointer(renderItem); auto renderData = MeshPartPayload::Pointer(renderItem);
@ -1203,7 +1215,7 @@ bool Model::initWhenReady(render::ScenePointer scene) {
_renderItems.insert(item, renderPayload); _renderItems.insert(item, renderPayload);
pendingChanges.resetItem(item, renderPayload); pendingChanges.resetItem(item, renderPayload);
pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) { pendingChanges.updateItem<MeshPartPayload>(item, [&](MeshPartPayload& data) {
data.updateTransform(transform); data.updateTransform(transform, offset);
data.notifyLocationChanged(); data.notifyLocationChanged();
}); });
} }