summaryrefslogtreecommitdiff
path: root/indra/llmath
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2010-04-06 16:24:08 -0500
committerDave Parks <davep@lindenlab.com>2010-04-06 16:24:08 -0500
commit47ffcdb93d6e2ac1f9d497e43e0213c98d129254 (patch)
tree1d3c1d159bca20cdca21a4e3eac23b1515372615 /indra/llmath
parent807d835c2bfc5d794a74f9690d1fafbe55ff88cc (diff)
Rigged attachments (almost works).
Diffstat (limited to 'indra/llmath')
-rw-r--r--indra/llmath/llvolume.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c563af592f..fdd48b9e9e 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -2013,22 +2013,23 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
if (mdl[i].has("Weights"))
{
face.mWeights.resize(num_verts);
+
LLSD::Binary weights = mdl[i]["Weights"];
- LLSD::Binary::iterator iter = weights.begin();
+ U32 idx = 0;
U32 cur_vertex = 0;
- while (iter != weights.end())
+ while (idx < weights.size() && cur_vertex < num_verts)
{
- const S32 END_INFLUENCES = 0xFF;
- U8 joint = *(iter++);
+ const U8 END_INFLUENCES = 0xFF;
+ U8 joint = weights[idx++];
U32 cur_influence = 0;
while (joint != END_INFLUENCES)
{
- U16 influence = *(iter++);
+ U16 influence = weights[idx++];
influence = influence << 8;
- influence |= *(iter++);
+ influence |= weights[idx++];
F32 w = llmin((F32) influence / 65535.f, 0.99999f);
face.mWeights[cur_vertex].mV[cur_influence++] = (F32) joint + w;
@@ -2039,13 +2040,18 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
}
else
{
- joint = *(iter++);
+ joint = weights[idx++];
}
}
cur_vertex++;
- iter++;
}
+
+ if (cur_vertex != num_verts || idx != weights.size())
+ {
+ llwarns << "Vertex weight count does not match vertex count!" << llendl;
+ }
+
}
LLVector3 min_pos;