|
|
@@ -349,33 +349,71 @@ void EasyMesh::AppendCylinder(int nsides, float h, float r1, float r2, |
|
|
|
|
|
|
|
void EasyMesh::AppendSphere(int ndivisions, vec3 const &size) |
|
|
|
{ |
|
|
|
ndivisions *= 2; |
|
|
|
|
|
|
|
int ibase = m_indices.Count(); |
|
|
|
int vbase = m_vert.Count(); |
|
|
|
|
|
|
|
vec3 d = size * 0.5f; |
|
|
|
float const pi = acos(-1.0f); |
|
|
|
Array<vec3> vertices; |
|
|
|
|
|
|
|
Array<vec2> table; |
|
|
|
for (int i = 0; i <= ndivisions; i++) |
|
|
|
table.Push(vec2(sin(pi * 2 / ndivisions * i) + 1e-5f, |
|
|
|
cos(pi * 2 / ndivisions * i) + 1e-5f)); |
|
|
|
float phi = 0.5f + 0.5f * sqrt(5.f); |
|
|
|
for (int i = 0; i < 4; i++) |
|
|
|
{ |
|
|
|
float x = (i & 1) ? 0.5f : -0.5f; |
|
|
|
float y = (i & 2) ? phi * 0.5f : phi * -0.5f; |
|
|
|
vertices << vec3(x, y, 0.f); |
|
|
|
vertices << vec3(0.f, x, y); |
|
|
|
vertices << vec3(y, 0.f, x); |
|
|
|
} |
|
|
|
|
|
|
|
for (int j = 0; j <= ndivisions / 2; j++) |
|
|
|
for (int i = 0; i < ndivisions; i++) |
|
|
|
{ |
|
|
|
int j2 = j + 1; |
|
|
|
int i2 = (i + 1) % ndivisions; |
|
|
|
static int const trilist[] = |
|
|
|
{ |
|
|
|
0, 1, 2, 2, 4, 6, 3, 8, 1, 9, 4, 8, |
|
|
|
7, 0, 5, 7, 11, 3, 10, 5, 6, 10, 9, 11, |
|
|
|
|
|
|
|
AddVertex(d * vec3(table[i], 1.0f) * table[j].xxy); |
|
|
|
AddVertex(d * vec3(table[i2], 1.0f) * table[j].xxy); |
|
|
|
AddVertex(d * vec3(table[i2], 1.0f) * table[j2].xxy); |
|
|
|
AddVertex(d * vec3(table[i], 1.0f) * table[j2].xxy); |
|
|
|
} |
|
|
|
0, 3, 1, 7, 3, 0, 1, 4, 2, 8, 4, 1, |
|
|
|
2, 5, 0, 6, 5, 2, 6, 9, 10, 4, 9, 6, |
|
|
|
7, 10, 11, 5, 10, 7, 8, 11, 9, 3, 11, 8 |
|
|
|
}; |
|
|
|
|
|
|
|
for (int i = vbase; i < m_vert.Count(); i += 4) |
|
|
|
AppendQuad(0, 1, 2, 3, i); |
|
|
|
for (unsigned i = 0; i < sizeof(trilist) / sizeof(*trilist); i += 3) |
|
|
|
{ |
|
|
|
vec3 const &p0 = vertices[trilist[i]]; |
|
|
|
vec3 const &p1 = vertices[trilist[i + 1]]; |
|
|
|
vec3 const &p2 = vertices[trilist[i + 2]]; |
|
|
|
|
|
|
|
vec3 const vx = 1.f / ndivisions * (p1 - p0); |
|
|
|
vec3 const vy = 1.f / ndivisions * (p2 - p0); |
|
|
|
|
|
|
|
int line = ndivisions + 1; |
|
|
|
|
|
|
|
for (int v = 0, x = 0, y = 0; x < ndivisions + 1; v++) |
|
|
|
{ |
|
|
|
vec3 p = p0 + x * vx + y * vy; |
|
|
|
|
|
|
|
/* Add zero, one or two triangles */ |
|
|
|
if (y < line - 1) |
|
|
|
{ |
|
|
|
AddVertex(normalize(p) * size); |
|
|
|
AddVertex(normalize(p + vx) * size); |
|
|
|
AddVertex(normalize(p + vy) * size); |
|
|
|
AppendTriangle(0, 2, 1, m_vert.Count() - 3); |
|
|
|
} |
|
|
|
|
|
|
|
if (y < line - 2) |
|
|
|
{ |
|
|
|
AddVertex(normalize(p + vx) * size); |
|
|
|
AddVertex(normalize(p + vx + vy) * size); |
|
|
|
AddVertex(normalize(p + vy) * size); |
|
|
|
AppendTriangle(0, 2, 1, m_vert.Count() - 3); |
|
|
|
} |
|
|
|
|
|
|
|
y++; |
|
|
|
if (y == line) |
|
|
|
{ |
|
|
|
x++; |
|
|
|
y = 0; |
|
|
|
line--; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ComputeNormals(ibase, m_indices.Count() - ibase); |
|
|
|
} |
|
|
|