utils.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. var spineDemos = {
  2. HOVER_COLOR_INNER: new spine.Color(0.478, 0, 0, 0.25),
  3. HOVER_COLOR_OUTER: new spine.Color(1, 1, 1, 1),
  4. NON_HOVER_COLOR_INNER: new spine.Color(0.478, 0, 0, 0.5),
  5. NON_HOVER_COLOR_OUTER: new spine.Color(1, 0, 0, 0.8),
  6. demos: [],
  7. loopRunning: false,
  8. canvases: [],
  9. downloader: new spine.Downloader(),
  10. path: "assets/"
  11. };
  12. window.onerror = function (msg, url, lineNo, columnNo, error) {
  13. var string = msg.toLowerCase();
  14. var substring = "script error";
  15. if (string.indexOf(substring) > -1)
  16. alert('Script Error: See Browser Console for Detail');
  17. else {
  18. var message = [
  19. 'Message: ' + msg,
  20. 'URL: ' + url,
  21. 'Line: ' + lineNo,
  22. 'Column: ' + columnNo,
  23. 'Error object: ' + JSON.stringify(error)
  24. ].join(' - ');
  25. alert(message);
  26. }
  27. return false;
  28. };
  29. (function () {
  30. var timeKeeper = new spine.TimeKeeper();
  31. function loop() {
  32. timeKeeper.update();
  33. if (spineDemos.log) console.log(timeKeeper.delta + ", " + timeKeeper.framesPerSecond);
  34. requestAnimationFrame(loop);
  35. var demos = spineDemos.demos;
  36. for (var i = 0; i < demos.length; i++) {
  37. var demo = demos[i];
  38. checkElementVisible(demo);
  39. renderDemo(demo);
  40. }
  41. }
  42. function renderDemo(demo) {
  43. if (demo.visible) {
  44. var canvas = demo.canvas;
  45. if (canvas.parentElement != demo.placeholder) {
  46. $(canvas).detach();
  47. demo.placeholder.appendChild(canvas);
  48. }
  49. let complete = demo.assetManager.isLoadingComplete();
  50. if (complete) {
  51. if (!demo.loaded) {
  52. demo.loaded = true;
  53. demo.loadingComplete();
  54. }
  55. if (spineDemos.log) console.log("Rendering: " + canvas.id);
  56. demo.render();
  57. }
  58. demo.loadingScreen.draw(complete);
  59. }
  60. }
  61. function checkElementVisible(demo) {
  62. const rect = demo.placeholder.getBoundingClientRect();
  63. const windowHeight = (window.innerHeight || document.documentElement.clientHeight);
  64. const windowWidth = (window.innerWidth || document.documentElement.clientWidth);
  65. const vertInView = (rect.top <= windowHeight * 1.1) && ((rect.top + rect.height) >= windowHeight * -0.1);
  66. const horInView = (rect.left <= windowWidth * 1.1) && ((rect.left + rect.width) >= windowWidth * -0.1);
  67. demo.visible = (vertInView && horInView);
  68. }
  69. function createCanvases(numCanvases) {
  70. for (var i = 0; i < numCanvases; i++) {
  71. var canvas = document.createElement("canvas");
  72. canvas.width = 1; canvas.height = 1;
  73. canvas.context = new spine.ManagedWebGLRenderingContext(canvas, { alpha: false });
  74. canvas.id = "canvas-" + i;
  75. spineDemos.canvases.push(canvas);
  76. }
  77. }
  78. spineDemos.init = function () {
  79. var numCanvases = 5;
  80. var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
  81. var isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1;
  82. if (isFirefox && isAndroid) numCanvases = 2;
  83. createCanvases(numCanvases);
  84. loadSliders();
  85. requestAnimationFrame(loop);
  86. }
  87. spineDemos.addDemo = function (demo, placeholder) {
  88. var canvas = spineDemos.canvases[spineDemos.demos.length % spineDemos.canvases.length];
  89. demo(canvas);
  90. demo.placeholder = placeholder;
  91. demo.canvas = canvas;
  92. demo.visible = false;
  93. var renderer = new spine.SceneRenderer(canvas, canvas.context.gl);
  94. demo.loadingScreen = new spine.LoadingScreen(renderer);
  95. $(window).on('DOMContentLoaded load resize scroll', function () {
  96. checkElementVisible(demo);
  97. renderDemo(demo);
  98. });
  99. checkElementVisible(demo);
  100. spineDemos.demos.push(demo);
  101. }
  102. var coords = new spine.Vector3();
  103. var mouse = new spine.Vector3();
  104. spineDemos.closest = function (canvas, renderer, skeleton, controlBones, hoverTargets, x, y) {
  105. mouse.set(x, canvas.clientHeight - y, 0)
  106. var bestDistance = 24, index = 0;
  107. var best;
  108. for (var i = 0; i < controlBones.length; i++) {
  109. hoverTargets[i] = null;
  110. let bone = skeleton.findBone(controlBones[i]);
  111. let distance = renderer.camera.worldToScreen(
  112. coords.set(bone.worldX, bone.worldY, 0),
  113. canvas.clientWidth, canvas.clientHeight).distance(mouse);
  114. if (distance < bestDistance) {
  115. bestDistance = distance;
  116. best = bone;
  117. index = i;
  118. }
  119. }
  120. if (best) hoverTargets[index] = best;
  121. return best;
  122. };
  123. var position = new spine.Vector3();
  124. spineDemos.dragged = function (canvas, renderer, target, x, y) {
  125. if (target) {
  126. x = spine.MathUtils.clamp(x, 0, canvas.clientWidth)
  127. y = spine.MathUtils.clamp(y, 0, canvas.clientHeight);
  128. renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.clientWidth, canvas.clientHeight);
  129. if (target.parent !== null) {
  130. target.parent.worldToLocal(position.set(coords.x, coords.y));
  131. target.x = position.x;
  132. target.y = position.y;
  133. } else {
  134. target.x = coords.x;
  135. target.y = coords.y;
  136. }
  137. }
  138. };
  139. loadSliders = function () {
  140. $(window).resize(function () {
  141. $(".slider").each(function () {
  142. $(this).data("slider").resized();
  143. });
  144. });
  145. $(".slider").each(function () {
  146. var div = $(this), handle = $("<div/>").appendTo(div);
  147. var bg1, bg2;
  148. if (div.hasClass("filled")) {
  149. bg1 = $("<span/>").appendTo(div)[0].style;
  150. bg2 = $("<span/>").appendTo(div)[0].style;
  151. }
  152. var hw = handle.width(), value = 0, object, lastX;
  153. handle = handle[0].style;
  154. positionHandle(0);
  155. function positionHandle(percent) {
  156. var w = div.width();
  157. var x = Math.round((w - hw - 3) * percent + 1);
  158. if (x != lastX) {
  159. lastX = x;
  160. handle.transform = "translateX(" + x + "px)";
  161. if (bg1) {
  162. var w1 = x + hw / 2;
  163. bg1.width = w1 + "px";
  164. bg2.width = (w - w1) + "px";
  165. bg2.left = w1 + "px";
  166. }
  167. }
  168. value = percent;
  169. }
  170. function mouseEvent(e) {
  171. var x = e.pageX;
  172. if (!x && e.originalEvent.touches) x = e.originalEvent.touches[0].pageX;
  173. var percent = Math.max(0, Math.min(1, (x - div.offset().left - hw / 2) / (div.width() - hw - 2)));
  174. positionHandle(percent);
  175. if (object.changed) object.changed(percent);
  176. }
  177. function clearEvents() {
  178. $(document).off("mouseup.slider mousemove.slider touchmove.slider touchend.slider");
  179. }
  180. div.on("mousedown touchstart", function (e) {
  181. mouseEvent(e);
  182. e.preventDefault(); // Disable text selection.
  183. $(document).on("mousemove.slider touchmove.slider", mouseEvent).on("mouseup.slider touchend.slider", clearEvents);
  184. });
  185. div.data("slider", object = {
  186. set: positionHandle,
  187. get: function () { return value; },
  188. resized: function () {
  189. lastX = null;
  190. positionHandle(value);
  191. }
  192. });
  193. });
  194. }
  195. })();