mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-20 09:16:01 +08:00
[c][cpp] Port of mesh whitespaces stripping. See #1232.
This commit is contained in:
parent
52f9ab8984
commit
794d7acd2f
@ -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;
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user