16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 20:59:19 +02:00
This commit is contained in:
VB
2017-03-08 16:45:51 +01:00
parent 53db1e51da
commit a6e3e00e08

View File

@@ -2382,7 +2382,7 @@ if
{ {
// McZapkie: poruszanie sie po kabinie, w updatemechpos zawarte sa wiezy // McZapkie: poruszanie sie po kabinie, w updatemechpos zawarte sa wiezy
auto step = 1.0f; auto step = 1.5f;
auto const camerayaw = Global::pCamera->Yaw; auto const camerayaw = Global::pCamera->Yaw;
Math3D::vector3 direction( 0.0f, 0.0f, step ); Math3D::vector3 direction( 0.0f, 0.0f, step );
direction.RotateY( camerayaw ); direction.RotateY( camerayaw );
@@ -2499,7 +2499,6 @@ void TTrain::OnKeyUp(int cKey)
} }
}; };
// cab movement update, fixed step part
void TTrain::UpdateMechPosition(double dt) void TTrain::UpdateMechPosition(double dt)
{ // Ra: mechanik powinien być { // Ra: mechanik powinien być
// telepany niezależnie od pozycji // telepany niezależnie od pozycji
@@ -2513,6 +2512,7 @@ void TTrain::UpdateMechPosition(double dt)
// - na postoju horyzont prosto, kabina skosem // - na postoju horyzont prosto, kabina skosem
// - przy szybkiej jeździe kabina prosto, horyzont pochylony // - przy szybkiej jeździe kabina prosto, horyzont pochylony
vector3 pNewMechPosition;
Math3D::vector3 shake; Math3D::vector3 shake;
// McZapkie: najpierw policzę pozycję w/m kabiny // McZapkie: najpierw policzę pozycję w/m kabiny
@@ -2524,7 +2524,7 @@ void TTrain::UpdateMechPosition(double dt)
if (!Global::iSlowMotion // musi być pełna prędkość if (!Global::iSlowMotion // musi być pełna prędkość
&& (pMechOffset.y < 4.0)) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza && (pMechOffset.y < 4.0)) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza
{ {
if( iVel > 0.5 ) { if( iVel > 0.0 ) {
// acceleration-driven base shake // acceleration-driven base shake
shake += 1.25 * MechSpring.ComputateForces( shake += 1.25 * MechSpring.ComputateForces(
vector3( vector3(
@@ -2539,14 +2539,14 @@ void TTrain::UpdateMechPosition(double dt)
vector3( vector3(
( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringX, ( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringX,
( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringY, ( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringY,
( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringZ ) ( Random( iVel * 2 ) - iVel ) / ( ( iVel * 2 ) * 4 ) * fMechSpringZ ),
* 1.25,
pMechShake ); pMechShake );
// * (( 200 - DynamicObject->MyTrack->iQualityFlag ) * 0.0075 ); // scale to 75-150% based on track quality // * (( 200 - DynamicObject->MyTrack->iQualityFlag ) * 0.0075 ); // scale to 75-150% based on track quality
} }
// shake *= 0.85; // shake *= 1.25;
} }
vMechVelocity -= (shake + vMechVelocity * 100) * (fMechSpringX + fMechSpringY + fMechSpringZ) / (200); vMechVelocity -= (shake + vMechVelocity * 100) * (fMechSpringX + fMechSpringY + fMechSpringZ) / (200);
// vMechVelocity -= vMechVelocity * iVel * dt;
// shake *= 0.95 * dt; // shake damping // shake *= 0.95 * dt; // shake damping
// McZapkie: // McZapkie:
@@ -2556,15 +2556,16 @@ void TTrain::UpdateMechPosition(double dt)
if ((pMechShake.y > fMechMaxSpring) || (pMechShake.y < -fMechMaxSpring)) if ((pMechShake.y > fMechMaxSpring) || (pMechShake.y < -fMechMaxSpring))
vMechVelocity.y = -vMechVelocity.y; vMechVelocity.y = -vMechVelocity.y;
// ABu011104: 5*pMechShake.y, zeby ladnie pudlem rzucalo :) // ABu011104: 5*pMechShake.y, zeby ladnie pudlem rzucalo :)
pMechPosition = pMechOffset + vector3( 1.5 * pMechShake.x, 2.0 * pMechShake.y, 1.5 * pMechShake.z ); pNewMechPosition = pMechOffset + vector3(1.5 * pMechShake.x, 2.0 * pMechShake.y, 1.5 * pMechShake.z);
vMechMovement = 0.5 * vMechMovement; // vMechMovement = 0.5 * vMechMovement;
} }
else { // hamowanie rzucania przy spadku FPS else
{ // hamowanie rzucania przy spadku FPS
pMechShake -= pMechShake * std::min(dt, 1.0); // po tym chyba potrafią zostać jakieś ułamki, które powodują zjazd pMechShake -= pMechShake * std::min(dt, 1.0); // po tym chyba potrafią zostać jakieś ułamki, które powodują zjazd
pMechOffset += vMechMovement * dt; pMechOffset += vMechMovement * dt;
vMechVelocity.y = 0.5 * vMechVelocity.y; vMechVelocity.y -= vMechVelocity.y * 50.0 * dt;
pMechPosition = pMechOffset + vector3( pMechShake.x, 5 * pMechShake.y, pMechShake.z ); pNewMechPosition = pMechOffset + vector3(pMechShake.x, 5 * pMechShake.y, pMechShake.z);
vMechMovement = 0.5 * vMechMovement; // vMechMovement = 0.5 * vMechMovement;
} }
// numer kabiny (-1: kabina B) // numer kabiny (-1: kabina B)
if (DynamicObject->Mechanik) // może nie być? if (DynamicObject->Mechanik) // może nie być?
@@ -2580,19 +2581,20 @@ void TTrain::UpdateMechPosition(double dt)
iCabn = (DynamicObject->MoverParameters->ActiveCab == -1 ? iCabn = (DynamicObject->MoverParameters->ActiveCab == -1 ?
2 : 2 :
DynamicObject->MoverParameters->ActiveCab); DynamicObject->MoverParameters->ActiveCab);
if( !DebugModeFlag ) { // sprawdzaj więzy //Ra: nie tu! if (!DebugModeFlag)
if( pMechPosition.x < Cabine[ iCabn ].CabPos1.x ) { // sprawdzaj więzy //Ra: nie tu!
pMechPosition.x = Cabine[ iCabn ].CabPos1.x; if (pNewMechPosition.x < Cabine[iCabn].CabPos1.x)
if( pMechPosition.x > Cabine[ iCabn ].CabPos2.x ) pNewMechPosition.x = Cabine[iCabn].CabPos1.x;
pMechPosition.x = Cabine[ iCabn ].CabPos2.x; if (pNewMechPosition.x > Cabine[iCabn].CabPos2.x)
if( pMechPosition.z < Cabine[ iCabn ].CabPos1.z ) pNewMechPosition.x = Cabine[iCabn].CabPos2.x;
pMechPosition.z = Cabine[ iCabn ].CabPos1.z; if (pNewMechPosition.z < Cabine[iCabn].CabPos1.z)
if( pMechPosition.z > Cabine[ iCabn ].CabPos2.z ) pNewMechPosition.z = Cabine[iCabn].CabPos1.z;
pMechPosition.z = Cabine[ iCabn ].CabPos2.z; if (pNewMechPosition.z > Cabine[iCabn].CabPos2.z)
if( pMechPosition.y > Cabine[ iCabn ].CabPos1.y + 1.8 ) pNewMechPosition.z = Cabine[iCabn].CabPos2.z;
pMechPosition.y = Cabine[ iCabn ].CabPos1.y + 1.8; if (pNewMechPosition.y > Cabine[iCabn].CabPos1.y + 1.8)
if( pMechPosition.y < Cabine[ iCabn ].CabPos1.y + 0.5 ) pNewMechPosition.y = Cabine[iCabn].CabPos1.y + 1.8;
pMechPosition.y = Cabine[ iCabn ].CabPos2.y + 0.5; if (pNewMechPosition.y < Cabine[iCabn].CabPos1.y + 0.5)
pNewMechPosition.y = Cabine[iCabn].CabPos2.y + 0.5;
if (pMechOffset.x < Cabine[iCabn].CabPos1.x) if (pMechOffset.x < Cabine[iCabn].CabPos1.x)
pMechOffset.x = Cabine[iCabn].CabPos1.x; pMechOffset.x = Cabine[iCabn].CabPos1.x;
@@ -2607,16 +2609,25 @@ void TTrain::UpdateMechPosition(double dt)
if (pMechOffset.y < Cabine[iCabn].CabPos1.y + 0.5) if (pMechOffset.y < Cabine[iCabn].CabPos1.y + 0.5)
pMechOffset.y = Cabine[iCabn].CabPos2.y + 0.5; pMechOffset.y = Cabine[iCabn].CabPos2.y + 0.5;
} }
}; pMechPosition = DynamicObject->mMatrix *
pNewMechPosition; // położenie względem środka pojazdu w układzie scenerii
pMechPosition += DynamicObject->GetPosition();
// returns position of the mechanic in the scene coordinates // framerate-independent speed reduction that doesn't break at high framerates...
vector3 Math3D::vector3 movementslowdown = vMechMovement * 35 * dt;
TTrain::GetWorldMechPosition() { if( movementslowdown.LengthSquared() >= vMechMovement.LengthSquared() ) {
// if the reduction vector exceeds speed movement we're running at low fps,
vector3 position = DynamicObject->mMatrix *pMechPosition; // położenie względem środka pojazdu w układzie scenerii // fallback on the old behaviour
position += DynamicObject->GetPosition(); vMechMovement *= 0.5;
return position;
} }
else {
vMechMovement -= movementslowdown;
if( vMechMovement.LengthSquared() < 0.01 ) {
vMechMovement = Math3D::vector3();
}
}
};
bool TTrain::Update( double const Deltatime ) bool TTrain::Update( double const Deltatime )
{ {