meshes.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. var meshesDemo = function (canvas, bgColor) {
  2. var canvas, gl, renderer, input, assetManager;
  3. var skeleton, bounds;
  4. var timeKeeper;
  5. var skeletons = {};
  6. var activeSkeleton = "Orange Girl";
  7. var playButton, timeline, isPlaying = true;
  8. if (!bgColor) bgColor = new spine.Color(235 / 255, 239 / 255, 244 / 255, 1);
  9. function init() {
  10. gl = canvas.context.gl;
  11. renderer = new spine.SceneRenderer(canvas, gl);
  12. renderer.skeletonDebugRenderer.drawRegionAttachments = false;
  13. assetManager = new spine.AssetManager(gl, spineDemos.path, spineDemos.downloader);
  14. assetManager.loadTextureAtlas("atlas2.atlas");
  15. assetManager.loadJson("demos.json");
  16. timeKeeper = new spine.TimeKeeper();
  17. }
  18. function loadingComplete() {
  19. timeKeeper.update();
  20. skeletons["Orange Girl"] = loadSkeleton("orangegirl", "animation");
  21. skeletons["Green Girl"] = loadSkeleton("greengirl", "animation");
  22. skeletons["Armor Girl"] = loadSkeleton("armorgirl", "animation");
  23. setupUI();
  24. }
  25. function setupUI() {
  26. playButton = $("#meshes-playbutton");
  27. var playButtonUpdate = function () {
  28. isPlaying = !isPlaying;
  29. if (isPlaying)
  30. playButton.addClass("pause").removeClass("play");
  31. else
  32. playButton.addClass("play").removeClass("pause");
  33. }
  34. playButton.click(playButtonUpdate);
  35. playButton.addClass("pause");
  36. timeline = $("#meshes-timeline").data("slider");
  37. timeline.changed = function (percent) {
  38. if (isPlaying) playButton.click();
  39. if (!isPlaying) {
  40. var active = skeletons[activeSkeleton];
  41. var animationDuration = active.state.getCurrent(0).animation.duration;
  42. var time = animationDuration * percent;
  43. active.state.update(time - active.playTime);
  44. active.state.apply(active.skeleton);
  45. active.skeleton.updateWorldTransform(spine.Physics.update);
  46. active.playTime = time;
  47. }
  48. };
  49. var list = $("#meshes-skeleton");
  50. for (var skeletonName in skeletons) {
  51. var option = $("<option></option>");
  52. option.attr("value", skeletonName).text(skeletonName);
  53. if (skeletonName === activeSkeleton) option.attr("selected", "selected");
  54. list.append(option);
  55. }
  56. list.change(function () {
  57. activeSkeleton = $("#meshes-skeleton option:selected").text();
  58. var active = skeletons[activeSkeleton];
  59. var animationDuration = active.state.getCurrent(0).animation.duration;
  60. timeline.set(active.playTime / animationDuration);
  61. })
  62. renderer.skeletonDebugRenderer.drawBones = false;
  63. $("#meshes-drawbonescheckbox").click(function () {
  64. renderer.skeletonDebugRenderer.drawBones = this.checked;
  65. })
  66. renderer.skeletonDebugRenderer.drawMeshHull = false;
  67. renderer.skeletonDebugRenderer.drawMeshTriangles = false;
  68. $("#meshes-drawmeshtrianglescheckbox").click(function () {
  69. renderer.skeletonDebugRenderer.drawMeshHull = this.checked;
  70. renderer.skeletonDebugRenderer.drawMeshTriangles = this.checked;
  71. })
  72. }
  73. function loadSkeleton(name, animation, sequenceSlots) {
  74. var atlasLoader = new spine.AtlasAttachmentLoader(assetManager.get("atlas2.atlas"));
  75. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  76. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("demos.json")[name]);
  77. var skeleton = new spine.Skeleton(skeletonData);
  78. skeleton.setSkinByName("default");
  79. var state = new spine.AnimationState(new spine.AnimationStateData(skeletonData));
  80. state.setAnimation(0, animation, true);
  81. state.apply(skeleton);
  82. skeleton.updateWorldTransform(spine.Physics.update);
  83. var offset = new spine.Vector2();
  84. var size = new spine.Vector2();
  85. skeleton.getBounds(offset, size, []);
  86. return {
  87. skeleton: skeleton,
  88. state: state,
  89. playTime: 0,
  90. bounds: {
  91. offset: offset,
  92. size: size
  93. }
  94. };
  95. }
  96. function render() {
  97. timeKeeper.update();
  98. var delta = timeKeeper.delta;
  99. var active = skeletons[activeSkeleton];
  100. var skeleton = active.skeleton;
  101. var state = active.state;
  102. var offset = active.bounds.offset;
  103. var size = active.bounds.size;
  104. renderer.camera.position.x = offset.x + size.x / 2;
  105. renderer.camera.position.y = offset.y + size.y / 2 + 20;
  106. renderer.camera.viewportWidth = size.x * 1.1;
  107. renderer.camera.viewportHeight = size.y * 1.1;
  108. renderer.resize(spine.ResizeMode.Fit);
  109. gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
  110. gl.clear(gl.COLOR_BUFFER_BIT);
  111. if (isPlaying) {
  112. var animationDuration = state.getCurrent(0).animation.duration;
  113. active.playTime += delta;
  114. while (active.playTime >= animationDuration)
  115. active.playTime -= animationDuration;
  116. timeline.set(active.playTime / animationDuration);
  117. state.update(delta);
  118. state.apply(skeleton);
  119. skeleton.updateWorldTransform(spine.Physics.update);
  120. }
  121. renderer.begin();
  122. renderer.drawSkeleton(skeleton, true);
  123. renderer.drawSkeletonDebug(skeleton);
  124. renderer.end();
  125. }
  126. init();
  127. meshesDemo.assetManager = assetManager;
  128. meshesDemo.loadingComplete = loadingComplete;
  129. meshesDemo.render = render;
  130. };