Skip to content

Commit

Permalink
Create better geometry for cones
Browse files Browse the repository at this point in the history
  • Loading branch information
kintel committed Mar 23, 2024
1 parent 9688356 commit 1a5129f
Showing 1 changed file with 21 additions and 12 deletions.
33 changes: 21 additions & 12 deletions src/core/primitives.cc
Expand Up @@ -277,32 +277,41 @@ std::unique_ptr<const Geometry> CylinderNode::createGeometry() const
z2 = this->h;
}

bool cone = (r2 == 0.0);
bool inverted_cone = (r1 == 0.0);

auto polyset = std::make_unique<PolySet>(3, /*convex*/true);
polyset->vertices.reserve(2 * num_fragments);
polyset->vertices.reserve((cone || inverted_cone) ? num_fragments + 1 : 2 * num_fragments);

generate_circle(std::back_inserter(polyset->vertices), r1, z1, num_fragments);
generate_circle(std::back_inserter(polyset->vertices), r2, z2, num_fragments);
if (inverted_cone) {
polyset->vertices.emplace_back(0.0, 0.0, z1);
} else {
generate_circle(std::back_inserter(polyset->vertices), r1, z1, num_fragments);
}
if (cone) {
polyset->vertices.emplace_back(0.0, 0.0, z2);
} else {
generate_circle(std::back_inserter(polyset->vertices), r2, z2, num_fragments);
}

for (int i = 0; i < num_fragments; ++i) {
int j = (i + 1) % num_fragments;
polyset->indices.push_back({
i,
j,
j+num_fragments,
i+num_fragments,
});
if (cone) polyset->indices.push_back({i, j, num_fragments});
else if (inverted_cone) polyset->indices.push_back({0, j+1, i+1});
else polyset->indices.push_back({i, j, j+num_fragments, i+num_fragments});
}

if (this->r1 > 0) {
if (!inverted_cone) {
polyset->indices.push_back({});
for (int i = 0; i < num_fragments; ++i) {
polyset->indices.back().push_back(num_fragments-i-1);
}
}
if (this->r2 > 0) {
if (!cone) {
polyset->indices.push_back({});
int offset = inverted_cone ? 1 : num_fragments;
for (int i = 0; i < num_fragments; ++i) {
polyset->indices.back().push_back(num_fragments+i);
polyset->indices.back().push_back(offset+i);
}
}

Expand Down

0 comments on commit 1a5129f

Please sign in to comment.