Преглед изворни кода

[c][cpp] Port of mesh whitespaces stripping. See #1232.

badlogic пре 6 година
родитељ
комит
794d7acd2f

+ 1 - 0
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;
 

+ 2 - 0
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:

+ 20 - 8
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;
 		}
 	}
 }

+ 1 - 1
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<float> _uvs;
         Vector<float> _regionUVs;

+ 2 - 0
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;
 }

+ 10 - 1
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;