bool Sprite3D::loadFromCache(const std::string& path) { auto spritedata = Sprite3DCache::getInstance()->getSpriteData(path); if (spritedata) { for (auto it : spritedata->meshVertexDatas) { _meshVertexDatas.pushBack(it); } _skeleton = Skeleton3D::create(spritedata->nodedatas->skeleton); CC_SAFE_RETAIN(_skeleton); for(const auto& it : spritedata->nodedatas->nodes) { if(it) { createNode(it, this, *(spritedata->materialdatas), spritedata->nodedatas->nodes.size() == 1); } } for(const auto& it : spritedata->nodedatas->skeleton) { if(it) { createAttachSprite3DNode(it,*(spritedata->materialdatas)); } } for (ssize_t i = 0; i < _meshes.size(); i++) { _meshes.at(i)->setGLProgramState(spritedata->glProgramStates.at(i)); } return true; } return false; }
bool Sprite3D::initFrom(const NodeDatas& nodeDatas, const MeshDatas& meshdatas, const MaterialDatas& materialdatas) { for(const auto& it : meshdatas.meshDatas) { if(it) { // Mesh* mesh = Mesh::create(*it); // _meshes.pushBack(mesh); auto meshvertex = MeshVertexData::create(*it); _meshVertexDatas.pushBack(meshvertex); } } _skeleton = Skeleton3D::create(nodeDatas.skeleton); CC_SAFE_RETAIN(_skeleton); for(const auto& it : nodeDatas.nodes) { if(it) { createNode(it, this, materialdatas, nodeDatas.nodes.size() == 1); } } for(const auto& it : nodeDatas.skeleton) { if(it) { createAttachSprite3DNode(it,materialdatas); } } genGLProgramState(); return true; }
void Sprite3D::createAttachSprite3DNode(NodeData* nodedata,const MaterialDatas& matrialdatas) { for(const auto& it : nodedata->modelNodeDatas) { if(it && getAttachNode(nodedata->id)) { auto sprite = createSprite3DNode(nodedata,it,matrialdatas); if (sprite) { getAttachNode(nodedata->id)->addChild(sprite); } } } for(const auto& it : nodedata->children) { createAttachSprite3DNode(it,matrialdatas); } }
bool Sprite3D::loadFromCache(const std::string& path) { auto spritedata = Sprite3DCache::getInstance()->getSpriteData(path); if (spritedata) { for (auto it : spritedata->meshVertexDatas) { _meshVertexDatas.pushBack(it); } _skeleton = Skeleton3D::create(spritedata->nodedatas->skeleton); CC_SAFE_RETAIN(_skeleton); const bool singleSprite = (spritedata->nodedatas->nodes.size() == 1); for(const auto& it : spritedata->nodedatas->nodes) { if(it) { createNode(it, this, *(spritedata->materialdatas), singleSprite); } } for(const auto& it : spritedata->nodedatas->skeleton) { if(it) { createAttachSprite3DNode(it,*(spritedata->materialdatas)); } } for (ssize_t i = 0, size = _meshes.size(); i < size; ++i) { // cloning is needed in order to have one state per sprite auto glstate = spritedata->glProgramStates.at(i); _meshes.at(i)->setGLProgramState(glstate->clone()); } return true; } return false; }