From ffbe39df0a36b9c1032f76c0b3fb435a6294f4cd Mon Sep 17 00:00:00 2001 From: Liv Date: Thu, 25 May 2017 13:06:24 -0700 Subject: [PATCH] Refactor to add optional conical parameter to existing extrude polygon function --- libraries/render-utils/src/GeometryCache.cpp | 98 ++++---------------- 1 file changed, 16 insertions(+), 82 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 58bae05ad4..11b330a9cf 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -255,17 +255,25 @@ void setupSmoothShape(GeometryCache::ShapeData& shapeData, const geometry::Solid } template -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 shape = polygon(); - 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 -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 base = polygon(); - - 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,