/* gl/sphere.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "render/sphere.h" #include "math/mathlib.h" using math::Vector3f; using math::Color; namespace render { const int segments = 33; Sphere::Sphere(float r) { radius = r; // TODO make global sine-cosine lists sintable = new float[segments]; costable = new float[segments]; float d = 2 * M_PI / (segments-1); for (int i=0; i < segments; i++) { sintable[i] = sin( d * (float) i ); costable[i] = cos ( d * (float) i ); } } Sphere::~Sphere() { delete[] sintable; delete[] costable; } Sphere::Sphere(const Sphere &other) { (*this) = other; } Sphere& Sphere::operator=(const Sphere &other) { sphere_color = other.sphere_color; radius = other.radius; return (*this); } void Sphere::draw() { using namespace gl; float r = radius*sintable[1]; //float h = radius*costable[1]; gl::color(sphere_color); /* // draw top begin(Polygon); normal(0, 1, 0); for (int i = segments-1; i >= 0; i--) { v = Vector3f(r*costable[i], h, r*sintable[i]); n = v; n.normalize(); normal(n); vertex(v); } end(); // draw bottom begin(Polygon); normal(0, -1, 0); for (int i = 0; i< segments; i++) { //for (int i = segments-1; i >= 0; i--) v = Vector3f(r*costable[i], -h, r*sintable[i]); n = v; n.normalize(); normal(n); vertex(v); } end(); */ Vector3f v; Vector3f n; // draw body for (int j=0; j < segments-1; j++) { r = radius*sintable[j]; float r1 = radius*sintable[j+1]; begin(QuadStrip); v = Vector3f(r, radius*costable[j], 0); n = v; n.normalize(); normal(n); vertex(v); v = Vector3f(r1, radius*costable[j+1], 0); n = v; n.normalize(); normal(n); vertex(v); for (int i = segments-1; i >= 0; i--) { v = Vector3f(r*costable[i], radius*costable[j], r*sintable[i]); n = v; n.normalize(); normal(n); vertex(v); v = Vector3f(r1*costable[i], radius*costable[j+1], r1*sintable[i]); n = v; n.normalize(); normal(n); vertex(v); //vertex(r*costable[i-1], radius*costable[j], r*sintable[i-1]); //vertex(r1*costable[i-1], radius*costable[j+1], r1*sintable[i-1]); } end(); } } }