From c40a2a33016b0321d356d88e1c5be33e6b6217c4 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Thu, 12 Nov 2015 09:49:49 +0800 Subject: [PATCH] Combine Studio change for 2d components --- cocos/2d/CCCamera.cpp | 7 + cocos/2d/CCCamera.h | 12 +- cocos/2d/CCCameraBackgroundBrush.cpp | 30 +++++ cocos/2d/CCCameraBackgroundBrush.h | 25 +++- cocos/2d/CCClippingRectangleNode.cpp | 7 + cocos/2d/CCDrawNode.cpp | 40 +++++- cocos/2d/CCDrawNode.h | 14 +- cocos/2d/CCFontAtlasCache.cpp | 40 ++++++ cocos/2d/CCFontAtlasCache.h | 7 +- cocos/2d/CCFontFNT.cpp | 22 ++++ cocos/2d/CCFontFNT.h | 6 +- cocos/2d/CCFontFreeType.cpp | 14 ++ cocos/2d/CCFontFreeType.h | 5 + cocos/2d/CCNode.h | 4 + cocos/2d/CCParticleSystem.cpp | 9 ++ cocos/2d/CCParticleSystem.h | 6 +- cocos/2d/CCScene.h | 4 + cocos/2d/CCSprite.cpp | 33 +++++ cocos/2d/CCSprite.h | 13 +- cocos/2d/CCSpriteFrameCache.cpp | 186 ++++++++++++++++++++++++++- cocos/2d/CCSpriteFrameCache.h | 8 ++ cocos/2d/CCTMXTiledMap.cpp | 48 +++++-- cocos/2d/CCTMXTiledMap.h | 13 +- cocos/2d/CCTMXXMLParser.cpp | 7 +- cocos/2d/CCTMXXMLParser.h | 10 ++ cocos/2d/CocosStudioExtension.cpp | 13 ++ cocos/2d/CocosStudioExtension.h | 44 +++++++ 27 files changed, 605 insertions(+), 22 deletions(-) create mode 100644 cocos/2d/CocosStudioExtension.cpp create mode 100644 cocos/2d/CocosStudioExtension.h diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index bf6ffc9b8f..5f81778007 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -481,4 +481,11 @@ void Camera::setBackgroundBrush(CameraBackgroundBrush* clearBrush) _clearBrush = clearBrush; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +bool Camera::isBrushValid() +{ + return _clearBrush != nullptr && _clearBrush->isValid(); +} +#endif + NS_CC_END diff --git a/cocos/2d/CCCamera.h b/cocos/2d/CCCamera.h index 8aa01a7c52..2a2bcf9a19 100644 --- a/cocos/2d/CCCamera.h +++ b/cocos/2d/CCCamera.h @@ -58,6 +58,12 @@ enum class CameraFlag USER6 = 1 << 6, USER7 = 1 << 7, USER8 = 1 << 8, +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + SkyBox = 1 << 10, + DEFAULTCAMERA = DEFAULT | SkyBox, + PIXEL = 1 << 13, + FRONT = 1 << 14, +#endif }; /** * Defines a camera . @@ -271,7 +277,11 @@ public: CameraBackgroundBrush* getBackgroundBrush() const { return _clearBrush; } virtual void visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags) override; - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + bool isBrushValid(); +#endif + CC_CONSTRUCTOR_ACCESS: Camera(); ~Camera(); diff --git a/cocos/2d/CCCameraBackgroundBrush.cpp b/cocos/2d/CCCameraBackgroundBrush.cpp index 756d773324..815a34f030 100644 --- a/cocos/2d/CCCameraBackgroundBrush.cpp +++ b/cocos/2d/CCCameraBackgroundBrush.cpp @@ -232,6 +232,10 @@ CameraBackgroundSkyBoxBrush::CameraBackgroundSkyBoxBrush() , _vertexBuffer(0) , _indexBuffer(0) , _texture(nullptr) +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +, _actived(false) +, _textureValid(false) +#endif { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, @@ -296,6 +300,11 @@ CameraBackgroundSkyBoxBrush* CameraBackgroundSkyBoxBrush::create() void CameraBackgroundSkyBoxBrush::drawBackground(Camera* camera) { +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + if (!_actived) + return; +#endif + Mat4 cameraModelMat = camera->getNodeToWorldTransform(); Vec4 color(1.f, 1.f, 1.f, 1.f); @@ -427,4 +436,25 @@ void CameraBackgroundSkyBoxBrush::setTexture(TextureCube* texture) _glProgramState->setUniformTexture("u_Env", _texture); } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +bool CameraBackgroundSkyBoxBrush::isActived() +{ + return _actived; +} +void CameraBackgroundSkyBoxBrush::setActived(bool actived) +{ + _actived = actived; +} + +void CameraBackgroundSkyBoxBrush::setTextureValid(bool valid) +{ + _textureValid = valid; +} + +bool CameraBackgroundSkyBoxBrush::isValid() +{ + return _actived; +} +#endif + NS_CC_END diff --git a/cocos/2d/CCCameraBackgroundBrush.h b/cocos/2d/CCCameraBackgroundBrush.h index 74a461c03f..2eb4d6d782 100644 --- a/cocos/2d/CCCameraBackgroundBrush.h +++ b/cocos/2d/CCCameraBackgroundBrush.h @@ -103,8 +103,12 @@ public: * draw the background */ virtual void drawBackground(Camera* camera) {} - -CC_CONSTRUCTOR_ACCESS: + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + virtual bool isValid() { return true; } +#endif + +CC_CONSTRUCTOR_ACCESS : CameraBackgroundBrush(); virtual ~CameraBackgroundBrush(); @@ -236,8 +240,15 @@ public: * Draw background */ virtual void drawBackground(Camera* camera) override; - -CC_CONSTRUCTOR_ACCESS: + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + bool isActived(); + void setActived(bool actived); + virtual void setTextureValid(bool valid); + virtual bool isValid()override; +#endif + +CC_CONSTRUCTOR_ACCESS : CameraBackgroundSkyBoxBrush(); virtual ~CameraBackgroundSkyBoxBrush(); @@ -258,6 +269,12 @@ protected: #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) EventListenerCustom* _backToForegroundListener; #endif + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +private: + bool _actived; + bool _textureValid; +#endif }; NS_CC_END diff --git a/cocos/2d/CCClippingRectangleNode.cpp b/cocos/2d/CCClippingRectangleNode.cpp index eb3476858b..eb418db97a 100644 --- a/cocos/2d/CCClippingRectangleNode.cpp +++ b/cocos/2d/CCClippingRectangleNode.cpp @@ -53,10 +53,17 @@ void ClippingRectangleNode::onBeforeVisitScissor() const Point pos = convertToWorldSpace(Point(_clippingRegion.origin.x, _clippingRegion.origin.y)); GLView* glView = Director::getInstance()->getOpenGLView(); +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + glView->setScissorInPoints(pos.x * scaleX, + pos.y * scaleY, + _clippingRegion.size.width * scaleX, + _clippingRegion.size.height * scaleY); +#else glView->setScissorInPoints(pos.x, pos.y, _clippingRegion.size.width * scaleX, _clippingRegion.size.height * scaleY); +#endif } } diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 1fb58dd323..7330d34249 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -104,7 +104,11 @@ static inline Tex2F __t(const Vec2 &v) // implementation of DrawNode +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +static const int DEFAULT_LINE_WIDTH = 1; +#else static const int DEFAULT_LINE_WIDTH = 2; +#endif DrawNode::DrawNode() : _vao(0) @@ -126,6 +130,9 @@ DrawNode::DrawNode() , _dirtyGLPoint(false) , _dirtyGLLine(false) , _lineWidth(DEFAULT_LINE_WIDTH) +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +, _lineSmoothEnable(false) +#endif { _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; } @@ -398,6 +405,14 @@ void DrawNode::onDrawGLLine(const Mat4 &transform, uint32_t flags) // texcood glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V2F_C4B_T2F), (GLvoid *)offsetof(V2F_C4B_T2F, texCoords)); } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + //如果开启线抗锯齿,如参考线绘制, 则先关闭多重采样 + if (this->_lineSmoothEnable == false) + { + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + } +#endif glLineWidth(_lineWidth); glDrawArrays(GL_LINES, 0, _bufferCountGLLine); @@ -407,8 +422,14 @@ void DrawNode::onDrawGLLine(const Mat4 &transform, uint32_t flags) } glBindBuffer(GL_ARRAY_BUFFER, 0); - CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,_bufferCountGLLine); + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + //如果开启线抗锯齿, 如参考线绘制, 绘制完成开启多重采样 + if (this->_lineSmoothEnable == true) + glEnable(GL_MULTISAMPLE); +#endif + CHECK_GL_ERROR_DEBUG(); } @@ -946,4 +967,21 @@ void DrawNode::setLineWidth(int lineWidth) _lineWidth = lineWidth; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void DrawNode::csSetLineSmooth(bool enable) +{ + this->_lineSmoothEnable = enable; +} + +bool DrawNode::csIsLineSmooth() +{ + return this->_lineSmoothEnable; +} + +float DrawNode::csGetLineWidth() +{ + return this->_lineWidth; +} +#endif + NS_CC_END diff --git a/cocos/2d/CCDrawNode.h b/cocos/2d/CCDrawNode.h index 0ea1c29eac..a6a259e4a4 100644 --- a/cocos/2d/CCDrawNode.h +++ b/cocos/2d/CCDrawNode.h @@ -312,7 +312,15 @@ public: virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; void setLineWidth(int lineWidth); - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + void csSetLineSmooth(bool enable); + + bool csIsLineSmooth(); + + float csGetLineWidth(); +#endif + CC_CONSTRUCTOR_ACCESS: DrawNode(); virtual ~DrawNode(); @@ -355,6 +363,10 @@ protected: int _lineWidth; +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + bool _lineSmoothEnable; +#endif + private: CC_DISALLOW_COPY_AND_ASSIGN(DrawNode); }; diff --git a/cocos/2d/CCFontAtlasCache.cpp b/cocos/2d/CCFontAtlasCache.cpp index 95609ea12e..b181f7782f 100644 --- a/cocos/2d/CCFontAtlasCache.cpp +++ b/cocos/2d/CCFontAtlasCache.cpp @@ -238,4 +238,44 @@ bool FontAtlasCache::releaseFontAtlas(FontAtlas *atlas) return false; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset/* = Vec2::ZERO*/) +{ + std::string atlasName = generateFontName(fontFileName, 0, false); + auto it = _atlasMap.find(atlasName); + + if (it != _atlasMap.end()) + { + CC_SAFE_RELEASE_NULL(it->second); + _atlasMap.erase(it); + } + FontFNT::reloadBMFontResource(fontFileName); + auto font = FontFNT::create(fontFileName, imageOffset); + if (font) + { + auto tempAtlas = font->createFontAtlas(); + if (tempAtlas) + { + _atlasMap[atlasName] = tempAtlas; + } + } + +} + +void FontAtlasCache::unloadFontAtlasTTF(const std::string& fontFileName) +{ + auto item = _atlasMap.begin(); + while (item != _atlasMap.end()) + { + if (item->first.find(fontFileName) >= 0) + { + CC_SAFE_RELEASE_NULL(item->second); + item = _atlasMap.erase(item); + } + else + item++; + } +} +#endif + NS_CC_END diff --git a/cocos/2d/CCFontAtlasCache.h b/cocos/2d/CCFontAtlasCache.h index e197a9812f..2f61231379 100644 --- a/cocos/2d/CCFontAtlasCache.h +++ b/cocos/2d/CCFontAtlasCache.h @@ -53,7 +53,12 @@ public: It will purge the textures atlas and if multiple texture exist in one FontAtlas. */ static void purgeCachedData(); - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + static void reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset = Vec2::ZERO); + static void unloadFontAtlasTTF(const std::string& fontFileName); +#endif + private: static std::string generateFontName(const std::string& fontFileName, float size, bool useDistanceField); static std::unordered_map _atlasMap; diff --git a/cocos/2d/CCFontFNT.cpp b/cocos/2d/CCFontFNT.cpp index 1a2ea333e9..ed14ea9886 100644 --- a/cocos/2d/CCFontFNT.cpp +++ b/cocos/2d/CCFontFNT.cpp @@ -783,5 +783,27 @@ FontAtlas * FontFNT::createFontAtlas() return tempAtlas; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void FontFNT::reloadBMFontResource(const std::string& fntFilePath) +{ + if (s_configurations == nullptr) + { + s_configurations = new (std::nothrow) Map(); + } + + BMFontConfiguration *ret = s_configurations->at(fntFilePath); + if (ret != nullptr) + { + s_configurations->erase(fntFilePath); + } + ret = BMFontConfiguration::create(fntFilePath.c_str()); + if (ret) + { + s_configurations->insert(fntFilePath, ret); + TextureCache::getInstance()->reloadTexture(ret->getAtlasName()); + + } +} +#endif NS_CC_END diff --git a/cocos/2d/CCFontFNT.h b/cocos/2d/CCFontFNT.h index d2b83e9886..f8a23978cf 100644 --- a/cocos/2d/CCFontFNT.h +++ b/cocos/2d/CCFontFNT.h @@ -46,7 +46,11 @@ public: static void purgeCachedData(); virtual int* getHorizontalKerningForTextUTF16(const std::u16string& text, int &outNumLetters) const override; virtual FontAtlas *createFontAtlas() override; - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + static void reloadBMFontResource(const std::string& fntFilePath); +#endif + protected: FontFNT(BMFontConfiguration *theContfig, const Vec2& imageOffset = Vec2::ZERO); diff --git a/cocos/2d/CCFontFreeType.cpp b/cocos/2d/CCFontFreeType.cpp index 9076f23aca..49ff8d434e 100644 --- a/cocos/2d/CCFontFreeType.cpp +++ b/cocos/2d/CCFontFreeType.cpp @@ -634,4 +634,18 @@ const char* FontFreeType::getGlyphCollection() const return glyphCollection; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void FontFreeType::releaseFont(const std::string &fontName) +{ + auto item = s_cacheFontData.begin(); + while (s_cacheFontData.end() != item) + { + if (item->first.find(fontName) >= 0) + item = s_cacheFontData.erase(item); + else + item++; + } +} +#endif + NS_CC_END diff --git a/cocos/2d/CCFontFreeType.h b/cocos/2d/CCFontFreeType.h index 57eda9ddbb..59f31e6cf0 100644 --- a/cocos/2d/CCFontFreeType.h +++ b/cocos/2d/CCFontFreeType.h @@ -74,6 +74,11 @@ public: virtual FontAtlas* createFontAtlas() override; virtual int getFontMaxHeight() const override { return _lineHeight; } + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + static void releaseFont(const std::string &fontName); +#endif + private: static const char* _glyphASCII; static const char* _glyphNEHE; diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 4a521f81c7..bffd731c39 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -38,6 +38,10 @@ #include "2d/CCComponentContainer.h" #include "2d/CCComponent.h" +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +#include "CocosStudioExtension.h" +#endif + NS_CC_BEGIN class GridBase; diff --git a/cocos/2d/CCParticleSystem.cpp b/cocos/2d/CCParticleSystem.cpp index 169a7f854b..d8dbc956fa 100644 --- a/cocos/2d/CCParticleSystem.cpp +++ b/cocos/2d/CCParticleSystem.cpp @@ -1332,5 +1332,14 @@ void ParticleSystem::setScaleY(float newScaleY) Node::setScaleY(newScaleY); } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +ResouceData ParticleSystem::csGetRenderFile() +{ + ResouceData rData; + rData.type = 0; + rData.file = _plistFile; + return rData; +} +#endif NS_CC_END diff --git a/cocos/2d/CCParticleSystem.h b/cocos/2d/CCParticleSystem.h index a4c3ba4b24..860cf4bbdf 100644 --- a/cocos/2d/CCParticleSystem.h +++ b/cocos/2d/CCParticleSystem.h @@ -760,7 +760,11 @@ public: * @lua NA */ virtual const BlendFunc &getBlendFunc() const override; - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + ResouceData csGetRenderFile(); +#endif + CC_CONSTRUCTOR_ACCESS: /** * @js ctor diff --git a/cocos/2d/CCScene.h b/cocos/2d/CCScene.h index 7ff478c835..82b9e9a417 100644 --- a/cocos/2d/CCScene.h +++ b/cocos/2d/CCScene.h @@ -109,7 +109,11 @@ public: * @param renderer The renderer use to render the scene. * @js NA */ +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + virtual void render(Renderer* renderer); +#else void render(Renderer* renderer); +#endif /** override function */ virtual void removeAllChildren() override; diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 04366bd4d1..e6e42a7bee 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -164,7 +164,15 @@ bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect) bool Sprite::initWithFile(const std::string& filename) { +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + if (filename.empty()) + return false; + + _fileName = filename; + _fileType = 0; +#else CCASSERT(filename.size()>0, "Invalid filename for sprite"); +#endif Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename); if (texture) @@ -184,6 +192,11 @@ bool Sprite::initWithFile(const std::string &filename, const Rect& rect) { CCASSERT(filename.size()>0, "Invalid filename"); +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _fileName = filename; + _fileType = 0; +#endif + Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename); if (texture) { @@ -200,6 +213,11 @@ bool Sprite::initWithSpriteFrameName(const std::string& spriteFrameName) { CCASSERT(spriteFrameName.size() > 0, "Invalid spriteFrameName"); +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _fileName = spriteFrameName; + _fileType = 1; +#endif + SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(spriteFrameName); return initWithSpriteFrame(frame); } @@ -1145,4 +1163,19 @@ void Sprite::setPolygonInfo(const PolygonInfo& info) _polyInfo = info; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void Sprite::setOffsetPosFromCenter(Vec2 offsetFromCenter) +{ + _unflippedOffsetPositionFromCenter = offsetFromCenter; +} + +ResouceData Sprite::csGetRenderFile() +{ + ResouceData rData; + rData.type = (int)_fileType; + rData.file = _fileName; + return rData; +} +#endif + NS_CC_END diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index 555fb0a5e3..8e85e0d19d 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -461,7 +461,12 @@ public: virtual bool isOpacityModifyRGB() const override; /// @} -CC_CONSTRUCTOR_ACCESS: +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + ResouceData csGetRenderFile(); + void setOffsetPosFromCenter(Vec2 offsetFromCenter); +#endif + +CC_CONSTRUCTOR_ACCESS : /** * @js ctor */ @@ -634,6 +639,12 @@ protected: bool _flippedY; /// Whether the sprite is flipped vertically or not bool _insideBounds; /// whether or not the sprite was inside bounds the previous frame + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + std::string _fileName; + int _fileType; +#endif + private: CC_DISALLOW_COPY_AND_ASSIGN(Sprite); }; diff --git a/cocos/2d/CCSpriteFrameCache.cpp b/cocos/2d/CCSpriteFrameCache.cpp index c029b895c3..5da33a2590 100644 --- a/cocos/2d/CCSpriteFrameCache.cpp +++ b/cocos/2d/CCSpriteFrameCache.cpp @@ -150,7 +150,11 @@ void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dictionary, Textu Version 3 with TexturePacker 4.0 polygon mesh packing */ - +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + if (dictionary["frames"].getType() != cocos2d::Value::Type::MAP) + return; +#endif + ValueMap& framesDict = dictionary["frames"].asValueMap(); int format = 0; @@ -493,6 +497,11 @@ void SpriteFrameCache::removeSpriteFramesFromFileContent(const std::string& plis void SpriteFrameCache::removeSpriteFramesFromDictionary(ValueMap& dictionary) { +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + if (dictionary["frames"].getType() != cocos2d::Value::Type::MAP) + return; +#endif + ValueMap framesDict = dictionary["frames"].asValueMap(); std::vector keysToRemove; @@ -543,4 +552,179 @@ SpriteFrame* SpriteFrameCache::getSpriteFrameByName(const std::string& name) return frame; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +void SpriteFrameCache::reloadSpriteFramesWithDictionary(ValueMap& dictionary, Texture2D *texture) +{ + ValueMap& framesDict = dictionary["frames"].asValueMap(); + int format = 0; + + // get the format + if (dictionary.find("metadata") != dictionary.end()) + { + ValueMap& metadataDict = dictionary["metadata"].asValueMap(); + format = metadataDict["format"].asInt(); + } + + // check the format + CCASSERT(format >= 0 && format <= 3, "format is not supported for SpriteFrameCache addSpriteFramesWithDictionary:textureFilename:"); + + for (auto iter = framesDict.begin(); iter != framesDict.end(); ++iter) + { + ValueMap& frameDict = iter->second.asValueMap(); + std::string spriteFrameName = iter->first; + + auto it = _spriteFrames.find(spriteFrameName); + if (it != _spriteFrames.end()) + { + _spriteFrames.erase(it); + } + + SpriteFrame* spriteFrame = nullptr; + + if (format == 0) + { + float x = frameDict["x"].asFloat(); + float y = frameDict["y"].asFloat(); + float w = frameDict["width"].asFloat(); + float h = frameDict["height"].asFloat(); + float ox = frameDict["offsetX"].asFloat(); + float oy = frameDict["offsetY"].asFloat(); + int ow = frameDict["originalWidth"].asInt(); + int oh = frameDict["originalHeight"].asInt(); + // check ow/oh + if (!ow || !oh) + { + CCLOGWARN("cocos2d: WARNING: originalWidth/Height not found on the SpriteFrame. AnchorPoint won't work as expected. Regenrate the .plist"); + } + // abs ow/oh + ow = abs(ow); + oh = abs(oh); + // create frame + spriteFrame = SpriteFrame::createWithTexture(texture, + Rect(x, y, w, h), + false, + Vec2(ox, oy), + Size((float)ow, (float)oh) + ); + } + else if (format == 1 || format == 2) + { + Rect frame = RectFromString(frameDict["frame"].asString()); + bool rotated = false; + + // rotation + if (format == 2) + { + rotated = frameDict["rotated"].asBool(); + } + + Vec2 offset = PointFromString(frameDict["offset"].asString()); + Size sourceSize = SizeFromString(frameDict["sourceSize"].asString()); + + // create frame + spriteFrame = SpriteFrame::createWithTexture(texture, + frame, + rotated, + offset, + sourceSize + ); + } + else if (format == 3) + { + // get values + Size spriteSize = SizeFromString(frameDict["spriteSize"].asString()); + Vec2 spriteOffset = PointFromString(frameDict["spriteOffset"].asString()); + Size spriteSourceSize = SizeFromString(frameDict["spriteSourceSize"].asString()); + Rect textureRect = RectFromString(frameDict["textureRect"].asString()); + bool textureRotated = frameDict["textureRotated"].asBool(); + + // get aliases + ValueVector& aliases = frameDict["aliases"].asValueVector(); + + for (const auto &value : aliases) { + std::string oneAlias = value.asString(); + if (_spriteFramesAliases.find(oneAlias) != _spriteFramesAliases.end()) + { + CCLOGWARN("cocos2d: WARNING: an alias with name %s already exists", oneAlias.c_str()); + } + + _spriteFramesAliases[oneAlias] = Value(spriteFrameName); + } + + // create frame + spriteFrame = SpriteFrame::createWithTexture(texture, + Rect(textureRect.origin.x, textureRect.origin.y, spriteSize.width, spriteSize.height), + textureRotated, + spriteOffset, + spriteSourceSize); + } + + // add sprite frame + _spriteFrames.insert(spriteFrameName, spriteFrame); + } +} + +bool SpriteFrameCache::reloadTexture(const std::string& plist) +{ + CCASSERT(plist.size()>0, "plist filename should not be nullptr"); + + auto it = _loadedFileNames->find(plist); + if (it != _loadedFileNames->end()) { + _loadedFileNames->erase(it); + } + else + { + //If one plist has't be loaded, we don't load it here. + return false; + } + + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(plist); + ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(fullPath); + + string texturePath(""); + + if (dict.find("metadata") != dict.end()) + { + ValueMap& metadataDict = dict["metadata"].asValueMap(); + // try to read texture file name from meta data + texturePath = metadataDict["textureFileName"].asString(); + } + + if (!texturePath.empty()) + { + // build texture path relative to plist file + texturePath = FileUtils::getInstance()->fullPathFromRelativeFile(texturePath.c_str(), plist); + } + else + { + // build texture path by replacing file extension + texturePath = plist; + + // remove .xxx + size_t startPos = texturePath.find_last_of("."); + texturePath = texturePath.erase(startPos); + + // append .png + texturePath = texturePath.append(".png"); + + CCLOG("cocos2d: SpriteFrameCache: Trying to use file %s as texture", texturePath.c_str()); + } + + Texture2D *texture = nullptr; + if (Director::getInstance()->getTextureCache()->reloadTexture(texturePath.c_str())) + texture = Director::getInstance()->getTextureCache()->getTextureForKey(texturePath); + + if (texture) + { + reloadSpriteFramesWithDictionary(dict, texture); + _loadedFileNames->insert(plist); + } + else + { + CCLOG("cocos2d: SpriteFrameCache: Couldn't load texture"); + } + return true; +} +#endif + NS_CC_END diff --git a/cocos/2d/CCSpriteFrameCache.h b/cocos/2d/CCSpriteFrameCache.h index 0a2873687f..e5557706b8 100644 --- a/cocos/2d/CCSpriteFrameCache.h +++ b/cocos/2d/CCSpriteFrameCache.h @@ -236,6 +236,10 @@ public: /** @deprecated use getSpriteFrameByName() instead */ CC_DEPRECATED_ATTRIBUTE SpriteFrame* spriteFrameByName(const std::string&name) { return getSpriteFrameByName(name); } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + bool reloadTexture(const std::string& plist); +#endif + protected: // MARMALADE: Made this protected not private, as deriving from this class is pretty useful SpriteFrameCache(){} @@ -260,6 +264,10 @@ protected: const std::vector &triangleIndices, PolygonInfo &polygonInfo); +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + void reloadSpriteFramesWithDictionary(ValueMap& dictionary, Texture2D *texture); +#endif + Map _spriteFrames; ValueMap _spriteFramesAliases; std::set* _loadedFileNames; diff --git a/cocos/2d/CCTMXTiledMap.cpp b/cocos/2d/CCTMXTiledMap.cpp index 4f7913fad8..8dc3395065 100644 --- a/cocos/2d/CCTMXTiledMap.cpp +++ b/cocos/2d/CCTMXTiledMap.cpp @@ -61,7 +61,11 @@ TMXTiledMap* TMXTiledMap::createWithXML(const std::string& tmxString, const std: bool TMXTiledMap::initWithTMXFile(const std::string& tmxFile) { CCASSERT(tmxFile.size()>0, "TMXTiledMap: tmx file should not be empty"); - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _tmxFile = tmxFile; +#endif + setContentSize(Size::ZERO); TMXMapInfo *mapInfo = TMXMapInfo::create(tmxFile); @@ -78,6 +82,10 @@ bool TMXTiledMap::initWithTMXFile(const std::string& tmxFile) bool TMXTiledMap::initWithXML(const std::string& tmxString, const std::string& resourcePath) { +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _tmxFile = tmxString; +#endif + setContentSize(Size::ZERO); TMXMapInfo *mapInfo = TMXMapInfo::createWithXML(tmxString, resourcePath); @@ -91,6 +99,10 @@ bool TMXTiledMap::initWithXML(const std::string& tmxString, const std::string& r TMXTiledMap::TMXTiledMap() :_mapSize(Size::ZERO) ,_tileSize(Size::ZERO) +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + ,_tmxFile("") + , _tmxLayerNum(0) +#endif { } @@ -173,28 +185,34 @@ void TMXTiledMap::buildWithMapInfo(TMXMapInfo* mapInfo) _tileProperties = mapInfo->getTileProperties(); - int idx=0; + int idx = 0; auto& layers = mapInfo->getLayers(); - for(const auto &layerInfo : layers) { + for (const auto &layerInfo : layers) { if (layerInfo->_visible) { TMXLayer *child = parseLayer(layerInfo, mapInfo); + //为编辑器修改,节省一次循环 + //addChild(child, idx, idx); if (child == nullptr) { idx++; continue; } - addChild(child, idx, idx); - + addChild(child, 0, idx); + child->setOrderOfArrival(idx); + child->setTag(TMXLayerTag); // update content size with the max size const Size& childSize = child->getContentSize(); Size currentSize = this->getContentSize(); - currentSize.width = std::max( currentSize.width, childSize.width ); - currentSize.height = std::max( currentSize.height, childSize.height ); + currentSize.width = std::max(currentSize.width, childSize.width); + currentSize.height = std::max(currentSize.height, childSize.height); this->setContentSize(currentSize); - + idx++; } } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _tmxLayerNum = idx; +#endif } // public @@ -270,5 +288,19 @@ std::string TMXTiledMap::getDescription() const return StringUtils::format("(_children.size())); } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only +int TMXTiledMap::getLayerNum() +{ + return _tmxLayerNum; +} + +ResouceData TMXTiledMap::csGetRenderFile() +{ + ResouceData rData; + rData.type = 0; + rData.file = _tmxFile; + return rData; +} +#endif NS_CC_END diff --git a/cocos/2d/CCTMXTiledMap.h b/cocos/2d/CCTMXTiledMap.h index 0e196c9ff0..8f9f53df94 100644 --- a/cocos/2d/CCTMXTiledMap.h +++ b/cocos/2d/CCTMXTiledMap.h @@ -251,7 +251,12 @@ public: * @js NA */ virtual std::string getDescription() const override; - + +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + ResouceData csGetRenderFile(); + int getLayerNum(); +#endif + CC_CONSTRUCTOR_ACCESS: /** * @js ctor @@ -288,6 +293,12 @@ protected: //! tile properties ValueMapIntKey _tileProperties; +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + std::string _tmxFile; + int _tmxLayerNum; + static const int TMXLayerTag = 32768; +#endif + private: CC_DISALLOW_COPY_AND_ASSIGN(TMXTiledMap); diff --git a/cocos/2d/CCTMXXMLParser.cpp b/cocos/2d/CCTMXXMLParser.cpp index 2a7425bb10..c8f0082739 100644 --- a/cocos/2d/CCTMXXMLParser.cpp +++ b/cocos/2d/CCTMXXMLParser.cpp @@ -266,6 +266,9 @@ void TMXMapInfo::startElement(void *ctx, const char *name, const char **atts) std::string externalTilesetFilename = attributeDict["source"].asString(); if (externalTilesetFilename != "") { +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + _externalTilesetFilename = externalTilesetFilename; +#endif // Tileset file will be relative to the map file. So we need to convert it to an absolute path if (_TMXFileName.find_last_of("/") != string::npos) { @@ -388,7 +391,9 @@ void TMXMapInfo::startElement(void *ctx, const char *name, const char **atts) // build full path std::string imagename = attributeDict["source"].asString(); - +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + tileset->_originSourceImage = imagename; +#endif if (_TMXFileName.find_last_of("/") != string::npos) { string dir = _TMXFileName.substr(0, _TMXFileName.find_last_of("/") + 1); diff --git a/cocos/2d/CCTMXXMLParser.h b/cocos/2d/CCTMXXMLParser.h index 83009f2da7..5ca6e5473d 100644 --- a/cocos/2d/CCTMXXMLParser.h +++ b/cocos/2d/CCTMXXMLParser.h @@ -139,6 +139,10 @@ public: std::string _sourceImage; //! size in pixels of the image Size _imageSize; +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + std::string _sourceImage; + std::string _originSourceImage; +#endif public: /** * @js ctor @@ -279,6 +283,9 @@ public: inline void setCurrentString(const std::string& currentString){ _currentString = currentString; } inline const std::string& getTMXFileName() const { return _TMXFileName; } inline void setTMXFileName(const std::string& fileName){ _TMXFileName = fileName; } +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + inline const std::string& getExternalTilesetFileName(){ return _externalTilesetFilename; } +#endif protected: void internalInit(const std::string& tmxFileName, const std::string& resourcePath); @@ -318,6 +325,9 @@ protected: ValueMapIntKey _tileProperties; int _currentFirstGID; bool _recordFirstGID; +#ifdef CC_STUDIO_ENABLED_VIEW // for cocostudio only + std::string _externalTilesetFilename; +#endif }; // end of tilemap_parallax_nodes group diff --git a/cocos/2d/CocosStudioExtension.cpp b/cocos/2d/CocosStudioExtension.cpp new file mode 100644 index 0000000000..6daa9a8cd8 --- /dev/null +++ b/cocos/2d/CocosStudioExtension.cpp @@ -0,0 +1,13 @@ +#include "CocosStudioExtension.h" + +NS_CC_BEGIN + +NodeExtension::NodeExtension() +{ +} + +NodeExtension::~NodeExtension() +{ +} + +NS_CC_END \ No newline at end of file diff --git a/cocos/2d/CocosStudioExtension.h b/cocos/2d/CocosStudioExtension.h new file mode 100644 index 0000000000..aa8ad9b4a5 --- /dev/null +++ b/cocos/2d/CocosStudioExtension.h @@ -0,0 +1,44 @@ + +#ifndef __COCOSSTUDIOEXTENSION_H__ +#define __COCOSSTUDIOEXTENSION_H__ + +#include "math/CCAffineTransform.h" + +NS_CC_BEGIN + +struct CC_DLL ResouceData +{ + int type; + std::string file; + std::string plist; + + ResouceData() + { + type = 0; + file = ""; + plist = ""; + } + + ResouceData(int iType, std::string sFile, std::string sPlist) + { + type = iType; + file = sFile; + plist = sPlist; + } +}; + +class CC_DLL NodeExtension +{ +public: + NodeExtension(); + ~NodeExtension(); + +private: + +}; + + +NS_CC_END + + +#endif \ No newline at end of file