diff --git a/spine-c/spine-c/include/spine/MeshAttachment.h b/spine-c/spine-c/include/spine/MeshAttachment.h index 2876abfd5..94c83752c 100644 --- a/spine-c/spine-c/include/spine/MeshAttachment.h +++ b/spine-c/spine-c/include/spine/MeshAttachment.h @@ -51,6 +51,7 @@ struct spMeshAttachment { int regionOriginalWidth, regionOriginalHeight; /* Unrotated, unstripped pixel size. */ float regionU, regionV, regionU2, regionV2; int/*bool*/regionRotate; + float regionTextureWidth, regionTextureHeight; const char* path; diff --git a/spine-c/spine-c/src/spine/AtlasAttachmentLoader.c b/spine-c/spine-c/src/spine/AtlasAttachmentLoader.c index c4a613709..64d6f36a9 100644 --- a/spine-c/spine-c/src/spine/AtlasAttachmentLoader.c +++ b/spine-c/spine-c/src/spine/AtlasAttachmentLoader.c @@ -74,6 +74,8 @@ spAttachment* _spAtlasAttachmentLoader_createAttachment (spAttachmentLoader* loa attachment->regionHeight = region->height; attachment->regionOriginalWidth = region->originalWidth; attachment->regionOriginalHeight = region->originalHeight; + attachment->regionTextureWidth = region->page->width; + attachment->regionTextureHeight = region->page->height; return SUPER(SUPER(attachment)); } case SP_ATTACHMENT_BOUNDING_BOX: diff --git a/spine-c/spine-c/src/spine/MeshAttachment.c b/spine-c/spine-c/src/spine/MeshAttachment.c index b7a49bfdc..b6ac37784 100644 --- a/spine-c/spine-c/src/spine/MeshAttachment.c +++ b/spine-c/spine-c/src/spine/MeshAttachment.c @@ -54,20 +54,32 @@ spMeshAttachment* spMeshAttachment_create (const char* name) { } void spMeshAttachment_updateUVs (spMeshAttachment* self) { - int i; - float width = self->regionU2 - self->regionU, height = self->regionV2 - self->regionV; + int i, n; + float width, height; int verticesLength = SUPER(self)->worldVerticesLength; FREE(self->uvs); self->uvs = MALLOC(float, verticesLength); + + float textureWidth = self->regionTextureWidth; + float textureHeight = self->regionTextureHeight; if (self->regionRotate) { - for (i = 0; i < verticesLength; i += 2) { - self->uvs[i] = self->regionU + self->regionUVs[i + 1] * width; - self->uvs[i + 1] = self->regionV + height - self->regionUVs[i] * height; + float u = self->regionU - (self->regionOriginalHeight - self->regionOffsetY - self->regionHeight) / textureWidth; + float v = self->regionV - (self->regionOriginalWidth - self->regionOffsetX - self->regionWidth) / textureHeight; + width = self->regionOriginalHeight / textureWidth; + height = self->regionOriginalWidth / textureHeight; + for (i = 0, n = verticesLength; i < n; i += 2) { + self->uvs[i] = u + self->regionUVs[i + 1] * width; + self->uvs[i + 1] = v + height - self->regionUVs[i] * height; } + return; } else { - for (i = 0; i < verticesLength; i += 2) { - self->uvs[i] = self->regionU + self->regionUVs[i] * width; - self->uvs[i + 1] = self->regionV + self->regionUVs[i + 1] * height; + float u = self->regionU - self->regionOffsetX / textureWidth; + float v = self->regionV - (self->regionOriginalHeight - self->regionOffsetY - self->regionHeight) / textureHeight; + width = self->regionOriginalWidth / textureWidth; + height = self->regionOriginalHeight / textureHeight; + for (i = 0, n = verticesLength; i < n; i += 2) { + self->uvs[i] = u + self->regionUVs[i] * width; + self->uvs[i + 1] = v + self->regionUVs[i + 1] * height; } } } diff --git a/spine-cpp/spine-cpp/include/spine/MeshAttachment.h b/spine-cpp/spine-cpp/include/spine/MeshAttachment.h index 8f42c5518..e26b61c52 100644 --- a/spine-cpp/spine-cpp/include/spine/MeshAttachment.h +++ b/spine-cpp/spine-cpp/include/spine/MeshAttachment.h @@ -119,7 +119,7 @@ namespace spine { void setHeight(float inValue); private: - float _regionOffsetX, _regionOffsetY, _regionWidth, _regionHeight, _regionOriginalWidth, _regionOriginalHeight; + float _regionOffsetX, _regionOffsetY, _regionWidth, _regionHeight, _regionOriginalWidth, _regionOriginalHeight, _regionTextureWidth, _regionTextureHeight; MeshAttachment* _parentMesh; Vector _uvs; Vector _regionUVs; diff --git a/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp b/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp index ad6c3c519..6e77710b4 100644 --- a/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp +++ b/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp @@ -94,6 +94,8 @@ MeshAttachment *AtlasAttachmentLoader::newMeshAttachment(Skin &skin, const Strin attachment._regionHeight = (float)region.height; attachment._regionOriginalWidth = (float)region.originalWidth; attachment._regionOriginalHeight = (float)region.originalHeight; + attachment._regionTextureWidth = (float)region.page->width; + attachment._regionTextureHeight = (float)region.page->height; return attachmentP; } diff --git a/spine-cpp/spine-cpp/src/spine/MeshAttachment.cpp b/spine-cpp/spine-cpp/src/spine/MeshAttachment.cpp index 74ff78c07..a95d08f82 100644 --- a/spine-cpp/spine-cpp/src/spine/MeshAttachment.cpp +++ b/spine-cpp/spine-cpp/src/spine/MeshAttachment.cpp @@ -46,6 +46,8 @@ MeshAttachment::MeshAttachment(const String &name) : VertexAttachment(name), Has _regionHeight(0), _regionOriginalWidth(0), _regionOriginalHeight(0), + _regionTextureWidth(0), + _regionTextureHeight(0), _parentMesh(NULL), _path(), _regionU(0), @@ -63,17 +65,24 @@ MeshAttachment::MeshAttachment(const String &name) : VertexAttachment(name), Has MeshAttachment::~MeshAttachment() {} void MeshAttachment::updateUVs() { - float u = _regionU, v = _regionV, width = _regionU2 - _regionU, height = _regionV2 - _regionV; if (_uvs.size() != _regionUVs.size()) { _uvs.setSize(_regionUVs.size(), 0); } if (_regionRotate) { + float u = _regionU - (_regionOriginalHeight - _regionOffsetY - _regionHeight) / _regionTextureWidth; + float v = _regionV - (_regionOriginalWidth - _regionOffsetX - _regionWidth) / _regionTextureHeight; + float width = _regionOriginalHeight / _regionTextureWidth; + float height = _regionOriginalWidth / _regionTextureHeight; for (size_t i = 0, n = _uvs.size(); i < n; i += 2) { _uvs[i] = u + _regionUVs[i + 1] * width; _uvs[i + 1] = v + height - _regionUVs[i] * height; } } else { + float u = _regionU - _regionOffsetX / _regionTextureWidth; + float v = _regionV - (_regionOriginalHeight - _regionOffsetY - _regionHeight) / _regionTextureHeight; + float width = _regionOriginalWidth / _regionTextureWidth; + float height = _regionOriginalHeight / _regionTextureHeight; for (size_t i = 0, n = _uvs.size(); i < n; i += 2) { _uvs[i] = u + _regionUVs[i] * width; _uvs[i + 1] = v + _regionUVs[i + 1] * height;