private void ExtrudeWithCorners3(int indiceIndexTriangle, int[] cornersLevel, float ratio, bool fillGaps = true) { int i0 = m_triangles[indiceIndexTriangle + 0]; int i1 = m_triangles[indiceIndexTriangle + 1]; int i2 = m_triangles[indiceIndexTriangle + 2]; Vector3 v0 = m_vertices[i0]; Vector3 v1 = m_vertices[i1]; Vector3 v2 = m_vertices[i2]; Vector3 v01 = v0 + ratio * (v1 - v0); Vector3 v10 = v1 + ratio * (v0 - v1); Vector3 v12 = v1 + ratio * (v2 - v1); Vector3 v21 = v2 + ratio * (v1 - v2); Vector3 v20 = v2 + ratio * (v0 - v2); Vector3 v02 = v0 + ratio * (v2 - v0); Vector3 a = v01 + (v02 - v0); Vector3 b = v12 + (v10 - v1); Vector3 c = v20 + (v21 - v2); Vector3[] viNormed = new[] { v0.normalized, v1.normalized, v2.normalized }; Vector3[] v0Bis = new[] { (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[0], (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[0], (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[0] }; Vector3[] v1Bis = new[] { (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[1], (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[1], (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[1] }; Vector3[] v2Bis = new[] { (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[2], (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[2], (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[2] }; Vector3 v01Bis = v0Bis[0] + ratio * (v1Bis[0] - v0Bis[0]); Vector3 v02Bis = v0Bis[0] + ratio * (v2Bis[0] - v0Bis[0]); Vector3 v10Bis = v1Bis[1] + ratio * (v0Bis[1] - v1Bis[1]); Vector3 v12Bis = v1Bis[1] + ratio * (v2Bis[1] - v1Bis[1]); Vector3 v21Bis = v2Bis[2] + ratio * (v1Bis[2] - v2Bis[2]); Vector3 v20Bis = v2Bis[2] + ratio * (v0Bis[2] - v2Bis[2]); int indexFirstVertice = m_vertices.Count; m_vertices.Add(v01); m_vertices.Add(v10); m_vertices.Add(v12); m_vertices.Add(v21); m_vertices.Add(v20); m_vertices.Add(v02); m_vertices.Add(a); m_vertices.Add(b); m_vertices.Add(c); m_vertices.Add(v01Bis); m_vertices.Add(v10Bis); m_vertices.Add(v12Bis); m_vertices.Add(v21Bis); m_vertices.Add(v20Bis); m_vertices.Add(v02Bis); for (int i = 0; i < 3; ++i) { if (SegmentTypeSelector.LoopLeftBelowLevel(this, (i) % 3, cornersLevel[i])) { m_vertices.Add((1f + cornersLevel[i] * icoPlanet.heightDelta) * viNormed[i]); } else { m_vertices.Add((1f + (cornersLevel[i] - 1) * icoPlanet.heightDelta) * viNormed[i]); } } int i01 = indexFirstVertice + 0; int i10 = indexFirstVertice + 1; int i12 = indexFirstVertice + 2; int i21 = indexFirstVertice + 3; int i20 = indexFirstVertice + 4; int i02 = indexFirstVertice + 5; int ia = indexFirstVertice + 6; int ib = indexFirstVertice + 7; int ic = indexFirstVertice + 8; int i01Bis = indexFirstVertice + 9; int i10Bis = indexFirstVertice + 10; int i12Bis = indexFirstVertice + 11; int i21Bis = indexFirstVertice + 12; int i20Bis = indexFirstVertice + 13; int i02Bis = indexFirstVertice + 14; int i0Bis = indexFirstVertice + 15; int i1Bis = indexFirstVertice + 16; int i2Bis = indexFirstVertice + 17; int min = Mathf.Min(cornersLevel); SetElevationTriangle(indiceIndexTriangle, min - 1); m_triangles[indiceIndexTriangle + 0] = ia; m_triangles[indiceIndexTriangle + 1] = ib; m_triangles[indiceIndexTriangle + 2] = ic; //top side AddTriangle(i01, i10, ia); AddTriangle(ia, i10, ib); //top side AddTriangle(i12, i21, ib); AddTriangle(ib, i21, ic); //top side AddTriangle(i20, i02, ic); AddTriangle(ic, i02, ia); //Corner AddTriangle(i20Bis, i20, i21); AddTriangle(i20Bis, i21, i21Bis); AddTriangle(i2Bis, i20Bis, i21Bis);// AddTriangle(i20, ic, i21); //Corner AddTriangle(i01Bis, i01, i02); AddTriangle(i01Bis, i02, i02Bis); AddTriangle(i0Bis, i01Bis, i02Bis);// AddTriangle(i01, ia, i02); //Corner AddTriangle(i12Bis, i12, i10); AddTriangle(i12Bis, i10, i10Bis); AddTriangle(i1Bis, i12Bis, i10Bis);// AddTriangle(i12, ib, i10); // mid side AddTriangle(i02, i20, i20Bis); AddTriangle(i02, i20Bis, i02Bis); // mid side AddTriangle(i10, i01, i01Bis); AddTriangle(i10, i01Bis, i10Bis); // mid side AddTriangle(i21, i12, i12Bis); AddTriangle(i21, i12Bis, i21Bis); if (fillGaps) { AddTriangle(i0, i0Bis, i02Bis); AddTriangle(i0, i02Bis, i20Bis); AddTriangle(i0, i20Bis, i2); AddTriangle(i2, i20Bis, i2Bis); AddTriangle(i1, i1Bis, i10Bis); AddTriangle(i1, i10Bis, i01Bis); AddTriangle(i1, i01Bis, i0); AddTriangle(i0, i01Bis, i0Bis); AddTriangle(i2, i2Bis, i21Bis); AddTriangle(i2, i21Bis, i12Bis); AddTriangle(i2, i12Bis, i1); AddTriangle(i1, i12Bis, i1Bis); } }
private void ExtrudeWithCorner1(int indiceIndexTriangle, int cornerIndex, float ratio, int cornerLevelUp, int cornerLevelDown, bool fillGaps = true) { int i0 = m_triangles[indiceIndexTriangle + (cornerIndex + 0) % 3]; int i1 = m_triangles[indiceIndexTriangle + (cornerIndex + 1) % 3]; int i2 = m_triangles[indiceIndexTriangle + (cornerIndex + 2) % 3]; Vector3 v0 = m_vertices[i0]; Vector3 v1 = m_vertices[i1]; Vector3 v2 = m_vertices[i2]; Vector3 v01 = v0 + ratio * (v1 - v0); Vector3 v02 = v0 + ratio * (v2 - v0); Vector3 v12 = v1 + ratio * (v2 - v1); Vector3 v21 = v2 + ratio * (v1 - v2); Vector3 a = v01 + (v02 - v0); Vector3[] viNormed = new[] { v0.normalized, v1.normalized, v2.normalized }; Vector3[] v0Bis = new[] { (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[0], (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[0], }; Vector3[] v1Bis = new[] { (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[1], (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[1], }; Vector3[] v2Bis = new[] { (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[2], (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[2], }; v01 = v0Bis[0] + ratio * (v1Bis[0] - v0Bis[0]); v02 = v0Bis[0] + ratio * (v2Bis[0] - v0Bis[0]); Vector3 v01Bis = v0Bis[1] + ratio * (v1Bis[1] - v0Bis[1]); Vector3 v02Bis = v0Bis[1] + ratio * (v2Bis[1] - v0Bis[1]); if (SegmentTypeSelector.LoopLeftBelowLevel(this, cornerIndex, cornerLevelDown)) { m_vertices[i0] = (1f + (cornerLevelDown) * icoPlanet.heightDelta) * viNormed[0]; } else { m_vertices[i0] = (1f + (cornerLevelDown - 1) * icoPlanet.heightDelta) * viNormed[0]; } m_vertices[i1] = v1Bis[1]; m_vertices[i2] = v2Bis[1]; int indexFirstVertice = m_vertices.Count; m_vertices.Add(v01); m_vertices.Add(v02); m_vertices.Add(v12); m_vertices.Add(v21); m_vertices.Add(a); m_vertices.Add(v01Bis); m_vertices.Add(v02Bis); m_vertices.Add(v0Bis[0]); m_vertices.Add(v1Bis[0]); m_vertices.Add(v2Bis[0]); int i01 = indexFirstVertice + 0; int i02 = indexFirstVertice + 1; int i12 = indexFirstVertice + 2; int i21 = indexFirstVertice + 3; int ia = indexFirstVertice + 4; int i01Bis = indexFirstVertice + 5; int i02Bis = indexFirstVertice + 6; //int i0Bis = indexFirstVertice + 7; problem ? int i1Bis = indexFirstVertice + 8; int i2Bis = indexFirstVertice + 9; m_triangles[indiceIndexTriangle + 0] = ia; m_triangles[indiceIndexTriangle + 1] = i12; m_triangles[indiceIndexTriangle + 2] = i21; //Top edges AddTriangle(i01, i1Bis, ia); AddTriangle(i1Bis, i12, ia); //Top edges AddTriangle(i02, ia, i21); AddTriangle(i21, i2Bis, i02); // corner triangles AddTriangle(i01, ia, i02); AddTriangle(i01Bis, i02Bis, i0); // Vertical sides AddTriangle(i0, i1, i01Bis); AddTriangle(i0, i02Bis, i2); if (fillGaps) { // front square AddTriangle(i01Bis, i01, i02); AddTriangle(i01Bis, i02, i02Bis); // Vertical sides AddTriangle(i1, i1Bis, i01); AddTriangle(i1, i01, i01Bis); AddTriangle(i2Bis, i2, i02); AddTriangle(i02, i2, i02Bis); } }
public void UpdateSegment(bool canUpdateNeighbours = false) { if (m_lastUpdateTime != Time.time) { m_lastUpdateTime = Time.time; heightLevel = Mathf.Clamp(heightLevel, 0, icoPlanet.nbLevels); GenerateBaseGeometry(ref m_vertices, ref m_triangles); SegmentType type; int orientation; SegmentTypeSelector.FindSegmentType(this, out type, out orientation); switch (type) { case SegmentType.corner1: MakeCorner(orientation); break; case SegmentType.corner2: MakeCorner2(orientation); break; case SegmentType.corner3: MakeCorner3(); break; case SegmentType.side1: MakeSide(orientation); break; case SegmentType.side2: MakeSide2(orientation); break; case SegmentType.side3: MakeSide3(); break; case SegmentType.sidecorner: MakeCornerSide(orientation); break; case SegmentType.side3corner3: MakeSide3Corner3(); break; case SegmentType.side2Corner: MakeSide2Corner(orientation); break; case SegmentType.side3corner2: MakeSide3Corner2(orientation); break; case SegmentType.full: break; default: print("error"); break; } BakeMesh(); SetCollider(m_vertices, m_triangles); } }