mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
218 lines
5.6 KiB
C++
218 lines
5.6 KiB
C++
//---------------------------------------------------------------------------
|
|
|
|
/*
|
|
MaSzyna EU07 locomotive simulator
|
|
Copyright (C) 2001-2004 Marcin Wozniak
|
|
|
|
*/
|
|
|
|
#include "system.hpp"
|
|
#include "classes.hpp"
|
|
#pragma hdrstop
|
|
|
|
#include "Timer.h"
|
|
#include "QueryParserComp.hpp"
|
|
#include "Model3d.h"
|
|
#include "Gauge.h"
|
|
#include "Console.h"
|
|
|
|
__fastcall TGauge::TGauge()
|
|
{
|
|
eType=gt_Unknown;
|
|
fFriction=0.0;
|
|
fDesiredValue=0.0;
|
|
fValue=0.0;
|
|
fOffset=0.0;
|
|
fScale=1.0;
|
|
fStepSize=5;
|
|
//iChannel=-1; //kana³ analogowej komunikacji zwrotnej
|
|
SubModel=NULL;
|
|
};
|
|
|
|
__fastcall TGauge::~TGauge()
|
|
{
|
|
};
|
|
|
|
void __fastcall TGauge::Clear()
|
|
{
|
|
SubModel=NULL;
|
|
eType=gt_Unknown;
|
|
fValue=0;
|
|
fDesiredValue=0;
|
|
};
|
|
|
|
void __fastcall TGauge::Init(TSubModel *NewSubModel,TGaugeType eNewType,double fNewScale,double fNewOffset,double fNewFriction,double fNewValue)
|
|
{//ustawienie parametrów animacji submodelu
|
|
if (NewSubModel)
|
|
{//warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³
|
|
fFriction=fNewFriction;
|
|
fValue=fNewValue;
|
|
fOffset=fNewOffset;
|
|
fScale=fNewScale;
|
|
SubModel=NewSubModel;
|
|
eType=eNewType;
|
|
if (eType==gt_Digital)
|
|
{
|
|
TSubModel *sm=SubModel->ChildGet();
|
|
do
|
|
{//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')
|
|
sm->WillBeAnimated(); //wy³¹czenie optymalizacji
|
|
}
|
|
sm=sm->NextGet();
|
|
} while (sm);
|
|
}
|
|
else //a banan mo¿e byæ z optymalizacj¹?
|
|
NewSubModel->WillBeAnimated(); //wy³¹czenie ignowania jedynkowego transformu
|
|
}
|
|
};
|
|
|
|
bool __fastcall TGauge::Load(TQueryParserComp *Parser,TModel3d *md1,TModel3d *md2,double mul)
|
|
{
|
|
AnsiString str1=Parser->GetNextSymbol();
|
|
AnsiString str2=Parser->GetNextSymbol().LowerCase();
|
|
double val3=Parser->GetNextSymbol().ToDouble()*mul;
|
|
double val4=Parser->GetNextSymbol().ToDouble();
|
|
double val5=Parser->GetNextSymbol().ToDouble();
|
|
TSubModel *sm=md1->GetFromName(str1.c_str());
|
|
if (sm) //jeœli nie znaleziony
|
|
md2=NULL; //informacja, ¿e znaleziony
|
|
else
|
|
if (md2) //a jest podany drugi model (np. zewnêtrzny)
|
|
sm=md2->GetFromName(str1.c_str()); //to mo¿e tam bêdzie, co za ró¿nica gdzie
|
|
if (str2=="mov")
|
|
Init(sm,gt_Move,val3,val4,val5);
|
|
else if (str2=="wip")
|
|
Init(sm,gt_Wiper,val3,val4,val5);
|
|
else if (str2=="dgt")
|
|
Init(sm,gt_Digital,val3,val4,val5);
|
|
else
|
|
Init(sm,gt_Rotate,val3,val4,val5);
|
|
return (md2); //true, gdy podany model zewnêtrzny, a w kabinie nie by³o
|
|
};
|
|
|
|
|
|
void __fastcall TGauge::PermIncValue(double fNewDesired)
|
|
{
|
|
fDesiredValue=fDesiredValue+fNewDesired*fScale+fOffset;
|
|
if (fDesiredValue-fOffset>360/fScale)
|
|
{
|
|
fDesiredValue=fDesiredValue-(360/fScale);
|
|
fValue=fValue-(360/fScale);
|
|
}
|
|
};
|
|
|
|
void __fastcall TGauge::IncValue(double fNewDesired)
|
|
{//u¿ywane tylko dla uniwersali
|
|
fDesiredValue=fDesiredValue+fNewDesired*fScale+fOffset;
|
|
if (fDesiredValue>fScale+fOffset)
|
|
fDesiredValue=fScale+fOffset;
|
|
};
|
|
|
|
void __fastcall TGauge::DecValue(double fNewDesired)
|
|
{//u¿ywane tylko dla uniwersali
|
|
fDesiredValue=fDesiredValue-fNewDesired*fScale+fOffset;
|
|
if (fDesiredValue<0) fDesiredValue=0;
|
|
};
|
|
|
|
void __fastcall TGauge::UpdateValue(double fNewDesired)
|
|
{//ustawienie wartoœci docelowej
|
|
fDesiredValue=fNewDesired*fScale+fOffset;
|
|
};
|
|
|
|
void __fastcall TGauge::PutValue(double fNewDesired)
|
|
{//McZapkie-281102: natychmiastowe wpisanie wartosci
|
|
fDesiredValue=fNewDesired*fScale+fOffset;
|
|
fValue=fDesiredValue;
|
|
};
|
|
|
|
void __fastcall TGauge::Update()
|
|
{
|
|
float dt=Timer::GetDeltaTime();
|
|
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³
|
|
TSubModel *sm;
|
|
switch (eType)
|
|
{
|
|
case gt_Rotate:
|
|
SubModel->SetRotate(float3(0,1,0),fValue*360.0);
|
|
break;
|
|
case gt_Move:
|
|
SubModel->SetTranslate(float3(0,0,fValue));
|
|
break;
|
|
case gt_Wiper:
|
|
SubModel->SetRotate(float3(0,1,0),fValue*360.0);
|
|
sm=SubModel->ChildGet();
|
|
if (sm)
|
|
{sm->SetRotate(float3(0,1,0),fValue*360.0);
|
|
sm=sm->ChildGet();
|
|
if (sm)
|
|
sm->SetRotate(float3(0,1,0),fValue*360.0);
|
|
}
|
|
break;
|
|
case gt_Digital: //Ra 2014-07: licznik cyfrowy
|
|
sm=SubModel->ChildGet();
|
|
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)
|
|
if (sm->pName)
|
|
{//musi mieæ niepust¹ nazwê
|
|
if ((*sm->pName)>='0')
|
|
if ((*sm->pName)<='9')
|
|
sm->SetRotate(float3(0,1,0),-36.0*(n['0'+10-(*sm->pName)]-'0'));
|
|
}
|
|
sm=sm->NextGet();
|
|
} while (sm);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
void __fastcall TGauge::Render()
|
|
{
|
|
};
|
|
|
|
void __fastcall TGauge::AssignFloat(float* fValue)
|
|
{
|
|
cDataType='f';
|
|
fData=fValue;
|
|
};
|
|
void __fastcall TGauge::AssignDouble(double* dValue)
|
|
{
|
|
cDataType='d';
|
|
dData=dValue;
|
|
};
|
|
void __fastcall TGauge::AssignInt(int* iValue)
|
|
{
|
|
cDataType='i';
|
|
iData=iValue;
|
|
};
|
|
void __fastcall TGauge::UpdateValue()
|
|
{//ustawienie wartoœci docelowej z parametru
|
|
switch (cDataType)
|
|
{//to nie jest zbyt optymalne, mo¿na by zrobiæ osobne funkcje
|
|
case 'f':
|
|
fDesiredValue=(*fData)*fScale+fOffset;
|
|
break;
|
|
case 'd':
|
|
fDesiredValue=(*dData)*fScale+fOffset;
|
|
break;
|
|
case 'i':
|
|
fDesiredValue=(*iData)*fScale+fOffset;
|
|
break;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
#pragma package(smart_init)
|