[Add] Working on collision. Doesn't work, see how changing model scale screws collisions. If I set the model 62 scale to 2.0 then hitting it gives screwed up collisions. On scale 1.0 it works fine though.
This commit is contained in:
parent
411e82b6ef
commit
9004c7b731
@ -31,7 +31,7 @@ public:
|
||||
const vector3d& GetProjectedPos() const;
|
||||
bool IsOnscreen() const { return m_onscreen; }
|
||||
void SetOnscreen(const bool onscreen) { m_onscreen = onscreen; }
|
||||
|
||||
virtual void TimeStepUpdate(const float timeStep) {}
|
||||
enum { FLAG_CAN_MOVE_FRAME = 1 };
|
||||
|
||||
protected:
|
||||
|
@ -41,8 +41,9 @@ public:
|
||||
static void Quit(void);
|
||||
static float GetFrameTime(void) { return frameTime; }
|
||||
static double GetGameTime(void) { return gameTime; }
|
||||
static void SetTimeStep(float s) { timeStep = s; }
|
||||
static float GetTimeStep(void) { return timeStep; }
|
||||
static void SetTimeAccel(float s) { timeAccel = s; }
|
||||
static float GetTimeAccel(void) { return timeAccel; }
|
||||
static float GetTimeStep(void) { return timeAccel*frameTime; }
|
||||
static int GetScrWidth(void) { return scrWidth; }
|
||||
static int GetScrHeight(void) { return scrHeight; }
|
||||
static int GetScrAspect(void) { return scrAspect; }
|
||||
@ -91,7 +92,7 @@ private:
|
||||
static StarSystem* selected_system;
|
||||
static enum CamType cam_type;
|
||||
static enum MapView map_view;
|
||||
static float timeStep;
|
||||
static float timeAccel;
|
||||
static float frameTime;
|
||||
static int scrWidth, scrHeight;
|
||||
static float scrAspect;
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "space_station_view.h"
|
||||
#include "info_view.h"
|
||||
|
||||
float L3D::timeStep = 1.0f;
|
||||
float L3D::timeAccel = 1.0f;
|
||||
int L3D::scrWidth;
|
||||
int L3D::scrHeight;
|
||||
float L3D::scrAspect;
|
||||
@ -199,7 +199,7 @@ void L3D::MainLoop(void) {
|
||||
snprintf(buf, sizeof(buf), "X%c-0%02d", "A"+i, i);
|
||||
body->SetLabel(buf);
|
||||
body->SetFrame(earth_frame);
|
||||
body->SetPosition(vector3d(i*200, 0, -200));
|
||||
body->SetPosition(vector3d(i*2000, 0, -400));
|
||||
Space::AddBody(body);
|
||||
}
|
||||
|
||||
@ -207,7 +207,7 @@ void L3D::MainLoop(void) {
|
||||
SpaceStation* body = new SpaceStation();
|
||||
body->SetLabel("Some Back Country Joint");
|
||||
body->SetFrame(earth_frame);
|
||||
body->SetPosition(vector3d(0, 0, 6000));
|
||||
body->SetPosition(vector3d(0, 0, 600));
|
||||
Space::AddBody(body);
|
||||
}
|
||||
|
||||
@ -290,7 +290,7 @@ void L3D::MainLoop(void) {
|
||||
//if(glGetError()) printf("GL: %s\n", gluErrorString(glGetError()));
|
||||
|
||||
L3D::frameTime = 0.001*(SDL_GetTicks() - time_before_frame);
|
||||
float step = L3D::timeStep * L3D::frameTime;
|
||||
float step = L3D::timeAccel * L3D::frameTime;
|
||||
|
||||
time_before_frame = SDL_GetTicks();
|
||||
/* Game state update stuff. */
|
||||
|
@ -53,24 +53,25 @@ void Player::ApplyExternalViewRotation(void) {
|
||||
}
|
||||
|
||||
#define MOUSE_CTRL_AREA 10.0f
|
||||
#define MOUSE_RESTITUTION 0.9f
|
||||
#define MOUSE_RESTITUTION 0.01f
|
||||
|
||||
void Player::AITurn(void) {
|
||||
void Player::PollControls(void) {
|
||||
int mouseMotion[2];
|
||||
float time_step = L3D::GetTimeStep();
|
||||
float ts2 = time_step*time_step;
|
||||
|
||||
float time_accel = L3D::GetTimeAccel();
|
||||
float ta2 = time_accel*time_accel;
|
||||
|
||||
SetAngThrusterState(0, 0.0f);
|
||||
SetAngThrusterState(1, 0.0f);
|
||||
SetAngThrusterState(2, 0.0f);
|
||||
|
||||
if(time_step == 0) return;
|
||||
if(GetDockedWith()) return;
|
||||
if((time_accel == 0) || GetDockedWith()) {
|
||||
return;
|
||||
}
|
||||
|
||||
vector3f angThrust(0.0f);
|
||||
|
||||
if(L3D::MouseButtonState(3)) {
|
||||
float restitution = powf(MOUSE_RESTITUTION, time_step);
|
||||
float restitution = powf(MOUSE_RESTITUTION, L3D::GetTimeStep());
|
||||
L3D::GetMouseMotion(mouseMotion);
|
||||
m_mouseCMov[0] += mouseMotion[0];
|
||||
m_mouseCMov[1] += mouseMotion[1];
|
||||
@ -93,7 +94,7 @@ void Player::AITurn(void) {
|
||||
else SetGunState(0,0);
|
||||
|
||||
/* No torques at huge time accels -- ODE hates it. */
|
||||
if(time_step <= 10) {
|
||||
if(time_accel <= 10) {
|
||||
if(L3D::GetCamType() != L3D::CAM_EXTERNAL) {
|
||||
if(L3D::KeyState(SDLK_LEFT)) angThrust.y += 1;
|
||||
if(L3D::KeyState(SDLK_RIGHT)) angThrust.y += -1;
|
||||
@ -107,7 +108,7 @@ void Player::AITurn(void) {
|
||||
GetRotMatrix(rot);
|
||||
angVel = rot.InverseOf() * angVel;
|
||||
|
||||
angVel *= 0.4;
|
||||
angVel *= 0.6;
|
||||
angThrust.x -= angVel.x;
|
||||
angThrust.y -= angVel.y;
|
||||
angThrust.z -= angVel.z;
|
||||
@ -116,12 +117,12 @@ void Player::AITurn(void) {
|
||||
* Divided by time step so controls don't go totally insane when
|
||||
* used at 10x accel.
|
||||
*/
|
||||
angThrust *= 1.0f/ts2;
|
||||
angThrust *= 1.0f/ta2;
|
||||
SetAngThrusterState(0, angThrust.x);
|
||||
SetAngThrusterState(1, angThrust.y);
|
||||
SetAngThrusterState(2, angThrust.z);
|
||||
}
|
||||
if(time_step > 10) {
|
||||
if(time_accel > 10) {
|
||||
dBodySetAngularVel(m_body, 0, 0, 0);
|
||||
}
|
||||
if(L3D::GetCamType() == L3D::CAM_EXTERNAL) {
|
||||
@ -133,7 +134,6 @@ void Player::AITurn(void) {
|
||||
if(L3D::KeyState(SDLK_MINUS)) m_external_view_dist += 10;
|
||||
m_external_view_dist = MAX(50, m_external_view_dist);
|
||||
}
|
||||
Ship::AITurn();
|
||||
}
|
||||
|
||||
#define HUD_CROSSHAIR_SIZE 24.0f
|
||||
|
@ -5,7 +5,7 @@
|
||||
class Player : public Ship {
|
||||
public:
|
||||
Player(ShipType::Type shipType);
|
||||
virtual void AITurn();
|
||||
void PollControls(void);
|
||||
virtual void Render(const Frame* camFrame);
|
||||
void DrawHUD(const Frame* cam_frame);
|
||||
virtual void SetDockedWith(SpaceStation*);
|
||||
|
@ -13,6 +13,21 @@ RigidBody::RigidBody(void) : StaticRigidBody() {
|
||||
dBodySetMass(m_body, &m_mass);
|
||||
}
|
||||
|
||||
void RigidBody::SetMassDistributionFromCollMesh(const CollMesh* m) {
|
||||
vector3d min = vector3d(FLT_MAX);
|
||||
vector3d max = vector3d(-FLT_MAX);
|
||||
for(int i = 0; i < 3*m->nv; i += 3) {
|
||||
min.x = MIN(m->pVertex[i], min.x);
|
||||
min.y = MIN(m->pVertex[i+1], min.y);
|
||||
min.z = MIN(m->pVertex[i+2], min.z);
|
||||
max.x = MAX(m->pVertex[i], max.x);
|
||||
max.y = MAX(m->pVertex[i+1], max.y);
|
||||
max.z = MAX(m->pVertex[i+2], max.z);
|
||||
}
|
||||
dMassSetBox(&m_mass, 1, max.x-min.x, max.y-min.y, max.z-min.z);
|
||||
dBodySetMass(m_body, &m_mass);
|
||||
}
|
||||
|
||||
vector3d RigidBody::GetAngularMomentum(void) {
|
||||
matrix4x4d I;
|
||||
I.LoadFromOdeMatrix(m_mass.I);
|
||||
|
@ -15,6 +15,7 @@ public:
|
||||
void SetMesh(ObjMesh* m);
|
||||
virtual bool OnCollision(Body* b) { return true; }
|
||||
vector3d GetAngularMomentum(void);
|
||||
void SetMassDistributionFromCollMesh(const CollMesh* m);
|
||||
|
||||
dBodyID m_body;
|
||||
dMass m_mass;
|
||||
|
@ -88,7 +88,7 @@ static void ResolveVertices(Model* pMod, Vector* pRes, ObjParams* pObjParam) {
|
||||
|
||||
static float g_dn, g_df, g_sd;
|
||||
static int g_wireframe = 0;
|
||||
float SBRE_ZBIAS = 0;
|
||||
float SBRE_ZBIAS = 0.00002f;
|
||||
|
||||
void sbreSetZBias(float zbias) {
|
||||
SBRE_ZBIAS = zbias;
|
||||
|
18
src/ship.cpp
18
src/ship.cpp
@ -37,7 +37,9 @@ Ship::Ship(ShipType::Type shipType) : RigidBody() {
|
||||
memset(m_thrusters, 0, sizeof(m_thrusters));
|
||||
const ShipType& stype = GetShipType();
|
||||
SetGeomFromSBREModel(stype.sbreModel, ¶ms);
|
||||
SetMassDistributionFromCollMesh(sbreCollMesh);
|
||||
dGeomSetBody(m_geom, m_body);
|
||||
UpdateMass();
|
||||
}
|
||||
|
||||
void Ship::UpdateMass(void) {
|
||||
@ -77,11 +79,10 @@ void Ship::CalcStats(shipstats_t* stats) {
|
||||
stats->hyperspace_range = 200 * hyperclass * hyperclass / stats->total_mass;
|
||||
}
|
||||
|
||||
void Ship::AITurn(void) {
|
||||
void Ship::TimeStepUpdate(const float timeStep) {
|
||||
/* ODE tri mesh likes to know our old position. */
|
||||
TriMeshUpdateLastPos();
|
||||
const ShipType& stype = GetShipType();
|
||||
float timeStep = L3D::GetTimeStep();
|
||||
for(int i = 0; i < ShipType::THRUSTER_MAX; i++) {
|
||||
float force = timeStep * stype.linThrust[i] * m_thrusters[i];
|
||||
switch(i) {
|
||||
@ -172,7 +173,6 @@ void Ship::RenderLaserfire(void) {
|
||||
glEnable(GL_LIGHTING);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void render_coll_mesh(const CollMesh* m) {
|
||||
glDisable(GL_LIGHTING);
|
||||
glColor3f(1, 0, 1);
|
||||
@ -183,9 +183,18 @@ static void render_coll_mesh(const CollMesh* m) {
|
||||
glVertex3fv(&m->pVertex[3*m->pIndex[i+2]]);
|
||||
}
|
||||
glEnd();
|
||||
glColor3f(1,1,1);
|
||||
glDepthRange(0, 1.0f-0.0002f);
|
||||
for(int i = 0; i < m->ni; i += 3) {
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex3fv(&m->pVertex[3*m->pIndex[i]]);
|
||||
glVertex3fv(&m->pVertex[3*m->pIndex[i+1]]);
|
||||
glVertex3fv(&m->pVertex[3*m->pIndex[i+2]]);
|
||||
glEnd();
|
||||
}
|
||||
glDepthRange(0.0, 1.0);
|
||||
glEnable(GL_LIGHTING);
|
||||
}
|
||||
#endif
|
||||
|
||||
void Ship::Render(const Frame* camFrame) {
|
||||
const ShipType& stype = GetShipType();
|
||||
@ -208,6 +217,7 @@ void Ship::Render(const Frame* camFrame) {
|
||||
|
||||
glPushMatrix();
|
||||
TransformToModelCoords(camFrame);
|
||||
//render_coll_mesh(sbreCollMesh);
|
||||
RenderLaserfire();
|
||||
glPopMatrix();
|
||||
}
|
||||
|
@ -17,7 +17,6 @@ struct shipstats_t {
|
||||
class Ship : public RigidBody {
|
||||
public:
|
||||
Ship(ShipType::Type shipType);
|
||||
virtual void AITurn(void);
|
||||
virtual Object::Type GetType(void) { return Object::SHIP; }
|
||||
virtual void SetDockedWith(SpaceStation*);
|
||||
SpaceStation* GetDockedWith(void) { return m_dockedWith; }
|
||||
@ -32,6 +31,7 @@ public:
|
||||
void CalcStats(shipstats_t* stats);
|
||||
void UpdateMass(void);
|
||||
void SetWheelState(bool down);
|
||||
virtual void TimeStepUpdate(const float timeStep);
|
||||
|
||||
class LaserObj : public Object {
|
||||
public:
|
||||
|
@ -107,7 +107,7 @@ void ShipCpanel::OnChangeMapView(Gui::MultiStateImageButton* b) {
|
||||
}
|
||||
|
||||
void ShipCpanel::OnClickTimeaccel(Gui::ISelectable* i, double step) {
|
||||
L3D::SetTimeStep(step);
|
||||
L3D::SetTimeAccel(step);
|
||||
}
|
||||
|
||||
void ShipCpanel::OnClickComms(void) {
|
||||
|
@ -7,7 +7,7 @@ const ShipType ShipType::types[] = {
|
||||
* Sirius corporation make a range of lovely ships!
|
||||
*/
|
||||
"Sirius Interdictor", 61,
|
||||
{ 1e7, -1e7, 1e6, -1e6, -1e6, 1e6 },
|
||||
{ 1e8, -1e8, 1e7, -1e6, -1e7, 1e7 },
|
||||
1e7,
|
||||
{
|
||||
{ vector3f(0, -0.5, 0), vector3f(0, 0, -1) },
|
||||
|
@ -156,7 +156,7 @@ static void nearCallback(void* data, dGeomID oO, dGeomID o1) {
|
||||
contact[i].surface.mode = dContactBounce;
|
||||
contact[i].surface.mu = 0;
|
||||
contact[i].surface.mu2 = 0;
|
||||
contact[i].surface.bounce = 0;
|
||||
contact[i].surface.bounce = 0.5;
|
||||
contact[i].surface.bounce_vel = 0.1;
|
||||
}
|
||||
if(int numc = dCollide(oO, o1, MAX_CONTACTS, &contact[0].geom, sizeof(dContact))) {
|
||||
@ -178,6 +178,16 @@ static void nearCallback(void* data, dGeomID oO, dGeomID o1) {
|
||||
* finally create the temp contact joint between the two geom bodies.
|
||||
*/
|
||||
dJointID c = dJointCreateContact(Space::world, _contactgroup, contact + i);
|
||||
printf("Depth: %f\n", contact[i].geom.depth);
|
||||
#if 0
|
||||
struct dContactGeom {
|
||||
dVector3 pos; /* Constact position. */
|
||||
dVector3 normal; /* Normal vector. */
|
||||
dReal depth; /* Penetration depth. */
|
||||
dGeomId g1, g2; /* The colliding geoms. */
|
||||
};
|
||||
#endif
|
||||
|
||||
dJointAttach(c, b1, b2);
|
||||
}
|
||||
}
|
||||
@ -192,12 +202,15 @@ void Space::CollideFrame(Frame* f) {
|
||||
|
||||
void Space::TimeStep(float step) {
|
||||
CollideFrame(rootFrame);
|
||||
//CollideFrame(L3D::player->GetFrame());
|
||||
dWorldQuickStep(world, step);
|
||||
dJointGroupEmpty(_contactgroup);
|
||||
|
||||
/* TODO: Does not need to be done this often. */
|
||||
UpdateFramesOfReference();
|
||||
|
||||
for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) {
|
||||
(*i)->TimeStepUpdate(step);
|
||||
}
|
||||
}
|
||||
|
||||
struct body_zsort_t {
|
||||
|
@ -20,6 +20,7 @@ public:
|
||||
|
||||
static dWorldID world;
|
||||
static std::list<Body*> bodies;
|
||||
typedef std::list<Body*>::iterator bodiesIter_t;
|
||||
private:
|
||||
static void UpdateFramesOfReference(void);
|
||||
static void CollideFrame(Frame* f);
|
||||
|
@ -22,15 +22,15 @@ static ObjParams params = {
|
||||
|
||||
SpaceStation::SpaceStation(void) : StaticRigidBody() {
|
||||
SetGeomFromSBREModel(STATION_SBRE_MODEL, ¶ms);
|
||||
matrix4x4d m = matrix4x4d::RotateYMatrix(M_PI);
|
||||
matrix4x4d m = matrix4x4d::RotateYMatrix(-M_PI/4);
|
||||
dMatrix3 _m;
|
||||
m.SaveToOdeMatrix(_m);
|
||||
dGeomSetRotation(m_geom, _m);
|
||||
m_mesh = 0;
|
||||
dGeomSetBody(m_geom, 0);
|
||||
}
|
||||
|
||||
SpaceStation::~SpaceStation(void) {
|
||||
//dGeomDestroy(m_geom);
|
||||
dGeomDestroy(m_geom);
|
||||
}
|
||||
|
||||
bool SpaceStation::OnCollision(Body* b) {
|
||||
@ -48,10 +48,6 @@ bool SpaceStation::OnCollision(Body* b) {
|
||||
}
|
||||
}
|
||||
|
||||
void SpaceStation::SetMesh(ObjMesh* m) {
|
||||
m_mesh = m;
|
||||
}
|
||||
|
||||
void SpaceStation::Render(const Frame* camFrame) {
|
||||
RenderSbreModel(camFrame, STATION_SBRE_MODEL, ¶ms);
|
||||
}
|
||||
|
@ -9,8 +9,6 @@ public:
|
||||
virtual bool OnCollision(Body* b);
|
||||
virtual Object::Type GetType(void) { return Object::SPACESTATION; }
|
||||
virtual void Render(const Frame* camFrame);
|
||||
void SetMesh(ObjMesh* m);
|
||||
protected:
|
||||
ObjMesh* m_mesh;
|
||||
};
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
StaticRigidBody::StaticRigidBody(void): Body() {
|
||||
m_geom = 0;
|
||||
sbreCollMesh = 0;
|
||||
triMeshLastMatrixIndex = 0;
|
||||
}
|
||||
|
||||
StaticRigidBody::~StaticRigidBody(void) {
|
||||
@ -36,10 +37,26 @@ void StaticRigidBody::SetGeomFromSBREModel(int sbreModel, ObjParams* params) {
|
||||
sbreCollMesh->pVertex[i] = -sbreCollMesh->pVertex[i];
|
||||
sbreCollMesh->pVertex[i+2] = -sbreCollMesh->pVertex[i+2];
|
||||
}
|
||||
/* Make normals. */
|
||||
meshNormals = new float[sbreCollMesh->ni];
|
||||
for(int i = 0; i < sbreCollMesh->ni; i += 3) {
|
||||
float* vtx1 = sbreCollMesh->pVertex + 3*sbreCollMesh->pIndex[i];
|
||||
float* vtx2 = sbreCollMesh->pVertex + 3*sbreCollMesh->pIndex[i+1];
|
||||
float* vtx3 = sbreCollMesh->pVertex + 3*sbreCollMesh->pIndex[i+2];
|
||||
vector3f v1(vtx1[0], vtx1[1], vtx1[2]);
|
||||
vector3f v2(vtx2[0], vtx2[1], vtx2[2]);
|
||||
vector3f v3(vtx3[0], vtx3[1], vtx3[2]);
|
||||
vector3f n = vector3f::Cross(v1-v2, v1-v3);
|
||||
n.Normalize();
|
||||
meshNormals[i] = n.x;
|
||||
meshNormals[i+1] = n.y;
|
||||
meshNormals[i+2] = n.z;
|
||||
|
||||
}
|
||||
dTriMeshDataID triMeshDataID = dGeomTriMeshDataCreate();
|
||||
dGeomTriMeshDataBuildSingle(triMeshDataID, (void*)sbreCollMesh->pVertex,
|
||||
dGeomTriMeshDataBuildSingle1(triMeshDataID, (void*)sbreCollMesh->pVertex,
|
||||
3*sizeof(float), sbreCollMesh->nv, (void*)sbreCollMesh->pIndex,
|
||||
sbreCollMesh->ni, 3*sizeof(int));
|
||||
sbreCollMesh->ni, 3*sizeof(int), NULL/*meshNormals*/);
|
||||
|
||||
/* TODO: Leaking StaticRigidBody m_geom. */
|
||||
m_geom = dCreateTriMesh(0, triMeshDataID, NULL, NULL, NULL);
|
||||
@ -101,13 +118,13 @@ void StaticRigidBody::TriMeshUpdateLastPos(void) {
|
||||
/* ODE tri mesh likes to know our old position. */
|
||||
const dReal* r = dGeomGetRotation(m_geom);
|
||||
vector3d pos = GetPosition();
|
||||
dMatrix4 t;
|
||||
/* Row-major. */
|
||||
t[0] = r[0]; t[1] = r[1]; t[ 2] = r[ 2]; t[ 3] = pos.x;
|
||||
t[4] = r[4]; t[5] = r[5]; t[ 6] = r[ 6]; t[ 7] = pos.y;
|
||||
t[8] = r[8]; t[9] = r[9]; t[10] = r[10]; t[11] = pos.z;
|
||||
t[12] = t[13] = t[15] = 0;
|
||||
dGeomTriMeshSetLastTransform(m_geom, t);
|
||||
dReal* t = triMeshTrans + 16*triMeshLastMatrixIndex;
|
||||
t[ 0] = r[0]; t[1] = r[1]; t[ 2] = r[ 2]; t[ 3] = 0;
|
||||
t[ 4] = r[4]; t[5] = r[5]; t[ 6] = r[ 6]; t[ 7] = 0;
|
||||
t[ 8] = r[8]; t[9] = r[9]; t[10] = r[10]; t[11] = 0;
|
||||
t[12] = pos.x; t[13] = pos.y; t[14] = pos.z; t[15] = 1;
|
||||
triMeshLastMatrixIndex = !triMeshLastMatrixIndex;
|
||||
dGeomTriMeshSetLastTransform(m_geom, *(dMatrix4*)(triMeshTrans + 16*triMeshLastMatrixIndex));
|
||||
}
|
||||
|
||||
void StaticRigidBody::RenderSbreModel(const Frame* camFrame, int model, ObjParams* params) {
|
||||
|
@ -30,5 +30,8 @@ public:
|
||||
protected:
|
||||
dGeomID m_geom;
|
||||
CollMesh* sbreCollMesh;
|
||||
float* meshNormals;
|
||||
dReal triMeshTrans[32];
|
||||
int triMeshLastMatrixIndex;
|
||||
};
|
||||
|
||||
|
@ -110,7 +110,7 @@ void WorldView::Update(void) {
|
||||
m_hyperspaceButton->Hide();
|
||||
}
|
||||
/* Player control inputs. */
|
||||
L3D::player->AITurn();
|
||||
L3D::player->PollControls();
|
||||
}
|
||||
|
||||
void WorldView::OnMouseDown(Gui::MouseButtonEvent* e) {
|
||||
|
Loading…
Reference in New Issue
Block a user