animation memory optimization
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-05-25 15:38:01 -04:00
parent 63bcb259ad
commit 545fb1ee8a
3 changed files with 17 additions and 17 deletions

View File

@ -1988,6 +1988,7 @@ Performance improvements
- Reduce bones on LOD human model - Reduce bones on LOD human model
- Shallow clone on physics cell creation - Shallow clone on physics cell creation
- More vector pool usage - More vector pool usage
- Model anim calculations no longer allocate new matrix4d's
Increase human move speed Increase human move speed
LOD components re-attach physics LOD components re-attach physics
VectorPool->JomlPool VectorPool->JomlPool

View File

@ -457,9 +457,9 @@ public class Model {
* @param staticMorph The static morph to apply * @param staticMorph The static morph to apply
*/ */
private void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){ private void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
Matrix4d parentTransform = new Matrix4d(); Matrix4d currentTransform = n.getTransform().identity();
if(n.parent != null){ if(n.parent != null){
parentTransform = new Matrix4d(n.parent.getTransform()); currentTransform.set(n.parent.getTransform());
} }
if(n.is_bone){ if(n.is_bone){
// //
@ -472,7 +472,7 @@ public class Model {
message = message + "bone map key set: " + boneMap.keySet() + "\n"; message = message + "bone map key set: " + boneMap.keySet() + "\n";
throw new Error(message); throw new Error(message);
} }
Matrix4d currentTransform = parentTransform.mul(target_bone.getDeform()); currentTransform.mul(target_bone.getDeform());
if(boneRotators.containsKey(target_bone.boneID)){ if(boneRotators.containsKey(target_bone.boneID)){
currentTransform.rotate(boneRotators.get(target_bone.boneID).getRotation()); currentTransform.rotate(boneRotators.get(target_bone.boneID).getRotation());
} }
@ -483,16 +483,16 @@ public class Model {
} }
// //
Matrix4d bone_matrix = new Matrix4d(currentTransform); Matrix4d bone_matrix = currentTransform;
n.setTransform(currentTransform); n.setTransform(currentTransform);
// //
//Calculate final offset from initial bone //Calculate final offset from initial bone
//https://stackoverflow.com/a/59869381 //https://stackoverflow.com/a/59869381
bone_matrix.mul(target_bone.getMOffset()); bone_matrix.mul(target_bone.getMOffset());
bone_matrix = new Matrix4d(globalInverseTransform).mul(bone_matrix); bone_matrix = globalInverseTransform.mul(bone_matrix, bone_matrix);
target_bone.setFinalTransform(bone_matrix); target_bone.setFinalTransform(bone_matrix);
} else { } else {
n.setTransform(parentTransform.mul(electrosphere.util.Utilities.convertAIMatrix(n.raw_data.mTransformation()))); n.setTransform(currentTransform.mul(electrosphere.util.Utilities.convertAIMatrix(n.raw_data.mTransformation())));
} }
Iterator<AnimNode> node_iterator = n.children.iterator(); Iterator<AnimNode> node_iterator = n.children.iterator();
while(node_iterator.hasNext()){ while(node_iterator.hasNext()){

View File

@ -201,9 +201,9 @@ public class PoseModel {
*/ */
private void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){ private void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
//grab parent transform if exists //grab parent transform if exists
Matrix4d parentTransform = new Matrix4d(); Matrix4d currentTransform = n.getTransform().identity();
if(n.parent != null){ if(n.parent != null){
parentTransform = new Matrix4d(n.parent.getTransform()); currentTransform.set(n.parent.getTransform());
} }
//if this is a bone, calculate the transform for the bone //if this is a bone, calculate the transform for the bone
if(n.is_bone){ if(n.is_bone){
@ -215,24 +215,23 @@ public class PoseModel {
message = message + "bone map key set: " + boneMap.keySet() + "\n"; message = message + "bone map key set: " + boneMap.keySet() + "\n";
throw new Error(message); throw new Error(message);
} }
Matrix4d deformTransform = parentTransform.mul(target_bone.getDeform()); currentTransform.mul(target_bone.getDeform());
if(boneRotators.containsKey(target_bone.boneID)){ if(boneRotators.containsKey(target_bone.boneID)){
deformTransform.rotate(boneRotators.get(target_bone.boneID).getRotation()); currentTransform.rotate(boneRotators.get(target_bone.boneID).getRotation());
} }
Matrix4d bone_matrix = new Matrix4d(deformTransform); n.setTransform(currentTransform);
if(staticMorph != null && staticMorph.getBoneTransforms(n.id) != null){ if(staticMorph != null && staticMorph.getBoneTransforms(n.id) != null){
bone_matrix.mul(staticMorph.getBoneTransforms(n.id).getTransform()); currentTransform.mul(staticMorph.getBoneTransforms(n.id).getTransform());
} }
n.setTransform(deformTransform);
// //
//Calculate final offset from initial bone //Calculate final offset from initial bone
//https://stackoverflow.com/a/59869381 //https://stackoverflow.com/a/59869381
bone_matrix.mul(target_bone.getMOffset()); currentTransform.mul(target_bone.getMOffset());
bone_matrix = new Matrix4d(globalInverseTransform).mul(bone_matrix); currentTransform = globalInverseTransform.mul(currentTransform, currentTransform);
target_bone.setFinalTransform(bone_matrix); target_bone.setFinalTransform(currentTransform);
} else { } else {
//not a bone, so use transform directly from data //not a bone, so use transform directly from data
n.setTransform(parentTransform.mul(electrosphere.util.Utilities.convertAIMatrix(n.raw_data.mTransformation()))); n.setTransform(currentTransform.mul(electrosphere.util.Utilities.convertAIMatrix(n.raw_data.mTransformation())));
} }
//update all children accordingly //update all children accordingly
Iterator<AnimNode> node_iterator = n.children.iterator(); Iterator<AnimNode> node_iterator = n.children.iterator();