Transform XMLReader::LoadTransform(QXmlStreamReader &xml_reader) { glm::vec3 t, r, s; s = glm::vec3(1,1,1); while(!xml_reader.isEndElement() || QStringRef::compare(xml_reader.name(), QString("transform")) != 0) { xml_reader.readNext(); QString tag(xml_reader.name().toString()); if(xml_reader.isStartElement() && QString::compare(tag, QString("translate")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { QStringRef vec = xml_reader.text(); t = ToVec3(vec); } xml_reader.readNext(); } else if(xml_reader.isStartElement() && QString::compare(tag, QString("rotate")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { QStringRef vec = xml_reader.text(); r = ToVec3(vec); } xml_reader.readNext(); } else if(xml_reader.isStartElement() && QString::compare(tag, QString("scale")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { QStringRef vec = xml_reader.text(); s = ToVec3(vec); } xml_reader.readNext(); } } return Transform(t, r, s); }
math::vector3d PhysXShape::getLocalTranslation()const { NxVec3 r=m_nxShape->getLocalPosition(); return ToVec3(r); }
Camera XMLReader::LoadCamera(QXmlStreamReader &xml_reader) { Camera result; while(!xml_reader.isEndElement() || QStringRef::compare(xml_reader.name(), QString("camera")) != 0) { xml_reader.readNext(); QString tag(xml_reader.name().toString()); if(QString::compare(tag, QString("target")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.ref = ToVec3(xml_reader.text()); } xml_reader.readNext(); } else if(QString::compare(tag, QString("eye")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.eye = ToVec3(xml_reader.text()); } xml_reader.readNext(); } else if(QString::compare(tag, QString("worldUp")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.world_up = ToVec3(xml_reader.text()); } xml_reader.readNext(); } else if(QString::compare(tag, QString("width")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.width = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("height")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.height = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("fov")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.fovy = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("nearClip")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.near_clip = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("farClip")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result.far_clip = xml_reader.text().toFloat(); } xml_reader.readNext(); } } result.RecomputeAttributes(); return result; }
Material* XMLReader::LoadMaterial(QXmlStreamReader &xml_reader, const QStringRef &local_path) { Material* result; //First check what type of material we're supposed to load QXmlStreamAttributes attribs(xml_reader.attributes()); QStringRef type = attribs.value(QString(), QString("type")); if(QStringRef::compare(type, QString("lambert")) == 0) { result = new LambertMaterial(); } else if(QStringRef::compare(type, QString("phong")) == 0) { result = new PhongMaterial(); QStringRef spec_pow = attribs.value(QString(), QString("specularPower")); if(QStringRef::compare(spec_pow, QString("")) != 0) { ((PhongMaterial*)result)->specular_power = spec_pow.toFloat(); } } else { std::cout << "Could not parse the material!" << std::endl; return NULL; } result->name = attribs.value(QString(), QString("name")).toString(); while(!xml_reader.isEndElement() || QStringRef::compare(xml_reader.name(), QString("material")) != 0) { xml_reader.readNext(); QString tag(xml_reader.name().toString()); if(QString::compare(tag, QString("baseColor")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result->base_color = ToVec3(xml_reader.text()); } xml_reader.readNext(); } else if(QString::compare(tag, QString("reflectivity")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result->reflectivity = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("iorIn")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result->refract_idx_in = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("iorOut")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result->refract_idx_out = xml_reader.text().toFloat(); } xml_reader.readNext(); } else if(QString::compare(tag, QString("emissive")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { if(QStringRef::compare(xml_reader.text(), QString("false"), Qt::CaseInsensitive) == 0) { result->emissive = false; } else if(QStringRef::compare(xml_reader.text(), QString("true"), Qt::CaseInsensitive) == 0) { result->emissive = true; } } xml_reader.readNext(); } else if(QString::compare(tag, QString("texture")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { QString img_filepath = local_path.toString().append(xml_reader.text().toString()); QImage* texture = new QImage(img_filepath); result->texture = texture; } xml_reader.readNext(); } else if(QString::compare(tag, QString("normalMap")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { QString img_filepath = local_path.toString().append(xml_reader.text().toString()); QImage* texture = new QImage(img_filepath); result->normal_map = texture; } xml_reader.readNext(); } } return result; }
math::vector3d PhysXCylinderJoint::getGlobalAxis(){ NxVec3 vec=m_joint->getGlobalAxis(); return ToVec3(vec); }
BxDF* XMLReader::LoadBxDF(QXmlStreamReader &xml_reader) { BxDF* result = NULL; //First check what type of material we're supposed to load QXmlStreamAttributes attribs(xml_reader.attributes()); QStringRef type = attribs.value(QString(), QString("type")); if(QStringRef::compare(type, QString("lambert")) == 0) { glm::vec3 diffuseColor(0.5f); QStringRef color = attribs.value(QString(), QString("diffuseColor")); if(QStringRef::compare(color, QString("")) != 0) { diffuseColor = ToVec3(color); } result = new LambertBxDF(diffuseColor); } else if(QStringRef::compare(type, QString("specularReflection")) == 0) { glm::vec3 refl_color(0.5f); QStringRef color = attribs.value(QString(), QString("reflectionColor")); if(QStringRef::compare(color, QString("")) != 0) { refl_color = ToVec3(color); } result = new SpecularReflectionBxDF(refl_color); } else if(QStringRef::compare(type, QString("blinnMicrofacet")) == 0) { glm::vec3 refl_color(0.5f); QStringRef color = attribs.value(QString(), QString("reflectionColor")); if(QStringRef::compare(color, QString("")) != 0) { refl_color = ToVec3(color); } result = new BlinnMicrofacetBxDF(refl_color); QStringRef exponent = attribs.value(QString(), QString("exponent")); if(QStringRef::compare(exponent, QString("")) != 0) { ((BlinnMicrofacetBxDF*)result)->exponent = exponent.toFloat(); } } else if(QStringRef::compare(type, QString("anisotropic")) == 0) { glm::vec3 refl_color(0.5f); QStringRef color = attribs.value(QString(), QString("reflectionColor")); if(QStringRef::compare(color, QString("")) != 0) { refl_color = ToVec3(color); } float exp1 = 4.0f; QStringRef e1 = attribs.value(QString(), QString("exponent1")); if(QStringRef::compare(e1, QString("")) != 0) { exp1 = e1.toFloat(); } float exp2 = 20.0f; QStringRef e2 = attribs.value(QString(), QString("exponent2")); if(QStringRef::compare(e2, QString("")) != 0) { exp2 = e2.toFloat(); } result = new AnisotropicBxDF(refl_color, exp1, exp2); } else if(QStringRef::compare(type, QString("phong")) == 0) { glm::vec3 diffuseColor(0.5f); QStringRef diffuse_color = attribs.value(QString(), QString("diffuseColor")); if(QStringRef::compare(diffuse_color, QString("")) != 0) { diffuseColor = ToVec3(diffuse_color); } glm::vec3 specularColor(1); QStringRef specular_color = attribs.value(QString(), QString("specularColor")); if(QStringRef::compare(specular_color, QString("")) != 0) { specularColor = ToVec3(specular_color); } float specularPower = 5.0f; QStringRef specular_power = attribs.value(QString(), QString("specularPower")); if(QStringRef::compare(specular_power, QString("")) != 0) { specularPower = specular_power.toFloat(); } result = new PhongBxDF(diffuseColor, specularColor, specularPower); } else if(QStringRef::compare(type, QString("transmission")) == 0) { float ei = 1.0f; float et = 1.0f; QStringRef eta_i = attribs.value(QString(), QString("etai")); if(QStringRef::compare(eta_i, QString("")) != 0) { ei = eta_i.toFloat(); } QStringRef eta_t = attribs.value(QString(), QString("etat")); if(QStringRef::compare(eta_i, QString("")) != 0) { et = eta_t.toFloat(); } glm::vec3 transmissionColor(1); QStringRef trans = attribs.value(QString(), QString("transmissionColor")); if(QStringRef::compare(trans, QString("")) != 0) { transmissionColor = ToVec3(trans); } result = new TransmissionBxDF(ei,et,transmissionColor); } else { std::cout << "Could not parse the BxDF!" << std::endl; return NULL; } result->name = attribs.value(QString(), QString("name")).toString(); return result; }
Material* XMLReader::LoadMaterial(QXmlStreamReader &xml_reader, const QStringRef &local_path, QMap<QString, QList<Material *> > &map) { Material* result; bool weighted_material = false; //First check what type of material we're supposed to load QXmlStreamAttributes attribs(xml_reader.attributes()); QStringRef type = attribs.value(QString(), QString("type")); if(QStringRef::compare(type, QString("default")) == 0) { result = new Material(); } else if(QStringRef::compare(type, QString("light")) == 0) { result = new LightMaterial(); result->is_light_source = true; QStringRef intensity = attribs.value(QString(), QString("intensity")); if(QStringRef::compare(intensity, QString("")) != 0) { result->intensity = intensity.toFloat(); } } else if(QStringRef::compare(type, QString("weighted")) == 0) { result = new WeightedMaterial(); weighted_material = true; //weights are handled below } else { std::cout << "Could not parse the material!" << std::endl; return NULL; } result->name = attribs.value(QString(), QString("name")).toString(); while(!xml_reader.isEndElement() || QStringRef::compare(xml_reader.name(), QString("material")) != 0) { xml_reader.readNext(); QString tag(xml_reader.name().toString()); if(QString::compare(tag, QString("baseColor")) == 0) { xml_reader.readNext(); if(xml_reader.isCharacters()) { result->base_color = ToVec3(xml_reader.text()); } xml_reader.readNext(); } else if(QString::compare(tag, QString("bxdf")) == 0) { //Add the Material to the map of BxDF names to Materials so that we can assign it a BxDF later xml_reader.readNext(); if(xml_reader.isCharacters()) { QString bxdf_name = xml_reader.text().toString(); QList<Material*> list = map.value(bxdf_name); list.append(result); map.insert(bxdf_name, list); xml_reader.readNext(); } } else if(QString::compare(tag, QString("texture")) == 0) { result->texture = LoadTextureFile(xml_reader, local_path); } else if(QString::compare(tag, QString("normalMap")) == 0) { result->normal_map = LoadTextureFile(xml_reader, local_path); } else if(QString::compare(tag, QString("weight")) == 0 && weighted_material) { xml_reader.readNext(); float weight; if(xml_reader.isCharacters()) { weight = xml_reader.text().toFloat(); } ((WeightedMaterial*)result)->bxdf_weights.append(weight); xml_reader.readNext(); // add this line } } return result; }
tt::DualQuaternion Combine(const tt::DualQuaternion& lhs, const tt::DualQuaternion& rhs) { //Example: lhs = invBindpose, rhs = transform return tt::DualQuaternion(lhs.Data[0] * rhs.Data[0]*-1, ToVec3(tt::Quaternion::Inverse(rhs.Data[0]) * ExtractPos(lhs) * rhs.Data[0] + ExtractPos(rhs))); }