More work in vertex normals and texture UVs. Syncing code with pyov.
							parent
							
								
									5865a2b8f8
								
							
						
					
					
						commit
						931b04485d
					
				| 
						 | 
				
			
			@ -523,6 +523,9 @@ namespace PrimMesher
 | 
			
		|||
        internal List<Coord> coords;
 | 
			
		||||
        internal List<Face> faces;
 | 
			
		||||
        internal List<Coord> vertexNormals;
 | 
			
		||||
        internal List<float> us;
 | 
			
		||||
        internal List<UVCoord> faceUVs;
 | 
			
		||||
 | 
			
		||||
        internal Coord faceNormal = new Coord(0.0f, 0.0f, 1.0f);
 | 
			
		||||
        internal Coord cutNormal1 = new Coord();
 | 
			
		||||
        internal Coord cutNormal2 = new Coord();
 | 
			
		||||
| 
						 | 
				
			
			@ -537,6 +540,8 @@ namespace PrimMesher
 | 
			
		|||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
            this.vertexNormals = new List<Coord>();
 | 
			
		||||
            this.us = new List<float>();
 | 
			
		||||
            this.faceUVs = new List<UVCoord>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Profile(int sides, float profileStart, float profileEnd, float hollow, int hollowSides, bool createFaces, bool calcVertexNormals)
 | 
			
		||||
| 
						 | 
				
			
			@ -545,10 +550,13 @@ namespace PrimMesher
 | 
			
		|||
            this.coords = new List<Coord>();
 | 
			
		||||
            this.faces = new List<Face>();
 | 
			
		||||
            this.vertexNormals = new List<Coord>();
 | 
			
		||||
            this.us = new List<float>();
 | 
			
		||||
            this.faceUVs = new List<UVCoord>();
 | 
			
		||||
            Coord center = new Coord(0.0f, 0.0f, 0.0f);
 | 
			
		||||
 | 
			
		||||
            List<Coord> hollowCoords = new List<Coord>();
 | 
			
		||||
            List<Coord> hollowNormals = new List<Coord>();
 | 
			
		||||
            List<float> hollowUs = new List<float>();
 | 
			
		||||
 | 
			
		||||
            //Quat rot180 = new Quat(new Coord(0.0f, 0.0f, 1.0f), (float)Math.PI); ;
 | 
			
		||||
            bool hasHollow = (hollow > 0.0f);
 | 
			
		||||
| 
						 | 
				
			
			@ -627,6 +635,7 @@ namespace PrimMesher
 | 
			
		|||
                        //hollowNormal *= rot180;
 | 
			
		||||
                        //hollowNormals.Add(hollowNormal);
 | 
			
		||||
                        hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
 | 
			
		||||
                        hollowUs.Add(angle.angle);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -634,6 +643,8 @@ namespace PrimMesher
 | 
			
		|||
            int index = 0;
 | 
			
		||||
            int numAngles = angles.angles.Count;
 | 
			
		||||
 | 
			
		||||
            //float sideIncrement = 1.0f / (float)sides;
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < numAngles; i++)
 | 
			
		||||
            {
 | 
			
		||||
                angle = angles.angles[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -642,7 +653,18 @@ namespace PrimMesher
 | 
			
		|||
                newVert.Z = z;
 | 
			
		||||
                this.coords.Add(newVert);
 | 
			
		||||
                if (this.calcVertexNormals)
 | 
			
		||||
                {
 | 
			
		||||
                    this.vertexNormals.Add(new Coord(angle.X, angle.Y, 0.0f));
 | 
			
		||||
                    if (sides < 5)
 | 
			
		||||
                    {
 | 
			
		||||
                        float u = angle.angle;
 | 
			
		||||
                        //u %= sideIncrement;
 | 
			
		||||
                        //u *= sides;
 | 
			
		||||
                        this.us.Add(u);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        this.us.Add(angle.angle);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (hollow > 0.0f)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -658,6 +680,7 @@ namespace PrimMesher
 | 
			
		|||
                            //hollowNormal *= rot180;
 | 
			
		||||
                            //hollowNormals.Add(hollowNormal);
 | 
			
		||||
                            hollowNormals.Add(new Coord(-angle.X, -angle.Y, 0.0f));
 | 
			
		||||
                            hollowUs.Add(angle.angle);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -677,7 +700,10 @@ namespace PrimMesher
 | 
			
		|||
            {
 | 
			
		||||
                hollowCoords.Reverse();
 | 
			
		||||
                if (this.calcVertexNormals)
 | 
			
		||||
                {
 | 
			
		||||
                    hollowNormals.Reverse();
 | 
			
		||||
                    hollowUs.Reverse();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (createFaces)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -759,7 +785,11 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
                this.coords.AddRange(hollowCoords);
 | 
			
		||||
                if (this.calcVertexNormals)
 | 
			
		||||
                {
 | 
			
		||||
                    this.vertexNormals.AddRange(hollowNormals);
 | 
			
		||||
                    this.us.AddRange(hollowUs);
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (simpleFace && createFaces)
 | 
			
		||||
| 
						 | 
				
			
			@ -797,11 +827,21 @@ namespace PrimMesher
 | 
			
		|||
                this.cutNormal2.Normalize();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.MakeFaceUVs();
 | 
			
		||||
 | 
			
		||||
            hollowCoords = null;
 | 
			
		||||
            hollowNormals = null;
 | 
			
		||||
            hollowUs = null;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void MakeFaceUVs()
 | 
			
		||||
        {
 | 
			
		||||
            this.faceUVs = new List<UVCoord>();
 | 
			
		||||
            foreach (Coord c in this.coords)
 | 
			
		||||
                this.faceUVs.Add(new UVCoord(0.5f + c.X, 0.5f - c.Y));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Profile Clone()
 | 
			
		||||
        {
 | 
			
		||||
            return this.Clone(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -812,6 +852,8 @@ namespace PrimMesher
 | 
			
		|||
            Profile clone = new Profile();
 | 
			
		||||
 | 
			
		||||
            clone.coords.AddRange(this.coords);
 | 
			
		||||
            clone.faceUVs.AddRange(this.faceUVs);
 | 
			
		||||
 | 
			
		||||
            if (needFaces)
 | 
			
		||||
                clone.faces.AddRange(this.faces);
 | 
			
		||||
            if ((clone.calcVertexNormals = this.calcVertexNormals) == true)
 | 
			
		||||
| 
						 | 
				
			
			@ -820,6 +862,7 @@ namespace PrimMesher
 | 
			
		|||
                clone.faceNormal = this.faceNormal;
 | 
			
		||||
                clone.cutNormal1 = this.cutNormal1;
 | 
			
		||||
                clone.cutNormal2 = this.cutNormal2;
 | 
			
		||||
                clone.us.AddRange(this.us);
 | 
			
		||||
            }
 | 
			
		||||
            clone.numOuterVerts = this.numOuterVerts;
 | 
			
		||||
            clone.numHollowVerts = this.numHollowVerts;
 | 
			
		||||
| 
						 | 
				
			
			@ -933,6 +976,19 @@ namespace PrimMesher
 | 
			
		|||
            this.faceNormal.X = -this.faceNormal.X;
 | 
			
		||||
            this.faceNormal.Y = -this.faceNormal.Y;
 | 
			
		||||
            this.faceNormal.Z = -this.faceNormal.Z;
 | 
			
		||||
 | 
			
		||||
            int numUs = this.us.Count;
 | 
			
		||||
            //for (int i = 0; i < numUs; i++)
 | 
			
		||||
            //    this.us[i] 
 | 
			
		||||
 | 
			
		||||
            int numfaceUVs = this.faceUVs.Count;
 | 
			
		||||
            for (i = 0; i < numfaceUVs; i++)
 | 
			
		||||
            {
 | 
			
		||||
                UVCoord uv = this.faceUVs[i];
 | 
			
		||||
                uv.U = 1.0f - uv.U;
 | 
			
		||||
                //uv.V = 1.0f - uv.V;
 | 
			
		||||
                this.faceUVs[i] = uv;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void AddValue2FaceVertexIndices(int num)
 | 
			
		||||
| 
						 | 
				
			
			@ -1162,10 +1218,16 @@ namespace PrimMesher
 | 
			
		|||
            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));
 | 
			
		||||
                if (viewerMode)
 | 
			
		||||
                    profile.MakeFaceUVs();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            Coord lastCutNormal1 = new Coord();
 | 
			
		||||
            Coord lastCutNormal2 = new Coord();
 | 
			
		||||
            float lastV = 1.0f;
 | 
			
		||||
 | 
			
		||||
            bool done = false;
 | 
			
		||||
            while (!done)
 | 
			
		||||
| 
						 | 
				
			
			@ -1213,6 +1275,10 @@ namespace PrimMesher
 | 
			
		|||
                            newViewerFace.n2 = faceNormal;
 | 
			
		||||
                            newViewerFace.n3 = faceNormal;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv1 = newLayer.faceUVs[face.v1];
 | 
			
		||||
                            newViewerFace.uv2 = newLayer.faceUVs[face.v2];
 | 
			
		||||
                            newViewerFace.uv3 = newLayer.faceUVs[face.v3];
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1264,8 +1330,44 @@ namespace PrimMesher
 | 
			
		|||
                        if (this.viewerMode)
 | 
			
		||||
                        {
 | 
			
		||||
                            // add the side faces to the list of viewerFaces here
 | 
			
		||||
                            ViewerFace newViewerFace1 = new ViewerFace();
 | 
			
		||||
                            ViewerFace newViewerFace2 = new ViewerFace();
 | 
			
		||||
                            int primFaceNum = 1;
 | 
			
		||||
                            if (whichVert >= sides)
 | 
			
		||||
                                primFaceNum = 2;
 | 
			
		||||
                            ViewerFace newViewerFace1 = new ViewerFace(primFaceNum);
 | 
			
		||||
                            ViewerFace newViewerFace2 = new ViewerFace(primFaceNum);
 | 
			
		||||
                            float u1 = newLayer.us[whichVert];
 | 
			
		||||
                            float u2 = 1.0f;
 | 
			
		||||
                            if (whichVert < newLayer.us.Count - 1)
 | 
			
		||||
                                u2 = newLayer.us[whichVert + 1];
 | 
			
		||||
                            if (sides < 5 && whichVert < sides)
 | 
			
		||||
                            {
 | 
			
		||||
                                u1 *= sides;
 | 
			
		||||
                                u2 *= sides;
 | 
			
		||||
                                u1 -= whichVert;
 | 
			
		||||
                                u2 -= whichVert;
 | 
			
		||||
                                if (u2 < 0.1f)
 | 
			
		||||
                                    u2 = 1.0f;
 | 
			
		||||
                                //u1 = 0.0f;
 | 
			
		||||
                                //u2 = 1.0f;
 | 
			
		||||
 | 
			
		||||
                                newViewerFace2.primFaceNumber = newViewerFace1.primFaceNumber = whichVert + 1;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            newViewerFace1.uv1.U = u1;
 | 
			
		||||
                            newViewerFace1.uv2.U = u1;
 | 
			
		||||
                            newViewerFace1.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace1.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace1.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace1.uv3.V = lastV;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace2.uv1.U = u1;
 | 
			
		||||
                            newViewerFace2.uv2.U = u2;
 | 
			
		||||
                            newViewerFace2.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace2.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace2.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace2.uv3.V = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace1.v1 = this.coords[i];
 | 
			
		||||
                            newViewerFace1.v2 = this.coords[i - numVerts];
 | 
			
		||||
| 
						 | 
				
			
			@ -1330,9 +1432,18 @@ namespace PrimMesher
 | 
			
		|||
                            newViewerFace.v2 = this.coords[coordsLen - numVerts];  // first vert in prior layer
 | 
			
		||||
                            newViewerFace.v3 = this.coords[coordsLen]; // first vert in new layer
 | 
			
		||||
 | 
			
		||||
                            float u1 = newLayer.us[0];
 | 
			
		||||
                            float u2 = newLayer.us[newLayer.us.Count - 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
 | 
			
		||||
                            newViewerFace.n3 = newLayer.cutNormal2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
 | 
			
		||||
                            newViewerFace.uv2.U = u1;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace.uv3.V = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.v1 = this.coords[coordsLen + numVerts - 1]; // last vert in new layer
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,6 +1453,12 @@ namespace PrimMesher
 | 
			
		|||
                            newViewerFace.n3 = newViewerFace.n1 = newLayer.cutNormal2;
 | 
			
		||||
                            newViewerFace.n2 = lastCutNormal2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
 | 
			
		||||
                            newViewerFace.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace.uv2.V = lastV;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1350,6 +1467,7 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
                lastCutNormal1 = newLayer.cutNormal1;
 | 
			
		||||
                lastCutNormal2 = newLayer.cutNormal2;
 | 
			
		||||
                lastV = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                // calc the step for the next iteration of the loop
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1381,6 +1499,10 @@ namespace PrimMesher
 | 
			
		|||
                        newViewerFace.n2 = faceNormal;
 | 
			
		||||
                        newViewerFace.n3 = faceNormal;
 | 
			
		||||
 | 
			
		||||
                        newViewerFace.uv1 = newLayer.faceUVs[face.v1 - coordsLen];
 | 
			
		||||
                        newViewerFace.uv2 = newLayer.faceUVs[face.v2 - coordsLen];
 | 
			
		||||
                        newViewerFace.uv3 = newLayer.faceUVs[face.v3 - coordsLen];
 | 
			
		||||
 | 
			
		||||
                        this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -1489,7 +1611,15 @@ namespace PrimMesher
 | 
			
		|||
            Profile profile = new Profile(this.sides, this.profileStart, this.profileEnd, hollow, this.hollowSides, needEndFaces, calcVertexNormals);
 | 
			
		||||
 | 
			
		||||
            if (initialProfileRot != 0.0f)
 | 
			
		||||
            {
 | 
			
		||||
                profile.AddRot(new Quat(new Coord(0.0f, 0.0f, 1.0f), initialProfileRot));
 | 
			
		||||
                if (viewerMode)
 | 
			
		||||
                    profile.MakeFaceUVs();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Coord lastCutNormal1 = new Coord();
 | 
			
		||||
            Coord lastCutNormal2 = new Coord();
 | 
			
		||||
            float lastV = 1.0f;
 | 
			
		||||
 | 
			
		||||
            bool done = false;
 | 
			
		||||
            while (!done) // loop through the length of the path and add the layers
 | 
			
		||||
| 
						 | 
				
			
			@ -1498,7 +1628,8 @@ namespace PrimMesher
 | 
			
		|||
                if (angle == startAngle || angle >= endAngle)
 | 
			
		||||
                    isEndLayer = true;
 | 
			
		||||
 | 
			
		||||
                Profile newLayer = profile.Clone(isEndLayer && needEndFaces);
 | 
			
		||||
                //Profile newLayer = profile.Clone(isEndLayer && needEndFaces);
 | 
			
		||||
                Profile newLayer = profile.Clone();
 | 
			
		||||
 | 
			
		||||
                float xProfileScale = (1.0f - Math.Abs(this.skew)) * this.holeSizeX;
 | 
			
		||||
                float yProfileScale = this.holeSizeY;
 | 
			
		||||
| 
						 | 
				
			
			@ -1547,6 +1678,36 @@ namespace PrimMesher
 | 
			
		|||
                if (angle == startAngle)
 | 
			
		||||
                    newLayer.FlipNormals();
 | 
			
		||||
 | 
			
		||||
                if (angle == startAngle)
 | 
			
		||||
                {
 | 
			
		||||
                    newLayer.FlipNormals();
 | 
			
		||||
 | 
			
		||||
                    // add the top faces to the viewerFaces list here
 | 
			
		||||
                    if (this.viewerMode && needEndFaces)
 | 
			
		||||
                    {
 | 
			
		||||
                        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;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv1 = newLayer.faceUVs[face.v1];
 | 
			
		||||
                            newViewerFace.uv2 = newLayer.faceUVs[face.v2];
 | 
			
		||||
                            newViewerFace.uv3 = newLayer.faceUVs[face.v3];
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // append the layer and fill in the sides
 | 
			
		||||
 | 
			
		||||
                int coordsLen = this.coords.Count;
 | 
			
		||||
| 
						 | 
				
			
			@ -1578,6 +1739,8 @@ namespace PrimMesher
 | 
			
		|||
                    for (int i = startVert; i < endVert; i++)
 | 
			
		||||
                    //for (int i = coordsLen; i < this.coords.Count - 1; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        int whichVert = i - startVert;
 | 
			
		||||
 | 
			
		||||
                        newFace.v1 = i;
 | 
			
		||||
                        newFace.v2 = i - numVerts;
 | 
			
		||||
                        newFace.v3 = i - numVerts + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1587,33 +1750,115 @@ namespace PrimMesher
 | 
			
		|||
                        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 (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];
 | 
			
		||||
                            ViewerFace newViewerFace1 = new ViewerFace();
 | 
			
		||||
                            ViewerFace newViewerFace2 = new ViewerFace();
 | 
			
		||||
                            float u1 = newLayer.us[whichVert];
 | 
			
		||||
                            float u2 = 1.0f;
 | 
			
		||||
                            if (whichVert < newLayer.us.Count - 1)
 | 
			
		||||
                                u2 = newLayer.us[whichVert + 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n1 = this.normals[i];
 | 
			
		||||
                            newViewerFace.n2 = this.normals[i - numVerts];
 | 
			
		||||
                            newViewerFace.n3 = this.normals[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace1.uv1.U = u1;
 | 
			
		||||
                            newViewerFace1.uv2.U = u1;
 | 
			
		||||
                            newViewerFace1.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                            newViewerFace1.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace1.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace1.uv3.V = lastV;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.v2 = this.coords[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace.v3 = this.coords[i + 1];
 | 
			
		||||
                            newViewerFace2.uv1.U = u1;
 | 
			
		||||
                            newViewerFace2.uv2.U = u2;
 | 
			
		||||
                            newViewerFace2.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n2 = this.normals[i - numVerts + 1];
 | 
			
		||||
                            newViewerFace.n3 = this.normals[i + 1];
 | 
			
		||||
                            newViewerFace2.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace2.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace2.uv3.V = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                            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 (this.hasProfileCut)
 | 
			
		||||
                    //{
 | 
			
		||||
                    //    newFace.v1 = coordsLen - 1;
 | 
			
		||||
                    //    newFace.v2 = coordsLen - numVerts;
 | 
			
		||||
                    //    newFace.v3 = coordsLen;
 | 
			
		||||
                    //    this.faces.Add(newFace);
 | 
			
		||||
 | 
			
		||||
                    //    newFace.v1 = coordsLen + numVerts - 1;
 | 
			
		||||
                    //    newFace.v2 = coordsLen - 1;
 | 
			
		||||
                    //    newFace.v3 = coordsLen;
 | 
			
		||||
                    //    this.faces.Add(newFace);
 | 
			
		||||
                    //}
 | 
			
		||||
 | 
			
		||||
                    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;
 | 
			
		||||
| 
						 | 
				
			
			@ -1623,9 +1868,50 @@ namespace PrimMesher
 | 
			
		|||
                        newFace.v2 = coordsLen - 1;
 | 
			
		||||
                        newFace.v3 = coordsLen;
 | 
			
		||||
                        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
 | 
			
		||||
 | 
			
		||||
                            float u1 = newLayer.us[0];
 | 
			
		||||
                            float u2 = newLayer.us[newLayer.us.Count - 1];
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.n2 = newViewerFace.n1 = lastCutNormal2;
 | 
			
		||||
                            newViewerFace.n3 = newLayer.cutNormal2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv3.U = newViewerFace.uv1.U = u2;
 | 
			
		||||
                            newViewerFace.uv2.U = u1;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv1.V = newViewerFace.uv2.V = lastV;
 | 
			
		||||
                            newViewerFace.uv3.V = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                            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;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv2.U = newViewerFace.uv1.U = u1;
 | 
			
		||||
                            newViewerFace.uv3.U = u2;
 | 
			
		||||
 | 
			
		||||
                            newViewerFace.uv3.V = newViewerFace.uv1.V = 1.0f - percentOfPath;
 | 
			
		||||
                            newViewerFace.uv2.V = lastV;
 | 
			
		||||
 | 
			
		||||
                            this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                lastCutNormal1 = newLayer.cutNormal1;
 | 
			
		||||
                lastCutNormal2 = newLayer.cutNormal2;
 | 
			
		||||
                lastV = 1.0f - percentOfPath;
 | 
			
		||||
 | 
			
		||||
                // calculate terms for next iteration
 | 
			
		||||
                // calculate the angle for the next iteration of the loop
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1638,6 +1924,30 @@ namespace PrimMesher
 | 
			
		|||
                    if (angle > endAngle)
 | 
			
		||||
                        angle = endAngle;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (done && viewerMode && needEndFaces)
 | 
			
		||||
                {
 | 
			
		||||
                    // 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;
 | 
			
		||||
 | 
			
		||||
                        newViewerFace.uv1 = newLayer.faceUVs[face.v1 - coordsLen];
 | 
			
		||||
                        newViewerFace.uv2 = newLayer.faceUVs[face.v2 - coordsLen];
 | 
			
		||||
                        newViewerFace.uv3 = newLayer.faceUVs[face.v3 - coordsLen];
 | 
			
		||||
 | 
			
		||||
                        this.viewerFaces.Add(newViewerFace);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1659,7 +1969,7 @@ namespace PrimMesher
 | 
			
		|||
 | 
			
		||||
        public Coord SurfaceNormal(int faceIndex)
 | 
			
		||||
        {
 | 
			
		||||
            //int numFaces = faces.Count;
 | 
			
		||||
            int numFaces = faces.Count;
 | 
			
		||||
            if (faceIndex < 0 || faceIndex >= faces.Count)
 | 
			
		||||
                throw new Exception("faceIndex out of range");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue