Sprite3D::~Sprite3D() { _meshes.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); }
bool Sprite3D::initWithFile(const std::string &path) { _meshes.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); if (loadFromCache(path)) return true; //load from file std::string ext = path.substr(path.length() - 4, 4); std::transform(ext.begin(), ext.end(), ext.begin(), tolower); if (ext == ".obj") { return loadFromObj(path); } else if (ext == ".c3b" || ext == ".c3t") { return loadFromC3x(path); } return false; }
void Sprite3D::afterAsyncLoad(void* param) { Sprite3D::AsyncLoadParam* asyncParam = (Sprite3D::AsyncLoadParam*)param; autorelease(); if (asyncParam) { if (asyncParam->result) { _meshes.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); //create in the main thread auto& meshdatas = asyncParam->meshdatas; auto& materialdatas = asyncParam->materialdatas; auto& nodeDatas = asyncParam->nodeDatas; if (initFrom(*nodeDatas, *meshdatas, *materialdatas)) { auto spritedata = Sprite3DCache::getInstance()->getSpriteData(asyncParam->modlePath); if (spritedata == nullptr) { //add to cache auto data = new (std::nothrow) Sprite3DCache::Sprite3DData(); data->materialdatas = materialdatas; data->nodedatas = nodeDatas; data->meshVertexDatas = _meshVertexDatas; for (const auto mesh : _meshes) { data->glProgramStates.pushBack(mesh->getGLProgramState()); } Sprite3DCache::getInstance()->addSprite3DData(asyncParam->modlePath, data); CC_SAFE_DELETE(meshdatas); materialdatas = nullptr; nodeDatas = nullptr; } } CC_SAFE_DELETE(meshdatas); CC_SAFE_DELETE(materialdatas); CC_SAFE_DELETE(nodeDatas); if (asyncParam->texPath != "") { setTexture(asyncParam->texPath); } } else { CCLOG("file load failed: %s ", asyncParam->modlePath.c_str()); } asyncParam->afterLoadCallback(this, asyncParam->callbackParam); } }
bool Sprite3D::initWithFile(const std::string& path) { _aabbDirty = true; _meshes.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); if (loadFromCache(path)) return true; MeshDatas* meshdatas = new (std::nothrow) MeshDatas(); MaterialDatas* materialdatas = new (std::nothrow) MaterialDatas(); NodeDatas* nodeDatas = new (std::nothrow) NodeDatas(); if (loadFromFile(path, nodeDatas, meshdatas, materialdatas)) { if (initFrom(*nodeDatas, *meshdatas, *materialdatas)) { //add to cache auto data = new (std::nothrow) Sprite3DCache::Sprite3DData(); data->materialdatas = materialdatas; data->nodedatas = nodeDatas; data->meshVertexDatas = _meshVertexDatas; for (const auto mesh : _meshes) { data->glProgramStates.pushBack(mesh->getGLProgramState()); } Sprite3DCache::getInstance()->addSprite3DData(path, data); CC_SAFE_DELETE(meshdatas); _contentSize = getBoundingBox().size; return true; } } CC_SAFE_DELETE(meshdatas); CC_SAFE_DELETE(materialdatas); CC_SAFE_DELETE(nodeDatas); return false; }