Models can now switch between dual quats and matrix palette skinning.

but not dynamically, because we still only compile one version of the shader.
This commit is contained in:
Anthony J. Thibault 2018-02-13 11:37:14 -08:00
parent cf5452313a
commit 7f5f48bca9
5 changed files with 17 additions and 10 deletions

View file

@ -228,10 +228,11 @@ void CauterizedModel::updateRenderItems() {
const auto& cauterizedMeshState = self->getCauterizeMeshState(meshIndex);
bool invalidatePayloadShapeKey = self->shouldInvalidatePayloadShapeKey(meshIndex);
bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning();
transaction.updateItem<CauterizedMeshPartPayload>(itemID, [modelTransform, meshState, cauterizedMeshState, invalidatePayloadShapeKey,
transaction.updateItem<CauterizedMeshPartPayload>(itemID, [modelTransform, meshState, useDualQuaternionSkinning, cauterizedMeshState, invalidatePayloadShapeKey,
isWireframe, isVisible, isLayeredInFront, isLayeredInHUD, enableCauterization](CauterizedMeshPartPayload& data) {
if (_useDualQuaternionSkinning) {
if (useDualQuaternionSkinning) {
data.updateClusterBuffer(meshState.clusterDualQuaternions,
cauterizedMeshState.clusterDualQuaternions);
} else {
@ -240,7 +241,7 @@ void CauterizedModel::updateRenderItems() {
}
Transform renderTransform = modelTransform;
if (_useDualQuaternionSkinning) {
if (useDualQuaternionSkinning) {
if (meshState.clusterDualQuaternions.size() == 1) {
const auto& dq = meshState.clusterDualQuaternions[0];
Transform transform(dq.getRotation(),
@ -256,7 +257,7 @@ void CauterizedModel::updateRenderItems() {
data.updateTransformForSkinnedMesh(renderTransform, modelTransform);
renderTransform = modelTransform;
if (_useDualQuaternionSkinning) {
if (useDualQuaternionSkinning) {
if (cauterizedMeshState.clusterDualQuaternions.size() == 1) {
const auto& dq = cauterizedMeshState.clusterDualQuaternions[0];
Transform transform(dq.getRotation(),

View file

@ -335,6 +335,9 @@ ModelMeshPartPayload::ModelMeshPartPayload(ModelPointer model, int meshIndex, in
_shapeID(shapeIndex) {
assert(model && model->isLoaded());
_useDualQuaternionSkinning = model->getUseDualQuaternionSkinning();
_blendedVertexBuffer = model->_blendedVertexBuffers[_meshIndex];
auto& modelMesh = model->getGeometry()->getMeshes().at(_meshIndex);
const Model::MeshState& state = model->getMeshState(_meshIndex);

View file

@ -136,6 +136,7 @@ private:
gpu::BufferPointer _blendedVertexBuffer;
render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() };
int _layer { render::Item::LAYER_3D };
bool _useDualQuaternionSkinning { false };
};
namespace render {

View file

@ -281,12 +281,13 @@ void Model::updateRenderItems() {
const auto& meshState = self->getMeshState(meshIndex);
bool invalidatePayloadShapeKey = self->shouldInvalidatePayloadShapeKey(meshIndex);
bool useDualQuaternionSkinning = self->getUseDualQuaternionSkinning();
transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, meshState,
transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, meshState, useDualQuaternionSkinning,
invalidatePayloadShapeKey, isWireframe, isVisible,
viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) {
if (_useDualQuaternions) {
if (useDualQuaternionSkinning) {
data.updateClusterBuffer(meshState.clusterDualQuaternions);
} else {
data.updateClusterBuffer(meshState.clusterMatrices);
@ -294,7 +295,7 @@ void Model::updateRenderItems() {
Transform renderTransform = modelTransform;
if (_useDualQuaternions) {
if (useDualQuaternionSkinning) {
if (meshState.clusterDualQuaternions.size() == 1) {
const auto& dq = meshState.clusterDualQuaternions[0];
Transform transform(dq.getRotation(),
@ -386,7 +387,7 @@ bool Model::updateGeometry() {
const FBXGeometry& fbxGeometry = getFBXGeometry();
foreach (const FBXMesh& mesh, fbxGeometry.meshes) {
MeshState state;
if (_useDualQuaternions) {
if (_useDualQuaternionSkinning) {
state.clusterDualQuaternions.resize(mesh.clusters.size());
} else {
state.clusterMatrices.resize(mesh.clusters.size());
@ -1275,7 +1276,7 @@ void Model::updateRig(float deltaTime, glm::mat4 parentTransform) {
void Model::computeMeshPartLocalBounds() {
for (auto& part : _modelMeshRenderItems) {
const Model::MeshState& state = _meshStates.at(part->_meshIndex);
if (_useDualQuaternions) {
if (_useDualQuaternionSkinning) {
part->computeAdjustedLocalBound(state.clusterDualQuaternions);
} else {
part->computeAdjustedLocalBound(state.clusterMatrices);

View file

@ -311,6 +311,7 @@ public:
Q_INVOKABLE MeshProxyList getMeshes() const;
void scaleToFit();
bool getUseDualQuaternionSkinning() const { return _useDualQuaternionSkinning; }
public slots:
void loadURLFinished(bool success);
@ -414,7 +415,7 @@ protected:
virtual void createCollisionRenderItemSet();
bool _isWireframe;
bool _useDualQuaternionSkinning { false };
bool _useDualQuaternionSkinning { true };
// debug rendering support
int _debugMeshBoxesID = GeometryCache::UNKNOWN_ID;