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 *.~h
*.~bpr *.~bpr
*.~pas *.~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() TButton::TButton()
{ {
iFeedbackBit = 0; iFeedbackBit = 0;
bData = NULL;
Clear(); Clear();
}; };
@@ -54,8 +55,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel
Init(str, pModel1, false); Init(str, pModel1, false);
if (pModel2) if (pModel2)
if (!pModelOn && !pModelOff) if (!pModelOn && !pModelOff)
Init(str, pModel2, Init(str, pModel2, false); // mo¿e w drugim bêdzie (jak nie w kabinie,
false); // mo¿e w drugim bêdzie (jak nie w kabinie, to w zewnêtrznym) // to w zewnêtrznym)
} }
else else
{ {
@@ -66,6 +67,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel
void TButton::Update() void TButton::Update()
{ {
if (bData != NULL)
bOn = (*bData);
if (pModelOn) if (pModelOn)
pModelOn->iVisible = bOn; pModelOn->iVisible = bOn;
if (pModelOff) if (pModelOff)
@@ -78,3 +81,8 @@ void TButton::Update()
Console::BitsClear(iFeedbackBit); 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" #include "QueryParserComp.hpp"
class TButton 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: private:
TSubModel *pModelOn, *pModelOff; // submodel dla stanu za³¹czonego i wy³¹czonego TSubModel *pModelOn, *pModelOff; // submodel dla stanu za³¹czonego i wy³¹czonego
bool bOn; bool bOn;
bool *bData;
int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit
void Update();
public: public:
TButton(); TButton();
@@ -53,8 +54,10 @@ class TButton
{ {
return (pModelOn) || (pModelOff); return (pModelOn) || (pModelOff);
}; };
void Update();
void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false); void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false);
void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); 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) double fNewFriction, double fNewValue)
{ // ustawienie parametrów animacji submodelu { // ustawienie parametrów animacji submodelu
if (NewSubModel) if (NewSubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³ { // warunek na wszelki wypadek, gdyby siê submodel nie
// pod³¹czy³
fFriction = fNewFriction; fFriction = fNewFriction;
fValue = fNewValue; fValue = fNewValue;
fOffset = fNewOffset; fOffset = fNewOffset;
@@ -61,11 +62,12 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
{ {
TSubModel *sm = SubModel->ChildGet(); TSubModel *sm = SubModel->ChildGet();
do 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) if (sm->pName)
{ // musi mieæ niepust¹ nazwê { // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0') if (sm->pName[0] >= '0')
if ((*sm->pName) <= '9') if (sm->pName[0] <= '9')
sm->WillBeAnimated(); // wy³¹czenie optymalizacji sm->WillBeAnimated(); // wy³¹czenie optymalizacji
} }
sm = sm->NextGet(); sm = sm->NextGet();
@@ -137,14 +139,16 @@ void TGauge::PutValue(double fNewDesired)
void TGauge::Update() void TGauge::Update()
{ {
float dt = Timer::GetDeltaTime(); float dt = Timer::GetDeltaTime();
if ((fFriction > 0) && if ((fFriction > 0) && (dt < 0.5 * fFriction)) // McZapkie-281102:
(dt < // zabezpieczenie przed
0.5 * fFriction)) // McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow // oscylacjami dla dlugich
// czasow
fValue += dt * (fDesiredValue - fValue) / fFriction; fValue += dt * (fDesiredValue - fValue) / fFriction;
else else
fValue = fDesiredValue; fValue = fDesiredValue;
if (SubModel) if (SubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³ { // warunek na wszelki wypadek, gdyby siê submodel nie
// pod³¹czy³
TSubModel *sm; TSubModel *sm;
switch (eType) switch (eType)
{ {
@@ -167,16 +171,17 @@ void TGauge::Update()
break; break;
case gt_Digital: // Ra 2014-07: licznik cyfrowy case gt_Digital: // Ra 2014-07: licznik cyfrowy
sm = SubModel->ChildGet(); sm = SubModel->ChildGet();
AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez AnsiString n =
// sensu FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez sensu
do 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) if (sm->pName)
{ // musi mieæ niepust¹ nazwê { // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0') if (sm->pName[0] >= '0')
if ((*sm->pName) <= '9') if (sm->pName[0] <= '9')
sm->SetRotate(float3(0, 1, 0), 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(); sm = sm->NextGet();
} while (sm); } while (sm);

View File

@@ -867,6 +867,7 @@ static const Shortint eimv_Uzsmax = 0x10;
static const Shortint eimv_Pmax = 0x11; static const Shortint eimv_Pmax = 0x11;
static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Fzad = 0x12;
static const Shortint eimv_Imax = 0x13; 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 extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension
&Dim1, const TDimension &Dim2); &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_Pmax = 0x11;
static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Fzad = 0x12;
static const Shortint eimv_Imax = 0x13; 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 extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension
&Dim1, const TDimension &Dim2); &Dim1, const TDimension &Dim2);

View File

@@ -1,13 +1,5 @@
unit _mover; {fizyka ruchu dla symulatora lokomotywy} 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 MaSzyna EU07 locomotive simulator
Copyright (C) 2001-2004 Maciej Czapkiewicz and others Copyright (C) 2001-2004 Maciej Czapkiewicz and others
@@ -212,6 +204,7 @@ CONST
eimv_Pmax=17; eimv_Pmax=17;
eimv_Fzad=18; eimv_Fzad=18;
eimv_Imax=19; eimv_Imax=19;
eimv_Fful=20;
TYPE TYPE
@@ -2425,10 +2418,13 @@ begin
dpMainValve:=0; dpMainValve:=0;
if (BrakeCtrlPosNo>1) and (ActiveCab<>0)then if (BrakeCtrlPosNo>1) {and(ActiveCab<>0)}then
with BrakePressureTable[BrakeCtrlPos] do with BrakePressureTable[BrakeCtrlPos] do
begin 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 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 temp:=PipePress+0.00001
else else
@@ -2483,11 +2479,12 @@ end;
if(DynamicBrakeFlag)and(EngineType=ElectricInductionMotor)then if(DynamicBrakeFlag)and(EngineType=ElectricInductionMotor)then
begin begin
if(Vel>10)then LocBrakePress:=0 else (Hamulec as TLSt).SetLBP(LocBrakePress);
if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress // if(Vel>10)then LocBrakePress:=0 else
end; // if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress
end
(Hamulec as TLSt).SetLBP(LocBrakePress); else
(Hamulec as TLSt).SetLBP(LocBrakePress);
end; end;
CV1_L_TR: CV1_L_TR:
begin begin
@@ -4095,10 +4092,11 @@ begin
Mm:=Mm*RList[MainCtrlActualPos].Bn/(RList[MainCtrlActualPos].Bn+1); //zrobione w momencie, żeby nie dawac elektryki w przeliczaniu sił Mm:=Mm*RList[MainCtrlActualPos].Bn/(RList[MainCtrlActualPos].Bn+1); //zrobione w momencie, żeby nie dawac elektryki w przeliczaniu sił
if (Abs(Im)>Imax) then 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 else
Vhyp:=0; Vhyp:=0;
if (Vhyp>CtrlDelay/2) then //jesli czas oddzialywania przekroczony if (Vhyp>CtrlDelay/2) then //jesli czas oddzialywania przekroczony
// dec(MainCtrlActualPos);
FuseOff; {wywalanie bezpiecznika z powodu przetezenia silnikow} FuseOff; {wywalanie bezpiecznika z powodu przetezenia silnikow}
if (Mains) then //nie wchodzić w funkcję bez potrzeby if (Mains) then //nie wchodzić w funkcję bez potrzeby
if (Abs(Voltage)<EnginePowerSource.CollectorParameters.MinV) or (Abs(Voltage)>EnginePowerSource.CollectorParameters.MaxV) then if (Abs(Voltage)<EnginePowerSource.CollectorParameters.MinV) or (Abs(Voltage)>EnginePowerSource.CollectorParameters.MaxV) then
@@ -4292,31 +4290,39 @@ begin
end; end;
ElectricInductionMotor: ElectricInductionMotor:
begin 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 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 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; DynamicBrakeFlag:=true;
if(DynamicBrakeFlag)then if(DynamicBrakeFlag)then
begin begin
if eimv[eimv_Fmax]*sign(V)*DirAbsolute<-1 then 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 else
PosRatio:=0; PosRatio:=0;
PosRatio:=round(20*Posratio)/20; PosRatio:=round(20*Posratio)/20;
if PosRatio<19.5/20 then PosRatio:=PosRatio*0.9; if PosRatio<19.5/20 then PosRatio:=PosRatio*0.9;
(Hamulec as TLSt).SetED(PosRatio); (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; tmp:=5;
end end
else else
begin begin
PosRatio:=(MainCtrlPos/MainCtrlPosNo); PosRatio:=(MainCtrlPos/MainCtrlPosNo);
eimv[eimv_Fzad]:=PosRatio;
PosRatio:=1.0*(PosRatio*0+1)*PosRatio; PosRatio:=1.0*(PosRatio*0+1)*PosRatio;
(Hamulec as TLSt).SetED(0); (Hamulec as TLSt).SetED(0);
// (Hamulec as TLSt).SetLBP(LocBrakePress);
if (PosRatio>dizel_fill) then tmp:=1 else tmp:=4; //szybkie malenie, powolne wzrastanie if (PosRatio>dizel_fill) then tmp:=1 else tmp:=4; //szybkie malenie, powolne wzrastanie
end; end;
if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn; end;//przeciwposlizg if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn; end;//przeciwposlizg
@@ -4331,19 +4337,22 @@ begin
eimv[eimv_Pmax]:=eimc[eimc_p_Ph] eimv[eimv_Pmax]:=eimc[eimc_p_Ph]
else 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_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; 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(DynamicBrakeFlag)then
// if(Vel>eimc[eimc_p_Vh0])then begin
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])) eimv[eimv_Fful]:=Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(eimc[eimc_p_Fh],eimv[eimv_FMAXMAX]));
// else 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]))
// eimv[eimv_Fmax]:=0 end
else 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_ks]:=eimv[eimv_Fmax]/eimv[eimv_FMAXMAX];
eimv[eimv_df]:=eimv[eimv_ks]*eimc[eimc_s_dfmax]; 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_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]); // eimv[eimv_pole]:=eimv[eimv_U]/(eimv[eimv_fp]*eimc[eimc_s_cfu]);
if(abs(eimv[eimv_fp])<=eimv[eimv_fkr])then if(abs(eimv[eimv_fp])<=eimv[eimv_fkr])then
@@ -4365,13 +4374,13 @@ begin
EnginePower:=Abs(eimv[eimv_Ic]*eimv[eimv_U]*NPoweredAxles)/1000; EnginePower:=Abs(eimv[eimv_Ic]*eimv[eimv_U]*NPoweredAxles)/1000;
tmpV:=eimv[eimv_fp]; 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 begin
if abs(tmpV)<32 then RventRot:=1.0 else i:=0;
if abs(tmpV)<39 then RventRot:=0.33*abs(tmpV)/32 else while (i<RlistSize-1)and(DEList[i+1].RPM<abs(tmpV))do inc(i);
RventRot:=0.25*abs(tmpV)/39;//} RventRot:=(abs(tmpV)-DEList[i].RPM)/(DEList[i+1].RPM-DEList[i].RPM)*(DEList[i+1].GenPower-DEList[i].GenPower)+DEList[i].GenPower;
end end
else RVentRot:=0; else RVentRot:=0;
Mm:=eimv[eimv_M]*DirAbsolute; Mm:=eimv[eimv_M]*DirAbsolute;
Mw:=Mm*Transmision.Ratio; Mw:=Mm*Transmision.Ratio;
@@ -4383,7 +4392,7 @@ begin
else else
begin begin
Im:=0;Mm:=0;Mw:=0;Fw:=0;Ft:=0;Itot:=0;dizel_fill:=0;EnginePower:=0; 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;
end; end;
None: begin end; None: begin end;
@@ -4786,7 +4795,7 @@ begin
else else
Voltage:=0; Voltage:=0;
if Mains and {(Abs(CabNo)<2) and} (EngineType=ElectricInductionMotor) then //potem ulepszyc! pantogtrafy! 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; //end;
if Power>0 then if Power>0 then
@@ -4851,34 +4860,39 @@ function T_MoverParameters.ComputeMovement(dt:real; dt1:real; Shape:TTrackShape;
var b:byte; var b:byte;
Vprev,AccSprev:real; Vprev,AccSprev:real;
// Iheat:real; prad ogrzewania // Iheat:real; prad ogrzewania
hvc: real;
const Vepsilon=1e-5; Aepsilon=1e-3; //ASBSpeed=0.8; const Vepsilon=1e-5; Aepsilon=1e-3; //ASBSpeed=0.8;
begin begin
{ TotalCurrent:=0;
for b:=0 to 1 do //przekazywanie napiec 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 if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then
begin 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 end
else else
HVCouplers[1-b][1]:=Max0R(Abs(Voltage),0); HVCouplers[1-b][1]:=Abs(ElectricTraction.TractionVoltage);//Max0R(Abs(Voltage),0);
end; // 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
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
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;
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;
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;
end;
}
ClearPendingExceptions; ClearPendingExceptions;
if not TestFlag(DamageFlag,dtrain_out) then if not TestFlag(DamageFlag,dtrain_out) then
@@ -4888,7 +4902,7 @@ begin
RunningTraction:=ElectricTraction; RunningTraction:=ElectricTraction;
with ElectricTraction do with ElectricTraction do
if not DynamicBrakeFlag then 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 else
RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*Itot*0); //zasadniczo ED oporowe nie zmienia napięcia w sieci RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*Itot*0); //zasadniczo ED oporowe nie zmienia napięcia w sieci
end; end;
@@ -7357,7 +7371,14 @@ begin
SST[k].Pmax:=Min0R(SST[k].Pmax,sqr(SST[k].Umax)/47.6); SST[k].Pmax:=Min0R(SST[k].Pmax,sqr(SST[k].Umax)/47.6);
end; end;
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; end;
end; {koniec filtru importu parametrow} end; {koniec filtru importu parametrow}
if ConversionError=0 then if ConversionError=0 then

