123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- //
- // RedSpineBakeModel.hpp
- // empty2dx-desktop
- //
- // Created by Liang zhong on 2022/11/5.
- //
- #ifndef RedSpineBakeModel_h
- #define RedSpineBakeModel_h
- #include <stdio.h>
- #include <queue>
- #include <thread>
- #include <mutex>
- #include <condition_variable>
- #include "cocos2d.h"
- #include "RedSlotBakeModel.h"
- #include "RedAnimationBakeModel.h"
- #include "spine_bake_data.pb.h"
- #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
- # include <jni.h>
- # include "platform/android/jni/JniHelper.h"
- # include "platform/android/CCFileUtils-android.h"
- # include <android/asset_manager.h>
- # define BinaryFileClassName "org/cocos2dx/cpp/BinaryFileUtils"
- typedef unsigned char BYTE;
- struct ByteData {
- std::vector<jbyte> data;
- int length;
- };
- #endif
- typedef struct _AsyncLoadAnimationFileRequest {
- std::string key = "";
- std::string fileFullPath = "";
- bool isCharacter = false;
- } AsyncLoadAnimationFileRequest;
- class RedSpineBakeManage
- {
- public:
- static RedSpineBakeManage* getInstance();
- static void destoryInstance();
- void setCurrentAnimationBakeModel(std::string aName,RedAnimationBakeModel *aAni);
- RedAnimationBakeModel * getAnimateByName(std::string aFileName,std::string aName);
- void endBakeSaveToFile(std::string aPath);
- void startBake(std::string aFileName);
- void loadAnimationFileAsync(const std::string& aFileName, const std::string& aPath, bool isCharacter = false);
- void loadAnimationFile(const std::string& aFileName, const std::string& aPath, bool isCharacter = false);
- void releaseAimationFile(std::string aFileName);
- void fetchAnimations(const std::string& aFileName, std::vector<std::string>& anims);
-
- private:
- RedSpineBakeManage() = default;
- ~RedSpineBakeManage() = default;
-
- /**
- * 功能:释放烘培管理器
- */
- void _release();
-
- /**
- * 功能:子线程读取烘培动画文件
- */
- void _readAnimationFileInThread();
-
- /**
- * 功能:解析指定路径的动画proto文件
- * 参数 fileFullPath:动画proto文件的全路径
- * 参数 dataIndex_pb:proto文件解析后得到的数据
- * 返回值:解析得到的数据,如果解析失败数据为空
- */
- cocos2d::Data _parseProtoData(const std::string& fileFullPath, const std::string& fileName, google::protobuf::Map<std::string, ::RedSpineBakeProto::DataInfo>& dataIndexPb, bool isCharacter = false);
-
- private:
- std::unordered_map<std::string, std::unordered_map<std::string, RedAnimationBakeModel *>>animateList;//记录所有animate
- std::string fileName;
- std::string filePath;
- std::map<std::string, std::list<std::function<void(void)>>> cbsLoading;
-
- //记录所有文件
- std::unordered_map<std::string, cocos2d::Data> byteArrayList;
- std::unordered_map<std::string, ::google::protobuf::Map<std::string, ::RedSpineBakeProto::DataInfo>> dataIndexPbList;
-
- ///异步加载文件线程
- std::thread* _loadThread = nullptr;
- ///异步加载文件请求队列
- std::queue<AsyncLoadAnimationFileRequest*> _requests;
- ////异步加载文件请求队列锁
- std::mutex _requestsMtx;
- ///线程休眠条件变量
- condition_variable _sleepCondition;
- };
- #endif /* RedSpineBakeModel_h */
|