/// <summary> /// Calculates normals for all triangles specifyed by the given parameters. /// </summary> /// <param name="startVertex">The vertex index on which to start.</param> /// <param name="vertexCount">Total count of vertices to be updated.</param> public void CalculateNormals(int startVertex, int vertexCount) { if ((startVertex < 0) || (startVertex >= m_vertices.Count)) { throw new ArgumentException("startVertex"); } if (vertexCount + startVertex > m_vertices.Count) { throw new ArgumentException("vertexCount"); } for (int actVertexIndex = startVertex; actVertexIndex < startVertex + vertexCount; actVertexIndex++) { // Find all triangles connected to this vertex and get normals from them Vector3 finalNormalHelper = Vector3.Zero; Vector3 finalNormalHelper2 = Vector3.Zero; int normalCount = 0; int surfaceCount = m_surfaces.Count; for (int actSurfaceIndex = 0; actSurfaceIndex < surfaceCount; actSurfaceIndex++) { VertexStructureSurface actSurface = m_surfaces[actSurfaceIndex]; int triangleCount = actSurface.CountTriangles; for (int loopTriangle = 0; loopTriangle < triangleCount; loopTriangle++) { int triangleStartIndex = loopTriangle * 3; if ((actSurface.IndicesInternal[triangleStartIndex] == actVertexIndex) || (actSurface.IndicesInternal[triangleStartIndex + 1] == actVertexIndex) || (actSurface.IndicesInternal[triangleStartIndex + 2] == actVertexIndex)) { Vertex v1 = m_vertices[actSurface.IndicesInternal[triangleStartIndex]]; Vertex v2 = m_vertices[actSurface.IndicesInternal[triangleStartIndex + 1]]; Vertex v3 = m_vertices[actSurface.IndicesInternal[triangleStartIndex + 2]]; finalNormalHelper += Vector3Ex.CalculateTriangleNormal(v1.Geometry.Position, v2.Geometry.Position, v3.Geometry.Position, false); normalCount++; } } } // Calculate final normal if (normalCount > 0) { Vertex actVertex = m_vertices[actVertexIndex]; actVertex.Normal = finalNormalHelper / finalNormalHelper.Length(); m_vertices[actVertexIndex] = actVertex; normalCount = 0; } } }
/// <summary> /// Calculates normals for the given treangle. /// </summary> /// <param name="actTriangle">The triangle for which to calculate the normal (flat).</param> public void CalculateNormalsFlat(Triangle actTriangle) { var v1 = m_owner.RawGeometry[actTriangle.Index1]; var v2 = m_owner.RawGeometry[actTriangle.Index2]; var v3 = m_owner.RawGeometry[actTriangle.Index3]; Vector3 normal = Vector3Ex.CalculateTriangleNormal(v1.Position, v2.Position, v3.Position); v1 = v1.Copy(v1.Position, normal); v2 = v2.Copy(v2.Position, normal); v3 = v3.Copy(v3.Position, normal); m_owner.RawGeometry[actTriangle.Index1] = v1; m_owner.RawGeometry[actTriangle.Index2] = v2; m_owner.RawGeometry[actTriangle.Index3] = v3; }
/// <summary> /// Calculates normals for the given treangle. /// </summary> /// <param name="actTriangle">The triangle for which to calculate the normal (flat).</param> public void CalculateNormalsFlat(Triangle actTriangle) { Vertex v1 = m_owner.VerticesInternal[actTriangle.Index1]; Vertex v2 = m_owner.VerticesInternal[actTriangle.Index2]; Vertex v3 = m_owner.VerticesInternal[actTriangle.Index3]; Vector3 normal = Vector3Ex.CalculateTriangleNormal(v1.Geometry.Position, v2.Geometry.Position, v3.Geometry.Position); v1 = v1.Copy(v1.Geometry.Position, normal); v2 = v2.Copy(v2.Geometry.Position, normal); v3 = v3.Copy(v3.Geometry.Position, normal); m_owner.VerticesInternal[actTriangle.Index1] = v1; m_owner.VerticesInternal[actTriangle.Index2] = v2; m_owner.VerticesInternal[actTriangle.Index3] = v3; }