meshing calculation for co-planar gears
[antikythera] / src / gear.h
index 12d9ba2..281e77f 100644 (file)
@@ -39,26 +39,31 @@ class Gear {
 private:
        Mesh *mesh;
 
-       mutable Mat4 xform;
+       mutable Mat4 xform, dir_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: 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 */
+       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
 
        std::vector<GearPin> pins;
        std::vector<GearSlot> slots;
@@ -69,8 +74,17 @@ public:
        // 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_axis(const Vec3 &axis);
+       void set_position(const Vec3 &pos);
+       const Vec3 &get_position() const;
+       Vec3 get_global_position() const;       // taking parent gear into account
+
+       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;