transformconstraint.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. var transformConstraintDemo = function(pathPrefix, loadingComplete) {
  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 canvas, gl, renderer, input, assetManager;
  7. var skeleton, state, bounds;
  8. var lastFrameTime = Date.now() / 1000;
  9. var target = null;
  10. var wheel1;
  11. var coords = new spine.webgl.Vector3(), temp = new spine.webgl.Vector3(), temp2 = new spine.Vector2();
  12. var lastRotation = 0;
  13. var rotationOffset, mix, lastOffset = 0;
  14. function init () {
  15. canvas = document.getElementById("transformdemo-canvas");
  16. canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight;
  17. gl = canvas.getContext("webgl", { alpha: false }) || canvas.getContext("experimental-webgl", { alpha: false });
  18. renderer = new spine.webgl.SceneRenderer(canvas, gl);
  19. assetManager = new spine.webgl.AssetManager(gl, pathPrefix);
  20. input = new spine.webgl.Input(canvas);
  21. var getRotation = function(x, y) {
  22. renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.width, canvas.height);
  23. var v = coords.sub(new spine.webgl.Vector3(wheel1.worldX, wheel1.worldY, 0)).normalize();
  24. var angle = Math.acos(v.x) * spine.MathUtils.radiansToDegrees;
  25. if (v.y < 0) angle = 360 - angle;
  26. return angle;
  27. }
  28. input.addListener({
  29. down: function(x, y) {
  30. lastRotation = getRotation(x, y);
  31. },
  32. up: function(x, y) { },
  33. dragged: function(x, y) {
  34. var rotation = getRotation(x, y);
  35. var delta = rotation - lastRotation;
  36. wheel1.rotation += delta;
  37. lastRotation = rotation;
  38. },
  39. moved: function (x, y) { }
  40. })
  41. assetManager.loadTexture("tank.png");
  42. assetManager.loadText("transformConstraint.json");
  43. assetManager.loadText("tank.atlas");
  44. requestAnimationFrame(load);
  45. }
  46. function load () {
  47. if (assetManager.isLoadingComplete()) {
  48. var atlas = new spine.TextureAtlas(assetManager.get("tank.atlas"), function(path) {
  49. return assetManager.get(path);
  50. });
  51. var atlasLoader = new spine.TextureAtlasAttachmentLoader(atlas);
  52. var skeletonJson = new spine.SkeletonJson(atlasLoader);
  53. var skeletonData = skeletonJson.readSkeletonData(assetManager.get("transformConstraint.json"));
  54. skeleton = new spine.Skeleton(skeletonData);
  55. skeleton.setToSetupPose();
  56. skeleton.updateWorldTransform();
  57. var offset = new spine.Vector2();
  58. bounds = new spine.Vector2();
  59. skeleton.getBounds(offset, bounds);
  60. state = new spine.AnimationState(new spine.AnimationStateData(skeleton.data));
  61. skeleton.setToSetupPose();
  62. skeleton.updateWorldTransform();
  63. wheel1 = skeleton.findBone("wheel1");
  64. renderer.camera.position.x = offset.x + bounds.x / 2;
  65. renderer.camera.position.y = offset.y + bounds.y / 2;
  66. renderer.skeletonDebugRenderer.drawRegionAttachments = false;
  67. renderer.skeletonDebugRenderer.drawMeshHull = false;
  68. renderer.skeletonDebugRenderer.drawMeshTriangles = false;
  69. setupUI();
  70. loadingComplete(canvas, render);
  71. } else requestAnimationFrame(load);
  72. }
  73. function setupUI() {
  74. rotationOffset = $("#transformdemo-rotationoffset");
  75. rotationOffset.slider({ range: "max", min: -180, max: 180, value: 0, slide: function () {
  76. var val = rotationOffset.slider("value");
  77. var delta = val - lastOffset;
  78. lastOffset = val;
  79. skeleton.findTransformConstraint("wheel2").data.offsetRotation += delta;
  80. skeleton.findTransformConstraint("wheel3").data.offsetRotation += delta;
  81. $("#transformdemo-rotationoffset-label").text(val + "°");
  82. }});
  83. }
  84. function render () {
  85. var now = Date.now() / 1000;
  86. var delta = now - lastFrameTime;
  87. lastFrameTime = now;
  88. if (delta > 0.032) delta = 0.032;
  89. skeleton.updateWorldTransform();
  90. renderer.camera.viewportWidth = bounds.x * 1.2;
  91. renderer.camera.viewportHeight = bounds.y * 1.2;
  92. renderer.resize(spine.webgl.ResizeMode.Fit);
  93. gl.clearColor(0.2, 0.2, 0.2, 1);
  94. gl.clear(gl.COLOR_BUFFER_BIT);
  95. renderer.begin();
  96. renderer.drawSkeleton(skeleton, true);
  97. renderer.drawSkeletonDebug(skeleton, false, ["root"]);
  98. var bone = wheel1;
  99. var colorInner = bone === target ? COLOR_INNER_SELECTED : COLOR_INNER;
  100. var colorOuter = bone === target ? COLOR_OUTER_SELECTED : COLOR_OUTER;
  101. renderer.circle(false, skeleton.x + bone.worldX, skeleton.y + bone.worldY, 20, colorOuter);
  102. renderer.end();
  103. }
  104. init();
  105. };