more solid OBJ import
parent
d6e0638ceb
commit
4afd9afb25
|
@ -91,7 +91,7 @@ void addMaterial(GeometryConverter *cvt, std::ostream &os, const std::string &mt
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseMaterials(GeometryConverter *cvt, std::ostream &os, const fs::path &texturesDir,
|
void parseMaterials(GeometryConverter *cvt, std::ostream &os, const fs::path &texturesDir,
|
||||||
const fs::path &mtlFileName) {
|
const fs::path &mtlFileName, std::set<std::string> &mtlList) {
|
||||||
SLog(EInfo, "Loading OBJ materials from \"%s\" ..", mtlFileName.file_string().c_str());
|
SLog(EInfo, "Loading OBJ materials from \"%s\" ..", mtlFileName.file_string().c_str());
|
||||||
fs::ifstream is(mtlFileName);
|
fs::ifstream is(mtlFileName);
|
||||||
if (is.bad() || is.fail())
|
if (is.bad() || is.fail())
|
||||||
|
@ -104,6 +104,7 @@ void parseMaterials(GeometryConverter *cvt, std::ostream &os, const fs::path &te
|
||||||
|
|
||||||
while (is >> buf) {
|
while (is >> buf) {
|
||||||
if (buf == "newmtl") {
|
if (buf == "newmtl") {
|
||||||
|
mtlList.insert(mtlName);
|
||||||
addMaterial(cvt, os, mtlName, texturesDir, diffuse, diffuseMap, maskMap);
|
addMaterial(cvt, os, mtlName, texturesDir, diffuse, diffuseMap, maskMap);
|
||||||
std::getline(is, line);
|
std::getline(is, line);
|
||||||
mtlName = trim(line.substr(1, line.length()-1));
|
mtlName = trim(line.substr(1, line.length()-1));
|
||||||
|
@ -148,6 +149,7 @@ void GeometryConverter::convertOBJ(const fs::path &inputFile,
|
||||||
os << "\t<integrator id=\"integrator\" type=\"direct\"/>" << endl << endl;
|
os << "\t<integrator id=\"integrator\" type=\"direct\"/>" << endl << endl;
|
||||||
|
|
||||||
std::string buf, line;
|
std::string buf, line;
|
||||||
|
std::set<std::string> mtlList;
|
||||||
while (is >> buf) {
|
while (is >> buf) {
|
||||||
if (buf == "mtllib") {
|
if (buf == "mtllib") {
|
||||||
std::getline(is, line);
|
std::getline(is, line);
|
||||||
|
@ -156,7 +158,7 @@ void GeometryConverter::convertOBJ(const fs::path &inputFile,
|
||||||
fRes->addPath(fs::complete(fRes->resolve(inputFile)).parent_path());
|
fRes->addPath(fs::complete(fRes->resolve(inputFile)).parent_path());
|
||||||
fs::path fullMtlName = fRes->resolve(mtlName);
|
fs::path fullMtlName = fRes->resolve(mtlName);
|
||||||
if (fs::exists(fullMtlName))
|
if (fs::exists(fullMtlName))
|
||||||
parseMaterials(this, os, textureDirectory, fullMtlName);
|
parseMaterials(this, os, textureDirectory, fullMtlName, mtlList);
|
||||||
else
|
else
|
||||||
SLog(EWarn, "Could not find referenced material library '%s'", mtlName.c_str());
|
SLog(EWarn, "Could not find referenced material library '%s'", mtlName.c_str());
|
||||||
} else {
|
} else {
|
||||||
|
@ -185,7 +187,8 @@ void GeometryConverter::convertOBJ(const fs::path &inputFile,
|
||||||
stream->close();
|
stream->close();
|
||||||
os << "\t<shape id=\"" << mesh->getName() << "\" type=\"serialized\">" << endl;
|
os << "\t<shape id=\"" << mesh->getName() << "\" type=\"serialized\">" << endl;
|
||||||
os << "\t\t<string name=\"filename\" value=\"meshes/" << filename.c_str() << "\"/>" << endl;
|
os << "\t\t<string name=\"filename\" value=\"meshes/" << filename.c_str() << "\"/>" << endl;
|
||||||
if (mesh->getBSDF() != NULL) {
|
if (mesh->getBSDF() != NULL &&
|
||||||
|
mtlList.find(mesh->getBSDF()->getName()) != mtlList.end()) {
|
||||||
const std::string &matID = mesh->getBSDF()->getName();
|
const std::string &matID = mesh->getBSDF()->getName();
|
||||||
os << "\t\t<ref name=\"bsdf\" id=\"" << matID << "\"/>" << endl;
|
os << "\t\t<ref name=\"bsdf\" id=\"" << matID << "\"/>" << endl;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue