Data class to represent a single complete vertex, including normal, UV and index data
Beispiel #1
0
 public Vertex addVertex(Vector3 vert, Vector3 norm, Vector2 uv)
 {
     Vertex vertex = new Vertex(vert, norm, uv, vertexNumber);
     vertexNumber++;
     vertices.Add(vertex);
     return vertex;
 }
Beispiel #2
0
 public void generateTriangleFan(List<Vertex> circ, Vertex cent, bool invertFaces)
 {
     int sides = circ.Count - 1;
     for (int i = 0; i < sides; i++)
     {
         generateTriangle(circ[i + 1], circ[i], cent, invertFaces);
     }
 }
Beispiel #3
0
 public void generateTriangle(Vertex a, Vertex b, Vertex c, bool invertFace)
 {
     if (invertFace)
     {
         addTriangle(c.index, b.index, a.index);
     }
     else
     {
         addTriangle(a.index, b.index, c.index);
     }
 }
Beispiel #4
0
        public Vertex addVertex(float x, float y, float z, float nx, float ny, float nz, float u, float v)
        {
            Vertex vert = new Vertex();
            vert.vertex = new Vector3(x, y, z);
            vert.normal = new Vector3(nx, ny, nz);
            vert.uv = new Vector2(u, v);
            vert.index = vertexCount;
            vertexCount++;

            verts.Add(vert.vertex);
            norms.Add(vert.normal);
            uvs.Add(vert.uv);
            vertices.Add(vert);
            return vert;
        }
        //generates a vertical strip for a sidewall of a cylinder, e.g. the flat vertical side wall of a fairing panel
        public void generateCylinderPanelSidewall(float centerX, float centerZ, float bottomY, float height, float topOuterRadius, float topInnerRadius, float bottomOuterRadius, float bottomInnerRadius, float angle, bool invertTris)
        {
            float x, z, nx, ny, nz;
            float xto, xti, xbo, xbi, zto, zti, zbo, zbi;

            Vertex[] verts = new Vertex[4];
            x = Mathf.Cos(angle * Mathf.Deg2Rad);
            z = Mathf.Sin(angle * Mathf.Deg2Rad);

            xto = x * topOuterRadius + centerX;
            xti = x * topInnerRadius + centerX;
            xbo = x * bottomOuterRadius + centerX;
            xbi = x * bottomInnerRadius + centerX;
            zto = z * topOuterRadius + centerZ;
            zti = z * topInnerRadius + centerZ;
            zbo = z * bottomOuterRadius + centerZ;
            zbi = z * bottomInnerRadius + centerZ;

            nx = Mathf.Cos((angle+90) * Mathf.Deg2Rad) * (invertTris ? -1 : 1);
            nz = Mathf.Sin((angle+90) * Mathf.Deg2Rad) * (invertTris ? -1 : 1);
            ny = 0;

            //outer verts
            verts[0] = addVertex (xbo, bottomY, zbo, nx, ny, nz, u2, v1);//outer bottom//v3
            verts[1] = addVertex (xto, bottomY+height,zto, nx, ny, nz, u1, v1);//outer top//v1
            //inner verts
            verts[2] = addVertex (xbi, bottomY, zbi, nx, ny, nz, u2, v2);//inner bottom//v4
            verts[3] = addVertex (xti, bottomY+height, zti, nx, ny, nz, u1, v2);//inner top//v2

            if(invertTris)
            {
                addTriangle (verts[1].index, verts[0].index, verts[2].index);
                addTriangle (verts[3].index, verts[1].index, verts[2].index);
            }
            else
            {
                addTriangle (verts[0].index, verts[1].index, verts[2].index);
                addTriangle (verts[1].index, verts[3].index, verts[2].index);
            }
        }
        //generates a triangle fan, with a single vertex in the center; uv is mapped as if the center vertex is the center of the uv area
        public void generateTriangleFan(float centerX, float centerZ, float y, float radius, int sides, float anglePerSide, float startAngle, bool top)
        {
            float x, z, nx, ny, nz, u, v, angle;

            float uSizeHalf, vSizeHalf;
            float uCenter, vCenter;
            uSizeHalf = (u2 - u1) * 0.5f;
            vSizeHalf = (v2 - v1) * 0.5f;
            uCenter = u1 + uSizeHalf;
            vCenter = v1 + vSizeHalf;

            Vertex center = addVertex(centerX, y, centerZ, 0, top? 1 : -1, 0, uCenter, vCenter);
            Vertex[] verts1 = new Vertex[sides+1];
            for (int i = 0; i < sides+1; i++)
            {
                angle = startAngle + (anglePerSide * (float)i);
                x = Mathf.Cos(angle * Mathf.Deg2Rad);
                z = Mathf.Sin(angle * Mathf.Deg2Rad);
                nx = 0;
                ny = top ? 1 : -1;
                nz = 0;
                u = uCenter + x * uSizeHalf;
                v = vCenter + z * vSizeHalf;
                verts1[i] = addVertex(x*radius+centerX, y, z*radius+centerZ, nx, ny, nz, u, v);
                if(i>0)
                {
                    if(top)
                    {
                        addTriangle(verts1[i-1].index, center.index, verts1[i].index);
                    }
                    else
                    {
                        addTriangle(center.index, verts1[i-1].index, verts1[i].index);
                    }
                }
            }
        }
        //generates a wall of a cylinder with all normals pointing directly away from the center position
        public void generateCylinderWallSection(float centerX, float centerZ, float startY, float height, float topRadius, float bottomRadius, int sides, float anglePerSide, float startAngle, bool outsideWall)
        {
            float x, y, y1, z, nx, ny, nz, u, angle;
            y = startY;
            y1 = startY + height;

            float uSize;
            uSize = u2 - u1;

            float radiusDiff = topRadius - bottomRadius;
            float sideAngle = Mathf.Atan2(height, radiusDiff) - 90*Mathf.Deg2Rad;
            float yCos = Mathf.Cos(sideAngle);
            float ySin = Mathf.Sin(sideAngle);

            Vertex[] verts1 = new Vertex[sides+1];
            Vertex[] verts2 = new Vertex[sides+1];
            //add outer cylinder wall
            for (int i = 0; i < sides+1; i++)
            {
                angle = startAngle + (anglePerSide * (float)i);
                x = Mathf.Cos(angle * Mathf.Deg2Rad);
                z = Mathf.Sin(angle * Mathf.Deg2Rad);
                nx = (outsideWall? x : -x) * yCos;
                ny = ySin;
                nz = (outsideWall? z : -z) * yCos;
                u = ((float)i / (float)(sides) * uSize) + u1;
                verts1[i] = addVertex(x*topRadius + centerX, y1, z*topRadius + centerZ, nx, ny, nz, u, v1);//upper ring vertex
                verts2[i] = addVertex(x*bottomRadius + centerX, y, z*bottomRadius + centerZ, nx, ny, nz, u, v2);//lower ring vertex
            }

            if(outsideWall)
            {
                for (int i = 0; i < sides; i++)
                {
                    addTriangle(verts1[i].index, verts1[i+1].index, verts2[i].index);
                    addTriangle(verts1[i+1].index, verts2[i+1].index, verts2[i].index);
                }
            }
            else
            {
                for (int i = 0; i < sides; i++)
                {
                    addTriangle(verts1[i+1].index, verts1[i].index, verts2[i].index);
                    addTriangle(verts2[i+1].index, verts1[i+1].index, verts2[i].index);
                }
            }
        }
        //generates a partial cylinder cap, e.g. for the top of a fairing panel
        public void generateCylinderPartialCap(float centerX, float centerZ, float height, float outerRadius, float innerRadius, int sides, float anglePerSide, float startAngle, bool top)
        {
            float x, z, nx, ny, nz, u, angle;
            float uSize;
            uSize = u2 - u1;

            Vertex[] verts1 = new Vertex[sides+1];
            Vertex[] verts2 = new Vertex[sides+1];
            for (int i = 0; i < sides+1; i++)
            {
                angle = startAngle + (anglePerSide * (float)i);
                x = Mathf.Cos(angle * Mathf.Deg2Rad);
                z = Mathf.Sin(angle * Mathf.Deg2Rad);
                nx = 0;
                ny = top ? 1 : -1;
                nz = 0;
                u = ((float)i / (float)(sides) * uSize) + u1;
                verts1[i] = addVertex(x*outerRadius+centerX, height, z*outerRadius+centerZ, nx, ny, nz, u, v1);//outer ring vertex
                verts2[i] = addVertex(x*innerRadius+centerX, height, z*innerRadius+centerZ, nx, ny, nz, u, v2);//inner ring vertex
            }

            if(top)
            {
                for (int i = 0; i < sides; i++)
                {
                    addTriangle(verts1[i+1].index, verts1[i].index, verts2[i].index);
                    addTriangle(verts2[i+1].index, verts1[i+1].index, verts2[i].index);
                }
            }
            else
            {
                for (int i = 0; i < sides; i++)
                {
                    addTriangle(verts1[i].index, verts1[i+1].index, verts2[i].index);
                    addTriangle(verts1[i+1].index, verts2[i+1].index, verts2[i].index);
                }
            }
        }