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: }