[cpp] Fix primitive type array reading in SkeletonJson/SkeletonBinary

This commit is contained in:
Mario Zechner 2025-07-13 04:43:05 +02:00
parent bd5b032619
commit eaff42c840
5 changed files with 32 additions and 13 deletions

View File

@ -320,7 +320,7 @@ interface NestedArray {
- [ ] Update language generators to consume IR:
- [x] Replace tests/generate-java-serializer.ts with IR-based version
- [x] Sort skin entries by slot index before emission in Java
- [ ] Modify tests/generate-cpp-serializer.ts to use IR
- [x] Modify tests/generate-cpp-serializer.ts to use IR
- [ ] Create tests/generate-ts-serializer.ts using IR
- [ ] Create tests/generate-cs-serializer.ts using IR
- [ ] Language generators focus purely on syntax transformation

View File

@ -52,8 +52,16 @@ namespace spine {
static const int JSON_ARRAY;
static const int JSON_OBJECT;
template <typename T>
static bool asArray(Json *value, Array<T> &array) {
static bool asFloatArray(Json *value, Array<float> &array) {
if (value == NULL) return false;
array.setSize(value->_size, 0);
Json *vertex = value->_child;
for (int i = 0; vertex; vertex = vertex->_next, i++)
array[i] = vertex->_valueFloat;
return true;
}
static bool asIntArray(Json *value, Array<int> &array) {
if (value == NULL) return false;
array.setSize(value->_size, 0);
Json *vertex = value->_child;
@ -62,6 +70,15 @@ namespace spine {
return true;
}
static bool asUnsignedShortArray(Json *value, Array<unsigned short> &array) {
if (value == NULL) return false;
array.setSize(value->_size, 0);
Json *vertex = value->_child;
for (int i = 0; vertex; vertex = vertex->_next, i++)
array[i] = (unsigned short)vertex->_valueInt;
return true;
}
/* Get item "string" from object. Case insensitive. */
static Json *getItem(Json *object, const char *string);

View File

@ -243,7 +243,7 @@ namespace spine {
void readFloatArray(DataInput &input, int n, float scale, Array<float> &array);
void readShortArray(DataInput &input, Array<unsigned short> &array, int n);
void readUnsignedShortArray(DataInput &input, Array<unsigned short> &array, int n);
Animation *readAnimation(DataInput &input, const String &name, SkeletonData &skeletonData);

View File

@ -642,12 +642,12 @@ Attachment *SkeletonBinary::readAttachment(DataInput &input, Skin &skin, int slo
Array<float> uvs;
readFloatArray(input, verticesLength, 1, uvs);
Array<unsigned short> triangles;
readShortArray(input, triangles, (verticesLength - hullLength - 2) * 3);
readUnsignedShortArray(input, triangles, (verticesLength - hullLength - 2) * 3);
Array<unsigned short> edges;
float width = 0, height = 0;
if (nonessential) {
readShortArray(input, edges, input.readInt(true));
readUnsignedShortArray(input, edges, input.readInt(true));
width = input.readFloat();
height = input.readFloat();
}
@ -798,10 +798,10 @@ void SkeletonBinary::readFloatArray(DataInput &input, int n, float scale, Array<
}
}
void SkeletonBinary::readShortArray(DataInput &input, Array<unsigned short> &array, int n) {
void SkeletonBinary::readUnsignedShortArray(DataInput &input, Array<unsigned short> &array, int n) {
array.setSize(n, 0);
for (int i = 0; i < n; ++i) {
array[i] = (short) input.readInt(true);
array[i] = (unsigned short) input.readInt(true);
}
}

View File

@ -679,17 +679,17 @@ Attachment *SkeletonJson::readAttachment(Json *map, Skin *skin, int slotIndex, c
}
Array<float> uvs;
if (!Json::asArray(Json::getItem(map, "uvs"), uvs)) return NULL;
if (!Json::asFloatArray(Json::getItem(map, "uvs"), uvs)) return NULL;
readVertices(map, mesh, uvs.size());
Array<unsigned short> triangles;
if (!Json::asArray(Json::getItem(map, "triangles"), triangles)) return NULL;
if (!Json::asUnsignedShortArray(Json::getItem(map, "triangles"), triangles)) return NULL;
mesh->_triangles.clearAndAddAll(triangles);
mesh->_regionUVs.clearAndAddAll(uvs);
if (mesh->_region != NULL) mesh->updateRegion();
if (Json::getInt(map, "hull", 0)) mesh->setHullLength(Json::getInt(map, "hull", 0) << 1);
Array<unsigned short> edges;
Json::asArray(Json::getItem(map, "edges"), edges);
Json::asUnsignedShortArray(Json::getItem(map, "edges"), edges);
if (edges.size() > 0) mesh->_edges.clearAndAddAll(edges);
return mesh;
}
@ -702,7 +702,7 @@ Attachment *SkeletonJson::readAttachment(Json *map, Skin *skin, int slotIndex, c
int vertexCount = Json::getInt(map, "vertexCount", 0);
readVertices(map, path, vertexCount << 1);
if (!Json::asArray(Json::getItem(map, "lengths"), path->_lengths)) return NULL;
if (!Json::asFloatArray(Json::getItem(map, "lengths"), path->_lengths)) return NULL;
for (int i = 0; i < (int) path->_lengths.size(); i++)
path->_lengths[i] *= scale;
@ -755,7 +755,9 @@ Sequence *SkeletonJson::readSequence(Json *item) {
void SkeletonJson::readVertices(Json *map, VertexAttachment *attachment, size_t verticesLength) {
attachment->setWorldVerticesLength(verticesLength);
Array<float> vertices;
if (!Json::asArray(Json::getItem(map, "vertices"), vertices)) return;
if (!Json::asFloatArray(Json::getItem(map, "vertices"), vertices)) {
return;
}
if (verticesLength == vertices.size()) {
if (_scale != 1) {
for (int i = 0; i < (int) vertices.size(); ++i)