From 545fb1ee8a9e39454a1de854e7dc4b5a2dc2be7a Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 25 May 2025 15:38:01 -0400 Subject: [PATCH] animation memory optimization --- docs/src/progress/renderertodo.md | 1 + .../electrosphere/renderer/model/Model.java | 12 +++++------ .../server/entity/poseactor/PoseModel.java | 21 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 8a154337..3b607df6 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1988,6 +1988,7 @@ Performance improvements - Reduce bones on LOD human model - Shallow clone on physics cell creation - More vector pool usage + - Model anim calculations no longer allocate new matrix4d's Increase human move speed LOD components re-attach physics VectorPool->JomlPool diff --git a/src/main/java/electrosphere/renderer/model/Model.java b/src/main/java/electrosphere/renderer/model/Model.java index e2714eb2..637c036a 100644 --- a/src/main/java/electrosphere/renderer/model/Model.java +++ b/src/main/java/electrosphere/renderer/model/Model.java @@ -457,9 +457,9 @@ public class Model { * @param staticMorph The static morph to apply */ private void updateNodeTransform(AnimNode n, Map boneRotators, ActorStaticMorph staticMorph){ - Matrix4d parentTransform = new Matrix4d(); + Matrix4d currentTransform = n.getTransform().identity(); if(n.parent != null){ - parentTransform = new Matrix4d(n.parent.getTransform()); + currentTransform.set(n.parent.getTransform()); } if(n.is_bone){ // @@ -472,7 +472,7 @@ public class Model { message = message + "bone map key set: " + boneMap.keySet() + "\n"; throw new Error(message); } - Matrix4d currentTransform = parentTransform.mul(target_bone.getDeform()); + currentTransform.mul(target_bone.getDeform()); if(boneRotators.containsKey(target_bone.boneID)){ 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); // //Calculate final offset from initial bone //https://stackoverflow.com/a/59869381 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); } 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 node_iterator = n.children.iterator(); while(node_iterator.hasNext()){ diff --git a/src/main/java/electrosphere/server/entity/poseactor/PoseModel.java b/src/main/java/electrosphere/server/entity/poseactor/PoseModel.java index aad12c93..b6cfeef9 100644 --- a/src/main/java/electrosphere/server/entity/poseactor/PoseModel.java +++ b/src/main/java/electrosphere/server/entity/poseactor/PoseModel.java @@ -201,9 +201,9 @@ public class PoseModel { */ private void updateNodeTransform(AnimNode n, Map boneRotators, ActorStaticMorph staticMorph){ //grab parent transform if exists - Matrix4d parentTransform = new Matrix4d(); + Matrix4d currentTransform = n.getTransform().identity(); 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(n.is_bone){ @@ -215,24 +215,23 @@ public class PoseModel { message = message + "bone map key set: " + boneMap.keySet() + "\n"; throw new Error(message); } - Matrix4d deformTransform = parentTransform.mul(target_bone.getDeform()); + currentTransform.mul(target_bone.getDeform()); 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){ - bone_matrix.mul(staticMorph.getBoneTransforms(n.id).getTransform()); + currentTransform.mul(staticMorph.getBoneTransforms(n.id).getTransform()); } - n.setTransform(deformTransform); // //Calculate final offset from initial bone //https://stackoverflow.com/a/59869381 - bone_matrix.mul(target_bone.getMOffset()); - bone_matrix = new Matrix4d(globalInverseTransform).mul(bone_matrix); - target_bone.setFinalTransform(bone_matrix); + currentTransform.mul(target_bone.getMOffset()); + currentTransform = globalInverseTransform.mul(currentTransform, currentTransform); + target_bone.setFinalTransform(currentTransform); } else { //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 Iterator node_iterator = n.children.iterator();