Merged with master, resolved conflicts

This commit is contained in:
badlogic 2017-03-02 13:04:44 +01:00
commit 1ad8e6b63c
16 changed files with 191 additions and 2555 deletions

View File

@ -719,7 +719,7 @@ public class SkeletonJson {
} }
static private function toColor (hexString:String, colorIndex:int) : Number { static private function toColor (hexString:String, colorIndex:int) : Number {
if (hexString.length != 8) throw new ArgumentError("Color hexidecimal length must be 8, recieved: " + hexString); if (hexString.length != 8) throw new ArgumentError("Color hexidecimal length must be 8, received: " + hexString);
return parseInt(hexString.substring(colorIndex * 2, colorIndex * 2 + 2), 16) / 255; return parseInt(hexString.substring(colorIndex * 2, colorIndex * 2 + 2), 16) / 255;
} }

View File

@ -262,7 +262,7 @@ namespace Spine {
a = -a; a = -a;
b = -b; b = -b;
} }
if (skeleton.flipY) { if (skeleton.flipY != Bone.yDown) {
c = -c; c = -c;
d = -d; d = -d;
} }

View File

@ -22,9 +22,9 @@ spine-ts works with data exported from Spine 3.6.xx
spine-ts WebGL & Widget backends supports all Spine features. spine-ts WebGL & Widget backends supports all Spine features.
The spine-ts Canvas backend does not support color tinting, mesh attachments or shearing. Mesh attachments are supported by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers. spine-ts Canvas does not support color tinting and mesh attachments. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
The spine-ts THREE.JS backend does not support color tinting and blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings. spine-ts THREE.JS does not support color tinting and blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
spine-ts does not yet support loading the binary format. spine-ts does not yet support loading the binary format.

View File

