Skip to content

Commit 4317ad1

Browse files
committed
Merge branch '4.2' into spine-android
2 parents 44f2d1f + 8b59c10 commit 4317ad1

File tree

101 files changed

+3314
-2733
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+3314
-2733
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@
165165
- SkeletonGraphic Materials: Since the addition of new material sets for the `CanvasGroupCompatible` parameters, the default SkeletonGraphic materials all have `CanvasGroup Compatible` disabled. Please assign the respective material from the `CanvasGroupCompatible` material subdirectory if you want `CanvasGroup Compatible` enabled at your SkeletonGraphic.
166166
- SkeletonGraphic: The parameter `SkeletonGraphic.MeshGenerator.settings.canvasGroupTintBlack` was changed to `canvasGroupCompatible` to help with auto-detecting correct Vertex Data and Material settings. Set the parameter to true if the SkeletonGraphic component is located below a `CanvasGroup` component. The parameter value is automatically migrated from `canvasGroupTintBlack`.
167167
- Inspector: String attribute `SpineSkin()` now allows to include `<None>` in the list of parameters. Previously the `includeNone=true` parameter of the `SpineSkin()` attribute defaulted to `true` but was ignored. Now it defaults to `false` and has an effect on the list. Only the Inspector GUI is affected by this behaviour change.
168+
- `SkeletonGraphicRenderTexture` example component: `protected RawImage quadRawImage` was changed to `protected SkeletonSubmeshGraphic quadMaskableGraphic` for a bugfix. This is only relevant for subclasses of `SkeletonGraphicRenderTexture` or when querying the `RawImage` component via e.g. `skeletonGraphicRenderTexture.quad.GetComponent<RawImage>()`.
168169

169170
- **Changes of default values**
170171

Loading

examples/mix-and-match/export/mix-and-match-pro.json

+221-223
Large diffs are not rendered by default.
Binary file not shown.
Loading

examples/mix-and-match/mix-and-match-pro.spine

100755100644
3.72 KB
Binary file not shown.

