mirror of
https://github.com/raysan5/raylib.git
synced 2025-10-20 08:41:49 +00:00
UpdateModelAnimation does matrixtranspose(matrixinvert) only once per bone instead of per vertex (#5244)
This commit is contained in:
@@ -2352,6 +2352,8 @@ void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)
|
|||||||
Mesh mesh = model.meshes[m];
|
Mesh mesh = model.meshes[m];
|
||||||
Vector3 animVertex = { 0 };
|
Vector3 animVertex = { 0 };
|
||||||
Vector3 animNormal = { 0 };
|
Vector3 animNormal = { 0 };
|
||||||
|
Matrix boneMatrix = { 0 };
|
||||||
|
Matrix InverseBoneMatrix = { 0 };
|
||||||
int boneId = 0;
|
int boneId = 0;
|
||||||
int boneCounter = 0;
|
int boneCounter = 0;
|
||||||
float boneWeight = 0.0;
|
float boneWeight = 0.0;
|
||||||
@@ -2361,6 +2363,18 @@ void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)
|
|||||||
// Skip if missing bone data, causes segfault without on some models
|
// Skip if missing bone data, causes segfault without on some models
|
||||||
if ((mesh.boneWeights == NULL) || (mesh.boneIds == NULL)) continue;
|
if ((mesh.boneWeights == NULL) || (mesh.boneIds == NULL)) continue;
|
||||||
|
|
||||||
|
// Iterates over 4 bones per vertex
|
||||||
|
for (int j = 0; j < 4; j++, boneCounter++)
|
||||||
|
{
|
||||||
|
boneWeight = mesh.boneWeights[boneCounter];
|
||||||
|
boneId = mesh.boneIds[boneCounter];
|
||||||
|
|
||||||
|
// Early stop when no transformation will be applied
|
||||||
|
if (boneWeight == 0.0f) continue;
|
||||||
|
|
||||||
|
boneMatrix = model.meshes[m].boneMatrices[boneId];
|
||||||
|
InverseBoneMatrix = MatrixTranspose(MatrixInvert(boneMatrix));
|
||||||
|
|
||||||
for (int vCounter = 0; vCounter < vValues; vCounter += 3)
|
for (int vCounter = 0; vCounter < vValues; vCounter += 3)
|
||||||
{
|
{
|
||||||
mesh.animVertices[vCounter] = 0;
|
mesh.animVertices[vCounter] = 0;
|
||||||
@@ -2372,17 +2386,8 @@ void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)
|
|||||||
mesh.animNormals[vCounter + 1] = 0;
|
mesh.animNormals[vCounter + 1] = 0;
|
||||||
mesh.animNormals[vCounter + 2] = 0;
|
mesh.animNormals[vCounter + 2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterates over 4 bones per vertex
|
|
||||||
for (int j = 0; j < 4; j++, boneCounter++)
|
|
||||||
{
|
|
||||||
boneWeight = mesh.boneWeights[boneCounter];
|
|
||||||
boneId = mesh.boneIds[boneCounter];
|
|
||||||
|
|
||||||
// Early stop when no transformation will be applied
|
|
||||||
if (boneWeight == 0.0f) continue;
|
|
||||||
animVertex = (Vector3){ mesh.vertices[vCounter], mesh.vertices[vCounter + 1], mesh.vertices[vCounter + 2] };
|
animVertex = (Vector3){ mesh.vertices[vCounter], mesh.vertices[vCounter + 1], mesh.vertices[vCounter + 2] };
|
||||||
animVertex = Vector3Transform(animVertex,model.meshes[m].boneMatrices[boneId]);
|
animVertex = Vector3Transform(animVertex, boneMatrix);
|
||||||
mesh.animVertices[vCounter] += animVertex.x*boneWeight;
|
mesh.animVertices[vCounter] += animVertex.x*boneWeight;
|
||||||
mesh.animVertices[vCounter+1] += animVertex.y*boneWeight;
|
mesh.animVertices[vCounter+1] += animVertex.y*boneWeight;
|
||||||
mesh.animVertices[vCounter+2] += animVertex.z*boneWeight;
|
mesh.animVertices[vCounter+2] += animVertex.z*boneWeight;
|
||||||
@@ -2390,10 +2395,10 @@ void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)
|
|||||||
|
|
||||||
// Normals processing
|
// Normals processing
|
||||||
// NOTE: We use meshes.baseNormals (default normal) to calculate meshes.normals (animated normals)
|
// NOTE: We use meshes.baseNormals (default normal) to calculate meshes.normals (animated normals)
|
||||||
if ((mesh.normals != NULL) && (mesh.animNormals != NULL ))
|
if ((mesh.normals != NULL) && (mesh.animNormals != NULL))
|
||||||
{
|
{
|
||||||
animNormal = (Vector3){ mesh.normals[vCounter], mesh.normals[vCounter + 1], mesh.normals[vCounter + 2] };
|
animNormal = (Vector3){ mesh.normals[vCounter], mesh.normals[vCounter + 1], mesh.normals[vCounter + 2] };
|
||||||
animNormal = Vector3Transform(animNormal, MatrixTranspose(MatrixInvert(model.meshes[m].boneMatrices[boneId])));
|
animNormal = Vector3Transform(animNormal, InverseBoneMatrix);
|
||||||
mesh.animNormals[vCounter] += animNormal.x*boneWeight;
|
mesh.animNormals[vCounter] += animNormal.x*boneWeight;
|
||||||
mesh.animNormals[vCounter + 1] += animNormal.y*boneWeight;
|
mesh.animNormals[vCounter + 1] += animNormal.y*boneWeight;
|
||||||
mesh.animNormals[vCounter + 2] += animNormal.z*boneWeight;
|
mesh.animNormals[vCounter + 2] += animNormal.z*boneWeight;
|
||||||
|
Reference in New Issue
Block a user