Merge branch 'EsotericSoftware/3.6' into 3.6

This commit is contained in:
Stephen Gowen 2017-10-13 15:31:59 -04:00
commit 8ebb36daa9
21 changed files with 189 additions and 13 deletions

View File

@ -25,6 +25,7 @@
* Added support for clipping.
* Added support for rotated regions in texture atlas loaded via StarlingAtlasAttachmentLoader.
* Added support for vertex effects. See `RaptorExample.as`
* Added 'getTexture()' method to 'StarlingTextureAtlasAttachmentLoader'
## C
* **Breaking changes**
@ -52,7 +53,6 @@
* Added `spVertexEffect` and corresponding implementations `spJitterVertexEffect` and `spSwirlVertexEffect`. Create/dispose through the corresponding `spXXXVertexEffect_create()/dispose()` functions. Set on framework/engine specific renderer. See changes for spine-c based frameworks/engines below.
* Functions in `extension.h` are not prefixed with `_sp` instead of just `_` to avoid interference with other libraries.
* Introduced `SP_API` macro. Every spine-c function is prefixed with this macro. By default, it is an empty string. Can be used to markup spine-c functions with e.g. ``__declspec` when compiling to a dll or linking to that dll.
* Added `void* userData` to `spAnimationState` to be consumed in callbacks.
### Cocos2d-X
* Fixed renderer to work with 3.6 changes
@ -64,6 +64,7 @@
* SkeletonRenderer now combines the displayed color of the Node (cascaded from all parents) with the skeleton color for tinting.
* Added support for vertex effects. See `RaptorExample.cpp`.
* Added ETC1 alpha support, thanks @halx99! Does not work when two color tint is enabled.
* Added `spAtlasPage_setCustomTextureLoader()` which let's you do texture loading manually. Thanks @jareguo.
### Cocos2d-Objc
* Fixed renderer to work with 3.6 changes
@ -84,7 +85,6 @@
* Added support for two color tinting. All base materials, e.g. SpineUnlitNormalMaterial, now do proper two color tinting. No material parameters have changed.
* Updated to Unreal Engine 4.16.1. Note that 4.16 has a regression which will make it impossible to compile plain .c files!
* spine-c is now exposed from the plugin shared library on Windows via __declspec.
* `SkeletonRenderComponent` now generates collision meshes by default.
## C#
* **Breaking changes**
@ -147,7 +147,9 @@
* Removed `RegionBatcher` and `SkeletonRegionRenderer`, renamed `SkeletonMeshRenderer` to `SkeletonRenderer`
* Added support for two color tint. For it to work, you need to add the `SpineEffect.fx` file to your content project, then load it via `var effect = Content.Load<Effect>("SpineEffect");`, and set it on the `SkeletonRenderer`. See the example project for code.
* Added support for any `Effect` to be used by `SkeletonRenderer`
* Added support for `IVertexEffect` to modify vertices of skeletons on the CPU. `IVertexEffect` instances can be set on the `SkeletonRenderer`. See example project.
* Added `SkeletonDebugRenderer`
* Made `MeshBatcher` of SkeletonRenderer accessible via a getter. Allows user to batch their own geometry together with skeleton meshes for maximum batching instead of using XNA SpriteBatcher.
## Java
* **Breaking changes**

View File

@ -31,6 +31,13 @@
#include <spine/spine-cocos2dx.h>
#include <spine/extension.h>
namespace spine {
static CustomTextureLoader _customTextureLoader = nullptr;
void spAtlasPage_setCustomTextureLoader (CustomTextureLoader texLoader) {
_customTextureLoader = texLoader;
}
}
USING_NS_CC;
GLuint wrap (spAtlasWrap wrap) {
@ -60,7 +67,13 @@ GLuint filter (spAtlasFilter filter) {
}
void _spAtlasPage_createTexture (spAtlasPage* self, const char* path) {
Texture2D* texture = Director::getInstance()->getTextureCache()->addImage(path);
Texture2D* texture = nullptr;
if (spine::_customTextureLoader) {
texture = spine::_customTextureLoader(path);
}
if (!texture) {
texture = Director::getInstance()->getTextureCache()->addImage(path);
}
CCASSERT(texture != nullptr, "Invalid image");
texture->retain();

View File

@ -38,4 +38,10 @@
#include <spine/SkeletonAnimation.h>
#include <spine/SkeletonBatch.h>
namespace spine {
typedef cocos2d::Texture2D* (*CustomTextureLoader)(const char* path);
// set custom texture loader for _spAtlasPage_createTexture
void spAtlasPage_setCustomTextureLoader(CustomTextureLoader texLoader);
}
#endif /* SPINE_COCOS2DX_H_ */

View File

@ -258,7 +258,7 @@ namespace Spine {
return clipped;
}
static void MakeClockwise (ExposedList<float> polygon) {
public static void MakeClockwise (ExposedList<float> polygon) {
float[] vertices = polygon.Items;
int verticeslength = polygon.Count;

View File

@ -31,7 +31,7 @@
using System;
namespace Spine {
internal class Triangulator {
public class Triangulator {
private readonly ExposedList<ExposedList<float>> convexPolygons = new ExposedList<ExposedList<float>>();
private readonly ExposedList<ExposedList<int>> convexPolygonsIndices = new ExposedList<ExposedList<int>>();

View File

@ -57,6 +57,7 @@ import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData.Page;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.MathUtils;
@ -96,6 +97,7 @@ public class SkeletonViewer extends ApplicationAdapter {
OrthographicCamera camera;
TwoColorPolygonBatch batch;
TextureAtlas atlas;
SkeletonRenderer renderer;
SkeletonRendererDebug debugRenderer;
SkeletonData skeletonData;
@ -155,7 +157,20 @@ public class SkeletonViewer extends ApplicationAdapter {
}
}
TextureAtlasData data = !atlasFile.exists() ? null : new TextureAtlasData(atlasFile, atlasFile.parent(), false);
TextureAtlas atlas = new TextureAtlas(data) {
if (data != null) {
boolean linear = true;
for (int i = 0, n = data.getPages().size; i < n; i++) {
Page page = data.getPages().get(i);
if (page.minFilter != TextureFilter.Linear || page.magFilter != TextureFilter.Linear) {
linear = false;
break;
}
}
ui.linearCheckbox.setChecked(linear);
}
atlas = new TextureAtlas(data) {
public AtlasRegion findRegion (String name) {
AtlasRegion region = super.findRegion(name);
if (region == null) {
@ -416,6 +431,8 @@ public class SkeletonViewer extends ApplicationAdapter {
CheckBox premultipliedCheckbox = new CheckBox("Premultiplied", skin);
CheckBox linearCheckbox = new CheckBox("Linear", skin);
TextButton bonesSetupPoseButton = new TextButton("Bones", skin);
TextButton slotsSetupPoseButton = new TextButton("Slots", skin);
TextButton setupPoseButton = new TextButton("Both", skin);
@ -458,6 +475,8 @@ public class SkeletonViewer extends ApplicationAdapter {
premultipliedCheckbox.setChecked(true);
linearCheckbox.setChecked(true);
loopCheckbox.setChecked(true);
scaleSlider.setValue(1);
@ -519,7 +538,13 @@ public class SkeletonViewer extends ApplicationAdapter {
root.add();
root.add(table(debugMeshHullCheckbox, debugMeshTrianglesCheckbox)).row();
root.add("Atlas alpha:");
root.add(premultipliedCheckbox).row();
{
Table table = table();
table.add(premultipliedCheckbox);
table.add("Filtering:").growX().getActor().setAlignment(Align.right);
table.add(linearCheckbox);
root.add(table).fill().row();
}
root.add(new Image(skin.newDrawable("white", new Color(0x4e4e4eff)))).height(1).fillX().colspan(2).pad(-3, 0, 1, 0)
.row();
@ -739,6 +764,15 @@ public class SkeletonViewer extends ApplicationAdapter {
}
});
linearCheckbox.addListener(new ChangeListener() {
public void changed (ChangeEvent event, Actor actor) {
if (atlas == null) return;
TextureFilter filter = linearCheckbox.isChecked() ? TextureFilter.Linear : TextureFilter.Nearest;
for (Texture texture : atlas.getTextures())
texture.setFilter(filter, filter);
}
});
skinList.addListener(new ChangeListener() {
public void changed (ChangeEvent event, Actor actor) {
if (skeleton != null) {
@ -834,7 +868,7 @@ public class SkeletonViewer extends ApplicationAdapter {
}
Table table (Actor... actors) {
Table table = new Table();
Table table = new Table(skin);
table.defaults().space(6);
table.add(actors);
return table;

View File

@ -51,7 +51,7 @@ float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
float alpha = texColor.a * input.Color.a;
float4 output;
output.a = alpha;
output.rgb = (1.0 - texColor.rgb) * input.Color2.rgb * alpha + texColor.rgb * input.Color.rgb;
output.rgb = ((texColor.a - 1.0) * input.Color2.a + 1.0 - texColor.rgb) * input.Color2.rgb + texColor.rgb * input.Color.rgb;
return output;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
define("ace/theme/monokai",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=".ace-monokai .ace_gutter {background: #2F3129;color: #8F908A}.ace-monokai .ace_print-margin {width: 1px;background: #555651}.ace-monokai {background-color: #272822;color: #F8F8F2}.ace-monokai .ace_cursor {color: #F8F8F0}.ace-monokai .ace_marker-layer .ace_selection {background: #49483E}.ace-monokai.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #272822;}.ace-monokai .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-monokai .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #49483E}.ace-monokai .ace_marker-layer .ace_active-line {background: #202020}.ace-monokai .ace_gutter-active-line {background-color: #272727}.ace-monokai .ace_marker-layer .ace_selected-word {border: 1px solid #49483E}.ace-monokai .ace_invisible {color: #52524d}.ace-monokai .ace_entity.ace_name.ace_tag,.ace-monokai .ace_keyword,.ace-monokai .ace_meta.ace_tag,.ace-monokai .ace_storage {color: #F92672}.ace-monokai .ace_punctuation,.ace-monokai .ace_punctuation.ace_tag {color: #fff}.ace-monokai .ace_constant.ace_character,.ace-monokai .ace_constant.ace_language,.ace-monokai .ace_constant.ace_numeric,.ace-monokai .ace_constant.ace_other {color: #AE81FF}.ace-monokai .ace_invalid {color: #F8F8F0;background-color: #F92672}.ace-monokai .ace_invalid.ace_deprecated {color: #F8F8F0;background-color: #AE81FF}.ace-monokai .ace_support.ace_constant,.ace-monokai .ace_support.ace_function {color: #66D9EF}.ace-monokai .ace_fold {background-color: #A6E22E;border-color: #F8F8F2}.ace-monokai .ace_storage.ace_type,.ace-monokai .ace_support.ace_class,.ace-monokai .ace_support.ace_type {font-style: italic;color: #66D9EF}.ace-monokai .ace_entity.ace_name.ace_function,.ace-monokai .ace_entity.ace_other,.ace-monokai .ace_entity.ace_other.ace_attribute-name,.ace-monokai .ace_variable {color: #A6E22E}.ace-monokai .ace_variable.ace_parameter {font-style: italic;color: #FD971F}.ace-monokai .ace_string {color: #E6DB74}.ace-monokai .ace_comment {color: #75715E}.ace-monokai .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,96 @@
<html>
<script src="../../build/spine-webgl.js"></script>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<style>
/* Dead Simple Grid (c) 2015 Vladimir Agafonkin */
.row .row { margin: 0 -1.5em; }
.col { padding: 0 1.5em; }
.row:after {
content: "";
clear: both;
display: table;
}
@media only screen { .col {
float: left;
width: 100%;
box-sizing: border-box;
}}
@media only screen and (min-width: 30em) {
.content { width: 50%; height: 100%; padding: 0 }
.sidebar { width: 50%; height: 100%; padding: 0 }
}
body {
margin: 0;
}
iframe {
width: 100%;
height: 100%;
border:none;
}
.panel {
width: 100%;
height: 50%;
}
.buttons {
position: absolute;
top: 5; left: 5;
}
</style>
<body>
<div class="buttons">
<button id="playButton">Run</button>
<button id="stopButton">Stop</button>
</div>
<div class="row">
<div class="col content">
<iframe id="iframe"></iframe>
</div>
<div class="col sidebar">
<div id="codeJs" class="panel"></div>
<div id="codeHtml" class="panel"></div>
</div>
</div>
</body>
<script id="initialJs" type="text/plain">
var canvas = document.getElementById("canvas");
var config = { alpha: false };
var context = new spine.webgl.ManagedWebGLRenderingContext(canvas, config);
var gl = context.gl;
function render() {
gl.clearColor(0.2, 0.2, 0.2, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
requestAnimationFrame(render);
}
requestAnimationFrame(render);
</script>
<script src="js/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
$(document).ready(function() {
var editorJs = ace.edit("codeJs");
editorJs.setTheme("ace/theme/monokai");
editorJs.getSession().setMode("ace/mode/javascript");
editorJs.setValue(document.getElementById("initialJs").innerHTML);
var editorHtml = ace.edit("codeHtml");
editorHtml.setTheme("ace/theme/monokai");
editorHtml.getSession().setMode("ace/mode/html");
editorHtml.setValue('<script src="../../build/spine-webgl.js"><\/script>\n<canvas id="canvas" style="width: 100%; height: 98vh;"></canvas>');
$("#playButton").click(function() {
var iframe = document.getElementById("iframe");
var source = "<html><body>" + editorHtml.getValue() + "<script>" + editorJs.getValue() + "<\/script></body></html>";
iframe.srcdoc = source;
});
});
</script>
</html>

View File

@ -42,7 +42,7 @@ float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
float alpha = texColor.a * input.Color.a;
float4 output;
output.a = alpha;
output.rgb = (1.0 - texColor.rgb) * input.Color2.rgb * alpha + texColor.rgb * input.Color.rgb;
output.rgb = ((texColor.a - 1.0) * input.Color2.a + 1.0 - texColor.rgb) * input.Color2.rgb + texColor.rgb * input.Color.rgb;
return output;
}

View File

@ -85,10 +85,10 @@ namespace Spine {
skeletonDebugRenderer.DrawClipping = true;
// String name = "spineboy-ess";
String name = "goblins-pro";
// String name = "goblins-pro";
// String name = "raptor-pro";
// String name = "tank-pro";
// String name = "coin-pro";
String name = "coin-pro";
String atlasName = name.Replace("-pro", "").Replace("-ess", "");
if (name == "goblins-pro") atlasName = "goblins-mesh";
bool binaryData = false;

View File

@ -45,6 +45,7 @@ namespace Spine {
SkeletonClipping clipper = new SkeletonClipping();
GraphicsDevice device;
MeshBatcher batcher;
public MeshBatcher Batcher { get { return batcher; } }
RasterizerState rasterizerState;
float[] vertices = new float[8];
int[] quadTriangles = { 0, 1, 2, 2, 3, 0 };
@ -163,8 +164,13 @@ namespace Spine {
Color darkColor = new Color();
if (slot.HasSecondColor) {
darkColor = new Color(slot.R2, slot.G2, slot.B2);
if (premultipliedAlpha) {
darkColor = new Color(slot.R2 * a, slot.G2 * a, slot.B2 * a);
} else {
darkColor = new Color(slot.R2 * a, slot.G2 * a, slot.B2 * a);
}
}
darkColor.A = premultipliedAlpha ? (byte)255 : (byte)0;
// clip
if (clipper.IsClipping()) {