mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-14 02:58:44 +08:00
[cpp] Fix primitive type array reading in SkeletonJson/SkeletonBinary
This commit is contained in:
parent
bd5b032619
commit
eaff42c840
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user