因为本人急需搞清楚一下代码的算法,但是由于不熟悉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(); //normalif (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]);
}
}
// now we have the list of faces for the vertex sorted by smoothing groups
// now duplicate ATL编制的代码请高手注释the vertices so that there's only one smoothing group "per vertex"
if (smGroups.size() > 1)
for (uint j=1; j< smGroups.size(); j++)
{
m_vertices.push_back(m_vertices[i]);
m_normals.push_back(m_normals[i]);
m_uv.push_back(m_uv[i]);
m_tangents.push_back(m_tangents[i]);
m_binormals.push_back(m_binormals[i]);uint t = m_vertices.size()-1;
for (uint h=0; h<smList[j].size(); h++)
{
if (m_tris[smList[j][h]].a == i)
m_tris[smList[j][h]].a = t;
if (m_tris[smList[j][h]].b == i)
m_tris[smList[j][h]].b = t;
if (m_tris[smList[j][h]].c == i)
m_tris[smList[j][h]].c = t;
}
}
}//end of for (i=0; i<loop_size; i++)// now rebuild a face list for each vertex, since the old one is invalidated
for (i=0; i<array.size(); i++)
array[i].clear();
array.clear();
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);
}// now compute the normals
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);
}}// copy m_tris to m_triangles
for (i=0; i<m_triangles.size(); i++)
{
m_triangles[i].a = m_tris[i].a;
m_triangles[i].b = m_tris[i].b;
m_triangles[i].c = m_tris[i].c;
}
}