fac245c19152c859d41c3b0e9cd5927c4ca135d5
[antikythera] / src / gear.h
1 #ifndef GEAR_H_
2 #define GEAR_H_
3
4 #include <vector>
5 #include <string>
6 #include <gmath/gmath.h>
7 #include "mesh.h"
8
9 /* distance unit: millimeters
10  * angle unit: radians
11  */
12
13 class Gear;
14 struct GearPin;
15 struct GearSlot;
16
17 struct GearPin {
18         float radius;
19         float height;
20
21         Gear *parent;
22         /* position in polar coordinates on the parent gear */
23         float pos_dist, pos_angle;
24
25         GearSlot *conn_slot;    /* slot connection */
26 };
27
28 struct GearSlot {
29         float radius, length;
30
31         Gear *parent;
32         /* position in polar coordinates on the parent gear */
33         float pos_dist_min, pos_dist_max, pos_angle;
34
35         GearPin *conn_pin;              /* pin connection */
36 };
37
38 class Gear {
39 private:
40         Mesh *mesh;
41
42         mutable Mat4 xform, dir_xform, axel_xform;
43         mutable bool xform_valid;
44         void calc_matrix() const;
45
46         float contour(float u);
47
48 public:
49
50         /* TODO hide most of this shit, especially the stuff which invalidate
51          * the transformation matrices
52          */
53         std::string name;
54         Vec3 pos, axis; // implicitly defines a plane eqn.
55         float pdist;    // derived: distance of plane from origin
56
57         float init_angle;       // initial starting angle
58         float angle;    // current angle of the gear
59
60         int nteeth;             // number of teeth
61         float tooth_pitch;
62
63         float radius;   // total radius of the gear, including teeth
64         float teeth_length;     // how far teeth extend past the radius
65         float thickness;        // thickness of the gear along the Z axis
66
67         float bevel;    // bevel size
68
69         // visual surface properties
70         Vec3 color;
71         float roughness;
72         bool metallic;
73
74         Gear *supergear;
75         std::vector<Gear*> subgears;
76         std::vector<GearPin> pins;
77         std::vector<GearSlot> slots;
78
79         Gear();
80         ~Gear();
81
82         void attach(Gear *g);
83         bool detach(Gear *g);
84         Gear *get_super() const;
85
86         void set_angular_offset(float offs);
87         float get_angular_offset() const;
88
89         // sets the supplied number of teeth, and calculates the radius
90         // of the gear, to achieve the required tooth pitch
91         void set_teeth(int nt, float tooth_pitch = 0.0f);
92         void set_axis(const Vec3 &axis);
93         const Vec3 &get_axis() const;
94         void set_position(const Vec3 &pos);
95         const Vec3 &get_position() const;
96         Vec3 get_global_position() const;       // taking parent gear into account
97
98         Vec3 get_planar_position() const;       // 2D pos of gear on its plane
99
100         void set_angle(float angle);
101         float get_angle() const;
102
103         float get_vis_rotation() const;
104         const Mat4 &get_matrix() const;
105         const Mat4 &get_dir_matrix() const;
106
107         // returns the angle (in radians) from one tooth to the next
108         float get_angular_pitch() const;
109
110         void draw() const;
111         void draw_wire(float line_width = 1.0f) const;
112
113         bool gen_mesh();
114 };
115
116 #endif  // GEAR_H_