init_angle = 0;
xform_valid = false;
+ supergear = 0;
+
mesh = 0;
}
delete mesh;
}
+void Gear::attach(Gear *g)
+{
+ if(g->supergear) {
+ if(g->supergear == this) {
+ return;
+ }
+ g->supergear->detach(g);
+ }
+ g->supergear = this;
+ subgears.push_back(g);
+
+ // make co-axial
+ g->axis = axis;
+ g->pos.x = pos.x;
+ g->pos.y = pos.y;
+}
+
+bool Gear::detach(Gear *g)
+{
+ int nsubgears = (int)subgears.size();
+ for(int i=0; i<nsubgears; i++) {
+ if(subgears[i] == g) {
+ subgears.erase(subgears.begin() + i);
+ g->supergear = 0;
+ return true;
+ }
+ }
+ return false;
+}
+
+Gear *Gear::get_super() const
+{
+ return supergear;
+}
+
void Gear::set_angular_offset(float offs)
{
init_angle = offs;
void Gear::set_position(const Vec3 &pos)
{
- this->pos = pos;
- xform_valid = false;
+ if(!supergear) {
+ this->pos = pos;
+ xform_valid = false;
+ } else {
+ if(fabs(this->pos.z - pos.z) > 1e-5) {
+ this->pos.z = pos.z;
+ xform_valid = false;
+ }
+ }
}
const Vec3 &Gear::get_position() const
Vec3 Gear::get_global_position() const
{
- return pos; // TODO
-}
-
-Vec3 Gear::get_planar_position() const
-{
- Mat4 inv_xform = transpose(get_dir_matrix());
- return inv_xform * pos;
+ const Mat4 &m = get_matrix();
+ return m * Vec3(0, 0, 0);
}
void Gear::set_angle(float angle)
float Gear::get_vis_rotation() const
{
- float fix_crooked_teeth = get_angular_pitch() * 3.0 / 8.0;
- return fmod(init_angle + fix_crooked_teeth + angle, M_PI * 2.0);
+ return fmod(init_angle + angle, M_PI * 2.0);
}
const Mat4 &Gear::get_matrix() const
mesh->explode();
mesh->calc_face_normals();
+ float fix_tooth_up = get_angular_pitch() * 3.0 / 8.0;
+
Mat4 rot;
rot.rotation_x(M_PI / 2.0);
+ rot.rotate_z(fix_tooth_up);
mesh->apply_xform(rot, rot);
mesh->set_vis_vecsize(6.0);
xform = dir_xform;
xform.rotate_z(get_vis_rotation());
xform.translate(pos);
+
+ axel_xform = dir_xform;
+ axel_xform.translate(pos);
}