mirror of https://github.com/axmolengine/axmol.git
extend SpriteFrameCache to load PolygonInfo from plist file
This commit is contained in:
parent
4a2edc8ce8
commit
ac24612e98
|
@ -1029,6 +1029,11 @@ void Sprite::setSpriteFrame(SpriteFrame *spriteFrame)
|
||||||
// update rect
|
// update rect
|
||||||
_rectRotated = spriteFrame->isRotated();
|
_rectRotated = spriteFrame->isRotated();
|
||||||
setTextureRect(spriteFrame->getRect(), _rectRotated, spriteFrame->getOriginalSize());
|
setTextureRect(spriteFrame->getRect(), _rectRotated, spriteFrame->getOriginalSize());
|
||||||
|
|
||||||
|
if(spriteFrame->hasPolygonInfo())
|
||||||
|
{
|
||||||
|
_polyInfo = spriteFrame->getPolygonInfo();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sprite::setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex)
|
void Sprite::setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex)
|
||||||
|
|
|
@ -195,4 +195,19 @@ Texture2D* SpriteFrame::getTexture()
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpriteFrame::setPolygonInfo(const PolygonInfo &polygonInfo)
|
||||||
|
{
|
||||||
|
_polygonInfo = polygonInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PolygonInfo &SpriteFrame::getPolygonInfo() const
|
||||||
|
{
|
||||||
|
return _polygonInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SpriteFrame::hasPolygonInfo() const
|
||||||
|
{
|
||||||
|
return _polygonInfo.triangles.vertCount != 0;
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -29,6 +29,7 @@ THE SOFTWARE.
|
||||||
#define __SPRITE_CCSPRITE_FRAME_H__
|
#define __SPRITE_CCSPRITE_FRAME_H__
|
||||||
|
|
||||||
#include "2d/CCNode.h"
|
#include "2d/CCNode.h"
|
||||||
|
#include "2d/CCAutoPolygon.h"
|
||||||
#include "base/CCRef.h"
|
#include "base/CCRef.h"
|
||||||
#include "math/CCGeometry.h"
|
#include "math/CCGeometry.h"
|
||||||
|
|
||||||
|
@ -187,7 +188,25 @@ public:
|
||||||
|
|
||||||
// Overrides
|
// Overrides
|
||||||
virtual SpriteFrame *clone() const override;
|
virtual SpriteFrame *clone() const override;
|
||||||
|
|
||||||
|
/** Set the polygon info for polygon mesh sprites
|
||||||
|
*
|
||||||
|
* @param polygonInfo triangle mesh of teh sprite
|
||||||
|
*/
|
||||||
|
void setPolygonInfo(const PolygonInfo &polygonInfo);
|
||||||
|
|
||||||
|
/** Get the polygonInfo for this sprite
|
||||||
|
*
|
||||||
|
* @return polygonInfo structure
|
||||||
|
*/
|
||||||
|
const PolygonInfo &getPolygonInfo() const;
|
||||||
|
|
||||||
|
/** Check if sprite frame is a polygon sprite
|
||||||
|
*
|
||||||
|
* @return true if polygonInfo is available
|
||||||
|
*/
|
||||||
|
bool hasPolygonInfo() const;
|
||||||
|
|
||||||
CC_CONSTRUCTOR_ACCESS:
|
CC_CONSTRUCTOR_ACCESS:
|
||||||
/**
|
/**
|
||||||
* @lua NA
|
* @lua NA
|
||||||
|
@ -231,6 +250,7 @@ protected:
|
||||||
Size _originalSizeInPixels;
|
Size _originalSizeInPixels;
|
||||||
Texture2D *_texture;
|
Texture2D *_texture;
|
||||||
std::string _textureFilename;
|
std::string _textureFilename;
|
||||||
|
PolygonInfo _polygonInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
// end of _2d group
|
// end of _2d group
|
||||||
|
|
|
@ -33,6 +33,7 @@ THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
#include "2d/CCSprite.h"
|
#include "2d/CCSprite.h"
|
||||||
|
#include "2d/CCAutoPolygon.h"
|
||||||
#include "platform/CCFileUtils.h"
|
#include "platform/CCFileUtils.h"
|
||||||
#include "base/CCNS.h"
|
#include "base/CCNS.h"
|
||||||
#include "base/ccMacros.h"
|
#include "base/ccMacros.h"
|
||||||
|
@ -79,6 +80,63 @@ SpriteFrameCache::~SpriteFrameCache()
|
||||||
CC_SAFE_DELETE(_loadedFileNames);
|
CC_SAFE_DELETE(_loadedFileNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpriteFrameCache::parseIntegerList(const std::string string, std::vector<int> &res)
|
||||||
|
{
|
||||||
|
std::string delim(" ");
|
||||||
|
|
||||||
|
size_t n = std::count(string.begin(), string.end(), ' ');
|
||||||
|
res.resize(n+1);
|
||||||
|
|
||||||
|
size_t start = 0U;
|
||||||
|
size_t end = string.find(delim);
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
while (end != std::string::npos)
|
||||||
|
{
|
||||||
|
res[i++] = std::stoi(string.substr(start, end - start));
|
||||||
|
start = end + delim.length();
|
||||||
|
end = string.find(delim, start);
|
||||||
|
}
|
||||||
|
|
||||||
|
res[i] = std::stoi(string.substr(start, end));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpriteFrameCache::initializePolygonInfo(const Size &textureSize,
|
||||||
|
const Size &spriteSize,
|
||||||
|
const std::vector<int> &vertices,
|
||||||
|
const std::vector<int> &verticesUV,
|
||||||
|
const std::vector<int> &triangleIndices,
|
||||||
|
PolygonInfo &info)
|
||||||
|
{
|
||||||
|
size_t vertexCount = vertices.size();
|
||||||
|
size_t indexCount = triangleIndices.size();
|
||||||
|
|
||||||
|
float scaleFactor = CC_CONTENT_SCALE_FACTOR();
|
||||||
|
|
||||||
|
V3F_C4B_T2F *vertexData = new V3F_C4B_T2F[vertexCount];
|
||||||
|
for (size_t i = 0; i < vertexCount/2; i++)
|
||||||
|
{
|
||||||
|
vertexData[i].colors = Color4B::WHITE;
|
||||||
|
vertexData[i].vertices = Vec3(vertices[i*2] / scaleFactor,
|
||||||
|
(spriteSize.height - vertices[i*2+1]) / scaleFactor,
|
||||||
|
0);
|
||||||
|
vertexData[i].texCoords = Tex2F(verticesUV[i*2] / textureSize.width,
|
||||||
|
verticesUV[i*2+1] / textureSize.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short *indexData = new unsigned short[indexCount];
|
||||||
|
for (size_t i = 0; i < indexCount; i++)
|
||||||
|
{
|
||||||
|
indexData[i] = static_cast<unsigned short>(triangleIndices[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
info.triangles.vertCount = vertexCount;
|
||||||
|
info.triangles.verts = vertexData;
|
||||||
|
info.triangles.indexCount = indexCount;
|
||||||
|
info.triangles.indices = indexData;
|
||||||
|
info.rect = Rect(0, 0, spriteSize.width, spriteSize.height);
|
||||||
|
}
|
||||||
|
|
||||||
void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dictionary, Texture2D* texture)
|
void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dictionary, Texture2D* texture)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -88,17 +146,26 @@ void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dictionary, Textu
|
||||||
ZWTCoordinatesFormatOptionXML1_0 = 1, // Desktop Version 0.0 - 0.4b
|
ZWTCoordinatesFormatOptionXML1_0 = 1, // Desktop Version 0.0 - 0.4b
|
||||||
ZWTCoordinatesFormatOptionXML1_1 = 2, // Desktop Version 1.0.0 - 1.0.1
|
ZWTCoordinatesFormatOptionXML1_1 = 2, // Desktop Version 1.0.0 - 1.0.1
|
||||||
ZWTCoordinatesFormatOptionXML1_2 = 3, // Desktop Version 1.0.2+
|
ZWTCoordinatesFormatOptionXML1_2 = 3, // Desktop Version 1.0.2+
|
||||||
|
|
||||||
|
Version 3 with TexturePacker 4.0 polygon mesh packing
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ValueMap& framesDict = dictionary["frames"].asValueMap();
|
ValueMap& framesDict = dictionary["frames"].asValueMap();
|
||||||
int format = 0;
|
int format = 0;
|
||||||
|
|
||||||
|
Size textureSize;
|
||||||
|
|
||||||
// get the format
|
// get the format
|
||||||
if (dictionary.find("metadata") != dictionary.end())
|
if (dictionary.find("metadata") != dictionary.end())
|
||||||
{
|
{
|
||||||
ValueMap& metadataDict = dictionary["metadata"].asValueMap();
|
ValueMap& metadataDict = dictionary["metadata"].asValueMap();
|
||||||
format = metadataDict["format"].asInt();
|
format = metadataDict["format"].asInt();
|
||||||
|
|
||||||
|
if(metadataDict.find("size") != metadataDict.end())
|
||||||
|
{
|
||||||
|
textureSize = SizeFromString(metadataDict["size"].asString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check the format
|
// check the format
|
||||||
|
@ -194,6 +261,20 @@ void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dictionary, Textu
|
||||||
textureRotated,
|
textureRotated,
|
||||||
spriteOffset,
|
spriteOffset,
|
||||||
spriteSourceSize);
|
spriteSourceSize);
|
||||||
|
|
||||||
|
if(frameDict.find("vertices") != frameDict.end())
|
||||||
|
{
|
||||||
|
std::vector<int> vertices;
|
||||||
|
parseIntegerList(frameDict["vertices"].asString(), vertices);
|
||||||
|
std::vector<int> verticesUV;
|
||||||
|
parseIntegerList(frameDict["verticesUV"].asString(), verticesUV);
|
||||||
|
std::vector<int> indices;
|
||||||
|
parseIntegerList(frameDict["triangles"].asString(), indices);
|
||||||
|
|
||||||
|
PolygonInfo info;
|
||||||
|
initializePolygonInfo(textureSize, spriteSourceSize, vertices, verticesUV, indices, info);
|
||||||
|
spriteFrame->setPolygonInfo(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool flag = NinePatchImageParser::isNinePatchImage(spriteFrameName);
|
bool flag = NinePatchImageParser::isNinePatchImage(spriteFrameName);
|
||||||
|
|
|
@ -45,6 +45,7 @@ NS_CC_BEGIN
|
||||||
|
|
||||||
class Sprite;
|
class Sprite;
|
||||||
class Texture2D;
|
class Texture2D;
|
||||||
|
class PolygonInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup _2d
|
* @addtogroup _2d
|
||||||
|
@ -223,6 +224,16 @@ protected:
|
||||||
*/
|
*/
|
||||||
void removeSpriteFramesFromDictionary(ValueMap& dictionary);
|
void removeSpriteFramesFromDictionary(ValueMap& dictionary);
|
||||||
|
|
||||||
|
/** Parses list of space-separated integers */
|
||||||
|
void parseIntegerList(const std::string string, std::vector<int> &res);
|
||||||
|
|
||||||
|
/** Configures PolygonInfo class with the passed sizes + triangles */
|
||||||
|
void initializePolygonInfo(const Size &textureSize,
|
||||||
|
const Size &spriteSize,
|
||||||
|
const std::vector<int> &vertices,
|
||||||
|
const std::vector<int> &verticesUV,
|
||||||
|
const std::vector<int> &triangleIndices,
|
||||||
|
PolygonInfo &polygonInfo);
|
||||||
|
|
||||||
Map<std::string, SpriteFrame*> _spriteFrames;
|
Map<std::string, SpriteFrame*> _spriteFrames;
|
||||||
ValueMap _spriteFramesAliases;
|
ValueMap _spriteFramesAliases;
|
||||||
|
|
Loading…
Reference in New Issue