描述:
因为本人急需搞清楚一下代码的算法,但是由于不熟悉ATL,读起来很吃力,请各位高手帮忙注释一下,谢谢了
void LMesh::CalcNormals(bool useSmoothingGroups)
{
uint i;
// first calculate the face normals
for (i=0; i<m_triangles.size(); i++)
{
LVector3 a, b;
a = SubtractVectors(_4to3(m_vertices[m_tris[i].b]), _4to3(m_vertices[m_tris[i].a]));
b = SubtractVectors(_4to3(m_vertices[m_tris[i].b]), _4to3(m_vertices[m_tris[i].c]));
m_tris[i].normal = NormalizeVector(CrossProduct(b, a));
}
std::vector< std::vector<int> > array;
array.resize(m_vertices.size());
for (i=0; i<m_triangles.size(); i++)
{
uint k = m_tris[i].a;
array[k].push_back(i);
k = m_tris[i].b;
array[k]
.push_back(i);
k = m_tris[i].c;
array[k].push_back(i);
}
LVector3 temp;
if (!useSmoothingGroups)
{
// now calculate the normals "without" using smoothing groups
for (i=0; i<m_vertices.size(); i++)
{
temp = zero3;
int t = array[i].size();
for (int k=0; k<t; k++)
{
temp.x += m_tris[array[i][k]].normal.x;
temp.y += m_tris[array[i][k]].normal.y;
temp.z += m_tris[array[i][k]].normal.z;
}
m_normals[i] = NormalizeVector(temp);
}
}
else
{
// now calculate the normals _USING_ smoothing groups
// I'm assuming a triangle can only belong to one smoothing group at a time!
std::vector<ulong> smGroups;
std::vector< std::vector <uint> > smList;//
uint loop_size = m_vertices.size(); //
for (i=0; i<loop_size; i++)
{
int t = array[i].size(); //normal
if (t == 0)
continue;
smGroups.clear();
smList.clear();
smGroups.push_back(m_tris[array[i][0]].smoothingGroups);
smList.resize(smGroups.size());
smList[smGroups.size()-1].push_back(array[i][0]);
// first build a list of smoothing groups for the vertex
for (int k=0; k<t; k++) // int t = array[i].size();
{
bool found = false;
for (uint j=0; j<smGroups.size(); j++)
{
if (m_tris[array[i][k]].smoothingGroups == smGroups[j])
{
smList[j].push_back(array[i][k]);
found = true;
}
}
if (!found)
{
smGroups.push_back(m_tris[array[i][k]].smoothingGroups);
smList.resize(smGroups.size());
smList[smGroups.size()-1].push_back(array[i][k]);
}