| 77 | } |
| 78 | |
| 79 | Ref<SceneGraph::MaterialNode> CoronaLoader::loadMaterial(const Ref<XML>& xml) |
| 80 | { |
| 81 | if (xml->name != "material") |
| 82 | THROW_RUNTIME_ERROR(xml->loc.str()+": invalid material: "+xml->name); |
| 83 | |
| 84 | /* native material */ |
| 85 | if (xml->parm("class") == "Native") |
| 86 | { |
| 87 | /* we convert into an OBJ material */ |
| 88 | Ref<OBJMaterial> objmaterial = new OBJMaterial; |
| 89 | for (auto& child : xml->children) |
| 90 | { |
| 91 | if (child->name == "diffuse") { |
| 92 | objmaterial->Kd = load<Vec3fa>(child); |
| 93 | if (child->children.size() && child->children[0]->name == "map") |
| 94 | objmaterial->_map_Kd = loadMap(child->children[0]); |
| 95 | } |
| 96 | else if (child->name == "reflect") { |
| 97 | objmaterial->Ks = load<Vec3fa>(child->child("color")); |
| 98 | objmaterial->Ni = load<float >(child->child("ior")); |
| 99 | objmaterial->Ns = load<float >(child->child("glossiness")); |
| 100 | } |
| 101 | else if (child->name == "translucency") { |
| 102 | objmaterial->Kt = load<Vec3fa>(child->child("color")); |
| 103 | } |
| 104 | else if (child->name == "opacity") { |
| 105 | objmaterial->d = load<Vec3fa>(child).x; |
| 106 | if (child->children.size() && child->children[0]->name == "map") |
| 107 | objmaterial->_map_d = loadMap(child->children[0]); |
| 108 | } |
| 109 | } |
| 110 | return objmaterial.dynamicCast<SceneGraph::MaterialNode>(); |
| 111 | } |
| 112 | |
| 113 | /* reference by name */ |
| 114 | else if (xml->parm("class") == "Reference") |
| 115 | { |
| 116 | const std::string name = load<std::string>(xml); |
| 117 | return materialMap[name]; |
| 118 | } |
| 119 | |
| 120 | /* else return default material */ |
| 121 | else |
| 122 | return new OBJMaterial; |
| 123 | } |
| 124 | |
| 125 | void CoronaLoader::loadMaterialDefinition(const Ref<XML>& xml) |
| 126 | { |