mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 08:45:16 +02:00
Refactor to add optional conical parameter to existing extrude polygon function
This commit is contained in:
parent
d3e900e42f
commit
ffbe39df0a
1 changed files with 16 additions and 82 deletions
|
@ -255,17 +255,25 @@ void setupSmoothShape(GeometryCache::ShapeData& shapeData, const geometry::Solid
|
|||
}
|
||||
|
||||
template <uint32_t N>
|
||||
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<vec3> shape = polygon<N>();
|
||||
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 <uint32_t N>
|
||||
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<vec3> base = polygon<N>();
|
||||
|
||||
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,
|
||||
|
|
Loading…
Reference in a new issue