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 | 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 | 259 | using namespace geometry; |
| 260 | 260 | Index baseVertex = (Index)(vertexBuffer->getSize() / SHAPE_VERTEX_STRIDE); |
| 261 | 261 | VertexVector vertices; |
| 262 | 262 | IndexVector solidIndices, wireIndices; |
| 263 | 263 | |
| 264 | − // Top and bottom faces | |
| 264 | + // Top (if not conical) and bottom faces | |
| 265 | 265 | 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 | + } | |
| 269 | 277 | } |
| 270 | 278 | for (const vec3& v : shape) { |
| 271 | 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 | 301 | vec3 left = shape[i]; |
| 294 | 302 | vec3 right = shape[(i + 1) % N]; |
| 295 | 303 | 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)); | |
| 298 | 306 | vec3 bottomLeft = vec3(left.x, -0.5f, left.z); |
| 299 | 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 | 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 | 335 | // FIXME solids need per-face vertices, but smooth shaded |
| 402 | 336 | // components do not. Find a way to support using draw elements |
| 403 | 337 | // or draw arrays as appropriate |
| @@ -449,7 +383,7 @@ void GeometryCache::buildShapes() { · 45 unmodified lines | ||
| 449 | 383 | //Cylinder, |
| 450 | 384 | extrudePolygon<64>(_shapes[Cylinder], _shapeVertices, _shapeIndices); |
| 451 | 385 | //Cone, |
| 452 | − extrudeConical<64>(_shapes[Cone], _shapeVertices, _shapeIndices); | |
| 386 | + extrudePolygon<64>(_shapes[Cone], _shapeVertices, _shapeIndices, true); | |
| 453 | 387 | |
| 454 | 388 | // Not implememented yet: |
| 455 | 389 | //Quad, |