|
@@ -1,11 +1,20 @@
|
|
-var ikConstraintDemo = function(pathPrefix, loadingComplete) {
|
|
|
|
|
|
+var ikConstraintDemo = function(pathPrefix, loadingComplete, bgColor) {
|
|
|
|
+ var COLOR_INNER = new spine.Color(0.8, 0, 0, 0.5);
|
|
|
|
+ var COLOR_OUTER = new spine.Color(0.8, 0, 0, 0.8);
|
|
|
|
+ var COLOR_INNER_SELECTED = new spine.Color(0.0, 0, 0.8, 0.5);
|
|
|
|
+ var COLOR_OUTER_SELECTED = new spine.Color(0.0, 0, 0.8, 0.8);
|
|
|
|
+
|
|
var canvas, gl, renderer, input, assetManager;
|
|
var canvas, gl, renderer, input, assetManager;
|
|
var skeleton, bounds;
|
|
var skeleton, bounds;
|
|
- var lastFrameTime = Date.now() / 1000;
|
|
|
|
- var target = null;
|
|
|
|
- var isHover = false;
|
|
|
|
- var boneName = "hip";
|
|
|
|
- var coords = new spine.webgl.Vector3(), temp = new spine.webgl.Vector3(), temp2 = new spine.Vector2();
|
|
|
|
|
|
+ var timeKeeper, loadingScreen;
|
|
|
|
+ var target = null;
|
|
|
|
+ var hoverTargets = [];
|
|
|
|
+ var controlBones = ["hoverboard controller", "hip", "board target"];
|
|
|
|
+ var coords = new spine.webgl.Vector3(), temp = new spine.webgl.Vector3(), temp2 = new spine.Vector2(), temp3 = new spine.webgl.Vector3();
|
|
|
|
+ var kneePos = new spine.Vector2();
|
|
|
|
+ var playButton, timeLine, spacing, isPlaying = true, playTime = 0;
|
|
|
|
+
|
|
|
|
+ if (!bgColor) bgColor = new spine.Color(1, 1, 1, 1);
|
|
|
|
|
|
function init () {
|
|
function init () {
|
|
|
|
|
|
@@ -17,43 +26,68 @@ var ikConstraintDemo = function(pathPrefix, loadingComplete) {
|
|
assetManager = new spine.webgl.AssetManager(gl, pathPrefix);
|
|
assetManager = new spine.webgl.AssetManager(gl, pathPrefix);
|
|
input = new spine.webgl.Input(canvas);
|
|
input = new spine.webgl.Input(canvas);
|
|
assetManager.loadTexture("spineboy.png");
|
|
assetManager.loadTexture("spineboy.png");
|
|
- assetManager.loadText("spineboy-mesh.json");
|
|
|
|
|
|
+ assetManager.loadText("spineboy-hover.json");
|
|
assetManager.loadText("spineboy.atlas");
|
|
assetManager.loadText("spineboy.atlas");
|
|
|
|
+ timeKeeper = new spine.TimeKeeper();
|
|
|
|
+ loadingScreen = new spine.webgl.LoadingScreen(renderer);
|
|
|
|
+ loadingScreen.backgroundColor = bgColor;
|
|
requestAnimationFrame(load);
|
|
requestAnimationFrame(load);
|
|
}
|
|
}
|
|
|
|
|
|
function load () {
|
|
function load () {
|
|
|
|
+ timeKeeper.update();
|
|
if (assetManager.isLoadingComplete()) {
|
|
if (assetManager.isLoadingComplete()) {
|
|
var atlas = new spine.TextureAtlas(assetManager.get("spineboy.atlas"), function(path) {
|
|
var atlas = new spine.TextureAtlas(assetManager.get("spineboy.atlas"), function(path) {
|
|
return assetManager.get(path);
|
|
return assetManager.get(path);
|
|
});
|
|
});
|
|
var atlasLoader = new spine.TextureAtlasAttachmentLoader(atlas);
|
|
var atlasLoader = new spine.TextureAtlasAttachmentLoader(atlas);
|
|
var skeletonJson = new spine.SkeletonJson(atlasLoader);
|
|
var skeletonJson = new spine.SkeletonJson(atlasLoader);
|
|
- var skeletonData = skeletonJson.readSkeletonData(assetManager.get("spineboy-mesh.json"));
|
|
|
|
|
|
+ var skeletonData = skeletonJson.readSkeletonData(assetManager.get("spineboy-hover.json"));
|
|
skeleton = new spine.Skeleton(skeletonData);
|
|
skeleton = new spine.Skeleton(skeletonData);
|
|
skeleton.setToSetupPose();
|
|
skeleton.setToSetupPose();
|
|
skeleton.updateWorldTransform();
|
|
skeleton.updateWorldTransform();
|
|
var offset = new spine.Vector2();
|
|
var offset = new spine.Vector2();
|
|
bounds = new spine.Vector2();
|
|
bounds = new spine.Vector2();
|
|
skeleton.getBounds(offset, bounds);
|
|
skeleton.getBounds(offset, bounds);
|
|
|
|
+ for (var i = 0; i < controlBones.length; i++) hoverTargets.push(null);
|
|
|
|
|
|
renderer.camera.position.x = offset.x + bounds.x / 2;
|
|
renderer.camera.position.x = offset.x + bounds.x / 2;
|
|
renderer.camera.position.y = offset.y + bounds.y / 2;
|
|
renderer.camera.position.y = offset.y + bounds.y / 2;
|
|
|
|
|
|
|
|
+ renderer.skeletonDebugRenderer.drawMeshHull = false;
|
|
|
|
+ renderer.skeletonDebugRenderer.drawMeshTriangles = false;
|
|
|
|
+
|
|
|
|
+ setupUI();
|
|
setupInput();
|
|
setupInput();
|
|
|
|
|
|
loadingComplete(canvas, render);
|
|
loadingComplete(canvas, render);
|
|
- } else requestAnimationFrame(load);
|
|
|
|
|
|
+ } else {
|
|
|
|
+ loadingScreen.draw();
|
|
|
|
+ requestAnimationFrame(load);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function setupUI() {
|
|
|
|
+ var checkbox = $("#ikdemo-drawbones");
|
|
|
|
+ renderer.skeletonDebugRenderer.drawRegionAttachments = false;
|
|
|
|
+ renderer.skeletonDebugRenderer.drawPaths = false;
|
|
|
|
+ renderer.skeletonDebugRenderer.drawBones = false;
|
|
|
|
+ checkbox.change(function() {
|
|
|
|
+ renderer.skeletonDebugRenderer.drawPaths = this.checked;
|
|
|
|
+ renderer.skeletonDebugRenderer.drawBones = this.checked;
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
- function setupInput() {
|
|
|
|
|
|
+ function setupInput (){
|
|
input.addListener({
|
|
input.addListener({
|
|
- down: function(x, y) {
|
|
|
|
- var bone = skeleton.findBone(boneName);
|
|
|
|
- renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.width, canvas.height);
|
|
|
|
- if (temp.set(skeleton.x + bone.worldX, skeleton.y + bone.worldY, 0).distance(coords) < 20) {
|
|
|
|
- target = bone;
|
|
|
|
- }
|
|
|
|
|
|
+ down: function(x, y) {
|
|
|
|
+ for (var i = 0; i < controlBones.length; i++) {
|
|
|
|
+ var bone = skeleton.findBone(controlBones[i]);
|
|
|
|
+ renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.width, canvas.height);
|
|
|
|
+ if (temp.set(skeleton.x + bone.worldX, skeleton.y + bone.worldY, 0).distance(coords) < 20) {
|
|
|
|
+ target = bone;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
},
|
|
},
|
|
up: function(x, y) {
|
|
up: function(x, y) {
|
|
target = null;
|
|
target = null;
|
|
@@ -72,40 +106,46 @@ var ikConstraintDemo = function(pathPrefix, loadingComplete) {
|
|
}
|
|
}
|
|
},
|
|
},
|
|
moved: function (x, y) {
|
|
moved: function (x, y) {
|
|
- var bone = skeleton.findBone(boneName);
|
|
|
|
- renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.width, canvas.height);
|
|
|
|
- isHover = temp.set(skeleton.x + bone.worldX, skeleton.y + bone.worldY, 0).distance(coords) < 20;
|
|
|
|
|
|
+ for (var i = 0; i < controlBones.length; i++) {
|
|
|
|
+ var bone = skeleton.findBone(controlBones[i]);
|
|
|
|
+ renderer.camera.screenToWorld(coords.set(x, y, 0), canvas.width, canvas.height);
|
|
|
|
+ if (temp.set(skeleton.x + bone.worldX, skeleton.y + bone.worldY, 0).distance(coords) < 20) {
|
|
|
|
+ hoverTargets[i] = bone;
|
|
|
|
+ } else {
|
|
|
|
+ hoverTargets[i] = null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
function render () {
|
|
function render () {
|
|
- var now = Date.now() / 1000;
|
|
|
|
- var delta = now - lastFrameTime;
|
|
|
|
- lastFrameTime = now;
|
|
|
|
- if (delta > 0.032) delta = 0.032;
|
|
|
|
|
|
+ timeKeeper.update();
|
|
|
|
+ var delta = timeKeeper.delta;
|
|
|
|
+
|
|
|
|
+ skeleton.updateWorldTransform();
|
|
|
|
|
|
renderer.camera.viewportWidth = bounds.x * 1.2;
|
|
renderer.camera.viewportWidth = bounds.x * 1.2;
|
|
renderer.camera.viewportHeight = bounds.y * 1.2;
|
|
renderer.camera.viewportHeight = bounds.y * 1.2;
|
|
renderer.resize(spine.webgl.ResizeMode.Fit);
|
|
renderer.resize(spine.webgl.ResizeMode.Fit);
|
|
|
|
|
|
- gl.clearColor(0.2, 0.2, 0.2, 1);
|
|
|
|
- gl.clear(gl.COLOR_BUFFER_BIT);
|
|
|
|
-
|
|
|
|
- skeleton.updateWorldTransform();
|
|
|
|
|
|
+ gl.clearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
|
|
|
|
+ gl.clear(gl.COLOR_BUFFER_BIT);
|
|
|
|
|
|
renderer.begin();
|
|
renderer.begin();
|
|
renderer.drawSkeleton(skeleton, true);
|
|
renderer.drawSkeleton(skeleton, true);
|
|
- var bone = skeleton.findBone(boneName);
|
|
|
|
-
|
|
|
|
- var colorInner = isHover ? spineDemos.HOVER_COLOR_INNER : spineDemos.NON_HOVER_COLOR_INNER;
|
|
|
|
- var colorOuter = isHover ? spineDemos.HOVER_COLOR_OUTER : spineDemos.NON_HOVER_COLOR_OUTER;
|
|
|
|
-
|
|
|
|
- renderer.circle(true, skeleton.x + bone.worldX, skeleton.y + bone.worldY, 20, colorInner);
|
|
|
|
|
|
+ renderer.drawSkeletonDebug(skeleton, false, ["root"]);
|
|
gl.lineWidth(2);
|
|
gl.lineWidth(2);
|
|
- renderer.circle(false, skeleton.x + bone.worldX, skeleton.y + bone.worldY, 20, colorOuter);
|
|
|
|
|
|
+ for (var i = 0; i < controlBones.length; i++) {
|
|
|
|
+ var bone = skeleton.findBone(controlBones[i]);
|
|
|
|
+ var colorInner = hoverTargets[i] !== null ? spineDemos.HOVER_COLOR_INNER : spineDemos.NON_HOVER_COLOR_INNER;
|
|
|
|
+ var colorOuter = hoverTargets[i] !== null ? spineDemos.HOVER_COLOR_OUTER : spineDemos.NON_HOVER_COLOR_OUTER;
|
|
|
|
+ renderer.circle(true, skeleton.x + bone.worldX, skeleton.y + bone.worldY, 20, colorInner);
|
|
|
|
+ renderer.circle(false, skeleton.x + bone.worldX, skeleton.y + bone.worldY, 20, colorOuter);
|
|
|
|
+ }
|
|
renderer.end();
|
|
renderer.end();
|
|
gl.lineWidth(1);
|
|
gl.lineWidth(1);
|
|
}
|
|
}
|
|
|
|
+
|
|
init();
|
|
init();
|
|
};
|
|
};
|