123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /******************************************************************************
- * Spine Runtimes License Agreement
- * Last updated January 1, 2020. Replaces all prior versions.
- *
- * Copyright (c) 2013-2020, Esoteric Software LLC
- *
- * Integration of the Spine Runtimes into software or otherwise creating
- * derivative works of the Spine Runtimes is permitted under the terms and
- * conditions of Section 2 of the Spine Editor License Agreement:
- * http://esotericsoftware.com/spine-editor-license
- *
- * Otherwise, it is permitted to integrate the Spine Runtimes into software
- * or otherwise create derivative works of the Spine Runtimes (collectively,
- * "Products"), provided that each user of the Products must obtain their own
- * Spine Editor license and redistribution of the Products in any form must
- * include this license and copyright notice.
- *
- * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
- * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *****************************************************************************/
- #include <spine/spine-cocos2dx.h>
- #include <spine/extension.h>
- #include <spine/AttachmentVertices.h>
- USING_NS_CC;
- using namespace spine;
- static void deleteAttachmentVertices (void* vertices) {
- delete (AttachmentVertices *) vertices;
- }
- static unsigned short quadTriangles[6] = {0, 1, 2, 2, 3, 0};
- static void setAttachmentVertices(RegionAttachment* attachment) {
- AtlasRegion* region = (AtlasRegion*)attachment->getRendererObject();
- AttachmentVertices* attachmentVertices = new AttachmentVertices((Texture2D*)region->page->getRendererObject(), 4, quadTriangles, 6);
- V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
- for (int i = 0, ii = 0; i < 4; ++i, ii += 2) {
- vertices[i].texCoords.u = attachment->getUVs()[ii];
- vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
- }
- attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
- }
- static void setAttachmentVertices(MeshAttachment* attachment) {
- AtlasRegion* region = (AtlasRegion*)attachment->getRendererObject();
- AttachmentVertices* attachmentVertices = new AttachmentVertices((Texture2D*)region->page->getRendererObject(),
- attachment->getWorldVerticesLength() >> 1, attachment->getTriangles().buffer(), attachment->getTriangles().size());
- V3F_C4B_T2F* vertices = attachmentVertices->_triangles->verts;
- for (int i = 0, ii = 0, nn = attachment->getWorldVerticesLength(); ii < nn; ++i, ii += 2) {
- vertices[i].texCoords.u = attachment->getUVs()[ii];
- vertices[i].texCoords.v = attachment->getUVs()[ii + 1];
- }
- attachment->setRendererObject(attachmentVertices, deleteAttachmentVertices);
- }
- Cocos2dAtlasAttachmentLoader::Cocos2dAtlasAttachmentLoader(Atlas* atlas): AtlasAttachmentLoader(atlas) {
- }
- Cocos2dAtlasAttachmentLoader::~Cocos2dAtlasAttachmentLoader() { }
- void Cocos2dAtlasAttachmentLoader::configureAttachment(Attachment* attachment) {
- if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) {
- setAttachmentVertices((RegionAttachment*)attachment);
- } else if (attachment->getRTTI().isExactly(MeshAttachment::rtti)) {
- setAttachmentVertices((MeshAttachment*)attachment);
- }
- }
- #if COCOS2D_VERSION >= 0x0040000
- backend::SamplerAddressMode wrap (TextureWrap wrap) {
- return wrap == TextureWrap_ClampToEdge ? backend::SamplerAddressMode::CLAMP_TO_EDGE : backend::SamplerAddressMode::REPEAT;
- }
- backend::SamplerFilter filter (TextureFilter filter) {
- switch (filter) {
- case TextureFilter_Unknown:
- break;
- case TextureFilter_Nearest:
- return backend::SamplerFilter::NEAREST;
- case TextureFilter_Linear:
- return backend::SamplerFilter::LINEAR;
- case TextureFilter_MipMap:
- return backend::SamplerFilter::LINEAR;
- case TextureFilter_MipMapNearestNearest:
- return backend::SamplerFilter::NEAREST;
- case TextureFilter_MipMapLinearNearest:
- return backend::SamplerFilter::NEAREST;
- case TextureFilter_MipMapNearestLinear:
- return backend::SamplerFilter::LINEAR;
- case TextureFilter_MipMapLinearLinear:
- return backend::SamplerFilter::LINEAR;
- }
- return backend::SamplerFilter::LINEAR;
- }
- #else
- GLuint wrap (TextureWrap wrap) {
- return wrap == TextureWrap_ClampToEdge ? GL_CLAMP_TO_EDGE : GL_REPEAT;
- }
- GLuint filter (TextureFilter filter) {
- switch (filter) {
- case TextureFilter_Unknown:
- break;
- case TextureFilter_Nearest:
- return GL_NEAREST;
- case TextureFilter_Linear:
- return GL_LINEAR;
- case TextureFilter_MipMap:
- return GL_LINEAR_MIPMAP_LINEAR;
- case TextureFilter_MipMapNearestNearest:
- return GL_NEAREST_MIPMAP_NEAREST;
- case TextureFilter_MipMapLinearNearest:
- return GL_LINEAR_MIPMAP_NEAREST;
- case TextureFilter_MipMapNearestLinear:
- return GL_NEAREST_MIPMAP_LINEAR;
- case TextureFilter_MipMapLinearLinear:
- return GL_LINEAR_MIPMAP_LINEAR;
- }
- return GL_LINEAR;
- }
- #endif
- Cocos2dTextureLoader::Cocos2dTextureLoader() : TextureLoader() { }
- Cocos2dTextureLoader::~Cocos2dTextureLoader() { }
- void Cocos2dTextureLoader::load(AtlasPage& page, const spine::String& path) {
- Texture2D* texture = Director::getInstance()->getTextureCache()->addImage(path.buffer());
- CCASSERT(texture != nullptr, "Invalid image");
- if (texture) {
- texture->retain();
- #if COCOS2D_VERSION >= 0x0040000
- Texture2D::TexParams textureParams(filter(page.minFilter), filter(page.magFilter), wrap(page.uWrap), wrap(page.vWrap));
- #else
- Texture2D::TexParams textureParams = {filter(page.minFilter), filter(page.magFilter), wrap(page.uWrap), wrap(page.vWrap)};
- #endif
- texture->setTexParameters(textureParams);
- page.setRendererObject(texture);
- page.width = texture->getPixelsWide();
- page.height = texture->getPixelsHigh();
- }
- }
- void Cocos2dTextureLoader::unload(void* texture) {
- if (texture) {
- ((Texture2D*)texture)->release();
- }
- }
- Cocos2dExtension::Cocos2dExtension() : DefaultSpineExtension() { }
- Cocos2dExtension::~Cocos2dExtension() { }
- char *Cocos2dExtension::_readFile(const spine::String &path, int *length) {
- Data data = FileUtils::getInstance()->getDataFromFile(FileUtils::getInstance()->fullPathForFilename(path.buffer()));
- if (data.isNull()) return nullptr;
- // avoid buffer overflow (int is shorter than ssize_t in certain platforms)
- #if COCOS2D_VERSION >= 0x00031200
- ssize_t tmpLen;
- char *ret = (char*)data.takeBuffer(&tmpLen);
- *length = static_cast<int>(tmpLen);
- return ret;
- #else
- *length = static_cast<int>(data.getSize());
- char* bytes = MALLOC(char, *length);
- memcpy(bytes, data.getBytes(), *length);
- return bytes;
- #endif
- }
- void Cocos2dExtension::createSpriteFrame(Atlas* atlas){
- auto _regions = atlas->getRegions();
- auto len = _regions.size();
- if(len==0)return;
-
- for (int i = 0;i<len;i++) {
- auto region = _regions[i];
- float width = region->originalWidth;
- float height = region->originalHeight;
- float wh = region->width;
- float sh = region->height;
- if(region->rotate){
- // std::swap(width, height);
- std::swap(wh, sh);
- }
- Rect rect = Rect(region->x, region->y, wh, sh);
- Vec2 offset = Vec2(region->offsetX,region->offsetY);
-
- Size originSize = Size(width,height);
- String path = region->page->name;
- auto frame = SpriteFrame::create(path.buffer(), rect, region->rotate, offset, originSize);
- std::string name = region->name.buffer();
- name.append(".png");
- SpriteFrameCache::getInstance()->addSpriteFrame(frame,name);
- }
-
- }
- SpineExtension *spine::getDefaultExtension () {
- return new Cocos2dExtension();
- }
|