X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2F3dengfx%2Fsrc%2Fsim%2Frigid.cpp;fp=src%2F3dengfx%2Fsrc%2Fsim%2Frigid.cpp;h=c528ae49201d4e78df564c10a5cd70eddb2d382c;hb=6e23259dbabaeb1711a2a5ca25b9cb421f693759;hp=0000000000000000000000000000000000000000;hpb=fe068fa879814784c45e0cb2e65dac489e8f5594;p=summerhack diff --git a/src/3dengfx/src/sim/rigid.cpp b/src/3dengfx/src/sim/rigid.cpp new file mode 100644 index 0000000..c528ae4 --- /dev/null +++ b/src/3dengfx/src/sim/rigid.cpp @@ -0,0 +1,105 @@ +/* +This file is part of the simulation module of 3dengfx. + +Copyright (c) 2005 John Tsiombikas + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "rigid.hpp" +#include + +RigidBody::RigidBody(dWorldID world) { + body = dBodyCreate(world); +} + +RigidBody::~RigidBody() { + dBodyDestroy(body); +} + +void RigidBody::enable() { + dBodyEnable(body); +} + +void RigidBody::disable() { + dBodyDisable(body); +} + +void RigidBody::set_position(const Vector3 &pos, unsigned long time) { + dBodySetPosition(body, pos.x, pos.y, pos.z); + Object::set_position(pos, time); +} + +#define MAT3_TO_ODE(m, o)\ + for(int i=0; i<3; i++) {\ + for(int j=0; j<3; j++) {\ + dACCESS33(o, i, j) = m[i][j];\ + }\ + } + + +void RigidBody::set_rotation(const Quaternion &rot, unsigned long time) { + Matrix3x3 mat = rot.get_rotation_matrix(); + dMatrix3 ode_mat; + MAT3_TO_ODE(mat, ode_mat); + dBodySetRotation(body, ode_mat); + Object::set_rotation(rot, time); +} + +void RigidBody::set_rotation(const Vector3 &euler, unsigned long time) { + Matrix3x3 mat; + dMatrix3 ode_mat; + mat.set_rotation(euler); + MAT3_TO_ODE(mat, ode_mat); + dBodySetRotation(body, ode_mat); + Object::set_rotation(euler, time); +} + +void RigidBody::translate(const Vector3 &trans, unsigned long time) { +} + +void RigidBody::rotate(const Quaternion &rot, unsigned long time) { +} + +void RigidBody::rotate(const Vector3 &euler, unsigned long time) { +} + +void RigidBody::rotate(const Matrix3x3 &rmat, unsigned long time) { +} + +RigidSim::RigidSim() { + world = dWorldCreate(); + + set_gravity(Vector3(0, -9.81, 0)); +} + +RigidSim::~RigidSim() { + dWorldDestroy(world); +} + +void RigidSim::run(unsigned long msec) { + dWorldStep(world, timeslice); +} + +void RigidSim::set_gravity(const Vector3 &gvec) { + dWorldSetGravity(world, gvec.x, gvec.y, gvec.z); +} + +void RigidSim::add_object(Object *obj) { + if(obj) { + obj_list.push_back(obj); + // TODO: cont. here... + } +}