History

Refactor to add optional conical parameter to existing extrude polygon function

Liv committed 9 years ago

Commit ffbe39d1 parent d3e900e1 file · +16 −82Browse files

Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 1 file). Show all

Unified · Split

libraries/render-utils/src/GeometryCache.cpp+16−82
@@ -255,17 +255,25 @@ void setupSmoothShape(GeometryCache::ShapeData& shapeData, const geometry::Solid · 254 unmodified lines
255255 }
256256
257257 template <uint32_t N>
258−void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer) {
258+void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer, bool conical=false) {
259259 using namespace geometry;
260260 Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);
261261 VertexVector vertices;
262262 IndexVector solidIndices, wireIndices;
263263
264− // Top and bottom faces
264+ // Top (if not conical) and bottom faces
265265 std::vector<vec3> shape = polygon<N>();
266− for (const vec3& v : shape) {
267− vertices.push_back(vec3(v.x, 0.5f, v.z));
268− vertices.push_back(vec3(0, 1, 0));
266+ if (conical) {
267+ for (const vec3& v : shape) {
268+ vertices.push_back(vec3(0, 0.5f, 0));
269+ vertices.push_back(vec3(0, 1, 0));
270+ }
271+ }
272+ else {
273+ for (const vec3& v : shape) {
274+ vertices.push_back(vec3(v.x, 0.5f, v.z));
275+ vertices.push_back(vec3(0, 1, 0));
276+ }
269277 }
270278 for (const vec3& v : shape) {
271279 vertices.push_back(vec3(v.x, -0.5f, v.z));
@@ -293,8 +301,8 @@ void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& ver · 21 unmodified lines
293301 vec3 left = shape[i];
294302 vec3 right = shape[(i + 1) % N];
295303 vec3 normal = glm::normalize(left + right);
296− vec3 topLeft = vec3(left.x, 0.5f, left.z);
297− vec3 topRight = vec3(right.x, 0.5f, right.z);
304+ vec3 topLeft = (conical ? vec3(0.0, 0.5f, 0.0) : vec3(left.x, 0.5f, left.z));
305+ vec3 topRight = (conical? vec3(0.0, 0.5f, 0.0) : vec3(right.x, 0.5f, right.z));
298306 vec3 bottomLeft = vec3(left.x, -0.5f, left.z);
299307 vec3 bottomRight = vec3(right.x, -0.5f, right.z);
300308
@@ -324,80 +332,6 @@ void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& ver · 23 unmodified lines
324332 shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);
325333 }
326334
327−template <uint32_t N>
328−void extrudeConical(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer) {
329− using namespace geometry;
330− Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);
331− VertexVector vertices;
332− IndexVector solidIndices, wireIndices;
333−
334− std::vector<vec3> base = polygon<N>();
335−
336− for (const vec3& v : base) {
337− vertices.push_back(vec3(0, 0.5f, 0));
338− vertices.push_back(vec3(0, 1, 0));
339− }
340−
341− for (const vec3& v : base) {
342− vertices.push_back(vec3(v.x, -0.5f, v.z));
343− vertices.push_back(vec3(0, -1, 0));
344− }
345−
346−
347− for (uint32_t i = 2; i < N; ++i) {
348− solidIndices.push_back(baseVertex + 0);
349− solidIndices.push_back(baseVertex + i);
350− solidIndices.push_back(baseVertex + i - 1);
351− solidIndices.push_back(baseVertex + N);
352− solidIndices.push_back(baseVertex + i + N - 1);
353− solidIndices.push_back(baseVertex + i + N);
354− }
355− for (uint32_t i = 1; i <= N; ++i) {
356− wireIndices.push_back(baseVertex + (i % N));
357− wireIndices.push_back(baseVertex + i - 1);
358− wireIndices.push_back(baseVertex + (i % N) + N);
359− wireIndices.push_back(baseVertex + (i - 1) + N);
360− }
361−
362− // Now do the sides
363− baseVertex += 2 * N;
364−
365− for (uint32_t i = 0; i < N; ++i) {
366− vec3 left = base[i];
367− vec3 right = base[(i + 1) % N];
368− vec3 normal = glm::normalize(left + right);
369− vec3 topLeft = vec3(0.0, 0.5f, 0.0);
370− vec3 topRight = vec3(0.0, 0.5f, 0.0);
371− vec3 bottomLeft = vec3(left.x, -0.5f, left.z);
372− vec3 bottomRight = vec3(right.x, -0.5f, right.z);
373−
374− vertices.push_back(topLeft);
375− vertices.push_back(normal);
376− vertices.push_back(bottomLeft);
377− vertices.push_back(normal);
378− vertices.push_back(topRight);
379− vertices.push_back(normal);
380− vertices.push_back(bottomRight);
381− vertices.push_back(normal);
382−
383− solidIndices.push_back(baseVertex + 0);
384− solidIndices.push_back(baseVertex + 2);
385− solidIndices.push_back(baseVertex + 1);
386− solidIndices.push_back(baseVertex + 1);
387− solidIndices.push_back(baseVertex + 2);
388− solidIndices.push_back(baseVertex + 3);
389− wireIndices.push_back(baseVertex + 0);
390− wireIndices.push_back(baseVertex + 1);
391− wireIndices.push_back(baseVertex + 3);
392− wireIndices.push_back(baseVertex + 2);
393− baseVertex += 4;
394− }
395−
396− shapeData.setupVertices(vertexBuffer, vertices);
397− shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);
398−
399−}
400−
401335 // FIXME solids need per-face vertices, but smooth shaded
402336 // components do not. Find a way to support using draw elements
403337 // or draw arrays as appropriate
@@ -449,7 +383,7 @@ void GeometryCache::buildShapes() { · 45 unmodified lines
449383 //Cylinder,
450384 extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices);
451385 //Cone,
452− extrudeConical<64>(_shapes[Cone], _shapeVertices, _shapeIndices);
386+ extrudePolygon<64>(_shapes[Cone], _shapeVertices, _shapeIndices, true);
453387
454388 // Not implememented yet:
455389 //Quad,