BlendCharacterGui.js 4.4 KB

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