View File

@@ -91,7 +91,8 @@ void TSubModel::FirstInit()
Child = NULL; Child = NULL;
TextureID = 0; TextureID = 0;
// TexAlpha=false; // 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; // TexHash=false;
// Hits=NULL; // Hits=NULL;
// CollisionPts=NULL; // CollisionPts=NULL;
@@ -137,15 +138,17 @@ TSubModel::~TSubModel()
delete[] pName; delete[] pName;
} }
/* /*
else else
{//wczytano z pliku binarnego (nie jest w³aœcicielem tablic) {//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) 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) if (iFlags & 0x0200)
{ // tylko je¿eli submodel zosta utworzony przez new { // tylko je¿eli submodel zosta utworzony przez new
delete[] pTexture; // usuniêcie poprzedniej delete[] pTexture; // usuniêcie poprzedniej
@@ -161,7 +164,8 @@ void TSubModel::TextureNameSet(const char *n)
}; };
void TSubModel::NameSet(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) if (iFlags & 0x0200)
{ // tylko je¿eli submodel zosta utworzony przez new { // tylko je¿eli submodel zosta utworzony przez new
delete[] pName; // usuniêcie poprzedniej 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) // *Vertices)
int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *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 int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójk¹t
// GLVERTEX *p; //roboczy wskaŸnik // GLVERTEX *p; //roboczy wskaŸnik
float8 *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; parser >> token;
NameSet(token.c_str()); NameSet(token.c_str());
if (dynamic) 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" 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" 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" 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! if (parser.expectToken("anim:")) // Ra: ta informacja by siê przyda³a!
{ // rodzaj animacji { // 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 parser.getToken(fCosHotspotAngle); // k¹t liczony dla œrednicy, a nie promienia
fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle)); fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle));
iNumVerts = 1; 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) 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); szTexturePath, Global::asCurrentTexturePath.c_str(), texture);
// TexAlpha=TTexturesManager::GetAlpha(TextureID); // TexAlpha=TTexturesManager::GetAlpha(TextureID);
// iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta // 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) ? iFlags |= TTexturesManager::GetAlpha(TextureID) ?
0x20 : 0x20 :
0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta
@@ -449,15 +461,17 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
if (eType < TP_ROTATOR) if (eType < TP_ROTATOR)
{ // wczytywanie wierzcho³ków { // wczytywanie wierzcho³ków
parser.ignoreToken(); parser.ignoreToken();
// Ra 15-01: to wczytaæ jako tekst - jeœli pierwszy znak zawiera "*", to dalej bêdzie nazwa // Ra 15-01: to wczytaæ jako tekst - jeœli pierwszy znak zawiera "*", to
// wczeœniejszego submodelu, z którego nale¿y wzi¹æ wierzcho³ki // dalej bêdzie nazwa wczeœniejszego submodelu, z którego nale¿y wzi¹æ
// zapewni to jak¹œ zgodnoœæ wstecz, bo zamiast liczby bêdzie ci¹g, którego wartoœæ powinna // wierzcho³ki
// byæ uznana jako zerowa // 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(iNumVerts);
parser.getToken(token); parser.getToken(token);
if (token[0] == '*') if (token[0] == '*')
{ // jeœli pierwszy znak jest gwiazdk¹, poszukaæ submodelu o nazwie bez tej gwiazdki i wzi¹æ { // jeœli pierwszy znak jest gwiazdk¹, poszukaæ
// z niego wierzcho³ki // submodelu o nazwie bez tej gwiazdki i wzi¹æ z
// niego wierzcho³ki
Error("Verticles reference not yet supported!"); Error("Verticles reference not yet supported!");
} }
else else
@@ -474,19 +488,23 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
{ {
Vertices = new float8[iNumVerts]; Vertices = new float8[iNumVerts];
iNumFaces = iNumVerts / 3; iNumFaces = iNumVerts / 3;
sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak u¿redniania wektorów sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak
// normalnych // u¿redniania wektorów normalnych
int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor normalny int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor
// normalny
int maska = 0; int maska = 0;
for (int i = 0; i < iNumVerts; i++) 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 wsp[i] = -1; // wektory normalne nie s¹ policzone dla tego wierzcho³ka
if ((i % 3) == 0) if ((i % 3) == 0)
{ // jeœli bêdzie maska -1, to dalej bêd¹ wierzcho³ki z wektorami normalnymi, { // jeœli bêdzie maska -1, to dalej bêd¹
// podanymi jawnie // wierzcho³ki z wektorami normalnymi, podanymi
// jawnie
parser.getToken(maska); // maska powierzchni trójk¹ta parser.getToken(maska); // maska powierzchni trójk¹ta
sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0, czyli nie sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0,
// ma wspólnych wektorów normalnych // czyli nie ma wspólnych
// wektorów normalnych
} }
parser.getToken(Vertices[i].Point.x); parser.getToken(Vertices[i].Point.x);
parser.getToken(Vertices[i].Point.y); 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: \"") + WriteLog(AnsiString("Degenerated triangle ignored in: \"") +
AnsiString(pName) + "\", verticle " + AnsiString(i)); AnsiString(pName) + "\", verticle " + AnsiString(i));
} }
if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to zostanie if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to
// usuniêty i nie ma co sprawdzaæ // zostanie usuniêty i nie ma co sprawdzaæ
if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) ||
((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() >
1000.0) || 1000.0) ||
((Vertices[i - 2].Point - Vertices[i].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 { // je¿eli s¹ dalej ni¿ 2km od siebie //Ra 15-01:
// powinien byæ wiêkszy ni¿ 300m (trójk¹ty terenu w E3D mog¹ mieæ // obiekt wstawiany nie powinien byæ wiêkszy ni¿
// 1.5km) // 300m (trójk¹ty terenu w E3D mog¹ mieæ 1.5km)
--iNumFaces; // o jeden trójk¹t mniej --iNumFaces; // o jeden trójk¹t mniej
iNumVerts -= 3; // czyli o 3 wierzcho³ki iNumVerts -= 3; // czyli o 3 wierzcho³ki
i -= 3; // wczytanie kolejnego w to miejsce 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 int i; // indeks dla trójk¹tów
float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych 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 for (i = 0; i < iNumFaces; i++) // pêtla po trójk¹tach - bêdzie
// wstêpnie przeliczymy normalne trójk¹tów // szybciej, jak wstêpnie przeliczymy
// normalne trójk¹tów
n[i] = SafeNormalize( n[i] = SafeNormalize(
CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point,
Vertices[i * 3].Point - Vertices[i * 3 + 2].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 float3 norm; // roboczy wektor normalny
for (v = 0; v < iNumVerts; v++) for (v = 0; v < iNumVerts; v++)
{ // pêtla po wierzcho³kach trójk¹tów { // pêtla po wierzcho³kach trójk¹tów
if (wsp[v] >= if (wsp[v] >= 0) // jeœli ju¿ by³ liczony wektor normalny z u¿yciem
0) // jeœli ju¿ by³ liczony wektor normalny z u¿yciem tego wierzcho³ka // tego wierzcho³ka
Vertices[v].Normal = Vertices[v].Normal =
Vertices[wsp[v]].Normal; // to wystarczy skopiowaæ policzony wczeœniej Vertices[wsp[v]].Normal; // to wystarczy skopiowaæ policzony wczeœniej
else 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 norm = float3(0, 0, 0); // liczenie zaczynamy od zera
f = v; // zaczynamy dodawanie wektorów normalnych od w³asnego f = v; // zaczynamy dodawanie wektorów normalnych od w³asnego
while (f >= 0) 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 wsp[f] = v; // informacja, ¿e w tym wierzcho³ku jest ju¿ policzony
// wektor normalny // wektor normalny
norm += n[f / 3]; norm += n[f / 3];
f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point,
Vertices); // i szukanie od kolejnego trójk¹ta Vertices); // i szukanie od kolejnego trójk¹ta
} }
// Ra 15-01: nale¿a³o by jeszcze uwzglêdniæ skalowanie wprowadzane przez // Ra 15-01: nale¿a³o by jeszcze uwzglêdniæ skalowanie wprowadzane
// transformy, aby normalne po przeskalowaniu by³y jednostkowe // przez transformy, aby normalne po przeskalowaniu by³y jednostkowe
Vertices[v].Normal = Vertices[v].Normal =
SafeNormalize(norm); // przepisanie do wierzcho³ka trójk¹ta 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 } // obs³uga submodelu z w³asn¹ list¹ wierzcho³ków
} }
else if (eType == TP_STARS) 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.ignoreToken();
parser.getToken(iNumVerts); parser.getToken(iNumVerts);
// Vertices=new GLVERTEX[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) 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; TSubModel *s = this;
while (s ? (s->TextureID != tex) : false) while (s ? (s->TextureID != tex) : false)
{ // szukanie submodelu o danej teksturze { // 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) 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; TSubModel *s = this;
while (s ? s->TextureID != tex : false) while (s ? s->TextureID != tex : false)
{ // szukanie submodelu o danej teksturze { // 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() 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) if (Global::bUseVBO)
return; // Ra: przy VBO to siê nie przyda return; // Ra: przy VBO to siê nie przyda
// iFlags|=0x4000; //wy³¹czenie przeliczania wierzcho³ków, bo nie s¹ zachowane // iFlags|=0x4000; //wy³¹czenie przeliczania wierzcho³ków, bo nie s¹ zachowane
@@ -682,9 +706,9 @@ void TSubModel::DisplayLists()
for (int i = 0; i < iNumVerts; i++) for (int i = 0; i < iNumVerts; i++)
{ {
/* /*
glNormal3dv(&Vertices[i].Normal.x); glNormal3dv(&Vertices[i].Normal.x);
glTexCoord2f(Vertices[i].tu,Vertices[i].tv); glTexCoord2f(Vertices[i].tu,Vertices[i].tv);
glVertex3dv(&Vertices[i].Point.x); glVertex3dv(&Vertices[i].Point.x);
*/ */
glNormal3fv(&Vertices[i].Normal.x); glNormal3fv(&Vertices[i].Normal.x);
glTexCoord2f(Vertices[i].tu, Vertices[i].tv); glTexCoord2f(Vertices[i].tu, Vertices[i].tv);
@@ -738,7 +762,8 @@ void TSubModel::DisplayLists()
glMaterialfv(GL_FRONT, GL_EMISSION, emm2); glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
glEndList(); 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) if (Child)
Child->DisplayLists(); Child->DisplayLists();
if (Next) if (Next)
@@ -762,11 +787,12 @@ void TSubModel::InitialRotate(bool doit)
iFlags &= ~0x8000; // jednak jednostkowa po obróceniu iFlags &= ~0x8000; // jednak jednostkowa po obróceniu
} }
if (Child) if (Child)
Child->InitialRotate( Child->InitialRotate(false); // potomnych nie obracamy ju¿, tylko
false); // potomnych nie obracamy ju¿, tylko ewentualnie optymalizujemy // ewentualnie optymalizujemy
else if (Global::iConvertModels & 2) // optymalizacja jest opcjonalna else if (Global::iConvertModels & 2) // optymalizacja jest opcjonalna
if ((iFlags & 0xC000) == 0x8000) // o ile nie ma animacji 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 float4x4 *mat = GetMatrix(); // transform submodelu
if (Vertices) if (Vertices)
{ {
@@ -774,8 +800,8 @@ void TSubModel::InitialRotate(bool doit)
Vertices[i].Point = (*mat) * Vertices[i].Point; Vertices[i].Point = (*mat) * Vertices[i].Point;
(*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] = (*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] =
0.0; // zerujemy przesuniêcie przed obracaniem normalnych 0.0; // zerujemy przesuniêcie przed obracaniem normalnych
if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to ich wtedy if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to
// nie ruszamy // ich wtedy nie ruszamy
for (int i = 0; i < iNumVerts; ++i) for (int i = 0; i < iNumVerts; ++i)
Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal); 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 else // jak jest jednostkowy i nie ma animacji
if (doit) 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; double t;
if (Vertices) if (Vertices)
for (int i = 0; i < iNumVerts; ++i) for (int i = 0; i < iNumVerts; ++i)
@@ -809,7 +836,8 @@ void TSubModel::InitialRotate(bool doit)
void TSubModel::ChildAdd(TSubModel *SubModel) void TSubModel::ChildAdd(TSubModel *SubModel)
{ // dodanie submodelu potemnego (uzale¿nionego) { // 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) if (SubModel)
SubModel->NextAdd(Child); // Ra: zmiana kolejnoœci renderowania SubModel->NextAdd(Child); // Ra: zmiana kolejnoœci renderowania
Child = SubModel; Child = SubModel;
@@ -826,7 +854,8 @@ void TSubModel::NextAdd(TSubModel *SubModel)
int TSubModel::FlagsCheck() int TSubModel::FlagsCheck()
{ // analiza koniecznych zmian pomiêdzy submodelami { // analiza koniecznych zmian pomiêdzy submodelami
// samo pomijanie glBindTexture() nie poprawi wydajnoœci // 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; int i;
if (Child) if (Child)
{ // Child jest renderowany po danym submodelu { // Child jest renderowany po danym submodelu
@@ -836,7 +865,8 @@ int TSubModel::FlagsCheck()
i = Child->FlagsCheck(); i = Child->FlagsCheck();
iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeñstwo i dzieci iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeñstwo i dzieci
if (eType == TP_TEXT) 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; TSubModel *p = Child;
while (p) while (p)
{ {
@@ -846,21 +876,23 @@ int TSubModel::FlagsCheck()
} }
} }
if (Next) 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) // o ile dany ma teksturê
if ((TextureID != Next->TextureID) || if ((TextureID != Next->TextureID) ||
(i & 0x00800000)) // a ma inn¹ albo dzieci zmieniaj¹ (i & 0x00800000)) // a ma inn¹ albo dzieci zmieniaj¹
iFlags |= 0x80; // to dany submodel musi sobie j¹ ustawiaæ iFlags |= 0x80; // to dany submodel musi sobie j¹ ustawiaæ
i = Next->FlagsCheck(); i = Next->FlagsCheck();
iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // nastêpny, kolejne i ich dzieci 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 // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego
// zmieniaj¹ // dzieci nie zmieniaj¹
} }
return iFlags; return iFlags;
}; };
void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) 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; v_RotateAxis = vNewRotateAxis;
f_Angle = fNewAngle; f_Angle = fNewAngle;
if (fNewAngle != 0.0) if (fNewAngle != 0.0)
@@ -872,7 +904,9 @@ void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle)
} }
void TSubModel::SetRotateXYZ(float3 vNewAngles) 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; v_Angles = vNewAngles;
b_Anim = at_RotateXYZ; b_Anim = at_RotateXYZ;
b_aAnim = at_RotateXYZ; b_aAnim = at_RotateXYZ;
@@ -880,7 +914,9 @@ void TSubModel::SetRotateXYZ(float3 vNewAngles)
} }
void TSubModel::SetRotateXYZ(vector3 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.x = vNewAngles.x;
v_Angles.y = vNewAngles.y; v_Angles.y = vNewAngles.y;
v_Angles.z = vNewAngles.z; v_Angles.z = vNewAngles.z;
@@ -908,7 +944,9 @@ void TSubModel::SetTranslate(vector3 vNewTransVector)
} }
void TSubModel::SetRotateIK1(float3 vNewAngles) 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; v_Angles = vNewAngles;
iAnimOwner = iInstance; // zapamiêtanie czyja jest animacja iAnimOwner = iInstance; // zapamiêtanie czyja jest animacja
} }
@@ -1004,13 +1042,14 @@ void TSubModel::RaAnimation(TAnimType a)
break; break;
case at_Billboard: // obrót w pionie do kamery case at_Billboard: // obrót w pionie do kamery
{ {
matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu wspó³rzêdnych matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu
// submodelu // wspó³rzêdnych submodelu
glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy
float3 gdzie = float3(mat[3][0], mat[3][1], float3 gdzie = float3(mat[3][0], mat[3][1],
mat[3][2]); // pocz¹tek uk³adu wspó³rzêdnych submodelu wzglêdem kamery mat[3][2]); // pocz¹tek uk³adu wspó³rzêdnych submodelu wzglêdem kamery
glLoadIdentity(); // macierz jedynkowa 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, glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0,
0.0); // jedynie obracamy w pionie o k¹t 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 glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX
break; break;
case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) 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) glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót wzglêdem poziomu (deklinacja)
break; break;
case at_DigiClk: // animacja zegara cyfrowego 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 { // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od czasu
if (sm->pName) if (sm->pName)
{ // musi mieæ niepust¹ nazwê { // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0') if ((sm->pName[0]) >= '0')
if ((*sm->pName) <= '5') // zegarek ma 6 cyfr maksymalnie if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie
sm->SetRotate(float3(0, 1, 0), -Global::fClockAngleDeg[(*sm->pName) - '0']); sm->SetRotate(float3(0, 1, 0),
-Global::fClockAngleDeg[(sm->pName[0]) - '0']);
} }
sm = sm->NextGet(); sm = sm->NextGet();
} while (sm); } while (sm);
@@ -1093,8 +1134,8 @@ void TSubModel::RenderDL()
if (fCosViewAngle > fCosFalloffAngle) // k¹t wiêkszy ni¿ maksymalny sto¿ek swiat³a if (fCosViewAngle > fCosFalloffAngle) // k¹t wiêkszy ni¿ maksymalny sto¿ek swiat³a
{ {
double Distdimm = 1.0; double Distdimm = 1.0;
if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a if (fCosViewAngle <
// Falloff fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a Falloff
if (fCosFalloffAngle < fCosHotspotAngle) if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 - Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosViewAngle) /
@@ -1102,20 +1143,21 @@ void TSubModel::RenderDL()
glColor3f(f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, glColor3f(f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm,
f4Diffuse[2] * Distdimm); f4Diffuse[2] * Distdimm);
/* TODO: poprawic to zeby dzialalo /* TODO: poprawic to zeby dzialalo
if (iFarAttenDecay>0) if (iFarAttenDecay>0)
switch (iFarAttenDecay) switch (iFarAttenDecay)
{ {
case 1: case 1:
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
kata //dorobic od kata
break; break;
case 2: case 2:
Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata Distdimm=fFarDecayRadius/(1+fSquareDist);
break; //dorobic od kata
} break;
if (Distdimm>1) }
Distdimm=1; if (Distdimm>1)
glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm); Distdimm=1;
glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm);
*/ */
// glPopMatrix(); // glPopMatrix();
// return; // return;
@@ -1124,7 +1166,8 @@ void TSubModel::RenderDL()
} }
else if (eType == TP_STARS) 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) if (Global::fLuminance < fLight)
{ {
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
@@ -1184,12 +1227,14 @@ void TSubModel::RenderAlphaDL()
} }
if (Child != NULL) if (Child != NULL)
if (eType == TP_TEXT) 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(); int i, j = pasText->Length();
TSubModel *p; TSubModel *p;
char c; char c;
if (!smLetter) 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æ // mo¿e byæ
smLetter = new TSubModel *[256]; // tablica wskaŸników submodeli dla smLetter = new TSubModel *[256]; // tablica wskaŸników submodeli dla
// wyœwietlania tekstu // wyœwietlania tekstu
@@ -1248,7 +1293,8 @@ void TSubModel::RenderVBO()
else else
glBindTexture(GL_TEXTURE_2D, TextureID); // równie¿ 0 glBindTexture(GL_TEXTURE_2D, TextureID); // równie¿ 0
glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub 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) if (Global::fLuminance < fLight)
{ {
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo 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 if (fCosViewAngle > fCosFalloffAngle) // k¹t wiêkszy ni¿ maksymalny sto¿ek swiat³a
{ {
double Distdimm = 1.0; double Distdimm = 1.0;
if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a if (fCosViewAngle <
// Falloff fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a Falloff
if (fCosFalloffAngle < fCosHotspotAngle) if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 - Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosViewAngle) /
@@ -1280,30 +1326,36 @@ void TSubModel::RenderVBO()
/* TODO: poprawic to zeby dzialalo /* TODO: poprawic to zeby dzialalo
2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where R0 is 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where
the radial source of the light if no attenuation is used, or the Near End R0 is
value of the light if Attenuation is used. R is the radial distance of the the radial source of the light if no attenuation is
illuminated surface from R0.) 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. 3- Inverse Square (Applies inverse-square decay. The formula for this is
This is actually the "real-world" decay of light, but you might find it too dim (R0/R)^2.
in the world of computer graphics.) 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. <light>.DecayRadius -- The distance over which the decay occurs.
if (iFarAttenDecay>0) if (iFarAttenDecay>0)
switch (iFarAttenDecay) switch (iFarAttenDecay)
{ {
case 1: case 1:
Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist));
kata //dorobic od kata
break; break;
case 2: case 2:
Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata Distdimm=fFarDecayRadius/(1+fSquareDist);
break; //dorobic od kata
} break;
if (Distdimm>1) }
Distdimm=1; if (Distdimm>1)
Distdimm=1;
*/ */
glBindTexture(GL_TEXTURE_2D, 0); // nie teksturowaæ glBindTexture(GL_TEXTURE_2D, 0); // nie teksturowaæ
@@ -1313,10 +1365,12 @@ void TSubModel::RenderVBO()
f4Diffuse[2] * Distdimm, 0}; f4Diffuse[2] * Distdimm, 0};
// glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm);
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
// blendowaly
glColor3fv(color); // inaczej s¹ bia³e glColor3fv(color); // inaczej s¹ bia³e
glMaterialfv(GL_FRONT, GL_EMISSION, color); 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); glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiaæ glColor glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiaæ glColor
glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego s³upy siê œwiec¹ glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego s³upy siê œwiec¹
@@ -1324,16 +1378,21 @@ void TSubModel::RenderVBO()
} }
else if (eType == TP_STARS) 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) 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 pRoot->EndVBO(); // Ra: to te¿ nie jest zbyt ³adne
if (pRoot->StartColorVBO()) 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 glBindTexture(GL_TEXTURE_2D, 0); // tekstury nie ma
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
// glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na kolorowo // blendowaly
// glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na
// kolorowo
glDrawArrays(GL_POINTS, iVboPtr, glDrawArrays(GL_POINTS, iVboPtr,
iNumVerts); // narysuj naraz wszystkie punkty z VBO iNumVerts); // narysuj naraz wszystkie punkty z VBO
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
@@ -1345,9 +1404,9 @@ void TSubModel::RenderVBO()
} }
} }
/*Ra: tu coœ jest bez sensu... /*Ra: tu coœ jest bez sensu...
else else
{ {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
// if (eType==smt_FreeSpotLight) // if (eType==smt_FreeSpotLight)
// { // {
// if (iFarAttenDecay==0) // if (iFarAttenDecay==0)
@@ -1355,18 +1414,20 @@ void TSubModel::RenderVBO()
// } // }
// else // else
//TODO: poprawic zeby dzialalo //TODO: poprawic zeby dzialalo
glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
glColorMaterial(GL_FRONT,GL_EMISSION); glColorMaterial(GL_FRONT,GL_EMISSION);
glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty
//glBegin(GL_POINTS); swiecace sie blendowaly
glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj wierzcho³ek z VBO //glBegin(GL_POINTS);
// glVertex3f(0,0,0); glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj
//glEnd(); wierzcho³ek z VBO
glEnable(GL_LIGHTING); // glVertex3f(0,0,0);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //glEnd();
glMaterialfv(GL_FRONT,GL_EMISSION,emm2); glEnable(GL_LIGHTING);
//glEndList(); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
} glMaterialfv(GL_FRONT,GL_EMISSION,emm2);
//glEndList();
}
*/ */
if (Child != NULL) if (Child != NULL)
if (iAlpha & iFlags & 0x001F0000) if (iAlpha & iFlags & 0x001F0000)
@@ -1459,7 +1520,8 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert)
}; };
void TSubModel::Info() void TSubModel::Info()
{ // zapisanie informacji o submodelu do obiektu pomocniczego { // zapisanie informacji o submodelu do obiektu
// pomocniczego
TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent; TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent;
info->pSubModel = this; info->pSubModel = this;
if (fMatrix && (iFlags & 0x8000)) // ma matrycê i jest ona niejednostkowa 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 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); AnsiString t = AnsiString(pTexture);
if (t.SubString(t.Length() - 3, 4) == ".tga") if (t.SubString(t.Length() - 3, 4) == ".tga")
t.Delete(t.Length() - 3, 4); t.Delete(t.Length() - 3, 4);
@@ -1510,7 +1573,9 @@ void TSubModel::Info()
}; };
void TSubModel::InfoSet(TSubModelInfo *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 int ile = (char *)&uiDisplayList - (char *)&eType; // iloœæ bajtów pomiêdzy tymi zmiennymi
ZeroMemory(this, sizeof(TSubModel)); // zerowaie ca³oœci ZeroMemory(this, sizeof(TSubModel)); // zerowaie ca³oœci
CopyMemory(this, info->pSubModel, ile); // skopiowanie pamiêci 1:1 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); pName = n->String(iName);
AnsiString s = AnsiString(pName); AnsiString s = AnsiString(pName);
if (!s.IsEmpty()) 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 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 iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z
// "Light_Off" // obiektem "Light_Off"
else if (dynamic) // inaczej wy³¹cza³o smugê w latarniach else if (dynamic) // inaczej wy³¹cza³o smugê w latarniach
if (s.SubString(s.Length() - 2, 3) == if (s.SubString(s.Length() - 2, 3) ==
"_on") // jeœli jest kontrolk¹ w stanie zapalonym "_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 else
@@ -1561,7 +1628,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
TextureID = TTexturesManager::GetTextureID(szTexturePath, TextureID = TTexturesManager::GetTextureID(szTexturePath,
Global::asCurrentTexturePath.c_str(), t.c_str()); Global::asCurrentTexturePath.c_str(), t.c_str());
// TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza // 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); // iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10);
// //0x10-nieprzezroczysta, 0x20-przezroczysta // //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!
@@ -1572,12 +1640,15 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
iFlags |= 0x10; // normalnie nieprzezroczyste iFlags |= 0x10; // normalnie nieprzezroczyste
} }
b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu 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; 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() 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) if (fSquareMaxDist > 0.0)
fSquareMaxDist *= Global::fDistanceFactor; fSquareMaxDist *= Global::fDistanceFactor;
if (fSquareMinDist > 0.0) if (fSquareMinDist > 0.0)
@@ -1605,7 +1676,8 @@ void TSubModel::ColorsSet(int *a, int *d, int *s)
}; };
void TSubModel::ParentMatrix(float4x4 *m) void TSubModel::ParentMatrix(float4x4 *m)
{ // pobranie transformacji wzglêdem wstawienia modelu { // 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 // obrót T3D jest wymagany np. do policzenia wysokoœci pantografów
*m = float4x4(*fMatrix); // skopiowanie, bo bêdziemy mno¿yæ *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) // 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; *m = *sm->Parent->GetMatrix() * *m;
sm = sm->Parent; sm = sm->Parent;
} }
// dla ostatniego mo¿e byæ potrzebny dodatkowy obrót, jeœli wczytano z T3D, a nie obrócono // dla ostatniego mo¿e byæ potrzebny dodatkowy obrót, jeœli wczytano z T3D, a
// jeszcze // nie obrócono jeszcze
}; };
float TSubModel::MaxY(const float4x4 &m) 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) if (eType != 4)
return 0; // tylko dla trójk¹tów liczymy return 0; // tylko dla trójk¹tów liczymy
if (iNumVerts < 1) if (iNumVerts < 1)
@@ -1666,7 +1739,8 @@ TModel3d::~TModel3d()
{ {
// SafeDeleteArray(Materials); // SafeDeleteArray(Materials);
if (iFlags & 0x0200) 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 SafeDelete(Root); // submodele siê usun¹ rekurencyjnie
} }
else else
@@ -1686,7 +1760,9 @@ TSubModel *__fastcall TModel3d::AddToNamed(const char *Name, TSubModel *SubModel
}; };
void TModel3d::AddTo(TSubModel *tmp, 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) if (tmp)
{ // jeœli znaleziony, pod³¹czamy mu jako potomny { // jeœli znaleziony, pod³¹czamy mu jako potomny
tmp->ChildAdd(SubModel); tmp->ChildAdd(SubModel);
@@ -1784,13 +1860,13 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic)
break; break;
case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel)
iSubModelsCount = (k - 2) / 64; iSubModelsCount = (k - 2) / 64;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy Root =
// póŸniej (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy póŸniej
break; break;
case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel)
iSubModelsCount = (k - 2) / 80; iSubModelsCount = (k - 2) / 80;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy Root =
// póŸniej (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy póŸniej
for (ch = 1; ch < iSubModelsCount; for (ch = 1; ch < iSubModelsCount;
++ch) // trzeba przesun¹æ bli¿ej, bo 256 wystarczy ++ch) // trzeba przesun¹æ bli¿ej, bo 256 wystarczy
MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256);
@@ -1809,13 +1885,15 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic)
break; break;
case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzcho³ka) case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzcho³ka)
break; 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 Textures.Init((char *)(iModel + i)); //³¹cznie z nag³ówkiem
break; break;
case 'TIX0': // indeks nazw tekstur case 'TIX0': // indeks nazw tekstur
Textures.InitIndex((int *)(iModel + i)); //³¹cznie z nag³ówkiem Textures.InitIndex((int *)(iModel + i)); //³¹cznie z nag³ówkiem
break; 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 Names.Init((char *)(iModel + i)); //³¹cznie z nag³ówkiem
break; break;
case 'NIX0': // indeks nazw submodeli case 'NIX0': // indeks nazw submodeli
@@ -1853,25 +1931,30 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic)
{ {
std::string parent; std::string parent;
// parser.getToken(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; parser >> parent;
if (parent == "") if (parent == "")
break; break;
SubModel = new TSubModel(); SubModel = new TSubModel();
iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic); iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic);
SubModel->Parent = AddToNamed( SubModel->Parent =
parent.c_str(), SubModel); // bêdzie potrzebne do wyliczenia pozycji, np. pantografu AddToNamed(parent.c_str(),
SubModel); // bêdzie potrzebne do wyliczenia pozycji, np. pantografu
// iSubModelsCount++; // iSubModelsCount++;
parser.getToken(token); parser.getToken(token);
} }
// Ra: od wersji 334 przechylany jest ca³y model, a nie tylko pierwszy submodel // Ra: od wersji 334 przechylany jest ca³y model, a nie tylko pierwszy
// ale bujanie kabiny nadal u¿ywa bananów :( od 393 przywrócone, ale z dodatkowym warunkiem // submodel
// ale bujanie kabiny nadal u¿ywa bananów :( od 393 przywrócone, ale z
// dodatkowym warunkiem
if (Global::iConvertModels & 4) if (Global::iConvertModels & 4)
{ // automatyczne banany czasem psu³y przechylanie kabin... { // automatyczne banany czasem psu³y przechylanie kabin...
if (dynamic && Root) if (dynamic && Root)
{ {
if (Root->NextGet()) // jeœli ma jakiekolwiek kolejne 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 = new TSubModel(); // utworzenie pustego
SubModel->ChildAdd(Root); SubModel->ChildAdd(Root);
Root = SubModel; Root = SubModel;
@@ -1883,16 +1966,19 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic)
} }
void TModel3d::Init() 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) if (iFlags & 0x8000)
return; // operacje zosta³y ju¿ wykonane return; // operacje zosta³y ju¿ wykonane
if (Root) if (Root)
{ {
if (iFlags & 0x0200) // jeœli wczytano z pliku tekstowego 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; // TSubModel *p=Root;
// do // 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(); // p=p->NextGet();
//} //}
// while (p->NextGet()) // while (p->NextGet())
@@ -1910,11 +1996,12 @@ void TModel3d::Init()
{ {
if (Global::fDistanceFactor != if (Global::fDistanceFactor !=
1.0) // trochê zaoszczêdzi czasu na modelach z wieloma submocelami 1.0) // trochê zaoszczêdzi czasu na modelach z wieloma submocelami
Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od rozdzielczoœci Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od
// pionowej oraz multisamplingu // rozdzielczoœci pionowej oraz multisamplingu
if (Global::bUseVBO) 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 { // tworzenie tymczasowej tablicy z wierzcho³kami ca³ego modelu
MakeArray(iNumVerts); // tworzenie tablic dla VBO MakeArray(iNumVerts); // tworzenie tablic dla VBO
Root->RaArrayFill(m_pVNT); // wype³nianie tablicy 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(1.0f,1.0f,1.0f);
// glColor3f(0.0f,0.0f,0.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) iAlpha)
{ {
// glColor3f(1.0f,1.0f,1.0f); // glColor3f(1.0f,1.0f,1.0f);
@@ -2100,7 +2189,8 @@ iAlpha)
fSquareDist=SquareMagnitude(pos); fSquareDist=SquareMagnitude(pos);
*/ */
/* /*
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna!
if (StartVBO()) if (StartVBO())
{//odwrócenie flag, aby wy³apaæ nieprzezroczyste {//odwrócenie flag, aby wy³apaæ nieprzezroczyste
Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); 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) iAlpha)
{ {
glPushMatrix(); glPushMatrix();
glTranslatef(pPosition.x,pPosition.y,pPosition.z); glTranslatef(pPosition.x,pPosition.y,pPosition.z);
if (fAngle!=0) if (fAngle!=0)
glRotatef(fAngle,0,1,0); glRotatef(fAngle,0,1,0);
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna!
if (StartVBO()) if (StartVBO())
{Root->ReplacableSet(ReplacableSkinId,iAlpha); {Root->ReplacableSet(ReplacableSkinId,iAlpha);
Root->RaRenderAlpha(); Root->RaRenderAlpha();
@@ -2244,7 +2336,8 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replac
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int TModel3d::TerrainCount() 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; int i = 0;
TSubModel *r = Root; TSubModel *r = Root;
while (r) 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->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->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); // if (vAngle->z!=0.0) glRotated(vAngle->z,0.0,0.0,1.0);
// TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); //zmienna // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition());
// globalna! // //zmienna globalna!
if (StartVBO()) if (StartVBO())
{ // odwrócenie flag, aby wy³apaæ nieprzezroczyste { // odwrócenie flag, aby wy³apaæ nieprzezroczyste
// Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); // Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F);
TSubModel *r = Root; TSubModel *r = Root;
while (r) while (r)
{ {
if (r->iVisible == n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla if (r->iVisible ==
// 0==false) n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla 0==false)
r->RenderVBO(); // sub kolejne (Next) siê nie wyrenderuj¹ r->RenderVBO(); // sub kolejne (Next) siê nie wyrenderuj¹
r = r->NextGet(); r = r->NextGet();
} }

688
Train.cpp

File diff suppressed because it is too large Load Diff

26
Train.h
View File

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