X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=antikythera;a=blobdiff_plain;f=src%2Fgear.h;h=5f99dd505c72bdb1c7d704960d0f1875e19bf553;hp=5fde21fefaa2efc0dad8ddc8ec683f65b3f987ab;hb=HEAD;hpb=ae60a8cb1a30e204e7f60969fe6245e510cca0ff diff --git a/src/gear.h b/src/gear.h index 5fde21f..5f99dd5 100644 --- a/src/gear.h +++ b/src/gear.h @@ -2,6 +2,7 @@ #define GEAR_H_ #include +#include #include #include "mesh.h" @@ -38,32 +39,76 @@ class Gear { private: Mesh *mesh; - mutable Mat4 xform; + mutable Mat4 xform, dir_xform, axel_xform; + mutable bool xform_valid; void calc_matrix() const; float contour(float u); public: - Vec3 pos, axis; /* implicitly defines a plane eqn. */ - float pdist; /* derived: distance of plane from origin */ - float angle; /* current angle of the gear */ + /* TODO hide most of this shit, especially the stuff which invalidate + * the transformation matrices + */ + std::string name; + Vec3 pos, axis; // implicitly defines a plane eqn. + float pdist; // derived from the above: distance of plane from origin - int nteeth; /* number of teeth */ + float init_angle; // initial starting angle + float angle; // current angle of the gear - float radius; /* total radius of the gear, including teeth */ - float teeth_length; /* how far teeth extend past the radius */ - float thickness; /* thickness of the gear along the Z axis */ + int nteeth; // number of teeth + float tooth_pitch; - float bevel; /* bevel size */ + float radius; // total radius of the gear, including teeth + float teeth_length; // how far teeth extend past the radius + float thickness; // thickness of the gear along the Z axis + float bevel; // bevel size + + // visual surface properties + Vec3 color; + float roughness; + bool metallic; + + Gear *supergear; + std::vector subgears; std::vector pins; std::vector slots; Gear(); ~Gear(); + void attach(Gear *g); + bool detach(Gear *g); + Gear *get_super() const; + + void set_angular_offset(float offs); + float get_angular_offset() const; + + // sets the supplied number of teeth, and calculates the radius + // of the gear, to achieve the required tooth pitch + void set_teeth(int nt, float tooth_pitch = 0.0f); + void set_axis(const Vec3 &axis); + const Vec3 &get_axis() const; + void set_position(const Vec3 &pos); + const Vec3 &get_position() const; + Vec3 get_global_position() const; // taking parent gear into account + + Vec3 get_planar_position() const; // 2D pos of gear on its plane + + void set_angle(float angle); + float get_angle() const; + + float get_vis_rotation() const; + const Mat4 &get_matrix() const; + const Mat4 &get_dir_matrix() const; + + // returns the angle (in radians) from one tooth to the next + float get_angular_pitch() const; + void draw() const; + void draw_wire(float line_width = 1.0f) const; bool gen_mesh(); };