imagechanges.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. var imageChangesDemo = function (canvas, bgColor) {
  2. var OUTLINE_COLOR = new spine.Color(0, 0.8, 0, 1);
  3. var canvas, gl, renderer, input, assetManager;
  4. var skeleton, bounds;
  5. var timeKeeper;
  6. var skeletons = {};
  7. var activeSkeleton = "Alien";
  8. var playButton, timeLine, isPlaying = true;
  9. if (!bgColor) bgColor = new spine.Color(235 / 255, 239 / 255, 244 / 255, 1);
  10. function init() {
  11. gl = canvas.context.gl;
  12. renderer = new spine.SceneRenderer(canvas, gl);
  13. assetManager = new spine.AssetManager(gl, spineDemos.path, spineDemos.downloader);
  14. assetManager.loadTextureAtlas("atlas1.atlas");
  15. assetManager.loadJson("demos.json");
  16. timeKeeper = new spine.TimeKeeper();
  17. }
  18. function loadingComplete() {
  19. skeletons["Alien"] = loadSkeleton("alien", "death", ["head", "splat-fg", "splat-bg"]);
  20. skeletons["Dragon"] = loadSkeleton("dragon", "flying", ["R_wing"])
  21. setupUI();
  22. }
  23. function setupUI() {
  24. playButton = $("#imagechanges-playbutton");
  25. var playButtonUpdate = function () {
  26. isPlaying = !isPlaying;
  27. if (isPlaying)
  28. playButton.addClass("pause").removeClass("play");
  29. else
  30. playButton.addClass("play").removeClass("pause");
  31. }
  32. playButton.click(playButtonUpdate);
  33. playButton.addClass("pause");
  34. timeLine = $("#imagechanges-timeline").data("slider");
  35. timeLine.changed = function (percent) {
  36. if (isPlaying) playButton.click();
  37. if (!isPlaying) {
  38. var active = skeletons[activeSkeleton];
  39. var animationDuration = active.state.getCurrent(0).animation.duration;
  40. var time = animationDuration * percent;
  41. active.state.update(time - active.playTime);
  42. active.state.apply(active.skeleton);
  43. active.skeleton.updateWorldTransform(spine.Physics.update);
  44. active.playTime = time;
  45. }
  46. };
  47. var list = $("#imagechanges-skeleton");
  48. for (var skeletonName in skeletons) {
  49. var option = $("<option></option>");
  50. option.attr("value", skeletonName).text(skeletonName);
  51. if (skeletonName === activeSkeleton) option.attr("selected", "selected");
  52. list.append(option);
  53. }
  54. list.change(function () {
  55. activeSkeleton = $("#imagechanges-skeleton option:selected").text();
  56. var active = skeletons[activeSkeleton];
  57. var animationDuration = active.state.getCurrent(0).animation.duration;
  58. timeLine.set(active.playTime / animationDuration);
  59. })
  60. }
  61. function loadSkeleton(name, animation, sequenceSlots) {
  62. var atlasLoader = new spine.AtlasAttachmentLoader(assetManager.get("atlas1.atlas"));
  63. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  64. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("demos.json")[name]);
  65. var skeleton = new spine.Skeleton(skeletonData);
  66. skeleton.setSkinByName("default");
  67. var state = new spine.AnimationState(new spine.AnimationStateData(skeletonData));
  68. var anim = skeletonData.findAnimation(animation);
  69. state.setAnimation(0, animation, true);
  70. state.apply(skeleton);
  71. skeleton.updateWorldTransform(spine.Physics.update);
  72. var offset = new spine.Vector2();
  73. var size = new spine.Vector2();
  74. skeleton.getBounds(offset, size, []);
  75. var regions = [];
  76. for (var i = 0; i < sequenceSlots.length; i++) {
  77. var slot = skeleton.findSlot(sequenceSlots[i]);
  78. sequenceSlots[i] = slot;
  79. var index = slot.data.index;
  80. for (var name in skeleton.skin.attachments[index])
  81. regions.push(skeleton.skin.attachments[index][name]);
  82. }
  83. return {
  84. skeleton: skeleton,
  85. state: state,
  86. playTime: 0,
  87. bounds: {
  88. offset: offset,
  89. size: size
  90. },
  91. slots: sequenceSlots,
  92. regions: regions
  93. };
  94. }
  95. function render() {
  96. timeKeeper.update();
  97. var delta = timeKeeper.delta;
  98. var active = skeletons[activeSkeleton];
  99. var skeleton = active.skeleton;
  100. var state = active.state;
  101. var offset = active.bounds.offset;
  102. var size = active.bounds.size;
  103. var x = offset.x + size.x + 100, offsetY = offset.y, zoom = 1;
  104. if (activeSkeleton === "Alien") {
  105. renderer.camera.position.x = offset.x + size.x + 400;
  106. renderer.camera.position.y = offset.y + size.y / 2 + 450;
  107. x += 400;
  108. zoom = 0.31;
  109. } else {
  110. renderer.camera.position.x = offset.x + size.x;
  111. renderer.camera.position.y = offset.y + size.y / 2;
  112. x += 100;
  113. }
  114. renderer.camera.viewportWidth = size.x * 2.4 / zoom;
  115. renderer.camera.viewportHeight = size.y * 1.4 / zoom;
  116. renderer.resize(spine.ResizeMode.Fit);
  117. gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
  118. gl.clear(gl.COLOR_BUFFER_BIT);
  119. if (isPlaying) {
  120. var animationDuration = state.getCurrent(0).animation.duration;
  121. active.playTime += delta;
  122. while (active.playTime >= animationDuration) {
  123. active.playTime -= animationDuration;
  124. }
  125. timeLine.set(active.playTime / animationDuration);
  126. state.update(delta);
  127. state.apply(skeleton);
  128. skeleton.updateWorldTransform(spine.Physics.update);
  129. }
  130. renderer.begin();
  131. renderer.drawSkeleton(skeleton, true);
  132. var y = offsetY;
  133. var slotsWidth = 0, slotsHeight = 0;
  134. var slotSize = size.y / 3;
  135. var maxSlotWidth = 0;
  136. var j = 0;
  137. for (var i = 0, n = active.regions.length; i < n; i++) {
  138. var region = active.regions[i].region;
  139. var scale = Math.min(slotSize / region.height, slotSize / region.width) / zoom;
  140. renderer.drawRegion(region, x, y, region.width * scale, region.height * scale);
  141. for (var ii = 0; ii < active.slots.length; ii++) {
  142. var slot = active.slots[ii];
  143. if (slot.attachment && slot.attachment.name === region.name) {
  144. renderer.rect(false, x, y, region.width * scale, region.height * scale, OUTLINE_COLOR);
  145. break;
  146. }
  147. }
  148. maxSlotWidth = Math.max(maxSlotWidth, region.width * scale);
  149. y += slotSize / zoom + 2;
  150. j++;
  151. if (j == 3) {
  152. x += maxSlotWidth + 10;
  153. maxSlotWidth = 0;
  154. y = offsetY;
  155. j = 0;
  156. }
  157. }
  158. renderer.end();
  159. }
  160. init();
  161. imageChangesDemo.assetManager = assetManager;
  162. imageChangesDemo.loadingComplete = loadingComplete;
  163. imageChangesDemo.render = render;
  164. };