Error Skeleton::load(const ResourceFilename& filename) { XmlDocument doc; ANKI_CHECK(openFileParseXml(filename, doc)); XmlElement rootEl; ANKI_CHECK(doc.getChildElement("skeleton", rootEl)); XmlElement bonesEl; ANKI_CHECK(rootEl.getChildElement("bones", bonesEl)); // count the bones count XmlElement boneEl; U32 bonesCount = 0; ANKI_CHECK(bonesEl.getChildElement("bone", boneEl)); ANKI_CHECK(boneEl.getSiblingElementsCount(bonesCount)); ++bonesCount; m_bones.create(getAllocator(), bonesCount); // Load every bone bonesCount = 0; do { Bone& bone = m_bones[bonesCount++]; // <name> XmlElement nameEl; ANKI_CHECK(boneEl.getChildElement("name", nameEl)); CString tmp; ANKI_CHECK(nameEl.getText(tmp)); bone.m_name.create(getAllocator(), tmp); // <transform> XmlElement trfEl; ANKI_CHECK(boneEl.getChildElement("transform", trfEl)); ANKI_CHECK(trfEl.getMat4(bone.m_transform)); // Advance ANKI_CHECK(boneEl.getNextSiblingElement("bone", boneEl)); } while(boneEl); return ErrorCode::NONE; }
//============================================================================== void Skeleton::load(const CString& filename, ResourceInitializer& init) { XmlDocument doc; doc.loadFile(filename, init.m_tempAlloc); XmlElement rootEl = doc.getChildElement("skeleton"); XmlElement bonesEl = rootEl.getChildElement("bones"); // count the bones count U bonesCount = 0; XmlElement boneEl = bonesEl.getChildElement("bone"); do { ++bonesCount; boneEl = boneEl.getNextSiblingElement("bone"); } while(boneEl); // Alloc the vector m_bones = std::move(ResourceVector<Bone>(init.m_alloc)); m_bones.resize(bonesCount, Bone(init.m_alloc)); // Load every bone boneEl = bonesEl.getChildElement("bone"); bonesCount = 0; do { Bone& bone = m_bones[bonesCount++]; // <name> XmlElement nameEl = boneEl.getChildElement("name"); bone.m_name = nameEl.getText(); // <transform> XmlElement trfEl = boneEl.getChildElement("transform"); bone.m_transform = trfEl.getMat4(); // Advance boneEl = boneEl.getNextSiblingElement("bone"); } while(boneEl); }