/src/away3d/animators/skeleton/SkeletonDirectionalNode.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 123 lines · 99 code · 16 blank · 8 comment · 13 complexity · 48a6bdb2c191c6243383e1439c2613e0 MD5 · raw file

  1. /**
  2. * Author: David Lenaerts
  3. */
  4. package away3d.animators.skeleton
  5. {
  6. import flash.geom.Vector3D;
  7. public class SkeletonDirectionalNode extends SkeletonTreeNode
  8. {
  9. /**
  10. * The weights for each joint. The total needs to equal 1.
  11. */
  12. public var forward : SkeletonTreeNode;
  13. public var backward : SkeletonTreeNode;
  14. public var left : SkeletonTreeNode;
  15. public var right : SkeletonTreeNode;
  16. private var _inputA : SkeletonTreeNode;
  17. private var _inputB : SkeletonTreeNode;
  18. private var _blendWeight : Number;
  19. private var _blendDirty : Boolean;
  20. public function SkeletonDirectionalNode()
  21. {
  22. super();
  23. }
  24. override public function set time(value : Number) : void
  25. {
  26. forward.time = value;
  27. backward.time = value;
  28. left.time = value;
  29. right.time = value;
  30. super.time = value;
  31. }
  32. // between 0 - 360
  33. override public function set direction(value : Number) : void
  34. {
  35. forward.direction = value;
  36. backward.direction = value;
  37. left.direction = value;
  38. right.direction = value;
  39. _blendDirty = true;
  40. super.direction = value;
  41. }
  42. override public function updatePose(skeleton : Skeleton) : void
  43. {
  44. if (_blendDirty) updateBlend();
  45. _inputA.updatePose(skeleton);
  46. _inputB.updatePose(skeleton);
  47. var durA : Number = _inputA.duration;
  48. var endPose : JointPose;
  49. var endPoses : Vector.<JointPose> = skeletonPose.jointPoses;
  50. var poses1 : Vector.<JointPose> = _inputA.skeletonPose.jointPoses;
  51. var poses2 : Vector.<JointPose> = _inputB.skeletonPose.jointPoses;
  52. var pose1 : JointPose, pose2 : JointPose;
  53. var p1 : Vector3D, p2 : Vector3D;
  54. var tr : Vector3D;
  55. var numJoints : uint = skeleton.numJoints;
  56. // :s
  57. if (endPoses.length != numJoints) endPoses.length = numJoints;
  58. _duration = durA + _blendWeight*(_inputB.duration - durA);
  59. for (var i : uint = 0; i < numJoints; ++i) {
  60. endPose = endPoses[i] ||= new JointPose();
  61. pose1 = poses1[i];
  62. pose2 = poses2[i];
  63. p1 = pose1.translation; p2 = pose2.translation;
  64. endPose.orientation.lerp(pose1.orientation, pose2.orientation, _blendWeight);
  65. tr = endPose.translation;
  66. tr.x = p1.x + _blendWeight*(p2.x - p1.x);
  67. tr.y = p1.y + _blendWeight*(p2.y - p1.y);
  68. tr.z = p1.z + _blendWeight*(p2.z - p1.z);
  69. }
  70. }
  71. private function updateBlend() : void
  72. {
  73. _blendDirty = false;
  74. while (_direction < 0) _direction += 360;
  75. while (_direction >= 360) _direction -= 360;
  76. if (_direction < 90) {
  77. _inputA = forward;
  78. _inputB = right;
  79. _blendWeight = _direction/90;
  80. }
  81. else if (_direction < 180) {
  82. _inputA = right;
  83. _inputB = backward;
  84. _blendWeight = (_direction-90)/90;
  85. }
  86. else if (_direction < 270) {
  87. _inputA = backward;
  88. _inputB = left;
  89. _blendWeight = (_direction-180)/90;
  90. }
  91. else {
  92. _inputA = left;
  93. _inputB = forward;
  94. _blendWeight = (_direction-270)/90;
  95. }
  96. }
  97. override public function updatePositionData() : void
  98. {
  99. if (_blendDirty) updateBlend();
  100. var deltA : Vector3D = _inputA.rootDelta;
  101. var deltB : Vector3D = _inputB.rootDelta;
  102. rootDelta.x = deltA.x + _blendWeight*(deltB.x - deltA.x);
  103. rootDelta.y = deltA.y + _blendWeight*(deltB.y - deltA.y);
  104. rootDelta.z = deltA.z + _blendWeight*(deltB.z - deltA.z);
  105. }
  106. }
  107. }