1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| // Calculate normals for lightning
void CIndexedVertexBuffer::ComputeNormals()
{
BOOL bVertexBufferAlreadyLocked = m_pvVertices != NULL;
if (!bVertexBufferAlreadyLocked)
BeginVertexEdition ();
BOOL bIndexBufferAlreadyLocked = m_pwIndices != NULL;
if (!bIndexBufferAlreadyLocked)
BeginIndexEdition ();
ASSERT (m_pvVertices);
ASSERT (m_pwIndices);
if (!m_pvVertices || !m_pwIndices)
return;
D3DXVECTOR3 vNormal;
DWORD dwVertex1;
DWORD dwVertex2;
DWORD dwVertex3;
//For each triangle, count the number of times each vertex is used and
//add together the normals of faces that share a vertex
for(DWORD dwCurrentVertex = 0; dwCurrentVertex < m_IndicesNumber.dwCur; dwCurrentVertex += 6)
{
dwVertex1 = m_pwIndices[dwCurrentVertex];
dwVertex2 = m_pwIndices[dwCurrentVertex + 1];
dwVertex3 = m_pwIndices[dwCurrentVertex + 2];
D3DXVECTOR3 v1 (m_pvVertices[dwVertex1].x, m_pvVertices[dwVertex1].y, m_pvVertices[dwVertex1].z);
D3DXVECTOR3 v2 (m_pvVertices[dwVertex2].x, m_pvVertices[dwVertex2].y, m_pvVertices[dwVertex2].z);
D3DXVECTOR3 v3 (m_pvVertices[dwVertex3].x, m_pvVertices[dwVertex3].y, m_pvVertices[dwVertex3].z);
vNormal = GetTriangeNormal(&v1, &v2, &v3);
m_pwNumOfSharedPolygons[dwVertex1]++;
m_pwNumOfSharedPolygons[dwVertex2]++;
m_pwNumOfSharedPolygons[dwVertex3]++;
m_pvSumVertexNormal[dwVertex1].x += vNormal.x;
m_pvSumVertexNormal[dwVertex1].y += vNormal.y;
m_pvSumVertexNormal[dwVertex1].z += vNormal.z;
m_pvSumVertexNormal[dwVertex2].x += vNormal.x;
m_pvSumVertexNormal[dwVertex2].y += vNormal.y;
m_pvSumVertexNormal[dwVertex2].z += vNormal.z;
m_pvSumVertexNormal[dwVertex3].x += vNormal.x;
m_pvSumVertexNormal[dwVertex3].y += vNormal.y;
m_pvSumVertexNormal[dwVertex3].z += vNormal.z;
}
//For each vertex, calculate the average normal
for(DWORD dwCurrentVertex = 0; dwCurrentVertex < m_VerticesNumber.dwCur; dwCurrentVertex ++)
{
vNormal.x = m_pvSumVertexNormal[dwCurrentVertex].x / m_pwNumOfSharedPolygons[dwCurrentVertex];
vNormal.y = m_pvSumVertexNormal[dwCurrentVertex].y / m_pwNumOfSharedPolygons[dwCurrentVertex];
vNormal.z = m_pvSumVertexNormal[dwCurrentVertex].z / m_pwNumOfSharedPolygons[dwCurrentVertex];
D3DXVec3Normalize(&vNormal, &vNormal);
m_pvVertices[dwCurrentVertex].nx = vNormal.x;
m_pvVertices[dwCurrentVertex].ny = vNormal.y;
m_pvVertices[dwCurrentVertex].nz = vNormal.z;
}
if (!bVertexBufferAlreadyLocked)
EndVertexEdition ();
if (!bIndexBufferAlreadyLocked)
EndIndexEdition ();
} |
Partager