mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-04 07:45:16 +02:00
Potentially working correctly
This commit is contained in:
parent
5805cc8f2b
commit
dffb83a488
3 changed files with 28 additions and 12 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue