mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 02:49: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;
|
pModel = NULL;
|
||||||
iNumLights = 0;
|
iNumLights = 0;
|
||||||
fBlinkTimer = 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++)
|
for (int i = 0; i < iMaxNumLights; i++)
|
||||||
{
|
{
|
||||||
LightsOn[i] = LightsOff[i] = NULL; // normalnie nie ma
|
LightsOn[i] = LightsOff[i] = NULL; // normalnie nie ma
|
||||||
@@ -443,28 +437,7 @@ bool TAnimModel::Init(TModel3d *pNewModel)
|
|||||||
pModel = pNewModel;
|
pModel = pNewModel;
|
||||||
return (pModel != NULL);
|
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)
|
bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture)
|
||||||
{
|
{
|
||||||
if (asReplacableTexture.substr(0, 1) ==
|
if (asReplacableTexture.substr(0, 1) ==
|
||||||
@@ -485,7 +458,6 @@ bool TAnimModel::Init(std::string const &asName, std::string const &asReplacable
|
|||||||
// przezroczystych
|
// przezroczystych
|
||||||
return (Init(TModelsManager::GetModel(asName)));
|
return (Init(TModelsManager::GetModel(asName)));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
bool TAnimModel::Load(cParser *parser, bool ter)
|
bool TAnimModel::Load(cParser *parser, bool ter)
|
||||||
{ // rozpoznanie wpisu modelu i ustawienie świateł
|
{ // 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
|
// for (pCurrent=pRoot;pCurrent!=NULL;pCurrent=pCurrent->pNext) //albo osobny łańcuch
|
||||||
// pCurrent->UpdateModelIK(); //przeliczenie odwrotnej kinematyki
|
// 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()
|
int TAnimModel::Flags()
|
||||||
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
||||||
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
||||||
if( m_materialdata.replacable_skins[ 1 ] > 0 ) // jeśli ma wymienną teksturę 0
|
if( m_materialdata.replacable_skins[ 1 ] > 0 ) // jeśli ma wymienną teksturę 0
|
||||||
i |= (i & 0x01010001) * ((m_materialdata.textures_alpha & 1) ? 0x20 : 0x10);
|
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;
|
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 ) {
|
void TAnimModel::Render( vector3 *vPosition ) {
|
||||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||||
RaPrepare();
|
RaPrepare();
|
||||||
@@ -726,7 +617,6 @@ void TAnimModel::RenderAlpha( vector3 *vPosition ) {
|
|||||||
if( pModel ) // renderowanie rekurencyjne submodeli
|
if( pModel ) // renderowanie rekurencyjne submodeli
|
||||||
GfxRenderer.Render_Alpha( pModel, Material(), *vPosition, vAngle );
|
GfxRenderer.Render_Alpha( pModel, Material(), *vPosition, vAngle );
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
bool TAnimModel::TerrainLoaded()
|
bool TAnimModel::TerrainLoaded()
|
||||||
@@ -901,13 +791,8 @@ void TAnimModel::LightSet(int n, float v)
|
|||||||
void TAnimModel::AnimUpdate(double dt)
|
void TAnimModel::AnimUpdate(double dt)
|
||||||
{ // wykonanie zakolejkowanych animacji, nawet gdy modele nie są aktualnie wyświetlane
|
{ // wykonanie zakolejkowanych animacji, nawet gdy modele nie są aktualnie wyświetlane
|
||||||
TAnimContainer *p = TAnimModel::acAnimList;
|
TAnimContainer *p = TAnimModel::acAnimList;
|
||||||
while (p)
|
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
|
|
||||||
// }
|
|
||||||
p->UpdateModel();
|
p->UpdateModel();
|
||||||
p = p->acAnimNext; // na razie bez usuwania z listy, bo głównie obrotnica na nią wchodzi
|
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
|
#pragma once
|
||||||
#define AnimModelH
|
|
||||||
|
|
||||||
#include "Model3d.h"
|
#include "Model3d.h"
|
||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
@@ -139,11 +138,7 @@ class TAnimModel
|
|||||||
TSubModel *LightsOn[iMaxNumLights]; // Ra: te wskaźniki powinny być w ramach TModel3d
|
TSubModel *LightsOn[iMaxNumLights]; // Ra: te wskaźniki powinny być w ramach TModel3d
|
||||||
TSubModel *LightsOff[iMaxNumLights];
|
TSubModel *LightsOff[iMaxNumLights];
|
||||||
vector3 vAngle; // bazowe obroty egzemplarza względem osi
|
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;
|
material_data m_materialdata;
|
||||||
#endif
|
|
||||||
|
|
||||||
std::string asText; // tekst dla wyświetlacza znakowego
|
std::string asText; // tekst dla wyświetlacza znakowego
|
||||||
TAnimAdvanced *pAdvanced;
|
TAnimAdvanced *pAdvanced;
|
||||||
@@ -155,14 +150,9 @@ class TAnimModel
|
|||||||
void RaAnimate(); // przeliczenie animacji egzemplarza
|
void RaAnimate(); // przeliczenie animacji egzemplarza
|
||||||
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
|
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
|
||||||
public:
|
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
|
static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane również bez wyświetlania
|
||||||
#ifndef EU07_USE_OLD_RENDERCODE
|
|
||||||
inline
|
inline
|
||||||
material_data const *Material() const { return &m_materialdata; }
|
material_data const *Material() const { return &m_materialdata; }
|
||||||
#endif
|
|
||||||
|
|
||||||
TAnimModel();
|
TAnimModel();
|
||||||
~TAnimModel();
|
~TAnimModel();
|
||||||
@@ -171,20 +161,8 @@ class TAnimModel
|
|||||||
bool Load(cParser *parser, bool ter = false);
|
bool Load(cParser *parser, bool ter = false);
|
||||||
TAnimContainer * AddContainer(char *pName);
|
TAnimContainer * AddContainer(char *pName);
|
||||||
TAnimContainer * GetContainer(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 Render( vector3 *vPosition );
|
||||||
void RenderAlpha( vector3 *vPosition );
|
void RenderAlpha( vector3 *vPosition );
|
||||||
#endif
|
|
||||||
int Flags();
|
int Flags();
|
||||||
void RaAnglesSet(double a, double b, double c)
|
void RaAnglesSet(double a, double b, double c)
|
||||||
{
|
{
|
||||||
@@ -201,6 +179,4 @@ class TAnimModel
|
|||||||
static void AnimUpdate(double dt);
|
static void AnimUpdate(double dt);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -512,11 +512,6 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
|
|||||||
return;
|
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)
|
while (fCurrentDistance < fDistance)
|
||||||
{
|
{
|
||||||
if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony
|
if (pTrack != tLast) // ostatni zapisany w tabelce nie był jeszcze sprawdzony
|
||||||
|
|||||||
401
DynObj.cpp
401
DynObj.cpp
@@ -1531,14 +1531,6 @@ TDynamicObject::TDynamicObject()
|
|||||||
//}
|
//}
|
||||||
mdModel = NULL;
|
mdModel = NULL;
|
||||||
mdKabina = 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;
|
// smWiazary[0]=smWiazary[1]=NULL;
|
||||||
smWahacze[0] = smWahacze[1] = smWahacze[2] = smWahacze[3] = NULL;
|
smWahacze[0] = smWahacze[1] = smWahacze[2] = smWahacze[3] = NULL;
|
||||||
fWahaczeAmp = 0;
|
fWahaczeAmp = 0;
|
||||||
@@ -3563,262 +3555,6 @@ void TDynamicObject::TurnOff()
|
|||||||
btMechanik1.TurnOff();
|
btMechanik1.TurnOff();
|
||||||
btMechanik2.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()
|
void TDynamicObject::RenderSounds()
|
||||||
{ // przeliczanie dźwięków, bo będzie słychać bez wyświetlania sektora z pojazdem
|
{ // 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:") {
|
if( token == "models:") {
|
||||||
// modele i podmodele
|
// 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?
|
m_materialdata.multi_textures = 0; // czy jest wiele tekstur wymiennych?
|
||||||
parser.getTokens();
|
parser.getTokens();
|
||||||
parser >> asModel;
|
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 = asModel[i + 1] - '0';
|
||||||
m_materialdata.multi_textures = clamp( m_materialdata.multi_textures, 0, 1 ); // na razie ustawiamy na 1
|
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
|
asModel = BaseDir + asModel; // McZapkie 2002-07-20: dynamics maja swoje
|
||||||
// modele w dynamics/basedir
|
// modele w dynamics/basedir
|
||||||
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
|
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
|
||||||
mdModel = TModelsManager::GetModel(asModel, true);
|
mdModel = TModelsManager::GetModel(asModel, true);
|
||||||
assert( mdModel != nullptr ); // TODO: handle this more gracefully than all going to shit
|
assert( mdModel != nullptr ); // TODO: handle this more gracefully than all going to shit
|
||||||
if (ReplacableSkin != "none")
|
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
|
std::string nowheretexture = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
|
||||||
if( false == nowheretexture.empty() ) {
|
if( false == nowheretexture.empty() ) {
|
||||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( nowheretexture, "", 9 );
|
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 )
|
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
|
m_materialdata.textures_alpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (!MoverParameters->LoadAccepted.empty())
|
if (!MoverParameters->LoadAccepted.empty())
|
||||||
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
|
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
|
||||||
// MoverParameters->LoadType!=AnsiString("passengers"))
|
// MoverParameters->LoadType!=AnsiString("passengers"))
|
||||||
@@ -5655,62 +5312,16 @@ std::string TDynamicObject::TextureTest(std::string const &name)
|
|||||||
return ""; // nie znaleziona
|
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)
|
void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
||||||
{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik
|
{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik
|
||||||
// w zasadzie, to każdy wagon mógłby mieć inną stację docelową
|
// 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
|
// 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
|
// ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z
|
||||||
// rozkładu
|
// rozkładu
|
||||||
if( std::abs( m_materialdata.multi_textures ) >= 4 )
|
if( std::abs( m_materialdata.multi_textures ) >= 4 ) {
|
||||||
return; // jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
// jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||||
|
return;
|
||||||
|
}
|
||||||
numer = Global::Bezogonkow(numer);
|
numer = Global::Bezogonkow(numer);
|
||||||
asDestination = to;
|
asDestination = to;
|
||||||
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
|
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())
|
if (!x.empty())
|
||||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 );
|
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 );
|
||||||
}
|
}
|
||||||
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa
|
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa tekstury nr 4
|
||||||
// tekstury nr 4
|
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
void TDynamicObject::OverheadTrack(float o)
|
void TDynamicObject::OverheadTrack(float o)
|
||||||
{ // ewentualne wymuszanie jazdy
|
{ // ewentualne wymuszanie jazdy
|
||||||
|
|||||||
17
DynObj.h
17
DynObj.h
@@ -137,11 +137,8 @@ class TAnim
|
|||||||
void Parovoz(); // wykonanie obliczeń animacji
|
void Parovoz(); // wykonanie obliczeń animacji
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef EU07_USE_OLD_RENDERCODE
|
|
||||||
// parameters for the material object, as currently used by various simulator models
|
// parameters for the material object, as currently used by various simulator models
|
||||||
struct material_data {
|
struct material_data {
|
||||||
|
|
||||||
@@ -153,7 +150,6 @@ struct material_data {
|
|||||||
::SecureZeroMemory( replacable_skins, sizeof( replacable_skins ) );
|
::SecureZeroMemory( replacable_skins, sizeof( replacable_skins ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
class TDynamicObject { // klasa pojazdu
|
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?)
|
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
|
||||||
#ifndef EU07_USE_OLD_RENDERCODE
|
|
||||||
material_data m_materialdata;
|
material_data m_materialdata;
|
||||||
#endif
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#ifndef EU07_USE_OLD_RENDERCODE
|
|
||||||
inline
|
inline
|
||||||
material_data const *Material() const { return &m_materialdata; }
|
material_data const *Material() const { return &m_materialdata; }
|
||||||
#endif
|
|
||||||
// tymczasowo udostępnione do wyszukiwania drutu
|
// 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
|
int iAnimType[ ANIM_TYPES ]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
||||||
private:
|
private:
|
||||||
@@ -421,11 +413,6 @@ public: // modele składowe pojazdu
|
|||||||
int iCabs; // maski bitowe modeli kabin
|
int iCabs; // maski bitowe modeli kabin
|
||||||
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
|
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
|
||||||
std::string asBaseDir;
|
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
|
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
|
||||||
// jazdę bezprądową
|
// jazdę bezprądową
|
||||||
TTractionParam tmpTraction;
|
TTractionParam tmpTraction;
|
||||||
@@ -444,10 +431,6 @@ public: // modele składowe pojazdu
|
|||||||
bool FastUpdate(double dt);
|
bool FastUpdate(double dt);
|
||||||
void Move(double fDistance);
|
void Move(double fDistance);
|
||||||
void FastMove(double fDistance);
|
void FastMove(double fDistance);
|
||||||
#ifdef EU07_USE_OLD_RENDERCODE
|
|
||||||
void Render();
|
|
||||||
void RenderAlpha();
|
|
||||||
#endif
|
|
||||||
void RenderSounds();
|
void RenderSounds();
|
||||||
inline vector3 GetPosition() const
|
inline vector3 GetPosition() const
|
||||||
{
|
{
|
||||||
|
|||||||
1
EU07.cpp
1
EU07.cpp
@@ -9,7 +9,6 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
/*
|
/*
|
||||||
MaSzyna EU07 locomotive simulator
|
MaSzyna EU07 locomotive simulator
|
||||||
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
|
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
Authors:
|
Authors:
|
||||||
|
|||||||
@@ -83,17 +83,8 @@ GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
|
|||||||
double Global::fFogStart = 1700;
|
double Global::fFogStart = 1700;
|
||||||
double Global::fFogEnd = 2000;
|
double Global::fFogEnd = 2000;
|
||||||
float Global::Overcast{ 0.1f }; // NOTE: all this weather stuff should be moved elsewhere
|
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;
|
opengl_light Global::DayLight;
|
||||||
int Global::DynamicLightCount{ 3 };
|
int Global::DynamicLightCount{ 3 };
|
||||||
#endif
|
|
||||||
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
|
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
|
||||||
GLfloat Global::noLight[] = {0.00f, 0.00f, 0.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
|
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 GLfloat FogColor[];
|
||||||
static float Overcast;
|
static float Overcast;
|
||||||
// static bool bTimeChange;
|
// 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
|
// TODO: put these things in the renderer
|
||||||
static opengl_light DayLight;
|
static opengl_light DayLight;
|
||||||
static int DynamicLightCount;
|
static int DynamicLightCount;
|
||||||
#endif
|
|
||||||
static GLfloat whiteLight[];
|
static GLfloat whiteLight[];
|
||||||
static GLfloat noLight[];
|
static GLfloat noLight[];
|
||||||
static GLfloat darkLight[];
|
static GLfloat darkLight[];
|
||||||
|
|||||||
158
Ground.cpp
158
Ground.cpp
@@ -1625,19 +1625,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
str4);
|
str4);
|
||||||
if (tf3 != 0.0) // zero oznacza błąd
|
if (tf3 != 0.0) // zero oznacza błąd
|
||||||
{
|
{
|
||||||
fTrainSetDist -=
|
// przesunięcie dla kolejnego, minus bo idziemy w stronę punktu 1
|
||||||
tf3; // przesunięcie dla kolejnego, minus bo idziemy w stronę punktu 1
|
fTrainSetDist -= tf3;
|
||||||
tmp->pCenter = tmp->DynamicObject->GetPosition();
|
tmp->pCenter = tmp->DynamicObject->GetPosition();
|
||||||
/* // NOTE: the ctrain_depot flag is used to mark merged together parts of modular trains
|
// automatically establish permanent connections for couplers which specify them in their definitions
|
||||||
// clearing it here breaks this connection, so i'm disabling this piece of code.
|
if( TempConnectionType[ iTrainSetWehicleNumber ] ) {
|
||||||
// if it has some actual purpose and disabling it breaks that, a different solution has to be found
|
if( tmp->DynamicObject->MoverParameters->Couplers[ ( tf1 == -1.0 ? 0 : 1 ) ].AllowedFlag & coupling::permanent ) {
|
||||||
// either for modular trains, or whatever it is this code does.
|
TempConnectionType[ iTrainSetWehicleNumber ] |= coupling::permanent;
|
||||||
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
|
|
||||||
*/
|
|
||||||
iTrainSetWehicleNumber++;
|
iTrainSetWehicleNumber++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1825,29 +1821,12 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
} while (token.compare("endtri") != 0);
|
} while (token.compare("endtri") != 0);
|
||||||
// delete tmp; //nie ma co tego trzymać
|
|
||||||
// tmp=NULL; //to jest błąd
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
i = 0;
|
|
||||||
*/
|
|
||||||
TempVerts.clear();
|
TempVerts.clear();
|
||||||
TGroundVertex vertex;
|
TGroundVertex vertex;
|
||||||
do
|
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;
|
|
||||||
*/
|
|
||||||
parser->getTokens( 8, false );
|
parser->getTokens( 8, false );
|
||||||
*parser
|
*parser
|
||||||
>> vertex.Point.x
|
>> vertex.Point.x
|
||||||
@@ -1858,49 +1837,6 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
>> vertex.Normal.z
|
>> vertex.Normal.z
|
||||||
>> vertex.tu
|
>> vertex.tu
|
||||||
>> vertex.tv;
|
>> 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.RotateZ( aRotate.z / 180 * M_PI );
|
||||||
vertex.Point.RotateX( aRotate.x / 180 * M_PI );
|
vertex.Point.RotateX( aRotate.x / 180 * M_PI );
|
||||||
vertex.Point.RotateY( aRotate.y / 180 * M_PI );
|
vertex.Point.RotateY( aRotate.y / 180 * M_PI );
|
||||||
@@ -1911,27 +1847,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
tmp->pCenter += vertex.Point;
|
tmp->pCenter += vertex.Point;
|
||||||
|
|
||||||
TempVerts.emplace_back( vertex );
|
TempVerts.emplace_back( vertex );
|
||||||
/*
|
|
||||||
}
|
|
||||||
else if (i == 9999)
|
|
||||||
ErrorLog("Bad triangles: too many verices");
|
|
||||||
i++;
|
|
||||||
*/
|
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
} while (token.compare("endtri") != 0);
|
} while (token.compare("endtri") != 0);
|
||||||
/*
|
|
||||||
nv = i;
|
|
||||||
*/
|
|
||||||
nv = (int)TempVerts.size();
|
nv = (int)TempVerts.size();
|
||||||
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
||||||
tmp->pCenter /= (nv > 0 ? nv : 1);
|
tmp->pCenter /= (nv > 0 ? nv : 1);
|
||||||
|
|
||||||
// memcpy(tmp->Vertices,TempVerts,nv*sizeof(TGroundVertex));
|
|
||||||
|
|
||||||
r = 0;
|
r = 0;
|
||||||
for (int i = 0; i < nv; i++)
|
for (int i = 0; i < nv; i++)
|
||||||
{
|
{
|
||||||
@@ -1940,7 +1864,6 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
if (tf > r)
|
if (tf > r)
|
||||||
r = tf;
|
r = tf;
|
||||||
}
|
}
|
||||||
|
|
||||||
// tmp->fSquareRadius=2000*2000+r;
|
// tmp->fSquareRadius=2000*2000+r;
|
||||||
tmp->fSquareRadius += r;
|
tmp->fSquareRadius += r;
|
||||||
RaTriangleDivider(tmp); // Ra: dzielenie trójkątów jest teraz całkiem wydajne
|
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);
|
cParser parser(File, cParser::buffer_FILE, subpath, Global::bLoadTraction);
|
||||||
std::string token;
|
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
|
const int OriginStackMaxDepth = 100; // rozmiar stosu dla zagnieżdżenia origin
|
||||||
int OriginStackTop = 0;
|
int OriginStackTop = 0;
|
||||||
vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin
|
vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin
|
||||||
@@ -2434,58 +2341,15 @@ bool TGround::Init(std::string File)
|
|||||||
else if (str == "light")
|
else if (str == "light")
|
||||||
{ // Ra: ustawianie światła przeniesione do FirstInit
|
{ // Ra: ustawianie światła przeniesione do FirstInit
|
||||||
WriteLog("Scenery light definition");
|
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.getTokens(3, false);
|
||||||
parser
|
parser
|
||||||
>> Global::DayLight.direction.x
|
>> Global::DayLight.direction.x
|
||||||
>> Global::DayLight.direction.y
|
>> Global::DayLight.direction.y
|
||||||
>> Global::DayLight.direction.z;;
|
>> Global::DayLight.direction.z;;
|
||||||
Global::DayLight.direction.Normalize();
|
Global::DayLight.direction.Normalize();
|
||||||
#endif
|
|
||||||
parser.getTokens(9, false);
|
parser.getTokens(9, false);
|
||||||
|
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
do {
|
||||||
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
|
|
||||||
{
|
|
||||||
parser.getTokens();
|
parser.getTokens();
|
||||||
parser >> token;
|
parser >> token;
|
||||||
} while (token.compare("endlight") != 0);
|
} 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)
|
void TSubModel::RaArrayFill(CVertNormTex *Vert)
|
||||||
@@ -2212,140 +1797,6 @@ void TModel3d::BreakHierarhy()
|
|||||||
Error("Not implemented yet :(");
|
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
|
// 2012-02 funkcje do tworzenia terenu z E3D
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|||||||
20
Model3d.h
20
Model3d.h
@@ -255,12 +255,6 @@ public:
|
|||||||
void SetRotateIK1(float3 vNewAngles);
|
void SetRotateIK1(float3 vNewAngles);
|
||||||
TSubModel * GetFromName(std::string const &search, bool i = true);
|
TSubModel * GetFromName(std::string const &search, bool i = true);
|
||||||
TSubModel * GetFromName(char 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 matrix4x4* GetMatrix() {return dMatrix;};
|
||||||
inline float4x4 * GetMatrix()
|
inline float4x4 * GetMatrix()
|
||||||
{
|
{
|
||||||
@@ -361,20 +355,6 @@ public:
|
|||||||
bool LoadFromFile(std::string const &FileName, bool dynamic);
|
bool LoadFromFile(std::string const &FileName, bool dynamic);
|
||||||
void SaveToBinFile(char const *FileName);
|
void SaveToBinFile(char const *FileName);
|
||||||
void BreakHierarhy();
|
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); };
|
// inline int GetSubModelsCount() { return (SubModelsCount); };
|
||||||
int Flags() const
|
int Flags() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
using namespace Math3D;
|
using namespace Math3D;
|
||||||
|
|
||||||
#define EU07_DEBUG_VBO
|
|
||||||
|
|
||||||
// 110405 Ra: klasa punktów przekroju z normalnymi
|
// 110405 Ra: klasa punktów przekroju z normalnymi
|
||||||
|
|
||||||
class vector6 : public vector3
|
class vector6 : public vector3
|
||||||
|
|||||||
@@ -2595,11 +2595,7 @@ void TTrack::RenderDyn()
|
|||||||
{ // renderowanie nieprzezroczystych fragmentów pojazdów
|
{ // renderowanie nieprzezroczystych fragmentów pojazdów
|
||||||
for( auto dynamic : Dynamics ) {
|
for( auto dynamic : Dynamics ) {
|
||||||
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
||||||
#ifdef EU07_USE_OLD_RENDERCODE
|
|
||||||
dynamic->Render();
|
|
||||||
#else
|
|
||||||
GfxRenderer.Render( dynamic );
|
GfxRenderer.Render( dynamic );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2607,11 +2603,7 @@ void TTrack::RenderDynAlpha()
|
|||||||
{ // renderowanie przezroczystych fragmentów pojazdów
|
{ // renderowanie przezroczystych fragmentów pojazdów
|
||||||
for( auto dynamic : Dynamics ) {
|
for( auto dynamic : Dynamics ) {
|
||||||
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
// sam sprawdza, czy VBO; zmienia kontekst VBO!
|
||||||
#ifdef EU07_USE_OLD_RENDERCODE
|
|
||||||
dynamic->RenderAlpha();
|
|
||||||
#else
|
|
||||||
GfxRenderer.Render_Alpha( dynamic );
|
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
|
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
|
Camera.Reset(); // likwidacja obrotów - patrzy horyzontalnie na południe
|
||||||
|
|
||||||
if (Controlled) // jest pojazd do prowadzenia?
|
if (Controlled) // jest pojazd do prowadzenia?
|
||||||
{
|
{
|
||||||
vector3 camStara =
|
Ground.Silence( Camera.Pos ); // wyciszenie dźwięków z poprzedniej pozycji
|
||||||
Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
|
|
||||||
// Controlled->ABuSetModelShake(vector3(0,0,0));
|
|
||||||
if (FreeFlyModeFlag)
|
if (FreeFlyModeFlag)
|
||||||
{ // jeżeli poza kabiną, przestawiamy w jej okolicę - OK
|
{ // jeżeli poza kabiną, przestawiamy w jej okolicę - OK
|
||||||
if (Train)
|
if( Train ) {
|
||||||
Train->Dynamic()->ABuSetModelShake(
|
// wyłączenie trzęsienia na siłę?
|
||||||
vector3(0, 0, 0)); // wyłączenie trzęsienia na siłę?
|
Train->Dynamic()->ABuSetModelShake( vector3() );
|
||||||
// Camera.Pos=Train->pMechPosition+Normalize(Train->GetDirection())*20;
|
}
|
||||||
|
|
||||||
DistantView(); // przestawienie kamery
|
DistantView(); // przestawienie kamery
|
||||||
//żeby nie bylo numerów z 'fruwajacym' lokiem - konsekwencja bujania pudła
|
//żeby nie bylo numerów z 'fruwajacym' lokiem - konsekwencja bujania pudła
|
||||||
Global::SetCameraPosition(
|
// tu ustawić nową, bo od niej liczą się odległości
|
||||||
Camera.Pos); // tu ustawić nową, bo od niej liczą się odległości
|
Global::SetCameraPosition( Camera.Pos );
|
||||||
Ground.Silence(camStara); // wyciszenie dźwięków z poprzedniej pozycji
|
|
||||||
}
|
}
|
||||||
else if (Train)
|
else if (Train)
|
||||||
{ // korekcja ustawienia w kabinie - OK
|
{ // korekcja ustawienia w kabinie - OK
|
||||||
vector3 camStara = Camera.Pos; // przestawianie kamery jest bez sensu: do przerobienia na potem
|
if( wycisz ) {
|
||||||
// Ra: czy to tu jest potrzebne, bo przelicza się kawałek dalej?
|
// wyciszenie dźwięków z poprzedniej pozycji
|
||||||
Camera.Pos = Train->pMechPosition; // Train.GetPosition1();
|
// 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.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
|
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;
|
if( Train->Dynamic()->MoverParameters->ActiveCab == 0 ) {
|
||||||
else // patrz w strone wlasciwej kabiny
|
Camera.LookAt =
|
||||||
Camera.LookAt = Train->pMechPosition + Train->GetDirection() * 5.0 * Train->Dynamic()->MoverParameters->ActiveCab;
|
Train->pMechPosition
|
||||||
Train->pMechOffset.x = Train->pMechSittingPosition.x;
|
+ Train->GetDirection() * 5.0;
|
||||||
Train->pMechOffset.y = Train->pMechSittingPosition.y;
|
}
|
||||||
Train->pMechOffset.z = Train->pMechSittingPosition.z;
|
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
|
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
|
else
|
||||||
@@ -1239,105 +1248,7 @@ TWorld::Update_Camera( double const Deltatime ) {
|
|||||||
|
|
||||||
void TWorld::Update_Environment() {
|
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();
|
Environment.update();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TWorld::ResourceSweep()
|
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
|
// ABu: Rendering kabiny jako ostatniej, zeby bylo widac przez szyby, tylko w widoku ze srodka
|
||||||
return;
|
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();
|
glPushMatrix();
|
||||||
vector3 pos = dynamic->GetPosition(); // wszpółrzędne pojazdu z kabiną
|
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)
|
// 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
|
glLoadIdentity(); // zacząć od macierzy jedynkowej
|
||||||
Camera.SetCabMatrix( pos ); // widok z kamery po przesunięciu
|
Camera.SetCabMatrix( pos ); // widok z kamery po przesunięciu
|
||||||
glMultMatrixd( dynamic->mMatrix.getArray() ); // ta macierz nie ma przesunięcia
|
glMultMatrixd( dynamic->mMatrix.getArray() ); // ta macierz nie ma przesunięcia
|
||||||
/*
|
glEnable( GL_LIGHTING ); // po renderowaniu drutów może być to wyłączone. TODO: have the wires render take care of its own shit
|
||||||
//*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
|
|
||||||
|
|
||||||
if( dynamic->mdKabina ) // bo mogła zniknąć przy przechodzeniu do innego pojazdu
|
if( dynamic->mdKabina ) // bo mogła zniknąć przy przechodzeniu do innego pojazdu
|
||||||
{
|
{
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
// setup
|
||||||
// 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
|
|
||||||
if( dynamic->fShade > 0.0f ) {
|
if( dynamic->fShade > 0.0f ) {
|
||||||
// change light level based on light level of the occupied track
|
// change light level based on light level of the occupied track
|
||||||
Global::DayLight.apply_intensity( dynamic->fShade );
|
Global::DayLight.apply_intensity( dynamic->fShade );
|
||||||
}
|
}
|
||||||
if( dynamic->InteriorLightLevel > 0.0f ) {
|
if( dynamic->InteriorLightLevel > 0.0f ) {
|
||||||
|
|
||||||
// crude way to light the cabin, until we have something more complete in place
|
// crude way to light the cabin, until we have something more complete in place
|
||||||
auto const cablight = dynamic->InteriorLight * dynamic->InteriorLightLevel;
|
auto const cablight = dynamic->InteriorLight * dynamic->InteriorLightLevel;
|
||||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &cablight.x );
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &cablight.x );
|
||||||
}
|
}
|
||||||
#endif
|
// render
|
||||||
|
|
||||||
#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
|
|
||||||
GfxRenderer.Render( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
GfxRenderer.Render( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
||||||
GfxRenderer.Render_Alpha( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
GfxRenderer.Render_Alpha( dynamic->mdKabina, dynamic->Material(), 0.0 );
|
||||||
#endif
|
// post-render restore
|
||||||
#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
|
|
||||||
if( dynamic->fShade > 0.0f ) {
|
if( dynamic->fShade > 0.0f ) {
|
||||||
// change light level based on light level of the occupied track
|
// change light level based on light level of the occupied track
|
||||||
Global::DayLight.apply_intensity();
|
Global::DayLight.apply_intensity();
|
||||||
@@ -1627,7 +1311,6 @@ TWorld::Render_Cab() {
|
|||||||
GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
GLfloat ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, ambient );
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
27
sky.cpp
27
sky.cpp
@@ -31,39 +31,18 @@ void TSky::Render( float3 const &Tint )
|
|||||||
{
|
{
|
||||||
if (mdCloud)
|
if (mdCloud)
|
||||||
{ // jeśli jest model nieba
|
{ // jeśli jest model nieba
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
// setup
|
||||||
// TODO: re-implement this
|
|
||||||
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
|
|
||||||
#else
|
|
||||||
::glEnable( GL_LIGHTING );
|
::glEnable( GL_LIGHTING );
|
||||||
GfxRenderer.Disable_Lights();
|
GfxRenderer.Disable_Lights();
|
||||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &Tint.x );
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, &Tint.x );
|
||||||
#endif
|
// render
|
||||||
#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
|
|
||||||
GfxRenderer.Render( mdCloud, nullptr, 100.0 );
|
GfxRenderer.Render( mdCloud, nullptr, 100.0 );
|
||||||
GfxRenderer.Render_Alpha( mdCloud, nullptr, 100.0 );
|
GfxRenderer.Render_Alpha( mdCloud, nullptr, 100.0 );
|
||||||
#endif
|
// post-render cleanup
|
||||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
|
||||||
glPopMatrix();
|
|
||||||
// TODO: re-implement this
|
|
||||||
glLightfv(GL_LIGHT0, GL_POSITION, Global::lightPos);
|
|
||||||
#else
|
|
||||||
GLfloat noambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
GLfloat noambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, noambient );
|
::glLightModelfv( GL_LIGHT_MODEL_AMBIENT, noambient );
|
||||||
::glEnable( GL_LIGHT0 ); // other lights will be enabled during lights update
|
::glEnable( GL_LIGHT0 ); // other lights will be enabled during lights update
|
||||||
::glDisable( GL_LIGHTING );
|
::glDisable( GL_LIGHTING );
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
13
stars.cpp
13
stars.cpp
@@ -14,23 +14,16 @@ cStars::init() {
|
|||||||
|
|
||||||
void
|
void
|
||||||
cStars::render() {
|
cStars::render() {
|
||||||
|
// setup
|
||||||
::glPushMatrix();
|
::glPushMatrix();
|
||||||
|
|
||||||
::glRotatef( m_latitude, 1.0f, 0.0f, 0.0f ); // ustawienie osi OY na północ
|
::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
|
::glRotatef( -std::fmod( (float)Global::fTimeAngleDeg, 360.0f ), 0.0f, 1.0f, 0.0f ); // obrót dobowy osi OX
|
||||||
|
|
||||||
::glPointSize( 2.0f );
|
::glPointSize( 2.0f );
|
||||||
#ifdef EU07_USE_OLD_RENDERCODE
|
// render
|
||||||
if( Global::bUseVBO ) {
|
|
||||||
m_stars.RaRender( 1.0, 0 );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_stars.Render( 1.0 );
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
GfxRenderer.Render( &m_stars, nullptr, 1.0 );
|
GfxRenderer.Render( &m_stars, nullptr, 1.0 );
|
||||||
#endif
|
// post-render cleanup
|
||||||
::glPointSize( 3.0f );
|
::glPointSize( 3.0f );
|
||||||
|
|
||||||
::glPopMatrix();
|
::glPopMatrix();
|
||||||
|
|||||||
Reference in New Issue
Block a user