public override Geometry Execute(Geometry geometry) { int vertexOffset = geometry.vertices.Count; for (int i = 0; i < CTesselation; ++i) { int pointsCount = i == 0 ? 1 : RTesselation; //generate circle for (int j = 0; j < pointsCount; ++j) { float angle = 360.0f / RTesselation * j; float rCircle = Radius / (CTesselation - 1) * i; float x = Mathf.Sin(angle * Mathf.Deg2Rad) * rCircle; float z = Mathf.Cos(angle * Mathf.Deg2Rad) * rCircle; float y = (SphereUtils.SphereCenterOffset(CapRadius, rCircle) - SphereUtils.SphereCenterOffset(CapRadius, Radius)) * Mathf.Sign(CapRadius); geometry.vertices.Add(new Vector3(x, y, z)); geometry.normals.Add(Vector3.up); } } //indices for (int i = 0; i < CTesselation - 1; ++i) { if (i == 0) { for (int j = 0; j < RTesselation; ++j) { geometry.indices.Add(0 + vertexOffset); geometry.indices.Add(j + 1 + vertexOffset); geometry.indices.Add((j + 1) % RTesselation + 1 + vertexOffset); } vertexOffset += 1; } else { for (int j = 0; j < RTesselation; ++j) { int a0 = RTesselation * (i - 1) + j; int a1 = RTesselation * (i - 1) + (j + 1) % RTesselation; int b0 = RTesselation * (i - 0) + j; int b1 = RTesselation * (i - 0) + (j + 1) % RTesselation; geometry.indices.Add(a0 + vertexOffset); geometry.indices.Add(b0 + vertexOffset); geometry.indices.Add(a1 + vertexOffset); geometry.indices.Add(b0 + vertexOffset); geometry.indices.Add(b1 + vertexOffset); geometry.indices.Add(a1 + vertexOffset); } } } return(geometry); }