summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llprimitive/lldaeloader.cpp101
-rw-r--r--indra/llprimitive/lldaeloader.h11
2 files changed, 57 insertions, 55 deletions
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index afc88fc861..f84b49873b 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -62,6 +62,9 @@
#include "glh/glh_linear.h"
#include "llmatrix4a.h"
+#include <regex>
+#include <boost/algorithm/string/replace.hpp>
+
std::string colladaVersion[VERSIONTYPE_COUNT+1] =
{
"1.4.0",
@@ -821,8 +824,7 @@ LLDAELoader::LLDAELoader(
opaque_userdata,
jointMap,
jointsFromNodes),
-mGeneratedModelLimit(modelLimit),
-mForceIdNaming(false)
+mGeneratedModelLimit(modelLimit)
{
}
@@ -846,7 +848,9 @@ bool LLDAELoader::OpenFile(const std::string& filename)
{
//no suitable slm exists, load from the .dae file
DAE dae;
- domCOLLADA* dom = dae.open(filename);
+
+ std::string fileURI = "from memory"; // set to a null device
+ domCOLLADA* dom = dae.openFromMemory(fileURI, preprocessDAE(filename).c_str());
if (!dom)
{
@@ -874,7 +878,7 @@ bool LLDAELoader::OpenFile(const std::string& filename)
daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
- daeDocument* doc = dae.getDoc(mFilename);
+ daeDocument* doc = dae.getDoc(fileURI);
if (!doc)
{
LL_WARNS() << "can't find internal doc" << LL_ENDL;
@@ -945,32 +949,6 @@ bool LLDAELoader::OpenFile(const std::string& filename)
mTransform.condition();
- mForceIdNaming = false;
- std::vector<std::string> checkNames;
- for (daeInt idx = 0; idx < count; ++idx)
- {
- domMesh* mesh = NULL;
- db->getElement((daeElement**)&mesh, idx, NULL, COLLADA_TYPE_MESH);
-
- if (mesh)
- {
- std::string name = getLodlessLabel(mesh, false);
-
- std::vector<std::string>::iterator it;
- it = std::find(checkNames.begin(), checkNames.end(), name);
- if (it != checkNames.end())
- {
- LL_WARNS() << "document has duplicate names, using IDs instead" << LL_ENDL;
- mForceIdNaming = true;
- break;
- }
- else
- {
- checkNames.push_back(name);
- }
- }
- }
-
U32 submodel_limit = count > 0 ? mGeneratedModelLimit/count : 0;
for (daeInt idx = 0; idx < count; ++idx)
{ //build map of domEntities to LLModel
@@ -1078,6 +1056,41 @@ bool LLDAELoader::OpenFile(const std::string& filename)
return true;
}
+std::string LLDAELoader::preprocessDAE(std::string filename)
+{
+ // Open a DAE file for some preprocessing (like removing space characters in IDs), see MAINT-5678
+ std::ifstream inFile;
+ inFile.open(filename);
+ std::stringstream strStream;
+ strStream << inFile.rdbuf();
+ std::string buffer = strStream.str();
+
+ LL_INFOS() << "Preprocessing dae file to remove spaces from the names, ids, etc." << LL_ENDL;
+
+ try
+ {
+ std::regex re("\"[\\w\\.@#$-]*(\\s[\\w\\.@#$-]*)+\"");
+ std::sregex_iterator next(buffer.begin(), buffer.end(), re);
+ std::sregex_iterator end;
+ while (next != end)
+ {
+ std::smatch match = *next;
+ std::string s = match.str();
+ LL_INFOS() << s << " found" << LL_ENDL;
+ boost::replace_all(s, " ", "_");
+ LL_INFOS() << "Replacing with " << s << LL_ENDL;
+ boost::replace_all(buffer, match.str(), s);
+ next++;
+ }
+ }
+ catch (std::regex_error &)
+ {
+ LL_INFOS() << "Regex error" << LL_ENDL;
+ }
+
+ return buffer;
+}
+
void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, domMesh* mesh, domSkin* skin)
{
llassert(model && dae && mesh && skin);
@@ -1971,7 +1984,7 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da
if (model->mLabel.empty())
{
- label = getLodlessLabel(instance_geo, mForceIdNaming);
+ label = getLodlessLabel(instance_geo);
llassert(!label.empty());
@@ -2186,17 +2199,12 @@ LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE
return mat;
}
-std::string LLDAELoader::getElementLabel(daeElement *element)
-{
- return getElementLabel(element, mForceIdNaming);
-}
-
// try to get a decent label for this element
-std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming)
+std::string LLDAELoader::getElementLabel(daeElement *element)
{
// if we have a name attribute, use it
std::string name = element->getAttribute("name");
- if (name.length() && !forceIdNaming)
+ if (name.length())
{
return name;
}
@@ -2219,7 +2227,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming
// if parent has a name or ID, use it
std::string name = parent->getAttribute("name");
- if (!name.length() || forceIdNaming)
+ if (!name.length())
{
name = std::string(parent->getID());
}
@@ -2262,9 +2270,9 @@ size_t LLDAELoader::getSuffixPosition(std::string label)
}
// static
-std::string LLDAELoader::getLodlessLabel(daeElement *element, bool forceIdNaming)
+std::string LLDAELoader::getLodlessLabel(daeElement *element)
{
- std::string label = getElementLabel(element, forceIdNaming);
+ std::string label = getElementLabel(element);
size_t ext_pos = getSuffixPosition(label);
if (ext_pos != -1)
{
@@ -2335,13 +2343,8 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
return (status == LLModel::NO_ERRORS);
}
-LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
-{
- return loadModelFromDomMesh(mesh, mForceIdNaming);
-}
-
//static
-LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)
+LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
{
LLVolumeParams volume_params;
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
@@ -2349,7 +2352,7 @@ LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)
createVolumeFacesFromDomMesh(ret, mesh);
if (ret->mLabel.empty())
{
- ret->mLabel = getElementLabel(mesh, forceIdNaming);
+ ret->mLabel = getElementLabel(mesh);
}
return ret;
}
@@ -2367,7 +2370,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
LLModel* ret = new LLModel(volume_params, 0.f);
- std::string model_name = getLodlessLabel(mesh, mForceIdNaming);
+ std::string model_name = getLodlessLabel(mesh);
ret->mLabel = model_name + lod_suffix[mLod];
llassert(!ret->mLabel.empty());
diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h
index 3ababd3156..19a85a5339 100644
--- a/indra/llprimitive/lldaeloader.h
+++ b/indra/llprimitive/lldaeloader.h
@@ -89,22 +89,21 @@ protected:
static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);
static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);
- static LLModel* loadModelFromDomMesh(domMesh* mesh, bool forceIdNaming);
- LLModel* loadModelFromDomMesh(domMesh* mesh);
+ static LLModel* loadModelFromDomMesh(domMesh* mesh);
// Loads a mesh breaking it into one or more models as necessary
// to get around volume face limitations while retaining >8 materials
//
bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit);
- static std::string getElementLabel(daeElement *element, bool forceIdNaming);
- std::string getElementLabel(daeElement *element);
+ static std::string getElementLabel(daeElement *element);
static size_t getSuffixPosition(std::string label);
- static std::string getLodlessLabel(daeElement *element, bool forceIdNaming = false);
+ static std::string getLodlessLabel(daeElement *element);
+
+ static std::string preprocessDAE(std::string filename);
private:
U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
- bool mForceIdNaming;
};
#endif // LL_LLDAELLOADER_H