mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 06:59:18 +02:00
stars object, interrior lighting level as accessible parameter for dynamic object
This commit is contained in:
23
DynObj.cpp
23
DynObj.cpp
@@ -3807,9 +3807,26 @@ void TDynamicObject::Render()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // wersja Display Lists
|
{ // wersja Display Lists
|
||||||
if (mdLowPolyInt)
|
if( mdLowPolyInt ) {
|
||||||
if (FreeFlyModeFlag ? true : !mdKabina || !bDisplayCab)
|
// low poly interior
|
||||||
mdLowPolyInt->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
if( FreeFlyModeFlag ? true : !mdKabina || !bDisplayCab ) {
|
||||||
|
// enable cab light if needed
|
||||||
|
if( InteriorLightLevel > 0.0f ) {
|
||||||
|
|
||||||
|
// crude way to light the cabin, until we have something more complete in place
|
||||||
|
auto const cablight = InteriorLight * InteriorLightLevel;
|
||||||
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &cablight.x );
|
||||||
|
}
|
||||||
|
|
||||||
|
mdLowPolyInt->Render( ObjSqrDist, ReplacableSkinID, iAlpha );
|
||||||
|
|
||||||
|
if( InteriorLightLevel > 0.0f ) {
|
||||||
|
// reset the overall ambient
|
||||||
|
GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
mdModel->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
mdModel->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||||
if (mdLoad) // renderowanie nieprzezroczystego ładunku
|
if (mdLoad) // renderowanie nieprzezroczystego ładunku
|
||||||
mdLoad->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
mdLoad->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||||
|
|||||||
17
DynObj.h
17
DynObj.h
@@ -140,11 +140,10 @@ class TAnim
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
class TDynamicObject
|
class TDynamicObject { // klasa pojazdu
|
||||||
{ // klasa pojazdu
|
private: // położenie pojazdu w świecie oraz parametry ruchu
|
||||||
private: // położenie pojazdu w świecie oraz parametry ruchu
|
|
||||||
vector3 vPosition; // Ra: pozycja pojazdu liczona zaraz po przesunięciu
|
vector3 vPosition; // Ra: pozycja pojazdu liczona zaraz po przesunięciu
|
||||||
vector3 vCoulpler[2]; // współrzędne sprzęgów do liczenia zderzeń czołowych
|
vector3 vCoulpler[ 2 ]; // współrzędne sprzęgów do liczenia zderzeń czołowych
|
||||||
vector3 vUp, vFront, vLeft; // wektory jednostkowe ustawienia pojazdu
|
vector3 vUp, vFront, vLeft; // wektory jednostkowe ustawienia pojazdu
|
||||||
int iDirection; // kierunek pojazdu względem czoła składu (1=zgodny,0=przeciwny)
|
int iDirection; // kierunek pojazdu względem czoła składu (1=zgodny,0=przeciwny)
|
||||||
TTrackShape ts; // parametry toru przekazywane do fizyki
|
TTrackShape ts; // parametry toru przekazywane do fizyki
|
||||||
@@ -156,10 +155,10 @@ class TDynamicObject
|
|||||||
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
|
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
|
||||||
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
|
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
|
||||||
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
|
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
|
||||||
TDynamicObject * ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer,
|
TDynamicObject * ABuFindNearestObject( TTrack *Track, TDynamicObject *MyPointer,
|
||||||
int &CouplNr);
|
int &CouplNr );
|
||||||
|
|
||||||
public: // parametry położenia pojazdu dostępne publicznie
|
public: // parametry położenia pojazdu dostępne publicznie
|
||||||
std::string asTrack; // nazwa toru początkowego; wywalić?
|
std::string asTrack; // nazwa toru początkowego; wywalić?
|
||||||
std::string asDestination; // dokąd pojazd ma być kierowany "(stacja):(tor)"
|
std::string asDestination; // dokąd pojazd ma być kierowany "(stacja):(tor)"
|
||||||
matrix4x4 mMatrix; // macierz przekształcenia do renderowania modeli
|
matrix4x4 mMatrix; // macierz przekształcenia do renderowania modeli
|
||||||
@@ -175,12 +174,14 @@ class TDynamicObject
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// returns type of the nearest functional power source present in the trainset
|
// returns type of the nearest functional power source present in the trainset
|
||||||
public: // modele składowe pojazdu
|
public: // modele składowe pojazdu
|
||||||
TModel3d *mdModel; // model pudła
|
TModel3d *mdModel; // model pudła
|
||||||
TModel3d *mdLoad; // model zmiennego ładunku
|
TModel3d *mdLoad; // model zmiennego ładunku
|
||||||
TModel3d *mdPrzedsionek; // model przedsionków dla EZT - może użyć mdLoad zamiast?
|
TModel3d *mdPrzedsionek; // model przedsionków dla EZT - może użyć mdLoad zamiast?
|
||||||
TModel3d *mdKabina; // model kabiny dla użytkownika; McZapkie-030303: to z train.h
|
TModel3d *mdKabina; // model kabiny dla użytkownika; McZapkie-030303: to z train.h
|
||||||
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
||||||
|
float3 InteriorLight{ 0.9f * 255.0f / 255.0f, 0.9f * 216.0f / 255.0f, 0.9f * 176.0f / 255.0f }; // tungsten light. TODO: allow definition of light type?
|
||||||
|
float InteriorLightLevel{ 0.0f }; // current level of interior lighting
|
||||||
float fShade; // zacienienie: 0:normalnie, -1:w ciemności, +1:dodatkowe światło (brak koloru?)
|
float fShade; // zacienienie: 0:normalnie, -1:w ciemności, +1:dodatkowe światło (brak koloru?)
|
||||||
|
|
||||||
private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe
|
private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecności rozsz
|
|||||||
bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5
|
bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5
|
||||||
*/
|
*/
|
||||||
double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
|
double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
|
||||||
|
float Global::SunAngle = 0.0f;
|
||||||
int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki
|
int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki
|
||||||
HWND Global::hWnd = NULL; // uchwyt okna
|
HWND Global::hWnd = NULL; // uchwyt okna
|
||||||
int Global::ScreenWidth = 1;
|
int Global::ScreenWidth = 1;
|
||||||
|
|||||||
@@ -258,6 +258,7 @@ class Global
|
|||||||
static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5
|
static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5
|
||||||
*/
|
*/
|
||||||
static double fLuminance; // jasność światła do automatycznego zapalania
|
static double fLuminance; // jasność światła do automatycznego zapalania
|
||||||
|
static float SunAngle; // angle of the sun relative to horizon
|
||||||
static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji
|
static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji
|
||||||
static HWND hWnd; // uchwyt okna
|
static HWND hWnd; // uchwyt okna
|
||||||
static int ScreenWidth; // current window dimensions. TODO: move it to renderer
|
static int ScreenWidth; // current window dimensions. TODO: move it to renderer
|
||||||
|
|||||||
15
Model3d.cpp
15
Model3d.cpp
@@ -742,7 +742,7 @@ void TSubModel::DisplayLists()
|
|||||||
glNewList(uiDisplayList, GL_COMPILE);
|
glNewList(uiDisplayList, GL_COMPILE);
|
||||||
GfxRenderer.Bind(0); // tekstury nie ma
|
GfxRenderer.Bind(0); // tekstury nie ma
|
||||||
glColorMaterial(GL_FRONT, GL_EMISSION);
|
glColorMaterial(GL_FRONT, GL_EMISSION);
|
||||||
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly
|
// glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
for (int i = 0; i < iNumVerts; i++)
|
for (int i = 0; i < iNumVerts; i++)
|
||||||
{
|
{
|
||||||
@@ -751,7 +751,7 @@ void TSubModel::DisplayLists()
|
|||||||
glVertex3fv(&Vertices[i].Point.x);
|
glVertex3fv(&Vertices[i].Point.x);
|
||||||
};
|
};
|
||||||
glEnd();
|
glEnd();
|
||||||
glEnable(GL_LIGHTING);
|
// glEnable(GL_LIGHTING);
|
||||||
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
|
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
|
||||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||||
glEndList();
|
glEndList();
|
||||||
@@ -816,10 +816,13 @@ void TSubModel::InitialRotate(bool doit)
|
|||||||
Vertices[i].Point.y = Vertices[i].Point.z;
|
Vertices[i].Point.y = Vertices[i].Point.z;
|
||||||
Vertices[i].Point.z = t;
|
Vertices[i].Point.z = t;
|
||||||
// wektory normalne również trzeba przekształcić, bo się źle oświetlają
|
// wektory normalne również trzeba przekształcić, bo się źle oświetlają
|
||||||
Vertices[i].Normal.x = -Vertices[i].Normal.x; // zmiana znaku X
|
if( eType != TP_STARS ) {
|
||||||
t = Vertices[i].Normal.y; // zamiana Y i Z
|
// gwiazdki mają kolory zamiast normalnych, to // ich wtedy nie ruszamy
|
||||||
Vertices[i].Normal.y = Vertices[i].Normal.z;
|
Vertices[ i ].Normal.x = -Vertices[ i ].Normal.x; // zmiana znaku X
|
||||||
Vertices[i].Normal.z = t;
|
t = Vertices[ i ].Normal.y; // zamiana Y i Z
|
||||||
|
Vertices[ i ].Normal.y = Vertices[ i ].Normal.z;
|
||||||
|
Vertices[ i ].Normal.z = t;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (Child)
|
if (Child)
|
||||||
Child->InitialRotate(doit); // potomne ewentualnie obrócimy
|
Child->InitialRotate(doit); // potomne ewentualnie obrócimy
|
||||||
|
|||||||
34
Train.cpp
34
Train.cpp
@@ -5001,6 +5001,40 @@ bool TTrain::Update( double const Deltatime )
|
|||||||
btHaslerBrakes.Turn(DynamicObject->MoverParameters->BrakePress > 0.4); // ciśnienie w cylindrach
|
btHaslerBrakes.Turn(DynamicObject->MoverParameters->BrakePress > 0.4); // ciśnienie w cylindrach
|
||||||
btHaslerCurrent.Turn(DynamicObject->MoverParameters->Im != 0.0); // prąd na silnikach
|
btHaslerCurrent.Turn(DynamicObject->MoverParameters->Im != 0.0); // prąd na silnikach
|
||||||
|
|
||||||
|
// calculate current level of interior illumination
|
||||||
|
// TODO: organize it along with rest of train update in a more sensible arrangement
|
||||||
|
switch( iCabLightFlag ) // Ra: uzeleżnic od napięcia w obwodzie sterowania
|
||||||
|
{ // hunter-091012: uzaleznienie jasnosci od przetwornicy
|
||||||
|
case 0: {
|
||||||
|
//światło wewnętrzne zgaszone
|
||||||
|
DynamicObject->InteriorLightLevel = 0.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
//światło wewnętrzne przygaszone (255 216 176)
|
||||||
|
if( mvOccupied->ConverterFlag == true ) {
|
||||||
|
// jasnosc dla zalaczonej przetwornicy
|
||||||
|
DynamicObject->InteriorLightLevel = 0.75f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DynamicObject->InteriorLightLevel = 0.375f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
//światło wewnętrzne zapalone (255 216 176)
|
||||||
|
if( mvOccupied->ConverterFlag ==
|
||||||
|
true ) // jasnosc dla zalaczonej przetwornicy
|
||||||
|
{
|
||||||
|
DynamicObject->InteriorLightLevel = 1.0f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DynamicObject->InteriorLightLevel = 0.5f;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_updated = true;
|
m_updated = true;
|
||||||
return true; //(DynamicObject->Update(dt));
|
return true; //(DynamicObject->Update(dt));
|
||||||
} // koniec update
|
} // koniec update
|
||||||
|
|||||||
168
World.cpp
168
World.cpp
@@ -590,8 +590,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
|
|||||||
|
|
||||||
Ground.Init(Global::SceneryFile, hDC);
|
Ground.Init(Global::SceneryFile, hDC);
|
||||||
// Global::tSinceStart= 0;
|
// Global::tSinceStart= 0;
|
||||||
Sun.init();
|
Environment.init();
|
||||||
Clouds.Init();
|
|
||||||
WriteLog("Ground init OK");
|
WriteLog("Ground init OK");
|
||||||
if (Global::detonatoryOK)
|
if (Global::detonatoryOK)
|
||||||
{
|
{
|
||||||
@@ -1195,7 +1194,7 @@ bool TWorld::Update()
|
|||||||
Global::fClockAngleDeg[4] = 36.0 * (GlobalTime->hh % 10); // jednostki godzin
|
Global::fClockAngleDeg[4] = 36.0 * (GlobalTime->hh % 10); // jednostki godzin
|
||||||
Global::fClockAngleDeg[5] = 36.0 * (GlobalTime->hh / 10); // dziesiątki godzin
|
Global::fClockAngleDeg[5] = 36.0 * (GlobalTime->hh / 10); // dziesiątki godzin
|
||||||
|
|
||||||
Update_Lights();
|
Update_Environment();
|
||||||
} // koniec działań niewykonywanych podczas pauzy
|
} // koniec działań niewykonywanych podczas pauzy
|
||||||
// poprzednie jakoś tam działało
|
// poprzednie jakoś tam działało
|
||||||
double dt = Timer::GetDeltaRenderTime(); // nie uwzględnia pauzowania ani mnożenia czasu
|
double dt = Timer::GetDeltaRenderTime(); // nie uwzględnia pauzowania ani mnożenia czasu
|
||||||
@@ -1433,7 +1432,7 @@ TWorld::Update_Camera( double const Deltatime ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TWorld::Update_Lights() {
|
void TWorld::Update_Environment() {
|
||||||
|
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||||
|
|
||||||
@@ -1532,44 +1531,8 @@ void TWorld::Update_Lights() {
|
|||||||
glFogfv( GL_FOG_COLOR, Global::FogColor ); // kolor mgły
|
glFogfv( GL_FOG_COLOR, Global::FogColor ); // kolor mgły
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
Sun.update();
|
Environment.update();
|
||||||
auto const position = Sun.getPosition();
|
|
||||||
// update skydome with current sun position
|
|
||||||
SkyDome.Update( position );
|
|
||||||
auto const skydomecolour = SkyDome.GetAverageColor();
|
|
||||||
auto const skydomehsv = RGBtoHSV( skydomecolour );
|
|
||||||
// update sunlight object
|
|
||||||
Global::DayLight.position[0] = position.x;
|
|
||||||
Global::DayLight.position[1] = position.y;
|
|
||||||
Global::DayLight.position[2] = position.z;
|
|
||||||
|
|
||||||
Global::DayLight.direction = -1.0 * Sun.getDirection();
|
|
||||||
|
|
||||||
auto const intensity = std::min( 0.05f + Sun.getIntensity() + skydomehsv.z, 1.25f );
|
|
||||||
|
|
||||||
Global::DayLight.diffuse[ 0 ] = intensity * 255.0f / 255.0f;
|
|
||||||
Global::DayLight.diffuse[ 1 ] = intensity * 242.0f / 255.0f;
|
|
||||||
Global::DayLight.diffuse[ 2 ] = intensity * 231.0f / 255.0f;
|
|
||||||
// Global::DayLight.diffuse[ 3 ] = 1.0f;// std::min( 0.15f + intensity, 1.0f );
|
|
||||||
Global::DayLight.ambient[ 0 ] = skydomecolour.x;
|
|
||||||
Global::DayLight.ambient[ 1 ] = skydomecolour.y;
|
|
||||||
Global::DayLight.ambient[ 2 ] = skydomecolour.z;
|
|
||||||
/*
|
|
||||||
Global::DayLight.ambient[ 0 ] = 155.0 / 255.0 * intensity * 0.75f;
|
|
||||||
Global::DayLight.ambient[ 1 ] = 192.0 / 255.0 * intensity * 0.75f;
|
|
||||||
Global::DayLight.ambient[ 2 ] = 231.0 / 255.0 * intensity * 0.75f;
|
|
||||||
*/
|
|
||||||
// Global::DayLight.ambient[ 3 ] = 1.0f;
|
|
||||||
|
|
||||||
Global::fLuminance = intensity;
|
|
||||||
|
|
||||||
Global::FogColor[ 0 ] = skydomecolour.x;
|
|
||||||
Global::FogColor[ 1 ] = skydomecolour.y;
|
|
||||||
Global::FogColor[ 2 ] = skydomecolour.z;
|
|
||||||
glFogfv( GL_FOG_COLOR, Global::FogColor ); // kolor mgły
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glClearColor( skydomecolour.x, skydomecolour.y, skydomecolour.z, 1.0f ); // kolor nieba
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TWorld::Render()
|
bool TWorld::Render()
|
||||||
@@ -1588,31 +1551,9 @@ bool TWorld::Render()
|
|||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
Camera.SetMatrix(); // ustawienie macierzy kamery względem początku scenerii
|
Camera.SetMatrix(); // ustawienie macierzy kamery względem początku scenerii
|
||||||
|
|
||||||
if( !Global::bWireFrame ) { // bez nieba w trybie rysowania linii
|
if( !Global::bWireFrame ) {
|
||||||
|
// bez nieba w trybie rysowania linii
|
||||||
glDisable( GL_LIGHTING );
|
Environment.render();
|
||||||
glDisable( GL_FOG );
|
|
||||||
glDisable( GL_DEPTH_TEST );
|
|
||||||
glDepthMask( GL_FALSE );
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef( Global::pCameraPosition.x, Global::pCameraPosition.y, Global::pCameraPosition.z );
|
|
||||||
|
|
||||||
SkyDome.Render();
|
|
||||||
// Clouds.Render();
|
|
||||||
|
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
|
||||||
glLightfv( GL_LIGHT0, GL_POSITION, Global::lightPos );
|
|
||||||
#else
|
|
||||||
Sun.render();
|
|
||||||
Global::DayLight.apply_angle();
|
|
||||||
Global::DayLight.apply_intensity();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glPopMatrix();
|
|
||||||
glDepthMask( GL_TRUE );
|
|
||||||
glEnable( GL_DEPTH_TEST );
|
|
||||||
glEnable( GL_FOG );
|
|
||||||
glEnable( GL_LIGHTING );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Global::bUseVBO)
|
if (Global::bUseVBO)
|
||||||
@@ -1759,7 +1700,7 @@ TWorld::Render_Cab() {
|
|||||||
float z = i * i * i * 0.01f;//25/4;
|
float z = i * i * i * 0.01f;//25/4;
|
||||||
//float C = (36 - i*0.5)*0.005*(1.5 - sqrt(ddl));
|
//float C = (36 - i*0.5)*0.005*(1.5 - sqrt(ddl));
|
||||||
float C = ( 36 - i*0.5 )*0.005*sqrt( ( 1 / sqrt( Global::fLuminance + 0.015 ) ) - 1 ) * frontlightstrength;
|
float C = ( 36 - i*0.5 )*0.005*sqrt( ( 1 / sqrt( Global::fLuminance + 0.015 ) ) - 1 ) * frontlightstrength;
|
||||||
glColor4f( C, C, C, 0.35f );// *frontlightstrength );
|
glColor4f( C, C, C, 1.0f );// *frontlightstrength );
|
||||||
glTexCoord2f( 0, 0 ); glVertex3f( -10 / 2 - 2 * i / 4, 6.0 + 0.3*z, 13 + 1.7*z / 3 );
|
glTexCoord2f( 0, 0 ); glVertex3f( -10 / 2 - 2 * i / 4, 6.0 + 0.3*z, 13 + 1.7*z / 3 );
|
||||||
glTexCoord2f( 1, 0 ); glVertex3f( 10 / 2 + 2 * i / 4, 6.0 + 0.3*z, 13 + 1.7*z / 3 );
|
glTexCoord2f( 1, 0 ); glVertex3f( 10 / 2 + 2 * i / 4, 6.0 + 0.3*z, 13 + 1.7*z / 3 );
|
||||||
glTexCoord2f( 1, 1 ); glVertex3f( 10 / 2 + 2 * i / 4, -5.0 - 0.5*z, 13 + 1.7*z / 3 );
|
glTexCoord2f( 1, 1 ); glVertex3f( 10 / 2 + 2 * i / 4, -5.0 - 0.5*z, 13 + 1.7*z / 3 );
|
||||||
@@ -1880,6 +1821,13 @@ TWorld::Render_Cab() {
|
|||||||
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientCabLight );
|
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientCabLight );
|
||||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseCabLight );
|
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseCabLight );
|
||||||
glLightfv( GL_LIGHT0, GL_SPECULAR, specularCabLight );
|
glLightfv( GL_LIGHT0, GL_SPECULAR, specularCabLight );
|
||||||
|
#else
|
||||||
|
if( dynamic->InteriorLightLevel > 0.0f ) {
|
||||||
|
|
||||||
|
// crude way to light the cabin, until we have something more complete in place
|
||||||
|
auto const cablight = dynamic->InteriorLight * dynamic->InteriorLightLevel;
|
||||||
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &cablight.x );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if( Global::bUseVBO ) { // renderowanie z użyciem VBO
|
if( Global::bUseVBO ) { // renderowanie z użyciem VBO
|
||||||
dynamic->mdKabina->RaRender( 0.0, dynamic->ReplacableSkinID, dynamic->iAlpha );
|
dynamic->mdKabina->RaRender( 0.0, dynamic->ReplacableSkinID, dynamic->iAlpha );
|
||||||
@@ -1895,6 +1843,12 @@ TWorld::Render_Cab() {
|
|||||||
glLightfv( GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight );
|
glLightfv( GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight );
|
||||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight );
|
glLightfv( GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight );
|
||||||
glLightfv( GL_LIGHT0, GL_SPECULAR, Global::specularDayLight );
|
glLightfv( GL_LIGHT0, GL_SPECULAR, Global::specularDayLight );
|
||||||
|
#else
|
||||||
|
if( dynamic->InteriorLightLevel > 0.0f ) {
|
||||||
|
// reset the overall ambient
|
||||||
|
GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -2365,6 +2319,8 @@ TWorld::Render_UI() {
|
|||||||
" " +
|
" " +
|
||||||
std::string( "S SEE NEN NWW SW" )
|
std::string( "S SEE NEN NWW SW" )
|
||||||
.substr( 1 + 2 * floor( fmod( 8 + ( Camera.Yaw + 0.5 * M_PI_4 ) / M_PI_4, 8 ) ), 2 );
|
.substr( 1 + 2 * floor( fmod( 8 + ( Camera.Yaw + 0.5 * M_PI_4 ) / M_PI_4, 8 ) ), 2 );
|
||||||
|
// current luminance level
|
||||||
|
OutText2 = "Light level: " + to_string( Global::fLuminance, 3 );
|
||||||
}
|
}
|
||||||
// OutText3= AnsiString(" Online documentation (PL, ENG, DE, soon CZ):
|
// OutText3= AnsiString(" Online documentation (PL, ENG, DE, soon CZ):
|
||||||
// http://www.eu07.pl");
|
// http://www.eu07.pl");
|
||||||
@@ -3060,3 +3016,81 @@ void TWorld::CabChange(TDynamicObject *old, TDynamicObject *now)
|
|||||||
Global::changeDynObj = now; // uruchomienie protezy
|
Global::changeDynObj = now; // uruchomienie protezy
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void
|
||||||
|
world_environment::init() {
|
||||||
|
|
||||||
|
m_sun.init();
|
||||||
|
m_stars.init();
|
||||||
|
m_clouds.Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
world_environment::update() {
|
||||||
|
|
||||||
|
// move sun...
|
||||||
|
m_sun.update();
|
||||||
|
auto const position = m_sun.getPosition();
|
||||||
|
// ...update the global data to match new sun state...
|
||||||
|
Global::SunAngle = m_sun.getAngle();
|
||||||
|
Global::DayLight.position[ 0 ] = position.x;
|
||||||
|
Global::DayLight.position[ 1 ] = position.y;
|
||||||
|
Global::DayLight.position[ 2 ] = position.z;
|
||||||
|
Global::DayLight.direction = -1.0 * m_sun.getDirection();
|
||||||
|
// ...update skydome to match the current sun position as well...
|
||||||
|
m_skydome.Update( position );
|
||||||
|
// ...retrieve current sky colour and brightness...
|
||||||
|
auto const skydomecolour = m_skydome.GetAverageColor();
|
||||||
|
auto const skydomehsv = RGBtoHSV( skydomecolour );
|
||||||
|
auto const intensity = std::min( 0.05f + m_sun.getIntensity() + skydomehsv.z, 1.25f );
|
||||||
|
// ...update light colours and intensity.
|
||||||
|
// NOTE: intensity combines intensity of the sun and the light reflected by the sky dome
|
||||||
|
// it'd be more technically correct to have just the intensity of the sun here,
|
||||||
|
// but whether it'd _look_ better is something to be tested
|
||||||
|
Global::DayLight.diffuse[ 0 ] = intensity * 255.0f / 255.0f;
|
||||||
|
Global::DayLight.diffuse[ 1 ] = intensity * 242.0f / 255.0f;
|
||||||
|
Global::DayLight.diffuse[ 2 ] = intensity * 231.0f / 255.0f;
|
||||||
|
|
||||||
|
Global::DayLight.ambient[ 0 ] = skydomecolour.x;
|
||||||
|
Global::DayLight.ambient[ 1 ] = skydomecolour.y;
|
||||||
|
Global::DayLight.ambient[ 2 ] = skydomecolour.z;
|
||||||
|
|
||||||
|
Global::fLuminance = intensity;
|
||||||
|
|
||||||
|
// update the fog. setting it to match the average colour of the sky dome is cheap
|
||||||
|
// but quite effective way to make the distant items blend with background better
|
||||||
|
Global::FogColor[ 0 ] = skydomecolour.x;
|
||||||
|
Global::FogColor[ 1 ] = skydomecolour.y;
|
||||||
|
Global::FogColor[ 2 ] = skydomecolour.z;
|
||||||
|
::glFogfv( GL_FOG_COLOR, Global::FogColor ); // kolor mgły
|
||||||
|
|
||||||
|
::glClearColor( skydomecolour.x, skydomecolour.y, skydomecolour.z, 1.0f ); // kolor nieba
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
world_environment::render() {
|
||||||
|
|
||||||
|
::glDisable( GL_LIGHTING );
|
||||||
|
::glDisable( GL_FOG );
|
||||||
|
::glDisable( GL_DEPTH_TEST );
|
||||||
|
::glDepthMask( GL_FALSE );
|
||||||
|
::glPushMatrix();
|
||||||
|
::glTranslatef( Global::pCameraPosition.x, Global::pCameraPosition.y, Global::pCameraPosition.z );
|
||||||
|
|
||||||
|
m_skydome.Render();
|
||||||
|
m_stars.render();
|
||||||
|
// m_clouds.Render();
|
||||||
|
|
||||||
|
if( DebugModeFlag == true ) {
|
||||||
|
// mark sun position for easier debugging
|
||||||
|
m_sun.render();
|
||||||
|
}
|
||||||
|
Global::DayLight.apply_angle();
|
||||||
|
Global::DayLight.apply_intensity();
|
||||||
|
|
||||||
|
::glPopMatrix();
|
||||||
|
::glDepthMask( GL_TRUE );
|
||||||
|
::glEnable( GL_DEPTH_TEST );
|
||||||
|
::glEnable( GL_FOG );
|
||||||
|
::glEnable( GL_LIGHTING );
|
||||||
|
}
|
||||||
|
|||||||
23
World.h
23
World.h
@@ -14,9 +14,25 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "Ground.h"
|
#include "Ground.h"
|
||||||
#include "sky.h"
|
#include "sky.h"
|
||||||
#include "sun.h"
|
#include "sun.h"
|
||||||
|
#include "stars.h"
|
||||||
#include "skydome.h"
|
#include "skydome.h"
|
||||||
#include "mczapkie/mover.h"
|
#include "mczapkie/mover.h"
|
||||||
|
|
||||||
|
// wrapper for environment elements -- sky, sun, stars, clouds etc
|
||||||
|
class world_environment {
|
||||||
|
|
||||||
|
public:
|
||||||
|
void init();
|
||||||
|
void update();
|
||||||
|
void render();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CSkyDome m_skydome;
|
||||||
|
cStars m_stars;
|
||||||
|
cSun m_sun;
|
||||||
|
TSky m_clouds;
|
||||||
|
};
|
||||||
|
|
||||||
class TWorld
|
class TWorld
|
||||||
{
|
{
|
||||||
void InOutKey();
|
void InOutKey();
|
||||||
@@ -42,21 +58,19 @@ class TWorld
|
|||||||
std::string OutText2;
|
std::string OutText2;
|
||||||
std::string OutText3;
|
std::string OutText3;
|
||||||
std::string OutText4;
|
std::string OutText4;
|
||||||
void Update_Lights();
|
void Update_Environment();
|
||||||
void Update_Camera( const double Deltatime );
|
void Update_Camera( const double Deltatime );
|
||||||
bool Render();
|
bool Render();
|
||||||
void Render_Cab();
|
void Render_Cab();
|
||||||
void Render_UI();
|
void Render_UI();
|
||||||
TCamera Camera;
|
TCamera Camera;
|
||||||
TGround Ground;
|
TGround Ground;
|
||||||
|
world_environment Environment;
|
||||||
TTrain *Train;
|
TTrain *Train;
|
||||||
TDynamicObject *pDynamicNearest;
|
TDynamicObject *pDynamicNearest;
|
||||||
bool Paused;
|
bool Paused;
|
||||||
GLuint base; // numer DL dla znaków w napisach
|
GLuint base; // numer DL dla znaków w napisach
|
||||||
texture_manager::size_type light; // numer tekstury dla smugi
|
texture_manager::size_type light; // numer tekstury dla smugi
|
||||||
TSky Clouds;
|
|
||||||
CSkyDome SkyDome;
|
|
||||||
cSun Sun;
|
|
||||||
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
||||||
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów
|
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów
|
||||||
int iCheckFPS; // kiedy znów sprawdzić FPS, żeby wyłączać optymalizacji od razu do zera
|
int iCheckFPS; // kiedy znów sprawdzić FPS, żeby wyłączać optymalizacji od razu do zera
|
||||||
@@ -72,5 +86,6 @@ class TWorld
|
|||||||
void CreateE3D(std::string const &dir = "", bool dyn = false);
|
void CreateE3D(std::string const &dir = "", bool dyn = false);
|
||||||
void CabChange(TDynamicObject *old, TDynamicObject *now);
|
void CabChange(TDynamicObject *old, TDynamicObject *now);
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
4
color.h
4
color.h
@@ -7,9 +7,9 @@ float3
|
|||||||
XYZtoRGB( float3 const &XYZ ) {
|
XYZtoRGB( float3 const &XYZ ) {
|
||||||
|
|
||||||
// M^-1 for Adobe RGB from http://www.brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html
|
// M^-1 for Adobe RGB from http://www.brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html
|
||||||
// float const mi[ 3 ][ 3 ] = { 2.041369, -0.969266, 0.0134474, -0.5649464, 1.8760108, -0.1183897, -0.3446944, 0.041556, 1.0154096 };
|
float const mi[ 3 ][ 3 ] = { 2.041369, -0.969266, 0.0134474, -0.5649464, 1.8760108, -0.1183897, -0.3446944, 0.041556, 1.0154096 };
|
||||||
// m^-1 for sRGB:
|
// m^-1 for sRGB:
|
||||||
float const mi[ 3 ][ 3 ] = { 3.240479, -0.969256, 0.055648, -1.53715, 1.875991, -0.204043, -0.49853, 0.041556, 1.057311 };
|
// float const mi[ 3 ][ 3 ] = { 3.240479, -0.969256, 0.055648, -1.53715, 1.875991, -0.204043, -0.49853, 0.041556, 1.057311 };
|
||||||
|
|
||||||
return float3{
|
return float3{
|
||||||
XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ],
|
XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ],
|
||||||
|
|||||||
@@ -126,6 +126,7 @@
|
|||||||
<ClCompile Include="skydome.cpp" />
|
<ClCompile Include="skydome.cpp" />
|
||||||
<ClCompile Include="Sound.cpp" />
|
<ClCompile Include="Sound.cpp" />
|
||||||
<ClCompile Include="Spring.cpp" />
|
<ClCompile Include="Spring.cpp" />
|
||||||
|
<ClCompile Include="stars.cpp" />
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
@@ -191,6 +192,7 @@
|
|||||||
<ClInclude Include="skydome.h" />
|
<ClInclude Include="skydome.h" />
|
||||||
<ClInclude Include="Sound.h" />
|
<ClInclude Include="Sound.h" />
|
||||||
<ClInclude Include="Spring.h" />
|
<ClInclude Include="Spring.h" />
|
||||||
|
<ClInclude Include="stars.h" />
|
||||||
<ClInclude Include="stdafx.h" />
|
<ClInclude Include="stdafx.h" />
|
||||||
<ClInclude Include="sun.h" />
|
<ClInclude Include="sun.h" />
|
||||||
<ClInclude Include="targetver.h" />
|
<ClInclude Include="targetver.h" />
|
||||||
|
|||||||
@@ -198,6 +198,9 @@
|
|||||||
<ClCompile Include="skydome.cpp">
|
<ClCompile Include="skydome.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="stars.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="opengl\glew.h">
|
<ClInclude Include="opengl\glew.h">
|
||||||
@@ -386,6 +389,9 @@
|
|||||||
<ClInclude Include="color.h">
|
<ClInclude Include="color.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="stars.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="maszyna.rc">
|
<ResourceCompile Include="maszyna.rc">
|
||||||
|
|||||||
10
skydome.cpp
10
skydome.cpp
@@ -1,16 +1,11 @@
|
|||||||
//******************************************************************************//
|
|
||||||
// NightShine Engine //
|
|
||||||
// Sky : Gradient SkyDome Class //
|
|
||||||
//******************************************************************************//
|
|
||||||
// sky gradient based on "A practical analytic model for daylight"
|
|
||||||
// by A. J. Preetham Peter Shirley Brian Smits (University of Utah)
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "opengl/glew.h"
|
#include "opengl/glew.h"
|
||||||
#include "skydome.h"
|
#include "skydome.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
|
|
||||||
//******************************************************************************//
|
// sky gradient based on "A practical analytic model for daylight"
|
||||||
|
// by A. J. Preetham Peter Shirley Brian Smits (University of Utah)
|
||||||
|
|
||||||
float CSkyDome::m_distributionluminance[ 5 ][ 2 ] = { // Perez distributions
|
float CSkyDome::m_distributionluminance[ 5 ][ 2 ] = { // Perez distributions
|
||||||
{ 0.17872f , -1.46303f }, // a = darkening or brightening of the horizon
|
{ 0.17872f , -1.46303f }, // a = darkening or brightening of the horizon
|
||||||
@@ -316,6 +311,7 @@ void CSkyDome::RebuildColors() {
|
|||||||
color.z = 0.75f * std::max( color.z + m_sundirection.y, 0.075f );
|
color.z = 0.75f * std::max( color.z + m_sundirection.y, 0.075f );
|
||||||
color.x = 0.20f * color.z;
|
color.x = 0.20f * color.z;
|
||||||
color.y = 0.65f * color.z;
|
color.y = 0.65f * color.z;
|
||||||
|
color = color * ( 1.15f - vertex.y ); // simple gradient, darkening towards the top
|
||||||
}
|
}
|
||||||
|
|
||||||
// save
|
// save
|
||||||
|
|||||||
28
stars.cpp
Normal file
28
stars.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "stars.h"
|
||||||
|
#include "globals.h"
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cStars -- simple starfield model, simulating appearance of starry sky
|
||||||
|
|
||||||
|
void
|
||||||
|
cStars::init() {
|
||||||
|
|
||||||
|
m_stars.LoadFromFile( "models\\skydome_stars.t3d", false );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cStars::render() {
|
||||||
|
|
||||||
|
::glPushMatrix();
|
||||||
|
|
||||||
|
::glRotatef( m_latitude, 1.0f, 0.0f, 0.0f ); // ustawienie osi OY na północ
|
||||||
|
::glRotatef( -std::fmod( Global::fTimeAngleDeg, 360.0f ), 0.0f, 1.0f, 0.0f ); // obrót dobowy osi OX
|
||||||
|
|
||||||
|
::glPointSize( 2.0f );
|
||||||
|
m_stars.Render( 1.0 );
|
||||||
|
::glPointSize( 3.0f );
|
||||||
|
|
||||||
|
::glPopMatrix();
|
||||||
|
}
|
||||||
33
stars.h
Normal file
33
stars.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Model3d.h"
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cStars -- simple starfield model, simulating appearance of starry sky
|
||||||
|
|
||||||
|
class cStars {
|
||||||
|
|
||||||
|
public:
|
||||||
|
// types:
|
||||||
|
|
||||||
|
// methods:
|
||||||
|
void init();
|
||||||
|
void render();
|
||||||
|
|
||||||
|
// constructors:
|
||||||
|
|
||||||
|
// deconstructor:
|
||||||
|
|
||||||
|
// members:
|
||||||
|
|
||||||
|
private:
|
||||||
|
// types:
|
||||||
|
|
||||||
|
// methods:
|
||||||
|
|
||||||
|
// members:
|
||||||
|
float m_longitude{ 19.0f }; // geograpic coordinates hardcoded roughly to Poland location, for the time being
|
||||||
|
float m_latitude{ 52.0f };
|
||||||
|
TModel3d m_stars;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user