First asynchrone commit (r1171)

This commit is contained in:
Firleju
2015-05-01 19:58:51 +02:00
parent 06652e579c
commit b6017a5ef7
12 changed files with 1502 additions and 828 deletions

7
.gitignore vendored
View File

@@ -52,3 +52,10 @@ install_manifest.txt
*.~h
*.~bpr
*.~pas
*.opensdf
*.sdf
*.sln
*.vcxproj
*.filters
format_all_files.py
~$kumentacja zmiennych Python.docx

View File

@@ -21,6 +21,7 @@ http://mozilla.org/MPL/2.0/.
TButton::TButton()
{
iFeedbackBit = 0;
bData = NULL;
Clear();
};
@@ -54,8 +55,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel
Init(str, pModel1, false);
if (pModel2)
if (!pModelOn && !pModelOff)
Init(str, pModel2,
false); // mo¿e w drugim bêdzie (jak nie w kabinie, to w zewnêtrznym)
Init(str, pModel2, false); // mo¿e w drugim bêdzie (jak nie w kabinie,
// to w zewnêtrznym)
}
else
{
@@ -66,6 +67,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel
void TButton::Update()
{
if (bData != NULL)
bOn = (*bData);
if (pModelOn)
pModelOn->iVisible = bOn;
if (pModelOff)
@@ -78,3 +81,8 @@ void TButton::Update()
Console::BitsClear(iFeedbackBit);
}
};
void TButton::AssignBool(bool *bValue)
{
bData = bValue;
}

View File

