[Add] Some elastic collision crap.
This commit is contained in:
parent
6b4b76f3b2
commit
3aa74ee0b0
@ -4,8 +4,6 @@
|
|||||||
#include "vector3.h"
|
#include "vector3.h"
|
||||||
#include "matrix4x4.h"
|
#include "matrix4x4.h"
|
||||||
|
|
||||||
class ObjMesh;
|
|
||||||
|
|
||||||
class DynamicBody : public ModelBody {
|
class DynamicBody : public ModelBody {
|
||||||
public:
|
public:
|
||||||
OBJDEF(DynamicBody, ModelBody, DYNAMICBODY);
|
OBJDEF(DynamicBody, ModelBody, DYNAMICBODY);
|
||||||
@ -35,5 +33,4 @@ protected:
|
|||||||
virtual void Load(void);
|
virtual void Load(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObjMesh* m_mesh;
|
|
||||||
};
|
};
|
||||||
|
@ -23,17 +23,17 @@ void InfoView::UpdateInfo(void) {
|
|||||||
Equip::Type e = L3D::player->m_equipment.Get(Equip::SLOT_ENGINE);
|
Equip::Type e = L3D::player->m_equipment.Get(Equip::SLOT_ENGINE);
|
||||||
nfo += std::string("\n\nDrive system: ")+EquipType::types[e].name;
|
nfo += std::string("\n\nDrive system: ")+EquipType::types[e].name;
|
||||||
|
|
||||||
shipstats_t stats;
|
const shipstats_t* stats;
|
||||||
L3D::player->CalcStats(&stats);
|
stats = L3D::player->CalcStats();
|
||||||
snprintf(buf, sizeof(buf), "n\nCapacity: %dt\n"
|
snprintf(buf, sizeof(buf), "n\nCapacity: %dt\n"
|
||||||
"Free: %dt\n"
|
"Free: %dt\n"
|
||||||
"Used: %dt\n"
|
"Used: %dt\n"
|
||||||
"All-up weight: %dt", stats.max_capacity,
|
"All-up weight: %dt", stats->max_capacity,
|
||||||
stats.free_capacity, stats.used_capacity,
|
stats->free_capacity, stats->used_capacity,
|
||||||
stats.total_mass);
|
stats->total_mass);
|
||||||
nfo += std::string(buf);
|
nfo += std::string(buf);
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "\n\nHyperspace range: %.2f light years.", stats.hyperspace_range);
|
snprintf(buf, sizeof(buf), "\n\nHyperspace range: %.2f light years.", stats->hyperspace_range);
|
||||||
nfo += std::string(buf);
|
nfo += std::string(buf);
|
||||||
|
|
||||||
info1->SetText(nfo);
|
info1->SetText(nfo);
|
||||||
|
@ -214,7 +214,7 @@ static void raytraceCollMesh(vector3d camPos, vector3d camera_up, vector3d camer
|
|||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
//glActiveTextureARB(GL_TEXTURE0);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glBindTexture(GL_TEXTURE_2D, mytexture);
|
glBindTexture(GL_TEXTURE_2D, mytexture);
|
||||||
|
@ -163,13 +163,13 @@ void SectorView::DrawSector(int sx, int sy) {
|
|||||||
glCallList(m_gluDiskDlist);
|
glCallList(m_gluDiskDlist);
|
||||||
/* Player location indicator. */
|
/* Player location indicator. */
|
||||||
if((sx == playerLocSecX) && (sy == playerLocSecY) && (num == playerLocSysIdx)) {
|
if((sx == playerLocSecX) && (sy == playerLocSecY) && (num == playerLocSysIdx)) {
|
||||||
shipstats_t stats;
|
const shipstats_t* stats;
|
||||||
L3D::player->CalcStats(&stats);
|
stats = L3D::player->CalcStats();
|
||||||
glColor3f(0, 0, 1);
|
glColor3f(0, 0, 1);
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
/* Draw a lovely circle around our beloved player. */
|
/* Draw a lovely circle around our beloved player. */
|
||||||
for(float theta = 0; theta < 2*M_PI; theta += 0.05*M_PI) {
|
for(float theta = 0; theta < 2*M_PI; theta += 0.05*M_PI) {
|
||||||
glVertex3f(stats.hyperspace_range*sin(theta), stats.hyperspace_range*cos(theta), 0);
|
glVertex3f(stats->hyperspace_range*sin(theta), stats->hyperspace_range*cos(theta), 0);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
|
32
src/ship.cpp
32
src/ship.cpp
@ -112,9 +112,8 @@ Ship::Ship(ShipType::Type shipType) : DynamicBody() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Ship::UpdateMass(void) {
|
void Ship::UpdateMass(void) {
|
||||||
shipstats_t s;
|
CalcStats();
|
||||||
CalcStats(&s);
|
dMassAdjust(&m_mass, m_stats.total_mass*1000);
|
||||||
dMassAdjust(&m_mass, s.total_mass*1000);
|
|
||||||
dBodySetMass(m_body, &m_mass);
|
dBodySetMass(m_body, &m_mass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,6 +123,18 @@ bool Ship::OnCollision(Body* b, Uint32 flags) {
|
|||||||
if(m_flightState != FLYING) return false;
|
if(m_flightState != FLYING) return false;
|
||||||
else m_testLanded = true;
|
else m_testLanded = true;
|
||||||
}
|
}
|
||||||
|
if(b->IsType(Object::MODELBODY)) {
|
||||||
|
vector3d relVel;
|
||||||
|
if(b->IsType(Object::DYNAMICBODY)) {
|
||||||
|
relVel = static_cast<DynamicBody*>(b)->GetVelocity() - GetVelocity();
|
||||||
|
} else {
|
||||||
|
relVel = GetVelocity();
|
||||||
|
}
|
||||||
|
/* Crappy recalculation of all this... */
|
||||||
|
float v = relVel.Length();
|
||||||
|
float kineticEnergy = m_stats.total_mass * v * v;
|
||||||
|
printf("%f ek\n", kineticEnergy);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,23 +166,24 @@ void Ship::ClearThrusterState(void) {
|
|||||||
/* Hyperspace range is:
|
/* Hyperspace range is:
|
||||||
* (200 * hyperspace_class^2) / total_mass (in tonnes)
|
* (200 * hyperspace_class^2) / total_mass (in tonnes)
|
||||||
*/
|
*/
|
||||||
void Ship::CalcStats(shipstats_t* stats) {
|
const shipstats_t* Ship::CalcStats(void) {
|
||||||
const ShipType& stype = GetShipType();
|
const ShipType& stype = GetShipType();
|
||||||
stats->max_capacity = stype.capacity;
|
m_stats.max_capacity = stype.capacity;
|
||||||
stats->used_capacity = 0;
|
m_stats.used_capacity = 0;
|
||||||
|
|
||||||
for(int i = 0; i < Equip::SLOT_MAX; i++) {
|
for(int i = 0; i < Equip::SLOT_MAX; i++) {
|
||||||
for(int j = 0; j < stype.equipSlotCapacity[i]; j++) {
|
for(int j = 0; j < stype.equipSlotCapacity[i]; j++) {
|
||||||
Equip::Type t = m_equipment.Get((Equip::Slot)i, j);
|
Equip::Type t = m_equipment.Get((Equip::Slot)i, j);
|
||||||
if(t) stats->used_capacity += EquipType::types[t].mass;
|
if(t) m_stats.used_capacity += EquipType::types[t].mass;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stats->free_capacity = stats->max_capacity - stats->used_capacity;
|
m_stats.free_capacity = m_stats.max_capacity - m_stats.used_capacity;
|
||||||
stats->total_mass = stats->used_capacity + stype.hullMass;
|
m_stats.total_mass = m_stats.used_capacity + stype.hullMass;
|
||||||
|
|
||||||
Equip::Type t = m_equipment.Get(Equip::SLOT_ENGINE);
|
Equip::Type t = m_equipment.Get(Equip::SLOT_ENGINE);
|
||||||
float hyperclass = EquipType::types[t].pval;
|
float hyperclass = EquipType::types[t].pval;
|
||||||
stats->hyperspace_range = 200 * hyperclass * hyperclass / stats->total_mass;
|
m_stats.hyperspace_range = 200 * hyperclass * hyperclass / m_stats.total_mass;
|
||||||
|
return &m_stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ship::Blastoff(void) {
|
void Ship::Blastoff(void) {
|
||||||
|
@ -31,7 +31,7 @@ public:
|
|||||||
void ClearThrusterState(void);
|
void ClearThrusterState(void);
|
||||||
void SetGunState(int idx, int state);
|
void SetGunState(int idx, int state);
|
||||||
const ShipType& GetShipType(void);
|
const ShipType& GetShipType(void);
|
||||||
void CalcStats(shipstats_t* stats);
|
const shipstats_t* CalcStats(void);
|
||||||
void UpdateMass(void);
|
void UpdateMass(void);
|
||||||
vector3d CalcRotDamping();
|
vector3d CalcRotDamping();
|
||||||
bool SetWheelState(bool down); /* Returns success of state change, NOT state itself. */
|
bool SetWheelState(bool down); /* Returns success of state change, NOT state itself. */
|
||||||
@ -82,5 +82,6 @@ private:
|
|||||||
LaserObj m_laserCollisionObj;
|
LaserObj m_laserCollisionObj;
|
||||||
Body* m_navTarget;
|
Body* m_navTarget;
|
||||||
Body* m_combatTarget;
|
Body* m_combatTarget;
|
||||||
|
shipstats_t m_stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -342,10 +342,11 @@ static bool _OnCollision2(Object* o1, Object* o2, CollisionContact* c) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_CONTACTS 10
|
#define MAX_CONTACTS 1
|
||||||
static int contact_num;
|
static int contact_num;
|
||||||
static void hitCallback(CollisionContact* c) {
|
static void hitCallback(CollisionContact* c) {
|
||||||
if(contact_num++ >= MAX_CONTACTS) return;
|
if(contact_num++ >= MAX_CONTACTS) return;
|
||||||
|
printf("AUCH!! %x\n", SDL_GetTicks());
|
||||||
dContact contact;
|
dContact contact;
|
||||||
|
|
||||||
contact.surface.mode = dContactBounce;
|
contact.surface.mode = dContactBounce;
|
||||||
|
Loading…
Reference in New Issue
Block a user