Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 1 file). Show all
Unified · Split
| @@ -255,17 +255,25 @@ void setupSmoothShape(GeometryCache::ShapeData& shapeData, const geometry::Solid · 254 unmodified lines | |||
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | template <uint32_t N> | 257 | 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) { |
| 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 faces | 264 | // 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 | ||
| 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 | |||
| 401 | // FIXME solids need per-face vertices, but smooth shaded | 335 | // FIXME solids need per-face vertices, but smooth shaded |
| 402 | // components do not. Find a way to support using draw elements | 336 | // components do not. Find a way to support using draw elements |
| 403 | // or draw arrays as appropriate | 337 | // 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, |