소스 검색

Animation Optimization
Removes numerous calls to dirty() [which in turns calls transformChanged() on itself, and it's children] from Transform::setAnimationPropertyValue() when animating ANIMATE_ROTATE_TRANSLATE or ANIMATE_SCALE_ROTATE_TRANSLATE.
Quaternion friends Transform to give access to static void Quaternion::slerp(float q1x, float q1y, float q1z, float q1w, float q2x, float q2y, float q2z, float q2w, float t, float* dstx, float* dsty, float* dstz, float* dstw). This saves the creation of a Quaternion every time Transform::setAnimationPropertyValue() is called when animating ANIMATE_ROTATE, ANIMATE_ROTATE_TRANSLATE or ANIMATE_SCALE_ROTATE_TRANSLATE.
Removes unnecessary friending of class AnimationController by class AnimationTarget.

Kieran Cunney 13 년 전
부모
커밋
f35263afa7
3개의 변경된 파일20개의 추가작업 그리고 7개의 파일을 삭제
  1. 0 1
      gameplay/src/AnimationTarget.h
  2. 1 0
      gameplay/src/Quaternion.h
  3. 19 6
      gameplay/src/Transform.cpp

+ 0 - 1
gameplay/src/AnimationTarget.h

@@ -19,7 +19,6 @@ class AnimationTarget
 {
 {
     friend class Animation;
     friend class Animation;
     friend class AnimationClip;
     friend class AnimationClip;
-    friend class AnimationController;
 
 
 public:
 public:
 
 

+ 1 - 0
gameplay/src/Quaternion.h

@@ -41,6 +41,7 @@ class Matrix;
 class Quaternion
 class Quaternion
 {
 {
     friend class Curve;
     friend class Curve;
+    friend class Transform;
 
 
 public:
 public:
 
 

+ 19 - 6
gameplay/src/Transform.cpp

@@ -692,6 +692,7 @@ void Transform::setAnimationPropertyValue(int propertyId, AnimationValue* value,
         case ANIMATE_ROTATE:
         case ANIMATE_ROTATE:
         {
         {
             applyAnimationValueRotation(value, 0, blendWeight);
             applyAnimationValueRotation(value, 0, blendWeight);
+            dirty(DIRTY_ROTATION);
             break;
             break;
         }
         }
         case ANIMATE_TRANSLATE:
         case ANIMATE_TRANSLATE:
@@ -717,14 +718,27 @@ void Transform::setAnimationPropertyValue(int propertyId, AnimationValue* value,
         case ANIMATE_ROTATE_TRANSLATE:
         case ANIMATE_ROTATE_TRANSLATE:
         {
         {
             applyAnimationValueRotation(value, 0, blendWeight);
             applyAnimationValueRotation(value, 0, blendWeight);
-            setTranslation(Curve::lerp(blendWeight, _translation.x, value->getFloat(4)), Curve::lerp(blendWeight, _translation.y, value->getFloat(5)), Curve::lerp(blendWeight, _translation.z, value->getFloat(6)));
+
+            _translation.x = Curve::lerp(blendWeight, _translation.x, value->getFloat(4));
+            _translation.y = Curve::lerp(blendWeight, _translation.y, value->getFloat(5));
+            _translation.z = Curve::lerp(blendWeight, _translation.z, value->getFloat(6));
+
+            dirty(DIRTY_ROTATION | DIRTY_TRANSLATION);
             break;
             break;
         }
         }
         case ANIMATE_SCALE_ROTATE_TRANSLATE:
         case ANIMATE_SCALE_ROTATE_TRANSLATE:
         {
         {
-            setScale(Curve::lerp(blendWeight, _scale.x, value->getFloat(0)), Curve::lerp(blendWeight, _scale.y, value->getFloat(1)), Curve::lerp(blendWeight, _scale.z, value->getFloat(2)));
+            _scale.x = Curve::lerp(blendWeight, _scale.x, value->getFloat(0));
+            _scale.y = Curve::lerp(blendWeight, _scale.y, value->getFloat(1));
+            _scale.z = Curve::lerp(blendWeight, _scale.z, value->getFloat(2));
+            
             applyAnimationValueRotation(value, 3, blendWeight);
             applyAnimationValueRotation(value, 3, blendWeight);
-            setTranslation(Curve::lerp(blendWeight, _translation.x, value->getFloat(7)), Curve::lerp(blendWeight, _translation.y, value->getFloat(8)), Curve::lerp(blendWeight, _translation.z, value->getFloat(9)));
+            
+            _translation.x = Curve::lerp(blendWeight, _translation.x, value->getFloat(7));
+            _translation.y = Curve::lerp(blendWeight, _translation.y, value->getFloat(8));
+            _translation.z = Curve::lerp(blendWeight, _translation.z, value->getFloat(9));
+
+            dirty(DIRTY_SCALE | DIRTY_ROTATION | DIRTY_TRANSLATION);
             break;
             break;
         }
         }
         default:
         default:
@@ -786,9 +800,8 @@ void Transform::cloneInto(Transform* transform, NodeCloneContext &context) const
 
 
 void Transform::applyAnimationValueRotation(AnimationValue* value, unsigned int index, float blendWeight)
 void Transform::applyAnimationValueRotation(AnimationValue* value, unsigned int index, float blendWeight)
 {
 {
-    Quaternion q(value->getFloat(index), value->getFloat(index + 1), value->getFloat(index + 2), value->getFloat(index + 3));
-    Quaternion::slerp(_rotation, q, blendWeight, &q);
-    setRotation(q);
+    Quaternion::slerp(_rotation.x, _rotation.y, _rotation.z, _rotation.w, value->getFloat(index), value->getFloat(index + 1), value->getFloat(index + 2), value->getFloat(index + 3), blendWeight, 
+        &_rotation.x, &_rotation.y, &_rotation.z, &_rotation.w);
 }
 }
 
 
 }
 }