16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 17:29:18 +02:00

merge fixes (but still buggy)

This commit is contained in:
VB
2017-04-24 23:02:37 +02:00
parent ca207a9be5
commit 061be38219
2 changed files with 166 additions and 199 deletions

View File

@@ -3313,6 +3313,7 @@ if
} }
} }
// 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
@@ -3326,7 +3327,6 @@ 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
@@ -3338,7 +3338,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.0 ) { if( iVel > 0.5 ) {
// acceleration-driven base shake // acceleration-driven base shake
shake += 1.25 * MechSpring.ComputateForces( shake += 1.25 * MechSpring.ComputateForces(
vector3( vector3(
@@ -3353,14 +3353,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 *= 1.25; // shake *= 0.85;
} }
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:
@@ -3373,8 +3373,7 @@ void TTrain::UpdateMechPosition(double dt)
pMechPosition = pMechOffset + vector3( 1.5 * pMechShake.x, 2.0 * pMechShake.y, 1.5 * pMechShake.z ); pMechPosition = pMechOffset + vector3( 1.5 * pMechShake.x, 2.0 * pMechShake.y, 1.5 * pMechShake.z );
// vMechMovement = 0.5 * vMechMovement; // vMechMovement = 0.5 * vMechMovement;
} }
else else { // hamowanie rzucania przy spadku FPS
{ // 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 = 0.5 * vMechVelocity.y;
@@ -3395,20 +3394,19 @@ 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) if( !DebugModeFlag ) { // sprawdzaj więzy //Ra: nie tu!
{ // sprawdzaj więzy //Ra: nie tu! if( pMechPosition.x < Cabine[ iCabn ].CabPos1.x )
if (pNewMechPosition.x < Cabine[iCabn].CabPos1.x) pMechPosition.x = Cabine[ iCabn ].CabPos1.x;
pNewMechPosition.x = Cabine[iCabn].CabPos1.x; if( pMechPosition.x > Cabine[ iCabn ].CabPos2.x )
if (pNewMechPosition.x > Cabine[iCabn].CabPos2.x) pMechPosition.x = Cabine[ iCabn ].CabPos2.x;
pNewMechPosition.x = Cabine[iCabn].CabPos2.x; if( pMechPosition.z < Cabine[ iCabn ].CabPos1.z )
if (pNewMechPosition.z < Cabine[iCabn].CabPos1.z) pMechPosition.z = Cabine[ iCabn ].CabPos1.z;
pNewMechPosition.z = Cabine[iCabn].CabPos1.z; if( pMechPosition.z > Cabine[ iCabn ].CabPos2.z )
if (pNewMechPosition.z > Cabine[iCabn].CabPos2.z) pMechPosition.z = Cabine[ iCabn ].CabPos2.z;
pNewMechPosition.z = Cabine[iCabn].CabPos2.z; if( pMechPosition.y > Cabine[ iCabn ].CabPos1.y + 1.8 )
if (pNewMechPosition.y > Cabine[iCabn].CabPos1.y + 1.8) pMechPosition.y = Cabine[ iCabn ].CabPos1.y + 1.8;
pNewMechPosition.y = Cabine[iCabn].CabPos1.y + 1.8; if( pMechPosition.y < Cabine[ iCabn ].CabPos1.y + 0.5 )
if (pNewMechPosition.y < Cabine[iCabn].CabPos1.y + 0.5) pMechPosition.y = Cabine[ iCabn ].CabPos2.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;
@@ -3423,26 +3421,17 @@ 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();
// framerate-independent speed reduction that doesn't break at high framerates...
Math3D::vector3 movementslowdown = vMechMovement * 35 * dt;
if( movementslowdown.LengthSquared() >= vMechMovement.LengthSquared() ) {
// if the reduction vector exceeds speed movement we're running at low fps,
// fallback on the old behaviour
vMechMovement *= 0.5;
}
else {
vMechMovement -= movementslowdown;
if( vMechMovement.LengthSquared() < 0.01 ) {
vMechMovement = Math3D::vector3();
}
}
}; };
// returns position of the mechanic in the scene coordinates
vector3
TTrain::GetWorldMechPosition() {
vector3 position = DynamicObject->mMatrix *pMechPosition; // położenie względem środka pojazdu w układzie scenerii
position += DynamicObject->GetPosition();
return position;
}
bool TTrain::Update( double const Deltatime ) bool TTrain::Update( double const Deltatime )
{ {
// check for sent user commands // check for sent user commands

156
World.cpp
View File

@@ -13,12 +13,8 @@ http://mozilla.org/MPL/2.0/.
*/ */
#include "stdafx.h" #include "stdafx.h"
#include "World.h" #include "World.h"
#include "GL/glew.h"
#include "GL/glut.h"
#include "Globals.h" #include "Globals.h"
#include "Logs.h" #include "Logs.h"
#include "MdlMngr.h" #include "MdlMngr.h"
@@ -454,7 +450,7 @@ void TWorld::OnKeyDown(int cKey)
// TODO: redo the input system // TODO: redo the input system
if( ( cKey >= GLFW_KEY_0 ) && ( cKey <= GLFW_KEY_9 ) ) // klawisze cyfrowe if( ( cKey >= GLFW_KEY_0 ) && ( cKey <= GLFW_KEY_9 ) ) // klawisze cyfrowe
{ {
int i = cKey - '0'; // numer klawisza int i = cKey - GLFW_KEY_0; // numer klawisza
if (Global::shiftState) if (Global::shiftState)
{ // z [Shift] uruchomienie eventu { // z [Shift] uruchomienie eventu
if (!Global::iPause) // podczas pauzy klawisze nie działają if (!Global::iPause) // podczas pauzy klawisze nie działają
@@ -466,8 +462,9 @@ void TWorld::OnKeyDown(int cKey)
if( ( Global::iTextMode != GLFW_KEY_F12 ) && if( ( Global::iTextMode != GLFW_KEY_F12 ) &&
( Global::iTextMode != GLFW_KEY_F3 ) ) // ograniczamy użycie kamer ( Global::iTextMode != GLFW_KEY_F3 ) ) // ograniczamy użycie kamer
{ {
if ((!Global::FreeCameraInit[i].x && !Global::FreeCameraInit[i].y && if ((!Global::FreeCameraInit[i].x)
!Global::FreeCameraInit[i].z)) && (!Global::FreeCameraInit[i].y)
&& (!Global::FreeCameraInit[i].z))
{ // jeśli kamera jest w punkcie zerowym, zapamiętanie współrzędnych i kątów { // jeśli kamera jest w punkcie zerowym, zapamiętanie współrzędnych i kątów
Global::FreeCameraInit[i] = Camera.Pos; Global::FreeCameraInit[i] = Camera.Pos;
Global::FreeCameraInitAngle[i].x = Camera.Pitch; Global::FreeCameraInitAngle[i].x = Camera.Pitch;
@@ -475,15 +472,13 @@ void TWorld::OnKeyDown(int cKey)
Global::FreeCameraInitAngle[i].z = Camera.Roll; Global::FreeCameraInitAngle[i].z = Camera.Roll;
// logowanie, żeby można było do scenerii przepisać // logowanie, żeby można było do scenerii przepisać
WriteLog( WriteLog(
"camera " + std::to_string( Global::FreeCameraInit[i].x ) + " " + "camera " + std::to_string( Global::FreeCameraInit[i].x ) + " "
std::to_string(Global::FreeCameraInit[i].y ) + " " + + std::to_string(Global::FreeCameraInit[i].y ) + " "
std::to_string(Global::FreeCameraInit[i].z ) + " " + + std::to_string(Global::FreeCameraInit[i].z ) + " "
std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].x)) + + std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].x)) + " "
" " + + std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].y)) + " "
std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].y)) + + std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].z)) + " "
" " + + std::to_string(i) + " endcamera");
std::to_string(RadToDeg(Global::FreeCameraInitAngle[i].z)) +
" " + std::to_string(i) + " endcamera");
} }
else // również przeskakiwanie else // również przeskakiwanie
{ // Ra: to z tą kamerą (Camera.Pos i Global::pCameraPosition) jest trochę bez sensu { // Ra: to z tą kamerą (Camera.Pos i Global::pCameraPosition) jest trochę bez sensu
@@ -496,7 +491,7 @@ void TWorld::OnKeyDown(int cKey)
} }
// będzie jeszcze załączanie sprzęgów z [Ctrl] // będzie jeszcze załączanie sprzęgów z [Ctrl]
} }
else if (cKey >= GLFW_KEY_F1 && cKey <= GLFW_KEY_F12) else if( ( cKey >= GLFW_KEY_F1 ) && ( cKey <= GLFW_KEY_F12 ) )
{ {
switch (cKey) { switch (cKey) {
@@ -512,8 +507,8 @@ void TWorld::OnKeyDown(int cKey)
simulation::Time.update( 5.0 * 60.0 ); simulation::Time.update( 5.0 * 60.0 );
} }
} }
if( (!Global::ctrlState) if( ( false == Global::ctrlState )
&& (!Global::shiftState) ) { && ( false == Global::shiftState ) ) {
// czas i relacja // czas i relacja
if( Global::iTextMode == cKey ) { ++Global::iScreenMode[ cKey - GLFW_KEY_F1 ]; } if( Global::iTextMode == cKey ) { ++Global::iScreenMode[ cKey - GLFW_KEY_F1 ]; }
if( Global::iScreenMode[ cKey - GLFW_KEY_F1 ] > 1 ) { if( Global::iScreenMode[ cKey - GLFW_KEY_F1 ] > 1 ) {
@@ -665,12 +660,12 @@ void TWorld::OnKeyDown(int cKey)
break; break;
} }
} }
// if (cKey!=GLFW_KEY_F4) // if (cKey!=VK_F4)
return; // nie są przekazywane do pojazdu wcale return; // nie są przekazywane do pojazdu wcale
} }
if( Global::iTextMode == GLFW_KEY_F10 ) // wyświetlone napisy klawiszem F10 if( Global::iTextMode == GLFW_KEY_F10 ) // wyświetlone napisy klawiszem F10
{ // i potwierdzenie { // i potwierdzenie
if( cKey == 'Y' ) { if( cKey == GLFW_KEY_Y ) {
// flaga wyjścia z programu // flaga wyjścia z programu
::PostQuitMessage( 0 ); ::PostQuitMessage( 0 );
// Global::iTextMode = -1; // Global::iTextMode = -1;
@@ -681,9 +676,9 @@ void TWorld::OnKeyDown(int cKey)
{ // tryb konfiguracji debugmode (przestawianie kamery już wyłączone { // tryb konfiguracji debugmode (przestawianie kamery już wyłączone
if (!Global::shiftState) // bez [Shift] if (!Global::shiftState) // bez [Shift]
{ {
if (cKey == '1') if (cKey == GLFW_KEY_1)
Global::iWriteLogEnabled ^= 1; // włącz/wyłącz logowanie do pliku Global::iWriteLogEnabled ^= 1; // włącz/wyłącz logowanie do pliku
else if (cKey == '2') else if (cKey == GLFW_KEY_2)
{ // włącz/wyłącz okno konsoli { // włącz/wyłącz okno konsoli
Global::iWriteLogEnabled ^= 2; Global::iWriteLogEnabled ^= 2;
if ((Global::iWriteLogEnabled & 2) == 0) // nie było okienka if ((Global::iWriteLogEnabled & 2) == 0) // nie było okienka
@@ -711,10 +706,10 @@ void TWorld::OnKeyDown(int cKey)
if (Controlled->MoverParameters->Radio) if (Controlled->MoverParameters->Radio)
Ground.RadioStop(Camera.Pos); Ground.RadioStop(Camera.Pos);
} }
else if (!Global::iPause) //||(cKey==GLFW_KEY_F4)) //podczas pauzy sterownaie nie działa, F4 tak else if (!Global::iPause) //||(cKey==VK_F4)) //podczas pauzy sterownaie nie działa, F4 tak
if (Train) if (Train)
if (Controlled) if (Controlled)
if ((Controlled->Controller == Humandriver) ? true : DebugModeFlag || (cKey == 'Q')) if ((Controlled->Controller == Humandriver) ? true : DebugModeFlag || (cKey == GLFW_KEY_Q))
Train->OnKeyDown(cKey); // przekazanie klawisza do kabiny Train->OnKeyDown(cKey); // przekazanie klawisza do kabiny
if (FreeFlyModeFlag) // aby nie odluźniało wagonu za lokomotywą if (FreeFlyModeFlag) // aby nie odluźniało wagonu za lokomotywą
{ // operacje wykonywane na dowolnym pojeździe, przeniesione tu z kabiny { // operacje wykonywane na dowolnym pojeździe, przeniesione tu z kabiny
@@ -931,25 +926,19 @@ void TWorld::FollowView(bool wycisz)
} }
else if (Train) else if (Train)
{ // korekcja ustawienia w kabinie - OK { // korekcja ustawienia w kabinie - OK
vector3 camStara = vector3 camStara = Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
// Ra: czy to tu jest potrzebne, bo przelicza się kawałek dalej? // Ra: czy to tu jest potrzebne, bo przelicza się kawałek dalej?
Camera.Pos = Train->pMechPosition; // Train.GetPosition1(); Camera.Pos = Train->pMechPosition; // Train.GetPosition1();
Camera.Roll = atan(Train->pMechShake.x * Train->fMechRoll); // hustanie kamery na boki Camera.Roll = std::atan(Train->pMechShake.x * Train->fMechRoll); // hustanie kamery na boki
Camera.Pitch -= Camera.Pitch -= 0.5 * std::atan(Train->vMechVelocity.z * Train->fMechPitch); // hustanie kamery przod tyl
atan(Train->vMechVelocity.z * Train->fMechPitch); // hustanie kamery przod tyl
if (Train->Dynamic()->MoverParameters->ActiveCab == 0) if (Train->Dynamic()->MoverParameters->ActiveCab == 0)
Camera.LookAt = Train->pMechPosition + Train->GetDirection(); Camera.LookAt = Train->pMechPosition + Train->GetDirection() * 5.0;
else // patrz w strone wlasciwej kabiny else // patrz w strone wlasciwej kabiny
Camera.LookAt = Camera.LookAt = Train->pMechPosition + Train->GetDirection() * 5.0 * Train->Dynamic()->MoverParameters->ActiveCab;
Train->pMechPosition +
Train->GetDirection() * Train->Dynamic()->MoverParameters->ActiveCab;
Train->pMechOffset.x = Train->pMechSittingPosition.x; Train->pMechOffset.x = Train->pMechSittingPosition.x;
Train->pMechOffset.y = Train->pMechSittingPosition.y; Train->pMechOffset.y = Train->pMechSittingPosition.y;
Train->pMechOffset.z = Train->pMechSittingPosition.z; Train->pMechOffset.z = Train->pMechSittingPosition.z;
Global::SetCameraPosition( Global::SetCameraPosition( Train->Dynamic() ->GetPosition()); // tu ustawić nową, bo od niej liczą się odległości
Train->Dynamic()
->GetPosition()); // tu ustawić nową, bo od niej liczą się odległości
if (wycisz) // trzymanie prawego w kabinie daje marny efekt if (wycisz) // trzymanie prawego w kabinie daje marny efekt
Ground.Silence(camStara); // wyciszenie dźwięków z poprzedniej pozycji Ground.Silence(camStara); // wyciszenie dźwięków z poprzedniej pozycji
} }
@@ -1016,8 +1005,8 @@ bool TWorld::Update()
} }
*/ */
/* /*
// NOTE: until we have no physics state interpolation during render, we need to rely on the old code // NOTE: until we have no physics state interpolation during render, we need to rely on the old code,
// doing fixed step calculations but flexible step render results in ugly mini jitter // as doing fixed step calculations but flexible step render results in ugly mini jitter
// core routines (physics) // core routines (physics)
int updatecount = 0; int updatecount = 0;
while( ( m_primaryupdateaccumulator >= m_primaryupdaterate ) while( ( m_primaryupdateaccumulator >= m_primaryupdaterate )
@@ -1107,7 +1096,7 @@ bool TWorld::Update()
// fixed step render time routines // fixed step render time routines
fTime50Hz += dt; // w pauzie też trzeba zliczać czas, bo przy dużym FPS będzie problem z odczytem ramek fTime50Hz += dt; // w pauzie też trzeba zliczać czas, bo przy dużym FPS będzie problem z odczytem ramek
if( fTime50Hz >= 0.2 ) { while( fTime50Hz >= 1.0 / 50.0 ) {
Console::Update(); // to i tak trzeba wywoływać Console::Update(); // to i tak trzeba wywoływać
Update_UI(); Update_UI();
@@ -1132,8 +1121,7 @@ bool TWorld::Update()
}; };
void void
TWorld::Update_Camera( double const Deltatime ) TWorld::Update_Camera( double const Deltatime ) {
{
// Console::Update(); //tu jest zależne od FPS, co nie jest korzystne // Console::Update(); //tu jest zależne od FPS, co nie jest korzystne
if( glfwGetMouseButton( window, GLFW_MOUSE_BUTTON_LEFT ) == GLFW_PRESS ) { if( glfwGetMouseButton( window, GLFW_MOUSE_BUTTON_LEFT ) == GLFW_PRESS ) {
@@ -1176,56 +1164,52 @@ TWorld::Update_Camera( double const Deltatime )
} }
Camera.Update(); // uwzględnienie ruchu wywołanego klawiszami Camera.Update(); // uwzględnienie ruchu wywołanego klawiszami
/*
if( Camera.Type == tp_Follow ) { if( Camera.Type == tp_Follow ) {
if( Train ) { // jeśli jazda w kabinie, przeliczyć trzeba parametry kamery if( Train ) { // jeśli jazda w kabinie, przeliczyć trzeba parametry kamery
Train->UpdateMechPosition( Deltatime / Train->UpdateMechPosition( Deltatime /
Global::fTimeSpeed ); // ograniczyć telepanie po przyspieszeniu Global::fTimeSpeed ); // ograniczyć telepanie po przyspieszeniu
vector3 tempangle; */
double modelrotate; if( (Train != nullptr)
tempangle = && (Camera.Type == tp_Follow )) {
Controlled->VectorFront() * ( Controlled->MoverParameters->ActiveCab == -1 ? -1 : 1 ); // jeśli jazda w kabinie, przeliczyć trzeba parametry kamery
modelrotate = atan2( -tempangle.x, tempangle.z ); vector3 tempangle = Controlled->VectorFront() * ( Controlled->MoverParameters->ActiveCab == -1 ? -1 : 1 );
if( Global::ctrlState ? ( Console::Pressed( Global::Keys[ k_MechLeft ] ) || double modelrotate = atan2( -tempangle.x, tempangle.z );
Console::Pressed( Global::Keys[ k_MechRight ] ) ) :
false ) { // jeśli lusterko lewe albo prawe (bez rzucania na razie) if( (Global::ctrlState)
&& ( (Console::Pressed( Global::Keys[ k_MechLeft ])
|| (Console::Pressed( Global::Keys[ k_MechRight ]))))) {
// jeśli lusterko lewe albo prawe (bez rzucania na razie)
bool lr = Console::Pressed( Global::Keys[ k_MechLeft ] ); bool lr = Console::Pressed( Global::Keys[ k_MechLeft ] );
// Camera.Yaw powinno być wyzerowane, aby po powrocie patrzeć do przodu // Camera.Yaw powinno być wyzerowane, aby po powrocie patrzeć do przodu
Camera.Pos = Camera.Pos = Controlled->GetPosition() + Train->MirrorPosition( lr ); // pozycja lusterka
Controlled->GetPosition() + Train->MirrorPosition( lr ); // pozycja lusterka
Camera.Yaw = 0; // odchylenie na bok od Camera.LookAt Camera.Yaw = 0; // odchylenie na bok od Camera.LookAt
if( Train->Dynamic()->MoverParameters->ActiveCab == 0 ) if( Train->Dynamic()->MoverParameters->ActiveCab == 0 )
Camera.LookAt = Camera.Pos - Train->GetDirection(); // gdy w korytarzu Camera.LookAt = Camera.Pos - Train->GetDirection(); // gdy w korytarzu
else if( Global::shiftState ) { // patrzenie w bok przez szybę else if( Global::shiftState ) {
Camera.LookAt = Camera.Pos - // patrzenie w bok przez szybę
( lr ? -1 : 1 ) * Train->Dynamic()->VectorLeft() * Camera.LookAt = Camera.Pos - ( lr ? -1 : 1 ) * Train->Dynamic()->VectorLeft() * Train->Dynamic()->MoverParameters->ActiveCab;
Train->Dynamic()->MoverParameters->ActiveCab;
Global::SetCameraRotation( -modelrotate ); Global::SetCameraRotation( -modelrotate );
} }
else { // patrzenie w kierunku osi pojazdu, z uwzględnieniem kabiny - jakby z lusterka, else { // patrzenie w kierunku osi pojazdu, z uwzględnieniem kabiny - jakby z lusterka,
// ale bez odbicia // ale bez odbicia
Camera.LookAt = Camera.Pos - Camera.LookAt = Camera.Pos - Train->GetDirection() * Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1
Train->GetDirection() * Global::SetCameraRotation( M_PI - modelrotate ); // tu już trzeba uwzględnić lusterka
Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1
Global::SetCameraRotation( M_PI -
modelrotate ); // tu już trzeba uwzględnić lusterka
} }
Camera.Roll = Camera.Roll = std::atan( Train->pMechShake.x * Train->fMechRoll ); // hustanie kamery na boki
atan( Train->pMechShake.x * Train->fMechRoll ); // hustanie kamery na boki Camera.Pitch = 0.5 * std::atan( Train->vMechVelocity.z * Train->fMechPitch ); // hustanie kamery przod tyl
Camera.Pitch =
atan( Train->vMechVelocity.z * Train->fMechPitch ); // hustanie kamery przod tyl
Camera.vUp = Controlled->VectorUp(); Camera.vUp = Controlled->VectorUp();
} }
else { // patrzenie standardowe else {
Camera.Pos = Train->pMechPosition; // Train.GetPosition1(); // patrzenie standardowe
Camera.Pos = Train->GetWorldMechPosition(); // Train.GetPosition1();
if( !Global::iPause ) { // podczas pauzy nie przeliczać kątów przypadkowymi wartościami if( !Global::iPause ) { // podczas pauzy nie przeliczać kątów przypadkowymi wartościami
Camera.Roll = Camera.Roll = atan( Train->pMechShake.x * Train->fMechRoll ); // hustanie kamery na boki
atan( Train->pMechShake.x * Train->fMechRoll ); // hustanie kamery na boki Camera.Pitch -= 0.5 * atan( Train->vMechVelocity.z * Train->fMechPitch ); // hustanie kamery przod tyl //Ra: tu
Camera.Pitch -= atan( Train->vMechVelocity.z *
Train->fMechPitch ); // hustanie kamery przod tyl //Ra: tu
// jest uciekanie kamery w górę!!! // jest uciekanie kamery w górę!!!
} }
// ABu011104: rzucanie pudlem // ABu011104: rzucanie pudlem
/*
vector3 temp; vector3 temp;
if( abs( Train->pMechShake.y ) < 0.25 ) if( abs( Train->pMechShake.y ) < 0.25 )
temp = vector3( 0, 0, 6 * Train->pMechShake.y ); temp = vector3( 0, 0, 6 * Train->pMechShake.y );
@@ -1236,17 +1220,14 @@ TWorld::Update_Camera( double const Deltatime )
if( Controlled ) if( Controlled )
Controlled->ABuSetModelShake( temp ); Controlled->ABuSetModelShake( temp );
// ABu: koniec rzucania // ABu: koniec rzucania
*/
if( Train->Dynamic()->MoverParameters->ActiveCab == 0 ) if( Train->Dynamic()->MoverParameters->ActiveCab == 0 )
Camera.LookAt = Train->pMechPosition + Train->GetDirection(); // gdy w korytarzu Camera.LookAt = Train->GetWorldMechPosition() + Train->GetDirection() * 5.0; // gdy w korytarzu
else // patrzenie w kierunku osi pojazdu, z uwzględnieniem kabiny else // patrzenie w kierunku osi pojazdu, z uwzględnieniem kabiny
Camera.LookAt = Train->pMechPosition + Camera.LookAt = Train->GetWorldMechPosition() + Train->GetDirection() * 5.0 * Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1
Train->GetDirection() *
Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1
Camera.vUp = Train->GetUp(); Camera.vUp = Train->GetUp();
Global::SetCameraRotation( Camera.Yaw - Global::SetCameraRotation( Camera.Yaw - modelrotate ); // tu już trzeba uwzględnić lusterka
modelrotate ); // tu już trzeba uwzględnić lusterka
}
} }
} }
else { // kamera nieruchoma else { // kamera nieruchoma
@@ -1462,7 +1443,7 @@ TWorld::Render_Cab() {
glBlendFunc( GL_DST_COLOR, GL_ONE ); glBlendFunc( GL_DST_COLOR, GL_ONE );
glDepthFunc( GL_GEQUAL ); glDepthFunc( GL_GEQUAL );
glAlphaFunc( GL_GREATER, 0.004f ); glAlphaFunc( GL_GREATER, 0.004 );
// glDisable(GL_DEPTH_TEST); // glDisable(GL_DEPTH_TEST);
glDisable( GL_LIGHTING ); glDisable( GL_LIGHTING );
glDisable( GL_FOG ); glDisable( GL_FOG );
@@ -1500,7 +1481,7 @@ TWorld::Render_Cab() {
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
// glEnable(GL_DEPTH_TEST); // glEnable(GL_DEPTH_TEST);
glAlphaFunc( GL_GREATER, 0.04f ); glAlphaFunc( GL_GREATER, 0.04 );
glDepthFunc( GL_LEQUAL ); glDepthFunc( GL_LEQUAL );
glEnable( GL_LIGHTING ); //i tak się włączy potem glEnable( GL_LIGHTING ); //i tak się włączy potem
glEnable( GL_FOG ); glEnable( GL_FOG );
@@ -1534,17 +1515,17 @@ TWorld::Render_Cab() {
case e_canyon: case e_canyon:
{ {
for( int li = 0; li < 3; li++ ) { for( int li = 0; li < 3; li++ ) {
diffuseCabLight[ li ] *= 0.6f; diffuseCabLight[ li ] *= 0.6;
specularCabLight[ li ] *= 0.7f; specularCabLight[ li ] *= 0.7;
} }
} }
break; break;
case e_tunnel: case e_tunnel:
{ {
for( int li = 0; li < 3; li++ ) { for( int li = 0; li < 3; li++ ) {
ambientCabLight[ li ] *= 0.3f; ambientCabLight[ li ] *= 0.3;
diffuseCabLight[ li ] *= 0.1f; diffuseCabLight[ li ] *= 0.1;
specularCabLight[ li ] *= 0.2f; specularCabLight[ li ] *= 0.2;
} }
} }
break; break;
@@ -2531,7 +2512,6 @@ TWorld::ToggleDaylight() {
void void
world_environment::init() { world_environment::init() {
m_skydome.init(); m_skydome.init();
m_sun.init(); m_sun.init();
m_moon.init(); m_moon.init();
@@ -2539,8 +2519,6 @@ world_environment::init() {
m_clouds.Init(); m_clouds.Init();
} }
extern TWorld World;
void void
world_environment::update() { world_environment::update() {
// move celestial bodies... // move celestial bodies...