fixes to CBoat
This commit is contained in:
parent
a1356f1001
commit
575f35f2c4
@ -259,6 +259,14 @@ public:
|
|||||||
m_matrix.at.y = 0.0f;
|
m_matrix.at.y = 0.0f;
|
||||||
m_matrix.at.z = 1.0f;
|
m_matrix.at.z = 1.0f;
|
||||||
}
|
}
|
||||||
|
void SetTranslateOnly(float x, float y, float z) {
|
||||||
|
m_matrix.pos.x = x;
|
||||||
|
m_matrix.pos.y = y;
|
||||||
|
m_matrix.pos.z = z;
|
||||||
|
}
|
||||||
|
void SetTranslateOnly(const CVector& pos) {
|
||||||
|
SetTranslateOnly(pos.x, pos.y, pos.z);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
|
|||||||
m_fBrake = 0.0f;
|
m_fBrake = 0.0f;
|
||||||
m_fSteeringLeftRight = 0.0f;
|
m_fSteeringLeftRight = 0.0f;
|
||||||
m_nPadID = 0;
|
m_nPadID = 0;
|
||||||
m_fMovingHiRotation = 0.0f;
|
m_fMovingRotation = 0.0f;
|
||||||
SetModelIndex(mi);
|
SetModelIndex(mi);
|
||||||
|
|
||||||
pHandling = mod_HandlingManager.GetHandlingData((eHandlingId)minfo->m_handlingId);
|
pHandling = mod_HandlingManager.GetHandlingData((eHandlingId)minfo->m_handlingId);
|
||||||
@ -63,11 +63,11 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
|
|||||||
m_fGasPedal = 0.0f;
|
m_fGasPedal = 0.0f;
|
||||||
m_fBrakePedal = 0.0f;
|
m_fBrakePedal = 0.0f;
|
||||||
|
|
||||||
m_fPropellerZ = 0.25f;
|
m_fThrustZ = 0.25f;
|
||||||
m_fPropellerY = 0.35f;
|
m_fThrustY = 0.35f;
|
||||||
m_waterMoveDrag = CVector(0.7f, 0.998f, 0.999f);
|
m_vecMoveRes = CVector(0.7f, 0.998f, 0.999f);
|
||||||
m_waterTurnDrag = CVector(0.85f, 0.96f, 0.96f);
|
m_vecTurnRes = CVector(0.85f, 0.96f, 0.96f);
|
||||||
_unk2 = false;
|
m_boat_unused3 = false;
|
||||||
|
|
||||||
m_fVolumeUnderWater = 7.0f;
|
m_fVolumeUnderWater = 7.0f;
|
||||||
m_fPrevVolumeUnderWater = 7.0f;
|
m_fPrevVolumeUnderWater = 7.0f;
|
||||||
@ -79,7 +79,7 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
|
|||||||
|
|
||||||
bIsInWater = true;
|
bIsInWater = true;
|
||||||
|
|
||||||
m_phys_unused1 = 0.0f;
|
m_boat_unused2 = 0;
|
||||||
m_bIsAnchored = true;
|
m_bIsAnchored = true;
|
||||||
m_fOrientation = INVALID_ORIENTATION;
|
m_fOrientation = INVALID_ORIENTATION;
|
||||||
bTouchingWater = true;
|
bTouchingWater = true;
|
||||||
@ -290,7 +290,7 @@ CBoat::ProcessControl(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle boat moving forward
|
// Handle boat moving forward
|
||||||
if(Abs(m_fGasPedal) > 0.05f || m_vecMoveSpeed.Magnitude() > 0.01f){
|
if(Abs(m_fGasPedal) > 0.05f || m_vecMoveSpeed.Magnitude2D() > 0.01f){
|
||||||
if(bBoatInWater)
|
if(bBoatInWater)
|
||||||
AddWakePoint(GetPosition());
|
AddWakePoint(GetPosition());
|
||||||
|
|
||||||
@ -299,7 +299,7 @@ CBoat::ProcessControl(void)
|
|||||||
steerFactor = 1.0f - DotProduct(m_vecMoveSpeed, GetForward())*0.3f;
|
steerFactor = 1.0f - DotProduct(m_vecMoveSpeed, GetForward())*0.3f;
|
||||||
if(steerFactor < 0.0f) steerFactor = 0.0f;
|
if(steerFactor < 0.0f) steerFactor = 0.0f;
|
||||||
|
|
||||||
CVector propeller(0.0f, -pHandling->Dimension.y*m_fPropellerY, -pHandling->Dimension.z*m_fPropellerZ);
|
CVector propeller(0.0f, -pHandling->Dimension.y*m_fThrustY, -pHandling->Dimension.z*m_fThrustZ);
|
||||||
propeller = Multiply3x3(GetMatrix(), propeller);
|
propeller = Multiply3x3(GetMatrix(), propeller);
|
||||||
CVector propellerWorld = GetPosition() + propeller;
|
CVector propellerWorld = GetPosition() + propeller;
|
||||||
|
|
||||||
@ -396,7 +396,7 @@ CBoat::ProcessControl(void)
|
|||||||
}
|
}
|
||||||
}else if(!onLand){
|
}else if(!onLand){
|
||||||
float force = 50.0f*DotProduct(m_vecMoveSpeed, GetForward());
|
float force = 50.0f*DotProduct(m_vecMoveSpeed, GetForward());
|
||||||
if(force > 10.0f) force = 10.0f;
|
force = Min(force, 10.0f);
|
||||||
CVector propellerForce = propellerDepth * Multiply3x3(GetMatrix(), force*CVector(-steerSin, 0.0f, 0.0f));
|
CVector propellerForce = propellerDepth * Multiply3x3(GetMatrix(), force*CVector(-steerSin, 0.0f, 0.0f));
|
||||||
ApplyMoveForce(propellerForce * CTimer::GetTimeStep()*0.5f);
|
ApplyMoveForce(propellerForce * CTimer::GetTimeStep()*0.5f);
|
||||||
ApplyTurnForce(propellerForce * CTimer::GetTimeStep()*0.5f, propeller);
|
ApplyTurnForce(propellerForce * CTimer::GetTimeStep()*0.5f, propeller);
|
||||||
@ -415,9 +415,9 @@ CBoat::ProcessControl(void)
|
|||||||
ApplyWaterResistance();
|
ApplyWaterResistance();
|
||||||
|
|
||||||
// No idea what exactly is going on here besides drag in YZ
|
// No idea what exactly is going on here besides drag in YZ
|
||||||
float fx = Pow(m_waterTurnDrag.x, CTimer::GetTimeStep());
|
float fx = Pow(m_vecTurnRes.x, CTimer::GetTimeStep());
|
||||||
float fy = Pow(m_waterTurnDrag.y, CTimer::GetTimeStep());
|
float fy = Pow(m_vecTurnRes.y, CTimer::GetTimeStep());
|
||||||
float fz = Pow(m_waterTurnDrag.z, CTimer::GetTimeStep());
|
float fz = Pow(m_vecTurnRes.z, CTimer::GetTimeStep());
|
||||||
m_vecTurnSpeed = Multiply3x3(m_vecTurnSpeed, GetMatrix()); // invert - to local space
|
m_vecTurnSpeed = Multiply3x3(m_vecTurnSpeed, GetMatrix()); // invert - to local space
|
||||||
// TODO: figure this out
|
// TODO: figure this out
|
||||||
float magic = 1.0f/(1000.0f * SQR(m_vecTurnSpeed.x) + 1.0f) * fx;
|
float magic = 1.0f/(1000.0f * SQR(m_vecTurnSpeed.x) + 1.0f) * fx;
|
||||||
@ -525,7 +525,7 @@ CBoat::ProcessControl(void)
|
|||||||
// is this some inlined CPlaceable method?
|
// is this some inlined CPlaceable method?
|
||||||
CVector pos = GetPosition();
|
CVector pos = GetPosition();
|
||||||
GetMatrix().RotateZ(m_fOrientation - GetForward().Heading());
|
GetMatrix().RotateZ(m_fOrientation - GetForward().Heading());
|
||||||
GetMatrix().GetPosition() = pos;
|
GetMatrix().SetTranslateOnly(pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,12 +562,12 @@ CBoat::ApplyWaterResistance(void)
|
|||||||
{
|
{
|
||||||
float fwdSpeed = DotProduct(GetMoveSpeed(), GetForward());
|
float fwdSpeed = DotProduct(GetMoveSpeed(), GetForward());
|
||||||
// TODO: figure out how this works
|
// TODO: figure out how this works
|
||||||
float magic = (SQR(fwdSpeed) + 0.05f) * (0.001f * SQR(m_fVolumeUnderWater) * m_fMass) + 1.0f;
|
float resistance = 0.001f * SQR(m_fVolumeUnderWater) * m_fMass;
|
||||||
|
float magic = (SQR(fwdSpeed) + 0.05f) * resistance + 1.0f;
|
||||||
magic = Abs(magic);
|
magic = Abs(magic);
|
||||||
// FRAMETIME
|
float fx = Pow(m_vecMoveRes.x/magic, 0.5f*CTimer::GetTimeStep());
|
||||||
float fx = Pow(m_waterMoveDrag.x/magic, 0.5f*CTimer::GetTimeStep());
|
float fy = Pow(m_vecMoveRes.y/magic, 0.5f*CTimer::GetTimeStep());
|
||||||
float fy = Pow(m_waterMoveDrag.y/magic, 0.5f*CTimer::GetTimeStep());
|
float fz = Pow(m_vecMoveRes.z/magic, 0.5f*CTimer::GetTimeStep());
|
||||||
float fz = Pow(m_waterMoveDrag.z/magic, 0.5f*CTimer::GetTimeStep());
|
|
||||||
|
|
||||||
m_vecMoveSpeed = Multiply3x3(m_vecMoveSpeed, GetMatrix()); // invert - to local space
|
m_vecMoveSpeed = Multiply3x3(m_vecMoveSpeed, GetMatrix()); // invert - to local space
|
||||||
m_vecMoveSpeed.x *= fx;
|
m_vecMoveSpeed.x *= fx;
|
||||||
@ -685,7 +685,7 @@ CBoat::BlowUpCar(CEntity *culprit)
|
|||||||
dist.Normalise();
|
dist.Normalise();
|
||||||
if(GetUp().z > 0.0f)
|
if(GetUp().z > 0.0f)
|
||||||
dist += GetUp();
|
dist += GetUp();
|
||||||
obj->GetMatrix().GetPosition() += GetUp();
|
obj->GetMatrix().GetPosition() += dist;
|
||||||
|
|
||||||
CWorld::Add(obj);
|
CWorld::Add(obj);
|
||||||
|
|
||||||
@ -707,7 +707,7 @@ CBoat::Render()
|
|||||||
matrix.Attach(RwFrameGetMatrix(m_aBoatNodes[BOAT_MOVING]));
|
matrix.Attach(RwFrameGetMatrix(m_aBoatNodes[BOAT_MOVING]));
|
||||||
|
|
||||||
CVector pos = matrix.GetPosition();
|
CVector pos = matrix.GetPosition();
|
||||||
matrix.SetRotateZ(m_fMovingHiRotation);
|
matrix.SetRotateZ(m_fMovingRotation);
|
||||||
matrix.Translate(pos);
|
matrix.Translate(pos);
|
||||||
|
|
||||||
matrix.UpdateRW();
|
matrix.UpdateRW();
|
||||||
@ -715,20 +715,20 @@ CBoat::Render()
|
|||||||
RpAtomicRender((RpAtomic*)GetFirstObject(m_aBoatNodes[BOAT_MOVING]));
|
RpAtomicRender((RpAtomic*)GetFirstObject(m_aBoatNodes[BOAT_MOVING]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_fMovingHiRotation += 0.05f;
|
m_fMovingRotation += 0.05f;
|
||||||
((CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->SetVehicleColour(m_currentColour1, m_currentColour2);
|
((CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->SetVehicleColour(m_currentColour1, m_currentColour2);
|
||||||
if (!CVehicle::bWheelsOnlyCheat)
|
if (!CVehicle::bWheelsOnlyCheat)
|
||||||
CEntity::Render();
|
CEntity::Render();
|
||||||
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[0], 255, 255, 255, 255);
|
|
||||||
KeepWaterOutIndices[0] = 0;
|
KeepWaterOutIndices[0] = 0;
|
||||||
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[1], 255, 255, 255, 255);
|
|
||||||
KeepWaterOutIndices[1] = 2;
|
KeepWaterOutIndices[1] = 2;
|
||||||
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[2], 255, 255, 255, 255);
|
|
||||||
KeepWaterOutIndices[2] = 1;
|
KeepWaterOutIndices[2] = 1;
|
||||||
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[3], 255, 255, 255, 255);
|
|
||||||
KeepWaterOutIndices[3] = 1;
|
KeepWaterOutIndices[3] = 1;
|
||||||
KeepWaterOutIndices[4] = 2;
|
KeepWaterOutIndices[4] = 2;
|
||||||
KeepWaterOutIndices[5] = 3;
|
KeepWaterOutIndices[5] = 3;
|
||||||
|
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[0], 255, 255, 255, 255);
|
||||||
|
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[1], 255, 255, 255, 255);
|
||||||
|
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[2], 255, 255, 255, 255);
|
||||||
|
RwIm3DVertexSetRGBA(&KeepWaterOutVertices[3], 255, 255, 255, 255);
|
||||||
switch (GetModelIndex()) {
|
switch (GetModelIndex()) {
|
||||||
case MI_SPEEDER:
|
case MI_SPEEDER:
|
||||||
RwIm3DVertexSetPos(&KeepWaterOutVertices[0], -1.15f, 3.61f, 1.03f);
|
RwIm3DVertexSetPos(&KeepWaterOutVertices[0], -1.15f, 3.61f, 1.03f);
|
||||||
|
@ -6,33 +6,34 @@ enum eBoatNodes
|
|||||||
{
|
{
|
||||||
BOAT_MOVING = 1,
|
BOAT_MOVING = 1,
|
||||||
BOAT_RUDDER,
|
BOAT_RUDDER,
|
||||||
BOAT_WINDSCREEN
|
BOAT_WINDSCREEN,
|
||||||
|
NUM_BOAT_NODES
|
||||||
};
|
};
|
||||||
|
|
||||||
class CBoat : public CVehicle
|
class CBoat : public CVehicle
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// 0x288
|
// 0x288
|
||||||
float m_fPropellerZ;
|
float m_fThrustZ;
|
||||||
float m_fPropellerY;
|
float m_fThrustY;
|
||||||
CVector m_waterMoveDrag;
|
CVector m_vecMoveRes;
|
||||||
CVector m_waterTurnDrag;
|
CVector m_vecTurnRes;
|
||||||
float m_fMovingHiRotation;
|
float m_fMovingRotation;
|
||||||
int32 _unk0;
|
int32 m_boat_unused1;
|
||||||
RwFrame *m_aBoatNodes[4];
|
RwFrame *m_aBoatNodes[NUM_BOAT_NODES];
|
||||||
uint8 bBoatInWater : 1;
|
uint8 bBoatInWater : 1;
|
||||||
uint8 bPropellerInWater : 1;
|
uint8 bPropellerInWater : 1;
|
||||||
bool m_bIsAnchored;
|
bool m_bIsAnchored;
|
||||||
float m_fOrientation;
|
float m_fOrientation;
|
||||||
int32 _unk1;
|
int32 m_boat_unused2;
|
||||||
float m_fDamage;
|
float m_fDamage;
|
||||||
CEntity *m_pSetOnFireEntity;
|
CEntity *m_pSetOnFireEntity;
|
||||||
bool _unk2;
|
bool m_boat_unused3;
|
||||||
float m_fAccelerate;
|
float m_fAccelerate;
|
||||||
float m_fBrake;
|
float m_fBrake;
|
||||||
float m_fSteeringLeftRight;
|
float m_fSteeringLeftRight;
|
||||||
uint8 m_nPadID;
|
uint8 m_nPadID;
|
||||||
int32 _unk3;
|
int32 m_boat_unused4;
|
||||||
float m_fVolumeUnderWater;
|
float m_fVolumeUnderWater;
|
||||||
CVector m_vecBuoyancePoint;
|
CVector m_vecBuoyancePoint;
|
||||||
float m_fPrevVolumeUnderWater;
|
float m_fPrevVolumeUnderWater;
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
cBuoyancy mod_Buoyancy;
|
cBuoyancy mod_Buoyancy;
|
||||||
|
|
||||||
static float fVolMultiplier = 1.0f;
|
float fVolMultiplier = 1.0f;
|
||||||
// amount of boat volume in bounding box
|
// amount of boat volume in bounding box
|
||||||
// 1.0-volume is the empty space in the bbox
|
// 1.0-volume is the empty space in the bbox
|
||||||
static float fBoatVolumeDistribution[9] = {
|
float fBoatVolumeDistribution[9] = {
|
||||||
// rear
|
// rear
|
||||||
0.75f, 0.9f, 0.75f,
|
0.75f, 0.9f, 0.75f,
|
||||||
0.95f, 1.0f, 0.95f,
|
0.95f, 1.0f, 0.95f,
|
||||||
|
Loading…
Reference in New Issue
Block a user