mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 11:09:19 +02:00
maintenance: removed deprecated render code
This commit is contained in:
125
AnimModel.cpp
125
AnimModel.cpp
@@ -411,13 +411,7 @@ TAnimModel::TAnimModel()
|
||||
pModel = NULL;
|
||||
iNumLights = 0;
|
||||
fBlinkTimer = 0;
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
ReplacableSkinId[ 0 ] = 0;
|
||||
ReplacableSkinId[ 1 ] = 0;
|
||||
ReplacableSkinId[ 2 ] = 0;
|
||||
ReplacableSkinId[ 3 ] = 0;
|
||||
ReplacableSkinId[ 4 ] = 0;
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < iMaxNumLights; i++)
|
||||
{
|
||||
LightsOn[i] = LightsOff[i] = NULL; // normalnie nie ma
|
||||
@@ -443,28 +437,7 @@ bool TAnimModel::Init(TModel3d *pNewModel)
|
||||
pModel = pNewModel;
|
||||
return (pModel != NULL);
|
||||
}
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture)
|
||||
{
|
||||
if (asReplacableTexture.substr(0, 1) ==
|
||||
"*") // od gwiazdki zaczynają się teksty na wyświetlaczach
|
||||
asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu
|
||||
else if (asReplacableTexture != "none")
|
||||
ReplacableSkinId[1] =
|
||||
GfxRenderer.GetTextureId( asReplacableTexture, "" );
|
||||
if( ( ReplacableSkinId[ 1 ] != 0 )
|
||||
&& ( GfxRenderer.Texture( ReplacableSkinId[ 1 ] ).has_alpha ) ) {
|
||||
// tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
iTexAlpha = 0x31310031;
|
||||
}
|
||||
else{
|
||||
// tekstura nieprzezroczysta - nie renderować w cyklu
|
||||
iTexAlpha = 0x30300030;
|
||||
}
|
||||
// przezroczystych
|
||||
return (Init(TModelsManager::GetModel(asName)));
|
||||
}
|
||||
#else
|
||||
|
||||
bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture)
|
||||
{
|
||||
if (asReplacableTexture.substr(0, 1) ==
|
||||
@@ -485,7 +458,6 @@ bool TAnimModel::Init(std::string const &asName, std::string const &asReplacable
|
||||
// przezroczystych
|
||||
return (Init(TModelsManager::GetModel(asName)));
|
||||
}
|
||||
#endif
|
||||
|
||||
bool TAnimModel::Load(cParser *parser, bool ter)
|
||||
{ // rozpoznanie wpisu modelu i ustawienie świateł
|
||||
@@ -622,99 +594,18 @@ void TAnimModel::RaPrepare()
|
||||
// for (pCurrent=pRoot;pCurrent!=NULL;pCurrent=pCurrent->pNext) //albo osobny łańcuch
|
||||
// pCurrent->UpdateModelIK(); //przeliczenie odwrotnej kinematyki
|
||||
}
|
||||
/*
|
||||
void TAnimModel::RenderVBO(vector3 pPosition, double fAngle)
|
||||
{ // sprawdza światła i rekurencyjnie renderuje TModel3d
|
||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->RaRender(pPosition, fAngle, ReplacableSkinId, iTexAlpha);
|
||||
}
|
||||
|
||||
void TAnimModel::RenderAlphaVBO(vector3 pPosition, double fAngle)
|
||||
{
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->RaRenderAlpha(pPosition, fAngle, ReplacableSkinId, iTexAlpha);
|
||||
};
|
||||
|
||||
void TAnimModel::RenderDL(vector3 pPosition, double fAngle)
|
||||
{
|
||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->Render(pPosition, fAngle, ReplacableSkinId, iTexAlpha);
|
||||
}
|
||||
|
||||
void TAnimModel::RenderAlphaDL(vector3 pPosition, double fAngle)
|
||||
{
|
||||
RaPrepare();
|
||||
if (pModel)
|
||||
pModel->RenderAlpha(pPosition, fAngle, ReplacableSkinId, iTexAlpha);
|
||||
};
|
||||
*/
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
int TAnimModel::Flags()
|
||||
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
||||
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
||||
if (ReplacableSkinId[1] > 0) // jeśli ma wymienną teksturę 0
|
||||
i |= (i & 0x01010001) * ((iTexAlpha & 1) ? 0x20 : 0x10);
|
||||
// if (ReplacableSkinId[2]>0) //jeśli ma wymienną teksturę 1
|
||||
// i|=(i&0x02020002)*((iTexAlpha&1)?0x10:0x08);
|
||||
// if (ReplacableSkinId[3]>0) //jeśli ma wymienną teksturę 2
|
||||
// i|=(i&0x04040004)*((iTexAlpha&1)?0x08:0x04);
|
||||
// if (ReplacableSkinId[4]>0) //jeśli ma wymienną teksturę 3
|
||||
// i|=(i&0x08080008)*((iTexAlpha&1)?0x04:0x02);
|
||||
return i;
|
||||
};
|
||||
#else
|
||||
int TAnimModel::Flags()
|
||||
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
||||
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
||||
if( m_materialdata.replacable_skins[ 1 ] > 0 ) // jeśli ma wymienną teksturę 0
|
||||
i |= (i & 0x01010001) * ((m_materialdata.textures_alpha & 1) ? 0x20 : 0x10);
|
||||
// if (ReplacableSkinId[2]>0) //jeśli ma wymienną teksturę 1
|
||||
// i|=(i&0x02020002)*((iTexAlpha&1)?0x10:0x08);
|
||||
// if (ReplacableSkinId[3]>0) //jeśli ma wymienną teksturę 2
|
||||
// i|=(i&0x04040004)*((iTexAlpha&1)?0x08:0x04);
|
||||
// if (ReplacableSkinId[4]>0) //jeśli ma wymienną teksturę 3
|
||||
// i|=(i&0x08080008)*((iTexAlpha&1)?0x04:0x02);
|
||||
return i;
|
||||
};
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów
|
||||
// 2011-03-16 funkcje renderowania z możliwością pochylania obiektów
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TAnimModel::RenderDL(vector3 *vPosition)
|
||||
{
|
||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||
RaPrepare();
|
||||
if( pModel ) // renderowanie rekurencyjne submodeli
|
||||
pModel->Render(vPosition, &vAngle, ReplacableSkinId, iTexAlpha);
|
||||
};
|
||||
void TAnimModel::RenderAlphaDL(vector3 *vPosition)
|
||||
{
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->RenderAlpha(vPosition, &vAngle, ReplacableSkinId, iTexAlpha);
|
||||
};
|
||||
|
||||
void TAnimModel::RenderVBO(vector3 *vPosition)
|
||||
{
|
||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->RaRender( vPosition, &vAngle, Material()->replacable_skins, Material()->textures_alpha );
|
||||
};
|
||||
void TAnimModel::RenderAlphaVBO(vector3 *vPosition)
|
||||
{
|
||||
RaPrepare();
|
||||
if (pModel) // renderowanie rekurencyjne submodeli
|
||||
pModel->RaRenderAlpha( vPosition, &vAngle, Material()->replacable_skins, Material()->textures_alpha );
|
||||
};
|
||||
#else
|
||||
void TAnimModel::Render( vector3 *vPosition ) {
|
||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||
RaPrepare();
|
||||
@@ -726,7 +617,6 @@ void TAnimModel::RenderAlpha( vector3 *vPosition ) {
|
||||
if( pModel ) // renderowanie rekurencyjne submodeli
|
||||
GfxRenderer.Render_Alpha( pModel, Material(), *vPosition, vAngle );
|
||||
};
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
bool TAnimModel::TerrainLoaded()
|
||||
@@ -901,13 +791,8 @@ void TAnimModel::LightSet(int n, float v)
|
||||
void TAnimModel::AnimUpdate(double dt)
|
||||
{ // wykonanie zakolejkowanych animacji, nawet gdy modele nie są aktualnie wyświetlane
|
||||
TAnimContainer *p = TAnimModel::acAnimList;
|
||||
while (p)
|
||||
{ // jeśli w ogóle jest co animować
|
||||
// if ((*p)->fTranslateSpeed==0.0)
|
||||
// if ((*p)->fRotateSpeed==0.0)
|
||||
// {//jak się naanimował, to usunąć z listy
|
||||
// *p=(*p)->ListRemove(); //zwraca wskaźnik do kolejnego z listy
|
||||
// }
|
||||
while( p ) {
|
||||
|
||||
p->UpdateModel();
|
||||
p = p->acAnimNext; // na razie bez usuwania z listy, bo głównie obrotnica na nią wchodzi
|
||||
}
|
||||
|
||||
26
AnimModel.h
26
AnimModel.h
@@ -12,8 +12,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef AnimModelH
|
||||
#define AnimModelH
|
||||
#pragma once
|
||||
|
||||
#include "Model3d.h"
|
||||
#include "Texture.h"
|
||||
@@ -139,11 +138,7 @@ class TAnimModel
|
||||
TSubModel *LightsOn[iMaxNumLights]; // Ra: te wskaźniki powinny być w ramach TModel3d
|
||||
TSubModel *LightsOff[iMaxNumLights];
|
||||
vector3 vAngle; // bazowe obroty egzemplarza względem osi
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
int iTexAlpha; //żeby nie sprawdzać za każdym razem, dla 4 wymiennych tekstur
|
||||
#else
|
||||
material_data m_materialdata;
|
||||
#endif
|
||||
|
||||
std::string asText; // tekst dla wyświetlacza znakowego
|
||||
TAnimAdvanced *pAdvanced;
|
||||
@@ -155,14 +150,9 @@ class TAnimModel
|
||||
void RaAnimate(); // przeliczenie animacji egzemplarza
|
||||
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
|
||||
public:
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
texture_manager::size_type ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
|
||||
#endif
|
||||
static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane również bez wyświetlania
|
||||
#ifndef EU07_USE_OLD_RENDERCODE
|
||||
inline
|
||||
material_data const *Material() const { return &m_materialdata; }
|
||||
#endif
|
||||
|
||||
TAnimModel();
|
||||
~TAnimModel();
|
||||
@@ -171,20 +161,8 @@ class TAnimModel
|
||||
bool Load(cParser *parser, bool ter = false);
|
||||
TAnimContainer * AddContainer(char *pName);
|
||||
TAnimContainer * GetContainer(char *pName);
|
||||
/* void RenderDL(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0);
|
||||
void RenderAlphaDL(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0);
|
||||
void RenderVBO(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0);
|
||||
void RenderAlphaVBO(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0);
|
||||
*/
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void RenderDL( vector3 *vPosition );
|
||||
void RenderAlphaDL(vector3 *vPosition);
|
||||
void RenderVBO(vector3 *vPosition);
|
||||
void RenderAlphaVBO(vector3 *vPosition);
|
||||
#else
|
||||
void Render( vector3 *vPosition );
|
||||
void RenderAlpha( vector3 *vPosition );
|
||||
#endif
|
||||
int Flags();
|
||||
void RaAnglesSet(double a, double b, double c)
|
||||
{
|
||||
@@ -201,6 +179,4 @@ class TAnimModel
|
||||
static void AnimUpdate(double dt);
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
||||
|
||||
@@ -512,11 +512,6 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef EU07_USE_OLD_SPEEDTABLE
|
||||
// jak coś się znajdzie, zostanie wpisane w tę pozycję, którą właśnie odczytano
|
||||
--iLast;
|
||||
#endif
|
||||
|
||||
while (fCurrentDistance < fDistance)
|
||||
{
|
||||
if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony
|
||||
|
||||
403
DynObj.cpp
403
DynObj.cpp
@@ -1531,14 +1531,6 @@ TDynamicObject::TDynamicObject()
|
||||
//}
|
||||
mdModel = NULL;
|
||||
mdKabina = NULL;
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
ReplacableSkinID[ 0 ] = 0;
|
||||
ReplacableSkinID[ 1 ] = 0;
|
||||
ReplacableSkinID[ 2 ] = 0;
|
||||
ReplacableSkinID[ 3 ] = 0;
|
||||
ReplacableSkinID[ 4 ] = 0;
|
||||
iAlpha = 0x30300030; // tak gdy tekstury wymienne nie mają przezroczystości
|
||||
#endif
|
||||
// smWiazary[0]=smWiazary[1]=NULL;
|
||||
smWahacze[0] = smWahacze[1] = smWahacze[2] = smWahacze[3] = NULL;
|
||||
fWahaczeAmp = 0;
|
||||
@@ -3563,262 +3555,6 @@ void TDynamicObject::TurnOff()
|
||||
btMechanik1.TurnOff();
|
||||
btMechanik2.TurnOff();
|
||||
};
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TDynamicObject::Render()
|
||||
{ // rysowanie elementów nieprzezroczystych
|
||||
// youBy - sprawdzamy, czy jest sens renderowac
|
||||
|
||||
if (GfxRenderer.Visible(this))
|
||||
{
|
||||
TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
|
||||
// AnsiString asLoadName="";
|
||||
double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor;
|
||||
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
|
||||
|
||||
// Cone(vCoulpler[0],modelRot.z,0);
|
||||
// Cone(vCoulpler[1],modelRot.z,1);
|
||||
|
||||
// ActualTrack= GetTrack(); //McZapkie-240702
|
||||
|
||||
#if RENDER_CONE
|
||||
{ // Ra: testowe renderowanie pozycji wózków w postaci ostrosłupów, wymaga
|
||||
// GLUT32.DLL
|
||||
double dir = RadToDeg(atan2(vLeft.z, vLeft.x));
|
||||
Axle0.Render(0);
|
||||
Axle1.Render(1); // bogieRot[0]
|
||||
// if (PrevConnected) //renderowanie połączenia
|
||||
}
|
||||
#endif
|
||||
|
||||
glPushMatrix();
|
||||
// vector3 pos= vPosition;
|
||||
// double ObjDist= SquareMagnitude(Global::pCameraPosition-pos);
|
||||
if (this == Global::pUserDynamic)
|
||||
{ // specjalne ustawienie, aby nie trzęsło
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
if (Global::bSmudge)
|
||||
{ // jak jest widoczna smuga, to pojazd renderować po
|
||||
// wyrenderowaniu smugi
|
||||
glPopMatrix(); // a to trzeba zebrać przed wyjściem
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
// if (Global::pWorld->) //tu trzeba by ustawić animacje na modelu
|
||||
// zewnętrznym
|
||||
glLoadIdentity(); // zacząć od macierzy jedynkowej
|
||||
Global::pCamera->SetCabMatrix(vPosition); // specjalne ustawienie kamery
|
||||
}
|
||||
else
|
||||
glTranslated(vPosition.x, vPosition.y,
|
||||
vPosition.z); // standardowe przesunięcie względem początku scenerii
|
||||
glMultMatrixd(mMatrix.getArray());
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
if (fShade > 0.0)
|
||||
{ // Ra: zmiana oswietlenia w tunelu, wykopie
|
||||
GLfloat ambientLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat diffuseLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat specularLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
// trochę problem z ambientem w wykopie...
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
ambientLight[li] = Global::ambientDayLight[li] * fShade;
|
||||
diffuseLight[li] = Global::diffuseDayLight[li] * fShade;
|
||||
specularLight[li] = Global::specularDayLight[li] * fShade;
|
||||
}
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
|
||||
}
|
||||
#else
|
||||
if( fShade > 0.0f ) {
|
||||
// change light level based on light level of the occupied track
|
||||
Global::DayLight.apply_intensity( fShade );
|
||||
}
|
||||
#endif
|
||||
if (Global::bUseVBO)
|
||||
{ // wersja VBO
|
||||
if (mdLowPolyInt)
|
||||
if (FreeFlyModeFlag ? true : !mdKabina || !bDisplayCab)
|
||||
mdLowPolyInt->RaRender(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
mdModel->RaRender(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
if (mdLoad) // renderowanie nieprzezroczystego ładunku
|
||||
mdLoad->RaRender(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
}
|
||||
else
|
||||
{ // wersja Display Lists
|
||||
if( mdLowPolyInt ) {
|
||||
// low poly interior
|
||||
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);
|
||||
if (mdLoad) // renderowanie nieprzezroczystego ładunku
|
||||
mdLoad->Render(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
}
|
||||
|
||||
// Ra: czy ta kabina tu ma sens?
|
||||
// Ra: czy nie renderuje się dwukrotnie?
|
||||
// Ra: dlaczego jest zablokowana w przezroczystych?
|
||||
if (mdKabina) // jeśli ma model kabiny
|
||||
if ((mdKabina != mdModel) && bDisplayCab && FreeFlyModeFlag)
|
||||
{ // rendering kabiny gdy jest oddzielnym modelem i
|
||||
// ma byc wyswietlana
|
||||
// ABu: tylko w trybie FreeFly, zwykly tryb w world.cpp
|
||||
// Ra: świetła są ustawione dla zewnętrza danego pojazdu
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// TODO: re-mplement this
|
||||
// oswietlenie kabiny
|
||||
GLfloat ambientCabLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat diffuseCabLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat specularCabLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
ambientCabLight[li] = Global::ambientDayLight[li] * 0.9;
|
||||
diffuseCabLight[li] = Global::diffuseDayLight[li] * 0.5;
|
||||
specularCabLight[li] = Global::specularDayLight[li] * 0.5;
|
||||
}
|
||||
switch (MyTrack->eEnvironment)
|
||||
{
|
||||
case e_canyon:
|
||||
{
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
diffuseCabLight[li] *= 0.6f;
|
||||
specularCabLight[li] *= 0.7f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case e_tunnel:
|
||||
{
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
ambientCabLight[li] *= 0.3f;
|
||||
diffuseCabLight[li] *= 0.1f;
|
||||
specularCabLight[li] *= 0.2f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientCabLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseCabLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, specularCabLight);
|
||||
#endif
|
||||
if (Global::bUseVBO)
|
||||
mdKabina->RaRender(ObjSqrDist, 0);
|
||||
else
|
||||
mdKabina->Render(ObjSqrDist, 0);
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, Global::specularDayLight);
|
||||
#endif
|
||||
}
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
if( fShade != 0.0 ) // tylko jeśli było zmieniane
|
||||
{ // przywrócenie standardowego oświetlenia
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, Global::specularDayLight);
|
||||
}
|
||||
#else
|
||||
if( fShade > 0.0f ) {
|
||||
// restore regular light level
|
||||
Global::DayLight.apply_intensity();
|
||||
}
|
||||
#endif
|
||||
glPopMatrix();
|
||||
if (btnOn)
|
||||
TurnOff(); // przywrócenie domyślnych pozycji submodeli
|
||||
} // yB - koniec mieszania z grafika
|
||||
};
|
||||
|
||||
void TDynamicObject::RenderAlpha()
|
||||
{ // rysowanie elementów półprzezroczystych
|
||||
if (renderme)
|
||||
{
|
||||
TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
|
||||
double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition);
|
||||
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
|
||||
glPushMatrix();
|
||||
if (this == Global::pUserDynamic)
|
||||
{ // specjalne ustawienie, aby nie trzęsło
|
||||
glPopMatrix(); // to trzeba zebrać przed wyściem
|
||||
return;
|
||||
glLoadIdentity(); // zacząć od macierzy jedynkowej
|
||||
Global::pCamera->SetCabMatrix(vPosition); // specjalne ustawienie kamery
|
||||
}
|
||||
else
|
||||
glTranslated(vPosition.x, vPosition.y,
|
||||
vPosition.z); // standardowe przesunięcie względem początku scenerii
|
||||
glMultMatrixd(mMatrix.getArray());
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// TODO: re-implement this
|
||||
if (fShade > 0.0)
|
||||
{ // Ra: zmiana oswietlenia w tunelu, wykopie
|
||||
GLfloat ambientLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat diffuseLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
GLfloat specularLight[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
// trochę problem z ambientem w wykopie...
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
ambientLight[li] = Global::ambientDayLight[li] * fShade;
|
||||
diffuseLight[li] = Global::diffuseDayLight[li] * fShade;
|
||||
specularLight[li] = Global::specularDayLight[li] * fShade;
|
||||
}
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
|
||||
}
|
||||
#endif
|
||||
if (Global::bUseVBO)
|
||||
{ // wersja VBO
|
||||
if (mdLowPolyInt)
|
||||
if (FreeFlyModeFlag ? true : !mdKabina || !bDisplayCab)
|
||||
mdLowPolyInt->RaRenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
mdModel->RaRenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
if (mdLoad)
|
||||
mdLoad->RaRenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
}
|
||||
else
|
||||
{ // wersja Display Lists
|
||||
if (mdLowPolyInt)
|
||||
if (FreeFlyModeFlag ? true : !mdKabina || !bDisplayCab)
|
||||
mdLowPolyInt->RenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
mdModel->RenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
if (mdLoad)
|
||||
mdLoad->RenderAlpha(ObjSqrDist, ReplacableSkinID, iAlpha);
|
||||
}
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// TODO: re-implement this
|
||||
if (fShade != 0.0) // tylko jeśli było zmieniane
|
||||
{ // przywrócenie standardowego oświetlenia
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, Global::specularDayLight);
|
||||
}
|
||||
#endif
|
||||
glPopMatrix();
|
||||
if (btnOn)
|
||||
TurnOff(); // przywrócenie domyślnych pozycji submodeli
|
||||
}
|
||||
return;
|
||||
} // koniec renderalpha
|
||||
#endif
|
||||
|
||||
void TDynamicObject::RenderSounds()
|
||||
{ // przeliczanie dźwięków, bo będzie słychać bez wyświetlania sektora z pojazdem
|
||||
@@ -4210,26 +3946,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
|
||||
if( token == "models:") {
|
||||
// modele i podmodele
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
iMultiTex = 0; // czy jest wiele tekstur wymiennych?
|
||||
parser.getTokens();
|
||||
parser >> asModel;
|
||||
if( asModel[asModel.size() - 1] == '#' ) // Ra 2015-01: nie podoba mi siê to
|
||||
{ // model wymaga wielu tekstur wymiennych
|
||||
iMultiTex = 1;
|
||||
asModel.erase( asModel.length() - 1 );
|
||||
}
|
||||
std::size_t i = asModel.find( ',' );
|
||||
if ( i != std::string::npos )
|
||||
{ // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba tekstur?
|
||||
if (i < asModel.length())
|
||||
iMultiTex = asModel[i + 1] - '0';
|
||||
if (iMultiTex < 0)
|
||||
iMultiTex = 0;
|
||||
else if (iMultiTex > 1)
|
||||
iMultiTex = 1; // na razie ustawiamy na 1
|
||||
}
|
||||
#else
|
||||
m_materialdata.multi_textures = 0; // czy jest wiele tekstur wymiennych?
|
||||
parser.getTokens();
|
||||
parser >> asModel;
|
||||
@@ -4245,71 +3961,13 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
m_materialdata.multi_textures = asModel[i + 1] - '0';
|
||||
m_materialdata.multi_textures = clamp( m_materialdata.multi_textures, 0, 1 ); // na razie ustawiamy na 1
|
||||
}
|
||||
#endif
|
||||
asModel = BaseDir + asModel; // McZapkie 2002-07-20: dynamics maja swoje
|
||||
// modele w dynamics/basedir
|
||||
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
|
||||
mdModel = TModelsManager::GetModel(asModel, true);
|
||||
assert( mdModel != nullptr ); // TODO: handle this more gracefully than all going to shit
|
||||
if (ReplacableSkin != "none")
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
{ // tekstura wymienna jest raczej jedynie w "dynamic\"
|
||||
ReplacableSkin =
|
||||
Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/...
|
||||
std::string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
|
||||
if (!x.empty())
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( Global::asCurrentTexturePath + "nowhere", "", 9);
|
||||
|
||||
if (iMultiTex > 0)
|
||||
{ // jeśli model ma 4 tekstury
|
||||
ReplacableSkinID[1] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin + ",1", "", Global::iDynamicFiltering);
|
||||
if (ReplacableSkinID[1])
|
||||
{ // pierwsza z zestawu znaleziona
|
||||
ReplacableSkinID[2] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin + ",2", "", Global::iDynamicFiltering);
|
||||
if (ReplacableSkinID[2])
|
||||
{
|
||||
iMultiTex = 2; // już są dwie
|
||||
ReplacableSkinID[3] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin + ",3", "", Global::iDynamicFiltering);
|
||||
if (ReplacableSkinID[3])
|
||||
{
|
||||
iMultiTex = 3; // a teraz nawet trzy
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin + ",4", "", Global::iDynamicFiltering);
|
||||
if (ReplacableSkinID[4])
|
||||
iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury rozkładem
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // zestaw nie zadziałał, próbujemy normanie
|
||||
iMultiTex = 0;
|
||||
ReplacableSkinID[1] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin, "", Global::iDynamicFiltering);
|
||||
}
|
||||
}
|
||||
else
|
||||
ReplacableSkinID[1] = GfxRenderer.GetTextureId(
|
||||
ReplacableSkin, "", Global::iDynamicFiltering);
|
||||
if (GfxRenderer.Texture(ReplacableSkinID[1]).has_alpha)
|
||||
iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
else
|
||||
iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w cyklu przezroczystych
|
||||
if (ReplacableSkinID[2])
|
||||
if (GfxRenderer.Texture(ReplacableSkinID[2]).has_alpha)
|
||||
iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
if (ReplacableSkinID[3])
|
||||
if (GfxRenderer.Texture(ReplacableSkinID[3]).has_alpha)
|
||||
iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
if (ReplacableSkinID[4])
|
||||
if (GfxRenderer.Texture(ReplacableSkinID[4]).has_alpha)
|
||||
iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
}
|
||||
#else
|
||||
{ // tekstura wymienna jest raczej jedynie w "dynamic\"
|
||||
// ReplacableSkin = Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/...
|
||||
{
|
||||
std::string nowheretexture = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
|
||||
if( false == nowheretexture.empty() ) {
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( nowheretexture, "", 9 );
|
||||
@@ -4364,7 +4022,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
if( GfxRenderer.Texture( m_materialdata.replacable_skins[ 4 ] ).has_alpha )
|
||||
m_materialdata.textures_alpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
}
|
||||
#endif
|
||||
if (!MoverParameters->LoadAccepted.empty())
|
||||
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
|
||||
// MoverParameters->LoadType!=AnsiString("passengers"))
|
||||
@@ -5655,62 +5312,16 @@ std::string TDynamicObject::TextureTest(std::string const &name)
|
||||
return ""; // nie znaleziona
|
||||
};
|
||||
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
||||
{ // ustawienie stacji
|
||||
// docelowej oraz wymiennej
|
||||
// tekstury 4, jeśli
|
||||
// istnieje plik
|
||||
// w zasadzie, to każdy wagon mógłby mieć inną stację docelową
|
||||
// zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki
|
||||
// ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z
|
||||
// rozkładu
|
||||
if (abs(iMultiTex) >= 4)
|
||||
return; // jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||
numer = Global::Bezogonkow(numer);
|
||||
asDestination = to;
|
||||
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
|
||||
std::string x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName);
|
||||
if (!x.empty())
|
||||
{
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
}
|
||||
x = TextureTest(asBaseDir + numer );
|
||||
if (!x.empty())
|
||||
{
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
}
|
||||
if (to.empty())
|
||||
to = "nowhere";
|
||||
x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD
|
||||
if (!x.empty())
|
||||
{
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
}
|
||||
x = TextureTest(asBaseDir + to); // na razie prymitywnie
|
||||
if (!x.empty())
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
|
||||
else
|
||||
{
|
||||
x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere
|
||||
if (!x.empty())
|
||||
ReplacableSkinID[4] = GfxRenderer.GetTextureId( x, "", 9);
|
||||
}
|
||||
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa
|
||||
// tekstury nr 4
|
||||
};
|
||||
#else
|
||||
void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
||||
{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik
|
||||
// w zasadzie, to każdy wagon mógłby mieć inną stację docelową
|
||||
// zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki
|
||||
// ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z
|
||||
// rozkładu
|
||||
if( std::abs( m_materialdata.multi_textures ) >= 4 )
|
||||
return; // jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||
if( std::abs( m_materialdata.multi_textures ) >= 4 ) {
|
||||
// jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||
return;
|
||||
}
|
||||
numer = Global::Bezogonkow(numer);
|
||||
asDestination = to;
|
||||
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
|
||||
@@ -5743,10 +5354,8 @@ void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
||||
if (!x.empty())
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 );
|
||||
}
|
||||
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa
|
||||
// tekstury nr 4
|
||||
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa tekstury nr 4
|
||||
};
|
||||
#endif
|
||||
|
||||
void TDynamicObject::OverheadTrack(float o)
|
||||
{ // ewentualne wymuszanie jazdy
|
||||
|
||||
19
DynObj.h
19
DynObj.h
@@ -137,11 +137,8 @@ class TAnim
|
||||
void Parovoz(); // wykonanie obliczeń animacji
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef EU07_USE_OLD_RENDERCODE
|
||||
// parameters for the material object, as currently used by various simulator models
|
||||
struct material_data {
|
||||
|
||||
@@ -153,7 +150,6 @@ struct material_data {
|
||||
::SecureZeroMemory( replacable_skins, sizeof( replacable_skins ) );
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
class TDynamicObject { // klasa pojazdu
|
||||
|
||||
@@ -200,15 +196,11 @@ public: // modele składowe pojazdu
|
||||
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
|
||||
#ifndef EU07_USE_OLD_RENDERCODE
|
||||
material_data m_materialdata;
|
||||
#endif
|
||||
|
||||
public:
|
||||
#ifndef EU07_USE_OLD_RENDERCODE
|
||||
inline
|
||||
material_data const *Material() const { return &m_materialdata; }
|
||||
#endif
|
||||
material_data const *Material() const { return &m_materialdata; }
|
||||
// tymczasowo udostępnione do wyszukiwania drutu
|
||||
int iAnimType[ ANIM_TYPES ]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
||||
private:
|
||||
@@ -421,11 +413,6 @@ public: // modele składowe pojazdu
|
||||
int iCabs; // maski bitowe modeli kabin
|
||||
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
|
||||
std::string asBaseDir;
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
texture_manager::size_type ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie
|
||||
int iAlpha; // maska przezroczystości tekstur
|
||||
int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna
|
||||
#endif
|
||||
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
|
||||
// jazdę bezprądową
|
||||
TTractionParam tmpTraction;
|
||||
@@ -444,10 +431,6 @@ public: // modele składowe pojazdu
|
||||
bool FastUpdate(double dt);
|
||||
void Move(double fDistance);
|
||||
void FastMove(double fDistance);
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void Render();
|
||||
void RenderAlpha();
|
||||
#endif
|
||||
void RenderSounds();
|
||||
inline vector3 GetPosition() const
|
||||
{
|
||||
|
||||
1
EU07.cpp
1
EU07.cpp
@@ -9,7 +9,6 @@ http://mozilla.org/MPL/2.0/.
|
||||
/*
|
||||
MaSzyna EU07 locomotive simulator
|
||||
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
|
||||
|
||||
*/
|
||||
/*
|
||||
Authors:
|
||||
|
||||
@@ -83,17 +83,8 @@ GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
|
||||
double Global::fFogStart = 1700;
|
||||
double Global::fFogEnd = 2000;
|
||||
float Global::Overcast{ 0.1f }; // NOTE: all this weather stuff should be moved elsewhere
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
GLfloat Global::ambientDayLight[] = {0.40f, 0.40f, 0.45f, 1.0f}; // robocze
|
||||
GLfloat Global::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 1.0f};
|
||||
GLfloat Global::specularDayLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
||||
GLfloat Global::ambientLight[] = {0.80f, 0.80f, 0.85f, 1.0f}; // stałe
|
||||
GLfloat Global::diffuseLight[] = {0.85f, 0.85f, 0.80f, 1.0f};
|
||||
GLfloat Global::specularLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
||||
#else
|
||||
opengl_light Global::DayLight;
|
||||
int Global::DynamicLightCount{ 3 };
|
||||
#endif
|
||||
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
|
||||
GLfloat Global::noLight[] = {0.00f, 0.00f, 0.00f, 1.0f};
|
||||
GLfloat Global::darkLight[] = {0.03f, 0.03f, 0.03f, 1.0f}; //śladowe
|
||||
|
||||
11
Globals.h
11
Globals.h
@@ -221,20 +221,11 @@ class Global
|
||||
static GLfloat FogColor[];
|
||||
static float Overcast;
|
||||
// static bool bTimeChange;
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
static opengl_light AmbientLight;
|
||||
|
||||
static GLfloat ambientDayLight[];
|
||||
static GLfloat diffuseDayLight[];
|
||||
static GLfloat specularDayLight[];
|
||||
static GLfloat ambientLight[];
|
||||
static GLfloat diffuseLight[];
|
||||
static GLfloat specularLight[];
|
||||
#else
|
||||
// TODO: put these things in the renderer
|
||||
static opengl_light DayLight;
|
||||
static int DynamicLightCount;
|
||||
#endif
|
||||
|
||||
static GLfloat whiteLight[];
|
||||
static GLfloat noLight[];
|
||||
static GLfloat darkLight[];
|
||||
|
||||
158
Ground.cpp
158
Ground.cpp
@@ -1625,19 +1625,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
str4);
|
||||
if (tf3 != 0.0) // zero oznacza błąd
|
||||
{
|
||||
fTrainSetDist -=
|
||||
tf3; // przesunięcie dla kolejnego, minus bo idziemy w stronę punktu 1
|
||||
// przesunięcie dla kolejnego, minus bo idziemy w stronę punktu 1
|
||||
fTrainSetDist -= tf3;
|
||||
tmp->pCenter = tmp->DynamicObject->GetPosition();
|
||||
/* // NOTE: the ctrain_depot flag is used to mark merged together parts of modular trains
|
||||
// clearing it here breaks this connection, so i'm disabling this piece of code.
|
||||
// if it has some actual purpose and disabling it breaks that, a different solution has to be found
|
||||
// either for modular trains, or whatever it is this code does.
|
||||
if (TempConnectionType[iTrainSetWehicleNumber]) // jeśli jest sprzęg
|
||||
if (tmp->DynamicObject->MoverParameters->Couplers[tf1 == -1.0 ? 0 : 1]
|
||||
.AllowedFlag &
|
||||
ctrain_depot) // jesli zablokowany
|
||||
TempConnectionType[iTrainSetWehicleNumber] |= ctrain_depot; // będzie blokada
|
||||
*/
|
||||
// automatically establish permanent connections for couplers which specify them in their definitions
|
||||
if( TempConnectionType[ iTrainSetWehicleNumber ] ) {
|
||||
if( tmp->DynamicObject->MoverParameters->Couplers[ ( tf1 == -1.0 ? 0 : 1 ) ].AllowedFlag & coupling::permanent ) {
|
||||
TempConnectionType[ iTrainSetWehicleNumber ] |= coupling::permanent;
|
||||
}
|
||||
}
|
||||
iTrainSetWehicleNumber++;
|
||||
}
|
||||
else
|
||||
@@ -1825,29 +1821,12 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
parser->getTokens();
|
||||
*parser >> token;
|
||||
} while (token.compare("endtri") != 0);
|
||||
// delete tmp; //nie ma co tego trzymać
|
||||
// tmp=NULL; //to jest błąd
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
i = 0;
|
||||
*/
|
||||
TempVerts.clear();
|
||||
TGroundVertex vertex;
|
||||
do
|
||||
{
|
||||
/*
|
||||
if (i < 9999) // 3333 trójkąty
|
||||
{ // liczba wierzchołków nie jest nieograniczona
|
||||
*/
|
||||
/*
|
||||
parser->getTokens(3);
|
||||
*parser >> TempVerts[i].Point.x >> TempVerts[i].Point.y >> TempVerts[i].Point.z;
|
||||
parser->getTokens(3);
|
||||
*parser >> TempVerts[i].Normal.x >> TempVerts[i].Normal.y >>
|
||||
TempVerts[i].Normal.z;
|
||||
*/
|
||||
do {
|
||||
parser->getTokens( 8, false );
|
||||
*parser
|
||||
>> vertex.Point.x
|
||||
@@ -1858,49 +1837,6 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
>> vertex.Normal.z
|
||||
>> vertex.tu
|
||||
>> vertex.tv;
|
||||
/*
|
||||
str=Parser->GetNextSymbol().LowerCase();
|
||||
if (str==AnsiString("x"))
|
||||
TempVerts[i].tu=(TempVerts[i].Point.x+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
if (str==AnsiString("y"))
|
||||
TempVerts[i].tu=(TempVerts[i].Point.y+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
if (str==AnsiString("z"))
|
||||
TempVerts[i].tu=(TempVerts[i].Point.z+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
TempVerts[i].tu=str.ToDouble();;
|
||||
|
||||
str=Parser->GetNextSymbol().LowerCase();
|
||||
if (str==AnsiString("x"))
|
||||
TempVerts[i].tv=(TempVerts[i].Point.x+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
if (str==AnsiString("y"))
|
||||
TempVerts[i].tv=(TempVerts[i].Point.y+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
if (str==AnsiString("z"))
|
||||
TempVerts[i].tv=(TempVerts[i].Point.z+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
|
||||
else
|
||||
TempVerts[i].tv=str.ToDouble();;
|
||||
*/
|
||||
/*
|
||||
parser->getTokens(2);
|
||||
*parser >> TempVerts[i].tu >> TempVerts[i].tv;
|
||||
*/
|
||||
// tf=Parser->GetNextSymbol().ToDouble();
|
||||
// TempVerts[i].tu=tf;
|
||||
// tf=Parser->GetNextSymbol().ToDouble();
|
||||
// TempVerts[i].tv=tf;
|
||||
/*
|
||||
TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI);
|
||||
TempVerts[i].Point.RotateX(aRotate.x / 180 * M_PI);
|
||||
TempVerts[i].Point.RotateY(aRotate.y / 180 * M_PI);
|
||||
TempVerts[i].Normal.RotateZ(aRotate.z / 180 * M_PI);
|
||||
TempVerts[i].Normal.RotateX(aRotate.x / 180 * M_PI);
|
||||
TempVerts[i].Normal.RotateY(aRotate.y / 180 * M_PI);
|
||||
TempVerts[i].Point += pOrigin;
|
||||
tmp->pCenter += TempVerts[i].Point;
|
||||
*/
|
||||
vertex.Point.RotateZ( aRotate.z / 180 * M_PI );
|
||||
vertex.Point.RotateX( aRotate.x / 180 * M_PI );
|
||||
vertex.Point.RotateY( aRotate.y / 180 * M_PI );
|
||||
@@ -1911,27 +1847,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
tmp->pCenter += vertex.Point;
|
||||
|
||||
TempVerts.emplace_back( vertex );
|
||||
/*
|
||||
}
|
||||
else if (i == 9999)
|
||||
ErrorLog("Bad triangles: too many verices");
|
||||
i++;
|
||||
*/
|
||||
parser->getTokens();
|
||||
*parser >> token;
|
||||
|
||||
// }
|
||||
|
||||
} while (token.compare("endtri") != 0);
|
||||
/*
|
||||
nv = i;
|
||||
*/
|
||||
|
||||
nv = (int)TempVerts.size();
|
||||
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
||||
tmp->pCenter /= (nv > 0 ? nv : 1);
|
||||
|
||||
// memcpy(tmp->Vertices,TempVerts,nv*sizeof(TGroundVertex));
|
||||
|
||||
r = 0;
|
||||
for (int i = 0; i < nv; i++)
|
||||
{
|
||||
@@ -1940,7 +1864,6 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
if (tf > r)
|
||||
r = tf;
|
||||
}
|
||||
|
||||
// tmp->fSquareRadius=2000*2000+r;
|
||||
tmp->fSquareRadius += r;
|
||||
RaTriangleDivider(tmp); // Ra: dzielenie trójkątów jest teraz całkiem wydajne
|
||||
@@ -2123,22 +2046,6 @@ bool TGround::Init(std::string File)
|
||||
cParser parser(File, cParser::buffer_FILE, subpath, Global::bLoadTraction);
|
||||
std::string token;
|
||||
|
||||
/*
|
||||
TFileStream *fs;
|
||||
fs=new TFileStream(asFile , fmOpenRead | fmShareCompat );
|
||||
AnsiString str="";
|
||||
int size=fs->Size;
|
||||
str.SetLength(size);
|
||||
fs->Read(str.c_str(),size);
|
||||
str+="";
|
||||
delete fs;
|
||||
TQueryParserComp *Parser;
|
||||
Parser=new TQueryParserComp(NULL);
|
||||
Parser->TextToParse=str;
|
||||
// Parser->LoadStringToParse(asFile);
|
||||
Parser->First();
|
||||
AnsiString Token,asFileName;
|
||||
*/
|
||||
const int OriginStackMaxDepth = 100; // rozmiar stosu dla zagnieżdżenia origin
|
||||
int OriginStackTop = 0;
|
||||
vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin
|
||||
@@ -2434,58 +2341,15 @@ bool TGround::Init(std::string File)
|
||||
else if (str == "light")
|
||||
{ // Ra: ustawianie światła przeniesione do FirstInit
|
||||
WriteLog("Scenery light definition");
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
vector3 lp;
|
||||
parser.getTokens();
|
||||
parser >> lp.x;
|
||||
parser.getTokens();
|
||||
parser >> lp.y;
|
||||
parser.getTokens();
|
||||
parser >> lp.z;
|
||||
lp = Normalize(lp); // kierunek padania
|
||||
Global::lightPos[0] = lp.x; // daylight position
|
||||
Global::lightPos[1] = lp.y;
|
||||
Global::lightPos[2] = lp.z;
|
||||
#else
|
||||
parser.getTokens(3, false);
|
||||
parser
|
||||
>> Global::DayLight.direction.x
|
||||
>> Global::DayLight.direction.y
|
||||
>> Global::DayLight.direction.z;;
|
||||
Global::DayLight.direction.Normalize();
|
||||
#endif
|
||||
parser.getTokens(9, false);
|
||||
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
parser
|
||||
>> Global::ambientDayLight[ 0 ]
|
||||
>> Global::ambientDayLight[ 1 ]
|
||||
>> Global::ambientDayLight[ 2 ]
|
||||
>> Global::diffuseDayLight[ 0 ]
|
||||
>> Global::diffuseDayLight[ 1 ]
|
||||
>> Global::diffuseDayLight[ 2 ]
|
||||
>> Global::specularDayLight[ 0 ]
|
||||
>> Global::specularDayLight[ 1 ]
|
||||
>> Global::specularDayLight[ 2 ];
|
||||
#else
|
||||
/*
|
||||
parser
|
||||
// kolor wszechobceny
|
||||
>> Global::DayLight.ambient[0]
|
||||
>> Global::DayLight.ambient[1]
|
||||
>> Global::DayLight.ambient[2]
|
||||
// kolor padający
|
||||
>> Global::DayLight.diffuse[0]
|
||||
>> Global::DayLight.diffuse[1]
|
||||
>> Global::DayLight.diffuse[2]
|
||||
// kolor odbity
|
||||
>> Global::DayLight.specular[0]
|
||||
>> Global::DayLight.specular[1]
|
||||
>> Global::DayLight.specular[2];
|
||||
*/
|
||||
#endif
|
||||
do
|
||||
{
|
||||
do {
|
||||
parser.getTokens();
|
||||
parser >> token;
|
||||
} while (token.compare("endlight") != 0);
|
||||
|
||||
549
Model3d.cpp
549
Model3d.cpp
@@ -1036,421 +1036,6 @@ void TSubModel::RaAnimation(TAnimType a)
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TSubModel::RenderDL()
|
||||
{ // główna procedura renderowania przez DL
|
||||
if( ( iVisible )
|
||||
&& ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) )
|
||||
&& ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) )
|
||||
{
|
||||
if (iFlags & 0xC000)
|
||||
{
|
||||
glPushMatrix();
|
||||
if (fMatrix)
|
||||
glMultMatrixf(fMatrix->readArray());
|
||||
if (b_Anim)
|
||||
RaAnimation(b_Anim);
|
||||
}
|
||||
if (eType < TP_ROTATOR)
|
||||
{ // renderowanie obiektów OpenGL
|
||||
if (iAlpha & iFlags & 0x1F) // rysuj gdy element nieprzezroczysty
|
||||
{
|
||||
if (TextureID < 0) // && (ReplacableSkinId!=0))
|
||||
{ // zmienialne skóry
|
||||
GfxRenderer.Bind(ReplacableSkinId[-TextureID]);
|
||||
// TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury
|
||||
}
|
||||
else
|
||||
GfxRenderer.Bind(TextureID); // również 0
|
||||
if (Global::fLuminance < fLight)
|
||||
{
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
|
||||
glCallList(uiDisplayList); // tylko dla siatki
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||
}
|
||||
else
|
||||
glCallList(uiDisplayList); // tylko dla siatki
|
||||
}
|
||||
}
|
||||
else if (eType == TP_FREESPOTLIGHT)
|
||||
{ // wersja DL
|
||||
matrix4x4 mat; // macierz opisuje układ renderowania względem kamery
|
||||
glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray());
|
||||
// kąt między kierunkiem światła a współrzędnymi kamery
|
||||
vector3 gdzie = mat * vector3(0, 0, 0); // pozycja punktu świecącego względem kamery
|
||||
fCosViewAngle = DotProduct(Normalize(mat * vector3(0, 0, 1) - gdzie), Normalize(gdzie));
|
||||
if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła
|
||||
{
|
||||
double Distdimm = 1.0;
|
||||
if (fCosViewAngle <
|
||||
fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff
|
||||
if (fCosFalloffAngle < fCosHotspotAngle)
|
||||
Distdimm = 1.0 -
|
||||
(fCosHotspotAngle - fCosViewAngle) /
|
||||
(fCosHotspotAngle - fCosFalloffAngle);
|
||||
glColor3f(f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm,
|
||||
f4Diffuse[2] * Distdimm);
|
||||
/* TODO: poprawic to zeby dzialalo
|
||||
if (iFarAttenDecay>0)
|
||||
switch (iFarAttenDecay)
|
||||
{
|
||||
case 1:
|
||||
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
|
||||
//dorobic od kata
|
||||
break;
|
||||
case 2:
|
||||
Distdimm=fFarDecayRadius/(1+fSquareDist);
|
||||
//dorobic od kata
|
||||
break;
|
||||
}
|
||||
if (Distdimm>1)
|
||||
Distdimm=1;
|
||||
glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm);
|
||||
*/
|
||||
// glPopMatrix();
|
||||
// return;
|
||||
glCallList(uiDisplayList); // wyświetlenie warunkowe
|
||||
}
|
||||
}
|
||||
else if (eType == TP_STARS)
|
||||
{
|
||||
// glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie
|
||||
// blendowaly
|
||||
if (Global::fLuminance < fLight)
|
||||
{
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
|
||||
glCallList(uiDisplayList); // narysuj naraz wszystkie punkty z DL
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||
}
|
||||
}
|
||||
if (Child != NULL)
|
||||
if (iAlpha & iFlags & 0x001F0000)
|
||||
Child->RenderDL();
|
||||
if (iFlags & 0xC000)
|
||||
glPopMatrix();
|
||||
}
|
||||
if (b_Anim < at_SecondsJump)
|
||||
b_Anim = at_None; // wyłączenie animacji dla kolejnego użycia subm
|
||||
if (Next)
|
||||
if (iAlpha & iFlags & 0x1F000000)
|
||||
Next->RenderDL(); // dalsze rekurencyjnie
|
||||
}; // Render
|
||||
|
||||
void TSubModel::RenderAlphaDL()
|
||||
{ // renderowanie przezroczystych przez DL
|
||||
if( ( iVisible )
|
||||
&& ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) )
|
||||
&& ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) )
|
||||
{
|
||||
if (iFlags & 0xC000)
|
||||
{
|
||||
glPushMatrix();
|
||||
if (fMatrix)
|
||||
glMultMatrixf(fMatrix->readArray());
|
||||
if (b_aAnim)
|
||||
RaAnimation(b_aAnim);
|
||||
}
|
||||
if (eType < TP_ROTATOR)
|
||||
{ // renderowanie obiektów OpenGL
|
||||
if (iAlpha & iFlags & 0x2F) // rysuj gdy element przezroczysty
|
||||
{
|
||||
if (TextureID < 0) // && (ReplacableSkinId!=0))
|
||||
{ // zmienialne skóry
|
||||
GfxRenderer.Bind(ReplacableSkinId[-TextureID]);
|
||||
// TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury
|
||||
}
|
||||
else
|
||||
GfxRenderer.Bind(TextureID); // również 0
|
||||
if (Global::fLuminance < fLight)
|
||||
{
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
|
||||
glCallList(uiDisplayList); // tylko dla siatki
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||
}
|
||||
else
|
||||
glCallList(uiDisplayList); // tylko dla siatki
|
||||
}
|
||||
}
|
||||
else if (eType == TP_FREESPOTLIGHT)
|
||||
{
|
||||
// dorobić aureolę!
|
||||
}
|
||||
if (Child != NULL)
|
||||
if (eType == TP_TEXT)
|
||||
{ // tekst renderujemy w specjalny sposób, zamiast
|
||||
// submodeli z łańcucha Child
|
||||
int i, j = (int)pasText->size();
|
||||
TSubModel *p;
|
||||
if (!smLetter)
|
||||
{ // jeśli nie ma tablicy, to ją stworzyć; miejsce
|
||||
// nieodpowiednie, ale tymczasowo
|
||||
// może być
|
||||
smLetter = new TSubModel *[256]; // tablica wskaźników submodeli dla
|
||||
// wyświetlania tekstu
|
||||
ZeroMemory(smLetter, 256 * sizeof(TSubModel *)); // wypełnianie zerami
|
||||
p = Child;
|
||||
while (p)
|
||||
{
|
||||
smLetter[p->pName[0]] = p;
|
||||
p = p->Next; // kolejny znak
|
||||
}
|
||||
}
|
||||
for (i = 1; i <= j; ++i)
|
||||
{
|
||||
p = smLetter[(*pasText)[i]]; // znak do wyświetlenia
|
||||
if (p)
|
||||
{ // na razie tylko jako przezroczyste
|
||||
p->RenderAlphaDL();
|
||||
if (p->fMatrix)
|
||||
glMultMatrixf(p->fMatrix->readArray()); // przesuwanie widoku
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (iAlpha & iFlags & 0x002F0000)
|
||||
Child->RenderAlphaDL();
|
||||
if (iFlags & 0xC000)
|
||||
glPopMatrix();
|
||||
}
|
||||
if (b_aAnim < at_SecondsJump)
|
||||
b_aAnim = at_None; // wyłączenie animacji dla kolejnego użycia submodelu
|
||||
if (Next != NULL)
|
||||
if (iAlpha & iFlags & 0x2F000000)
|
||||
Next->RenderAlphaDL();
|
||||
}; // RenderAlpha
|
||||
|
||||
void TSubModel::RenderVBO()
|
||||
{ // główna procedura renderowania przez VBO
|
||||
if( ( iVisible )
|
||||
&& ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) )
|
||||
&& ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) )
|
||||
{
|
||||
if (iFlags & 0xC000)
|
||||
{
|
||||
glPushMatrix();
|
||||
if (fMatrix)
|
||||
glMultMatrixf(fMatrix->readArray());
|
||||
if (b_Anim)
|
||||
RaAnimation(b_Anim);
|
||||
}
|
||||
if (eType < TP_ROTATOR)
|
||||
{ // renderowanie obiektów OpenGL
|
||||
if (iAlpha & iFlags & 0x1F) // rysuj gdy element nieprzezroczysty
|
||||
{
|
||||
if (TextureID < 0) // && (ReplacableSkinId!=0))
|
||||
{ // zmienialne skóry
|
||||
GfxRenderer.Bind(ReplacableSkinId[-TextureID]);
|
||||
// TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury
|
||||
}
|
||||
else
|
||||
GfxRenderer.Bind(TextureID); // również 0
|
||||
glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub
|
||||
// glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo,
|
||||
// co glColor
|
||||
if (Global::fLuminance < fLight)
|
||||
{
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
|
||||
glDrawArrays(eType, iVboPtr,
|
||||
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||
}
|
||||
else
|
||||
glDrawArrays(eType, iVboPtr,
|
||||
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
|
||||
}
|
||||
}
|
||||
else if (eType == TP_FREESPOTLIGHT)
|
||||
{ // wersja VBO
|
||||
/*
|
||||
matrix4x4 mat; // macierz opisuje układ renderowania względem kamery
|
||||
glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray());
|
||||
*/
|
||||
matrix4x4 mat; mat.OpenGL_Matrix( OpenGLMatrices.data_array( GL_MODELVIEW ) );
|
||||
// kąt między kierunkiem światła a współrzędnymi kamery
|
||||
vector3 gdzie = mat * vector3(0, 0, 0); // pozycja punktu świecącego względem kamery
|
||||
fCosViewAngle = DotProduct(Normalize(mat * vector3(0, 0, 1) - gdzie), Normalize(gdzie));
|
||||
if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła
|
||||
{
|
||||
double Distdimm = 1.0;
|
||||
if (fCosViewAngle <
|
||||
fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff
|
||||
if (fCosFalloffAngle < fCosHotspotAngle)
|
||||
Distdimm = 1.0 -
|
||||
(fCosHotspotAngle - fCosViewAngle) /
|
||||
(fCosHotspotAngle - fCosFalloffAngle);
|
||||
|
||||
/* TODO: poprawic to zeby dzialalo
|
||||
|
||||
2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where
|
||||
R0 is
|
||||
the radial source of the light if no attenuation is
|
||||
used, or the Near End
|
||||
value of the light if Attenuation is used. R is the
|
||||
radial distance of the
|
||||
illuminated surface from R0.)
|
||||
|
||||
3- Inverse Square (Applies inverse-square decay. The formula for this is
|
||||
(R0/R)^2.
|
||||
This is actually the "real-world" decay of light, but
|
||||
you might find it too dim
|
||||
in the world of computer graphics.)
|
||||
|
||||
<light>.DecayRadius -- The distance over which the decay occurs.
|
||||
|
||||
if (iFarAttenDecay>0)
|
||||
switch (iFarAttenDecay)
|
||||
{
|
||||
case 1:
|
||||
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
|
||||
//dorobic od kata
|
||||
break;
|
||||
case 2:
|
||||
Distdimm=fFarDecayRadius/(1+fSquareDist);
|
||||
//dorobic od kata
|
||||
break;
|
||||
}
|
||||
if (Distdimm>1)
|
||||
Distdimm=1;
|
||||
|
||||
*/
|
||||
GfxRenderer.Bind(0); // nie teksturować
|
||||
// glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
|
||||
// glColorMaterial(GL_FRONT,GL_EMISSION);
|
||||
float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm),
|
||||
(float)(f4Diffuse[2] * Distdimm), 0 };
|
||||
// glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm);
|
||||
glColorMaterial(GL_FRONT, GL_EMISSION);
|
||||
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
|
||||
// blendowaly
|
||||
glColor3fv(color); // inaczej są białe
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, color);
|
||||
glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z
|
||||
// VBO
|
||||
glEnable(GL_LIGHTING);
|
||||
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego słupy się świecą
|
||||
}
|
||||
}
|
||||
else if (eType == TP_STARS)
|
||||
{
|
||||
// glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie
|
||||
// blendowaly
|
||||
if (Global::fLuminance < fLight)
|
||||
{ // Ra: pewnie można by to zrobić
|
||||
// lepiej, bez powtarzania StartVBO()
|
||||
pRoot->EndVBO(); // Ra: to też nie jest zbyt ładne
|
||||
if (pRoot->StartColorVBO())
|
||||
{ // wyświetlanie kolorowych punktów zamiast
|
||||
// trójkątów
|
||||
GfxRenderer.Bind(0); // tekstury nie ma
|
||||
glColorMaterial(GL_FRONT, GL_EMISSION);
|
||||
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
|
||||
// blendowaly
|
||||
// glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na
|
||||
// kolorowo
|
||||
glDrawArrays(GL_POINTS, iVboPtr,
|
||||
iNumVerts); // narysuj naraz wszystkie punkty z VBO
|
||||
glEnable(GL_LIGHTING);
|
||||
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
|
||||
// glMaterialfv(GL_FRONT,GL_EMISSION,emm2);
|
||||
pRoot->EndVBO();
|
||||
pRoot->StartVBO();
|
||||
}
|
||||
}
|
||||
}
|
||||
/*Ra: tu coś jest bez sensu...
|
||||
else
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
// if (eType==smt_FreeSpotLight)
|
||||
// {
|
||||
// if (iFarAttenDecay==0)
|
||||
// glColor3f(Diffuse[0],Diffuse[1],Diffuse[2]);
|
||||
// }
|
||||
// else
|
||||
//TODO: poprawic zeby dzialalo
|
||||
glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
|
||||
glColorMaterial(GL_FRONT,GL_EMISSION);
|
||||
glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty
|
||||
swiecace sie blendowaly
|
||||
//glBegin(GL_POINTS);
|
||||
glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj
|
||||
wierzchołek z VBO
|
||||
// glVertex3f(0,0,0);
|
||||
//glEnd();
|
||||
glEnable(GL_LIGHTING);
|
||||
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
|
||||
glMaterialfv(GL_FRONT,GL_EMISSION,emm2);
|
||||
//glEndList();
|
||||
}
|
||||
*/
|
||||
if (Child != NULL)
|
||||
if (iAlpha & iFlags & 0x001F0000)
|
||||
Child->RenderVBO();
|
||||
if (iFlags & 0xC000)
|
||||
glPopMatrix();
|
||||
}
|
||||
if (b_Anim < at_SecondsJump)
|
||||
b_Anim = at_None; // wyłączenie animacji dla kolejnego użycia submodelu
|
||||
if (Next)
|
||||
if (iAlpha & iFlags & 0x1F000000)
|
||||
Next->RenderVBO(); // dalsze rekurencyjnie
|
||||
}; // RaRender
|
||||
|
||||
void TSubModel::RenderAlphaVBO()
|
||||
{ // renderowanie przezroczystych przez VBO
|
||||
if( ( iVisible )
|
||||
&& ( fSquareDist >= (fSquareMinDist / Global::fDistanceFactor) )
|
||||
&& ( fSquareDist <= (fSquareMaxDist * Global::fDistanceFactor) ) )
|
||||
{
|
||||
if (iFlags & 0xC000)
|
||||
{
|
||||
glPushMatrix(); // zapamiętanie matrycy
|
||||
if (fMatrix)
|
||||
glMultMatrixf(fMatrix->readArray());
|
||||
if (b_aAnim)
|
||||
RaAnimation(b_aAnim);
|
||||
}
|
||||
glColor3fv(f4Diffuse);
|
||||
if (eType < TP_ROTATOR)
|
||||
{ // renderowanie obiektów OpenGL
|
||||
if (iAlpha & iFlags & 0x2F) // rysuj gdy element przezroczysty
|
||||
{
|
||||
if (TextureID < 0) // && (ReplacableSkinId!=0))
|
||||
{ // zmienialne skory
|
||||
GfxRenderer.Bind(ReplacableSkinId[-TextureID]);
|
||||
// TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury
|
||||
}
|
||||
else
|
||||
GfxRenderer.Bind(TextureID); // również 0
|
||||
if (Global::fLuminance < fLight)
|
||||
{
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
|
||||
glDrawArrays(eType, iVboPtr,
|
||||
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
|
||||
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
|
||||
}
|
||||
else
|
||||
glDrawArrays(eType, iVboPtr,
|
||||
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
|
||||
}
|
||||
}
|
||||
else if (eType == TP_FREESPOTLIGHT)
|
||||
{
|
||||
// dorobić aureolę!
|
||||
}
|
||||
if (Child)
|
||||
if (iAlpha & iFlags & 0x002F0000)
|
||||
Child->RenderAlphaVBO();
|
||||
if (iFlags & 0xC000)
|
||||
glPopMatrix();
|
||||
}
|
||||
if (b_aAnim < at_SecondsJump)
|
||||
b_aAnim = at_None; // wyłączenie animacji dla kolejnego użycia submodelu
|
||||
if (Next)
|
||||
if (iAlpha & iFlags & 0x2F000000)
|
||||
Next->RenderAlphaVBO();
|
||||
}; // RaRenderAlpha
|
||||
#endif
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void TSubModel::RaArrayFill(CVertNormTex *Vert)
|
||||
@@ -2212,140 +1797,6 @@ void TModel3d::BreakHierarhy()
|
||||
Error("Not implemented yet :(");
|
||||
};
|
||||
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TModel3d::Render(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
|
||||
{
|
||||
iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste
|
||||
if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu?
|
||||
{
|
||||
TSubModel::fSquareDist = fSquareDistance; // zmienna globalna!
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->RenderDL();
|
||||
}
|
||||
};
|
||||
|
||||
void TModel3d::RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
|
||||
{
|
||||
if (iAlpha & iFlags & 0x2F2F002F)
|
||||
{
|
||||
TSubModel::fSquareDist = fSquareDistance; // zmienna globalna!
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->RenderAlphaDL();
|
||||
}
|
||||
};
|
||||
|
||||
void TModel3d::RaRender(double fSquareDistance, texture_manager::size_type const *ReplacableSkinId, int iAlpha)
|
||||
{ // renderowanie specjalne, np. kabiny
|
||||
iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste
|
||||
if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu?
|
||||
{
|
||||
TSubModel::fSquareDist = fSquareDistance; // zmienna globalna!
|
||||
if (StartVBO())
|
||||
{ // odwrócenie flag, aby wyłapać nieprzezroczyste
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->pRoot = this;
|
||||
Root->RenderVBO();
|
||||
EndVBO();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void TModel3d::RaRenderAlpha(double fSquareDistance, texture_manager::size_type const *ReplacableSkinId, int iAlpha)
|
||||
{ // renderowanie specjalne, np. kabiny
|
||||
if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu?
|
||||
{
|
||||
TSubModel::fSquareDist = fSquareDistance; // zmienna globalna!
|
||||
if (StartVBO())
|
||||
{
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->RenderAlphaVBO();
|
||||
EndVBO();
|
||||
}
|
||||
}
|
||||
};
|
||||
#endif
|
||||
//-----------------------------------------------------------------------------
|
||||
// 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha)
|
||||
{ // nieprzezroczyste, Display List
|
||||
glPushMatrix();
|
||||
glTranslated(vPosition->x, vPosition->y, vPosition->z);
|
||||
if (vAngle->y != 0.0)
|
||||
glRotated(vAngle->y, 0.0, 1.0, 0.0);
|
||||
if (vAngle->x != 0.0)
|
||||
glRotated(vAngle->x, 1.0, 0.0, 0.0);
|
||||
if (vAngle->z != 0.0)
|
||||
glRotated(vAngle->z, 0.0, 0.0, 1.0);
|
||||
TSubModel::fSquareDist =
|
||||
SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna!
|
||||
// odwrócenie flag, aby wyłapać nieprzezroczyste
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F);
|
||||
Root->RenderDL();
|
||||
glPopMatrix();
|
||||
};
|
||||
void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId,
|
||||
int iAlpha)
|
||||
{ // przezroczyste, Display List
|
||||
glPushMatrix();
|
||||
glTranslated(vPosition->x, vPosition->y, vPosition->z);
|
||||
if (vAngle->y != 0.0)
|
||||
glRotated(vAngle->y, 0.0, 1.0, 0.0);
|
||||
if (vAngle->x != 0.0)
|
||||
glRotated(vAngle->x, 1.0, 0.0, 0.0);
|
||||
if (vAngle->z != 0.0)
|
||||
glRotated(vAngle->z, 0.0, 0.0, 1.0);
|
||||
TSubModel::fSquareDist =
|
||||
SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna!
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->RenderAlphaDL();
|
||||
glPopMatrix();
|
||||
};
|
||||
|
||||
void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type const *ReplacableSkinId, int iAlpha)
|
||||
{ // nieprzezroczyste, VBO
|
||||
glPushMatrix();
|
||||
glTranslated(vPosition->x, vPosition->y, vPosition->z);
|
||||
if (vAngle->y != 0.0)
|
||||
glRotated(vAngle->y, 0.0, 1.0, 0.0);
|
||||
if (vAngle->x != 0.0)
|
||||
glRotated(vAngle->x, 1.0, 0.0, 0.0);
|
||||
if (vAngle->z != 0.0)
|
||||
glRotated(vAngle->z, 0.0, 0.0, 1.0);
|
||||
TSubModel::fSquareDist =
|
||||
SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna!
|
||||
if (StartVBO())
|
||||
{ // odwrócenie flag, aby wyłapać nieprzezroczyste
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F);
|
||||
Root->RenderVBO();
|
||||
EndVBO();
|
||||
}
|
||||
glPopMatrix();
|
||||
};
|
||||
void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type const *ReplacableSkinId,
|
||||
int iAlpha)
|
||||
{ // przezroczyste, VBO
|
||||
glPushMatrix();
|
||||
glTranslated(vPosition->x, vPosition->y, vPosition->z);
|
||||
if (vAngle->y != 0.0)
|
||||
glRotated(vAngle->y, 0.0, 1.0, 0.0);
|
||||
if (vAngle->x != 0.0)
|
||||
glRotated(vAngle->x, 1.0, 0.0, 0.0);
|
||||
if (vAngle->z != 0.0)
|
||||
glRotated(vAngle->z, 0.0, 0.0, 1.0);
|
||||
TSubModel::fSquareDist =
|
||||
SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna!
|
||||
if (StartVBO())
|
||||
{
|
||||
Root->ReplacableSet(ReplacableSkinId, iAlpha);
|
||||
Root->RenderAlphaVBO();
|
||||
EndVBO();
|
||||
}
|
||||
glPopMatrix();
|
||||
};
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// 2012-02 funkcje do tworzenia terenu z E3D
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
20
Model3d.h
20
Model3d.h
@@ -255,12 +255,6 @@ public:
|
||||
void SetRotateIK1(float3 vNewAngles);
|
||||
TSubModel * GetFromName(std::string const &search, bool i = true);
|
||||
TSubModel * GetFromName(char const *search, bool i = true);
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void RenderDL();
|
||||
void RenderAlphaDL();
|
||||
void RenderVBO();
|
||||
void RenderAlphaVBO();
|
||||
#endif
|
||||
// inline matrix4x4* GetMatrix() {return dMatrix;};
|
||||
inline float4x4 * GetMatrix()
|
||||
{
|
||||
@@ -361,20 +355,6 @@ public:
|
||||
bool LoadFromFile(std::string const &FileName, bool dynamic);
|
||||
void SaveToBinFile(char const *FileName);
|
||||
void BreakHierarhy();
|
||||
// renderowanie specjalne
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void Render(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
void RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
#endif
|
||||
void RaRender(double fSquareDistance, texture_manager::size_type const *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
void RaRenderAlpha(double fSquareDistance, texture_manager::size_type const *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
// trzy kąty obrotu
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
void Render( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030 );
|
||||
void RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
#endif
|
||||
void RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type const *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type const *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||
// inline int GetSubModelsCount() { return (SubModelsCount); };
|
||||
int Flags() const
|
||||
{
|
||||
|
||||
@@ -17,8 +17,6 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
using namespace Math3D;
|
||||
|
||||
#define EU07_DEBUG_VBO
|
||||
|
||||
// 110405 Ra: klasa punktów przekroju z normalnymi
|
||||
|
||||
class vector6 : public vector3
|
||||
|
||||
@@ -2595,11 +2595,7 @@ void TTrack::RenderDyn()
|
||||
{ // renderowanie nieprzezroczystych fragmentów pojazdów
|
||||
for( auto dynamic : Dynamics ) {
|
||||
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
dynamic->Render();
|
||||
#else
|
||||
GfxRenderer.Render( dynamic );
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2607,11 +2603,7 @@ void TTrack::RenderDynAlpha()
|
||||
{ // renderowanie przezroczystych fragmentów pojazdów
|
||||
for( auto dynamic : Dynamics ) {
|
||||
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
dynamic->RenderAlpha();
|
||||
#else
|
||||
GfxRenderer.Render_Alpha( dynamic );
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
393
World.cpp
393
World.cpp
@@ -906,43 +906,52 @@ void TWorld::DistantView( bool const Near )
|
||||
Camera.RaLook(); // jednorazowe przestawienie kamery
|
||||
};
|
||||
|
||||
void TWorld::FollowView(bool wycisz)
|
||||
{ // ustawienie śledzenia pojazdu
|
||||
// ustawienie śledzenia pojazdu
|
||||
void TWorld::FollowView(bool wycisz) {
|
||||
|
||||
Camera.Reset(); // likwidacja obrotów - patrzy horyzontalnie na południe
|
||||
|
||||
if (Controlled) // jest pojazd do prowadzenia?
|
||||
{
|
||||
vector3 camStara =
|
||||
Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
|
||||
// Controlled->ABuSetModelShake(vector3(0,0,0));
|
||||
Ground.Silence( Camera.Pos ); // wyciszenie dźwięków z poprzedniej pozycji
|
||||
|
||||
if (FreeFlyModeFlag)
|
||||
{ // jeżeli poza kabiną, przestawiamy w jej okolicę - OK
|
||||
if (Train)
|
||||
Train->Dynamic()->ABuSetModelShake(
|
||||
vector3(0, 0, 0)); // wyłączenie trzęsienia na siłę?
|
||||
// Camera.Pos=Train->pMechPosition+Normalize(Train->GetDirection())*20;
|
||||
if( Train ) {
|
||||
// wyłączenie trzęsienia na siłę?
|
||||
Train->Dynamic()->ABuSetModelShake( vector3() );
|
||||
}
|
||||
|
||||
DistantView(); // przestawienie kamery
|
||||
//żeby nie bylo numerów z 'fruwajacym' lokiem - konsekwencja bujania pudła
|
||||
Global::SetCameraPosition(
|
||||
Camera.Pos); // tu ustawić nową, bo od niej liczą się odległości
|
||||
Ground.Silence(camStara); // wyciszenie dźwięków z poprzedniej pozycji
|
||||
// tu ustawić nową, bo od niej liczą się odległości
|
||||
Global::SetCameraPosition( Camera.Pos );
|
||||
}
|
||||
else if (Train)
|
||||
{ // korekcja ustawienia w kabinie - OK
|
||||
vector3 camStara = Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
|
||||
// Ra: czy to tu jest potrzebne, bo przelicza się kawałek dalej?
|
||||
Camera.Pos = Train->pMechPosition; // Train.GetPosition1();
|
||||
if( wycisz ) {
|
||||
// wyciszenie dźwięków z poprzedniej pozycji
|
||||
// trzymanie prawego w kabinie daje marny efekt
|
||||
Ground.Silence( Camera.Pos );
|
||||
}
|
||||
Camera.Pos = Train->pMechPosition;
|
||||
Camera.Roll = std::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
|
||||
if (Train->Dynamic()->MoverParameters->ActiveCab == 0)
|
||||
Camera.LookAt = Train->pMechPosition + Train->GetDirection() * 5.0;
|
||||
else // patrz w strone wlasciwej kabiny
|
||||
Camera.LookAt = Train->pMechPosition + Train->GetDirection() * 5.0 * Train->Dynamic()->MoverParameters->ActiveCab;
|
||||
Train->pMechOffset.x = Train->pMechSittingPosition.x;
|
||||
Train->pMechOffset.y = Train->pMechSittingPosition.y;
|
||||
Train->pMechOffset.z = Train->pMechSittingPosition.z;
|
||||
|
||||
if( Train->Dynamic()->MoverParameters->ActiveCab == 0 ) {
|
||||
Camera.LookAt =
|
||||
Train->pMechPosition
|
||||
+ Train->GetDirection() * 5.0;
|
||||
}
|
||||
else {
|
||||
// patrz w strone wlasciwej kabiny
|
||||
Camera.LookAt =
|
||||
Train->pMechPosition
|
||||
+ Train->GetDirection() * 5.0 * Train->Dynamic()->MoverParameters->ActiveCab;
|
||||
}
|
||||
Train->pMechOffset = Train->pMechSittingPosition;
|
||||
|
||||
Global::SetCameraPosition( Train->Dynamic() ->GetPosition()); // tu ustawić nową, bo od niej liczą się odległości
|
||||
if (wycisz) // trzymanie prawego w kabinie daje marny efekt
|
||||
Ground.Silence(camStara); // wyciszenie dźwięków z poprzedniej pozycji
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1239,105 +1248,7 @@ TWorld::Update_Camera( double const Deltatime ) {
|
||||
|
||||
void TWorld::Update_Environment() {
|
||||
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
|
||||
if( Global::fMoveLight < 0.0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// double a=Global::fTimeAngleDeg/180.0*M_PI-M_PI; //kąt godzinny w radianach
|
||||
double a = fmod( Global::fTimeAngleDeg, 360.0 ) / 180.0 * M_PI -
|
||||
M_PI; // kąt godzinny w radianach
|
||||
//(a) jest traktowane jako czas miejscowy, nie uwzględniający stref czasowych ani czasu
|
||||
// letniego
|
||||
// aby wyznaczyć strefę czasową, trzeba uwzględnić południk miejscowy
|
||||
// aby uwzględnić czas letni, trzeba sprawdzić dzień roku
|
||||
double L = Global::fLatitudeDeg / 180.0 * M_PI; // szerokość geograficzna
|
||||
double H = asin( cos( L ) * cos( Global::fSunDeclination ) * cos( a ) +
|
||||
sin( L ) * sin( Global::fSunDeclination ) ); // kąt ponad horyzontem
|
||||
// double A=asin(cos(d)*sin(M_PI-a)/cos(H));
|
||||
// Declination=((0.322003-22.971*cos(t)-0.357898*cos(2*t)-0.14398*cos(3*t)+3.94638*sin(t)+0.019334*sin(2*t)+0.05928*sin(3*t)))*Pi/180
|
||||
// Altitude=asin(sin(Declination)*sin(latitude)+cos(Declination)*cos(latitude)*cos((15*(time-12))*(Pi/180)));
|
||||
// Azimuth=(acos((cos(latitude)*sin(Declination)-cos(Declination)*sin(latitude)*cos((15*(time-12))*(Pi/180)))/cos(Altitude)));
|
||||
// double A=acos(cos(L)*sin(d)-cos(d)*sin(L)*cos(M_PI-a)/cos(H));
|
||||
// dAzimuth = atan2(-sin( dHourAngle ),tan( dDeclination )*dCos_Latitude -
|
||||
// dSin_Latitude*dCos_HourAngle );
|
||||
double A = atan2( sin( a ), tan( Global::fSunDeclination ) * cos( L ) - sin( L ) * cos( a ) );
|
||||
vector3 lp = vector3( sin( A ), tan( H ), cos( A ) );
|
||||
lp = Normalize( lp ); // przeliczenie na wektor długości 1.0
|
||||
Global::lightPos[ 0 ] = (float)lp.x;
|
||||
Global::lightPos[ 1 ] = (float)lp.y;
|
||||
Global::lightPos[ 2 ] = (float)lp.z;
|
||||
glLightfv( GL_LIGHT0, GL_POSITION, Global::lightPos ); // daylight position
|
||||
if( H > 0 ) { // słońce ponad horyzontem
|
||||
Global::ambientDayLight[ 0 ] = Global::ambientLight[ 0 ];
|
||||
Global::ambientDayLight[ 1 ] = Global::ambientLight[ 1 ];
|
||||
Global::ambientDayLight[ 2 ] = Global::ambientLight[ 2 ];
|
||||
if( H > 0.02 ) // ponad 1.146° zaczynają się cienie
|
||||
{
|
||||
Global::diffuseDayLight[ 0 ] =
|
||||
Global::diffuseLight[ 0 ]; // od wschodu do zachodu maksimum ???
|
||||
Global::diffuseDayLight[ 1 ] = Global::diffuseLight[ 1 ];
|
||||
Global::diffuseDayLight[ 2 ] = Global::diffuseLight[ 2 ];
|
||||
Global::specularDayLight[ 0 ] = Global::specularLight[ 0 ]; // podobnie specular
|
||||
Global::specularDayLight[ 1 ] = Global::specularLight[ 1 ];
|
||||
Global::specularDayLight[ 2 ] = Global::specularLight[ 2 ];
|
||||
}
|
||||
else {
|
||||
Global::diffuseDayLight[ 0 ] =
|
||||
50 * H * Global::diffuseLight[ 0 ]; // wschód albo zachód
|
||||
Global::diffuseDayLight[ 1 ] = 50 * H * Global::diffuseLight[ 1 ];
|
||||
Global::diffuseDayLight[ 2 ] = 50 * H * Global::diffuseLight[ 2 ];
|
||||
Global::specularDayLight[ 0 ] =
|
||||
50 * H * Global::specularLight[ 0 ]; // podobnie specular
|
||||
Global::specularDayLight[ 1 ] = 50 * H * Global::specularLight[ 1 ];
|
||||
Global::specularDayLight[ 2 ] = 50 * H * Global::specularLight[ 2 ];
|
||||
}
|
||||
}
|
||||
else { // słońce pod horyzontem
|
||||
GLfloat lum = 3.1831 * ( H > -0.314159 ? 0.314159 + H :
|
||||
0.0 ); // po zachodzie ambient się ściemnia
|
||||
Global::ambientDayLight[ 0 ] = lum * Global::ambientLight[ 0 ];
|
||||
Global::ambientDayLight[ 1 ] = lum * Global::ambientLight[ 1 ];
|
||||
Global::ambientDayLight[ 2 ] = lum * Global::ambientLight[ 2 ];
|
||||
Global::diffuseDayLight[ 0 ] =
|
||||
Global::noLight[ 0 ]; // od zachodu do wschodu nie ma diffuse
|
||||
Global::diffuseDayLight[ 1 ] = Global::noLight[ 1 ];
|
||||
Global::diffuseDayLight[ 2 ] = Global::noLight[ 2 ];
|
||||
Global::specularDayLight[ 0 ] = Global::noLight[ 0 ]; // ani specular
|
||||
Global::specularDayLight[ 1 ] = Global::noLight[ 1 ];
|
||||
Global::specularDayLight[ 2 ] = Global::noLight[ 2 ];
|
||||
}
|
||||
// Calculate sky colour according to time of day.
|
||||
// GLfloat sin_t = sin(PI * time_of_day / 12.0);
|
||||
// back_red = 0.3 * (1.0 - sin_t);
|
||||
// back_green = 0.9 * sin_t;
|
||||
// back_blue = sin_t + 0.4, 1.0;
|
||||
// aktualizacja świateł
|
||||
glLightfv( GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight );
|
||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight );
|
||||
glLightfv( GL_LIGHT0, GL_SPECULAR, Global::specularDayLight );
|
||||
|
||||
Global::fLuminance = // to posłuży również do zapalania latarń
|
||||
+0.150 * ( Global::diffuseDayLight[ 0 ] + Global::ambientDayLight[ 0 ] ) // R
|
||||
+ 0.295 * ( Global::diffuseDayLight[ 1 ] + Global::ambientDayLight[ 1 ] ) // G
|
||||
+ 0.055 * ( Global::diffuseDayLight[ 2 ] + Global::ambientDayLight[ 2 ] ); // B
|
||||
|
||||
vector3 sky = vector3( Global::AtmoColor[ 0 ], Global::AtmoColor[ 1 ], Global::AtmoColor[ 2 ] );
|
||||
if( Global::fLuminance < 0.25 ) { // przyspieszenie zachodu/wschodu
|
||||
sky *= 4.0 * Global::fLuminance; // nocny kolor nieba
|
||||
GLfloat fog[ 3 ];
|
||||
fog[ 0 ] = Global::FogColor[ 0 ] * 4.0 * Global::fLuminance;
|
||||
fog[ 1 ] = Global::FogColor[ 1 ] * 4.0 * Global::fLuminance;
|
||||
fog[ 2 ] = Global::FogColor[ 2 ] * 4.0 * Global::fLuminance;
|
||||
glFogfv( GL_FOG_COLOR, fog ); // nocny kolor mgły
|
||||
}
|
||||
else {
|
||||
glFogfv( GL_FOG_COLOR, Global::FogColor ); // kolor mgły
|
||||
}
|
||||
#else
|
||||
Environment.update();
|
||||
#endif
|
||||
}
|
||||
|
||||
void TWorld::ResourceSweep()
|
||||
@@ -1364,11 +1275,7 @@ TWorld::Render_Cab() {
|
||||
// ABu: Rendering kabiny jako ostatniej, zeby bylo widac przez szyby, tylko w widoku ze srodka
|
||||
return;
|
||||
}
|
||||
/*
|
||||
// ABu: Rendering kabiny jako ostatniej, zeby bylo widac przez szyby, tylko w widoku ze srodka
|
||||
if( ( Train->Dynamic()->mdKabina != Train->Dynamic()->mdModel ) &&
|
||||
Train->Dynamic()->bDisplayCab && !FreeFlyModeFlag ) {
|
||||
*/
|
||||
|
||||
glPushMatrix();
|
||||
vector3 pos = dynamic->GetPosition(); // wszpółrzędne pojazdu z kabiną
|
||||
// glTranslatef(pos.x,pos.y,pos.z); //przesunięcie o wektor (tak było i trzęsło)
|
||||
@@ -1377,247 +1284,24 @@ TWorld::Render_Cab() {
|
||||
glLoadIdentity(); // zacząć od macierzy jedynkowej
|
||||
Camera.SetCabMatrix( pos ); // widok z kamery po przesunięciu
|
||||
glMultMatrixd( dynamic->mMatrix.getArray() ); // ta macierz nie ma przesunięcia
|
||||
/*
|
||||
//*yB: moje smuuugi 1
|
||||
if( Global::bSmudge ) { // Ra: uwzględniłem zacienienie pojazdu przy zapalaniu smug
|
||||
|
||||
// 1. warunek na smugę wyznaczyc wcześniej
|
||||
// 2. jeśli smuga włączona, nie renderować pojazdu użytkownika w DynObj
|
||||
// 3. jeśli smuga właczona, wyrenderować pojazd użytkownia po dodaniu smugi do sceny
|
||||
auto const &frontlights = Train->Controlled()->iLights[ 0 ];
|
||||
float frontlightstrength = 0.f +
|
||||
( ( frontlights & 1 ) ? 0.3f : 0.f ) +
|
||||
( ( frontlights & 4 ) ? 0.3f : 0.f ) +
|
||||
( ( frontlights & 16 ) ? 0.3f : 0.f );
|
||||
frontlightstrength = std::max( frontlightstrength - Global::fLuminance, 0.0 );
|
||||
auto const &rearlights = Train->Controlled()->iLights[ 1 ];
|
||||
float rearlightstrength = 0.f +
|
||||
( ( rearlights & 1 ) ? 0.3f : 0.f ) +
|
||||
( ( rearlights & 4 ) ? 0.3f : 0.f ) +
|
||||
( ( rearlights & 16 ) ? 0.3f : 0.f );
|
||||
rearlightstrength = std::max( rearlightstrength - Global::fLuminance, 0.0 );
|
||||
|
||||
if( ( Train->Controlled()->Battery ) // trochę na skróty z tą baterią
|
||||
&& ( ( frontlightstrength > 0.f )
|
||||
|| ( rearlightstrength > 0.f ) ) ) {
|
||||
|
||||
if( Global::bOldSmudge == true ) {
|
||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
|
||||
// glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_DST_COLOR);
|
||||
// glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE);
|
||||
glDisable( GL_DEPTH_TEST );
|
||||
glDisable( GL_LIGHTING );
|
||||
glDisable( GL_FOG );
|
||||
GfxRenderer.Bind( light ); // Select our texture
|
||||
glBegin( GL_QUADS );
|
||||
float fSmudge =
|
||||
dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę
|
||||
if( frontlightstrength > 0.f ) { // wystarczy jeden zapalony z przodu
|
||||
glColor4f( 1.0f, 1.0f, 1.0f, 0.5f * frontlightstrength );
|
||||
glTexCoord2f( 0, 0 );
|
||||
glVertex3f( 15.0, 0.0, +fSmudge ); // rysowanie względem położenia modelu
|
||||
glTexCoord2f( 1, 0 );
|
||||
glVertex3f( -15.0, 0.0, +fSmudge );
|
||||
glTexCoord2f( 1, 1 );
|
||||
glVertex3f( -15.0, 2.5, 250.0 );
|
||||
glTexCoord2f( 0, 1 );
|
||||
glVertex3f( 15.0, 2.5, 250.0 );
|
||||
}
|
||||
if( rearlightstrength > 0.f ) { // wystarczy jeden zapalony z tyłu
|
||||
glColor4f( 1.0f, 1.0f, 1.0f, 0.5f * rearlightstrength );
|
||||
glTexCoord2f( 0, 0 );
|
||||
glVertex3f( -15.0, 0.0, -fSmudge );
|
||||
glTexCoord2f( 1, 0 );
|
||||
glVertex3f( 15.0, 0.0, -fSmudge );
|
||||
glTexCoord2f( 1, 1 );
|
||||
glVertex3f( 15.0, 2.5, -250.0 );
|
||||
glTexCoord2f( 0, 1 );
|
||||
glVertex3f( -15.0, 2.5, -250.0 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||
glEnable( GL_DEPTH_TEST );
|
||||
// glEnable(GL_LIGHTING); //i tak się włączy potem
|
||||
glEnable( GL_FOG );
|
||||
}
|
||||
else {
|
||||
|
||||
glBlendFunc( GL_DST_COLOR, GL_ONE );
|
||||
glDepthFunc( GL_GEQUAL );
|
||||
glAlphaFunc( GL_GREATER, 0.004 );
|
||||
// glDisable(GL_DEPTH_TEST);
|
||||
glDisable( GL_LIGHTING );
|
||||
glDisable( GL_FOG );
|
||||
//glColor4f(0.15f, 0.15f, 0.15f, 0.25f);
|
||||
GfxRenderer.Bind( light ); // Select our texture
|
||||
//float ddl = (0.15*Global::diffuseDayLight[0]+0.295*Global::diffuseDayLight[1]+0.055*Global::diffuseDayLight[2]); //0.24:0
|
||||
glBegin( GL_QUADS );
|
||||
float fSmudge = dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę
|
||||
if( frontlightstrength > 0.f ) {
|
||||
// wystarczy jeden zapalony z przodu
|
||||
for( int i = 15; i <= 35; i++ ) {
|
||||
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*sqrt( ( 1 / sqrt( Global::fLuminance + 0.015 ) ) - 1 ) * 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( 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( 0, 1 ); glVertex3f( -10 / 2 - 2 * i / 4, -5.0 - 0.5*z, 13 + 1.7*z / 3 );
|
||||
}
|
||||
}
|
||||
if( rearlightstrength > 0.f ) {
|
||||
// wystarczy jeden zapalony z tyłu
|
||||
for( int i = 15; i <= 35; i++ ) {
|
||||
float z = i * i * i * 0.01f;//25/4;
|
||||
float C = ( 36 - i*0.5 )*0.005*sqrt( ( 1 / sqrt( Global::fLuminance + 0.015 ) ) - 1 ) * rearlightstrength;
|
||||
glColor4f( C, C, C, 1.0f );// *rearlightstrength );
|
||||
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, 1 ); glVertex3f( -10 / 2 - 2 * i / 4, -5.0 - 0.5*z, -13 - 1.7*z / 3 );
|
||||
glTexCoord2f( 0, 1 ); glVertex3f( 10 / 2 + 2 * i / 4, -5.0 - 0.5*z, -13 - 1.7*z / 3 );
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||
// glEnable(GL_DEPTH_TEST);
|
||||
glAlphaFunc( GL_GREATER, 0.04 );
|
||||
glDepthFunc( GL_LEQUAL );
|
||||
glEnable( GL_LIGHTING ); //i tak się włączy potem
|
||||
glEnable( GL_FOG );
|
||||
}
|
||||
}
|
||||
|
||||
glEnable( GL_LIGHTING ); // po renderowaniu smugi jest to wyłączone
|
||||
// Ra: pojazd użytkownika należało by renderować po smudze, aby go nie rozświetlała
|
||||
|
||||
Global::bSmudge = false; // aby model użytkownika się teraz wyrenderował
|
||||
dynamic->Render();
|
||||
dynamic->RenderAlpha(); // przezroczyste fragmenty pojazdów na torach
|
||||
|
||||
} // yB: moje smuuugi 1 - koniec
|
||||
else
|
||||
*/ glEnable( GL_LIGHTING ); // po renderowaniu drutów może być to wyłączone. TODO: have the wires render take care of its own shit
|
||||
glEnable( GL_LIGHTING ); // po renderowaniu drutów może być to wyłączone. TODO: have the wires render take care of its own shit
|
||||
|
||||
if( dynamic->mdKabina ) // bo mogła zniknąć przy przechodzeniu do innego pojazdu
|
||||
{
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// oswietlenie kabiny
|
||||
GLfloat ambientCabLight[ 4 ] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
||||
GLfloat diffuseCabLight[ 4 ] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
||||
GLfloat specularCabLight[ 4 ] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
||||
for( int li = 0; li < 3; li++ ) { // przyciemnienie standardowe
|
||||
ambientCabLight[ li ] = Global::ambientDayLight[ li ] * 0.9;
|
||||
diffuseCabLight[ li ] = Global::diffuseDayLight[ li ] * 0.5;
|
||||
specularCabLight[ li ] = Global::specularDayLight[ li ] * 0.5;
|
||||
}
|
||||
switch( dynamic->MyTrack->eEnvironment ) { // wpływ świetła zewnętrznego
|
||||
case e_canyon:
|
||||
{
|
||||
for( int li = 0; li < 3; li++ ) {
|
||||
diffuseCabLight[ li ] *= 0.6;
|
||||
specularCabLight[ li ] *= 0.7;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case e_tunnel:
|
||||
{
|
||||
for( int li = 0; li < 3; li++ ) {
|
||||
ambientCabLight[ li ] *= 0.3;
|
||||
diffuseCabLight[ li ] *= 0.1;
|
||||
specularCabLight[ li ] *= 0.2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
switch( Train->iCabLightFlag ) // Ra: uzeleżnic od napięcia w obwodzie sterowania
|
||||
{ // hunter-091012: uzaleznienie jasnosci od przetwornicy
|
||||
case 0: //światło wewnętrzne zgaszone
|
||||
break;
|
||||
case 1: //światło wewnętrzne przygaszone (255 216 176)
|
||||
if( dynamic->MoverParameters->ConverterFlag ==
|
||||
true ) // jasnosc dla zalaczonej przetwornicy
|
||||
{
|
||||
ambientCabLight[ 0 ] = Max0R( 0.700, ambientCabLight[ 0 ] ) * 0.75; // R
|
||||
ambientCabLight[ 1 ] = Max0R( 0.593, ambientCabLight[ 1 ] ) * 0.75; // G
|
||||
ambientCabLight[ 2 ] = Max0R( 0.483, ambientCabLight[ 2 ] ) * 0.75; // B
|
||||
|
||||
for( int i = 0; i < 3; i++ )
|
||||
if( ambientCabLight[ i ] <= ( Global::ambientDayLight[ i ] * 0.9 ) )
|
||||
ambientCabLight[ i ] = Global::ambientDayLight[ i ] * 0.9;
|
||||
}
|
||||
else {
|
||||
ambientCabLight[ 0 ] = Max0R( 0.700, ambientCabLight[ 0 ] ) * 0.375; // R
|
||||
ambientCabLight[ 1 ] = Max0R( 0.593, ambientCabLight[ 1 ] ) * 0.375; // G
|
||||
ambientCabLight[ 2 ] = Max0R( 0.483, ambientCabLight[ 2 ] ) * 0.375; // B
|
||||
|
||||
for( int i = 0; i < 3; i++ )
|
||||
if( ambientCabLight[ i ] <= ( Global::ambientDayLight[ i ] * 0.9 ) )
|
||||
ambientCabLight[ i ] = Global::ambientDayLight[ i ] * 0.9;
|
||||
}
|
||||
break;
|
||||
case 2: //światło wewnętrzne zapalone (255 216 176)
|
||||
if( dynamic->MoverParameters->ConverterFlag ==
|
||||
true ) // jasnosc dla zalaczonej przetwornicy
|
||||
{
|
||||
ambientCabLight[ 0 ] = Max0R( 1.000, ambientCabLight[ 0 ] ); // R
|
||||
ambientCabLight[ 1 ] = Max0R( 0.847, ambientCabLight[ 1 ] ); // G
|
||||
ambientCabLight[ 2 ] = Max0R( 0.690, ambientCabLight[ 2 ] ); // B
|
||||
|
||||
for( int i = 0; i < 3; i++ )
|
||||
if( ambientCabLight[ i ] <= ( Global::ambientDayLight[ i ] * 0.9 ) )
|
||||
ambientCabLight[ i ] = Global::ambientDayLight[ i ] * 0.9;
|
||||
}
|
||||
else {
|
||||
ambientCabLight[ 0 ] = Max0R( 1.000, ambientCabLight[ 0 ] ) * 0.5; // R
|
||||
ambientCabLight[ 1 ] = Max0R( 0.847, ambientCabLight[ 1 ] ) * 0.5; // G
|
||||
ambientCabLight[ 2 ] = Max0R( 0.690, ambientCabLight[ 2 ] ) * 0.5; // B
|
||||
|
||||
for( int i = 0; i < 3; i++ )
|
||||
if( ambientCabLight[ i ] <= ( Global::ambientDayLight[ i ] * 0.9 ) )
|
||||
ambientCabLight[ i ] = Global::ambientDayLight[ i ] * 0.9;
|
||||
}
|
||||
break;
|
||||
}
|
||||
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientCabLight );
|
||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseCabLight );
|
||||
glLightfv( GL_LIGHT0, GL_SPECULAR, specularCabLight );
|
||||
#else
|
||||
// setup
|
||||
if( dynamic->fShade > 0.0f ) {
|
||||
// change light level based on light level of the occupied track
|
||||
Global::DayLight.apply_intensity( dynamic->fShade );
|
||||
}
|
||||
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
|
||||
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
if( Global::bUseVBO ) {
|
||||
// renderowanie z użyciem VBO. NOTE: needs update, and eventual merge into single render path down the road
|
||||
dynamic->mdKabina->RaRender( 0.0, dynamic->Material()->replacable_skins, dynamic->Material()->textures_alpha );
|
||||
dynamic->mdKabina->RaRenderAlpha( 0.0, dynamic->Material()->replacable_skins, dynamic->Material()->textures_alpha );
|
||||
}
|
||||
else {
|
||||
// renderowanie z Display List
|
||||
dynamic->mdKabina->Render( 0.0, dynamic->ReplacableSkinID, dynamic->iAlpha );
|
||||
dynamic->mdKabina->RenderAlpha( 0.0, dynamic->ReplacableSkinID, dynamic->iAlpha );
|
||||
}
|
||||
#else
|
||||
// render
|
||||
GfxRenderer.Render( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
||||
GfxRenderer.Render_Alpha( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
||||
#endif
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// przywrócenie standardowych, bo zawsze są zmieniane
|
||||
glLightfv( GL_LIGHT0, GL_AMBIENT, Global::ambientDayLight );
|
||||
glLightfv( GL_LIGHT0, GL_DIFFUSE, Global::diffuseDayLight );
|
||||
glLightfv( GL_LIGHT0, GL_SPECULAR, Global::specularDayLight );
|
||||
#else
|
||||
// post-render restore
|
||||
if( dynamic->fShade > 0.0f ) {
|
||||
// change light level based on light level of the occupied track
|
||||
Global::DayLight.apply_intensity();
|
||||
@@ -1627,7 +1311,6 @@ TWorld::Render_Cab() {
|
||||
GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
27
sky.cpp
27
sky.cpp
@@ -31,39 +31,18 @@ void TSky::Render( float3 const &Tint )
|
||||
{
|
||||
if (mdCloud)
|
||||
{ // jeśli jest model nieba
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
// TODO: re-implement this
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
|
||||
#else
|
||||
// setup
|
||||
::glEnable( GL_LIGHTING );
|
||||
GfxRenderer.Disable_Lights();
|
||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &Tint.x );
|
||||
#endif
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
if( Global::bUseVBO )
|
||||
{ // renderowanie z VBO
|
||||
mdCloud->RaRender( 100, 0 );
|
||||
mdCloud->RaRenderAlpha(100, 0);
|
||||
}
|
||||
else
|
||||
{ // renderowanie z Display List
|
||||
mdCloud->Render(100, 0);
|
||||
mdCloud->RenderAlpha(100, 0);
|
||||
}
|
||||
#else
|
||||
// render
|
||||
GfxRenderer.Render( mdCloud, nullptr, 100.0 );
|
||||
GfxRenderer.Render_Alpha( mdCloud, nullptr, 100.0 );
|
||||
#endif
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
glPopMatrix();
|
||||
// TODO: re-implement this
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, Global::lightPos);
|
||||
#else
|
||||
// post-render cleanup
|
||||
GLfloat noambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, noambient );
|
||||
::glEnable( GL_LIGHT0 ); // other lights will be enabled during lights update
|
||||
::glDisable( GL_LIGHTING );
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
13
stars.cpp
13
stars.cpp
@@ -14,23 +14,16 @@ cStars::init() {
|
||||
|
||||
void
|
||||
cStars::render() {
|
||||
|
||||
// setup
|
||||
::glPushMatrix();
|
||||
|
||||
::glRotatef( m_latitude, 1.0f, 0.0f, 0.0f ); // ustawienie osi OY na północ
|
||||
::glRotatef( -std::fmod( (float)Global::fTimeAngleDeg, 360.0f ), 0.0f, 1.0f, 0.0f ); // obrót dobowy osi OX
|
||||
|
||||
::glPointSize( 2.0f );
|
||||
#ifdef EU07_USE_OLD_RENDERCODE
|
||||
if( Global::bUseVBO ) {
|
||||
m_stars.RaRender( 1.0, 0 );
|
||||
}
|
||||
else {
|
||||
m_stars.Render( 1.0 );
|
||||
}
|
||||
#else
|
||||
// render
|
||||
GfxRenderer.Render( &m_stars, nullptr, 1.0 );
|
||||
#endif
|
||||
// post-render cleanup
|
||||
::glPointSize( 3.0f );
|
||||
|
||||
::glPopMatrix();
|
||||
|
||||
Reference in New Issue
Block a user