mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 05:17:24 +02:00
Merge pull request #9912 from AndrewMeadows/model-cleanup-4
minor cleanup of render pipeline for models and avatars
This commit is contained in:
commit
eba2417f41
6 changed files with 64 additions and 84 deletions
|
@ -20,55 +20,28 @@ using namespace render;
|
||||||
CauterizedMeshPartPayload::CauterizedMeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform)
|
CauterizedMeshPartPayload::CauterizedMeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform)
|
||||||
: ModelMeshPartPayload(model, meshIndex, partIndex, shapeIndex, transform, offsetTransform) {}
|
: ModelMeshPartPayload(model, meshIndex, partIndex, shapeIndex, transform, offsetTransform) {}
|
||||||
|
|
||||||
void CauterizedMeshPartPayload::updateTransformForSkinnedCauterizedMesh(const Transform& transform,
|
void CauterizedMeshPartPayload::updateTransformForCauterizedMesh(
|
||||||
const QVector<glm::mat4>& clusterMatrices,
|
const Transform& renderTransform,
|
||||||
const QVector<glm::mat4>& cauterizedClusterMatrices) {
|
const gpu::BufferPointer& buffer) {
|
||||||
_transform = transform;
|
_cauterizedTransform = renderTransform;
|
||||||
_cauterizedTransform = transform;
|
_cauterizedClusterBuffer = buffer;
|
||||||
|
|
||||||
if (clusterMatrices.size() > 0) {
|
|
||||||
_worldBound = AABox();
|
|
||||||
for (auto& clusterMatrix : clusterMatrices) {
|
|
||||||
AABox clusterBound = _localBound;
|
|
||||||
clusterBound.transform(clusterMatrix);
|
|
||||||
_worldBound += clusterBound;
|
|
||||||
}
|
|
||||||
|
|
||||||
_worldBound.transform(transform);
|
|
||||||
if (clusterMatrices.size() == 1) {
|
|
||||||
_transform = _transform.worldTransform(Transform(clusterMatrices[0]));
|
|
||||||
if (cauterizedClusterMatrices.size() != 0) {
|
|
||||||
_cauterizedTransform = _cauterizedTransform.worldTransform(Transform(cauterizedClusterMatrices[0]));
|
|
||||||
} else {
|
|
||||||
_cauterizedTransform = _transform;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_worldBound = _localBound;
|
|
||||||
_worldBound.transform(_drawTransform);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const {
|
void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const {
|
||||||
// Still relying on the raw data from the model
|
// Still relying on the raw data from the model
|
||||||
const Model::MeshState& state = _model->getMeshState(_meshIndex);
|
|
||||||
SkeletonModel* skeleton = static_cast<SkeletonModel*>(_model);
|
SkeletonModel* skeleton = static_cast<SkeletonModel*>(_model);
|
||||||
bool useCauterizedMesh = (renderMode != RenderArgs::RenderMode::SHADOW_RENDER_MODE) && skeleton->getEnableCauterization();
|
bool useCauterizedMesh = (renderMode != RenderArgs::RenderMode::SHADOW_RENDER_MODE) && skeleton->getEnableCauterization();
|
||||||
|
|
||||||
if (state.clusterBuffer) {
|
|
||||||
if (useCauterizedMesh) {
|
if (useCauterizedMesh) {
|
||||||
const Model::MeshState& cState = skeleton->getCauterizeMeshState(_meshIndex);
|
if (_cauterizedClusterBuffer) {
|
||||||
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, cState.clusterBuffer);
|
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _cauterizedClusterBuffer);
|
||||||
} else {
|
|
||||||
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, state.clusterBuffer);
|
|
||||||
}
|
}
|
||||||
batch.setModelTransform(_transform);
|
|
||||||
} else {
|
|
||||||
if (useCauterizedMesh) {
|
|
||||||
batch.setModelTransform(_cauterizedTransform);
|
batch.setModelTransform(_cauterizedTransform);
|
||||||
} else {
|
} else {
|
||||||
batch.setModelTransform(_transform);
|
if (_clusterBuffer) {
|
||||||
|
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _clusterBuffer);
|
||||||
}
|
}
|
||||||
|
batch.setModelTransform(_transform);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,12 +17,13 @@
|
||||||
class CauterizedMeshPartPayload : public ModelMeshPartPayload {
|
class CauterizedMeshPartPayload : public ModelMeshPartPayload {
|
||||||
public:
|
public:
|
||||||
CauterizedMeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform);
|
CauterizedMeshPartPayload(Model* model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform);
|
||||||
void updateTransformForSkinnedCauterizedMesh(const Transform& transform,
|
|
||||||
const QVector<glm::mat4>& clusterMatrices,
|
void updateTransformForCauterizedMesh(const Transform& renderTransform, const gpu::BufferPointer& buffer);
|
||||||
const QVector<glm::mat4>& cauterizedClusterMatrices);
|
|
||||||
|
|
||||||
void bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const override;
|
void bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
gpu::BufferPointer _cauterizedClusterBuffer;
|
||||||
Transform _cauterizedTransform;
|
Transform _cauterizedTransform;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,9 @@ void CauterizedModel::updateRenderItems() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box.
|
||||||
|
self->updateClusterMatrices();
|
||||||
|
|
||||||
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
||||||
|
|
||||||
Transform modelTransform;
|
Transform modelTransform;
|
||||||
|
@ -209,15 +212,22 @@ void CauterizedModel::updateRenderItems() {
|
||||||
if (data._model && data._model->isLoaded()) {
|
if (data._model && data._model->isLoaded()) {
|
||||||
// Ensure the model geometry was not reset between frames
|
// Ensure the model geometry was not reset between frames
|
||||||
if (deleteGeometryCounter == data._model->getGeometryCounter()) {
|
if (deleteGeometryCounter == data._model->getGeometryCounter()) {
|
||||||
// lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box.
|
// this stuff identical to what happens in regular Model
|
||||||
data._model->updateClusterMatrices();
|
|
||||||
|
|
||||||
// update the model transform and bounding box for this render item.
|
|
||||||
const Model::MeshState& state = data._model->getMeshState(data._meshIndex);
|
const Model::MeshState& state = data._model->getMeshState(data._meshIndex);
|
||||||
|
Transform renderTransform = modelTransform;
|
||||||
|
if (state.clusterMatrices.size() == 1) {
|
||||||
|
renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0]));
|
||||||
|
}
|
||||||
|
data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer);
|
||||||
|
|
||||||
|
// this stuff for cauterized mesh
|
||||||
CauterizedModel* cModel = static_cast<CauterizedModel*>(data._model);
|
CauterizedModel* cModel = static_cast<CauterizedModel*>(data._model);
|
||||||
assert(data._meshIndex < cModel->_cauterizeMeshStates.size());
|
const Model::MeshState& cState = cModel->getCauterizeMeshState(data._meshIndex);
|
||||||
const Model::MeshState& cState = cModel->_cauterizeMeshStates.at(data._meshIndex);
|
renderTransform = modelTransform;
|
||||||
data.updateTransformForSkinnedCauterizedMesh(modelTransform, state.clusterMatrices, cState.clusterMatrices);
|
if (cState.clusterMatrices.size() == 1) {
|
||||||
|
renderTransform = modelTransform.worldTransform(Transform(cState.clusterMatrices[0]));
|
||||||
|
}
|
||||||
|
data.updateTransformForCauterizedMesh(renderTransform, cState.clusterBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -372,19 +372,12 @@ void ModelMeshPartPayload::notifyLocationChanged() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& transform, const QVector<glm::mat4>& clusterMatrices) {
|
void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform,
|
||||||
_transform = transform;
|
const gpu::BufferPointer& buffer) {
|
||||||
|
_transform = renderTransform;
|
||||||
if (clusterMatrices.size() > 0) {
|
|
||||||
_worldBound = _adjustedLocalBound;
|
_worldBound = _adjustedLocalBound;
|
||||||
_worldBound.transform(_transform);
|
_worldBound.transform(boundTransform);
|
||||||
if (clusterMatrices.size() == 1) {
|
_clusterBuffer = buffer;
|
||||||
_transform = _transform.worldTransform(Transform(clusterMatrices[0]));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_worldBound = _localBound;
|
|
||||||
_worldBound.transform(_transform);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemKey ModelMeshPartPayload::getKey() const {
|
ItemKey ModelMeshPartPayload::getKey() const {
|
||||||
|
@ -532,9 +525,8 @@ void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) const {
|
||||||
|
|
||||||
void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const {
|
void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const {
|
||||||
// Still relying on the raw data from the model
|
// Still relying on the raw data from the model
|
||||||
const Model::MeshState& state = _model->getMeshState(_meshIndex);
|
if (_clusterBuffer) {
|
||||||
if (state.clusterBuffer) {
|
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _clusterBuffer);
|
||||||
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, state.clusterBuffer);
|
|
||||||
}
|
}
|
||||||
batch.setModelTransform(_transform);
|
batch.setModelTransform(_transform);
|
||||||
}
|
}
|
||||||
|
@ -590,8 +582,6 @@ void ModelMeshPartPayload::render(RenderArgs* args) const {
|
||||||
auto locations = args->_pipeline->locations;
|
auto locations = args->_pipeline->locations;
|
||||||
assert(locations);
|
assert(locations);
|
||||||
|
|
||||||
// Bind the model transform and the skinCLusterMatrices if needed
|
|
||||||
_model->updateClusterMatrices();
|
|
||||||
bindTransform(batch, locations, args->_renderMode);
|
bindTransform(batch, locations, args->_renderMode);
|
||||||
|
|
||||||
//Bind the index buffer and vertex buffer and Blend shapes if needed
|
//Bind the index buffer and vertex buffer and Blend shapes if needed
|
||||||
|
|
|
@ -89,8 +89,9 @@ public:
|
||||||
typedef Payload::DataPointer Pointer;
|
typedef Payload::DataPointer Pointer;
|
||||||
|
|
||||||
void notifyLocationChanged() override;
|
void notifyLocationChanged() override;
|
||||||
void updateTransformForSkinnedMesh(const Transform& transform,
|
void updateTransformForSkinnedMesh(const Transform& renderTransform,
|
||||||
const QVector<glm::mat4>& clusterMatrices);
|
const Transform& boundTransform,
|
||||||
|
const gpu::BufferPointer& buffer);
|
||||||
|
|
||||||
float computeFadeAlpha() const;
|
float computeFadeAlpha() const;
|
||||||
|
|
||||||
|
@ -108,6 +109,7 @@ public:
|
||||||
|
|
||||||
void computeAdjustedLocalBound(const QVector<glm::mat4>& clusterMatrices);
|
void computeAdjustedLocalBound(const QVector<glm::mat4>& clusterMatrices);
|
||||||
|
|
||||||
|
gpu::BufferPointer _clusterBuffer;
|
||||||
Model* _model;
|
Model* _model;
|
||||||
|
|
||||||
int _meshIndex;
|
int _meshIndex;
|
||||||
|
|
|
@ -227,6 +227,10 @@ void Model::updateRenderItems() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lazy update of cluster matrices used for rendering.
|
||||||
|
// We need to update them here so we can correctly update the bounding box.
|
||||||
|
self->updateClusterMatrices();
|
||||||
|
|
||||||
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
|
||||||
|
|
||||||
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
|
uint32_t deleteGeometryCounter = self->_deleteGeometryCounter;
|
||||||
|
@ -240,12 +244,12 @@ void Model::updateRenderItems() {
|
||||||
Transform modelTransform = data._model->getTransform();
|
Transform modelTransform = data._model->getTransform();
|
||||||
modelTransform.setScale(glm::vec3(1.0f));
|
modelTransform.setScale(glm::vec3(1.0f));
|
||||||
|
|
||||||
// lazy update of cluster matrices used for rendering. We need to update them here, so we can correctly update the bounding box.
|
const Model::MeshState& state = data._model->getMeshState(data._meshIndex);
|
||||||
data._model->updateClusterMatrices();
|
Transform renderTransform = modelTransform;
|
||||||
|
if (state.clusterMatrices.size() == 1) {
|
||||||
// update the model transform and bounding box for this render item.
|
renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0]));
|
||||||
const Model::MeshState& state = data._model->_meshStates.at(data._meshIndex);
|
}
|
||||||
data.updateTransformForSkinnedMesh(modelTransform, state.clusterMatrices);
|
data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue