REDReader.cpp 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  1. #include <ctype.h>
  2. #include <algorithm>
  3. #include "base/CCDirector.h"
  4. #include "platform/CCFileUtils.h"
  5. #include "2d/CCScene.h"
  6. #include "2d/CCSpriteFrameCache.h"
  7. #include "renderer/CCTextureCache.h"
  8. #include "REDReader.h"
  9. #include "CCNodeLoader.h"
  10. #include "CCNodeLoaderLibrary.h"
  11. #include "CCNodeLoaderListener.h"
  12. #include "REDMemberVariableAssigner.h"
  13. #include "REDSelectorResolver.h"
  14. #include "REDAnimationManager.h"
  15. #include "REDSequenceProperty.h"
  16. #include "REDKeyframe.h"
  17. #include <sstream>
  18. #include "common/CocosConfig.h"
  19. #include "ReboltRedManager.h"
  20. #include "REDBatchNode.h"
  21. using namespace cocos2d;
  22. using namespace cocos2d::extension;
  23. namespace redream {
  24. /*************************************************************************
  25. Implementation of REDFile
  26. *************************************************************************/
  27. //add by yutao
  28. std::unordered_map<std::string, std::shared_ptr<cocos2d::Data>> s_ccbFileCacheMap;
  29. std::shared_ptr<cocos2d::Data> REDReader::getBytesFromREDFileByName(std::string ccbFullFilePath)
  30. {
  31. std::string ccbfileStr(ccbFullFilePath);
  32. auto p = s_ccbFileCacheMap.find(ccbfileStr);
  33. if( p != s_ccbFileCacheMap.end())
  34. {
  35. //CCLOG("从缓存中读ccb文件%s",ccbfileStr.c_str());
  36. return p->second;
  37. }
  38. else
  39. {
  40. auto data = std::make_shared<Data>(FileUtils::getInstance()->getDataFromFile(ccbFullFilePath));
  41. s_ccbFileCacheMap.insert(make_pair(ccbfileStr, data));
  42. //CCLOG("从文件读ccb文件%s",ccbfileStr.c_str());
  43. return data;
  44. }
  45. }
  46. void REDReader::releaseAllREDFileCache()
  47. {
  48. s_ccbFileCacheMap.erase(s_ccbFileCacheMap.begin(),s_ccbFileCacheMap.end());
  49. }
  50. REDFile::REDFile():_REDFileNode(nullptr) {}
  51. REDFile* REDFile::create()
  52. {
  53. REDFile *ret = new (std::nothrow) REDFile();
  54. if (ret)
  55. {
  56. ret->autorelease();
  57. }
  58. return ret;
  59. }
  60. Node* REDFile::getREDFileNode()
  61. {
  62. return _REDFileNode;
  63. }
  64. void REDFile::setREDFileNode(Node *pNode)
  65. {
  66. CC_SAFE_RELEASE(_REDFileNode);
  67. _REDFileNode = pNode;
  68. CC_SAFE_RETAIN(_REDFileNode);
  69. }
  70. /*************************************************************************
  71. Implementation of REDReader
  72. *************************************************************************/
  73. REDReader::REDReader(NodeLoaderLibrary * pNodeLoaderLibrary, REDMemberVariableAssigner * pREDMemberVariableAssigner, REDSelectorResolver * pREDSelectorResolver, NodeLoaderListener * pNodeLoaderListener)
  74. : _data(nullptr)
  75. , _bytes(nullptr)
  76. , _currentByte(-1)
  77. , _currentBit(-1)
  78. , _owner(nullptr)
  79. , _animationManager(nullptr)
  80. , _animatedProps(nullptr)
  81. , _redFileProtobuf(nullptr)
  82. , _isReboltNode(false)
  83. , _reboltRedManager(nullptr)
  84. {
  85. this->_nodeLoaderLibrary = pNodeLoaderLibrary;
  86. this->_nodeLoaderLibrary->retain();
  87. this->_REDMemberVariableAssigner = pREDMemberVariableAssigner;
  88. this->_REDSelectorResolver = pREDSelectorResolver;
  89. this->_nodeLoaderListener = pNodeLoaderListener;
  90. init();
  91. }
  92. REDReader::REDReader(REDReader * ccbReader)
  93. : _data(nullptr)
  94. , _bytes(nullptr)
  95. , _currentByte(-1)
  96. , _currentBit(-1)
  97. , _owner(nullptr)
  98. , _animationManager(nullptr)
  99. , _animatedProps(nullptr)
  100. , _isReboltNode(false)
  101. , _reboltRedManager(nullptr)
  102. {
  103. this->_loadedSpriteSheets = ccbReader->_loadedSpriteSheets;
  104. this->_nodeLoaderLibrary = ccbReader->_nodeLoaderLibrary;
  105. this->_nodeLoaderLibrary->retain();
  106. this->_REDMemberVariableAssigner = ccbReader->_REDMemberVariableAssigner;
  107. this->_REDSelectorResolver = ccbReader->_REDSelectorResolver;
  108. this->_nodeLoaderListener = ccbReader->_nodeLoaderListener;
  109. this->_REDRootPath = ccbReader->getREDRootPath();
  110. init();
  111. }
  112. REDReader::REDReader()
  113. : _data(nullptr)
  114. , _bytes(nullptr)
  115. , _currentByte(-1)
  116. , _currentBit(-1)
  117. , _owner(nullptr)
  118. , _animationManager(nullptr)
  119. , _nodeLoaderLibrary(nullptr)
  120. , _nodeLoaderListener(nullptr)
  121. , _REDMemberVariableAssigner(nullptr)
  122. , _REDSelectorResolver(nullptr)
  123. , _isReboltNode(false)
  124. , _reboltRedManager(nullptr)
  125. {
  126. init();
  127. }
  128. REDReader::~REDReader()
  129. {
  130. CC_SAFE_RELEASE_NULL(_owner);
  131. CC_SAFE_DELETE(_animatedProps);
  132. this->_nodeLoaderLibrary->release();
  133. _ownerOutletNames.clear();
  134. _ownerCallbackNames.clear();
  135. // Clear string cache.
  136. this->_stringCache.clear();
  137. setAnimationManager(nullptr);
  138. setReboltRedManager(nullptr);
  139. }
  140. void REDReader::setREDRootPath(const char* ccbRootPath)
  141. {
  142. CCASSERT(ccbRootPath != nullptr, "ccbRootPath can't be nullptr!");
  143. _REDRootPath = ccbRootPath;
  144. getAnimationManager()->setREDRootPath(_REDRootPath);
  145. }
  146. void REDReader::setPlist(std::unordered_set<std::string> plistSt,std::unordered_set<std::string> replacePlistSt){
  147. _plistSt = plistSt;
  148. getAnimationManager()->setReaderPlist(plistSt,replacePlistSt);
  149. }
  150. const std::string& REDReader::getREDRootPath() const
  151. {
  152. return _REDRootPath;
  153. }
  154. bool REDReader::init()
  155. {
  156. // Setup action manager
  157. REDAnimationManager *pActionManager = new (std::nothrow) REDAnimationManager();
  158. setAnimationManager(pActionManager);
  159. pActionManager->release();
  160. // Setup resolution scale and container size
  161. _animationManager->setRootContainerSize(Director::getInstance()->getWinSize());
  162. return true;
  163. }
  164. REDAnimationManager* REDReader::getAnimationManager()
  165. {
  166. return _animationManager;
  167. }
  168. void REDReader::setAnimationManager(REDAnimationManager *pAnimationManager)
  169. {
  170. CC_SAFE_RELEASE(_animationManager);
  171. _animationManager = pAnimationManager;
  172. CC_SAFE_RETAIN(_animationManager);
  173. }
  174. REDReader::REDAnimationManagerMapPtr REDReader::getAnimationManagers()
  175. {
  176. return _animationManagers;
  177. }
  178. void REDReader::setAnimationManagers(REDAnimationManagerMapPtr x)
  179. {
  180. _animationManagers = x;
  181. }
  182. void REDReader::setReboltRedManager(ReboltRedManager* rrm){
  183. CC_SAFE_RELEASE(_reboltRedManager);
  184. _reboltRedManager = rrm;
  185. CC_SAFE_RETAIN(_reboltRedManager);
  186. }
  187. ReboltRedManager* REDReader::getReboltRedManager(){
  188. return _reboltRedManager;
  189. }
  190. REDReader::ReboltRedManagerMapPtr REDReader::getReboltRedManagerMapPtr(){
  191. return _reboltRedManagers;
  192. }
  193. void REDReader::setReboltRedManagerMapPtr(ReboltRedManagerMapPtr x){
  194. _reboltRedManagers = x;
  195. }
  196. REDMemberVariableAssigner * REDReader::getREDMemberVariableAssigner() {
  197. return this->_REDMemberVariableAssigner;
  198. }
  199. bool REDReader::isReboltNode(){
  200. return _isReboltNode;
  201. }
  202. REDSelectorResolver * REDReader::getREDSelectorResolver() {
  203. return this->_REDSelectorResolver;
  204. }
  205. std::set<std::string>* REDReader::getAnimatedProperties()
  206. {
  207. return _animatedProps;
  208. }
  209. std::set<std::string>& REDReader::getLoadedSpriteSheet()
  210. {
  211. return _loadedSpriteSheets;
  212. }
  213. Ref* REDReader::getOwner()
  214. {
  215. return _owner;
  216. }
  217. Node* REDReader::readNodeGraphFromFile(const char *pREDFileName)
  218. {
  219. return this->readNodeGraphFromFile(pREDFileName, nullptr);
  220. }
  221. Node* REDReader::readNodeGraphFromFile(const char* pREDFileName, Ref* pOwner)
  222. {
  223. return this->readNodeGraphFromFile(pREDFileName, pOwner, Director::getInstance()->getWinSize());
  224. }
  225. Node* REDReader::readNodeGraphFromFile(const char *pREDFileName, Ref *pOwner, const Size &parentSize)
  226. {
  227. if (nullptr == pREDFileName || strlen(pREDFileName) == 0)
  228. {
  229. return nullptr;
  230. }
  231. std::string strREDFileName(pREDFileName);
  232. size_t pos = strREDFileName.rfind(".");
  233. if (pos == string::npos) {
  234. strREDFileName += ".redream";
  235. } else {
  236. std::string strSuffix(".batchredream");
  237. std::string endSuffix = strREDFileName.substr(pos);
  238. if (endSuffix == strSuffix) {//如果后缀名是batchredream
  239. _isBatchNode = true;
  240. }
  241. }
  242. this->getAnimationManager()->setREDFileName(strREDFileName);
  243. std::string strPath = FileUtils::getInstance()->fullPathForFilename(strREDFileName);
  244. // auto dataPtr = std::make_shared<Data>(FileUtils::getInstance()->getDataFromFile(strPath));
  245. auto dataPtr = this->getBytesFromREDFileByName(strPath);
  246. Node *ret = this->readNodeGraphFromData(dataPtr, pOwner, parentSize);
  247. return ret;
  248. }
  249. Node* REDReader::readNodeGraphFromData(std::shared_ptr<cocos2d::Data> data, Ref *pOwner, const Size &parentSize)
  250. {
  251. _data = data;
  252. _currentByte = 0;
  253. _currentBit = 0;
  254. _owner = pOwner;
  255. CC_SAFE_RETAIN(_owner);
  256. _animationManager->setRootContainerSize(parentSize);
  257. _animationManager->_owner = _owner;
  258. Node *pNodeGraph = readFileWithCleanUp(true, std::make_shared<REDAnimationManagerMap>(), std::make_shared<ReboltRedManagerMap>());
  259. int id = _animationManager->getAutoPlaySequenceId();
  260. // log("error_getAutoPlaySequenceId:%d", id);
  261. // log("error_getReferenceCount:%d", _animationManager->getReferenceCount());
  262. if(_animationManager->getReferenceCount()<=1){
  263. return nullptr;
  264. }
  265. // Assign actionManagers to userObject
  266. for (auto iter = _animationManagers->begin(); iter != _animationManagers->end(); ++iter)
  267. {
  268. Node* pNode = iter->first;
  269. REDAnimationManager* manager = iter->second;
  270. pNode->setUserObject(manager);
  271. }
  272. if (pNodeGraph && id != -1)
  273. {
  274. // Auto play animations
  275. _animationManager->runAnimationsForSequenceIdTweenDuration(id, 0);
  276. }
  277. return pNodeGraph;
  278. }
  279. Scene* REDReader::createSceneWithNodeGraphFromFile(const char *pREDFileName)
  280. {
  281. return createSceneWithNodeGraphFromFile(pREDFileName, nullptr);
  282. }
  283. Scene* REDReader::createSceneWithNodeGraphFromFile(const char *pREDFileName, Ref *pOwner)
  284. {
  285. return createSceneWithNodeGraphFromFile(pREDFileName, pOwner, Director::getInstance()->getWinSize());
  286. }
  287. Scene* REDReader::createSceneWithNodeGraphFromFile(const char *pREDFileName, Ref *pOwner, const Size &parentSize)
  288. {
  289. Node *pNode = readNodeGraphFromFile(pREDFileName, pOwner, parentSize);
  290. Scene *pScene = Scene::create();
  291. pScene->addChild(pNode);
  292. return pScene;
  293. }
  294. void REDReader::cleanUpNodeGraph(Node *node)
  295. {
  296. node->setUserObject(nullptr);
  297. auto& children = node->getChildren();
  298. for(const auto &obj : children) {
  299. cleanUpNodeGraph(obj);
  300. }
  301. }
  302. Node* REDReader::readFileWithCleanUp(bool bCleanUp, REDAnimationManagerMapPtr am, ReboltRedManagerMapPtr rm, std::function<void()> callback)
  303. {
  304. _redFileProtobuf = new RedreamInfo::RedFile();
  305. bool isSuccess = _redFileProtobuf->ParseFromArray(_data->getBytes(), (int)_data->getSize());//获取到所有的字符串,然后创建内容
  306. if(!isSuccess) {
  307. CC_SAFE_DELETE(_redFileProtobuf);
  308. return nullptr;
  309. }
  310. if (! readHeader())
  311. {
  312. CC_SAFE_DELETE(_redFileProtobuf);
  313. return nullptr;
  314. }
  315. if (! readSequences())
  316. {
  317. CC_SAFE_DELETE(_redFileProtobuf);
  318. return nullptr;
  319. }
  320. setAnimationManagers(am);
  321. if (_isBatchNode) {
  322. readFrameNames();
  323. }
  324. setReboltRedManagerMapPtr(rm);
  325. readFileRedream(_redFileProtobuf->rebolt());
  326. //TODO: 需要在这里处理rebolt逻辑,暂时先用回调的方式处理
  327. if(callback){
  328. callback();
  329. }
  330. Node *pNode = readNodeGraph(nullptr, _redFileProtobuf->root());
  331. _animationManagers->insert(pNode, _animationManager);
  332. if (bCleanUp)
  333. {
  334. cleanUpNodeGraph(pNode);
  335. }
  336. CC_SAFE_DELETE(_redFileProtobuf);
  337. if(_isReboltNode){
  338. _reboltRedManager->parseTreeMapAndStartUpdate();
  339. }
  340. return pNode;
  341. }
  342. void REDReader::readFileRedream(const RedreamInfo::Rebolt& reboltBuf){
  343. _isReboltNode = reboltBuf.isrebolted();
  344. if(_isReboltNode || _reboltRedManagers->size() > 0){
  345. //有rebolt逻辑,或者有父节点存在rebolt逻辑才会创建 _reboltRedManager
  346. auto reboltRedManager = new (std::nothrow) ReboltRedManager();
  347. setReboltRedManager(reboltRedManager);
  348. reboltRedManager->release();
  349. reboltRedManager->setREDAnimationManager(getAnimationManager());
  350. }
  351. if(_isReboltNode){
  352. // 如果自己有rebolt逻辑才会加载或许逻辑
  353. // 解析别名和树的关系
  354. // <树类型,<树名字,树randomId>>
  355. std::map<std::string, std::map<std::string, std::string>> typeBtMap;
  356. auto treeIndexesProto = reboltBuf.rebolttrees();
  357. for(auto it = treeIndexesProto.begin(); it != treeIndexesProto.end(); ++it){
  358. string treeRandomId = it->first;
  359. auto reboltBt = it->second;
  360. string treeName = reboltBt.treename();
  361. string treeType = reboltBt.treetype();
  362. typeBtMap[treeType][treeName] = treeRandomId;
  363. // CCLOG("RedSenceReader::readReboltSceneMangerFromFile: %s, %s, %s",treeType.c_str(), treeName.c_str(), treeRandomId.c_str());
  364. }
  365. _reboltRedManager->setTreeTypeNameMap(typeBtMap);
  366. // <函数id,<参数类型key,[参数列表string]>>
  367. std::map<std::string, std::map<std::string, std::vector<std::string>>> funParam;
  368. auto funcParamIndexsProro = reboltBuf.funcparamindexs();
  369. for(auto it = funcParamIndexsProro.begin(); it != funcParamIndexsProro.end(); it++){
  370. string funId = it->first;
  371. RedreamInfo::Rebolt_FuncParamInfo funcParamInfo = it->second;
  372. std::vector<std::string> boolKeysVec;
  373. auto boolKeysBuf = funcParamInfo.boolkeys();
  374. for(int i = 0; i < boolKeysBuf.size(); i++){
  375. string boolKey = boolKeysBuf.at(i);
  376. boolKeysVec.push_back(boolKey);
  377. }
  378. funParam[funId]["boolKeys"] = boolKeysVec;
  379. std::vector<std::string> stringKeysVec;
  380. auto stringKeysBuf = funcParamInfo.stringkeys();
  381. for(int i = 0; i < stringKeysBuf.size(); i++){
  382. string stringKey = stringKeysBuf.at(i);
  383. stringKeysVec.push_back(stringKey);
  384. }
  385. funParam[funId]["stringKeys"] = stringKeysVec;
  386. }
  387. _reboltRedManager->setFunParam(funParam);
  388. }
  389. }
  390. bool REDReader::readHeader()
  391. {
  392. /* Read version. */
  393. int version = _redFileProtobuf->version();
  394. if(version != RED_VERSION) {
  395. // log("WARNING! Incompatible ccbi file version (file: %d reader: %d)", version, RED_VERSION);
  396. // return false;
  397. }
  398. return true;
  399. }
  400. const std::string& REDReader::readCachedString(int idx )
  401. {
  402. return this->_redFileProtobuf->stringcache(idx);
  403. }
  404. void REDReader::setRootNodeForOrtherManger(Node* node){
  405. // Set root node
  406. if (! _animationManager->getRootNode()){
  407. if (_isBatchNode) {
  408. REDBatchNode * bthNode = REDBatchNode::create();
  409. bthNode->setRootNode(node,_animationManager);
  410. node->setBatchNode(bthNode);
  411. bthNode->setBatchPlistSpriteNames(_batchPlistFrameNames);
  412. }
  413. _animationManager->setRootNode(node);
  414. }
  415. if(_reboltRedManager && !_reboltRedManager->getRootNode()){
  416. _reboltRedManager->setRootNode(node);
  417. if(_isReboltNode){
  418. Node* reboltRootNode = _reboltRedManager->getRootNode();
  419. if(_reboltRedManagers->find(reboltRootNode) == _reboltRedManagers->end()){
  420. _reboltRedManagers->insert(reboltRootNode, _reboltRedManager);
  421. }
  422. vector<RootReboltManger> selfRootReboltMangetVec = _reboltRedManager->getRootRedMangers();
  423. RootReboltManger retRrm;
  424. retRrm.rootRedManger = _reboltRedManager;
  425. retRrm.selfPath = "";
  426. selfRootReboltMangetVec.push_back(retRrm);
  427. _reboltRedManager->setRootRedMangers(selfRootReboltMangetVec);
  428. }
  429. }
  430. }
  431. void REDReader::readAnimatedProperties(Node* node, const RedreamInfo::Node& nodeProtobuf){
  432. //MARK: Read animated properties
  433. std::unordered_map<int, Map<std::string, REDSequenceProperty*>> seqs;
  434. CC_SAFE_DELETE(_animatedProps); // 这个破玩意在后面读节点属性的时候也会用的到,所以只能在下次用之前和析构的时候进行删除操作
  435. _animatedProps = new std::set<std::string>();
  436. int numSequence = nodeProtobuf.sequences_size();
  437. for (int i = 0; i < numSequence; ++i)
  438. {
  439. auto& sequencePropertyMap = nodeProtobuf.sequences(i);
  440. int seqId = sequencePropertyMap.seqid();
  441. Map<std::string, REDSequenceProperty*> seqNodeProps;
  442. int numProps = sequencePropertyMap.props_size();
  443. for (int j = 0; j < numProps; ++j)
  444. {
  445. auto& sequenceProperty = sequencePropertyMap.props(j);
  446. REDSequenceProperty *seqProp = new (std::nothrow) REDSequenceProperty();
  447. seqProp->autorelease();
  448. seqProp->setName(readCachedString(sequenceProperty.name()).c_str());
  449. seqProp->setType(sequenceProperty.type());
  450. _animatedProps->insert(seqProp->getName());
  451. int numKeyframes = sequenceProperty.keyframes_size();
  452. for (int k = 0; k < numKeyframes; ++k)
  453. {
  454. auto& keyframeProtobuf = sequenceProperty.keyframes(k);
  455. PropertyType pt = static_cast<PropertyType>(seqProp->getType());
  456. REDKeyframe *keyframe = readKeyframe(pt, keyframeProtobuf);
  457. seqProp->getKeyframes().pushBack(keyframe);
  458. if (_isBatchNode && pt==PropertyType::SPRITEFRAME ) {
  459. _animationManager->addDisplayFrameKeykframe(keyframe);
  460. }
  461. }
  462. seqNodeProps.insert(seqProp->getName(), seqProp);
  463. }
  464. seqs[seqId] = seqNodeProps;
  465. }
  466. if (!seqs.empty())
  467. {
  468. _animationManager->addNode(node, seqs);
  469. }
  470. }
  471. void REDReader::assignReboltName(const std::string& reboltName, const std::string& reboltId, cocos2d::Node* node){
  472. if(_reboltRedManager){
  473. _reboltRedManager->onAssignREDReboltRedManagerReboltName(_reboltRedManager, reboltName.c_str(), reboltId.c_str(), node);
  474. }
  475. }
  476. void REDReader::assignREDMemberVariable(TargetType memberVarAssignmentType, std::string memberVarAssignmentName, std::string className, Node* node){
  477. // TargetType memberVarAssignmentType = static_cast<TargetType>(nodeProtobuf.membervarassignmenttype());
  478. // std::string memberVarAssignmentName;
  479. // if(memberVarAssignmentType != TargetType::NONE)
  480. // {
  481. // memberVarAssignmentName = this->readCachedString(nodeProtobuf.membervarassignmentname());
  482. // }
  483. if (memberVarAssignmentType != TargetType::NONE)
  484. {
  485. Ref* target = nullptr;
  486. if(memberVarAssignmentType == TargetType::DOCUMENT_ROOT)
  487. {
  488. target = _animationManager->getRootNode();
  489. }
  490. else if(memberVarAssignmentType == TargetType::OWNER)
  491. {
  492. target = this->_owner;
  493. }
  494. if(target != nullptr)
  495. {
  496. REDMemberVariableAssigner * targetAsREDMemberVariableAssigner = dynamic_cast<REDMemberVariableAssigner *>(target);
  497. bool assigned = false;
  498. if (memberVarAssignmentType != TargetType::NONE)
  499. {
  500. if(targetAsREDMemberVariableAssigner != nullptr)
  501. {
  502. assigned = targetAsREDMemberVariableAssigner->onAssignREDMemberVariable(target, memberVarAssignmentName.c_str(), node);
  503. targetAsREDMemberVariableAssigner->onAssignREDMemberVariableWithClass(target, memberVarAssignmentName.c_str(), node, className);
  504. }
  505. if(!assigned && this->_REDMemberVariableAssigner != nullptr)
  506. {
  507. assigned = this->_REDMemberVariableAssigner->onAssignREDMemberVariable(target, memberVarAssignmentName.c_str(), node);
  508. this->_REDMemberVariableAssigner->onAssignREDMemberVariableWithClass(target, memberVarAssignmentName.c_str(), node, className);
  509. }
  510. }
  511. }
  512. }
  513. }
  514. void REDReader::assignCustomProperty(NodeLoader* ccNodeLoader, Node* node){
  515. // Assign custom properties.
  516. if (!ccNodeLoader->getCustomProperties().empty())
  517. {
  518. bool customAssigned = false;
  519. Ref* target = node;
  520. if(target != nullptr)
  521. {
  522. REDMemberVariableAssigner * targetAsREDMemberVariableAssigner = dynamic_cast<REDMemberVariableAssigner *>(target);
  523. auto& customPropeties = ccNodeLoader->getCustomProperties();
  524. for (auto iter = customPropeties.begin(); iter != customPropeties.end(); ++iter)
  525. {
  526. if (targetAsREDMemberVariableAssigner) {
  527. customAssigned = targetAsREDMemberVariableAssigner->onAssignREDCustomProperty(target, iter->first.c_str(), iter->second);
  528. }
  529. if(!customAssigned && this->_REDMemberVariableAssigner)
  530. {
  531. customAssigned = this->_REDMemberVariableAssigner->onAssignREDCustomProperty(target, iter->first.c_str(), iter->second);
  532. }
  533. }
  534. }
  535. }
  536. }
  537. Node * REDReader::readNodeGraph(Node * pParent, const RedreamInfo::Node& nodeProtobuf)
  538. {
  539. //MARK: create NodeLoader
  540. std::string className = this->readCachedString(nodeProtobuf.classname());
  541. NodeLoader* ccNodeLoader = this->_nodeLoaderLibrary->getNodeLoader(className.c_str());
  542. TargetType memberVarAssignmentType = static_cast<TargetType>(nodeProtobuf.membervarassignmenttype());
  543. std::string memberVarAssignmentName;
  544. if(memberVarAssignmentType != TargetType::NONE)
  545. {
  546. memberVarAssignmentName = this->readCachedString(nodeProtobuf.membervarassignmentname());
  547. }
  548. int reboltnameIndx = nodeProtobuf.reboltname();
  549. //Add by zml rebolt 解析使用
  550. string reboltName = "";
  551. reboltName = this->readCachedString(reboltnameIndx);
  552. int reboltIdIndx = nodeProtobuf.reboltid();
  553. string reboltId = this->readCachedString(reboltIdIndx);
  554. if (!ccNodeLoader)
  555. {
  556. string redFileName = getAnimationManager()->getREDFileName();
  557. string err = StringUtils::format("文件【%s】节点名字【%s】reboltName【%s】没有找到Node解析器【%s】",redFileName.c_str(), memberVarAssignmentName.c_str(), reboltName.c_str(), className.c_str());
  558. // throw err;
  559. CCLOG("%s", err.c_str());
  560. CCLOG("!!!注意,解析器替换为默认的节点类型了!!!");
  561. // 如果没有获取到ccNodeLoader,则去按照默认的节点类型(baseName)去查找ccNodeLoader
  562. std::string baseName = this->readCachedString(nodeProtobuf.baseclassname());
  563. ccNodeLoader = this->_nodeLoaderLibrary->getNodeLoader(baseName.c_str());
  564. if(!ccNodeLoader){
  565. return nullptr;
  566. }
  567. }
  568. Node *node = ccNodeLoader->loadNode(pParent, this);
  569. setRootNodeForOrtherManger(node);
  570. readAnimatedProperties(node, nodeProtobuf);
  571. //MARK: Read properties
  572. ccNodeLoader->parseProperties(node, pParent, this, nodeProtobuf, reboltName, reboltId);
  573. //MARK:
  574. bool isREDFileNode = (nullptr == dynamic_cast<REDFile*>(node)) ? false : true;
  575. // Handle sub ccb files (remove middle node)
  576. if (isREDFileNode)
  577. {
  578. REDFile *ccbFileNode = (REDFile*)node;
  579. Node *embeddedNode = ccbFileNode->getREDFileNode();
  580. if (embeddedNode == nullptr) {
  581. CCLOG("ERROR embedded node: ReboltName", reboltName.c_str());
  582. string redFileName = getAnimationManager()->getREDFileName();
  583. string err = StringUtils::format("文件【%s】节点名字【%s】reboltName【%s】加载失败了",redFileName.c_str(), memberVarAssignmentName.c_str(), reboltName.c_str());
  584. throw err;
  585. } else {
  586. embeddedNode->setPosition(ccbFileNode->getPosition());
  587. embeddedNode->setRotation(ccbFileNode->getRotation());
  588. embeddedNode->setScaleX(ccbFileNode->getScaleX());
  589. embeddedNode->setScaleY(ccbFileNode->getScaleY());
  590. embeddedNode->setTag(ccbFileNode->getTag());
  591. embeddedNode->setVisible(ccbFileNode->isVisible());
  592. //TODO: 斜切、透明、颜色都没设置??
  593. //embeddedNode->setIgnoreAnchorPointForPosition(ccbFileNode->isIgnoreAnchorPointForPosition());
  594. _animationManager->moveAnimationsFromNode(ccbFileNode, embeddedNode);
  595. ccbFileNode->setREDFileNode(nullptr);
  596. node = embeddedNode;
  597. }
  598. }
  599. //设置透明度穿透 by zml
  600. node->setCascadeOpacityEnabled(true);
  601. if(reboltName != ""){
  602. assignReboltName(reboltName, reboltId, node);
  603. }
  604. assignREDMemberVariable(memberVarAssignmentType, memberVarAssignmentName, className, node);
  605. assignCustomProperty(ccNodeLoader, node);
  606. /* Read and add children. */
  607. int numChildren = nodeProtobuf.child_size();
  608. for(int i = 0; i < numChildren; i++)
  609. {
  610. auto& childProtoBuf = nodeProtobuf.child(i);
  611. Node * child = this->readNodeGraph(node, childProtoBuf);
  612. node->addChild(child);
  613. }
  614. // FIX ISSUE #1860: "onNodeLoaded will be called twice if ccb was added as a REDFile".
  615. // If it's a sub-ccb node, skip notification to NodeLoaderListener since it will be
  616. // notified at LINE #734: Node * child = this->readNodeGraph(node);
  617. if (!isREDFileNode)
  618. {
  619. // Call onNodeLoaded
  620. NodeLoaderListener * nodeAsNodeLoaderListener = dynamic_cast<NodeLoaderListener *>(node);
  621. if(nodeAsNodeLoaderListener != nullptr)
  622. {
  623. nodeAsNodeLoaderListener->onNodeLoaded(node, ccNodeLoader);
  624. }
  625. else if(this->_nodeLoaderListener != nullptr)
  626. {
  627. this->_nodeLoaderListener->onNodeLoaded(node, ccNodeLoader);
  628. }
  629. }
  630. return node;
  631. }
  632. REDKeyframe* REDReader::readKeyframe(PropertyType type, const RedreamInfo::Keyframe& keyframeProtobuf)
  633. {
  634. REDKeyframe *keyframe = new (std::nothrow) REDKeyframe();
  635. keyframe->autorelease();
  636. int equalPointsCount = keyframeProtobuf.equalpoints_size();
  637. std::vector<Vec2> equalPoints = {};
  638. for (int i = 0; i < equalPointsCount; ++i) {
  639. equalPoints.push_back(Vec2(keyframeProtobuf.equalpoints(i).x(), keyframeProtobuf.equalpoints(i).y()));
  640. }
  641. keyframe->setEqualPoints(equalPoints);
  642. // keyframe->setTime(readFloat());
  643. keyframe->setTime(keyframeProtobuf.time());
  644. // REDKeyframe::EasingType easingType = static_cast<REDKeyframe::EasingType>(readInt(false));
  645. RedreamInfo::Easing easing = keyframeProtobuf.easing();
  646. REDKeyframe::EasingType easingType = static_cast<REDKeyframe::EasingType>(easing.type());
  647. float *easingOpt = (float*)malloc(4 * sizeof(float));;
  648. Value value;
  649. if (easingType == REDKeyframe::EasingType::CUBIC_IN
  650. || easingType == REDKeyframe::EasingType::CUBIC_OUT
  651. || easingType == REDKeyframe::EasingType::CUBIC_INOUT
  652. || easingType == REDKeyframe::EasingType::ELASTIC_IN
  653. || easingType == REDKeyframe::EasingType::ELASTIC_OUT
  654. || easingType == REDKeyframe::EasingType::ELASTIC_INOUT)
  655. {
  656. // *easingOpt = readFloat();
  657. *easingOpt = easing.opt().easing1fopt().x();
  658. }
  659. if(easingType == REDKeyframe::EasingType::Custom){
  660. // easingOpt[0] = readFloat();
  661. // easingOpt[1] = readFloat();
  662. // easingOpt[2] = readFloat();
  663. // easingOpt[3] = readFloat();
  664. RedreamInfo::Easing4fOpt opt4f = easing.opt().easing4fopt();
  665. easingOpt[0] = opt4f.x();
  666. easingOpt[1] = opt4f.y();
  667. easingOpt[2] = opt4f.z();
  668. easingOpt[3] = opt4f.w();
  669. }
  670. keyframe->setEasingType(easingType);
  671. keyframe->setEasingOpt(easingOpt);
  672. CC_SAFE_FREE(easingOpt);
  673. RedreamInfo::Value valueProtobuf = keyframeProtobuf.value();
  674. if (type == PropertyType::CHECK)
  675. {
  676. value = valueProtobuf.boolvalue();
  677. // value = readBool();
  678. }
  679. else if (type == PropertyType::BYTE)
  680. {
  681. // value = readByte();
  682. value = valueProtobuf.intvalue();
  683. }
  684. else if (type == PropertyType::COLOR3)
  685. {
  686. // unsigned char r = readByte();
  687. // unsigned char g = readByte();
  688. // unsigned char b = readByte();
  689. RedreamInfo::Color3 color3 = valueProtobuf.color3();
  690. unsigned char r = color3.r();
  691. unsigned char g = color3.g();
  692. unsigned char b = color3.b();
  693. ValueMap colorMap;
  694. colorMap["r"] = r;
  695. colorMap["g"] = g;
  696. colorMap["b"] = b;
  697. value = colorMap;
  698. }
  699. else if (type == PropertyType::COLOR4F_VAR)
  700. {
  701. RedreamInfo::Color4FVar color4FVar = valueProtobuf.color4fvar();
  702. // float red = readFloat();
  703. // float green = readFloat();
  704. // float blue = readFloat();
  705. // float alpha = readFloat();
  706. // float redVar = readFloat();
  707. // float greenVar = readFloat();
  708. // float blueVar = readFloat();
  709. // float alphaVar = readFloat();
  710. float red = color4FVar.red();
  711. float green = color4FVar.green();
  712. float blue = color4FVar.blue();
  713. float alpha = color4FVar.alpha();
  714. float redVar = color4FVar.redvar();
  715. float greenVar = color4FVar.greenvar();
  716. float blueVar = color4FVar.bluevar();
  717. float alphaVar = color4FVar.alphavar();
  718. }
  719. else if (type == PropertyType::DEGREES)
  720. {
  721. // value = readFloat();
  722. value = valueProtobuf.floatvalue();
  723. }
  724. else if (type == PropertyType::SCALE_LOCK || type == PropertyType::POSITION
  725. || type == PropertyType::FLOAT_XY || type == PropertyType::POINT
  726. || type == PropertyType::FLOAT_VAR)
  727. {
  728. // float a = readFloat();
  729. // float b = readFloat();
  730. RedreamInfo::Vec2 vec2 = valueProtobuf.vec2();
  731. float a = vec2.x();
  732. float b = vec2.y();
  733. ValueVector ab;
  734. ab.push_back(Value(a));
  735. ab.push_back(Value(b));
  736. value = ab;
  737. }
  738. else if (type == PropertyType::SPRITEFRAME)
  739. {
  740. // std::string spriteSheet = readCachedString();
  741. // std::string spriteFile = readCachedString();
  742. RedreamInfo::SpriteFrame spriteFramProtobuf = valueProtobuf.spriteframe();
  743. std::string spriteSheet = readCachedString(spriteFramProtobuf.spritesheet());
  744. std::string spriteFile = readCachedString(spriteFramProtobuf.spritefile());
  745. SpriteFrame* spriteFrame = getSpriteFrameByName(spriteFile, spriteSheet,true);
  746. //add by songqingyu 记录信息,重置用
  747. ValueVector vv = {Value(spriteSheet),Value(spriteFile)};
  748. value = Value(vv);
  749. keyframe->setObject(spriteFrame);
  750. }else if (type == PropertyType::SPINE_SKELFRAME)
  751. {
  752. // std::string animation = readCachedString();
  753. // float progress = readFloat();
  754. // bool isLoop = readBool();
  755. RedreamInfo::SkelFrame skelFrame = valueProtobuf.skelframe();
  756. std::string animation = readCachedString(skelFrame.animation());
  757. float progress = skelFrame.progress();
  758. bool isLoop = skelFrame.loop();
  759. ValueMap frameMap;
  760. frameMap["animation"] = animation;
  761. frameMap["progress"] = progress;
  762. frameMap["loop"] = isLoop;
  763. value = frameMap;
  764. }else if (type == PropertyType::ANIMATION)
  765. {
  766. // value = readInt(true);
  767. value = valueProtobuf.intvalue();
  768. }else if (type == PropertyType::TEXT)
  769. {
  770. // value = readInt(true);
  771. value = Value(readCachedString(valueProtobuf.intvalue()));
  772. }
  773. else if (type == PropertyType::BAKE_ANIMATION) {
  774. RedreamInfo::BakeAnimation bakeAnimation = valueProtobuf.bakeanimation();
  775. value = Value(ValueVector({
  776. Value(bakeAnimation.animationname()),
  777. Value(bakeAnimation.elapsedtime()),
  778. Value(bakeAnimation.loop())
  779. }));
  780. } else {
  781. CCASSERT(false, "unexpected Property");
  782. }
  783. if (!value.isNull())
  784. keyframe->setValue(value);
  785. return keyframe;
  786. }
  787. bool REDReader::readCallbackKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences)
  788. {
  789. // int numKeyframes = readInt(false);
  790. // if(!numKeyframes) return true;
  791. int numKeyframes = sequences.callbackkeyframe_size();
  792. if(numKeyframes == 0) return true;
  793. REDSequenceProperty* channel = new (std::nothrow) REDSequenceProperty();
  794. channel->autorelease();
  795. for(int i = 0; i < numKeyframes; ++i) {
  796. RedreamInfo::CallbackKeyframe callbackKeyframe = sequences.callbackkeyframe(i);
  797. // float time = readFloat();
  798. // std::string callbackName = readCachedString();
  799. // int callbackType = readInt(false);
  800. float time = callbackKeyframe.time();
  801. std::string callbackName = readCachedString(callbackKeyframe.name());
  802. int callbackType = callbackKeyframe.type();
  803. ValueVector valueVector;
  804. valueVector.push_back(Value(callbackName));
  805. valueVector.push_back(Value(callbackType));
  806. REDKeyframe* keyframe = new (std::nothrow) REDKeyframe();
  807. keyframe->autorelease();
  808. keyframe->setTime(time);
  809. keyframe->setValue(Value(valueVector));
  810. channel->getKeyframes().pushBack(keyframe);
  811. }
  812. seq->setCallbackChannel(channel);
  813. return true;
  814. }
  815. bool REDReader::readSoundKeyframesForSeq(REDSequence* seq, RedreamInfo::Sequences& sequences) {
  816. // int numKeyframes = readInt(false);
  817. // if(!numKeyframes) return true;
  818. int numKeyframes = sequences.soundkeyframe_size();
  819. if(numKeyframes == 0) return true;
  820. REDSequenceProperty* channel = new (std::nothrow) REDSequenceProperty();
  821. channel->autorelease();
  822. for(int i = 0; i < numKeyframes; ++i) {
  823. RedreamInfo::SoundKeyframe soundKeyframe = sequences.soundkeyframe(i);
  824. // float time = readFloat();
  825. // std::string soundFile = readCachedString();
  826. // float pitch = readFloat();
  827. // float pan = readFloat();
  828. // float gain = readFloat();
  829. float time = soundKeyframe.time();
  830. std::string soundFile = readCachedString(soundKeyframe.soundfile());
  831. float pitch = soundKeyframe.pitch();
  832. float pan = soundKeyframe.pan();
  833. float gain = soundKeyframe.gain();
  834. ValueVector vec;
  835. vec.push_back(Value(soundFile));
  836. vec.push_back(Value(pitch));
  837. vec.push_back(Value(pan));
  838. vec.push_back(Value(gain));
  839. REDKeyframe* keyframe = new (std::nothrow) REDKeyframe();
  840. keyframe->setTime(time);
  841. keyframe->setValue(Value(vec));
  842. channel->getKeyframes().pushBack(keyframe);
  843. keyframe->release();
  844. }
  845. seq->setSoundChannel(channel);
  846. return true;
  847. }
  848. bool REDReader::readWiseKeyframesForSeq(REDSequence *seq, RedreamInfo::Sequences &sequences) {
  849. int numKeyframes = sequences.wisekeyframe_size();
  850. if (numKeyframes == 0) {
  851. return true;
  852. }
  853. REDSequenceProperty* channel = new (std::nothrow) REDSequenceProperty();
  854. channel->autorelease();
  855. for(int i = 0; i < numKeyframes; ++i) {
  856. RedreamInfo::WiseKeyframe wiseKeyframe = sequences.wisekeyframe(i);
  857. float time = wiseKeyframe.time();
  858. std::string bnkFileName = wiseKeyframe.bnk_file_name();
  859. std::string eventName = wiseKeyframe.event_name();
  860. bool forcePostEvent = wiseKeyframe.force_post_event();
  861. ValueVector params;
  862. for (const RedreamInfo::WiseKeyframeParam& rParam : wiseKeyframe.params()) {
  863. std::string paramKey = rParam.key();
  864. float paramValue = rParam.value();
  865. ValueVector paramVec = ValueVector({ Value(paramKey), Value(paramValue) });
  866. params.push_back(Value(paramVec));
  867. }
  868. ValueVector valueVec({
  869. Value(bnkFileName),
  870. Value(eventName),
  871. Value(forcePostEvent),
  872. Value(params)
  873. });
  874. REDKeyframe* keyframe = new (std::nothrow) REDKeyframe();
  875. keyframe->autorelease();
  876. keyframe->setTime(time);
  877. keyframe->setValue(Value(valueVec));
  878. channel->getKeyframes().pushBack(keyframe);
  879. }
  880. seq->setWiseChannel(channel);
  881. return true;
  882. }
  883. Node * REDReader::readNodeGraph() {
  884. return this->readNodeGraph(nullptr, _redFileProtobuf->root());
  885. }
  886. bool REDReader::readSequences()
  887. {
  888. auto& sequences = _animationManager->getSequences();
  889. // int numSeqs = readInt(false);
  890. int numSeqs = _redFileProtobuf->sequences_size();
  891. for (int i = 0; i < numSeqs; i++)
  892. {
  893. REDSequence *seq = new (std::nothrow) REDSequence();
  894. seq->autorelease();
  895. RedreamInfo::Sequences sequencesProtobuf = _redFileProtobuf->sequences(i);
  896. // seq->setDuration(readFloat());
  897. // seq->setName(readCachedString().c_str());
  898. // seq->setSequenceId(readInt(false));
  899. // seq->setChainedSequenceId(readInt(true));
  900. seq->setDuration(sequencesProtobuf.duration());
  901. seq->setName(readCachedString(sequencesProtobuf.name()).c_str());
  902. seq->setSequenceId(sequencesProtobuf.sequenceid());
  903. seq->setChainedSequenceId(sequencesProtobuf.chainedsequenceid());
  904. if(!readCallbackKeyframesForSeq(seq, sequencesProtobuf)) return false;
  905. if(!readSoundKeyframesForSeq(seq, sequencesProtobuf)) return false;
  906. if(!readWiseKeyframesForSeq(seq, sequencesProtobuf)) return false;
  907. sequences.pushBack(seq);
  908. }
  909. // _animationManager->setAutoPlaySequenceId(readInt(true));
  910. _animationManager->setAutoPlaySequenceId(_redFileProtobuf->autoplaysequenceid());
  911. return true;
  912. }
  913. std::string REDReader::lastPathComponent(const char* pPath) {
  914. std::string path(pPath);
  915. size_t slashPos = path.find_last_of("/");
  916. if(slashPos != std::string::npos) {
  917. return path.substr(slashPos + 1, path.length() - slashPos);
  918. }
  919. return path;
  920. }
  921. std::string REDReader::deletePathExtension(const char* pPath) {
  922. std::string path(pPath);
  923. size_t dotPos = path.find_last_of(".");
  924. if(dotPos != std::string::npos) {
  925. return path.substr(0, dotPos);
  926. }
  927. return path;
  928. }
  929. std::string REDReader::toLowerCase(const char* pString) {
  930. std::string copy(pString);
  931. std::transform(copy.begin(), copy.end(), copy.begin(), ::tolower);
  932. return copy;
  933. }
  934. bool REDReader::endsWith(const char* pString, const char* pEnding) {
  935. std::string string(pString);
  936. std::string ending(pEnding);
  937. if(string.length() >= ending.length()) {
  938. return (string.compare(string.length() - ending.length(), ending.length(), ending) == 0);
  939. } else {
  940. return false;
  941. }
  942. }
  943. bool REDReader::isJSControlled()
  944. {
  945. return false;
  946. }
  947. void REDReader::addOwnerCallbackName(const std::string& name)
  948. {
  949. _ownerCallbackNames.push_back(name);
  950. }
  951. void REDReader::addOwnerCallbackNode(Node *node)
  952. {
  953. _ownerCallbackNodes.pushBack(node);
  954. }
  955. void REDReader::addOwnerCallbackControlEvents(Control::EventType type)
  956. {
  957. _ownerOwnerCallbackControlEvents.push_back(Value((int)type));
  958. }
  959. void REDReader::addDocumentCallbackName(const std::string& name)
  960. {
  961. _animationManager->addDocumentCallbackName(name);
  962. }
  963. void REDReader::addDocumentCallbackNode(Node *node)
  964. {
  965. _animationManager->addDocumentCallbackNode(node);
  966. }
  967. void REDReader::addDocumentCallbackControlEvents(Control::EventType eventType)
  968. {
  969. _animationManager->addDocumentCallbackControlEvents(eventType);
  970. }
  971. ValueVector REDReader::getOwnerCallbackNames()
  972. {
  973. ValueVector ret;
  974. ret.reserve(_ownerCallbackNames.size());
  975. std::vector<std::string>::iterator it = _ownerCallbackNames.begin();
  976. for (; it != _ownerCallbackNames.end(); ++it)
  977. {
  978. ret.push_back(Value(*it));
  979. }
  980. return ret;
  981. }
  982. Vector<Node*>& REDReader::getOwnerCallbackNodes()
  983. {
  984. return _ownerCallbackNodes;
  985. }
  986. ValueVector& REDReader::getOwnerCallbackControlEvents()
  987. {
  988. return _ownerOwnerCallbackControlEvents;
  989. }
  990. ValueVector REDReader::getOwnerOutletNames()
  991. {
  992. ValueVector ret;
  993. ret.reserve(_ownerOutletNames.size());
  994. std::vector<std::string>::iterator it = _ownerOutletNames.begin();
  995. for (; it != _ownerOutletNames.end(); ++it)
  996. {
  997. ret.push_back(Value(*it));
  998. }
  999. return ret;
  1000. }
  1001. Vector<Node*>& REDReader::getOwnerOutletNodes()
  1002. {
  1003. return _ownerOutletNodes;
  1004. }
  1005. Vector<Node*>& REDReader::getNodesWithAnimationManagers()
  1006. {
  1007. return _nodesWithAnimationManagers;
  1008. }
  1009. Vector<REDAnimationManager*>& REDReader::getAnimationManagersForNodes()
  1010. {
  1011. return _animationManagersForNodes;
  1012. }
  1013. void REDReader::addOwnerOutletName(std::string name)
  1014. {
  1015. _ownerOutletNames.push_back(name);
  1016. }
  1017. void REDReader::addOwnerOutletNode(Node *node)
  1018. {
  1019. if (nullptr == node)
  1020. return;
  1021. _ownerOutletNodes.pushBack(node);
  1022. }
  1023. /************************************************************************
  1024. Static functions
  1025. ************************************************************************/
  1026. static float __ccbResolutionScale = 1.0f;
  1027. float REDReader::getResolutionScale()
  1028. {
  1029. return __ccbResolutionScale;
  1030. }
  1031. void REDReader::setResolutionScale(float scale)
  1032. {
  1033. __ccbResolutionScale = scale;
  1034. }
  1035. /// ---- add by songqingyu
  1036. ///之前好几个地方都写一遍此逻辑去获取图片,现在统一放在一个方法里面
  1037. ///根据file和sheet去获取SpriteFrame如果没有去找单图,单图没有,用空图替换,不会崩溃
  1038. SpriteFrame* REDReader::getSpriteFrameByName(std::string spriteFile,std::string spriteSheet,bool useDefaultEmpty){
  1039. //注意 此函数的SpriteFrame创建使用方法=>SpriteFrame::create(spriteFile, bounds);
  1040. //因为这样才能记住spritefile的名字.方便之后的重置.
  1041. SpriteFrame* spriteFrame = nullptr;
  1042. SpriteFrameCache* frameCache = SpriteFrameCache::getInstance();
  1043. TextureCache* textCache = Director::getInstance()->getTextureCache();
  1044. spriteFrame = frameCache->getSpriteFrameByName(spriteFile,_plistSt);
  1045. if (CocosConfig::getIgnoreCCBPath()) {
  1046. if (!spriteFrame) {
  1047. spriteFile = _REDRootPath + spriteFile;
  1048. Texture2D * texture = textCache->addImage(spriteFile);
  1049. if(texture != NULL) {
  1050. Rect bounds = Rect(0, 0,
  1051. texture->getContentSize().width,
  1052. texture->getContentSize().height);
  1053. spriteFrame = SpriteFrame::createWithTexture(texture, bounds);
  1054. if (spriteFrame) {
  1055. spriteFrame->setTextureFilename(spriteFile);
  1056. }
  1057. }
  1058. }
  1059. }else{
  1060. if (spriteSheet.empty())
  1061. {
  1062. if (!spriteFrame) {
  1063. spriteFile = _REDRootPath + spriteFile;
  1064. Texture2D * texture = textCache->addImage(spriteFile);
  1065. if(texture != NULL) {
  1066. Rect bounds = Rect(0, 0,
  1067. texture->getContentSize().width,
  1068. texture->getContentSize().height);
  1069. spriteFrame = SpriteFrame::createWithTexture(texture, bounds);
  1070. if (spriteFrame) {
  1071. spriteFrame->setTextureFilename(spriteFile);
  1072. }
  1073. }
  1074. }
  1075. }
  1076. else
  1077. {
  1078. if (!spriteFrame) {
  1079. spriteSheet = _REDRootPath + spriteSheet;
  1080. // Load the sprite sheet only if it is not loaded
  1081. if (_loadedSpriteSheets.find(spriteSheet) == _loadedSpriteSheets.end())
  1082. {
  1083. frameCache->addSpriteFramesWithFile(spriteSheet);
  1084. _loadedSpriteSheets.insert(spriteSheet);
  1085. CCLOG("sqttest 没有图 %s",spriteSheet.c_str());
  1086. }
  1087. spriteFrame = frameCache->getSpriteFrameByName(spriteFile,{spriteSheet});
  1088. }
  1089. }
  1090. }
  1091. //add by djd 防止崩溃,用默认空白图
  1092. if (!spriteFrame && useDefaultEmpty) {
  1093. spriteFile = CocosConfig::getDefaultEmptyPic();
  1094. Texture2D * texture = textCache->addImage(spriteFile);
  1095. if(texture != NULL) {
  1096. Rect bounds = Rect(0, 0,
  1097. texture->getContentSize().width,
  1098. texture->getContentSize().height);
  1099. spriteFrame = SpriteFrame::createWithTexture(texture, bounds);
  1100. if (spriteFrame) {
  1101. spriteFrame->setTextureFilename(spriteFile);
  1102. }
  1103. }
  1104. }
  1105. return spriteFrame;
  1106. }
  1107. bool REDReader::readFrameNamesFromFile(const char *pREDFileName){
  1108. if (nullptr == pREDFileName || strlen(pREDFileName) == 0)
  1109. {
  1110. return false;
  1111. }
  1112. std::string strREDFileName(pREDFileName);
  1113. size_t pos = strREDFileName.rfind(".");
  1114. if (pos == string::npos) {//要求必须有后缀名
  1115. return false;
  1116. }
  1117. std::string strSuffix(".batchredream");
  1118. std::string endSuffix = strREDFileName.substr(pos);
  1119. if (endSuffix == strSuffix) {
  1120. _isBatchNode = true;
  1121. }
  1122. std::string strPath = FileUtils::getInstance()->fullPathForFilename(strREDFileName);
  1123. // auto dataPtr = std::make_shared<Data>(FileUtils::getInstance()->getDataFromFile(strPath));
  1124. _data = this->getBytesFromREDFileByName(strPath);
  1125. _currentByte = 0;
  1126. _currentBit = 0;
  1127. _owner = nullptr;
  1128. _redFileProtobuf = new RedreamInfo::RedFile();
  1129. bool isSuccess = _redFileProtobuf->ParseFromArray(_data->getBytes(), (int)_data->getSize());//获取到所有的字符串,然后创建内容
  1130. if(!isSuccess) {
  1131. CC_SAFE_DELETE(_redFileProtobuf);
  1132. return false;
  1133. }
  1134. if ( !readHeader())
  1135. {
  1136. CC_SAFE_DELETE(_redFileProtobuf);
  1137. return false;
  1138. }
  1139. if (! readSequences())
  1140. {
  1141. CC_SAFE_DELETE(_redFileProtobuf);
  1142. return false;
  1143. }
  1144. readFrameNames();
  1145. CC_SAFE_DELETE(_redFileProtobuf);
  1146. return true;
  1147. }
  1148. void REDReader::readFrameNames(){
  1149. RedreamInfo::BatchRed bt = _redFileProtobuf->batchred();
  1150. const RedreamInfo::BatchRed_TextureList& tl = bt.textures();
  1151. //读取plist对应的图
  1152. for (auto it : bt.frames()) {
  1153. vector<std::string> frames;
  1154. frames.reserve(it.second.texturename_size());
  1155. for (auto el : it.second.texturename()) {
  1156. frames.push_back(el);
  1157. }
  1158. _batchPlistFrameNames[it.first] = frames;
  1159. }
  1160. //读取单图资源列表
  1161. for (auto el : tl.texturename()) {
  1162. vector<std::string> frames;
  1163. frames.push_back(el);
  1164. _batchPlistFrameNames[el] = frames;
  1165. }
  1166. }
  1167. };