additiveblending.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. var additiveBlendingDemo = function(canvas, bgColor) {
  2. var COLOR_INNER = new spine.Color(0.8, 0, 0, 0.5);
  3. var COLOR_OUTER = new spine.Color(0.8, 0, 0, 0.8);
  4. var COLOR_INNER_SELECTED = new spine.Color(0.0, 0, 0.8, 0.5);
  5. var COLOR_OUTER_SELECTED = new spine.Color(0.0, 0, 0.8, 0.8);
  6. var HANDLE_SIZE = 0.10;
  7. var gl, renderer, input, assetManager;
  8. var skeleton, state, bounds;
  9. var timeKeeper;
  10. var target = null;
  11. var dragging = false;
  12. var handle = new spine.Vector2();
  13. var coords = new spine.webgl.Vector3(), temp = new spine.webgl.Vector3(), temp2 = new spine.Vector2(), temp3 = new spine.webgl.Vector3();
  14. var isPlaying = true;
  15. var left, right, up, down;
  16. var cursor;
  17. var clientMouseX = 0, clientMouseY = 0, mouseMoved;
  18. if (!bgColor) bgColor = new spine.Color(235 / 255, 239 / 255, 244 / 255, 1);
  19. function isMobileDevice() {
  20. return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
  21. };
  22. function init () {
  23. gl = canvas.context.gl;
  24. renderer = new spine.webgl.SceneRenderer(canvas, gl);
  25. assetManager = new spine.webgl.AssetManager(gl, spineDemos.path, spineDemos.downloader);
  26. assetManager.loadTextureAtlas("atlas2.atlas");
  27. assetManager.loadJson("demos.json");
  28. timeKeeper = new spine.TimeKeeper();
  29. cursor = document.getElementById("cursor");
  30. }
  31. function loadingComplete () {
  32. var atlasLoader = new spine.AtlasAttachmentLoader(assetManager.get("atlas2.atlas"));
  33. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  34. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("demos.json").owl);
  35. skeleton = new spine.Skeleton(skeletonData);
  36. state = new spine.AnimationState(new spine.AnimationStateData(skeleton.data));
  37. state.setAnimation(0, "idle", true);
  38. state.setAnimation(1, "blink", true);
  39. left = state.setAnimation(2, "left", true);
  40. right = state.setAnimation(3, "right", true);
  41. up = state.setAnimation(4, "up", true);
  42. down = state.setAnimation(5, "down", true);
  43. left.mixBlend = spine.MixBlend.add;
  44. right.mixBlend = spine.MixBlend.add;
  45. up.mixBlend = spine.MixBlend.add;
  46. down.mixBlend = spine.MixBlend.add;
  47. left.alpha = 0;
  48. right.alpha = 0;
  49. up.alpha = 0;
  50. down.alpha = 0;
  51. state.apply(skeleton);
  52. skeleton.updateWorldTransform();
  53. var offset = new spine.Vector2();
  54. bounds = new spine.Vector2();
  55. skeleton.getBounds(offset, bounds, []);
  56. renderer.camera.position.x = offset.x + bounds.x / 2;
  57. renderer.camera.position.y = offset.y + bounds.y / 2;
  58. renderer.skeletonDebugRenderer.drawMeshHull = false;
  59. renderer.skeletonDebugRenderer.drawMeshTriangles = false;
  60. setupInput();
  61. }
  62. function calculateBlend (x, y, isPageCoords) {
  63. var canvasBounds = canvas.getBoundingClientRect();
  64. var centerX = canvasBounds.x + canvasBounds.width / 2;
  65. var centerY = canvasBounds.y + canvasBounds.height / 2;
  66. right.alpha = x < centerX ? 1 - x / centerX : 0;
  67. left.alpha = x > centerX ? (x - centerX) / (window.innerWidth - centerX): 0;
  68. up.alpha = y < centerY ? 1 - y / centerY : 0;
  69. down.alpha = y > centerY ? (y - centerY) / (window.innerHeight - centerY): 0;
  70. }
  71. function setupInput () {
  72. if (!isMobileDevice()) {
  73. document.addEventListener("mousemove", function (event) {
  74. clientMouseX = event.clientX;
  75. clientMouseY = event.clientY;
  76. mouseMoved = true;
  77. }, false);
  78. } else {
  79. var input = new spine.webgl.Input(canvas);
  80. input.addListener({
  81. down: function(x, y) {
  82. renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.clientWidth, canvas.clientHeight);
  83. if (temp.set(handle.x, handle.y, 0).distance(coords) < canvas.width * HANDLE_SIZE) {
  84. dragging = true;
  85. }
  86. },
  87. up: function(x, y) {
  88. dragging = false;
  89. },
  90. dragged: function(x, y) {
  91. if (dragging && x > 0 && x < canvas.width && y > 0 && y < canvas.height) {
  92. renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.clientWidth, canvas.clientHeight);
  93. handle.x = coords.x;
  94. handle.y = coords.y;
  95. calculateBlend(x, y, false);
  96. }
  97. }
  98. });
  99. }
  100. }
  101. function render () {
  102. if (!isMobileDevice() && mouseMoved) calculateBlend(clientMouseX, clientMouseY, true);
  103. timeKeeper.update();
  104. var delta = timeKeeper.delta;
  105. state.update(delta);
  106. state.apply(skeleton);
  107. skeleton.updateWorldTransform();
  108. renderer.camera.viewportWidth = bounds.x * 1.4;
  109. renderer.camera.viewportHeight = bounds.y * 1.4;
  110. renderer.resize(spine.webgl.ResizeMode.Fit);
  111. gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
  112. gl.clear(gl.COLOR_BUFFER_BIT);
  113. renderer.begin();
  114. renderer.drawSkeleton(skeleton, true);
  115. if (isMobileDevice()) {
  116. gl.lineWidth(2);
  117. renderer.circle(true, handle.x, handle.y, canvas.width * HANDLE_SIZE, COLOR_INNER);
  118. renderer.circle(false, handle.x, handle.y, canvas.width * HANDLE_SIZE, COLOR_OUTER);
  119. gl.lineWidth(1);
  120. }
  121. renderer.end();
  122. }
  123. init();
  124. additiveBlendingDemo.assetManager = assetManager;
  125. additiveBlendingDemo.loadingComplete = loadingComplete;
  126. additiveBlendingDemo.render = render;
  127. };