Пример #1
0
        /// <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;
        }
Пример #3
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)
        {
            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;
        }