void SkeletonRenderer::initWithBinaryFile (const std::string& skeletonDataFile, spAtlas* atlas, float scale) { _atlas = atlas; _attachmentLoader = SUPER(Cocos2dAttachmentLoader_create(_atlas)); spSkeletonBinary* binary = spSkeletonBinary_createWithLoader(_attachmentLoader); binary->scale = scale; spSkeletonData* skeletonData = spSkeletonBinary_readSkeletonDataFile(binary, skeletonDataFile.c_str()); CCASSERT(skeletonData, binary->error ? binary->error : "Error reading skeleton data file."); spSkeletonBinary_dispose(binary); setSkeletonData(skeletonData, true); initialize(); }
spSkeletonData* USpineSkeletonDataAsset::GetSkeletonData (spAtlas* Atlas, bool ForceReload) { if (!skeletonData || ForceReload) { if (skeletonData) { spSkeletonData_dispose(skeletonData); skeletonData = nullptr; } int dataLen = rawData.Num(); if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) { spSkeletonJson* json = spSkeletonJson_create(Atlas); this->skeletonData = spSkeletonJson_readSkeletonData(json, (const char*)rawData.GetData()); if (!skeletonData) { #if WITH_EDITORONLY_DATA FMessageDialog::Debugf(FText::FromString(UTF8_TO_TCHAR(json->error))); #endif UE_LOG(SpineLog, Error, TEXT("Couldn't load skeleton data and atlas: %s"), UTF8_TO_TCHAR(json->error)); } spSkeletonJson_dispose(json); } else { spSkeletonBinary* binary = spSkeletonBinary_create(Atlas); this->skeletonData = spSkeletonBinary_readSkeletonData(binary, (const unsigned char*)rawData.GetData(), (int)rawData.Num()); if (!skeletonData) { #if WITH_EDITORONLY_DATA FMessageDialog::Debugf(FText::FromString(UTF8_TO_TCHAR(binary->error))); #endif UE_LOG(SpineLog, Error, TEXT("Couldn't load skeleton data and atlas: %s"), UTF8_TO_TCHAR(binary->error)); } spSkeletonBinary_dispose(binary); } if (animationStateData) { spAnimationStateData_dispose(animationStateData); GetAnimationStateData(Atlas); } lastAtlas = Atlas; } return this->skeletonData; }
spSkeletonData* USpineSkeletonDataAsset::GetSkeletonData (spAtlas* Atlas, bool ForceReload) { if (!skeletonData || ForceReload) { if (skeletonData) { spSkeletonData_dispose(skeletonData); skeletonData = nullptr; } int dataLen = rawData.Num(); if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) { spSkeletonJson* json = spSkeletonJson_create(Atlas); this->skeletonData = spSkeletonJson_readSkeletonData(json, (const char*)rawData.GetData()); spSkeletonJson_dispose(json); } else { spSkeletonBinary* binary = spSkeletonBinary_create(Atlas); this->skeletonData = spSkeletonBinary_readSkeletonData(binary, (const unsigned char*)rawData.GetData(), (int)rawData.Num()); spSkeletonBinary_dispose(binary); } if (animationStateData) { spAnimationStateData_dispose(animationStateData); GetAnimationStateData(Atlas); } lastAtlas = Atlas; } return this->skeletonData; }
SpineDrawable::SpineDrawable(const std::string& atlasFile, const std::string& skeletonFile): Component(TYPE) { atlas = spAtlas_createFromFile(atlasFile.c_str(), 0); if (!atlas) { ouzel::Log(ouzel::Log::Level::ERR) << "Failed to load atlas"; return; } if (skeletonFile.find(".json") != std::string::npos) { // is json format spSkeletonJson* json = spSkeletonJson_create(atlas); skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonFile.c_str()); if (!skeletonData) { ouzel::Log(ouzel::Log::Level::ERR) << "Failed to load skeleton: " << json->error; return; } spSkeletonJson_dispose(json); } else { // binary format spSkeletonBinary* binary = spSkeletonBinary_create(atlas); skeletonData = spSkeletonBinary_readSkeletonDataFile(binary, skeletonFile.c_str()); if (!skeletonData) { ouzel::Log(ouzel::Log::Level::ERR) << "Failed to load skeleton: " << binary->error; return; } spSkeletonBinary_dispose(binary); } bounds = spSkeletonBounds_create(); skeleton = spSkeleton_create(skeletonData); animationStateData = spAnimationStateData_create(skeletonData); animationState = spAnimationState_create(animationStateData); animationState->listener = listener; animationState->rendererObject = this; spSkeleton_setToSetupPose(skeleton); spSkeleton_updateWorldTransform(skeleton); updateMaterials(); updateBoundingBox(); indexBuffer = std::make_shared<ouzel::graphics::Buffer>(*ouzel::engine->getRenderer()); indexBuffer->init(ouzel::graphics::Buffer::Usage::INDEX, ouzel::graphics::Buffer::DYNAMIC); vertexBuffer = std::make_shared<ouzel::graphics::Buffer>(*ouzel::engine->getRenderer()); vertexBuffer->init(ouzel::graphics::Buffer::Usage::VERTEX, ouzel::graphics::Buffer::DYNAMIC); whitePixelTexture = ouzel::engine->getCache().getTexture(ouzel::TEXTURE_WHITE_PIXEL); updateHandler.updateHandler = std::bind(&SpineDrawable::handleUpdate, this, std::placeholders::_1); ouzel::engine->getEventDispatcher().addEventHandler(&updateHandler); }