summaryrefslogtreecommitdiff
path: root/src/primitives.cc
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2011-04-07 22:43:08 (GMT)
committerMarius Kintel <marius@kintel.net>2011-04-07 22:43:08 (GMT)
commitc9093c0ad5d9d625d8a57380949946d90e745800 (patch)
tree1b8932efd75527892739288fd68eaecb62aa30d0 /src/primitives.cc
parent7b3a8a990f09265929fb5d463fa042dbb298ba30 (diff)
parent9d94eaddc86ec262c0243571d8847c8d2f649fc4 (diff)
Merge remote branch 'gitorious/sphere-cylinder-optimisation' into sphere-cyl
Diffstat (limited to 'src/primitives.cc')
-rw-r--r--src/primitives.cc64
1 files changed, 37 insertions, 27 deletions
diff --git a/src/primitives.cc b/src/primitives.cc
index 5ba32fe..1e411e0 100644
--- a/src/primitives.cc
+++ b/src/primitives.cc
@@ -284,65 +284,67 @@ PolySet *PrimitiveNode::render_polyset(render_mode_e) const
};
struct ring_s {
- int fragments;
point2d *points;
- double r, z;
+ double z;
};
- int rings = get_fragments_from_r(r1, fn, fs, fa);
+ int fragments = get_fragments_from_r(r1, fn, fs, fa);
+ int rings = fragments/2;
+ if(rings<=0)
+ rings=1;
+
ring_s *ring = new ring_s[rings];
for (int i = 0; i < rings; i++) {
double phi = (M_PI * (i + 0.5)) / rings;
- ring[i].r = r1 * sin(phi);
+ double r = r1 * sin(phi);
ring[i].z = r1 * cos(phi);
- ring[i].fragments = get_fragments_from_r(ring[i].r, fn, fs, fa);
- ring[i].points = new point2d[ring[i].fragments];
- for (int j = 0; j < ring[i].fragments; j++) {
- phi = (M_PI*2*j) / ring[i].fragments;
- ring[i].points[j].x = ring[i].r * cos(phi);
- ring[i].points[j].y = ring[i].r * sin(phi);
+ ring[i].points = new point2d[fragments];
+ for (int j = 0; j < fragments; j++) {
+ phi = (M_PI*2*j) / fragments;
+ ring[i].points[j].x = r * cos(phi);
+ ring[i].points[j].y = r * sin(phi);
}
}
p->append_poly();
- for (int i = 0; i < ring[0].fragments; i++)
+ for (int i = 0; i < fragments; i++)
p->append_vertex(ring[0].points[i].x, ring[0].points[i].y, ring[0].z);
for (int i = 0; i < rings-1; i++) {
ring_s *r1 = &ring[i];
ring_s *r2 = &ring[i+1];
int r1i = 0, r2i = 0;
- while (r1i < r1->fragments || r2i < r2->fragments)
+ while (r1i < fragments || r2i < fragments)
{
- if (r1i >= r1->fragments)
+ if (r1i >= fragments)
goto sphere_next_r2;
- if (r2i >= r2->fragments)
+ if (r2i >= fragments)
goto sphere_next_r1;
- if ((double)r1i / r1->fragments <
- (double)r2i / r2->fragments)
+ if ((double)r1i / fragments <
+ (double)r2i / fragments)
{
sphere_next_r1:
p->append_poly();
- int r1j = (r1i+1) % r1->fragments;
+ int r1j = (r1i+1) % fragments;
p->insert_vertex(r1->points[r1i].x, r1->points[r1i].y, r1->z);
p->insert_vertex(r1->points[r1j].x, r1->points[r1j].y, r1->z);
- p->insert_vertex(r2->points[r2i % r2->fragments].x, r2->points[r2i % r2->fragments].y, r2->z);
+ p->insert_vertex(r2->points[r2i % fragments].x, r2->points[r2i % fragments].y, r2->z);
r1i++;
} else {
sphere_next_r2:
p->append_poly();
- int r2j = (r2i+1) % r2->fragments;
+ int r2j = (r2i+1) % fragments;
p->append_vertex(r2->points[r2i].x, r2->points[r2i].y, r2->z);
p->append_vertex(r2->points[r2j].x, r2->points[r2j].y, r2->z);
- p->append_vertex(r1->points[r1i % r1->fragments].x, r1->points[r1i % r1->fragments].y, r1->z);
+ p->append_vertex(r1->points[r1i % fragments].x, r1->points[r1i % fragments].y, r1->z);
r2i++;
}
}
}
p->append_poly();
- for (int i = 0; i < ring[rings-1].fragments; i++)
+ for (int i = 0; i < fragments; i++)
p->insert_vertex(ring[rings-1].points[i].x, ring[rings-1].points[i].y, ring[rings-1].z);
delete[] ring;
@@ -388,17 +390,25 @@ sphere_next_r2:
for (int i=0; i<fragments; i++) {
int j = (i+1) % fragments;
- if (r1 > 0) {
+ if (r1 == r2) {
p->append_poly();
p->insert_vertex(circle1[i].x, circle1[i].y, z1);
p->insert_vertex(circle2[i].x, circle2[i].y, z2);
- p->insert_vertex(circle1[j].x, circle1[j].y, z1);
- }
- if (r2 > 0) {
- p->append_poly();
- p->insert_vertex(circle2[i].x, circle2[i].y, z2);
p->insert_vertex(circle2[j].x, circle2[j].y, z2);
p->insert_vertex(circle1[j].x, circle1[j].y, z1);
+ } else {
+ if (r1 > 0) {
+ p->append_poly();
+ p->insert_vertex(circle1[i].x, circle1[i].y, z1);
+ p->insert_vertex(circle2[i].x, circle2[i].y, z2);
+ p->insert_vertex(circle1[j].x, circle1[j].y, z1);
+ }
+ if (r2 > 0) {
+ p->append_poly();
+ p->insert_vertex(circle2[i].x, circle2[i].y, z2);
+ p->insert_vertex(circle2[j].x, circle2[j].y, z2);
+ p->insert_vertex(circle1[j].x, circle1[j].y, z1);
+ }
}
}
contact: Jan Huwald // Impressum