123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- #ifndef _RED_REDREADER_H_
- #define _RED_REDREADER_H_
- #include <set>
- #include <unordered_set>
- #include <string>
- #include <vector>
- #include "2d/CCNode.h"
- #include "base/CCData.h"
- #include "base/CCMap.h"
- #include "REDSequence.h"
- #include "extensions/GUI/CCControlExtension/CCControl.h"
- #include "REDAnimationManager.h"
- #include "Protobuf/redream.pb.h"
- #include "Rebolt/ReboltRedManager.h"
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
- #ifdef ABSOLUTE
- #undef ABSOLUTE
- #endif
- #endif
- #define RED_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(T, METHOD) static T * METHOD() { \
- T * ptr = new (std::nothrow) T(); \
- if(ptr != NULL) { \
- ptr->autorelease(); \
- return ptr; \
- } \
- CC_SAFE_DELETE(ptr); \
- return NULL; \
- }
- #define RED_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(T, METHOD) static T * METHOD() { \
- T * ptr = new (std::nothrow) T(); \
- if(ptr != NULL && ptr->init()) { \
- ptr->autorelease(); \
- return ptr; \
- } \
- CC_SAFE_DELETE(ptr); \
- return NULL; \
- }
- #define RED_VERSION 3
- namespace redream {
- /**
- * @addtogroup redream
- * @{
- */
- class REDFile : public cocos2d::Node
- {
- private:
- cocos2d::Node *_REDFileNode;
-
- public:
- REDFile();
-
- static REDFile* create();
-
- cocos2d::Node* getREDFileNode();
- void setREDFileNode(Node *pNode); // retain
- };
- /* Forward declaration. */
- class NodeLoader;
- class NodeLoaderLibrary;
- class NodeLoaderListener;
- class REDMemberVariableAssigner;
- class REDSelectorResolver;
- class REDAnimationManager;
- class REDKeyframe;
- class ReboltRedManager;
- /**
- * @brief Parse REDI file which is generated by redream
- */
- class CC_DLL REDReader : public cocos2d::Ref
- {
-
- #pragma mark - add by songqingyu
-
- private:
- void readFrameNames();
- bool _isBatchNode = false;
- std::unordered_map<std::string,std::vector<std::string>> _batchPlistFrameNames;
- cocos2d::Vector<cocos2d::Node*> _refreshNodesByEndBatch;
- std::unordered_set<std::string> _plistSt;
- public:
- void setPlist(std::unordered_set<std::string> plistSt,std::unordered_set<std::string> replacePlistSt);
- std::unordered_set<std::string> getPlist(){return _plistSt;};
- void setBatchNode(bool batchReader){
- _isBatchNode = batchReader;
- }
- /// plist纹理资源列表 <plist路径(相对), plist中小图资源名称> 例: <img/a.plist, [b.png, c.png]>
- ///读取batchred文件的图集的FrameName的集合
- ///@return 是否解析成功
- bool readFrameNamesFromFile(const char *pREDFileName);
- const std::unordered_map<std::string,std::vector<std::string>>& getBatchPlistFrameNames(){return _batchPlistFrameNames;};
- ///之前好几个地方都写一遍此逻辑去获取图片,现在统一放在一个方法里面
- ///根据file和sheet去获取SpriteFrame如果没有去找单图,单图没有,用空图替换,不会崩溃
- cocos2d::SpriteFrame* getSpriteFrameByName(std::string spriteFile,std::string spriteSheet,bool useDefaultEmpty=true);
- #pragma mark end -
- public:
- enum class PropertyType {
- POSITION = 0,
- SIZE,
- POINT,
- POINT_LOCK,
- SCALE_LOCK,
- DEGREES,
- INTEGER,
- FLOAT,
- FLOAT_VAR,
- CHECK,
- SPRITEFRAME,
- TEXTURE,
- BYTE,
- COLOR3,
- COLOR4F_VAR,
- FLIP,
- BLEND_MODE,
- FNT_FILE,
- TEXT,
- FONT_TTF,
- INTEGER_LABELED,
- BLOCK,
- ANIMATION,
- RED_FILE,
- STRING,
- BLOCK_CONTROL,
- FLOAT_SCALE,
- FLOAT_XY,
- SPINE_SKELFRAME,
- SPINE_SKEL,
- SPINE_ATLAS,
- FRAME_SET,
- PERCENT,
- COLOR4,
- CALLBACKS,
- LOCALIZATION,
- TABLE_VIEW_RED_FILE,
- PB_VERTS_FILE,
- SeparatorCheck,
- MinMaxGradientData,
- MinMaxCurveData,
- EmissionData,
- FloatXYZ,
- MaterialFile,
- MATERIAL_BALL,
- BAKE_DATA_FILE,
- BAKE_ANIMATION,
- POLYGON_FILE,
- WISE,
- };
-
- enum class FloatType {
- _0 = 0,
- _1,
- MINUS1,
- _05,
- INTEGER,
- FULL
- };
-
- enum class PlatformType {
- ALL = 0,
- IOS,
- MAC
- };
-
- enum class TargetType {
- NONE = 0,
- DOCUMENT_ROOT = 1,
- OWNER = 2,
- REDWISE_EVENT = 3,
- };
-
- enum class PositionType
- {
- RELATIVE_BOTTOM_LEFT,
- RELATIVE_TOP_LEFT,
- RELATIVE_TOP_RIGHT,
- RELATIVE_BOTTOM_RIGHT,
- PERCENT,
- MULTIPLY_RESOLUTION,
- };
-
- enum class SizeType
- {
- ABSOLUTE,
- PERCENT,
- RELATIVE_CONTAINER,
- HORIZONTAL_PERCENT,
- VERTICAL_PERCENT,
- MULTIPLY_RESOLUTION,
- };
-
- enum class ScaleType
- {
- ABSOLUTE,
- MULTIPLY_RESOLUTION
- };
- /**
- * @js NA
- * @lua NA
- */
- REDReader(NodeLoaderLibrary *pNodeLoaderLibrary, REDMemberVariableAssigner *pREDMemberVariableAssigner = NULL, REDSelectorResolver *pREDSelectorResolver = NULL, NodeLoaderListener *pNodeLoaderListener = NULL);
- /**
- * @js NA
- * @lua NA
- */
- REDReader(REDReader *ccbReader);
- /**
- * @js NA
- * @lua NA
- */
- virtual ~REDReader();
- /**
- * @js NA
- * @lua NA
- */
- REDReader();
-
- void setREDRootPath(const char* ccbRootPath);
- const std::string& getREDRootPath() const;
- cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName);
- cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner);
- cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
- /**
- * @js NA
- * @lua NA
- */
- cocos2d::Node* readNodeGraphFromData(std::shared_ptr<cocos2d::Data> data, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
-
- /**
- @lua NA
- */
- cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName);
- /**
- @lua NA
- */
- cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner);
- /**
- @lua NA
- */
- cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
-
- /**
- * @js NA
- * @lua NA
- */
- REDMemberVariableAssigner* getREDMemberVariableAssigner();
- /**
- * @js NA
- * @lua NA
- */
- REDSelectorResolver* getREDSelectorResolver();
-
- /**
- * @js getActionManager
- * @lua getActionManager
- */
- REDAnimationManager* getAnimationManager();
- /**
- * @js setActionManager
- * @lua setActionManager
- */
- void setAnimationManager(REDAnimationManager *pAnimationManager);
-
- /** Used in NodeLoader::parseProperties()
- * @js NA
- * @lua NA
- */
- std::set<std::string>* getAnimatedProperties();
- /**
- * @js NA
- * @lua NA
- */
- std::set<std::string>& getLoadedSpriteSheet();
- /**
- * @js NA
- * @lua NA
- */
- cocos2d::Ref* getOwner();
- /* Utility methods.
- * @js NA
- * @lua NA
- */
- static std::string lastPathComponent(const char* pString);
- /**
- * @js NA
- * @lua NA
- */
- static std::string deletePathExtension(const char* pString);
- /**
- * @js NA
- * @lua NA
- */
- static std::string toLowerCase(const char* pString);
- /**
- * @js NA
- * @lua NA
- */
- static bool endsWith(const char* pString, const char* pEnding);
- /**
- * @js NA
- * @lua NA
- */
- const std::string& readCachedString(int idx);
- /**
- * @js NA
- * @lua NA
- */
- bool isJSControlled();
-
- bool readCallbackKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
- bool readSoundKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
- bool readWiseKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
-
- cocos2d::ValueVector getOwnerCallbackNames();
- cocos2d::Vector<cocos2d::Node*>& getOwnerCallbackNodes();
- cocos2d::ValueVector& getOwnerCallbackControlEvents();
-
- cocos2d::ValueVector getOwnerOutletNames();
- cocos2d::Vector<cocos2d::Node*>& getOwnerOutletNodes();
- cocos2d::Vector<cocos2d::Node*>& getNodesWithAnimationManagers();
- cocos2d::Vector<REDAnimationManager*>& getAnimationManagersForNodes();
-
- typedef cocos2d::Map<cocos2d::Node*, REDAnimationManager*> REDAnimationManagerMap;
- typedef std::shared_ptr<REDAnimationManagerMap> REDAnimationManagerMapPtr;
-
- typedef cocos2d::Map<cocos2d::Node*, ReboltRedManager*> ReboltRedManagerMap;
- typedef std::shared_ptr<ReboltRedManagerMap> ReboltRedManagerMapPtr;
-
- /**
- * @js NA
- * @lua NA
- */
- REDAnimationManagerMapPtr getAnimationManagers();
- /**
- * @js NA
- * @lua NA
- */
- void setAnimationManagers(REDAnimationManagerMapPtr x);
- /**
- * @js NA
- * @lua NA
- */
- void addOwnerCallbackName(const std::string& name);
- /**
- * @js NA
- * @lua NA
- */
- void addOwnerCallbackNode(cocos2d::Node *node);
- void addOwnerCallbackControlEvents(cocos2d::extension::Control::EventType type);
- /**
- * @js NA
- * @lua NA
- */
- void addDocumentCallbackName(const std::string& name);
- /**
- * @js NA
- * @lua NA
- */
- void addDocumentCallbackNode(cocos2d::Node *node);
- void addDocumentCallbackControlEvents(cocos2d::extension::Control::EventType eventType);
- /**
- * @js NA
- * @lua NA
- */
- static float getResolutionScale();
- static void setResolutionScale(float scale);
- /**
- * @js NA
- * @lua NA
- */
- cocos2d::Node* readFileWithCleanUp(bool bCleanUp, REDAnimationManagerMapPtr am, ReboltRedManagerMapPtr rm, std::function<void()> callback = nullptr);
-
- void readFileRedream(const RedreamInfo::Rebolt& reboltBuf);
-
- void addOwnerOutletName(std::string name);
- void addOwnerOutletNode(cocos2d::Node *node);
-
- static void releaseAllREDFileCache();
-
- ReboltRedManagerMapPtr getReboltRedManagerMapPtr();
- void setReboltRedManagerMapPtr(ReboltRedManagerMapPtr x);
-
- void setReboltRedManager(ReboltRedManager* rrm);
- ReboltRedManager* getReboltRedManager();
- bool isReboltNode();
-
- private:
- //add by yutao
- std::shared_ptr<cocos2d::Data> getBytesFromREDFileByName(std::string ccbFullFilePath);
- void cleanUpNodeGraph(cocos2d::Node *pNode);
- bool readSequences();
- REDKeyframe* readKeyframe(PropertyType type, const RedreamInfo::Keyframe& KeyframeProtobuf);
-
- bool readHeader();
- cocos2d::Node* readNodeGraph();
- cocos2d::Node* readNodeGraph(cocos2d::Node * pParent, const RedreamInfo::Node& protoBufNode);
- bool getBit();
- void alignBits();
- bool init();
-
- friend class NodeLoader;
- private:
- std::shared_ptr<cocos2d::Data> _data;
- unsigned char *_bytes;
- RedreamInfo::RedFile* _redFileProtobuf;
-
-
- int _currentByte;
- int _currentBit;
-
- std::vector<std::string> _stringCache;
- std::set<std::string> _loadedSpriteSheets;
-
- cocos2d::Ref *_owner;
-
- REDAnimationManager* _animationManager; //retain
- REDAnimationManagerMapPtr _animationManagers;
-
- std::set<std::string> *_animatedProps;
-
- NodeLoaderLibrary *_nodeLoaderLibrary;
- NodeLoaderListener *_nodeLoaderListener;
- REDMemberVariableAssigner *_REDMemberVariableAssigner;
- REDSelectorResolver *_REDSelectorResolver;
-
- std::vector<std::string> _ownerOutletNames;
- cocos2d::Vector<cocos2d::Node*> _ownerOutletNodes;
- cocos2d::Vector<cocos2d::Node*> _nodesWithAnimationManagers;
- cocos2d::Vector<REDAnimationManager*> _animationManagersForNodes;
-
- std::vector<std::string> _ownerCallbackNames;
- cocos2d::Vector<cocos2d::Node*> _ownerCallbackNodes;
- cocos2d::ValueVector _ownerOwnerCallbackControlEvents;
- std::string _REDRootPath;
-
- // bool _jsControlled;
- protected:
- /// 给动画管理,行为树管理等管理器设置根节点
- /// @param node 根节点
- virtual void setRootNodeForOrtherManger(cocos2d::Node* node);
-
- /// 读取动画的属性
- /// @param node 节点指针
- /// @param nodeProtobuf protobuf 数据
- virtual void readAnimatedProperties(cocos2d::Node* node, const RedreamInfo::Node& nodeProtobuf);
-
- virtual void assignReboltName(const std::string& reboltName, const std::string& reboltId, cocos2d::Node* node);
- virtual void assignREDMemberVariable(TargetType memberVarAssignmentType, std::string memberVarAssignmentName, std::string className, cocos2d::Node* node);
- virtual void assignCustomProperty(NodeLoader* ccNodeLoader, cocos2d::Node* node);
-
- private:
- ReboltRedManager* _reboltRedManager;
- ReboltRedManagerMapPtr _reboltRedManagers;
- bool _isReboltNode;
- };
- // end of effects group
- /// @}
- }
- #endif
|