|
@@ -31,9 +31,12 @@
|
|
#import <spine/SkeletonRenderer.h>
|
|
#import <spine/SkeletonRenderer.h>
|
|
#import <spine/spine-cocos2d-objc.h>
|
|
#import <spine/spine-cocos2d-objc.h>
|
|
#import <spine/extension.h>
|
|
#import <spine/extension.h>
|
|
|
|
+#import <spine/GLUtils.h>
|
|
#import "CCDrawNode.h"
|
|
#import "CCDrawNode.h"
|
|
|
|
|
|
static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
|
|
+static spTwoColorBatcher* batcher = 0;
|
|
|
|
+static spMesh* mesh = 0;
|
|
|
|
|
|
@interface SkeletonRenderer (Private)
|
|
@interface SkeletonRenderer (Private)
|
|
- (void) initialize:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
|
|
- (void) initialize:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData;
|
|
@@ -43,6 +46,7 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
|
|
|
|
@synthesize skeleton = _skeleton;
|
|
@synthesize skeleton = _skeleton;
|
|
@synthesize rootBone = _rootBone;
|
|
@synthesize rootBone = _rootBone;
|
|
|
|
+@synthesize twoColorTint = _twoColorTint;
|
|
@synthesize debugSlots = _debugSlots;
|
|
@synthesize debugSlots = _debugSlots;
|
|
@synthesize debugBones = _debugBones;
|
|
@synthesize debugBones = _debugBones;
|
|
|
|
|
|
@@ -59,6 +63,14 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
}
|
|
}
|
|
|
|
|
|
- (void) initialize:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
|
|
- (void) initialize:(spSkeletonData*)skeletonData ownsSkeletonData:(bool)ownsSkeletonData {
|
|
|
|
+ if (!batcher) {
|
|
|
|
+ batcher = spTwoColorBatcher_create();
|
|
|
|
+ mesh = spMesh_create(64000, 32000);
|
|
|
|
+ [[CCDirector sharedDirector] addFrameCompletionHandler: ^{
|
|
|
|
+ printf ("frame completed");
|
|
|
|
+ }];
|
|
|
|
+ }
|
|
|
|
+
|
|
_ownsSkeletonData = ownsSkeletonData;
|
|
_ownsSkeletonData = ownsSkeletonData;
|
|
|
|
|
|
_worldVertices = MALLOC(float, 1000); // Max number of vertices per mesh.
|
|
_worldVertices = MALLOC(float, 1000); // Max number of vertices per mesh.
|
|
@@ -154,6 +166,8 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
_skeleton->color.a = self.displayedOpacity;
|
|
_skeleton->color.a = self.displayedOpacity;
|
|
|
|
|
|
int blendMode = -1;
|
|
int blendMode = -1;
|
|
|
|
+ uint32_t srcBlend = GL_SRC_ALPHA;
|
|
|
|
+ uint32_t dstBlend = GL_ONE_MINUS_SRC_ALPHA;
|
|
const float* uvs = 0;
|
|
const float* uvs = 0;
|
|
int verticesCount = 0;
|
|
int verticesCount = 0;
|
|
const unsigned short* triangles = 0;
|
|
const unsigned short* triangles = 0;
|
|
@@ -200,15 +214,23 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
switch (slot->data->blendMode) {
|
|
switch (slot->data->blendMode) {
|
|
case SP_BLEND_MODE_ADDITIVE:
|
|
case SP_BLEND_MODE_ADDITIVE:
|
|
[self setBlendMode:[CCBlendMode addMode]];
|
|
[self setBlendMode:[CCBlendMode addMode]];
|
|
|
|
+ srcBlend = !_premultipliedAlpha ? GL_SRC_ALPHA : GL_ONE;
|
|
|
|
+ dstBlend = GL_ONE;
|
|
break;
|
|
break;
|
|
case SP_BLEND_MODE_MULTIPLY:
|
|
case SP_BLEND_MODE_MULTIPLY:
|
|
[self setBlendMode:[CCBlendMode multiplyMode]];
|
|
[self setBlendMode:[CCBlendMode multiplyMode]];
|
|
|
|
+ srcBlend = GL_DST_COLOR;
|
|
|
|
+ dstBlend = GL_ONE_MINUS_SRC_ALPHA;
|
|
break;
|
|
break;
|
|
case SP_BLEND_MODE_SCREEN:
|
|
case SP_BLEND_MODE_SCREEN:
|
|
[self setBlendMode:screenMode];
|
|
[self setBlendMode:screenMode];
|
|
|
|
+ srcBlend = GL_ONE;
|
|
|
|
+ dstBlend = GL_ONE_MINUS_SRC_COLOR;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
[self setBlendMode:_premultipliedAlpha ? [CCBlendMode premultipliedAlphaMode] : [CCBlendMode alphaMode]];
|
|
[self setBlendMode:_premultipliedAlpha ? [CCBlendMode premultipliedAlphaMode] : [CCBlendMode alphaMode]];
|
|
|
|
+ srcBlend = !_premultipliedAlpha ? GL_SRC_ALPHA : GL_ONE;
|
|
|
|
+ dstBlend = GL_ONE_MINUS_SRC_ALPHA;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (_premultipliedAlpha) {
|
|
if (_premultipliedAlpha) {
|
|
@@ -227,16 +249,25 @@ static const unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
|
|
GLKVector2 center = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
|
GLKVector2 center = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
|
GLKVector2 extents = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
|
GLKVector2 extents = GLKVector2Make(size.width / 2.0, size.height / 2.0);
|
|
if (_skipVisibilityCheck || CCRenderCheckVisbility(transform, center, extents)) {
|
|
if (_skipVisibilityCheck || CCRenderCheckVisbility(transform, center, extents)) {
|
|
- CCRenderBuffer buffer = [renderer enqueueTriangles:(trianglesCount / 3) andVertexes:verticesCount withState:self.renderState globalSortOrder:0];
|
|
|
|
- for (int i = 0; i * 2 < verticesCount; ++i) {
|
|
|
|
- CCVertex vertex;
|
|
|
|
- vertex.position = GLKVector4Make(_worldVertices[i * 2], _worldVertices[i * 2 + 1], 0.0, 1.0);
|
|
|
|
- vertex.color = GLKVector4Make(r, g, b, a);
|
|
|
|
- vertex.texCoord1 = GLKVector2Make(uvs[i * 2], 1 - uvs[i * 2 + 1]);
|
|
|
|
- CCRenderBufferSetVertex(buffer, i, CCVertexApplyTransform(vertex, transform));
|
|
|
|
- }
|
|
|
|
- for (int j = 0; j * 3 < trianglesCount; ++j) {
|
|
|
|
- CCRenderBufferSetTriangle(buffer, j, triangles[j * 3], triangles[j * 3 + 1], triangles[j * 3 + 2]);
|
|
|
|
|
|
+ if (!self.twoColorTint) {
|
|
|
|
+ CCRenderBuffer buffer = [renderer enqueueTriangles:(trianglesCount / 3) andVertexes:verticesCount withState:self.renderState globalSortOrder:0];
|
|
|
|
+ for (int i = 0; i * 2 < verticesCount; ++i) {
|
|
|
|
+ CCVertex vertex;
|
|
|
|
+ vertex.position = GLKVector4Make(_worldVertices[i * 2], _worldVertices[i * 2 + 1], 0.0, 1.0);
|
|
|
|
+ vertex.color = GLKVector4Make(r, g, b, a);
|
|
|
|
+ vertex.texCoord1 = GLKVector2Make(uvs[i * 2], 1 - uvs[i * 2 + 1]);
|
|
|
|
+ CCRenderBufferSetVertex(buffer, i, CCVertexApplyTransform(vertex, transform));
|
|
|
|
+ }
|
|
|
|
+ for (int j = 0; j * 3 < trianglesCount; ++j) {
|
|
|
|
+ CCRenderBufferSetTriangle(buffer, j, triangles[j * 3], triangles[j * 3 + 1], triangles[j * 3 + 2]);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ spMeshPart meshPart;
|
|
|
|
+ spMesh_allocatePart(mesh, &meshPart, verticesCount / 2, trianglesCount, self.texture.name, srcBlend, dstBlend);
|
|
|
|
+
|
|
|
|
+ [renderer enqueueBlock:^{
|
|
|
|
+
|
|
|
|
+ } globalSortOrder:0 debugLabel: nil threadSafe: false];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|