+ glPushAttrib(GL_ENABLE_BIT);
+// glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+ glPointSize(5);
+ glLineWidth(3);
+
+ glBegin(GL_LINES);
+ for(size_t i=0; i<hair.size(); i++) {
+ glColor3f(1, 0, 1);
+ Vec3 p = xform * hair[i].spawn_pt;
+ glVertex3f(p.x, p.y, p.z);
+ Vec3 dir = normalize(hair[i].pos - p) * hair_length;
+ Vec3 end = p + dir;
+ glVertex3f(end.x, end.y, end.z);
+/*
+ glColor3f(1, 1, 0);
+ glVertex3f(hair[i].pos.x, hair[i].pos.y, hair[i].pos.z);
+ Vec3 end = hair[i].pos + dbg_force * 2.0;
+ glVertex3f(end.x, end.y, end.z);
+ */
+ }
+ glEnd();
+
+ /*
+ glBegin(GL_POINTS);
+ glColor3f(0.5, 1.0, 0.5);
+ for(size_t i = 0; i < hair.size(); i++) {
+ Vec3 p = xform * (hair[i].spawn_pt + hair[i].spawn_dir * hair_length);
+ glVertex3f(p.x, p.y, p.z);
+ }
+ glEnd();*/
+
+ glPopAttrib();
+}
+
+void Hair::set_transform(Mat4 &xform)
+{
+ this->xform = xform;
+}
+
+void Hair::update(float dt)
+{
+ for(size_t i = 0; i < hair.size(); i++) {
+ /* in local space */
+ Vec3 hair_end = hair[i].spawn_pt + hair[i].spawn_dir * hair_length;
+ Vec3 anchor = xform * hair_end;
+
+ Vec3 force = (anchor - hair[i].pos) * K_ANC;
+
+ Vec3 accel = force; /* mass 1 */
+ hair[i].velocity += ((-hair[i].velocity * DAMPING) + accel) * dt;
+ hair[i].pos += hair[i].velocity * dt;
+
+ dbg_force = force;
+ }