X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=antikythera;a=blobdiff_plain;f=src%2Fgear.h;h=5f99dd505c72bdb1c7d704960d0f1875e19bf553;hp=12d9ba2fe1e4c71b34a4b9da3fb2b94284fb5048;hb=HEAD;hpb=a88a9ac53952e1bb3768b147a043c19392e3d5d1 diff --git a/src/gear.h b/src/gear.h index 12d9ba2..5f99dd5 100644 --- a/src/gear.h +++ b/src/gear.h @@ -39,43 +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: + + /* 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: distance of plane from origin */ + Vec3 pos, axis; // implicitly defines a plane eqn. + float pdist; // derived from the above: distance of plane from origin + + float init_angle; // initial starting angle + float angle; // current angle of the gear - float init_angle; /* initial starting angle */ - float angle; /* current angle of the gear */ + int nteeth; // number of teeth + float tooth_pitch; - int nteeth; /* number of teeth */ + 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 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 - 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); + 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_rotation() 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(); };