Skip to content

Commit 934833b

Browse files
committed
viewer#3126 Crash at LLDAELoader::processElement
1 parent 7ff7de0 commit 934833b

File tree

1 file changed

+63
-59
lines changed

1 file changed

+63
-59
lines changed

indra/llprimitive/lldaeloader.cpp

Lines changed: 63 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2080,79 +2080,83 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da
20802080
{
20812081
if (domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID()))))
20822082
{
2083-
for (LLModel* model : mModelsMap.find(mesh)->second)
2083+
dae_model_map::iterator it = mModelsMap.find(mesh);
2084+
if (it != mModelsMap.end())
20842085
{
2085-
LLMatrix4 transformation = mTransform;
2086+
for (LLModel* model : it->second)
2087+
{
2088+
LLMatrix4 transformation = mTransform;
20862089

2087-
if (mTransform.determinant() < 0)
2088-
{ //negative scales are not supported
2089-
LL_INFOS() << "Negative scale detected, unsupported transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
2090-
LLSD args;
2091-
args["Message"] = "NegativeScaleTrans";
2092-
args["LABEL"] = getElementLabel(instance_geo);
2093-
mWarningsArray.append(args);
2090+
if (mTransform.determinant() < 0)
2091+
{ //negative scales are not supported
2092+
LL_INFOS() << "Negative scale detected, unsupported transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
2093+
LLSD args;
2094+
args["Message"] = "NegativeScaleTrans";
2095+
args["LABEL"] = getElementLabel(instance_geo);
2096+
mWarningsArray.append(args);
20942097

2095-
badElement = true;
2096-
}
2098+
badElement = true;
2099+
}
20972100

2098-
LLModelLoader::material_map materials = getMaterials(model, instance_geo, dae);
2099-
2100-
// adjust the transformation to compensate for mesh normalization
2101-
LLVector3 mesh_scale_vector;
2102-
LLVector3 mesh_translation_vector;
2103-
model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
2104-
2105-
LLMatrix4 mesh_translation;
2106-
mesh_translation.setTranslation(mesh_translation_vector);
2107-
mesh_translation *= transformation;
2108-
transformation = mesh_translation;
2109-
2110-
LLMatrix4 mesh_scale;
2111-
mesh_scale.initScale(mesh_scale_vector);
2112-
mesh_scale *= transformation;
2113-
transformation = mesh_scale;
2114-
2115-
if (transformation.determinant() < 0)
2116-
{ //negative scales are not supported
2117-
LL_INFOS() << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
2118-
LLSD args;
2119-
args["Message"] = "NegativeScaleNormTrans";
2120-
args["LABEL"] = getElementLabel(instance_geo);
2121-
mWarningsArray.append(args);
2122-
badElement = true;
2123-
}
2101+
LLModelLoader::material_map materials = getMaterials(model, instance_geo, dae);
2102+
2103+
// adjust the transformation to compensate for mesh normalization
2104+
LLVector3 mesh_scale_vector;
2105+
LLVector3 mesh_translation_vector;
2106+
model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
2107+
2108+
LLMatrix4 mesh_translation;
2109+
mesh_translation.setTranslation(mesh_translation_vector);
2110+
mesh_translation *= transformation;
2111+
transformation = mesh_translation;
2112+
2113+
LLMatrix4 mesh_scale;
2114+
mesh_scale.initScale(mesh_scale_vector);
2115+
mesh_scale *= transformation;
2116+
transformation = mesh_scale;
2117+
2118+
if (transformation.determinant() < 0)
2119+
{ //negative scales are not supported
2120+
LL_INFOS() << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: " << getElementLabel(instance_geo) << LL_ENDL;
2121+
LLSD args;
2122+
args["Message"] = "NegativeScaleNormTrans";
2123+
args["LABEL"] = getElementLabel(instance_geo);
2124+
mWarningsArray.append(args);
2125+
badElement = true;
2126+
}
21242127

2125-
std::string label;
2128+
std::string label;
21262129

2127-
if (model->mLabel.empty())
2128-
{
2129-
label = getLodlessLabel(instance_geo);
2130+
if (model->mLabel.empty())
2131+
{
2132+
label = getLodlessLabel(instance_geo);
21302133

2131-
llassert(!label.empty());
2134+
llassert(!label.empty());
21322135

2133-
if (model->mSubmodelID)
2134-
{
2135-
label += (char)((int)'a' + model->mSubmodelID);
2136-
}
2136+
if (model->mSubmodelID)
2137+
{
2138+
label += (char)((int)'a' + model->mSubmodelID);
2139+
}
21372140

2138-
model->mLabel = label + lod_suffix[mLod];
2139-
}
2140-
else
2141-
{
2142-
// Don't change model's name if possible, it will play havoc with scenes that already use said model.
2143-
size_t ext_pos = getSuffixPosition(model->mLabel);
2144-
if (ext_pos != -1)
2145-
{
2146-
label = model->mLabel.substr(0, ext_pos);
2141+
model->mLabel = label + lod_suffix[mLod];
21472142
}
21482143
else
21492144
{
2150-
label = model->mLabel;
2145+
// Don't change model's name if possible, it will play havoc with scenes that already use said model.
2146+
size_t ext_pos = getSuffixPosition(model->mLabel);
2147+
if (ext_pos != -1)
2148+
{
2149+
label = model->mLabel.substr(0, ext_pos);
2150+
}
2151+
else
2152+
{
2153+
label = model->mLabel;
2154+
}
21512155
}
2152-
}
21532156

2154-
mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
2155-
stretch_extents(model, transformation);
2157+
mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
2158+
stretch_extents(model, transformation);
2159+
}
21562160
}
21572161
}
21582162
}

0 commit comments

Comments
 (0)