@@ -14,12 +14,13 @@ http://mozilla.org/MPL/2.0/.
#include "QueryParserComp.hpp"
class TButton
{ // animacja dwustanowa, w³¹cza jeden z dwóch submodeli (jednego z nich mo¿e nie byæ)
{ // animacja dwustanowa, w³¹cza jeden z dwóch submodeli (jednego
// z nich mo¿e nie byæ)
private:
TSubModel *pModelOn, *pModelOff; // submodel dla stanu za³¹czonego i wy³¹czonego
bool bOn;
bool *bData;
int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit
void Update();
public:
TButton();
@@ -53,8 +54,10 @@ class TButton
{
return (pModelOn) || (pModelOff);
};
void Update();
void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false);
void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL);
void AssignBool(bool *bValue);
};
//---------------------------------------------------------------------------

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -50,7 +50,8 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
double fNewFriction, double fNewValue)
{ // ustawienie parametrów animacji submodelu
if (NewSubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³
{ // warunek na wszelki wypadek, gdyby siê submodel nie
// pod³¹czy³
fFriction = fNewFriction;
fValue = fNewValue;
fOffset = fNewOffset;
@@ -61,11 +62,12 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
{
TSubModel *sm = SubModel->ChildGet();
do
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od cyfry w (fValue)
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od
// cyfry w (fValue)
if (sm->pName)
{ // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0')
if ((*sm->pName) <= '9')
if (sm->pName[0] >= '0')
if (sm->pName[0] <= '9')
sm->WillBeAnimated(); // wy³¹czenie optymalizacji
}
sm = sm->NextGet();
@@ -137,14 +139,16 @@ void TGauge::PutValue(double fNewDesired)
void TGauge::Update()
{
float dt = Timer::GetDeltaTime();
if ((fFriction > 0) &&
(dt <
0.5 * fFriction)) // McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow
if ((fFriction > 0) && (dt < 0.5 * fFriction)) // McZapkie-281102:
// zabezpieczenie przed
// oscylacjami dla dlugich
// czasow
fValue += dt * (fDesiredValue - fValue) / fFriction;
else
fValue = fDesiredValue;
if (SubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³
{ // warunek na wszelki wypadek, gdyby siê submodel nie
// pod³¹czy³
TSubModel *sm;
switch (eType)
{
@@ -167,16 +171,17 @@ void TGauge::Update()
break;
case gt_Digital: // Ra 2014-07: licznik cyfrowy
sm = SubModel->ChildGet();
AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez
// sensu
AnsiString n =
FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez sensu
do
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od cyfry w (fValue)
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od
// cyfry w (fValue)
if (sm->pName)
{ // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0')
if ((*sm->pName) <= '9')
if (sm->pName[0] >= '0')
if (sm->pName[0] <= '9')
sm->SetRotate(float3(0, 1, 0),
-36.0 * (n['0' + 10 - (*sm->pName)] - '0'));
-36.0 * (n['0' + 10 - sm->pName[0]] - '0'));
}
sm = sm->NextGet();
} while (sm);

View File

@@ -867,6 +867,7 @@ static const Shortint eimv_Uzsmax = 0x10;
static const Shortint eimv_Pmax = 0x11;
static const Shortint eimv_Fzad = 0x12;
static const Shortint eimv_Imax = 0x13;
static const Shortint eimv_Fful = 0x14;
extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension
&Dim1, const TDimension &Dim2);

View File

@@ -865,6 +865,7 @@ static const Shortint eimv_Uzsmax = 0x10;
static const Shortint eimv_Pmax = 0x11;
static const Shortint eimv_Fzad = 0x12;
static const Shortint eimv_Imax = 0x13;
static const Shortint eimv_Fful = 0x14;
extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension
&Dim1, const TDimension &Dim2);

View File

@@ -1,13 +1,5 @@
unit _mover; {fizyka ruchu dla symulatora lokomotywy}
(*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*)
(*
MaSzyna EU07 locomotive simulator
Copyright (C) 2001-2004 Maciej Czapkiewicz and others
@@ -212,6 +204,7 @@ CONST
eimv_Pmax=17;
eimv_Fzad=18;
eimv_Imax=19;
eimv_Fful=20;
TYPE
@@ -2425,10 +2418,13 @@ begin
dpMainValve:=0;
if (BrakeCtrlPosNo>1) and (ActiveCab<>0)then
if (BrakeCtrlPosNo>1) {and(ActiveCab<>0)}then
with BrakePressureTable[BrakeCtrlPos] do
begin
dpLocalValve:=LocHandle.GetPF(LocalBrakePos/LocalBrakePosNo, Hamulec.GetBCP, ScndPipePress, dt, 0);
if(EngineType<>ElectricInductionMotor)then
dpLocalValve:=LocHandle.GetPF(Max0R(LocalBrakePos/LocalBrakePosNo,LocalBrakePosA), Hamulec.GetBCP, ScndPipePress, dt, 0)
else
dpLocalValve:=LocHandle.GetPF(LocalBrakePosA, Hamulec.GetBCP, ScndPipePress, dt, 0);
if(BrakeHandle=FV4a)and((PipePress<2.75)and((Hamulec.GetStatus and b_rls)=0))and(BrakeSubsystem=ss_LSt)and(TrainType<>dt_EZT)then
temp:=PipePress+0.00001
else
@@ -2483,10 +2479,11 @@ end;
if(DynamicBrakeFlag)and(EngineType=ElectricInductionMotor)then
begin
if(Vel>10)then LocBrakePress:=0 else
if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress
end;
(Hamulec as TLSt).SetLBP(LocBrakePress);
// if(Vel>10)then LocBrakePress:=0 else
// if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress
end
else
(Hamulec as TLSt).SetLBP(LocBrakePress);
end;
CV1_L_TR:
@@ -4095,10 +4092,11 @@ begin
Mm:=Mm*RList[MainCtrlActualPos].Bn/(RList[MainCtrlActualPos].Bn+1); //zrobione w momencie, żeby nie dawac elektryki w przeliczaniu sił
if (Abs(Im)>Imax) then
Vhyp:=Vhyp+dt*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN
Vhyp:=Vhyp+dt//*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN
else
Vhyp:=0;
if (Vhyp>CtrlDelay/2) then //jesli czas oddzialywania przekroczony
// dec(MainCtrlActualPos);
FuseOff; {wywalanie bezpiecznika z powodu przetezenia silnikow}
if (Mains) then //nie wchodzić w funkcję bez potrzeby
if (Abs(Voltage)<EnginePowerSource.CollectorParameters.MinV) or (Abs(Voltage)>EnginePowerSource.CollectorParameters.MaxV) then
@@ -4292,31 +4290,39 @@ begin
end;
ElectricInductionMotor:
begin
if (Voltage>1800) and (MainS) then
if (Mains) then //nie wchodzić w funkcję bez potrzeby
if (Abs(Voltage)<EnginePowerSource.CollectorParameters.MinV) or (Abs(Voltage)>EnginePowerSource.CollectorParameters.MaxV) then
MainSwitch(false);
// tmpV:=V/(Pi*WheelDiameter)*Transmision.Ratio;//*DirAbsolute*eimc[eimc_s_p]; - do przemyslenia dzialanie pp
if (MainS) then
begin
if ((Hamulec as TLSt).GetEDBCP<0.25)and(LocHandle.GetCP<0.25) then
if ((Hamulec as TLSt).GetEDBCP<0.25) and (LocHandle.GetCP<0.25) and (AnPos<0.01) then
DynamicBrakeFlag:=false
else if ((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25)) or (LocHandle.GetCP>0.25) then
else if (((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25) or (LocHandle.GetCP>0.25))) or (AnPos>0.02) then
DynamicBrakeFlag:=true;
if(DynamicBrakeFlag)then
begin
if eimv[eimv_Fmax]*sign(V)*DirAbsolute<-1 then
PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]{dizel_fill})
PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],AnPos){dizel_fill})
else
PosRatio:=0;
PosRatio:=round(20*Posratio)/20;
if PosRatio<19.5/20 then PosRatio:=PosRatio*0.9;
(Hamulec as TLSt).SetED(PosRatio);
PosRatio:=-Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])));
// (Hamulec as TLSt).SetLBP(LocBrakePress*(1-PosRatio));
PosRatio:=-Max0R(Min0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],1),AnPos)*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])));
eimv[eimv_Fzad]:=-Max0R(LocalBrakeRatio,(Hamulec as TLSt).GetEDBCP/MaxBrakePress[0]);
tmp:=5;
end
else
begin
PosRatio:=(MainCtrlPos/MainCtrlPosNo);
eimv[eimv_Fzad]:=PosRatio;
PosRatio:=1.0*(PosRatio*0+1)*PosRatio;
(Hamulec as TLSt).SetED(0);
// (Hamulec as TLSt).SetLBP(LocBrakePress);
if (PosRatio>dizel_fill) then tmp:=1 else tmp:=4; //szybkie malenie, powolne wzrastanie
end;
if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn; end;//przeciwposlizg
@@ -4331,19 +4337,22 @@ begin
eimv[eimv_Pmax]:=eimc[eimc_p_Ph]
else
eimv[eimv_Pmax]:=Min0R(eimc[eimc_p_Pmax],0.001*Voltage*(eimc[eimc_p_Imax]-eimc[eimc_f_I0])*Pirazy2*eimc[eimc_s_cim]/eimc[eimc_s_p]/eimc[eimc_s_cfu]);
eimv[eimv_FMAXMAX]:=0.001*SQR(Min0R(eimv[eimv_fkr]/Max0R(abs(enrot)*eimc[eimc_s_p]+eimc[eimc_s_dfmax]*eimv[eimv_ks],eimc[eimc_s_dfmax]),1)*eimc[eimc_f_cfu]/eimc[eimc_s_cfu])*(eimc[eimc_s_dfmax]*eimc[eimc_s_dfic]*eimc[eimc_s_cim])*Transmision.Ratio*NPoweredAxles*2/WheelDiameter;
if(DynamicBrakeFlag)then
// if(Vel>eimc[eimc_p_Vh0])then
eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,-eimc[eimc_p_Fh]*dizel_fill)//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))
// else
// eimv[eimv_Fmax]:=0
begin
eimv[eimv_Fful]:=Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(eimc[eimc_p_Fh],eimv[eimv_FMAXMAX]));
eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(-eimc[eimc_p_Fh]*dizel_fill,eimv[eimv_FMAXMAX]));//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))
end
else
eimv[eimv_Fmax]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX])*dizel_fill;
begin
eimv[eimv_Fful]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX]);
eimv[eimv_Fmax]:=eimv[eimv_Fful]*dizel_fill;
end;
eimv[eimv_ks]:=eimv[eimv_Fmax]/eimv[eimv_FMAXMAX];
eimv[eimv_df]:=eimv[eimv_ks]*eimc[eimc_s_dfmax];
eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df];
eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df]; //do przemyslenia dzialanie pp z tmpV
// eimv[eimv_U]:=Max0R(eimv[eimv_Uzsmax],Min0R(eimc[eimc_f_cfu]*eimv[eimv_fp],eimv[eimv_Uzsmax]));
// eimv[eimv_pole]:=eimv[eimv_U]/(eimv[eimv_fp]*eimc[eimc_s_cfu]);
if(abs(eimv[eimv_fp])<=eimv[eimv_fkr])then
@@ -4365,11 +4374,11 @@ begin
EnginePower:=Abs(eimv[eimv_Ic]*eimv[eimv_U]*NPoweredAxles)/1000;
tmpV:=eimv[eimv_fp];
if (abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1) then
if ((abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1))and(RlistSize>0) then
begin
if abs(tmpV)<32 then RventRot:=1.0 else
if abs(tmpV)<39 then RventRot:=0.33*abs(tmpV)/32 else
RventRot:=0.25*abs(tmpV)/39;//}
i:=0;
while (i<RlistSize-1)and(DEList[i+1].RPM<abs(tmpV))do inc(i);
RventRot:=(abs(tmpV)-DEList[i].RPM)/(DEList[i+1].RPM-DEList[i].RPM)*(DEList[i+1].GenPower-DEList[i].GenPower)+DEList[i].GenPower;
end
else RVentRot:=0;
@@ -4383,7 +4392,7 @@ begin
else
begin
Im:=0;Mm:=0;Mw:=0;Fw:=0;Ft:=0;Itot:=0;dizel_fill:=0;EnginePower:=0;
(Hamulec as TLSt).SetED(0);RventRot:=0.0;
(Hamulec as TLSt).SetED(0);RventRot:=0.0;//(Hamulec as TLSt).SetLBP(LocBrakePress);
end;
end;
None: begin end;
@@ -4786,7 +4795,7 @@ begin
else
Voltage:=0;
if Mains and {(Abs(CabNo)<2) and} (EngineType=ElectricInductionMotor) then //potem ulepszyc! pantogtrafy!
Voltage:=RunningTraction.TractionVoltage;
Voltage:=Max0R(Max0R(RunningTraction.TractionVoltage,HVCouplers[0][1]),HVCouplers[1][1]);
//end;
if Power>0 then
@@ -4851,34 +4860,39 @@ function T_MoverParameters.ComputeMovement(dt:real; dt1:real; Shape:TTrackShape;
var b:byte;
Vprev,AccSprev:real;
// Iheat:real; prad ogrzewania
hvc: real;
const Vepsilon=1e-5; Aepsilon=1e-3; //ASBSpeed=0.8;
begin
{
TotalCurrent:=0;
for b:=0 to 1 do //przekazywanie napiec
if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then
begin
HVCouplers[1-b][1]:=Max0R(Abs(Voltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]);
HVCouplers[1-b][1]:=Max0R(Abs(ElectricTraction.TractionVoltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]*0.99);
end
else
HVCouplers[1-b][1]:=Max0R(Abs(Voltage),0);
end;
HVCouplers[1-b][1]:=Abs(ElectricTraction.TractionVoltage);//Max0R(Abs(Voltage),0);
// end;
hvc:=HVCouplers[0][1]+HVCouplers[1][1];
if (Abs(ElectricTraction.TractionVoltage)<1) and (hvc>1)then //bez napiecia, ale jest cos na sprzegach:
begin
for b:=0 to 1 do //przekazywanie pradow
if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then //jesli spiety
begin
if (HVCouplers[b][1]) > 1 then //przewod pod napiecie
HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Iheat//obciążenie
else
HVCouplers[b][0]:=0;
HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Itot*HVCouplers[b][1]/hvc; //obciążenie rozkladane stosownie do napiec
end
else //pierwszy pojazd
begin
if (HVCouplers[b][1]) > 1 then //pod napieciem
HVCouplers[b][0]:=0+Iheat//obciążenie
else
HVCouplers[b][0]:=0;
HVCouplers[b][0]:=Itot*HVCouplers[b][1]/hvc;
end;
}
end
else
begin
TotalCurrent:=HVCouplers[0][0]+HVCouplers[1][0];
HVCouplers[0][0]:=0;
HVCouplers[1][0]:=0;
end;
ClearPendingExceptions;
if not TestFlag(DamageFlag,dtrain_out) then
@@ -4888,7 +4902,7 @@ begin
RunningTraction:=ElectricTraction;
with ElectricTraction do
if not DynamicBrakeFlag then
RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0]))
RunningTraction.TractionVoltage:=TractionVoltage{-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0]))}
else
RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*Itot*0); //zasadniczo ED oporowe nie zmienia napięcia w sieci
end;
@@ -7357,7 +7371,14 @@ begin
SST[k].Pmax:=Min0R(SST[k].Pmax,sqr(SST[k].Umax)/47.6);
end;
end;
end
else if (Pos('ffList:',lines)>0) then {dla asynchronow}
begin
RListSize:=s2b(DUE(ExtractKeyWord(lines,'Size=')));
for k:=0 to RListSize do
readln(fin, DEList[k].rpm, DEList[k].genpower)
end;
end;
end; {koniec filtru importu parametrow}
if ConversionError=0 then

