REDReader.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. #ifndef _RED_REDREADER_H_
  2. #define _RED_REDREADER_H_
  3. #include <set>
  4. #include <unordered_set>
  5. #include <string>
  6. #include <vector>
  7. #include "2d/CCNode.h"
  8. #include "base/CCData.h"
  9. #include "base/CCMap.h"
  10. #include "REDSequence.h"
  11. #include "extensions/GUI/CCControlExtension/CCControl.h"
  12. #include "REDAnimationManager.h"
  13. #include "Protobuf/redream.pb.h"
  14. #include "Rebolt/ReboltRedManager.h"
  15. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
  16. #ifdef ABSOLUTE
  17. #undef ABSOLUTE
  18. #endif
  19. #endif
  20. #define RED_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(T, METHOD) static T * METHOD() { \
  21. T * ptr = new (std::nothrow) T(); \
  22. if(ptr != NULL) { \
  23. ptr->autorelease(); \
  24. return ptr; \
  25. } \
  26. CC_SAFE_DELETE(ptr); \
  27. return NULL; \
  28. }
  29. #define RED_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(T, METHOD) static T * METHOD() { \
  30. T * ptr = new (std::nothrow) T(); \
  31. if(ptr != NULL && ptr->init()) { \
  32. ptr->autorelease(); \
  33. return ptr; \
  34. } \
  35. CC_SAFE_DELETE(ptr); \
  36. return NULL; \
  37. }
  38. #define RED_VERSION 3
  39. namespace redream {
  40. /**
  41. * @addtogroup redream
  42. * @{
  43. */
  44. class REDFile : public cocos2d::Node
  45. {
  46. private:
  47. cocos2d::Node *_REDFileNode;
  48. public:
  49. REDFile();
  50. static REDFile* create();
  51. cocos2d::Node* getREDFileNode();
  52. void setREDFileNode(Node *pNode); // retain
  53. };
  54. /* Forward declaration. */
  55. class NodeLoader;
  56. class NodeLoaderLibrary;
  57. class NodeLoaderListener;
  58. class REDMemberVariableAssigner;
  59. class REDSelectorResolver;
  60. class REDAnimationManager;
  61. class REDKeyframe;
  62. class ReboltRedManager;
  63. /**
  64. * @brief Parse REDI file which is generated by redream
  65. */
  66. class CC_DLL REDReader : public cocos2d::Ref
  67. {
  68. #pragma mark - add by songqingyu
  69. private:
  70. void readFrameNames();
  71. bool _isBatchNode = false;
  72. std::unordered_map<std::string,std::vector<std::string>> _batchPlistFrameNames;
  73. cocos2d::Vector<cocos2d::Node*> _refreshNodesByEndBatch;
  74. std::unordered_set<std::string> _plistSt;
  75. public:
  76. void setPlist(std::unordered_set<std::string> plistSt,std::unordered_set<std::string> replacePlistSt);
  77. std::unordered_set<std::string> getPlist(){return _plistSt;};
  78. void setBatchNode(bool batchReader){
  79. _isBatchNode = batchReader;
  80. }
  81. /// plist纹理资源列表 <plist路径(相对), plist中小图资源名称> 例: <img/a.plist, [b.png, c.png]>
  82. ///读取batchred文件的图集的FrameName的集合
  83. ///@return 是否解析成功
  84. bool readFrameNamesFromFile(const char *pREDFileName);
  85. const std::unordered_map<std::string,std::vector<std::string>>& getBatchPlistFrameNames(){return _batchPlistFrameNames;};
  86. ///之前好几个地方都写一遍此逻辑去获取图片,现在统一放在一个方法里面
  87. ///根据file和sheet去获取SpriteFrame如果没有去找单图,单图没有,用空图替换,不会崩溃
  88. cocos2d::SpriteFrame* getSpriteFrameByName(std::string spriteFile,std::string spriteSheet,bool useDefaultEmpty=true);
  89. #pragma mark end -
  90. public:
  91. enum class PropertyType {
  92. POSITION = 0,
  93. SIZE,
  94. POINT,
  95. POINT_LOCK,
  96. SCALE_LOCK,
  97. DEGREES,
  98. INTEGER,
  99. FLOAT,
  100. FLOAT_VAR,
  101. CHECK,
  102. SPRITEFRAME,
  103. TEXTURE,
  104. BYTE,
  105. COLOR3,
  106. COLOR4F_VAR,
  107. FLIP,
  108. BLEND_MODE,
  109. FNT_FILE,
  110. TEXT,
  111. FONT_TTF,
  112. INTEGER_LABELED,
  113. BLOCK,
  114. ANIMATION,
  115. RED_FILE,
  116. STRING,
  117. BLOCK_CONTROL,
  118. FLOAT_SCALE,
  119. FLOAT_XY,
  120. SPINE_SKELFRAME,
  121. SPINE_SKEL,
  122. SPINE_ATLAS,
  123. FRAME_SET,
  124. PERCENT,
  125. COLOR4,
  126. CALLBACKS,
  127. LOCALIZATION,
  128. TABLE_VIEW_RED_FILE,
  129. PB_VERTS_FILE,
  130. SeparatorCheck,
  131. MinMaxGradientData,
  132. MinMaxCurveData,
  133. EmissionData,
  134. FloatXYZ,
  135. MaterialFile,
  136. MATERIAL_BALL,
  137. BAKE_DATA_FILE,
  138. BAKE_ANIMATION,
  139. POLYGON_FILE,
  140. WISE,
  141. };
  142. enum class FloatType {
  143. _0 = 0,
  144. _1,
  145. MINUS1,
  146. _05,
  147. INTEGER,
  148. FULL
  149. };
  150. enum class PlatformType {
  151. ALL = 0,
  152. IOS,
  153. MAC
  154. };
  155. enum class TargetType {
  156. NONE = 0,
  157. DOCUMENT_ROOT = 1,
  158. OWNER = 2,
  159. REDWISE_EVENT = 3,
  160. };
  161. enum class PositionType
  162. {
  163. RELATIVE_BOTTOM_LEFT,
  164. RELATIVE_TOP_LEFT,
  165. RELATIVE_TOP_RIGHT,
  166. RELATIVE_BOTTOM_RIGHT,
  167. PERCENT,
  168. MULTIPLY_RESOLUTION,
  169. };
  170. enum class SizeType
  171. {
  172. ABSOLUTE,
  173. PERCENT,
  174. RELATIVE_CONTAINER,
  175. HORIZONTAL_PERCENT,
  176. VERTICAL_PERCENT,
  177. MULTIPLY_RESOLUTION,
  178. };
  179. enum class ScaleType
  180. {
  181. ABSOLUTE,
  182. MULTIPLY_RESOLUTION
  183. };
  184. /**
  185. * @js NA
  186. * @lua NA
  187. */
  188. REDReader(NodeLoaderLibrary *pNodeLoaderLibrary, REDMemberVariableAssigner *pREDMemberVariableAssigner = NULL, REDSelectorResolver *pREDSelectorResolver = NULL, NodeLoaderListener *pNodeLoaderListener = NULL);
  189. /**
  190. * @js NA
  191. * @lua NA
  192. */
  193. REDReader(REDReader *ccbReader);
  194. /**
  195. * @js NA
  196. * @lua NA
  197. */
  198. virtual ~REDReader();
  199. /**
  200. * @js NA
  201. * @lua NA
  202. */
  203. REDReader();
  204. void setREDRootPath(const char* ccbRootPath);
  205. const std::string& getREDRootPath() const;
  206. cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName);
  207. cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner);
  208. cocos2d::Node* readNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
  209. /**
  210. * @js NA
  211. * @lua NA
  212. */
  213. cocos2d::Node* readNodeGraphFromData(std::shared_ptr<cocos2d::Data> data, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
  214. /**
  215. @lua NA
  216. */
  217. cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName);
  218. /**
  219. @lua NA
  220. */
  221. cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner);
  222. /**
  223. @lua NA
  224. */
  225. cocos2d::Scene* createSceneWithNodeGraphFromFile(const char *pREDFileName, cocos2d::Ref *pOwner, const cocos2d::Size &parentSize);
  226. /**
  227. * @js NA
  228. * @lua NA
  229. */
  230. REDMemberVariableAssigner* getREDMemberVariableAssigner();
  231. /**
  232. * @js NA
  233. * @lua NA
  234. */
  235. REDSelectorResolver* getREDSelectorResolver();
  236. /**
  237. * @js getActionManager
  238. * @lua getActionManager
  239. */
  240. REDAnimationManager* getAnimationManager();
  241. /**
  242. * @js setActionManager
  243. * @lua setActionManager
  244. */
  245. void setAnimationManager(REDAnimationManager *pAnimationManager);
  246. /** Used in NodeLoader::parseProperties()
  247. * @js NA
  248. * @lua NA
  249. */
  250. std::set<std::string>* getAnimatedProperties();
  251. /**
  252. * @js NA
  253. * @lua NA
  254. */
  255. std::set<std::string>& getLoadedSpriteSheet();
  256. /**
  257. * @js NA
  258. * @lua NA
  259. */
  260. cocos2d::Ref* getOwner();
  261. /* Utility methods.
  262. * @js NA
  263. * @lua NA
  264. */
  265. static std::string lastPathComponent(const char* pString);
  266. /**
  267. * @js NA
  268. * @lua NA
  269. */
  270. static std::string deletePathExtension(const char* pString);
  271. /**
  272. * @js NA
  273. * @lua NA
  274. */
  275. static std::string toLowerCase(const char* pString);
  276. /**
  277. * @js NA
  278. * @lua NA
  279. */
  280. static bool endsWith(const char* pString, const char* pEnding);
  281. /**
  282. * @js NA
  283. * @lua NA
  284. */
  285. const std::string& readCachedString(int idx);
  286. /**
  287. * @js NA
  288. * @lua NA
  289. */
  290. bool isJSControlled();
  291. bool readCallbackKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
  292. bool readSoundKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
  293. bool readWiseKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences);
  294. cocos2d::ValueVector getOwnerCallbackNames();
  295. cocos2d::Vector<cocos2d::Node*>& getOwnerCallbackNodes();
  296. cocos2d::ValueVector& getOwnerCallbackControlEvents();
  297. cocos2d::ValueVector getOwnerOutletNames();
  298. cocos2d::Vector<cocos2d::Node*>& getOwnerOutletNodes();
  299. cocos2d::Vector<cocos2d::Node*>& getNodesWithAnimationManagers();
  300. cocos2d::Vector<REDAnimationManager*>& getAnimationManagersForNodes();
  301. typedef cocos2d::Map<cocos2d::Node*, REDAnimationManager*> REDAnimationManagerMap;
  302. typedef std::shared_ptr<REDAnimationManagerMap> REDAnimationManagerMapPtr;
  303. typedef cocos2d::Map<cocos2d::Node*, ReboltRedManager*> ReboltRedManagerMap;
  304. typedef std::shared_ptr<ReboltRedManagerMap> ReboltRedManagerMapPtr;
  305. /**
  306. * @js NA
  307. * @lua NA
  308. */
  309. REDAnimationManagerMapPtr getAnimationManagers();
  310. /**
  311. * @js NA
  312. * @lua NA
  313. */
  314. void setAnimationManagers(REDAnimationManagerMapPtr x);
  315. /**
  316. * @js NA
  317. * @lua NA
  318. */
  319. void addOwnerCallbackName(const std::string& name);
  320. /**
  321. * @js NA
  322. * @lua NA
  323. */
  324. void addOwnerCallbackNode(cocos2d::Node *node);
  325. void addOwnerCallbackControlEvents(cocos2d::extension::Control::EventType type);
  326. /**
  327. * @js NA
  328. * @lua NA
  329. */
  330. void addDocumentCallbackName(const std::string& name);
  331. /**
  332. * @js NA
  333. * @lua NA
  334. */
  335. void addDocumentCallbackNode(cocos2d::Node *node);
  336. void addDocumentCallbackControlEvents(cocos2d::extension::Control::EventType eventType);
  337. /**
  338. * @js NA
  339. * @lua NA
  340. */
  341. static float getResolutionScale();
  342. static void setResolutionScale(float scale);
  343. /**
  344. * @js NA
  345. * @lua NA
  346. */
  347. cocos2d::Node* readFileWithCleanUp(bool bCleanUp, REDAnimationManagerMapPtr am, ReboltRedManagerMapPtr rm, std::function<void()> callback = nullptr);
  348. void readFileRedream(const RedreamInfo::Rebolt& reboltBuf);
  349. void addOwnerOutletName(std::string name);
  350. void addOwnerOutletNode(cocos2d::Node *node);
  351. static void releaseAllREDFileCache();
  352. ReboltRedManagerMapPtr getReboltRedManagerMapPtr();
  353. void setReboltRedManagerMapPtr(ReboltRedManagerMapPtr x);
  354. void setReboltRedManager(ReboltRedManager* rrm);
  355. ReboltRedManager* getReboltRedManager();
  356. bool isReboltNode();
  357. private:
  358. //add by yutao
  359. std::shared_ptr<cocos2d::Data> getBytesFromREDFileByName(std::string ccbFullFilePath);
  360. void cleanUpNodeGraph(cocos2d::Node *pNode);
  361. bool readSequences();
  362. REDKeyframe* readKeyframe(PropertyType type, const RedreamInfo::Keyframe& KeyframeProtobuf);
  363. bool readHeader();
  364. cocos2d::Node* readNodeGraph();
  365. cocos2d::Node* readNodeGraph(cocos2d::Node * pParent, const RedreamInfo::Node& protoBufNode);
  366. bool getBit();
  367. void alignBits();
  368. bool init();
  369. friend class NodeLoader;
  370. private:
  371. std::shared_ptr<cocos2d::Data> _data;
  372. unsigned char *_bytes;
  373. RedreamInfo::RedFile* _redFileProtobuf;
  374. int _currentByte;
  375. int _currentBit;
  376. std::vector<std::string> _stringCache;
  377. std::set<std::string> _loadedSpriteSheets;
  378. cocos2d::Ref *_owner;
  379. REDAnimationManager* _animationManager; //retain
  380. REDAnimationManagerMapPtr _animationManagers;
  381. std::set<std::string> *_animatedProps;
  382. NodeLoaderLibrary *_nodeLoaderLibrary;
  383. NodeLoaderListener *_nodeLoaderListener;
  384. REDMemberVariableAssigner *_REDMemberVariableAssigner;
  385. REDSelectorResolver *_REDSelectorResolver;
  386. std::vector<std::string> _ownerOutletNames;
  387. cocos2d::Vector<cocos2d::Node*> _ownerOutletNodes;
  388. cocos2d::Vector<cocos2d::Node*> _nodesWithAnimationManagers;
  389. cocos2d::Vector<REDAnimationManager*> _animationManagersForNodes;
  390. std::vector<std::string> _ownerCallbackNames;
  391. cocos2d::Vector<cocos2d::Node*> _ownerCallbackNodes;
  392. cocos2d::ValueVector _ownerOwnerCallbackControlEvents;
  393. std::string _REDRootPath;
  394. // bool _jsControlled;
  395. protected:
  396. /// 给动画管理,行为树管理等管理器设置根节点
  397. /// @param node 根节点
  398. virtual void setRootNodeForOrtherManger(cocos2d::Node* node);
  399. /// 读取动画的属性
  400. /// @param node 节点指针
  401. /// @param nodeProtobuf protobuf 数据
  402. virtual void readAnimatedProperties(cocos2d::Node* node, const RedreamInfo::Node& nodeProtobuf);
  403. virtual void assignReboltName(const std::string& reboltName, const std::string& reboltId, cocos2d::Node* node);
  404. virtual void assignREDMemberVariable(TargetType memberVarAssignmentType, std::string memberVarAssignmentName, std::string className, cocos2d::Node* node);
  405. virtual void assignCustomProperty(NodeLoader* ccNodeLoader, cocos2d::Node* node);
  406. private:
  407. ReboltRedManager* _reboltRedManager;
  408. ReboltRedManagerMapPtr _reboltRedManagers;
  409. bool _isReboltNode;
  410. };
  411. // end of effects group
  412. /// @}
  413. }
  414. #endif