#include <GL/glew.h>
#include "gear.h"
#include "meshgen.h"
+#include "app.h"
Gear::Gear()
: axis(0, 0, 1)
thickness = 5;
bevel = 1.5;
init_angle = 0;
+ xform_valid = false;
mesh = 0;
}
init_angle = get_angular_pitch() * 3.0 / 8.0;
}
-float Gear::get_rotation() const
+void Gear::set_axis(const Vec3 &axis)
+{
+ this->axis = normalize(axis);
+ xform_valid = false;
+}
+
+void Gear::set_position(const Vec3 &pos)
+{
+ this->pos = pos;
+ xform_valid = false;
+}
+
+const Vec3 &Gear::get_position() const
+{
+ return pos;
+}
+
+Vec3 Gear::get_global_position() const
+{
+ return pos; // TODO
+}
+
+void Gear::set_angle(float angle)
+{
+ this->angle = angle;
+ xform_valid = false;
+}
+
+float Gear::get_angle() const
+{
+ return angle;
+}
+
+float Gear::get_vis_rotation() const
{
return fmod(init_angle + angle, M_PI * 2.0);
}
+const Mat4 &Gear::get_matrix() const
+{
+ if(!xform_valid) {
+ calc_matrix();
+ xform_valid = true;
+ }
+ return xform;
+}
+
+const Mat4 &Gear::get_dir_matrix() const
+{
+ if(!xform_valid) {
+ calc_matrix();
+ xform_valid = true;
+ }
+ return xform;
+}
+
float Gear::get_angular_pitch() const
{
return 2.0 * M_PI / (float)nteeth;
}
calc_matrix();
+ glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
+
glPushMatrix();
glMultMatrixf(xform[0]);
+ if(opt_gear_wireframe) {
+ glPolygonOffset(1, 1);
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ }
+
mesh->draw();
- glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_LIGHTING);
+ if(opt_gear_wireframe) {
+ glColor3f(0.2, 0.4, 1.0);
+ mesh->draw_wire();
+ }
+
glLineWidth(2.0);
glBegin(GL_LINES);
glColor3f(0, 0, 1);
glVertex3f(0, 0, -10);
glVertex3f(0, 0, 10);
glEnd();
- glLineWidth(1.0);
- glPopAttrib();
glPopMatrix();
+ glPopAttrib();
}
static Vec2 rev_pos(float u, float v, void *cls)
Vec3 right = normalize(cross(up, axis));
up = cross(axis, right);
- xform = Mat4(right, up, axis);
- xform.rotate_z(get_rotation());
+ dir_xform = Mat4(right, up, axis);
+
+ xform = dir_xform;
+ xform.rotate_z(get_vis_rotation());
xform.translate(pos);
}