View File

@@ -91,7 +91,8 @@ void TSubModel::FirstInit()
Child = NULL;
TextureID = 0;
// TexAlpha=false;
iFlags = 0x0200; // bit 9=1: submodel zosta³ utworzony a nie ustawiony na wczytany plik
iFlags = 0x0200; // bit 9=1: submodel zosta³ utworzony a nie ustawiony na
// wczytany plik
// TexHash=false;
// Hits=NULL;
// CollisionPts=NULL;
@@ -141,11 +142,13 @@ TSubModel::~TSubModel()
{//wczytano z pliku binarnego (nie jest w³aœcicielem tablic)
}
*/
delete[] smLetter; // u¿ywany tylko roboczo dla TP_TEXT, do przyspieszenia wyœwietlania
delete[] smLetter; // u¿ywany tylko roboczo dla TP_TEXT, do przyspieszenia
// wyœwietlania
};
void TSubModel::TextureNameSet(const char *n)
{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D
{ // ustawienie nazwy submodelu, o
// ile nie jest wczytany z E3D
if (iFlags & 0x0200)
{ // tylko je¿eli submodel zosta utworzony przez new
delete[] pTexture; // usuniêcie poprzedniej
@@ -161,7 +164,8 @@ void TSubModel::TextureNameSet(const char *n)
};
void TSubModel::NameSet(const char *n)
{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D
{ // ustawienie nazwy submodelu, o ile
// nie jest wczytany z E3D
if (iFlags & 0x0200)
{ // tylko je¿eli submodel zosta utworzony przez new
delete[] pName; // usuniêcie poprzedniej
@@ -176,10 +180,13 @@ void TSubModel::NameSet(const char *n)
}
};
// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3
// *pt,GLVERTEX
// *Vertices)
int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices)
{ // szukanie punktu stycznego do (pt), zwraca numer wierzcho³ka, a nie trójk¹ta
{ // szukanie punktu stycznego
// do (pt), zwraca numer
// wierzcho³ka, a nie trójk¹ta
int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójk¹t
// GLVERTEX *p; //roboczy wskaŸnik
float8 *p; // roboczy wskaŸnik
@@ -269,13 +276,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser >> token;
NameSet(token.c_str());
if (dynamic)
{ // dla pojazdu, blokujemy za³¹czone submodele, które mog¹ byæ nieobs³ugiwane
{ // dla pojazdu, blokujemy za³¹czone submodele, które mog¹ byæ
// nieobs³ugiwane
if (token.find("_on") + 3 == token.length()) // jeœli nazwa koñczy siê na "_on"
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem "_off"
}
else // dla pozosta³ych modeli blokujemy zapalone œwiat³a, które mog¹ byæ nieobs³ugiwane
else // dla pozosta³ych modeli blokujemy zapalone œwiat³a, które mog¹ byæ
// nieobs³ugiwane
if (token.find("Light_On") == 0) // jeœli nazwa zaczyna siê od "Light_On"
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem "Light_Off"
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem
// "Light_Off"
if (parser.expectToken("anim:")) // Ra: ta informacja by siê przyda³a!
{ // rodzaj animacji
@@ -358,7 +368,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser.getToken(fCosHotspotAngle); // k¹t liczony dla œrednicy, a nie promienia
fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle));
iNumVerts = 1;
iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi zostaæ bez zmiany
iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi
// zostaæ bez zmiany
}
else if (eType < TP_ROTATOR)
{
@@ -417,7 +428,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
szTexturePath, Global::asCurrentTexturePath.c_str(), texture);
// TexAlpha=TTexturesManager::GetAlpha(TextureID);
// iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta
if (Opacity < 1.0) // przezroczystoϾ z tekstury brana tylko dla Opacity 0!
if (Opacity < 1.0) // przezroczystoϾ z tekstury brana tylko dla Opacity
// 0!
iFlags |= TTexturesManager::GetAlpha(TextureID) ?
0x20 :
0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta
@@ -449,15 +461,17 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
if (eType < TP_ROTATOR)
{ // wczytywanie wierzcho³ków
parser.ignoreToken();
// Ra 15-01: to wczytaæ jako tekst - jeœli pierwszy znak zawiera "*", to dalej bêdzie nazwa
// wczeœniejszego submodelu, z którego nale¿y wzi¹æ wierzcho³ki
// zapewni to jak¹œ zgodnoœæ wstecz, bo zamiast liczby bêdzie ci¹g, którego wartoœæ powinna
// byæ uznana jako zerowa
// Ra 15-01: to wczytaæ jako tekst - jeœli pierwszy znak zawiera "*", to
// dalej bêdzie nazwa wczeœniejszego submodelu, z którego nale¿y wzi¹æ
// wierzcho³ki
// zapewni to jak¹œ zgodnoœæ wstecz, bo zamiast liczby bêdzie ci¹g, którego
// wartoœæ powinna byæ uznana jako zerowa
// parser.getToken(iNumVerts);
parser.getToken(token);
if (token[0] == '*')
{ // jeœli pierwszy znak jest gwiazdk¹, poszukaæ submodelu o nazwie bez tej gwiazdki i wzi¹æ
// z niego wierzcho³ki
{ // jeœli pierwszy znak jest gwiazdk¹, poszukaæ
// submodelu o nazwie bez tej gwiazdki i wzi¹æ z
// niego wierzcho³ki
Error("Verticles reference not yet supported!");
}
else
@@ -474,19 +488,23 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
{
Vertices = new float8[iNumVerts];
iNumFaces = iNumVerts / 3;
sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak u¿redniania wektorów
// normalnych
int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor normalny
sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak
// u¿redniania wektorów normalnych
int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor
// normalny
int maska = 0;
for (int i = 0; i < iNumVerts; i++)
{ // Ra: z konwersj¹ na uk³ad scenerii - bêdzie wydajniejsze wyœwietlanie
{ // Ra: z konwersj¹ na uk³ad scenerii - bêdzie wydajniejsze
// wyœwietlanie
wsp[i] = -1; // wektory normalne nie s¹ policzone dla tego wierzcho³ka
if ((i % 3) == 0)
{ // jeœli bêdzie maska -1, to dalej bêd¹ wierzcho³ki z wektorami normalnymi,
// podanymi jawnie
{ // jeœli bêdzie maska -1, to dalej bêd¹
// wierzcho³ki z wektorami normalnymi, podanymi
// jawnie
parser.getToken(maska); // maska powierzchni trójk¹ta
sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0, czyli nie
// ma wspólnych wektorów normalnych
sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0,
// czyli nie ma wspólnych
// wektorów normalnych
}
parser.getToken(Vertices[i].Point.x);
parser.getToken(Vertices[i].Point.y);
@@ -512,15 +530,15 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
WriteLog(AnsiString("Degenerated triangle ignored in: \"") +
AnsiString(pName) + "\", verticle " + AnsiString(i));
}
if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to zostanie
// usuniêty i nie ma co sprawdzaæ
if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to
// zostanie usuniêty i nie ma co sprawdzaæ
if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) ||
((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() >
1000.0) ||
((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0))
{ // je¿eli s¹ dalej ni¿ 2km od siebie //Ra 15-01: obiekt wstawiany nie
// powinien byæ wiêkszy ni¿ 300m (trójk¹ty terenu w E3D mog¹ mieæ
// 1.5km)
{ // je¿eli s¹ dalej ni¿ 2km od siebie //Ra 15-01:
// obiekt wstawiany nie powinien byæ wiêkszy ni¿
// 300m (trójk¹ty terenu w E3D mog¹ mieæ 1.5km)
--iNumFaces; // o jeden trójk¹t mniej
iNumVerts -= 3; // czyli o 3 wierzcho³ki
i -= 3; // wczytanie kolejnego w to miejsce
@@ -531,8 +549,9 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
}
int i; // indeks dla trójk¹tów
float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójk¹tów
for (i = 0; i < iNumFaces; i++) // pêtla po trójk¹tach - bêdzie szybciej, jak
// wstêpnie przeliczymy normalne trójk¹tów
for (i = 0; i < iNumFaces; i++) // pêtla po trójk¹tach - bêdzie
// szybciej, jak wstêpnie przeliczymy
// normalne trójk¹tów
n[i] = SafeNormalize(
CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point,
Vertices[i * 3].Point - Vertices[i * 3 + 2].Point));
@@ -541,8 +560,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
float3 norm; // roboczy wektor normalny
for (v = 0; v < iNumVerts; v++)
{ // pêtla po wierzcho³kach trójk¹tów
if (wsp[v] >=
0) // jeœli ju¿ by³ liczony wektor normalny z u¿yciem tego wierzcho³ka
if (wsp[v] >= 0) // jeœli ju¿ by³ liczony wektor normalny z u¿yciem
// tego wierzcho³ka
Vertices[v].Normal =
Vertices[wsp[v]].Normal; // to wystarczy skopiowaæ policzony wczeœniej
else
@@ -551,15 +570,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
norm = float3(0, 0, 0); // liczenie zaczynamy od zera
f = v; // zaczynamy dodawanie wektorów normalnych od w³asnego
while (f >= 0)
{ // sumowanie z wektorem normalnym s¹siada (w³¹cznie ze sob¹)
{ // sumowanie z wektorem normalnym s¹siada (w³¹cznie
// ze sob¹)
wsp[f] = v; // informacja, ¿e w tym wierzcho³ku jest ju¿ policzony
// wektor normalny
norm += n[f / 3];
f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point,
Vertices); // i szukanie od kolejnego trójk¹ta
}
// Ra 15-01: nale¿a³o by jeszcze uwzglêdniæ skalowanie wprowadzane przez
// transformy, aby normalne po przeskalowaniu by³y jednostkowe
// Ra 15-01: nale¿a³o by jeszcze uwzglêdniæ skalowanie wprowadzane
// przez transformy, aby normalne po przeskalowaniu by³y jednostkowe
Vertices[v].Normal =
SafeNormalize(norm); // przepisanie do wierzcho³ka trójk¹ta
}
@@ -576,7 +596,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
} // obs³uga submodelu z w³asn¹ list¹ wierzcho³ków
}
else if (eType == TP_STARS)
{ // punkty œwiec¹ce dookólnie - sk³adnia jak dla smt_Mesh
{ // punkty œwiec¹ce dookólnie - sk³adnia jak
// dla smt_Mesh
parser.ignoreToken();
parser.getToken(iNumVerts);
// Vertices=new GLVERTEX[iNumVerts];
@@ -604,7 +625,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
};
int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri)
{ // dodanie trójk¹tów do submodelu, u¿ywane przy tworzeniu E3D terenu
{ // dodanie trójk¹tów do submodelu, u¿ywane
// przy tworzeniu E3D terenu
TSubModel *s = this;
while (s ? (s->TextureID != tex) : false)
{ // szukanie submodelu o danej teksturze
@@ -636,7 +658,8 @@ int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri)
};
float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, int *ls)
{ // zwraca wskaŸnik do wype³nienia tabeli wierzcho³ków, u¿ywane przy tworzeniu E3D terenu
{ // zwraca wskaŸnik do wype³nienia tabeli wierzcho³ków, u¿ywane
// przy tworzeniu E3D terenu
TSubModel *s = this;
while (s ? s->TextureID != tex : false)
{ // szukanie submodelu o danej teksturze
@@ -660,7 +683,8 @@ float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, in
};
void TSubModel::DisplayLists()
{ // utworznie po jednej skompilowanej liœcie dla ka¿dego submodelu
{ // utworznie po jednej skompilowanej liœcie dla
// ka¿dego submodelu
if (Global::bUseVBO)
return; // Ra: przy VBO to siê nie przyda
// iFlags|=0x4000; //wy³¹czenie przeliczania wierzcho³ków, bo nie s¹ zachowane
@@ -738,7 +762,8 @@ void TSubModel::DisplayLists()
glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
glEndList();
}
// SafeDeleteArray(Vertices); //przy VBO musz¹ zostaæ do za³adowania ca³ego modelu
// SafeDeleteArray(Vertices); //przy VBO musz¹ zostaæ do za³adowania ca³ego
// modelu
if (Child)
Child->DisplayLists();
if (Next)
@@ -762,11 +787,12 @@ void TSubModel::InitialRotate(bool doit)
iFlags &= ~0x8000; // jednak jednostkowa po obróceniu
}
if (Child)
Child->InitialRotate(
false); // potomnych nie obracamy ju¿, tylko ewentualnie optymalizujemy
Child->InitialRotate(false); // potomnych nie obracamy ju¿, tylko
// ewentualnie optymalizujemy
else if (Global::iConvertModels & 2) // optymalizacja jest opcjonalna
if ((iFlags & 0xC000) == 0x8000) // o ile nie ma animacji
{ // jak nie ma potomnych, mo¿na wymno¿yæ przez transform i wyjedynkowaæ go
{ // jak nie ma potomnych, mo¿na wymno¿yæ przez transform i wyjedynkowaæ
// go
float4x4 *mat = GetMatrix(); // transform submodelu
if (Vertices)
{
@@ -774,8 +800,8 @@ void TSubModel::InitialRotate(bool doit)
Vertices[i].Point = (*mat) * Vertices[i].Point;
(*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] =
0.0; // zerujemy przesuniêcie przed obracaniem normalnych
if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to ich wtedy
// nie ruszamy
if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to
// ich wtedy nie ruszamy
for (int i = 0; i < iNumVerts; ++i)
Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal);
}
@@ -785,7 +811,8 @@ void TSubModel::InitialRotate(bool doit)
}
else // jak jest jednostkowy i nie ma animacji
if (doit)
{ // jeœli jest jednostkowy transform, to przeliczamy wierzcho³ki, a mno¿enie podajemy dalej
{ // jeœli jest jednostkowy transform, to przeliczamy
// wierzcho³ki, a mno¿enie podajemy dalej
double t;
if (Vertices)
for (int i = 0; i < iNumVerts; ++i)
@@ -809,7 +836,8 @@ void TSubModel::InitialRotate(bool doit)
void TSubModel::ChildAdd(TSubModel *SubModel)
{ // dodanie submodelu potemnego (uzale¿nionego)
// Ra: zmiana kolejnoœci, ¿eby kolejne móc renderowaæ po aktualnym (by³o przed)
// Ra: zmiana kolejnoœci, ¿eby kolejne móc renderowaæ po aktualnym (by³o
// przed)
if (SubModel)
SubModel->NextAdd(Child); // Ra: zmiana kolejnoœci renderowania
Child = SubModel;
@@ -826,7 +854,8 @@ void TSubModel::NextAdd(TSubModel *SubModel)
int TSubModel::FlagsCheck()
{ // analiza koniecznych zmian pomiêdzy submodelami
// samo pomijanie glBindTexture() nie poprawi wydajnoœci
// ale mo¿na sprawdziæ, czy mo¿na w ogóle pomin¹æ kod do tekstur (sprawdzanie replaceskin)
// ale mo¿na sprawdziæ, czy mo¿na w ogóle pomin¹æ kod do tekstur (sprawdzanie
// replaceskin)
int i;
if (Child)
{ // Child jest renderowany po danym submodelu
@@ -836,7 +865,8 @@ int TSubModel::FlagsCheck()
i = Child->FlagsCheck();
iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeñstwo i dzieci
if (eType == TP_TEXT)
{ // wy³¹czenie renderowania Next dla znaków wyœwietlacza tekstowego
{ // wy³¹czenie renderowania Next dla znaków
// wyœwietlacza tekstowego
TSubModel *p = Child;
while (p)
{
@@ -846,21 +876,23 @@ int TSubModel::FlagsCheck()
}
}
if (Next)
{ // Next jest renderowany po danym submodelu (kolejnoœæ odwrócona po wczytaniu T3D)
{ // Next jest renderowany po danym submodelu (kolejnoœæ odwrócona
// po wczytaniu T3D)
if (TextureID) // o ile dany ma teksturê
if ((TextureID != Next->TextureID) ||
(i & 0x00800000)) // a ma inn¹ albo dzieci zmieniaj¹
iFlags |= 0x80; // to dany submodel musi sobie j¹ ustawiaæ
i = Next->FlagsCheck();
iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // nastêpny, kolejne i ich dzieci
// tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego dzieci nie
// zmieniaj¹
// tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego
// dzieci nie zmieniaj¹
}
return iFlags;
};
void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle)
{ // obrócenie submodelu wg podanej osi (np. wskazówki w kabinie)
{ // obrócenie submodelu wg podanej
// osi (np. wskazówki w kabinie)
v_RotateAxis = vNewRotateAxis;
f_Angle = fNewAngle;
if (fNewAngle != 0.0)
@@ -872,7 +904,9 @@ void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle)
}
void TSubModel::SetRotateXYZ(float3 vNewAngles)
{ // obrócenie submodelu o podane k¹ty wokó³ osi lokalnego uk³adu
{ // obrócenie submodelu o
// podane k¹ty wokó³ osi
// lokalnego uk³adu
v_Angles = vNewAngles;
b_Anim = at_RotateXYZ;
b_aAnim = at_RotateXYZ;
@@ -880,7 +914,9 @@ void TSubModel::SetRotateXYZ(float3 vNewAngles)
}
void TSubModel::SetRotateXYZ(vector3 vNewAngles)
{ // obrócenie submodelu o podane k¹ty wokó³ osi lokalnego uk³adu
{ // obrócenie submodelu o
// podane k¹ty wokó³ osi
// lokalnego uk³adu
v_Angles.x = vNewAngles.x;
v_Angles.y = vNewAngles.y;
v_Angles.z = vNewAngles.z;
@@ -908,7 +944,9 @@ void TSubModel::SetTranslate(vector3 vNewTransVector)
}
void TSubModel::SetRotateIK1(float3 vNewAngles)
{ // obrócenie submodelu o podane k¹ty wokó³ osi lokalnego uk³adu
{ // obrócenie submodelu o
// podane k¹ty wokó³ osi
// lokalnego uk³adu
v_Angles = vNewAngles;
iAnimOwner = iInstance; // zapamiêtanie czyja jest animacja
}
@@ -1004,13 +1042,14 @@ void TSubModel::RaAnimation(TAnimType a)
break;
case at_Billboard: // obrót w pionie do kamery
{
matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu wspó³rzêdnych
// submodelu
matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu
// wspó³rzêdnych submodelu
glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy
float3 gdzie = float3(mat[3][0], mat[3][1],
mat[3][2]); // pocz¹tek uk³adu wspó³rzêdnych submodelu wzglêdem kamery
glLoadIdentity(); // macierz jedynkowa
glTranslatef(gdzie.x, gdzie.y, gdzie.z); // pocz¹tek uk³adu zostaje bez zmian
glTranslatef(gdzie.x, gdzie.y, gdzie.z); // pocz¹tek uk³adu zostaje bez
// zmian
glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0,
0.0); // jedynie obracamy w pionie o k¹t
}
@@ -1024,7 +1063,8 @@ void TSubModel::RaAnimation(TAnimType a)
glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX
break;
case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa)
glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót wzglêdem osi pionowej (azymut)
glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót wzglêdem osi pionowej
// (azymut)
glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót wzglêdem poziomu (deklinacja)
break;
case at_DigiClk: // animacja zegara cyfrowego
@@ -1034,9 +1074,10 @@ void TSubModel::RaAnimation(TAnimType a)
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od czasu
if (sm->pName)
{ // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0')
if ((*sm->pName) <= '5') // zegarek ma 6 cyfr maksymalnie
sm->SetRotate(float3(0, 1, 0), -Global::fClockAngleDeg[(*sm->pName) - '0']);
if ((sm->pName[0]) >= '0')
if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie
sm->SetRotate(float3(0, 1, 0),
-Global::fClockAngleDeg[(sm->pName[0]) - '0']);
}
sm = sm->NextGet();
} while (sm);
@@ -1093,8 +1134,8 @@ void TSubModel::RenderDL()
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 (fCosViewAngle <
fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a Falloff
if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) /
@@ -1106,11 +1147,12 @@ void TSubModel::RenderDL()
switch (iFarAttenDecay)
{
case 1:
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od
kata
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
//dorobic od kata
break;
case 2:
Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata
Distdimm=fFarDecayRadius/(1+fSquareDist);
//dorobic od kata
break;
}
if (Distdimm>1)
@@ -1124,7 +1166,8 @@ void TSubModel::RenderDL()
}
else if (eType == TP_STARS)
{
// glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly
// 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
@@ -1184,12 +1227,14 @@ void TSubModel::RenderAlphaDL()
}
if (Child != NULL)
if (eType == TP_TEXT)
{ // tekst renderujemy w specjalny sposób, zamiast submodeli z ³añcucha Child
{ // tekst renderujemy w specjalny sposób, zamiast
// submodeli z ³añcucha Child
int i, j = pasText->Length();
TSubModel *p;
char c;
if (!smLetter)
{ // jeœli nie ma tablicy, to j¹ stworzyæ; miejsce nieodpowiednie, ale tymczasowo
{ // 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
@@ -1248,7 +1293,8 @@ void TSubModel::RenderVBO()
else
glBindTexture(GL_TEXTURE_2D, TextureID); // równie¿ 0
glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub
// glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, co glColor
// 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
@@ -1271,8 +1317,8 @@ void TSubModel::RenderVBO()
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 (fCosViewAngle <
fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a Falloff
if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) /
@@ -1280,13 +1326,18 @@ void TSubModel::RenderVBO()
/* 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
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
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.
@@ -1295,11 +1346,12 @@ void TSubModel::RenderVBO()
switch (iFarAttenDecay)
{
case 1:
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od
kata
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
//dorobic od kata
break;
case 2:
Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata
Distdimm=fFarDecayRadius/(1+fSquareDist);
//dorobic od kata
break;
}
if (Distdimm>1)
@@ -1313,10 +1365,12 @@ void TSubModel::RenderVBO()
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
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
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¹
@@ -1324,16 +1378,21 @@ void TSubModel::RenderVBO()
}
else if (eType == TP_STARS)
{
// glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly
// 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()
{ // 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
{ // wyœwietlanie kolorowych punktów zamiast
// trójk¹tów
glBindTexture(GL_TEXTURE_2D, 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
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);
@@ -1357,9 +1416,11 @@ void TSubModel::RenderVBO()
//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
glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty
swiecace sie blendowaly
//glBegin(GL_POINTS);
glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj wierzcho³ek z VBO
glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj
wierzcho³ek z VBO
// glVertex3f(0,0,0);
//glEnd();
glEnable(GL_LIGHTING);
@@ -1459,7 +1520,8 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert)
};
void TSubModel::Info()
{ // zapisanie informacji o submodelu do obiektu pomocniczego
{ // zapisanie informacji o submodelu do obiektu
// pomocniczego
TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent;
info->pSubModel = this;
if (fMatrix && (iFlags & 0x8000)) // ma matrycê i jest ona niejednostkowa
@@ -1474,7 +1536,8 @@ void TSubModel::Info()
}
if (info->iTexture < 0) // jeœli nie znaleziono we wczeœniejszych
{
info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury w pliku (od 1)
info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury
// w pliku (od 1)
AnsiString t = AnsiString(pTexture);
if (t.SubString(t.Length() - 3, 4) == ".tga")
t.Delete(t.Length() - 3, 4);
@@ -1510,7 +1573,9 @@ void TSubModel::Info()
};
void TSubModel::InfoSet(TSubModelInfo *info)
{ // ustawienie danych wg obiektu pomocniczego do zapisania w pliku
{ // ustawienie danych wg obiektu
// pomocniczego do zapisania w
// pliku
int ile = (char *)&uiDisplayList - (char *)&eType; // iloœæ bajtów pomiêdzy tymi zmiennymi
ZeroMemory(this, sizeof(TSubModel)); // zerowaie ca³oœci
CopyMemory(this, info->pSubModel, ile); // skopiowanie pamiêci 1:1
@@ -1538,14 +1603,16 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
pName = n->String(iName);
AnsiString s = AnsiString(pName);
if (!s.IsEmpty())
{ // jeœli dany submodel jest zgaszonym œwiat³em, to domyœlnie go ukrywamy
{ // jeœli dany submodel jest zgaszonym œwiat³em, to
// domyœlnie go ukrywamy
if (s.SubString(1, 8) == "Light_On") // jeœli jest œwiat³em numerowanym
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem
// "Light_Off"
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z
// obiektem "Light_Off"
else if (dynamic) // inaczej wy³¹cza³o smugê w latarniach
if (s.SubString(s.Length() - 2, 3) ==
"_on") // jeœli jest kontrolk¹ w stanie zapalonym
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem "_off"
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z
// obiektem "_off"
}
}
else
@@ -1561,7 +1628,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
TextureID = TTexturesManager::GetTextureID(szTexturePath,
Global::asCurrentTexturePath.c_str(), t.c_str());
// TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza
// ustawienie cyklu przezroczyste/nieprzezroczyste zale¿nie od w³asnoœci sta³ej tekstury
// ustawienie cyklu przezroczyste/nieprzezroczyste zale¿nie od w³asnoœci
// sta³ej tekstury
// iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10);
// //0x10-nieprzezroczysta, 0x20-przezroczysta
if (Opacity < 1.0) // przezroczystoϾ z tekstury brana tylko dla Opacity 0!
@@ -1572,12 +1640,15 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
iFlags |= 0x10; // normalnie nieprzezroczyste
}
b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu
iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest w³aœcicielem tablic)
iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest w³aœcicielem
// tablic)
Vertices = v + iVboPtr;
// if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, ¿eby siê nie renderowa³o na si³ê
// if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, ¿eby siê nie
// renderowa³o na si³ê
};
void TSubModel::AdjustDist()
{ // aktualizacja odleg³oœci faz LoD, zale¿na od rozdzielczoœci pionowej oraz multisamplingu
{ // aktualizacja odleg³oœci faz LoD, zale¿na od
// rozdzielczoœci pionowej oraz multisamplingu
if (fSquareMaxDist > 0.0)
fSquareMaxDist *= Global::fDistanceFactor;
if (fSquareMinDist > 0.0)
@@ -1605,7 +1676,8 @@ void TSubModel::ColorsSet(int *a, int *d, int *s)
};
void TSubModel::ParentMatrix(float4x4 *m)
{ // pobranie transformacji wzglêdem wstawienia modelu
// jeœli nie zosta³o wykonane Init() (tzn. zaraz po wczytaniu T3D), to dodatkowy obrót
// jeœli nie zosta³o wykonane Init() (tzn. zaraz po wczytaniu T3D), to
// dodatkowy obrót
// obrót T3D jest wymagany np. do policzenia wysokoœci pantografów
*m = float4x4(*fMatrix); // skopiowanie, bo bêdziemy mno¿yæ
// m(3)[1]=m[3][1]+0.054; //w górê o wysokoœæ œlizgu (na razie tak)
@@ -1616,11 +1688,12 @@ void TSubModel::ParentMatrix(float4x4 *m)
*m = *sm->Parent->GetMatrix() * *m;
sm = sm->Parent;
}
// dla ostatniego mo¿e byæ potrzebny dodatkowy obrót, jeœli wczytano z T3D, a nie obrócono
// jeszcze
// dla ostatniego mo¿e byæ potrzebny dodatkowy obrót, jeœli wczytano z T3D, a
// nie obrócono jeszcze
};
float TSubModel::MaxY(const float4x4 &m)
{ // obliczenie maksymalnej wysokoœci, na pocz¹tek œlizgu w pantografie
{ // obliczenie maksymalnej wysokoœci,
// na pocz¹tek œlizgu w pantografie
if (eType != 4)
return 0; // tylko dla trójk¹tów liczymy
if (iNumVerts < 1)
@@ -1666,7 +1739,8 @@ TModel3d::~TModel3d()
{
// SafeDeleteArray(Materials);
if (iFlags & 0x0200)
{ // wczytany z pliku tekstowego, submodele sprz¹taj¹ same
{ // wczytany z pliku tekstowego, submodele sprz¹taj¹
// same
SafeDelete(Root); // submodele siê usun¹ rekurencyjnie
}
else
@@ -1686,7 +1760,9 @@ TSubModel *__fastcall TModel3d::AddToNamed(const char *Name, TSubModel *SubModel
};
void TModel3d::AddTo(TSubModel *tmp, TSubModel *SubModel)
{ // jedyny poprawny sposób dodawania submodeli, inaczej mog¹ zgin¹æ przy zapisie E3D
{ // jedyny poprawny sposób dodawania
// submodeli, inaczej mog¹ zgin¹æ
// przy zapisie E3D
if (tmp)
{ // jeœli znaleziony, pod³¹czamy mu jako potomny
tmp->ChildAdd(SubModel);
@@ -1784,13 +1860,13 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic)
break;
case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel)
iSubModelsCount = (k - 2) / 64;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy
// póŸniej
Root =
(TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy póŸniej
break;
case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel)
iSubModelsCount = (k - 2) / 80;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy
// póŸniej
Root =
(TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy póŸniej
for (ch = 1; ch < iSubModelsCount;
++ch) // trzeba przesun¹æ bli¿ej, bo 256 wystarczy
MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256);
@@ -1809,13 +1885,15 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic)
break;
case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzcho³ka)
break;
case 'TEX0': // tekstury: 'TEX0',len,(³añcuchy zakoñczone zerem - pliki tekstur)
case 'TEX0': // tekstury: 'TEX0',len,(³añcuchy zakoñczone zerem - pliki
// tekstur)
Textures.Init((char *)(iModel + i)); //³¹cznie z nag³ówkiem
break;
case 'TIX0': // indeks nazw tekstur
Textures.InitIndex((int *)(iModel + i)); //³¹cznie z nag³ówkiem
break;
case 'NAM0': // nazwy: 'NAM0',len,(³añcuchy zakoñczone zerem - nazwy submodeli)
case 'NAM0': // nazwy: 'NAM0',len,(³añcuchy zakoñczone zerem - nazwy
// submodeli)
Names.Init((char *)(iModel + i)); //³¹cznie z nag³ówkiem
break;
case 'NIX0': // indeks nazw submodeli
@@ -1853,25 +1931,30 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic)
{
std::string parent;
// parser.getToken(parent);
parser.getTokens(1, false); // nazwa submodelu nadrzêdnego bez zmieny na ma³e
parser.getTokens(1, false); // nazwa submodelu nadrzêdnego bez zmieny na
// ma³e
parser >> parent;
if (parent == "")
break;
SubModel = new TSubModel();
iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic);
SubModel->Parent = AddToNamed(
parent.c_str(), SubModel); // bêdzie potrzebne do wyliczenia pozycji, np. pantografu
SubModel->Parent =
AddToNamed(parent.c_str(),
SubModel); // bêdzie potrzebne do wyliczenia pozycji, np. pantografu
// iSubModelsCount++;
parser.getToken(token);
}
// Ra: od wersji 334 przechylany jest ca³y model, a nie tylko pierwszy submodel
// ale bujanie kabiny nadal u¿ywa bananów :( od 393 przywrócone, ale z dodatkowym warunkiem
// Ra: od wersji 334 przechylany jest ca³y model, a nie tylko pierwszy
// submodel
// ale bujanie kabiny nadal u¿ywa bananów :( od 393 przywrócone, ale z
// dodatkowym warunkiem
if (Global::iConvertModels & 4)
{ // automatyczne banany czasem psu³y przechylanie kabin...
if (dynamic && Root)
{
if (Root->NextGet()) // jeœli ma jakiekolwiek kolejne
{ // dynamic musi mieæ "banana", bo tylko pierwszy obiekt jest animowany, a nastêpne nie
{ // dynamic musi mieæ "banana", bo tylko pierwszy obiekt jest animowany,
// a nastêpne nie
SubModel = new TSubModel(); // utworzenie pustego
SubModel->ChildAdd(Root);
Root = SubModel;
@@ -1883,16 +1966,19 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic)
}
void TModel3d::Init()
{ // obrócenie pocz¹tkowe uk³adu wspó³rzêdnych, dla pojazdów wykonywane po analizie animacji
{ // obrócenie pocz¹tkowe uk³adu wspó³rzêdnych, dla
// pojazdów wykonywane po analizie animacji
if (iFlags & 0x8000)
return; // operacje zosta³y ju¿ wykonane
if (Root)
{
if (iFlags & 0x0200) // jeœli wczytano z pliku tekstowego
{ // jest jakiœ dziwny b³¹d, ¿e obkrêcany ma byæ tylko ostatni submodel g³ównego ³añcucha
{ // jest jakiœ dziwny b³¹d, ¿e obkrêcany ma byæ tylko ostatni submodel
// g³ównego ³añcucha
// TSubModel *p=Root;
// do
//{p->InitialRotate(true); //ostatniemu nale¿y siê konwersja uk³adu wspó³rzêdnych
//{p->InitialRotate(true); //ostatniemu nale¿y siê konwersja uk³adu
// wspó³rzêdnych
// p=p->NextGet();
//}
// while (p->NextGet())
@@ -1910,11 +1996,12 @@ void TModel3d::Init()
{
if (Global::fDistanceFactor !=
1.0) // trochê zaoszczêdzi czasu na modelach z wieloma submocelami
Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od rozdzielczoœci
// pionowej oraz multisamplingu
Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od
// rozdzielczoœci pionowej oraz multisamplingu
if (Global::bUseVBO)
{
if (!m_pVNT) // jeœli nie ma jeszcze tablicy (wczytano z pliku tekstowego)
if (!m_pVNT) // jeœli nie ma jeszcze tablicy (wczytano z pliku
// tekstowego)
{ // tworzenie tymczasowej tablicy z wierzcho³kami ca³ego modelu
MakeArray(iNumVerts); // tworzenie tablic dla VBO
Root->RaArrayFill(m_pVNT); // wype³nianie tablicy
@@ -2027,7 +2114,8 @@ void TModel3d::BreakHierarhy()
};
/*
void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha)
void TModel3d::Render(vector3 pPosition,double fAngle,GLuint
ReplacableSkinId,int iAlpha)
{
// glColor3f(1.0f,1.0f,1.0f);
// glColor3f(0.0f,0.0f,0.0f);
@@ -2080,7 +2168,8 @@ void TModel3d::RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int
};
/*
void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int
void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint
*ReplacableSkinId,int
iAlpha)
{
// glColor3f(1.0f,1.0f,1.0f);
@@ -2100,7 +2189,8 @@ iAlpha)
fSquareDist=SquareMagnitude(pos);
*/
/*
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna!
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna!
if (StartVBO())
{//odwrócenie flag, aby wy³apaæ nieprzezroczyste
Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F);
@@ -2142,14 +2232,16 @@ void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, i
};
/*
void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int
void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint
*ReplacableSkinId,int
iAlpha)
{
glPushMatrix();
glTranslatef(pPosition.x,pPosition.y,pPosition.z);
if (fAngle!=0)
glRotatef(fAngle,0,1,0);
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna!
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna!
if (StartVBO())
{Root->ReplacableSet(ReplacableSkinId,iAlpha);
Root->RaRenderAlpha();
@@ -2244,7 +2336,8 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replac
//-----------------------------------------------------------------------------
int TModel3d::TerrainCount()
{ // zliczanie kwadratów kilometrowych (g³ówna linia po Next) do tworznia tablicy
{ // zliczanie kwadratów kilometrowych (g³ówna
// linia po Next) do tworznia tablicy
int i = 0;
TSubModel *r = Root;
while (r)
@@ -2273,16 +2366,16 @@ void TModel3d::TerrainRenderVBO(int n)
// 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!
// TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition());
// //zmienna globalna!
if (StartVBO())
{ // odwrócenie flag, aby wy³apaæ nieprzezroczyste
// Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F);
TSubModel *r = Root;
while (r)
{
if (r->iVisible == n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla
// 0==false)
if (r->iVisible ==
n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla 0==false)
r->RenderVBO(); // sub kolejne (Next) siê nie wyrenderuj¹
r = r->NextGet();
}

656
Train.cpp

File diff suppressed because it is too large Load Diff

24
Train.h
View File

@@ -152,8 +152,8 @@ class TTrain
TGauge ggReleaserButton;
TGauge ggAntiSlipButton;
TGauge ggFuseButton;
TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i
// ogrzewania
TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania
// nadmiarowego przetwornic i ogrzewania
TGauge ggStLinOffButton;
TGauge ggRadioButton;
TGauge ggUpperLightButton;
@@ -185,7 +185,8 @@ class TTrain
TGauge ggUniversal4Button;
TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny
TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia oswietlenia kabiny
TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia
// oswietlenia kabiny
// NBMX wrzesien 2003 - obsluga drzwi
TGauge ggDoorLeftButton;
@@ -233,7 +234,8 @@ class TTrain
TButton btLampkaOpory;
TButton btLampkaWysRozr;
TButton btLampkaUniversal3;
int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic, 1-obw.gl, 2-przetw.
int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic,
// 1-obw.gl, 2-przetw.
bool LampkaUniversal3_st;
TButton btLampkaWentZaluzje; // ET22
TButton btLampkaOgrzewanieSkladu;
@@ -334,7 +336,8 @@ class TTrain
// TFadeSound sConverter; //przetwornica
// TFadeSound sSmallCompressor; //przetwornica
int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1: przyciemnione, 2: pelne)
int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1:
// przyciemnione, 2: pelne)
bool bCabLight; // hunter-091012: czy swiatlo jest zapalone?
bool bCabLightDim; // hunter-091012: czy przyciemnienie kabiny jest zapalone?
@@ -372,17 +375,20 @@ class TTrain
float fTachoVelocityJump; // ze skakaniem
float fTachoTimer;
float fTachoCount;
float fHVoltage; // napiie dla dynamicznych gak
float fHCurrent[4]; // pry: suma i amperomierze 1,2,3
float fHVoltage; // napi?cie dla dynamicznych ga?ek
float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3
float fEngine[4]; // obroty te? trzeba pobra?
float fPress[20][3]; // cisnienia dla wszystkich czlonow
bool bDoors[20]; // drzwi dla wszystkich czlonow
// McZapkie: do syczenia
float fPPress, fNPress;
float fSPPress, fSNPress;
int iSekunda; // Ra: sekunda aktualizacji pr璠ko𦣇i
int iRadioChannel; // numer aktualnego kana radiowego
int iSekunda; // Ra: sekunda aktualizacji pr?dko?ci
int iRadioChannel; // numer aktualnego kana?u radiowego
TPythonScreens pyScreens;
public:
float fEIMParams[9][10]; // parametry dla silnikow asynchronicznych
int RadioChannel()
{
return iRadioChannel;