@ -228,45 +228,48 @@ var spine;
var drawOrder = skeleton.drawOrder; var drawOrder = skeleton.drawOrder;
if (this.debugRendering) if (this.debugRendering)
ctx.strokeStyle = "green"; ctx.strokeStyle = "green";
ctx.save();
for (var i = 0, n = drawOrder.length; i < n; i++) { for (var i = 0, n = drawOrder.length; i < n; i++) {
var slot = drawOrder[i]; var slot = drawOrder[i];
var attachment = slot.getAttachment(); var attachment = slot.getAttachment();
var regionAttachment = null;
var region = null; var region = null;
var image = null; var image = null;
var vertices = this.vertices;
if (attachment instanceof spine.RegionAttachment) { if (attachment instanceof spine.RegionAttachment) {
var regionAttachment = attachment; regionAttachment = attachment;
vertices = this.computeRegionVertices(slot, regionAttachment, false);
region = regionAttachment.region; region = regionAttachment.region;
image = (region).texture.getImage(); image = region.texture.getImage();
} }
else else
continue; continue;
var skeleton_1 = slot.bone.skeleton;
var skeletonColor = skeleton_1.color;
var slotColor = slot.color;
var regionColor = regionAttachment.color;
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
var color = this.tempColor;
color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, alpha);
var att = attachment; var att = attachment;
var bone = slot.bone; var bone = slot.bone;
var x = vertices[0]; var w = region.width;
var y = vertices[1]; var h = region.height;
var rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180; ctx.save();
var xx = vertices[24] - vertices[0]; ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
var xy = vertices[25] - vertices[1]; ctx.translate(attachment.offset[0], attachment.offset[1]);
var yx = vertices[8] - vertices[0]; ctx.rotate(attachment.rotation * Math.PI / 180);
var yy = vertices[9] - vertices[1]; ctx.scale(attachment.scaleX, attachment.scaleY);
var w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy); ctx.translate(w / 2, h / 2);
ctx.translate(x, y); ctx.scale(1, -1);
ctx.rotate(rotation); ctx.translate(-w / 2, -h / 2);
if (region.rotate) { if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
ctx.rotate(Math.PI / 2); ctx.globalAlpha = color.a;
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w);
ctx.rotate(-Math.PI / 2);
}
else {
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h);
} }
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
if (this.debugRendering) if (this.debugRendering)
ctx.strokeRect(0, 0, w, h); ctx.strokeRect(0, 0, w, h);
ctx.rotate(-rotation); ctx.restore();
ctx.translate(-x, -y);
} }
ctx.restore();
}; };
SkeletonRenderer.prototype.drawTriangles = function (skeleton) { SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
var blendMode = null; var blendMode = null;

File diff suppressed because one or more lines are too long

View File

@ -228,45 +228,48 @@ var spine;
var drawOrder = skeleton.drawOrder; var drawOrder = skeleton.drawOrder;
if (this.debugRendering) if (this.debugRendering)
ctx.strokeStyle = "green"; ctx.strokeStyle = "green";
ctx.save();
for (var i = 0, n = drawOrder.length; i < n; i++) { for (var i = 0, n = drawOrder.length; i < n; i++) {
var slot = drawOrder[i]; var slot = drawOrder[i];
var attachment = slot.getAttachment(); var attachment = slot.getAttachment();
var regionAttachment = null;
var region = null; var region = null;
var image = null; var image = null;
var vertices = this.vertices;
if (attachment instanceof spine.RegionAttachment) { if (attachment instanceof spine.RegionAttachment) {
var regionAttachment = attachment; regionAttachment = attachment;
vertices = this.computeRegionVertices(slot, regionAttachment, false);
region = regionAttachment.region; region = regionAttachment.region;
image = (region).texture.getImage(); image = region.texture.getImage();
} }
else else
continue; continue;
var skeleton_1 = slot.bone.skeleton;
var skeletonColor = skeleton_1.color;
var slotColor = slot.color;
var regionColor = regionAttachment.color;
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
var color = this.tempColor;
color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, alpha);
var att = attachment; var att = attachment;
var bone = slot.bone; var bone = slot.bone;
var x = vertices[0]; var w = region.width;
var y = vertices[1]; var h = region.height;
var rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180; ctx.save();
var xx = vertices[24] - vertices[0]; ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
var xy = vertices[25] - vertices[1]; ctx.translate(attachment.offset[0], attachment.offset[1]);
var yx = vertices[8] - vertices[0]; ctx.rotate(attachment.rotation * Math.PI / 180);
var yy = vertices[9] - vertices[1]; ctx.scale(attachment.scaleX, attachment.scaleY);
var w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy); ctx.translate(w / 2, h / 2);
ctx.translate(x, y); ctx.scale(1, -1);
ctx.rotate(rotation); ctx.translate(-w / 2, -h / 2);
if (region.rotate) { if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
ctx.rotate(Math.PI / 2); ctx.globalAlpha = color.a;
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w);
ctx.rotate(-Math.PI / 2);
}
else {
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h);
} }
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
if (this.debugRendering) if (this.debugRendering)
ctx.strokeRect(0, 0, w, h); ctx.strokeRect(0, 0, w, h);
ctx.rotate(-rotation); ctx.restore();
ctx.translate(-x, -y);
} }
ctx.restore();
}; };
SkeletonRenderer.prototype.drawTriangles = function (skeleton) { SkeletonRenderer.prototype.drawTriangles = function (skeleton) {
var blendMode = null; var blendMode = null;

File diff suppressed because one or more lines are too long

View File

@ -5,141 +5,120 @@ format: RGBA8888
filter: Linear,Linear filter: Linear,Linear
repeat: none repeat: none
eye_indifferent eye_indifferent
rotate: true rotate: false
xy: 648, 629 xy: 275, 349
size: 93, 89 size: 93, 89
orig: 93, 89 orig: 93, 89
offset: 0, 0 offset: 0, 0
index: -1 index: -1
eye_surprised eye_surprised
rotate: true rotate: false
xy: 233, 179 xy: 214, 125
size: 93, 89 size: 93, 89
orig: 93, 89 orig: 93, 89
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_bracer front_bracer
rotate: false rotate: false
xy: 245, 2 xy: 678, 774
size: 58, 80 size: 58, 80
orig: 58, 80 orig: 58, 80
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_fist_closed front_fist_closed
rotate: false rotate: false
xy: 168, 45 xy: 944, 940
size: 75, 82 size: 75, 82
orig: 75, 82 orig: 75, 82
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_fist_open front_fist_open
rotate: false rotate: false
xy: 844, 646 xy: 132, 28
size: 86, 87 size: 86, 87
orig: 86, 87 orig: 86, 87
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_foot front_foot
rotate: true rotate: false
xy: 310, 326 xy: 550, 785
size: 126, 69 size: 126, 69
orig: 126, 69 orig: 126, 69
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_foot_bend1 front_foot_bend1
rotate: true rotate: false
xy: 951, 894 xy: 2, 45
size: 128, 70 size: 128, 70
orig: 128, 70 orig: 128, 70
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_foot_bend2 front_foot_bend2
rotate: false rotate: false
xy: 2, 33 xy: 729, 929
size: 108, 93 size: 108, 93
orig: 108, 93 orig: 108, 93
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_shin front_shin
rotate: true rotate: false
xy: 739, 735 xy: 466, 670
size: 82, 184 size: 82, 184
orig: 82, 184 orig: 82, 184
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_thigh front_thigh
rotate: false rotate: false
xy: 381, 340 xy: 281, 235
size: 48, 112 size: 48, 112
orig: 48, 112 orig: 48, 112
offset: 0, 0 offset: 0, 0
index: -1 index: -1
front_upper_arm front_upper_arm
rotate: false rotate: false
xy: 112, 29 xy: 220, 26
size: 54, 97 size: 54, 97
orig: 54, 97 orig: 54, 97
offset: 0, 0 offset: 0, 0
index: -1 index: -1
goggles goggles
rotate: false rotate: false
xy: 156, 454 xy: 466, 856
size: 261, 166 size: 261, 166
orig: 261, 166 orig: 261, 166
offset: 0, 0 offset: 0, 0
index: -1 index: -1
gun gun
rotate: false rotate: false
xy: 739, 819 xy: 2, 117
size: 210, 203 size: 210, 203
orig: 210, 203 orig: 210, 203
offset: 0, 0 offset: 0, 0
index: -1 index: -1
head head
rotate: false rotate: false
xy: 466, 724 xy: 2, 322
size: 271, 298 size: 271, 298
orig: 271, 298 orig: 271, 298
offset: 0, 0 offset: 0, 0
index: -1 index: -1
hoverboard_board
rotate: true
xy: 2, 128
size: 492, 152
orig: 492, 152
offset: 0, 0
index: -1
hoverboard_thruster
rotate: false
xy: 602, 558
size: 60, 64
orig: 60, 64
offset: 0, 0
index: -1
hoverglow_small
rotate: true
xy: 156, 178
size: 274, 75
orig: 274, 75
offset: 0, 0
index: -1
mouth_grind mouth_grind
rotate: true rotate: false
xy: 951, 799 xy: 844, 878
size: 93, 59 size: 93, 59
orig: 93, 59 orig: 93, 59
offset: 0, 0 offset: 0, 0
index: -1 index: -1
mouth_oooo mouth_oooo
rotate: true rotate: false
xy: 245, 84 xy: 550, 656
size: 93, 59 size: 93, 59
orig: 93, 59 orig: 93, 59
offset: 0, 0 offset: 0, 0
index: -1 index: -1
mouth_smile mouth_smile
rotate: false rotate: false
xy: 925, 738 xy: 738, 806
size: 93, 59 size: 93, 59
orig: 93, 59 orig: 93, 59
offset: 0, 0 offset: 0, 0
@ -153,63 +132,63 @@ muzzle
index: -1 index: -1
neck neck
rotate: false rotate: false
xy: 168, 2 xy: 2, 2
size: 36, 41 size: 36, 41
orig: 36, 41 orig: 36, 41
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_bracer rear_bracer
rotate: false rotate: false
xy: 932, 664 xy: 276, 51
size: 56, 72 size: 56, 72
orig: 56, 72 orig: 56, 72
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_foot rear_foot
rotate: false rotate: false
xy: 487, 562 xy: 729, 867
size: 113, 60 size: 113, 60
orig: 113, 60 orig: 113, 60
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_foot_bend1 rear_foot_bend1
rotate: true rotate: false
xy: 419, 503 xy: 550, 717
size: 117, 66 size: 117, 66
orig: 117, 66 orig: 117, 66
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_foot_bend2 rear_foot_bend2
rotate: false rotate: false
xy: 739, 650 xy: 839, 939
size: 103, 83 size: 103, 83
orig: 103, 83 orig: 103, 83
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_shin rear_shin
rotate: false rotate: false
xy: 233, 274 xy: 375, 442
size: 75, 178 size: 75, 178
orig: 75, 178 orig: 75, 178
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_thigh rear_thigh
rotate: true rotate: false
xy: 487, 495 xy: 214, 216
size: 65, 104 size: 65, 104
orig: 65, 104 orig: 65, 104
offset: 0, 0 offset: 0, 0
index: -1 index: -1
rear_upper_arm rear_upper_arm
rotate: true rotate: false
xy: 156, 129 xy: 331, 260
size: 47, 87 size: 47, 87
orig: 47, 87 orig: 47, 87
offset: 0, 0 offset: 0, 0
index: -1 index: -1
torso torso
rotate: true rotate: false
xy: 466, 624 xy: 275, 440
size: 98, 180 size: 98, 180
orig: 98, 180 orig: 98, 180
offset: 0, 0 offset: 0, 0

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 KiB

After

Width:  |  Height:  |  Size: 595 KiB

View File

@ -17,6 +17,9 @@ var assetManager;
var skeleton, state, bounds; var skeleton, state, bounds;
var skeletonRenderer; var skeletonRenderer;
var skelName = "spineboy";
var animName = "test";
function init () { function init () {
canvas = document.getElementById("canvas"); canvas = document.getElementById("canvas");
canvas.width = window.innerWidth; canvas.width = window.innerWidth;
@ -31,16 +34,16 @@ function init () {
assetManager = new spine.canvas.AssetManager(); assetManager = new spine.canvas.AssetManager();
assetManager.loadText("assets/spineboy.json"); assetManager.loadText("assets/" + skelName + ".json");
assetManager.loadText("assets/spineboy.atlas"); assetManager.loadText("assets/" + skelName + ".atlas");
assetManager.loadTexture("assets/spineboy.png"); assetManager.loadTexture("assets/" + skelName + ".png");
requestAnimationFrame(load); requestAnimationFrame(load);
} }
function load () { function load () {
if (assetManager.isLoadingComplete()) { if (assetManager.isLoadingComplete()) {
var data = loadSkeleton("spineboy", "walk", "default"); var data = loadSkeleton(skelName, animName, "default");
skeleton = data.skeleton; skeleton = data.skeleton;
state = data.state; state = data.state;
bounds = data.bounds; bounds = data.bounds;
@ -122,6 +125,14 @@ function render () {
skeleton.updateWorldTransform(); skeleton.updateWorldTransform();
skeletonRenderer.draw(skeleton); skeletonRenderer.draw(skeleton);
context.strokeStyle = "green";
context.beginPath();
context.moveTo(-1000, 0);
context.lineTo(1000, 0);
context.moveTo(0, -1000);
context.lineTo(0, 1000);
context.stroke();
requestAnimationFrame(render); requestAnimationFrame(render);
} }

View File

@ -55,43 +55,56 @@ module spine.canvas {
if (this.debugRendering) ctx.strokeStyle = "green"; if (this.debugRendering) ctx.strokeStyle = "green";
ctx.save();
for (let i = 0, n = drawOrder.length; i < n; i++) { for (let i = 0, n = drawOrder.length; i < n; i++) {
let slot = drawOrder[i]; let slot = drawOrder[i];
let attachment = slot.getAttachment(); let attachment = slot.getAttachment();
let regionAttachment: RegionAttachment = null;
let region: TextureAtlasRegion = null; let region: TextureAtlasRegion = null;
let image: HTMLImageElement = null; let image: HTMLImageElement = null;
let vertices: ArrayLike<number> = this.vertices;
if (attachment instanceof RegionAttachment) {
let regionAttachment = <RegionAttachment>attachment;
vertices = this.computeRegionVertices(slot, regionAttachment, false);
region = <TextureAtlasRegion>regionAttachment.region;
image = (<CanvasTexture>(region).texture).getImage();
if (attachment instanceof RegionAttachment) {
regionAttachment = <RegionAttachment>attachment;
region = <TextureAtlasRegion>regionAttachment.region;
image = (<CanvasTexture>region.texture).getImage();
} else continue; } else continue;
let skeleton = slot.bone.skeleton;
let skeletonColor = skeleton.color;
let slotColor = slot.color;
let regionColor = regionAttachment.color;
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
let color = this.tempColor;
color.set(skeletonColor.r * slotColor.r * regionColor.r,
skeletonColor.g * slotColor.g * regionColor.g,
skeletonColor.b * slotColor.b * regionColor.b,
alpha);
let att = <RegionAttachment>attachment; let att = <RegionAttachment>attachment;
let bone = slot.bone; let bone = slot.bone;
let x = vertices[0]; let w = region.width;
let y = vertices[1]; let h = region.height;
let rotation = (bone.getWorldRotationX() - att.rotation) * Math.PI / 180; ctx.save();
let xx = vertices[24] - vertices[0]; ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
let xy = vertices[25] - vertices[1]; ctx.translate(attachment.offset[0], attachment.offset[1]);
let yx = vertices[8] - vertices[0]; ctx.rotate(attachment.rotation * Math.PI / 180);
let yy = vertices[9] - vertices[1]; ctx.scale(attachment.scaleX, attachment.scaleY);
let w = Math.sqrt(xx * xx + xy * xy), h = -Math.sqrt(yx * yx + yy * yy); ctx.translate(w / 2, h / 2);
ctx.translate(x, y); ctx.scale(1, -1);
ctx.rotate(rotation); ctx.translate(-w / 2, -h / 2);
if (region.rotate) { if (color.r != 1 || color.g != 1 || color.b != 1 || color.a != 1) {
ctx.rotate(Math.PI / 2); ctx.globalAlpha = color.a;
ctx.drawImage(image, region.x, region.y, region.height, region.width, 0, 0, h, -w); // experimental tinting via compositing, doesn't work
ctx.rotate(-Math.PI / 2); // ctx.globalCompositeOperation = "source-atop";
} else { // ctx.fillStyle = "rgba(" + (color.r * 255 | 0) + ", " + (color.g * 255 | 0) + ", " + (color.b * 255 | 0) + ", " + color.a + ")";
ctx.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, w, h); // ctx.fillRect(0, 0, w, h);
} }
ctx.drawImage(image, region.x, region.y, w, h, 0, 0, w, h);
if (this.debugRendering) ctx.strokeRect(0, 0, w, h); if (this.debugRendering) ctx.strokeRect(0, 0, w, h);
ctx.rotate(-rotation); ctx.restore();
ctx.translate(-x, -y);
} }
ctx.restore();
} }
private drawTriangles (skeleton: Skeleton) { private drawTriangles (skeleton: Skeleton) {

View File

@ -28,6 +28,8 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
#define SPINE_OPTIONAL_MATERIALOVERRIDE
// Contributed by: Lost Polygon // Contributed by: Lost Polygon
using System; using System;
@ -136,7 +138,9 @@ namespace Spine.Unity.Editor {
if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Clear and Reapply Changes", "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) { if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Clear and Reapply Changes", "Removes all non-serialized overrides in the SkeletonRenderer and reapplies the overrides on this component."))) {
if (skeletonRenderer != null) { if (skeletonRenderer != null) {
#if SPINE_OPTIONAL_MATERIALOVERRIDE
skeletonRenderer.CustomMaterialOverride.Clear(); skeletonRenderer.CustomMaterialOverride.Clear();
#endif
skeletonRenderer.CustomSlotMaterials.Clear(); skeletonRenderer.CustomSlotMaterials.Clear();
RemoveCustomMaterials(); RemoveCustomMaterials();
SetCustomMaterials(); SetCustomMaterials();

View File

@ -28,6 +28,8 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
#define SPINE_OPTIONAL_MATERIALOVERRIDE
// Contributed by: Lost Polygon // Contributed by: Lost Polygon
using System; using System;
@ -40,8 +42,8 @@ namespace Spine.Unity.Modules {
#region Inspector #region Inspector
public SkeletonRenderer skeletonRenderer; public SkeletonRenderer skeletonRenderer;
[SerializeField] List<SlotMaterialOverride> customSlotMaterials = new List<SlotMaterialOverride>(); [SerializeField] protected List<SlotMaterialOverride> customSlotMaterials = new List<SlotMaterialOverride>();
[SerializeField] List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>(); [SerializeField] protected List<AtlasMaterialOverride> customMaterialOverrides = new List<AtlasMaterialOverride>();
#if UNITY_EDITOR #if UNITY_EDITOR
void Reset () { void Reset () {
@ -115,6 +117,7 @@ namespace Spine.Unity.Modules {
return; return;
} }
#if SPINE_OPTIONAL_MATERIALOVERRIDE
for (int i = 0; i < customMaterialOverrides.Count; i++) { for (int i = 0; i < customMaterialOverrides.Count; i++) {
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i]; AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
if (atlasMaterialOverride.overrideDisabled) if (atlasMaterialOverride.overrideDisabled)
@ -122,6 +125,7 @@ namespace Spine.Unity.Modules {
skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial; skeletonRenderer.CustomMaterialOverride[atlasMaterialOverride.originalMaterial] = atlasMaterialOverride.replacementMaterial;
} }
#endif
} }
void RemoveCustomMaterialOverrides () { void RemoveCustomMaterialOverrides () {
@ -130,18 +134,21 @@ namespace Spine.Unity.Modules {
return; return;
} }
#if SPINE_OPTIONAL_MATERIALOVERRIDE
for (int i = 0; i < customMaterialOverrides.Count; i++) { for (int i = 0; i < customMaterialOverrides.Count; i++) {
AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i]; AtlasMaterialOverride atlasMaterialOverride = customMaterialOverrides[i];
Material currentMaterial; Material currentMaterial;
if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial)) if (!skeletonRenderer.CustomMaterialOverride.TryGetValue(atlasMaterialOverride.originalMaterial, out currentMaterial))
continue; continue;
// Do not revert the material if it was changed by something else // Do not revert the material if it was changed by something else
if (currentMaterial != atlasMaterialOverride.replacementMaterial) if (currentMaterial != atlasMaterialOverride.replacementMaterial)
continue; continue;
skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial); skeletonRenderer.CustomMaterialOverride.Remove(atlasMaterialOverride.originalMaterial);
} }
#endif
} }
// OnEnable applies the overrides at runtime, and when the editor loads. // OnEnable applies the overrides at runtime, and when the editor loads.

View File

@ -28,6 +28,8 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
#define SPINE_OPTIONAL_RENDEROVERRIDE
using UnityEngine; using UnityEngine;
using System.Collections.Generic; using System.Collections.Generic;
using Spine.Unity; using Spine.Unity;
@ -45,8 +47,10 @@ namespace Spine.Unity.Modules {
public SkeletonRenderer SkeletonRenderer { public SkeletonRenderer SkeletonRenderer {
get { return skeletonRenderer; } get { return skeletonRenderer; }
set { set {
#if SPINE_OPTIONAL_RENDEROVERRIDE
if (skeletonRenderer != null) if (skeletonRenderer != null)
skeletonRenderer.GenerateMeshOverride -= HandleRender; skeletonRenderer.GenerateMeshOverride -= HandleRender;
#endif
skeletonRenderer = value; skeletonRenderer = value;
this.enabled = false; // Disable if nulled. this.enabled = false; // Disable if nulled.
@ -72,8 +76,11 @@ namespace Spine.Unity.Modules {
if (copiedBlock == null) copiedBlock = new MaterialPropertyBlock(); if (copiedBlock == null) copiedBlock = new MaterialPropertyBlock();
mainMeshRenderer = skeletonRenderer.GetComponent<MeshRenderer>(); mainMeshRenderer = skeletonRenderer.GetComponent<MeshRenderer>();
#if SPINE_OPTIONAL_RENDEROVERRIDE
skeletonRenderer.GenerateMeshOverride -= HandleRender; skeletonRenderer.GenerateMeshOverride -= HandleRender;
skeletonRenderer.GenerateMeshOverride += HandleRender; skeletonRenderer.GenerateMeshOverride += HandleRender;
#endif
#if UNITY_5_4_OR_NEWER #if UNITY_5_4_OR_NEWER
if (copyMeshRendererFlags) { if (copyMeshRendererFlags) {
@ -109,7 +116,9 @@ namespace Spine.Unity.Modules {
void OnDisable () { void OnDisable () {
if (skeletonRenderer == null) return; if (skeletonRenderer == null) return;
#if SPINE_OPTIONAL_RENDEROVERRIDE
skeletonRenderer.GenerateMeshOverride -= HandleRender; skeletonRenderer.GenerateMeshOverride -= HandleRender;
#endif
#if UNITY_EDITOR #if UNITY_EDITOR
skeletonRenderer.LateUpdate(); skeletonRenderer.LateUpdate();
@ -132,9 +141,14 @@ namespace Spine.Unity.Modules {
var submeshInstructionsItems = submeshInstructions.Items; var submeshInstructionsItems = submeshInstructions.Items;
int lastSubmeshInstruction = submeshInstructions.Count - 1; int lastSubmeshInstruction = submeshInstructions.Count - 1;
#if SPINE_OPTIONAL_NORMALS
bool addNormals = skeletonRenderer.calculateNormals; bool addNormals = skeletonRenderer.calculateNormals;
#endif
#if SPINE_OPTIONAL_SOLVETANGENTS
bool addTangents = skeletonRenderer.calculateTangents; bool addTangents = skeletonRenderer.calculateTangents;
#endif
bool pmaVertexColors = skeletonRenderer.pmaVertexColors; bool pmaVertexColors = skeletonRenderer.pmaVertexColors;
int rendererIndex = 0; int rendererIndex = 0;
@ -143,8 +157,12 @@ namespace Spine.Unity.Modules {
if (submeshInstructionsItems[si].forceSeparate || si == lastSubmeshInstruction) { if (submeshInstructionsItems[si].forceSeparate || si == lastSubmeshInstruction) {
// Apply properties // Apply properties
var meshGenerator = currentRenderer.MeshGenerator; var meshGenerator = currentRenderer.MeshGenerator;
#if SPINE_OPTIONAL_NORMALS
meshGenerator.AddNormals = addNormals; meshGenerator.AddNormals = addNormals;
#endif
#if SPINE_OPTIONAL_SOLVETANGENTS
meshGenerator.AddTangents = addTangents; meshGenerator.AddTangents = addTangents;
#endif
meshGenerator.PremultiplyVertexColors = pmaVertexColors; meshGenerator.PremultiplyVertexColors = pmaVertexColors;
if (copyPropertyBlock) if (copyPropertyBlock)
currentRenderer.SetPropertyBlock(copiedBlock); currentRenderer.SetPropertyBlock(copiedBlock);

View File

@ -303,7 +303,11 @@ namespace Spine.Unity {
// Slot with a separator/new material will become the starting slot of the next new instruction. // Slot with a separator/new material will become the starting slot of the next new instruction.
bool forceSeparate = (hasSeparators && separatorSlots.Contains(slot)); bool forceSeparate = (hasSeparators && separatorSlots.Contains(slot));
if (noRender) { if (noRender) {
if (forceSeparate && vertexCount > 0 && this.generateMeshOverride != null) { if (forceSeparate && vertexCount > 0
#if SPINE_OPTIONAL_RENDEROVERRIDE
&& this.generateMeshOverride != null
#endif
) {
workingSubmeshInstructions.Add( workingSubmeshInstructions.Add(
new Spine.Unity.MeshGeneration.SubmeshInstruction { new Spine.Unity.MeshGeneration.SubmeshInstruction {
skeleton = this.skeleton, skeleton = this.skeleton,
@ -411,13 +415,17 @@ namespace Spine.Unity {
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv2); ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv2);
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv3); ArraysMeshGenerator.EnsureSize(vertexCount, ref this.uv3);
} }
#if SPINE_OPTIONAL_NORMALS #if SPINE_OPTIONAL_NORMALS
bool vertexCountIncreased = ArraysMeshGenerator.EnsureSize(vertexCount, ref this.vertices, ref this.uvs, ref this.colors);
if (vertexCountIncreased && calculateNormals) { if (vertexCountIncreased && calculateNormals) {
Vector3[] localNormals = this.normals = new Vector3[vertexCount]; Vector3[] localNormals = this.normals = new Vector3[vertexCount];
Vector3 normal = new Vector3(0, 0, -1); Vector3 normal = new Vector3(0, 0, -1);
for (int i = 0; i < vertexCount; i++) for (int i = 0; i < vertexCount; i++)
localNormals[i] = normal; localNormals[i] = normal;
} }
#else
ArraysMeshGenerator.EnsureSize(vertexCount, ref this.vertices, ref this.uvs, ref this.colors);
#endif #endif
Vector3 meshBoundsMin; Vector3 meshBoundsMin;