|
@@ -1735,6 +1735,7 @@ void ColladaLoader::BuildMaterials(ColladaParser& pParser, aiScene* /*pScene*/)
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------------------------
|
|
// Resolves the texture name for the given effect texture entry
|
|
// Resolves the texture name for the given effect texture entry
|
|
|
|
+// and loads the texture data
|
|
aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParser,
|
|
aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParser,
|
|
const Collada::Effect& pEffect, const std::string& pName)
|
|
const Collada::Effect& pEffect, const std::string& pName)
|
|
{
|
|
{
|
|
@@ -1762,7 +1763,7 @@ aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParse
|
|
|
|
|
|
//set default texture file name
|
|
//set default texture file name
|
|
result.Set(name + ".jpg");
|
|
result.Set(name + ".jpg");
|
|
- ConvertPath(result);
|
|
|
|
|
|
+ ColladaParser::ConvertPath(result);
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1781,7 +1782,7 @@ aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParse
|
|
|
|
|
|
|
|
|
|
// setup format hint
|
|
// setup format hint
|
|
- if (imIt->second.mEmbeddedFormat.length() > 3) {
|
|
|
|
|
|
+ if (imIt->second.mEmbeddedFormat.length() >= HINTMAXTEXTURELEN) {
|
|
ASSIMP_LOG_WARN("Collada: texture format hint is too long, truncating to 3 characters");
|
|
ASSIMP_LOG_WARN("Collada: texture format hint is too long, truncating to 3 characters");
|
|
}
|
|
}
|
|
strncpy(tex->achFormatHint, imIt->second.mEmbeddedFormat.c_str(), 3);
|
|
strncpy(tex->achFormatHint, imIt->second.mEmbeddedFormat.c_str(), 3);
|
|
@@ -1802,61 +1803,10 @@ aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParse
|
|
}
|
|
}
|
|
|
|
|
|
result.Set(imIt->second.mFileName);
|
|
result.Set(imIt->second.mFileName);
|
|
- ConvertPath(result);
|
|
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
-// ------------------------------------------------------------------------------------------------
|
|
|
|
-// Convert a path read from a collada file to the usual representation
|
|
|
|
-void ColladaLoader::ConvertPath(aiString& ss)
|
|
|
|
-{
|
|
|
|
- // TODO: collada spec, p 22. Handle URI correctly.
|
|
|
|
- // For the moment we're just stripping the file:// away to make it work.
|
|
|
|
- // Windows doesn't seem to be able to find stuff like
|
|
|
|
- // 'file://..\LWO\LWO2\MappingModes\earthSpherical.jpg'
|
|
|
|
- if (0 == strncmp(ss.data, "file://", 7))
|
|
|
|
- {
|
|
|
|
- ss.length -= 7;
|
|
|
|
- memmove(ss.data, ss.data + 7, ss.length);
|
|
|
|
- ss.data[ss.length] = '\0';
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Maxon Cinema Collada Export writes "file:///C:\andsoon" with three slashes...
|
|
|
|
- // I need to filter it without destroying linux paths starting with "/somewhere"
|
|
|
|
-#if defined( _MSC_VER )
|
|
|
|
- if (ss.data[0] == '/' && isalpha((unsigned char)ss.data[1]) && ss.data[2] == ':') {
|
|
|
|
-#else
|
|
|
|
- if (ss.data[0] == '/' && isalpha(ss.data[1]) && ss.data[2] == ':') {
|
|
|
|
-#endif
|
|
|
|
- --ss.length;
|
|
|
|
- ::memmove(ss.data, ss.data + 1, ss.length);
|
|
|
|
- ss.data[ss.length] = 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // find and convert all %xy special chars
|
|
|
|
- char* out = ss.data;
|
|
|
|
- for (const char* it = ss.data; it != ss.data + ss.length; /**/)
|
|
|
|
- {
|
|
|
|
- if (*it == '%' && (it + 3) < ss.data + ss.length)
|
|
|
|
- {
|
|
|
|
- // separate the number to avoid dragging in chars from behind into the parsing
|
|
|
|
- char mychar[3] = { it[1], it[2], 0 };
|
|
|
|
- size_t nbr = strtoul16(mychar);
|
|
|
|
- it += 3;
|
|
|
|
- *out++ = (char)(nbr & 0xFF);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- *out++ = *it++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // adjust length and terminator of the shortened string
|
|
|
|
- *out = 0;
|
|
|
|
- ss.length = (ptrdiff_t)(out - ss.data);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------------------------
|
|
// Reads a float value from an accessor and its data array.
|
|
// Reads a float value from an accessor and its data array.
|
|
ai_real ColladaLoader::ReadFloat(const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex, size_t pOffset) const
|
|
ai_real ColladaLoader::ReadFloat(const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex, size_t pOffset) const
|