//============================================================================== void Material::load(const CString& filename, ResourceInitializer& init) { try { m_vars = std::move(ResourceVector<MaterialVariable*>(init.m_alloc)); Dictionary<MaterialVariable*> dict(10, Dictionary<MaterialVariable*>::hasher(), Dictionary<MaterialVariable*>::key_equal(), init.m_alloc); m_varDict = std::move(dict); m_progs = std::move(ResourceVector<ProgramResourcePointer>(init.m_alloc)); m_pplines = std::move(ResourceVector<GlProgramPipelineHandle>(init.m_alloc)); XmlDocument doc; doc.loadFile(filename, init.m_tempAlloc); parseMaterialTag(doc.getChildElement("material"), init); } catch(std::exception& e) { throw ANKI_EXCEPTION("Failed to load material") << e; } }
//============================================================================== Error Material::load(const CString& filename, ResourceInitializer& init) { Error err = ErrorCode::NONE; m_resources = &init.m_resources; XmlDocument doc; ANKI_CHECK(doc.loadFile(filename, init.m_tempAlloc)); XmlElement el; ANKI_CHECK(doc.getChildElement("material", el)); ANKI_CHECK(parseMaterialTag(el , init)); return err; }
//============================================================================== 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); }
//============================================================================== Error ParticleEmitterResource::load(const CString& filename) { U32 tmp; XmlDocument doc; ANKI_CHECK(doc.loadFile(filename, getTempAllocator())); XmlElement rel; // Root element ANKI_CHECK(doc.getChildElement("particleEmitter", rel)); // XML load // ANKI_CHECK(xmlF32(rel, "life", m_particle.m_life)); ANKI_CHECK(xmlF32(rel, "lifeDeviation", m_particle.m_lifeDeviation)); ANKI_CHECK(xmlF32(rel, "mass", m_particle.m_mass)); ANKI_CHECK(xmlF32(rel, "massDeviation", m_particle.m_massDeviation)); ANKI_CHECK(xmlF32(rel, "size", m_particle.m_size)); ANKI_CHECK(xmlF32(rel, "sizeDeviation", m_particle.m_sizeDeviation)); ANKI_CHECK(xmlF32(rel, "sizeAnimation", m_particle.m_sizeAnimation)); ANKI_CHECK(xmlF32(rel, "alpha", m_particle.m_alpha)); ANKI_CHECK(xmlF32(rel, "alphaDeviation", m_particle.m_alphaDeviation)); tmp = m_particle.m_alphaAnimation; ANKI_CHECK(xmlU32(rel, "alphaAnimationEnabled", tmp)); m_particle.m_alphaAnimation = tmp; ANKI_CHECK(xmlVec3(rel, "forceDirection", m_particle.m_forceDirection)); ANKI_CHECK(xmlVec3(rel, "forceDirectionDeviation", m_particle.m_forceDirectionDeviation)); ANKI_CHECK(xmlF32(rel, "forceMagnitude", m_particle.m_forceMagnitude)); ANKI_CHECK(xmlF32(rel, "forceMagnitudeDeviation", m_particle.m_forceMagnitudeDeviation)); ANKI_CHECK(xmlVec3(rel, "gravity", m_particle.m_gravity)); ANKI_CHECK(xmlVec3(rel, "gravityDeviation", m_particle.m_gravityDeviation)); ANKI_CHECK(xmlVec3(rel, "startingPosition", m_particle.m_startingPos)); ANKI_CHECK(xmlVec3(rel, "startingPositionDeviation", m_particle.m_startingPosDeviation)); ANKI_CHECK(xmlU32(rel, "maxNumberOfParticles", m_maxNumOfParticles)); ANKI_CHECK(xmlF32(rel, "emissionPeriod", m_emissionPeriod)); ANKI_CHECK(xmlU32(rel, "particlesPerEmittion", m_particlesPerEmittion)); tmp = m_usePhysicsEngine; ANKI_CHECK(xmlU32(rel, "usePhysicsEngine", tmp)); m_usePhysicsEngine = tmp; XmlElement el; CString cstr; ANKI_CHECK(rel.getChildElement("material", el)); ANKI_CHECK(el.getText(cstr)); ANKI_CHECK(m_material.load(cstr, &getManager())); // sanity checks // static const char* ERROR = "Particle emmiter: " "Incorrect or missing value %s"; if(m_particle.m_life <= 0.0) { ANKI_LOGE(ERROR, "life"); return ErrorCode::USER_DATA; } if(m_particle.m_life - m_particle.m_lifeDeviation <= 0.0) { ANKI_LOGE(ERROR, "lifeDeviation"); return ErrorCode::USER_DATA; } if(m_particle.m_size <= 0.0) { ANKI_LOGE(ERROR, "size"); return ErrorCode::USER_DATA; } if(m_maxNumOfParticles < 1) { ANKI_LOGE(ERROR, "maxNumOfParticles"); return ErrorCode::USER_DATA; } if(m_emissionPeriod <= 0.0) { ANKI_LOGE(ERROR, "emissionPeriod"); return ErrorCode::USER_DATA; } if(m_particlesPerEmittion < 1) { ANKI_LOGE(ERROR, "particlesPerEmission"); return ErrorCode::USER_DATA; } // Calc some stuff // updateFlags(); return ErrorCode::NONE; }