CSharpGL.VertexNormalHelper.GenerateNormalsForQuadMesh C# (CSharp) Method

GenerateNormalsForQuadMesh() public static method

public static GenerateNormalsForQuadMesh ( vec3 positions, uint indexes ) : vec3[]
positions vec3
indexes uint
return vec3[]
        public static vec3[] GenerateNormalsForQuadMesh(vec3[] positions, uint[] indexes)
        {
            var faceNormals = new vec3[indexes.Length / 4];

            for (int i = 0; i < indexes.Length / 4; i++)
            {
                uint vertexId0 = indexes[i * 4 + 0];
                uint vertexId1 = indexes[i * 4 + 1];
                uint vertexId2 = indexes[i * 4 + 2];
                uint vertexId3 = indexes[i * 4 + 3];
                vec3 vertex0 = positions[vertexId0];
                vec3 vertex1 = positions[vertexId1];
                vec3 vertex2 = positions[vertexId2];
                vec3 vertex3 = positions[vertexId3];
                vec3 normalA, normalB, normalC, normalD;
                {
                    vec3 v1 = vertex0 - vertex2;
                    vec3 v2 = vertex2 - vertex1;
                    normalA = v2.cross(v1).normalize();
                }
                {
                    vec3 v1 = vertex0 - vertex3;
                    vec3 v2 = vertex3 - vertex2;
                    normalB = v2.cross(v1).normalize();
                }
                {
                    vec3 v1 = vertex0 - vertex3;
                    vec3 v2 = vertex3 - vertex1;
                    normalC = v2.cross(v1).normalize();
                }
                {
                    vec3 v1 = vertex1 - vertex3;
                    vec3 v2 = vertex3 - vertex2;
                    normalD = v2.cross(v1).normalize();
                }
                faceNormals[i] = (normalA + normalB + normalC + normalD).normalize();
            }

            var normals = new vec3[positions.Length];
            for (int i = 0; i < positions.Length; i++)
            {
                vec3 sum = new vec3();
                int shared = 0;
                for (int j = 0; j < indexes.Length / 4; j++)
                {
                    uint vertexId0 = indexes[i * 4 + 0];
                    uint vertexId1 = indexes[i * 4 + 1];
                    uint vertexId2 = indexes[i * 4 + 2];
                    uint vertexId3 = indexes[i * 4 + 3];
                    if (vertexId0 == i || vertexId1 == i || vertexId2 == i || vertexId3 == i)
                    {
                        sum = sum + faceNormals[j];
                        shared++;
                    }
                }

                if (shared > 0)
                {
                    sum = (sum / shared).normalize();
                }

                normals[i] = sum;
            }

            return normals;
        }