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