collada + obj importer robustness improvements
parent
80a41265c5
commit
527b661280
|
@ -1056,6 +1056,11 @@ void loadImage(ColladaContext &ctx, domImage &image) {
|
||||||
SLog(EDebug, "Converting texture \"%s\" ..", identifier.c_str());
|
SLog(EDebug, "Converting texture \"%s\" ..", identifier.c_str());
|
||||||
|
|
||||||
std::string filename = cdom::uriToFilePath(image.getInit_from()->getValue().str());
|
std::string filename = cdom::uriToFilePath(image.getInit_from()->getValue().str());
|
||||||
|
/* Prevent Linux/OSX fs::path handling issues for DAE files created on Windows */
|
||||||
|
for (size_t i=0; i<filename.length(); ++i) {
|
||||||
|
if (filename[i] == '\\')
|
||||||
|
filename[i] = '/';
|
||||||
|
}
|
||||||
if (ctx.fileToId.find(filename) != ctx.fileToId.end()) {
|
if (ctx.fileToId.find(filename) != ctx.fileToId.end()) {
|
||||||
ctx.idToTexture[identifier] = ctx.fileToId[filename];
|
ctx.idToTexture[identifier] = ctx.fileToId[filename];
|
||||||
return;
|
return;
|
||||||
|
@ -1174,10 +1179,10 @@ void loadCamera(ColladaContext &ctx, Transform transform, domCamera &camera) {
|
||||||
ctx.os << "\t\t<transform name=\"toWorld\">" << endl;
|
ctx.os << "\t\t<transform name=\"toWorld\">" << endl;
|
||||||
ctx.os << "\t\t\t<matrix value=\"" << matrixValues.substr(0, matrixValues.length()-1) << "\"/>" << endl;
|
ctx.os << "\t\t\t<matrix value=\"" << matrixValues.substr(0, matrixValues.length()-1) << "\"/>" << endl;
|
||||||
ctx.os << "\t\t</transform>" << endl << endl;
|
ctx.os << "\t\t</transform>" << endl << endl;
|
||||||
ctx.os << "\t\t<sampler id=\"sampler\" type=\"ldsampler\">" << endl;
|
ctx.os << "\t\t<sampler id=\"" << identifier << "_sampler\" type=\"ldsampler\">" << endl;
|
||||||
ctx.os << "\t\t\t<integer name=\"sampleCount\" value=\"4\"/>" << endl;
|
ctx.os << "\t\t\t<integer name=\"sampleCount\" value=\"4\"/>" << endl;
|
||||||
ctx.os << "\t\t</sampler>" << endl << endl;
|
ctx.os << "\t\t</sampler>" << endl << endl;
|
||||||
ctx.os << "\t\t<film id=\"film\" type=\"" << ctx.cvt->m_filmType << "\">" << endl;
|
ctx.os << "\t\t<film id=\"" << identifier << "_film\" type=\"" << ctx.cvt->m_filmType << "\">" << endl;
|
||||||
ctx.os << "\t\t\t<integer name=\"width\" value=\"" << xres << "\"/>" << endl;
|
ctx.os << "\t\t\t<integer name=\"width\" value=\"" << xres << "\"/>" << endl;
|
||||||
ctx.os << "\t\t\t<integer name=\"height\" value=\"" << (int) (xres/aspect) << "\"/>" << endl;
|
ctx.os << "\t\t\t<integer name=\"height\" value=\"" << (int) (xres/aspect) << "\"/>" << endl;
|
||||||
ctx.os << "\t\t\t<rfilter type=\"gaussian\"/>" << endl;
|
ctx.os << "\t\t\t<rfilter type=\"gaussian\"/>" << endl;
|
||||||
|
|
|
@ -30,6 +30,12 @@ std::set<std::string> availableTextures;
|
||||||
|
|
||||||
void referenceTexture(GeometryConverter *cvt, std::ostream &os, const std::string ¶meter,
|
void referenceTexture(GeometryConverter *cvt, std::ostream &os, const std::string ¶meter,
|
||||||
const std::string &indent, const fs::path &textureDir, std::string filename) {
|
const std::string &indent, const fs::path &textureDir, std::string filename) {
|
||||||
|
/* Prevent Linux/OSX fs::path handling issues for OBJ files created on Windows */
|
||||||
|
for (size_t i=0; i<filename.length(); ++i) {
|
||||||
|
if (filename[i] == '\\')
|
||||||
|
filename[i] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
fs::path path = fs::path(filename);
|
fs::path path = fs::path(filename);
|
||||||
fs::path targetPath = textureDir / path.filename();
|
fs::path targetPath = textureDir / path.filename();
|
||||||
std::string textureName = targetPath.filename().string();
|
std::string textureName = targetPath.filename().string();
|
||||||
|
@ -75,7 +81,7 @@ void addMaterial(GeometryConverter *cvt, std::ostream &os, const std::string &mt
|
||||||
const std::string &diffuseMap, const std::string maskMap) {
|
const std::string &diffuseMap, const std::string maskMap) {
|
||||||
if (mtlName == "")
|
if (mtlName == "")
|
||||||
return;
|
return;
|
||||||
SLog(EInfo, "Copying material \"%s\" ..", mtlName.c_str());
|
SLog(EInfo, "Importing material \"%s\" ..", mtlName.c_str());
|
||||||
std::string indent = "";
|
std::string indent = "";
|
||||||
|
|
||||||
if (maskMap != "") {
|
if (maskMap != "") {
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>353</width>
|
<width>358</width>
|
||||||
<height>273</height>
|
<height>282</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -234,9 +234,9 @@
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="linearButton">
|
<widget class="QRadioButton" name="sRGBButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Linear</string>
|
<string>sRGB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
@ -244,9 +244,12 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="sRGBButton">
|
<widget class="QRadioButton" name="linearButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>sRGB</string>
|
<string>Linear</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -377,13 +377,25 @@ public:
|
||||||
|
|
||||||
Texture *loadTexture(const FileResolver *fileResolver,
|
Texture *loadTexture(const FileResolver *fileResolver,
|
||||||
std::map<std::string, Texture *> &cache,
|
std::map<std::string, Texture *> &cache,
|
||||||
const fs::path &mtlPath, const std::string &filename) {
|
const fs::path &mtlPath, std::string filename) {
|
||||||
|
/* Prevent Linux/OSX fs::path handling issues for DAE files created on Windows */
|
||||||
|
for (size_t i=0; i<filename.length(); ++i) {
|
||||||
|
if (filename[i] == '\\')
|
||||||
|
filename[i] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
if (cache.find(filename) != cache.end())
|
if (cache.find(filename) != cache.end())
|
||||||
return cache[filename];
|
return cache[filename];
|
||||||
|
|
||||||
fs::path path = fileResolver->resolve(filename);
|
fs::path path = fileResolver->resolve(filename);
|
||||||
if (!fs::exists(path))
|
if (!fs::exists(path)) {
|
||||||
Log(EError, "Unable to find texture \"%s\" referenced from \"%s\"!",
|
path = fileResolver->resolve(fs::path(filename).filename());
|
||||||
path.string().c_str(), mtlPath.string().c_str());
|
if (!fs::exists(path)) {
|
||||||
|
Log(EWarn, "Unable to find texture \"%s\" referenced from \"%s\"!",
|
||||||
|
path.string().c_str(), mtlPath.string().c_str());
|
||||||
|
return new ConstantSpectrumTexture(Spectrum(0.0f));
|
||||||
|
}
|
||||||
|
}
|
||||||
Properties props("bitmap");
|
Properties props("bitmap");
|
||||||
props.setString("filename", path.string());
|
props.setString("filename", path.string());
|
||||||
ref<Texture> texture = static_cast<Texture *> (PluginManager::getInstance()->
|
ref<Texture> texture = static_cast<Texture *> (PluginManager::getInstance()->
|
||||||
|
@ -424,7 +436,7 @@ public:
|
||||||
if (mtlName != "")
|
if (mtlName != "")
|
||||||
addMaterial(mtlName, diffuse, specular, exponent, bump, mask, illum);
|
addMaterial(mtlName, diffuse, specular, exponent, bump, mask, illum);
|
||||||
|
|
||||||
mtlName = trim(line.substr(7, line.length()-7));
|
mtlName = trim(line.substr(6, line.length()-6));
|
||||||
|
|
||||||
specular = new ConstantSpectrumTexture(Spectrum(0.0f));
|
specular = new ConstantSpectrumTexture(Spectrum(0.0f));
|
||||||
diffuse = new ConstantSpectrumTexture(Spectrum(0.0f));
|
diffuse = new ConstantSpectrumTexture(Spectrum(0.0f));
|
||||||
|
|
Loading…
Reference in New Issue