BlendCharacterGui.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * @author Michael Guerrero / http://realitymeltdown.com
  3. */
  4. function BlendCharacterGui(animations) {
  5. var controls = {
  6. gui: null,
  7. "Lock Camera": false,
  8. "Show Skeleton": true,
  9. "Time Scale": 1.0,
  10. "Step Size": 0.016,
  11. "Crossfade Time": 3.5,
  12. "idle": 0.33,
  13. "walk": 0.33,
  14. "run": 0.33
  15. };
  16. var animations = animations;
  17. this.showSkeleton = function() {
  18. return controls['Show Skeleton'];
  19. };
  20. this.getTimeScale = function() {
  21. return controls['Time Scale'];
  22. };
  23. this.update = function() {
  24. controls[ 'idle'] = animations[ 'idle' ].weight;
  25. controls[ 'walk'] = animations[ 'walk' ].weight;
  26. controls[ 'run'] = animations[ 'run' ].weight;
  27. };
  28. var init = function() {
  29. controls.gui = new dat.GUI();
  30. var settings = controls.gui.addFolder( 'Settings' );
  31. var playback = controls.gui.addFolder( 'Playback' );
  32. var blending = controls.gui.addFolder( 'Blend Tuning' );
  33. settings.add( controls, "Lock Camera" ).onChange( controls.lockCameraChanged );
  34. settings.add( controls, "Show Skeleton" ).onChange( controls.showSkeletonChanged );
  35. settings.add( controls, "Time Scale", 0, 1, 0.01 );
  36. settings.add( controls, "Step Size", 0.01, 0.1, 0.01 );
  37. settings.add( controls, "Crossfade Time", 0.1, 6.0, 0.05 );
  38. // These controls execute functions
  39. playback.add( controls, "start" );
  40. playback.add( controls, "pause" );
  41. playback.add( controls, "step" );
  42. playback.add( controls, "idle to walk" );
  43. playback.add( controls, "walk to run" );
  44. playback.add( controls, "warp walk to run" );
  45. blending.add( controls, "idle", 0, 1, 0.01).listen().onChange( controls.weight );
  46. blending.add( controls, "walk", 0, 1, 0.01).listen().onChange( controls.weight );
  47. blending.add( controls, "run", 0, 1, 0.01).listen().onChange( controls.weight );
  48. settings.open();
  49. playback.open();
  50. blending.open();
  51. }
  52. var getAnimationData = function() {
  53. return {
  54. detail: {
  55. anims: [ "idle", "walk", "run" ],
  56. weights: [ controls['idle'],
  57. controls['walk'],
  58. controls['run'] ]
  59. }
  60. };
  61. }
  62. controls.start = function() {
  63. var startEvent = new CustomEvent( 'start-animation', getAnimationData() );
  64. window.dispatchEvent(startEvent);
  65. };
  66. controls.stop = function() {
  67. var stopEvent = new CustomEvent( 'stop-animation' );
  68. window.dispatchEvent( stopEvent );
  69. };
  70. controls.pause = function() {
  71. var pauseEvent = new CustomEvent( 'pause-animation' );
  72. window.dispatchEvent( pauseEvent );
  73. };
  74. controls.step = function() {
  75. var stepData = { detail: { stepSize: controls['Step Size'] } };
  76. window.dispatchEvent( new CustomEvent('step-animation', stepData ));
  77. };
  78. controls.weight = function() {
  79. // renormalize
  80. var sum = controls['idle'] + controls['walk'] + controls['run'];
  81. controls['idle'] /= sum;
  82. controls['walk'] /= sum;
  83. controls['run'] /= sum;
  84. var weightEvent = new CustomEvent( 'weight-animation', getAnimationData() );
  85. window.dispatchEvent(weightEvent);
  86. };
  87. controls.crossfade = function( from, to ) {
  88. var fadeData = getAnimationData();
  89. fadeData.detail.from = from;
  90. fadeData.detail.to = to;
  91. fadeData.detail.time = controls[ "Crossfade Time" ];
  92. window.dispatchEvent( new CustomEvent( 'crossfade', fadeData ) );
  93. }
  94. controls.warp = function( from, to ) {
  95. var warpData = getAnimationData();
  96. warpData.detail.from = 'walk';
  97. warpData.detail.to = 'run';
  98. warpData.detail.time = controls[ "Crossfade Time" ];
  99. window.dispatchEvent( new CustomEvent( 'warp', warpData ) );
  100. }
  101. controls['idle to walk'] = function() {
  102. controls.crossfade( 'idle', 'walk' );
  103. };
  104. controls['walk to run'] = function() {
  105. controls.crossfade( 'walk', 'run' );
  106. };
  107. controls['warp walk to run'] = function() {
  108. controls.warp( 'walk', 'run' );
  109. };
  110. controls.lockCameraChanged = function() {
  111. var data = {
  112. detail: {
  113. shouldLock: controls['Lock Camera']
  114. }
  115. }
  116. window.dispatchEvent( new CustomEvent( 'toggle-lock-camera', data ) );
  117. }
  118. controls.showSkeletonChanged = function() {
  119. var data = {
  120. detail: {
  121. shouldShow: controls['Show Skeleton']
  122. }
  123. }
  124. window.dispatchEvent( new CustomEvent( 'toggle-show-skeleton', data ) );
  125. }
  126. init.call(this);
  127. }