spine-c/spine-c/src/spine/Bone.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,12 @@ void spBone_updateWorldTransformWith(spBone *self, float x, float y, float rotat
161161
float za = (pa * cosine + pb * sine) / sx;
162162
float zc = (pc * cosine + pd * sine) / sy;
163163
float s = SQRT(za * za + zc * zc);
164-
if (self->data->inherit == SP_INHERIT_NOSCALE && (pa * pd - pb * pc < 0) != (sx < 0 != sy < 0))
164+
if (s > 0.00001f) s = 1 / s;
165+
za *= s;
166+
zc *= s;
167+
s = SQRT(za * za + zc * zc);
168+
if (self->inherit == SP_INHERIT_NOSCALE &&
169+
(pa * pd - pb * pc < 0) != (sx < 0 != sy < 0))
165170
s = -s;
166171
rotation = PI / 2 + ATAN2(zc, za);
167172
float zb = COS(rotation) * s;

spine-c/spine-c/src/spine/SkeletonBinary.c

+7
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,8 @@ spSkeletonData *spSkeletonBinary_readSkeletonData(spSkeletonBinary *self, const
13691369
skeletonData->version = 0;
13701370
} else {
13711371
if (!string_starts_with(skeletonData->version, SPINE_VERSION_STRING)) {
1372+
FREE(input);
1373+
spSkeletonData_dispose(skeletonData);
13721374
char errorMsg[255];
13731375
snprintf(errorMsg, 255, "Skeleton version %s does not match runtime version %s", skeletonData->version, SPINE_VERSION_STRING);
13741376
_spSkeletonBinary_setError(self, errorMsg, NULL);
@@ -1596,6 +1598,8 @@ spSkeletonData *spSkeletonBinary_readSkeletonData(spSkeletonBinary *self, const
15961598
/* Default skin. */
15971599
skeletonData->defaultSkin = spSkeletonBinary_readSkin(self, input, -1, skeletonData, nonessential);
15981600
if (self->attachmentLoader->error1) {
1601+
FREE(input);
1602+
spSkin_dispose(skeletonData->defaultSkin);
15991603
spSkeletonData_dispose(skeletonData);
16001604
_spSkeletonBinary_setError(self, self->attachmentLoader->error1, self->attachmentLoader->error2);
16011605
return NULL;
@@ -1614,6 +1618,8 @@ spSkeletonData *spSkeletonBinary_readSkeletonData(spSkeletonBinary *self, const
16141618
for (i = skeletonData->defaultSkin ? 1 : 0; i < skeletonData->skinsCount; ++i) {
16151619
spSkin *skin = spSkeletonBinary_readSkin(self, input, 0, skeletonData, nonessential);
16161620
if (self->attachmentLoader->error1) {
1621+
FREE(input);
1622+
skeletonData->skinsCount = i + 1;
16171623
spSkeletonData_dispose(skeletonData);
16181624
_spSkeletonBinary_setError(self, self->attachmentLoader->error1, self->attachmentLoader->error2);
16191625
return NULL;
@@ -1672,6 +1678,7 @@ spSkeletonData *spSkeletonBinary_readSkeletonData(spSkeletonBinary *self, const
16721678
FREE(name);
16731679
if (!animation) {
16741680
FREE(input);
1681+
skeletonData->animationsCount = i + 1;
16751682
spSkeletonData_dispose(skeletonData);
16761683
_spSkeletonBinary_setError(self, "Animation corrupted: ", name);
16771684
return NULL;

spine-c/spine-c/src/spine/SkeletonJson.c

+17-6
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,6 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
11771177
slots = Json_getItem(root, "slots");
11781178
if (slots) {
11791179
Json *slotMap;
1180-
skeletonData->slotsCount = slots->size;
11811180
skeletonData->slots = MALLOC(spSlotData *, slots->size);
11821181
for (slotMap = slots->child, i = 0; slotMap; slotMap = slotMap->next, ++i) {
11831182
spSlotData *data;
@@ -1237,14 +1236,14 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
12371236
data->visible = Json_getInt(slotMap, "visible", -1);
12381237
data->path = pathName;
12391238
skeletonData->slots[i] = data;
1239+
skeletonData->slotsCount++;
12401240
}
12411241
}
12421242

12431243
/* IK constraints. */
12441244
ik = Json_getItem(root, "ik");
12451245
if (ik) {
12461246
Json *constraintMap;
1247-
skeletonData->ikConstraintsCount = ik->size;
12481247
skeletonData->ikConstraints = MALLOC(spIkConstraintData *, ik->size);
12491248
for (constraintMap = ik->child, i = 0; constraintMap; constraintMap = constraintMap->next, ++i) {
12501249
const char *targetName;
@@ -1259,6 +1258,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
12591258
for (boneMap = boneMap->child, ii = 0; boneMap; boneMap = boneMap->next, ++ii) {
12601259
data->bones[ii] = spSkeletonData_findBone(skeletonData, boneMap->valueString);
12611260
if (!data->bones[ii]) {
1261+
spIkConstraintData_dispose(data);
12621262
spSkeletonData_dispose(skeletonData);
12631263
_spSkeletonJson_setError(self, root, "IK bone not found: ", boneMap->valueString);
12641264
return NULL;
@@ -1268,6 +1268,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
12681268
targetName = Json_getString(constraintMap, "target", 0);
12691269
data->target = spSkeletonData_findBone(skeletonData, targetName);
12701270
if (!data->target) {
1271+
spIkConstraintData_dispose(data);
12711272
spSkeletonData_dispose(skeletonData);
12721273
_spSkeletonJson_setError(self, root, "Target bone not found: ", targetName);
12731274
return NULL;
@@ -1281,14 +1282,14 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
12811282
data->softness = Json_getFloat(constraintMap, "softness", 0) * self->scale;
12821283

12831284
skeletonData->ikConstraints[i] = data;
1285+
skeletonData->ikConstraintsCount++;
12841286
}
12851287
}
12861288

12871289
/* Transform constraints. */
12881290
transform = Json_getItem(root, "transform");
12891291
if (transform) {
12901292
Json *constraintMap;
1291-
skeletonData->transformConstraintsCount = transform->size;
12921293
skeletonData->transformConstraints = MALLOC(spTransformConstraintData *, transform->size);
12931294
for (constraintMap = transform->child, i = 0; constraintMap; constraintMap = constraintMap->next, ++i) {
12941295
const char *name;
@@ -1304,6 +1305,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
13041305
for (boneMap = boneMap->child, ii = 0; boneMap; boneMap = boneMap->next, ++ii) {
13051306
data->bones[ii] = spSkeletonData_findBone(skeletonData, boneMap->valueString);
13061307
if (!data->bones[ii]) {
1308+
spTransformConstraintData_dispose(data);
13071309
spSkeletonData_dispose(skeletonData);
13081310
_spSkeletonJson_setError(self, root, "Transform bone not found: ", boneMap->valueString);
13091311
return NULL;
@@ -1313,6 +1315,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
13131315
name = Json_getString(constraintMap, "target", 0);
13141316
data->target = spSkeletonData_findBone(skeletonData, name);
13151317
if (!data->target) {
1318+
spTransformConstraintData_dispose(data);
13161319
spSkeletonData_dispose(skeletonData);
13171320
_spSkeletonJson_setError(self, root, "Target bone not found: ", name);
13181321
return NULL;
@@ -1335,14 +1338,14 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
13351338
data->mixShearY = Json_getFloat(constraintMap, "mixShearY", 1);
13361339

13371340
skeletonData->transformConstraints[i] = data;
1341+
skeletonData->transformConstraintsCount++;
13381342
}
13391343
}
13401344

13411345
/* Path constraints */
13421346
pathJson = Json_getItem(root, "path");
13431347
if (pathJson) {
13441348
Json *constraintMap;
1345-
skeletonData->pathConstraintsCount = pathJson->size;
13461349
skeletonData->pathConstraints = MALLOC(spPathConstraintData *, pathJson->size);
13471350
for (constraintMap = pathJson->child, i = 0; constraintMap; constraintMap = constraintMap->next, ++i) {
13481351
const char *name;
@@ -1358,6 +1361,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
13581361
for (boneMap = boneMap->child, ii = 0; boneMap; boneMap = boneMap->next, ++ii) {
13591362
data->bones[ii] = spSkeletonData_findBone(skeletonData, boneMap->valueString);
13601363
if (!data->bones[ii]) {
1364+
spPathConstraintData_dispose(data);
13611365
spSkeletonData_dispose(skeletonData);
13621366
_spSkeletonJson_setError(self, root, "Path bone not found: ", boneMap->valueString);
13631367
return NULL;
@@ -1367,6 +1371,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
13671371
name = Json_getString(constraintMap, "target", 0);
13681372
data->target = spSkeletonData_findSlot(skeletonData, name);
13691373
if (!data->target) {
1374+
spPathConstraintData_dispose(data);
13701375
spSkeletonData_dispose(skeletonData);
13711376
_spSkeletonJson_setError(self, root, "Target slot not found: ", name);
13721377
return NULL;
@@ -1404,6 +1409,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
14041409
data->mixY = Json_getFloat(constraintMap, "mixY", data->mixX);
14051410

14061411
skeletonData->pathConstraints[i] = data;
1412+
skeletonData->pathConstraintsCount++;
14071413
}
14081414
}
14091415

@@ -1471,6 +1477,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
14711477
for (skinPart = skinPart->child; skinPart; skinPart = skinPart->next) {
14721478
spBoneData *bone = spSkeletonData_findBone(skeletonData, skinPart->valueString);
14731479
if (!bone) {
1480+
spSkin_dispose(skin);
14741481
spSkeletonData_dispose(skeletonData);
14751482
_spSkeletonJson_setError(self, root, "Skin bone constraint not found: ", skinPart->valueString);
14761483
return NULL;
@@ -1485,6 +1492,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
14851492
spIkConstraintData *constraint = spSkeletonData_findIkConstraint(skeletonData,
14861493
skinPart->valueString);
14871494
if (!constraint) {
1495+
spSkin_dispose(skin);
14881496
spSkeletonData_dispose(skeletonData);
14891497
_spSkeletonJson_setError(self, root, "Skin IK constraint not found: ", skinPart->valueString);
14901498
return NULL;
@@ -1499,6 +1507,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
14991507
spPathConstraintData *constraint = spSkeletonData_findPathConstraint(skeletonData,
15001508
skinPart->valueString);
15011509
if (!constraint) {
1510+
spSkin_dispose(skin);
15021511
spSkeletonData_dispose(skeletonData);
15031512
_spSkeletonJson_setError(self, root, "Skin path constraint not found: ", skinPart->valueString);
15041513
return NULL;
@@ -1513,6 +1522,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
15131522
spTransformConstraintData *constraint = spSkeletonData_findTransformConstraint(skeletonData,
15141523
skinPart->valueString);
15151524
if (!constraint) {
1525+
spSkin_dispose(skin);
15161526
spSkeletonData_dispose(skeletonData);
15171527
_spSkeletonJson_setError(self, root, "Skin transform constraint not found: ",
15181528
skinPart->valueString);
@@ -1766,13 +1776,13 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
17661776
spSkin *skin = !linkedMesh->skin ? skeletonData->defaultSkin : spSkeletonData_findSkin(skeletonData, linkedMesh->skin);
17671777
if (!skin) {
17681778
spSkeletonData_dispose(skeletonData);
1769-
_spSkeletonJson_setError(self, 0, "Skin not found: ", linkedMesh->skin);
1779+
_spSkeletonJson_setError(self, root, "Skin not found: ", linkedMesh->skin);
17701780
return NULL;
17711781
}
17721782
parent = spSkin_getAttachment(skin, linkedMesh->slotIndex, linkedMesh->parent);
17731783
if (!parent) {
17741784
spSkeletonData_dispose(skeletonData);
1775-
_spSkeletonJson_setError(self, 0, "Parent mesh not found: ", linkedMesh->parent);
1785+
_spSkeletonJson_setError(self, root, "Parent mesh not found: ", linkedMesh->parent);
17761786
return NULL;
17771787
}
17781788
linkedMesh->mesh->super.timelineAttachment = linkedMesh->inheritTimeline ? parent
@@ -1815,6 +1825,7 @@ spSkeletonData *spSkeletonJson_readSkeletonData(spSkeletonJson *self, const char
18151825
spAnimation *animation = _spSkeletonJson_readAnimation(self, animationMap, skeletonData);
18161826
if (!animation) {
18171827
spSkeletonData_dispose(skeletonData);
1828+
_spSkeletonJson_setError(self, root, "Animation broken: ", animationMap->name);
18181829
return NULL;
18191830
}
18201831
skeletonData->animations[skeletonData->animationsCount++] = animation;
Binary file not shown.
Loading

spine-cocos2dx/spine-cocos2dx/src/spine/SkeletonRenderer.cpp

+14-15
Original file line numberDiff line numberDiff line change
@@ -460,37 +460,36 @@ namespace spine {
460460
trianglesTwoColor.indices = twoColorBatch->allocateIndices(trianglesTwoColor.indexCount);
461461
memcpy(trianglesTwoColor.indices, _clipper->getClippedTriangles().buffer(), sizeof(unsigned short) * _clipper->getClippedTriangles().size());
462462

463-
#if COCOS2D_VERSION < 0x00040000
464-
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
465-
#else
466-
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
467-
#endif
468-
469463
const float *verts = _clipper->getClippedVertices().buffer();
470464
const float *uvs = _clipper->getClippedUVs().buffer();
471465

472-
V3F_C4B_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
473-
for (int v = 0, vn = batchedTriangles->getTriangles().vertCount, vv = 0; v < vn; ++v, vv += 2, ++vertex) {
466+
V3F_C4B_C4B_T2F *vertex = trianglesTwoColor.verts;
467+
for (int v = 0, vn = trianglesTwoColor.vertCount, vv = 0; v < vn; ++v, vv += 2, ++vertex) {
474468
vertex->position.x = verts[vv];
475469
vertex->position.y = verts[vv + 1];
476470
vertex->texCoords.u = uvs[vv];
477471
vertex->texCoords.v = uvs[vv + 1];
478472
vertex->color = color4B;
479473
vertex->color2 = darkColor4B;
480474
}
481-
} else {
482475

483476
#if COCOS2D_VERSION < 0x00040000
484-
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
477+
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
485478
#else
486-
TwoColorTrianglesCommand *batchedTriangles = lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
479+
lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
487480
#endif
488-
489-
V3F_C4B_C4B_T2F *vertex = batchedTriangles->getTriangles().verts;
490-
for (int v = 0, vn = batchedTriangles->getTriangles().vertCount; v < vn; ++v, ++vertex) {
491-
vertex->color = color4B;
481+
} else {
482+
V3F_C4B_C4B_T2F* vertex = trianglesTwoColor.verts;
483+
for (int v = 0, vn = trianglesTwoColor.vertCount; v < vn; ++v, ++vertex)
484+
{
485+
vertex->color = color4B;
492486
vertex->color2 = darkColor4B;
493487
}
488+
#if COCOS2D_VERSION < 0x00040000
489+
lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture->getName(), _glProgramState, blendFunc, trianglesTwoColor, transform, transformFlags);
490+
#else
491+
lastTwoColorTrianglesCommand = twoColorBatch->addCommand(renderer, _globalZOrder, texture, _programState, blendFunc, trianglesTwoColor, transform, transformFlags);
492+
#endif
494493
}
495494
}
496495
_clipper->clipEnd(*slot);

0 commit comments

Comments
 (0)