nuclear@6: #include <assert.h> nuclear@5: #include "co_phys.h" nuclear@6: #include "sim.h" nuclear@3: nuclear@5: static CoRigid reg_co_rigid; nuclear@3: nuclear@5: static Component *cons_rigid() { return new CoRigid; } nuclear@3: nuclear@5: CoRigid::CoRigid() nuclear@3: { nuclear@3: mass = 1.0; nuclear@3: elast = 0.5; nuclear@3: friction = 0.0; nuclear@3: nuclear@3: name = "rigid"; nuclear@3: nuclear@3: register_component(name, cons_rigid); nuclear@3: } nuclear@3: nuclear@6: const char **CoRigid::update_before() const nuclear@3: { nuclear@6: static const char *before[] = { "prs", 0 }; nuclear@6: return before; nuclear@3: } nuclear@6: nuclear@6: void CoRigid::add_impulse(const Vector3 &v) nuclear@6: { nuclear@6: impulse += v; nuclear@6: } nuclear@6: nuclear@6: void CoRigid::update(float dt) nuclear@6: { nuclear@6: if(!gobj) return; nuclear@6: nuclear@6: if(!co_prs) { nuclear@6: if(!(co_prs = COCAST(CoPRS, gobj->get_component("prs")))) { nuclear@6: assert(co_prs); nuclear@6: return; nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: float damping = world ? world->get_damping() : 0.005; nuclear@6: nuclear@6: Vector3 newpos = co_prs->pos + vel * dt; nuclear@6: nuclear@6: Vector3 accel = impulse; nuclear@6: impulse.x = impulse.y = impulse.z = 0.0f; // reset impulse nuclear@6: nuclear@6: if(world) { nuclear@6: accel += world->get_gravity(); nuclear@6: } nuclear@6: nuclear@6: vel = (vel - vel * damping * dt) + accel * dt; nuclear@6: nuclear@6: // TODO collisions nuclear@6: nuclear@6: co_prs->pos = newpos; nuclear@6: }