More progress towards implementing vertex normals - not complete yet.
							parent
							
								
									6362760d30
								
							
						
					
					
						commit
						b6396bc9a7
					
				| 
						 | 
				
			
			@ -192,8 +192,23 @@ namespace PrimMesher
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public struct UVCoord
 | 
			
		||||
    {
 | 
			
		||||
        public float U;
 | 
			
		||||
        public float V;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public UVCoord(float u, float v)
 | 
			
		||||
        {
 | 
			
		||||
            this.U = u;
 | 
			
		||||
            this.V = v;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public struct Face
 | 
			
		||||
    {
 | 
			
		||||
        public int primFace;
 | 
			
		||||
 | 
			
		||||
        // vertices
 | 
			
		||||
        public int v1;
 | 
			
		||||
        public int v2;
 | 
			
		||||
| 
						 | 
				
			
			@ -204,8 +219,15 @@ namespace PrimMesher
 | 
			
		|||
        public int n2;
 | 
			
		||||
        public int n3;
 | 
			
		||||
 | 
			
		||||
        //// UVs
 | 
			
		||||
        //public int uv1;
 | 
			
		||||
        //public int uv2;
 | 
			
		||||
        //public int uv3;
 | 
			
		||||
 | 
			
		||||
        public Face(int v1, int v2, int v3)
 | 
			
		||||
        {
 | 
			
		||||
            primFace = 0;
 | 
			
		||||
 | 
			
		||||
            this.v1 = v1;
 | 
			
		||||
            this.v2 = v2;
 | 
			
		||||
            this.v3 = v3;
 | 
			
		||||
| 
						 | 
				
			
			@ -213,10 +235,16 @@ namespace PrimMesher
 | 
			
		|||
            this.n1 = 0;
 | 
			
		||||
            this.n2 = 0;
 | 
			
		||||
            this.n3 = 0;
 | 
			
		||||
 | 
			
		||||
            //this.uv1 = 0;
 | 
			
		||||
            //this.uv2 = 0;
 | 
			
		||||
            //this.uv3 = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Face(int v1, int v2, int v3, int n1, int n2, int n3)
 | 
			
		||||
        {
 | 
			
		||||
            primFace = 0;
 | 
			
		||||
 | 
			
		||||
            this.v1 = v1;
 | 
			
		||||
            this.v2 = v2;
 | 
			
		||||
            this.v3 = v3;
 | 
			
		||||
| 
						 | 
				
			
			@ -224,6 +252,85 @@ namespace PrimMesher
 | 
			
		|||
            this.n1 = n1;
 | 
			
		||||
            this.n2 = n2;
 | 
			
		||||
            this.n3 = n3;
 | 
			
		||||
 | 
			
		||||
            //this.uv1 = 0;
 | 
			
		||||
            //this.uv2 = 0;
 | 
			
		||||
            //this.uv3 = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public struct ViewerFace
 | 
			
		||||
    {
 | 
			
		||||
        public int primFaceNumber;
 | 
			
		||||
 | 
			
		||||
        public Coord v1;
 | 
			
		||||
        public Coord v2;
 | 
			
		||||
        public Coord v3;
 | 
			
		||||
 | 
			
		||||
        public Coord n1;
 | 
			
		||||
        public Coord n2;
 | 
			
		||||
        public Coord n3;
 | 
			
		||||
 | 
			
		||||
        public UVCoord uv1;
 | 
			
		||||
        public UVCoord uv2;
 | 
			
		||||
        public UVCoord uv3;
 | 
			
		||||
 | 
			
		||||
        public ViewerFace(int primFaceNumber)
 | 
			
		||||
        {
 | 
			
		||||
            this.primFaceNumber = primFaceNumber;
 | 
			
		||||
 | 
			
		||||
            this.v1 = new Coord();
 | 
			
		||||
            this.v2 = new Coord();
 | 
			
		||||
            this.v3 = new Coord();
 | 
			
		||||
 | 
			
		||||
            this.n1 = new Coord();
 | 
			
		||||
            this.n2 = new Coord();
 | 
			
		||||
            this.n3 = new Coord();
 | 
			
		||||
 | 
			
		||||
            this.uv1 = new UVCoord();
 | 
			
		||||
            this.uv2 = new UVCoord();
 | 
			
		||||
            this.uv3 = new UVCoord();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Scale(float x, float y, float z)
 | 
			
		||||
        {
 | 
			
		||||
            this.v1.X *= x;
 | 
			
		||||
            this.v1.Y *= y;
 | 
			
		||||
            this.v1.Z *= z;
 | 
			
		||||
 | 
			
		||||
            this.v2.X *= x;
 | 
			
		||||
            this.v2.Y *= y;
 | 
			
		||||
            this.v2.Z *= z;
 | 
			
		||||
 | 
			
		||||
            this.v3.X *= x;
 | 
			
		||||
            this.v3.Y *= y;
 | 
			
		||||
            this.v3.Z *= z;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddRot(Quat q)
 | 
			
		||||
        {
 | 
			
		||||
            this.v1 *= q;
 | 
			
		||||
            this.v2 *= q;
 | 
			
		||||
            this.v3 *= q;
 | 
			
		||||
 | 
			
		||||
            this.n1 *= q;
 | 
			
		||||
            this.n2 *= q;
 | 
			
		||||
            this.n3 *= q;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void CalcSurfaceNormal()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            Coord edge1 = new Coord(this.n2.X - this.n1.X, this.n2.Y - this.n1.Y, this.n2.Z - this.n1.Z);
 | 
			
		||||
            Coord edge2 = new Coord(this.n3.X - this.n1.X, this.n3.Y - this.n1.Y, this.n3.Z - this.n1.Z);
 | 
			
		||||
 | 
			
		||||
            //Coord normal = Coord.Cross(edge1, edge2).Normalize();
 | 
			
		||||
 | 
			
		||||
            //this.n1 = normal;
 | 
			
		||||
            //this.n2 = normal;
 | 
			
		||||
            //this.n3 = normal;
 | 
			
		||||
 | 
			
		||||
            this.n1 = this.n2 = this.n3 = Coord.Cross(edge1, edge2).Normalize();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -415,7 +522,13 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
        internal List<Coord> coords;
 | 
			
		||||
        internal List<Face> faces;
 | 
			
		||||
        internal List<Coord> edgeNormals;
 | 
			
		||||
        internal List<Coord> vertexNormals;
 | 
			
		||||
        internal Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f);
 | 
			
		||||
        internal Coord cutNormal1 = new Coord();
 | 
			
		||||
        internal Coord cutNormal2 = new Coord();
 | 
			
		||||
 | 
			
		||||
        internal int numOuterVerts = 0;
 | 
			
		||||
        internal int numHollowVerts = 0;
 | 
			
		||||
 | 
			
		||||
        internal bool calcVertexNormals = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -423,7 +536,7 @@ namespace PrimMesher
 | 
			
		|||
        {
 | 
			
		||||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
            this.edgeNormals = new List<Coord>();
 | 
			
		||||
            this.vertexNormals = new List<Coord>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals)
 | 
			
		||||
| 
						 | 
				
			
			@ -431,13 +544,15 @@ namespace PrimMesher
 | 
			
		|||
            this.calcVertexNormals = calcVertexNormals;
 | 
			
		||||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
            this.edgeNormals = new List<Coord>();
 | 
			
		||||
            this.vertexNormals = new List<Coord>();
 | 
			
		||||
            Coord center = new Coord(0.0f, 0.0f, 0.0f);
 | 
			
		||||
 | 
			
		||||
            List<Coord> hollowCoords = new List<Coord>();
 | 
			
		||||
            List<Coord> hollowNormals = new List<Coord>();
 | 
			
		||||
 | 
			
		||||
            //Quat rot180 = new Quat(new Coord(0.0f, 0.0f, 1.0f), (float)Math.PI); ;
 | 
			
		||||
            bool hasHollow = (hollow > 0.0f);
 | 
			
		||||
 | 
			
		||||
            bool hasProfileCut = (profileStart > 0.0f || profileEnd < 1.0f);
 | 
			
		||||
 | 
			
		||||
            AngleList angles = new AngleList();
 | 
			
		||||
| 
						 | 
				
			
			@ -463,6 +578,8 @@ namespace PrimMesher
 | 
			
		|||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.numOuterVerts = angles.angles.Count;
 | 
			
		||||
 | 
			
		||||
            // flag to create as few triangles as possible for 3 or 4 side profile
 | 
			
		||||
            bool simpleFace = (sides < 5 && !(hasHollow || hasProfileCut));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -480,12 +597,13 @@ namespace PrimMesher
 | 
			
		|||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                this.numHollowVerts = hollowAngles.angles.Count;
 | 
			
		||||
            }
 | 
			
		||||
            else if (!simpleFace)
 | 
			
		||||
            {
 | 
			
		||||
                this.coords.Add(center);
 | 
			
		||||
                if (this.calcVertexNormals && sides > 4)
 | 
			
		||||
                    this.edgeNormals.Add(new Coord(0.0f, 0.0f, 1.0f));
 | 
			
		||||
                if (this.calcVertexNormals)// && sides > 4)
 | 
			
		||||
                    this.vertexNormals.Add(new Coord(0.0f, 0.0f, 1.0f));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            float z = 0.0f;
 | 
			
		||||
| 
						 | 
				
			
			@ -504,12 +622,18 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
                    hollowCoords.Add(newVert);
 | 
			
		||||
                    if (this.calcVertexNormals)
 | 
			
		||||
                    {
 | 
			
		||||
                        //Coord hollowNormal = new Coord(angle.X, angle.Y, 0.0f);
 | 
			
		||||
                        //hollowNormal *= rot180;
 | 
			
		||||
                        //hollowNormals.Add(hollowNormal);
 | 
			
		||||
                        hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int index = 0;
 | 
			
		||||
            int numAngles = angles.angles.Count;
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < numAngles; i++)
 | 
			
		||||
            {
 | 
			
		||||
                angle = angles.angles[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -518,7 +642,7 @@ namespace PrimMesher
 | 
			
		|||
                newVert.Z = z;
 | 
			
		||||
                this.coords.Add(newVert);
 | 
			
		||||
                if (this.calcVertexNormals)
 | 
			
		||||
                    this.edgeNormals.Add(new Coord(angle.X, angle.Y, 0.0f));
 | 
			
		||||
                    this.vertexNormals.Add(new Coord(angle.X, angle.Y, 0.0f));
 | 
			
		||||
 | 
			
		||||
                if (hollow > 0.0f)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -529,7 +653,12 @@ namespace PrimMesher
 | 
			
		|||
                        newVert.Z = z;
 | 
			
		||||
                        hollowCoords.Add(newVert);
 | 
			
		||||
                        if (this.calcVertexNormals)
 | 
			
		||||
                        {
 | 
			
		||||
                            //Coord hollowNormal = new Coord(angle.X, angle.Y, 0.0f);
 | 
			
		||||
                            //hollowNormal *= rot180;
 | 
			
		||||
                            //hollowNormals.Add(hollowNormal);
 | 
			
		||||
                            hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else if (!simpleFace && createFaces && angle.angle > 0.0001f)
 | 
			
		||||
| 
						 | 
				
			
			@ -538,12 +667,7 @@ namespace PrimMesher
 | 
			
		|||
                    newFace.v1 = 0;
 | 
			
		||||
                    newFace.v2 = index;
 | 
			
		||||
                    newFace.v3 = index + 1;
 | 
			
		||||
                    //if (this.calcVertexNormals)
 | 
			
		||||
                    //{
 | 
			
		||||
                    //    newFace.n1 = newFace.v1;
 | 
			
		||||
                    //    newFace.n2 = newFace.v2;
 | 
			
		||||
                    //    newFace.n3 = newFace.v3;
 | 
			
		||||
                    //}
 | 
			
		||||
 | 
			
		||||
                    this.faces.Add(newFace);
 | 
			
		||||
                }
 | 
			
		||||
                index += 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -570,23 +694,11 @@ namespace PrimMesher
 | 
			
		|||
                            newFace.v1 = coordIndex;
 | 
			
		||||
                            newFace.v2 = coordIndex + 1;
 | 
			
		||||
                            newFace.v3 = numTotalVerts - coordIndex - 1;
 | 
			
		||||
                            //if (this.calcVertexNormals)
 | 
			
		||||
                            //{
 | 
			
		||||
                            //    newFace.n1 = newFace.v1;
 | 
			
		||||
                            //    newFace.n2 = newFace.v2;
 | 
			
		||||
                            //    newFace.n3 = newFace.v3;
 | 
			
		||||
                            //}
 | 
			
		||||
                            this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                            newFace.v1 = coordIndex + 1;
 | 
			
		||||
                            newFace.v2 = numTotalVerts - coordIndex - 2;
 | 
			
		||||
                            newFace.v3 = numTotalVerts - coordIndex - 1;
 | 
			
		||||
                            //if (this.calcVertexNormals)
 | 
			
		||||
                            //{
 | 
			
		||||
                            //    newFace.n1 = newFace.v1;
 | 
			
		||||
                            //    newFace.n2 = newFace.v2;
 | 
			
		||||
                            //    newFace.n3 = newFace.v3;
 | 
			
		||||
                            //}
 | 
			
		||||
                            this.faces.Add(newFace);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -605,12 +717,6 @@ namespace PrimMesher
 | 
			
		|||
                                        newFace.v1 = numTotalVerts - i - 1;
 | 
			
		||||
                                        newFace.v2 = j;
 | 
			
		||||
                                        newFace.v3 = j + 1;
 | 
			
		||||
                                        //if (this.calcVertexNormals)
 | 
			
		||||
                                        //{
 | 
			
		||||
                                        //    newFace.n1 = newFace.v1;
 | 
			
		||||
                                        //    newFace.n2 = newFace.v2;
 | 
			
		||||
                                        //    newFace.n3 = newFace.v3;
 | 
			
		||||
                                        //}
 | 
			
		||||
 | 
			
		||||
                                        this.faces.Add(newFace);
 | 
			
		||||
                                        j += 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -619,12 +725,6 @@ namespace PrimMesher
 | 
			
		|||
                                newFace.v1 = j;
 | 
			
		||||
                                newFace.v2 = numTotalVerts - i - 2;
 | 
			
		||||
                                newFace.v3 = numTotalVerts - i - 1;
 | 
			
		||||
                                //if (this.calcVertexNormals)
 | 
			
		||||
                                //{
 | 
			
		||||
                                //    newFace.n1 = newFace.v1;
 | 
			
		||||
                                //    newFace.n2 = newFace.v2;
 | 
			
		||||
                                //    newFace.n3 = newFace.v3;
 | 
			
		||||
                                //}
 | 
			
		||||
 | 
			
		||||
                                this.faces.Add(newFace);
 | 
			
		||||
                            }
 | 
			
		||||
| 
						 | 
				
			
			@ -642,12 +742,6 @@ namespace PrimMesher
 | 
			
		|||
                                        newFace.v1 = i;
 | 
			
		||||
                                        newFace.v2 = numTotalVerts - j - 2;
 | 
			
		||||
                                        newFace.v3 = numTotalVerts - j - 1;
 | 
			
		||||
                                        //if (this.calcVertexNormals)
 | 
			
		||||
                                        //{
 | 
			
		||||
                                        //    newFace.n1 = newFace.v1;
 | 
			
		||||
                                        //    newFace.n2 = newFace.v2;
 | 
			
		||||
                                        //    newFace.n3 = newFace.v3;
 | 
			
		||||
                                        //}
 | 
			
		||||
 | 
			
		||||
                                        this.faces.Add(newFace);
 | 
			
		||||
                                        j += 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -656,12 +750,6 @@ namespace PrimMesher
 | 
			
		|||
                                newFace.v1 = numTotalVerts - j - 1;
 | 
			
		||||
                                newFace.v2 = i;
 | 
			
		||||
                                newFace.v3 = i + 1;
 | 
			
		||||
                                //if (this.calcVertexNormals)
 | 
			
		||||
                                //{
 | 
			
		||||
                                //    newFace.n1 = newFace.v1;
 | 
			
		||||
                                //    newFace.n2 = newFace.v2;
 | 
			
		||||
                                //    newFace.n3 = newFace.v3;
 | 
			
		||||
                                //}
 | 
			
		||||
 | 
			
		||||
                                this.faces.Add(newFace);
 | 
			
		||||
                            }
 | 
			
		||||
| 
						 | 
				
			
			@ -671,10 +759,7 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
                this.coords.AddRange(hollowCoords);
 | 
			
		||||
                if (this.calcVertexNormals)
 | 
			
		||||
                    this.edgeNormals.AddRange(hollowNormals);
 | 
			
		||||
 | 
			
		||||
                hollowCoords = null;
 | 
			
		||||
                hollowNormals = null;
 | 
			
		||||
                    this.vertexNormals.AddRange(hollowNormals);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (simpleFace && createFaces)
 | 
			
		||||
| 
						 | 
				
			
			@ -688,6 +773,33 @@ namespace PrimMesher
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (calcVertexNormals && hasProfileCut)
 | 
			
		||||
            {
 | 
			
		||||
                if (hasHollow)
 | 
			
		||||
                {
 | 
			
		||||
                    this.cutNormal1.X = -this.vertexNormals[0].Y - this.vertexNormals[this.vertexNormals.Count - 1].Y;
 | 
			
		||||
                    this.cutNormal1.Y = this.vertexNormals[0].X - this.vertexNormals[this.vertexNormals.Count - 1].X;
 | 
			
		||||
 | 
			
		||||
                    int lastOuterVertIndex = this.numOuterVerts - 1;
 | 
			
		||||
                    this.cutNormal2.X = -this.vertexNormals[lastOuterVertIndex].Y - this.vertexNormals[lastOuterVertIndex + 1].Y;
 | 
			
		||||
                    this.cutNormal2.Y = this.vertexNormals[lastOuterVertIndex].X - this.vertexNormals[lastOuterVertIndex + 1].X;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    this.cutNormal1.X = this.vertexNormals[1].Y;
 | 
			
		||||
                    this.cutNormal1.Y = -this.vertexNormals[1].X;
 | 
			
		||||
 | 
			
		||||
                    this.cutNormal2.X = -this.vertexNormals[this.vertexNormals.Count - 1].Y;
 | 
			
		||||
                    this.cutNormal2.Y = this.vertexNormals[this.vertexNormals.Count - 1].X;
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                this.cutNormal1.Normalize();
 | 
			
		||||
                this.cutNormal2.Normalize();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            hollowCoords = null;
 | 
			
		||||
            hollowNormals = null;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Profile Clone()
 | 
			
		||||
| 
						 | 
				
			
			@ -702,7 +814,15 @@ namespace PrimMesher
 | 
			
		|||
            clone.coords.AddRange(this.coords);
 | 
			
		||||
            if (needFaces)
 | 
			
		||||
                clone.faces.AddRange(this.faces);
 | 
			
		||||
            clone.edgeNormals.AddRange(this.edgeNormals);
 | 
			
		||||
            if ((clone.calcVertexNormals = this.calcVertexNormals) == true)
 | 
			
		||||
            {
 | 
			
		||||
                clone.vertexNormals.AddRange(this.vertexNormals);
 | 
			
		||||
                clone.faceNormal = this.faceNormal;
 | 
			
		||||
                clone.cutNormal1 = this.cutNormal1;
 | 
			
		||||
                clone.cutNormal2 = this.cutNormal2;
 | 
			
		||||
            }
 | 
			
		||||
            clone.numOuterVerts = this.numOuterVerts;
 | 
			
		||||
            clone.numHollowVerts = this.numHollowVerts;
 | 
			
		||||
 | 
			
		||||
            return clone;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -745,16 +865,23 @@ namespace PrimMesher
 | 
			
		|||
                this.coords[i] = c;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            int numNormals = this.edgeNormals.Count;
 | 
			
		||||
            for (i = 0; i < numNormals; i++)
 | 
			
		||||
            if (this.calcVertexNormals)
 | 
			
		||||
            {
 | 
			
		||||
                c = this.edgeNormals[i];
 | 
			
		||||
                Coord n = new Coord(c.X, c.Y, c.Z) * q;
 | 
			
		||||
                int numNormals = this.vertexNormals.Count;
 | 
			
		||||
                for (i = 0; i < numNormals; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    c = this.vertexNormals[i];
 | 
			
		||||
                    Coord n = new Coord(c.X, c.Y, c.Z) * q;
 | 
			
		||||
 | 
			
		||||
                c.X = n.X;
 | 
			
		||||
                c.Y = n.Y;
 | 
			
		||||
                c.Z = n.Z;
 | 
			
		||||
                this.edgeNormals[i] = c;
 | 
			
		||||
                    c.X = n.X;
 | 
			
		||||
                    c.Y = n.Y;
 | 
			
		||||
                    c.Z = n.Z;
 | 
			
		||||
                    this.vertexNormals[i] = c;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this.faceNormal *= q;
 | 
			
		||||
                this.cutNormal1 *= q;
 | 
			
		||||
                this.cutNormal2 *= q;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -794,14 +921,18 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
            if (this.calcVertexNormals)
 | 
			
		||||
            {
 | 
			
		||||
                int normalCount = this.edgeNormals.Count;
 | 
			
		||||
                int normalCount = this.vertexNormals.Count;
 | 
			
		||||
                if (normalCount > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    Coord n = this.edgeNormals[normalCount - 1];
 | 
			
		||||
                    Coord n = this.vertexNormals[normalCount - 1];
 | 
			
		||||
                    n.Z = -n.Z;
 | 
			
		||||
                    this.edgeNormals[normalCount - 1] = n;
 | 
			
		||||
                    this.vertexNormals[normalCount - 1] = n;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.faceNormal.X = -this.faceNormal.X;
 | 
			
		||||
            this.faceNormal.Y = -this.faceNormal.Y;
 | 
			
		||||
            this.faceNormal.Z = -this.faceNormal.Z;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddValue2FaceVertexIndices(int num)
 | 
			
		||||
| 
						 | 
				
			
			@ -866,11 +997,13 @@ namespace PrimMesher
 | 
			
		|||
        public List<Coord> normals;
 | 
			
		||||
        public List<Face> faces;
 | 
			
		||||
 | 
			
		||||
        public int sides = 4;
 | 
			
		||||
        public int hollowSides = 4;
 | 
			
		||||
        public float profileStart = 0.0f;
 | 
			
		||||
        public float profileEnd = 1.0f;
 | 
			
		||||
        public float hollow = 0.0f;
 | 
			
		||||
        public List<ViewerFace> viewerFaces;
 | 
			
		||||
 | 
			
		||||
        private int sides = 4;
 | 
			
		||||
        private int hollowSides = 4;
 | 
			
		||||
        private float profileStart = 0.0f;
 | 
			
		||||
        private float profileEnd = 1.0f;
 | 
			
		||||
        private float hollow = 0.0f;
 | 
			
		||||
        public int twistBegin = 0;
 | 
			
		||||
        public int twistEnd = 0;
 | 
			
		||||
        public float topShearX = 0.0f;
 | 
			
		||||
| 
						 | 
				
			
			@ -888,10 +1021,10 @@ namespace PrimMesher
 | 
			
		|||
        public float revolutions = 1.0f;
 | 
			
		||||
        public int stepsPerRevolution = 24;
 | 
			
		||||
 | 
			
		||||
        private bool hasProfileCut = false;
 | 
			
		||||
        public bool calcVertexNormals = false;
 | 
			
		||||
        private bool normalsProcessed = false;
 | 
			
		||||
 | 
			
		||||
        //private List<Coord> edgeNormals;
 | 
			
		||||
        public bool viewerMode = false;
 | 
			
		||||
 | 
			
		||||
        public string ParamsToDisplayString()
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -949,6 +1082,8 @@ namespace PrimMesher
 | 
			
		|||
                this.hollow = 1.0f;
 | 
			
		||||
            if (hollow < 0.0f)
 | 
			
		||||
                this.hollow = 0.0f;
 | 
			
		||||
 | 
			
		||||
            this.hasProfileCut = (this.profileStart > 0.0f || this.profileEnd < 1.0f);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ExtrudeLinear()
 | 
			
		||||
| 
						 | 
				
			
			@ -956,6 +1091,12 @@ namespace PrimMesher
 | 
			
		|||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
 | 
			
		||||
            if (this.viewerMode)
 | 
			
		||||
            {
 | 
			
		||||
                this.viewerFaces = new List<ViewerFace>();
 | 
			
		||||
                this.calcVertexNormals = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.calcVertexNormals)
 | 
			
		||||
                this.normals = new List<Coord>();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -964,18 +1105,15 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
            float length = this.pathCutEnd - this.pathCutBegin;
 | 
			
		||||
            normalsProcessed = false;
 | 
			
		||||
            //if (this.calcVertexNormals)
 | 
			
		||||
            //    this.edgeNormals = new List<Coord>();
 | 
			
		||||
 | 
			
		||||
#if VIEWER
 | 
			
		||||
            if (this.sides == 3)
 | 
			
		||||
            if (this.viewerMode && this.sides == 3)
 | 
			
		||||
            {
 | 
			
		||||
                // prisms don't taper well so add some vertical resolution
 | 
			
		||||
                // other prims may benefit from this but just do prisms for now
 | 
			
		||||
                if (Math.Abs(this.taperX) > 0.01 || Math.Abs(this.taperY) > 0.01)
 | 
			
		||||
                    steps = (int)(steps * 4.5 * length);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            float twistBegin = this.twistBegin / 360.0f * twoPi;
 | 
			
		||||
            float twistEnd = this.twistEnd / 360.0f * twoPi;
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,15 +1159,14 @@ namespace PrimMesher
 | 
			
		|||
            else if (this.sides == 24 && this.hollowSides == 4)
 | 
			
		||||
                hollow *= 1.414f;
 | 
			
		||||
 | 
			
		||||
            bool hasProfileCut = false;
 | 
			
		||||
            if (profileStart > 0.0f || profileEnd < 1.0f)
 | 
			
		||||
                hasProfileCut = true;
 | 
			
		||||
 | 
			
		||||
            Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, true, calcVertexNormals);
 | 
			
		||||
 | 
			
		||||
            if (initialProfileRot != 0.0f)
 | 
			
		||||
                profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
 | 
			
		||||
 | 
			
		||||
            Coord lastCutNormal1 = new Coord();
 | 
			
		||||
            Coord lastCutNormal2 = new Coord();
 | 
			
		||||
 | 
			
		||||
            bool done = false;
 | 
			
		||||
            while (!done)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1057,8 +1194,31 @@ namespace PrimMesher
 | 
			
		|||
                newLayer.AddPos(xOffset, yOffset, zOffset);
 | 
			
		||||
 | 
			
		||||
                if (step == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    newLayer.FlipNormals();
 | 
			
		||||
 | 
			
		||||
                    // add the top faces to the viewerFaces list here
 | 
			
		||||
                    if (this.viewerMode)
 | 
			
		||||
                    {
 | 
			
		||||
                        Coord faceNormal = newLayer.faceNormal;
 | 
			
		||||
                        ViewerFace newViewerFace = new ViewerFace();
 | 
			
		||||
                        newViewerFace.primFaceNumber = 0;
 | 
			
		||||
                        foreach (Face face in newLayer.faces)
 | 
			
		||||
                        {
 | 
			
		||||
                            newViewerFace.v1 = newLayer.coords[face.v1];
 | 
			
		||||
                            newViewerFace.v2 = newLayer.coords[face.v2];
 | 
			
		||||
                            newViewerFace.v3 = newLayer.coords[face.v3];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n1 = faceNormal;
 | 
			
		||||
                            newViewerFace.n2 = faceNormal;
 | 
			
		||||
                            newViewerFace.n3 = faceNormal;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // append this layer
 | 
			
		||||
 | 
			
		||||
                int coordsLen = this.coords.Count;
 | 
			
		||||
| 
						 | 
				
			
			@ -1069,7 +1229,7 @@ namespace PrimMesher
 | 
			
		|||
                if (this.calcVertexNormals)
 | 
			
		||||
                {
 | 
			
		||||
                    newLayer.AddValue2FaceNormalIndices(this.normals.Count);
 | 
			
		||||
                    this.normals.AddRange(newLayer.edgeNormals);
 | 
			
		||||
                    this.normals.AddRange(newLayer.vertexNormals);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (percentOfPath <= this.pathCutBegin || percentOfPath >= this.pathCutEnd)
 | 
			
		||||
| 
						 | 
				
			
			@ -1085,61 +1245,112 @@ namespace PrimMesher
 | 
			
		|||
                    int startVert = coordsLen + 1;
 | 
			
		||||
                    int endVert = this.coords.Count - 1;
 | 
			
		||||
 | 
			
		||||
                    if (sides < 5 || hasProfileCut || hollow > 0.0f)
 | 
			
		||||
                    if (sides < 5 || this.hasProfileCut || hollow > 0.0f)
 | 
			
		||||
                        startVert--;
 | 
			
		||||
 | 
			
		||||
                    for (int i = startVert; i < endVert; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        int whichVert = i - startVert;
 | 
			
		||||
 | 
			
		||||
                        newFace.v1 = i;
 | 
			
		||||
                        newFace.v2 = i - numVerts;
 | 
			
		||||
                        newFace.v3 = i - numVerts + 1;
 | 
			
		||||
                        if (this.calcVertexNormals)
 | 
			
		||||
                        {
 | 
			
		||||
                            newFace.n1 = newFace.v1;
 | 
			
		||||
                            newFace.n2 = newFace.v2;
 | 
			
		||||
                            newFace.n3 = newFace.v3;
 | 
			
		||||
                        }
 | 
			
		||||
                        this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                        newFace.v2 = i - numVerts + 1;
 | 
			
		||||
                        newFace.v3 = i + 1;
 | 
			
		||||
                        if (this.calcVertexNormals)
 | 
			
		||||
                        {
 | 
			
		||||
                            newFace.n2 = newFace.v2;
 | 
			
		||||
                            newFace.n3 = newFace.v3;
 | 
			
		||||
                        }
 | 
			
		||||
                        this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                        if (this.viewerMode)
 | 
			
		||||
                        {
 | 
			
		||||
                            // add the side faces to the list of viewerFaces here
 | 
			
		||||
                            ViewerFace newViewerFace1 = new ViewerFace();
 | 
			
		||||
                            ViewerFace newViewerFace2 = new ViewerFace();
 | 
			
		||||
 | 
			
		||||
                            newViewerFace1.v1 = this.coords[i];
 | 
			
		||||
                            newViewerFace1.v2 = this.coords[i - numVerts];
 | 
			
		||||
                            newViewerFace1.v3 = this.coords[i - numVerts + 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace2.v1 = this.coords[i];
 | 
			
		||||
                            newViewerFace2.v2 = this.coords[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace2.v3 = this.coords[i + 1];
 | 
			
		||||
 | 
			
		||||
                            if (whichVert == newLayer.numOuterVerts - 1 && hasProfileCut)
 | 
			
		||||
                            {  // start profile cut faces
 | 
			
		||||
 | 
			
		||||
                                newViewerFace1.n2 = newViewerFace1.n1 = lastCutNormal1;
 | 
			
		||||
                                newViewerFace1.n3 = newLayer.cutNormal1;
 | 
			
		||||
 | 
			
		||||
                                newViewerFace2.n3 = newViewerFace2.n1 = newLayer.cutNormal1;
 | 
			
		||||
                                newViewerFace2.n2 = lastCutNormal1;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            else // periphery faces
 | 
			
		||||
                            {
 | 
			
		||||
                                if ((sides < 5 && whichVert < newLayer.numOuterVerts) || (hollowSides < 5 && whichVert >= newLayer.numOuterVerts))
 | 
			
		||||
                                {
 | 
			
		||||
                                    newViewerFace1.CalcSurfaceNormal();
 | 
			
		||||
                                    newViewerFace2.CalcSurfaceNormal();
 | 
			
		||||
                                }
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    newViewerFace1.n1 = this.normals[i];
 | 
			
		||||
                                    newViewerFace1.n2 = this.normals[i - numVerts];
 | 
			
		||||
                                    newViewerFace1.n3 = this.normals[i - numVerts + 1];
 | 
			
		||||
 | 
			
		||||
                                    newViewerFace2.n1 = this.normals[i];
 | 
			
		||||
                                    newViewerFace2.n2 = this.normals[i - numVerts + 1];
 | 
			
		||||
                                    newViewerFace2.n3 = this.normals[i + 1];
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace1);
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace2);
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (hasProfileCut)
 | 
			
		||||
                    {
 | 
			
		||||
                    if (this.hasProfileCut)
 | 
			
		||||
                    { // add the end cut face to the list of viewerFaces here
 | 
			
		||||
                        // the first cut face was filled in the above loop
 | 
			
		||||
                        newFace.v1 = coordsLen - 1;
 | 
			
		||||
                        newFace.v2 = coordsLen - numVerts;
 | 
			
		||||
                        newFace.v3 = coordsLen;
 | 
			
		||||
                        if (this.calcVertexNormals)
 | 
			
		||||
                        {
 | 
			
		||||
                            Coord n1 = SurfaceNormal(newFace);
 | 
			
		||||
                            this.normals.Add(n1);
 | 
			
		||||
 | 
			
		||||
                            newFace.n1 = newFace.n2 = newFace.n3 = this.normals.Count - 1;
 | 
			
		||||
                        }
 | 
			
		||||
                        this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                        newFace.v1 = coordsLen + numVerts - 1;
 | 
			
		||||
                        newFace.v2 = coordsLen - 1;
 | 
			
		||||
                        newFace.v3 = coordsLen;
 | 
			
		||||
                        if (this.calcVertexNormals)
 | 
			
		||||
                        {
 | 
			
		||||
                            Coord n1 = SurfaceNormal(newFace);
 | 
			
		||||
                            this.normals.Add(n1);
 | 
			
		||||
 | 
			
		||||
                            newFace.n1 = newFace.n2 = newFace.n3 = this.normals.Count - 1;
 | 
			
		||||
                        }
 | 
			
		||||
                        this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                        if (this.viewerMode)
 | 
			
		||||
                        {
 | 
			
		||||
                            ViewerFace newViewerFace = new ViewerFace();
 | 
			
		||||
                            newViewerFace.v1 = this.coords[coordsLen - 1]; // last vert in prior layer
 | 
			
		||||
                            newViewerFace.v2 = this.coords[coordsLen - numVerts];  // first vert in prior layer
 | 
			
		||||
                            newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
 | 
			
		||||
                            newViewerFace.n3 = newLayer.cutNormal2;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
 | 
			
		||||
                            newViewerFace.v2 = this.coords[coordsLen - 1]; // last vert in prior layer
 | 
			
		||||
                            newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
 | 
			
		||||
                            newViewerFace.n2 = lastCutNormal2;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                lastCutNormal1 = newLayer.cutNormal1;
 | 
			
		||||
                lastCutNormal2 = newLayer.cutNormal2;
 | 
			
		||||
 | 
			
		||||
                // calc the step for the next iteration of the loop
 | 
			
		||||
 | 
			
		||||
                if (step < steps)
 | 
			
		||||
| 
						 | 
				
			
			@ -1153,10 +1364,27 @@ namespace PrimMesher
 | 
			
		|||
                        done = true;
 | 
			
		||||
                }
 | 
			
		||||
                else done = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //if (calcVertexNormals && sides < 5 && twistBegin == 0.0f && twistEnd == 0.0f)
 | 
			
		||||
            //    this.CalcNormals();
 | 
			
		||||
                if (done && viewerMode)
 | 
			
		||||
                {
 | 
			
		||||
                    // add the bottom faces to the viewerFaces list here
 | 
			
		||||
                    Coord faceNormal = newLayer.faceNormal;
 | 
			
		||||
                    ViewerFace newViewerFace = new ViewerFace();
 | 
			
		||||
                    newViewerFace.primFaceNumber = 0;
 | 
			
		||||
                    foreach (Face face in newLayer.faces)
 | 
			
		||||
                    {
 | 
			
		||||
                        newViewerFace.v1 = newLayer.coords[face.v1 - coordsLen];
 | 
			
		||||
                        newViewerFace.v2 = newLayer.coords[face.v2 - coordsLen];
 | 
			
		||||
                        newViewerFace.v3 = newLayer.coords[face.v3 - coordsLen];
 | 
			
		||||
 | 
			
		||||
                        newViewerFace.n1 = faceNormal;
 | 
			
		||||
                        newViewerFace.n2 = faceNormal;
 | 
			
		||||
                        newViewerFace.n3 = faceNormal;
 | 
			
		||||
 | 
			
		||||
                        this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ExtrudeCircular()
 | 
			
		||||
| 
						 | 
				
			
			@ -1164,6 +1392,12 @@ namespace PrimMesher
 | 
			
		|||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
 | 
			
		||||
            if (this.viewerMode)
 | 
			
		||||
            {
 | 
			
		||||
                this.viewerFaces = new List<ViewerFace>();
 | 
			
		||||
                this.calcVertexNormals = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.calcVertexNormals)
 | 
			
		||||
                this.normals = new List<Coord>();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1242,10 +1476,6 @@ namespace PrimMesher
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bool hasProfileCut = false;
 | 
			
		||||
            if (profileStart > 0.0f || profileEnd < 1.0f)
 | 
			
		||||
                hasProfileCut = true;
 | 
			
		||||
 | 
			
		||||
            bool needEndFaces = false;
 | 
			
		||||
            if (this.pathCutBegin != 0.0 || this.pathCutEnd != 1.0)
 | 
			
		||||
                needEndFaces = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -1327,7 +1557,7 @@ namespace PrimMesher
 | 
			
		|||
                if (this.calcVertexNormals)
 | 
			
		||||
                {
 | 
			
		||||
                    newLayer.AddValue2FaceNormalIndices(this.normals.Count);
 | 
			
		||||
                    this.normals.AddRange(newLayer.edgeNormals);
 | 
			
		||||
                    this.normals.AddRange(newLayer.vertexNormals);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (isEndLayer)
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,7 +1572,7 @@ namespace PrimMesher
 | 
			
		|||
                    int startVert = coordsLen + 1;
 | 
			
		||||
                    int endVert = this.coords.Count - 1;
 | 
			
		||||
 | 
			
		||||
                    if (sides < 5 || hasProfileCut || hollow > 0.0f)
 | 
			
		||||
                    if (sides < 5 || this.hasProfileCut || hollow > 0.0f)
 | 
			
		||||
                        startVert--;
 | 
			
		||||
 | 
			
		||||
                    for (int i = startVert; i < endVert; i++)
 | 
			
		||||
| 
						 | 
				
			
			@ -1356,9 +1586,33 @@ namespace PrimMesher
 | 
			
		|||
                        newFace.v2 = i - numVerts + 1;
 | 
			
		||||
                        newFace.v3 = i + 1;
 | 
			
		||||
                        this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                        if (this.viewerMode)
 | 
			
		||||
                        {
 | 
			
		||||
                            // add the side faces to the list of viewerFaces here
 | 
			
		||||
                            ViewerFace newViewerFace = new ViewerFace();
 | 
			
		||||
                            newViewerFace.v1 = this.coords[i];
 | 
			
		||||
                            newViewerFace.v2 = this.coords[i - numVerts];
 | 
			
		||||
                            newViewerFace.v3 = this.coords[i - numVerts + 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n1 = this.normals[i];
 | 
			
		||||
                            newViewerFace.n2 = this.normals[i - numVerts];
 | 
			
		||||
                            newViewerFace.n3 = this.normals[i - numVerts + 1];
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.v2 = this.coords[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace.v3 = this.coords[i + 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n2 = this.normals[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace.n3 = this.normals[i + 1];
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (hasProfileCut)
 | 
			
		||||
                    if (this.hasProfileCut)
 | 
			
		||||
                    {
 | 
			
		||||
                        newFace.v1 = coordsLen - 1;
 | 
			
		||||
                        newFace.v2 = coordsLen - numVerts;
 | 
			
		||||
| 
						 | 
				
			
			@ -1405,6 +1659,7 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
        public Coord SurfaceNormal(int faceIndex)
 | 
			
		||||
        {
 | 
			
		||||
            int numFaces = faces.Count;
 | 
			
		||||
            if (faceIndex < 0 || faceIndex >= faces.Count)
 | 
			
		||||
                throw new Exception("faceIndex out of range");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue