Refactor to add optional conical parameter to existing extrude polygon function

This commit is contained in:
Liv 2017-05-25 13:06:24 -07:00
parent d3e900e42f
commit ffbe39df0a

View file

@ -255,17 +255,25 @@ void setupSmoothShape(GeometryCache::ShapeData& shapeData, const geometry::Solid
}
template <uint32_t N>
void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer) {
void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer, bool conical=false) {
using namespace geometry;
Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);
VertexVector vertices;
IndexVector solidIndices, wireIndices;
// Top and bottom faces
// Top (if not conical) and bottom faces
std::vector<vec3> shape = polygon<N>();
for (const vec3& v : shape) {
vertices.push_back(vec3(v.x, 0.5f, v.z));
vertices.push_back(vec3(0, 1, 0));
if (conical) {
for (const vec3& v : shape) {
vertices.push_back(vec3(0, 0.5f, 0));
vertices.push_back(vec3(0, 1, 0));
}
}
else {
for (const vec3& v : shape) {
vertices.push_back(vec3(v.x, 0.5f, v.z));
vertices.push_back(vec3(0, 1, 0));
}
}
for (const vec3& v : shape) {
vertices.push_back(vec3(v.x, -0.5f, v.z));
@ -293,8 +301,8 @@ void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& ver
vec3 left = shape[i];
vec3 right = shape[(i + 1) % N];
vec3 normal = glm::normalize(left + right);
vec3 topLeft = vec3(left.x, 0.5f, left.z);
vec3 topRight = vec3(right.x, 0.5f, right.z);
vec3 topLeft = (conical ? vec3(0.0, 0.5f, 0.0) : vec3(left.x, 0.5f, left.z));
vec3 topRight = (conical? vec3(0.0, 0.5f, 0.0) : vec3(right.x, 0.5f, right.z));
vec3 bottomLeft = vec3(left.x, -0.5f, left.z);
vec3 bottomRight = vec3(right.x, -0.5f, right.z);
@ -324,80 +332,6 @@ void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& ver
shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);
}
template <uint32_t N>
void extrudeConical(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer) {
using namespace geometry;
Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);
VertexVector vertices;
IndexVector solidIndices, wireIndices;
std::vector<vec3> base = polygon<N>();
for (const vec3& v : base) {
vertices.push_back(vec3(0, 0.5f, 0));
vertices.push_back(vec3(0, 1, 0));
}
for (const vec3& v : base) {
vertices.push_back(vec3(v.x, -0.5f, v.z));
vertices.push_back(vec3(0, -1, 0));
}
for (uint32_t i = 2; i < N; ++i) {
solidIndices.push_back(baseVertex + 0);
solidIndices.push_back(baseVertex + i);
solidIndices.push_back(baseVertex + i - 1);
solidIndices.push_back(baseVertex + N);
solidIndices.push_back(baseVertex + i + N - 1);
solidIndices.push_back(baseVertex + i + N);
}
for (uint32_t i = 1; i <= N; ++i) {
wireIndices.push_back(baseVertex + (i % N));
wireIndices.push_back(baseVertex + i - 1);
wireIndices.push_back(baseVertex + (i % N) + N);
wireIndices.push_back(baseVertex + (i - 1) + N);
}
// Now do the sides
baseVertex += 2 * N;
for (uint32_t i = 0; i < N; ++i) {
vec3 left = base[i];
vec3 right = base[(i + 1) % N];
vec3 normal = glm::normalize(left + right);
vec3 topLeft = vec3(0.0, 0.5f, 0.0);
vec3 topRight = vec3(0.0, 0.5f, 0.0);
vec3 bottomLeft = vec3(left.x, -0.5f, left.z);
vec3 bottomRight = vec3(right.x, -0.5f, right.z);
vertices.push_back(topLeft);
vertices.push_back(normal);
vertices.push_back(bottomLeft);
vertices.push_back(normal);
vertices.push_back(topRight);
vertices.push_back(normal);
vertices.push_back(bottomRight);
vertices.push_back(normal);
solidIndices.push_back(baseVertex + 0);
solidIndices.push_back(baseVertex + 2);
solidIndices.push_back(baseVertex + 1);
solidIndices.push_back(baseVertex + 1);
solidIndices.push_back(baseVertex + 2);
solidIndices.push_back(baseVertex + 3);
wireIndices.push_back(baseVertex + 0);
wireIndices.push_back(baseVertex + 1);
wireIndices.push_back(baseVertex + 3);
wireIndices.push_back(baseVertex + 2);
baseVertex += 4;
}
shapeData.setupVertices(vertexBuffer, vertices);
shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);
}
// FIXME solids need per-face vertices, but smooth shaded
// components do not. Find a way to support using draw elements
// or draw arrays as appropriate
@ -449,7 +383,7 @@ void GeometryCache::buildShapes() {
//Cylinder,
extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices);
//Cone,
extrudeConical<64>(_shapes[Cone], _shapeVertices, _shapeIndices);
extrudePolygon<64>(_shapes[Cone], _shapeVertices, _shapeIndices, true);
// Not implememented yet:
//Quad,