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;
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);

View file

@ -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<MeshPartPayload> 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;

View file

@ -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<MeshPartPayload>(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<MeshPartPayload>(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform);
_renderItemsSet << std::make_shared<MeshPartPayload>(networkMesh._mesh, partIndex, ModelRender::getCollisionHullMaterial(), transform, offset);
} else {
_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.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<MeshPartPayload>(item, [&](MeshPartPayload& data) {
data.updateTransform(transform);
data.updateTransform(transform, offset);
data.notifyLocationChanged();
});
}