public Vertex addVertex(Vector3 vert, Vector3 norm, Vector2 uv) { Vertex vertex = new Vertex(vert, norm, uv, vertexNumber); vertexNumber++; vertices.Add(vertex); return vertex; }
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); } }
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); } }
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); } } }