nuclear@0: #include nuclear@0: #include nuclear@0: #include "cloth.h" nuclear@0: #include "object.h" nuclear@0: #include "opengl.h" nuclear@0: nuclear@0: Cloth::Cloth() nuclear@0: { nuclear@0: mass = 1.0; nuclear@0: elast = 0.8; nuclear@0: spring_k = 1.0; nuclear@0: grav = Vector3(0, -9, 0); nuclear@0: } nuclear@0: nuclear@0: void Cloth::create_rect(int x, int y, float width, float height) nuclear@0: { nuclear@0: int num = x * y; nuclear@0: float dx = width / (float)x; nuclear@0: float dy = height / (float)y; nuclear@0: nuclear@0: masses.resize(num); nuclear@0: conn.resize(num); nuclear@0: for(int i=0; i= x || ny < 0 || ny >= y) continue; nuclear@0: nuclear@0: int nidx = ny * x + nx; nuclear@0: float dist = length(masses[idx].pos - masses[nidx].pos); nuclear@0: nuclear@0: conn[idx][nidx] = conn[nidx][idx] = dist; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: ++idx; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void Cloth::transform(const Matrix4x4 &xform) nuclear@0: { nuclear@0: for(size_t i=0; iintersect(ray, hit) && hit->t < nearest.t) { nuclear@0: nearest = *hit; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(nearest.obj) { nuclear@0: *hit = nearest; nuclear@0: return true; nuclear@0: } nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: void Cloth::draw() const nuclear@0: { nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: nuclear@0: glPointSize(7.0); nuclear@0: glEnable(GL_POINT_SMOOTH); nuclear@0: nuclear@0: glEnable(GL_BLEND); nuclear@0: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@0: nuclear@0: // draw masses nuclear@0: glBegin(GL_POINTS); nuclear@0: for(size_t i=0; i