[Add] Some elastic collision crap.

This commit is contained in:
Rtch90 2018-04-06 22:54:29 +01:00
parent 6b4b76f3b2
commit 3aa74ee0b0
7 changed files with 36 additions and 25 deletions

View File

@ -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;
}; };

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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) {

View File

@ -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;
}; };

View File

@ -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;