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
255}255}
256 256
257template <uint32_t N>257template <uint32_t N>
258void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer) {258void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& vertexBuffer, gpu::BufferPointer& indexBuffer, bool conical=false) {
259 using namespace geometry;259 using namespace geometry;
260 Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);260 Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE);
261 VertexVector vertices;261 VertexVector vertices;
262 IndexVector solidIndices, wireIndices;262 IndexVector solidIndices, wireIndices;
263 263
264 // Top and bottom faces264 // Top (if not conical) and bottom faces
265 std::vector<vec3> shape = polygon<N>();265 std::vector<vec3> shape = polygon<N>();
266 for (const vec3& v : shape) {266 if (conical) {
267 vertices.push_back(vec3(v.x, 0.5f, v.z));267 for (const vec3& v : shape) {
268 vertices.push_back(vec3(0, 1, 0));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 }
269 }277 }
270 for (const vec3& v : shape) {278 for (const vec3& v : shape) {
271 vertices.push_back(vec3(v.x, -0.5f, v.z));279 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
293 vec3 left = shape[i];301 vec3 left = shape[i];
294 vec3 right = shape[(i + 1) % N];302 vec3 right = shape[(i + 1) % N];
295 vec3 normal = glm::normalize(left + right);303 vec3 normal = glm::normalize(left + right);
296 vec3 topLeft = vec3(left.x, 0.5f, left.z);304 vec3 topLeft = (conical ? vec3(0.0, 0.5f, 0.0) : vec3(left.x, 0.5f, left.z));
297 vec3 topRight = vec3(right.x, 0.5f, right.z);305 vec3 topRight = (conical? vec3(0.0, 0.5f, 0.0) : vec3(right.x, 0.5f, right.z));
298 vec3 bottomLeft = vec3(left.x, -0.5f, left.z);306 vec3 bottomLeft = vec3(left.x, -0.5f, left.z);
299 vec3 bottomRight = vec3(right.x, -0.5f, right.z);307 vec3 bottomRight = vec3(right.x, -0.5f, right.z);
300 308
@@ -324,80 +332,6 @@ void extrudePolygon(GeometryCache::ShapeData& shapeData, gpu::BufferPointer& ver · 23 unmodified lines
324 shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);332 shapeData.setupIndices(indexBuffer, solidIndices, wireIndices);
325}333}
326 334
327template <uint32_t N>
328void 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
401// FIXME solids need per-face vertices, but smooth shaded335// FIXME solids need per-face vertices, but smooth shaded
402// components do not. Find a way to support using draw elements336// components do not. Find a way to support using draw elements
403// or draw arrays as appropriate337// or draw arrays as appropriate
@@ -449,7 +383,7 @@ void GeometryCache::buildShapes() { · 45 unmodified lines
449 //Cylinder,383 //Cylinder,
450 extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices);384 extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices);
451 //Cone,385 //Cone,
452 extrudeConical<64>(_shapes[Cone], _shapeVertices, _shapeIndices);386 extrudePolygon<64>(_shapes[Cone], _shapeVertices, _shapeIndices, true);
453 387
454 // Not implememented yet:388 // Not implememented yet:
455 //Quad,389 //Quad,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t