/src/away3d/animators/skeleton/SkeletonAdditiveNode.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 100 lines · 76 code · 18 blank · 6 comment · 3 complexity · fd4c650d42a3c7c5405c80f08446a07a MD5 · raw file

  1. /**
  2. * Author: David Lenaerts
  3. */
  4. package away3d.animators.skeleton
  5. {
  6. import away3d.core.math.Quaternion;
  7. import flash.geom.Vector3D;
  8. public class SkeletonAdditiveNode extends SkeletonTreeNode
  9. {
  10. public var baseInput : SkeletonTreeNode;
  11. public var differenceInput : SkeletonTreeNode;
  12. private var _blendWeight : Number = 0;
  13. private static var _tempQuat : Quaternion = new Quaternion();
  14. public function SkeletonAdditiveNode()
  15. {
  16. super();
  17. }
  18. override public function get duration() : Number
  19. {
  20. return baseInput.duration;
  21. }
  22. public function get blendWeight() : Number
  23. {
  24. return _blendWeight;
  25. }
  26. public function set blendWeight(value : Number) : void
  27. {
  28. _blendWeight = value;
  29. _duration = baseInput.duration;
  30. }
  31. override public function set time(value : Number) : void
  32. {
  33. baseInput.time = value;
  34. differenceInput.time = value;
  35. super.time = value;
  36. }
  37. override public function set direction(value : Number) : void
  38. {
  39. baseInput.direction = value;
  40. differenceInput.direction = value;
  41. super.direction = value;
  42. }
  43. // todo: return whether or not update was performed
  44. override public function updatePose(skeleton : Skeleton) : void
  45. {
  46. // todo: should only update if blendWeight dirty, or if either child returns false
  47. baseInput.updatePose(skeleton);
  48. differenceInput.updatePose(skeleton);
  49. var endPose : JointPose;
  50. var endPoses : Vector.<JointPose> = skeletonPose.jointPoses;
  51. var basePoses : Vector.<JointPose> = baseInput.skeletonPose.jointPoses;
  52. var diffPoses : Vector.<JointPose> = differenceInput.skeletonPose.jointPoses;
  53. var base : JointPose, diff : JointPose;
  54. var basePos : Vector3D, diffPos : Vector3D;
  55. var tr : Vector3D;
  56. var numJoints : uint = skeleton.numJoints;
  57. // :s
  58. if (endPoses.length != numJoints) endPoses.length = numJoints;
  59. for (var i : uint = 0; i < numJoints; ++i) {
  60. endPose = endPoses[i] ||= new JointPose();
  61. base = basePoses[i];
  62. diff = diffPoses[i];
  63. basePos = base.translation;
  64. diffPos = diff.translation;
  65. _tempQuat.multiply(diff.orientation, base.orientation);
  66. endPose.orientation.lerp(base.orientation, _tempQuat, _blendWeight);
  67. tr = endPose.translation;
  68. tr.x = basePos.x + _blendWeight*diffPos.x;
  69. tr.y = basePos.y + _blendWeight*diffPos.y;
  70. tr.z = basePos.z + _blendWeight*diffPos.z;
  71. }
  72. }
  73. override public function updatePositionData() : void
  74. {
  75. var deltA : Vector3D = baseInput.rootDelta;
  76. var deltB : Vector3D = differenceInput.rootDelta;
  77. rootDelta.x = deltA.x + _blendWeight*deltB.x;
  78. rootDelta.y = deltA.y + _blendWeight*deltB.y;
  79. rootDelta.z = deltA.z + _blendWeight*deltB.z;
  80. }
  81. }
  82. }