vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CarExecutionUnit.h
Go to the documentation of this file.
1 #ifndef CAR_EXECUTION_UNIT
2 #define CAR_EXECUTION_UNIT
3 
4 #include <vrecko/Ability.h>
5 #include <vrecko/IOPins.h>
6 #include <vrecko/Message.h>
7 #include <osg/MatrixTransform>
8 #include "CarState.h"
9 #include "CCUStructs.h"
10 
11 // typy svetel:
12 #define FRONT_LIGHT 1
13 #define BRAKE_LIGHT 2
14 #define BLINK_LIGHT 3
15 
16 // cas v s od zacatku bliknuti do zacatku pristiho bliknuti blinkeru
17 #define BLINK_LENGTH 1.0
18 
19 namespace CarSim {
20  // zde budou ulozeny ukazatele na transformace svetel
21  struct Lights {
22  osg::MatrixTransform* pFrontLightMT;
23  osg::MatrixTransform* pBrakeLightMT;
24  osg::MatrixTransform* pLeftBlinkerLightMT;
25  osg::MatrixTransform* pRightBlinkerLightMT;
26  };
27 
28  // pro ulozeni cest k souborum s casmi geometrie auta (bude mit vyznam
29  // pouze u negenerovanych aut)
31  std::string carWithoutWheelsPath;
32  std::vector<std::string> leftWheelsPathVec;
33  std::string frontLightsPath;
34  std::string brakeLightsPath;
35  std::string leftBlinkerPath;
36  std::string rightBlinkerPath;
37  };
38 
40  public:
42  // tento konstruktor bude slouzit k nastaveni generovanych aut
43  CarExecutionUnit(const CarSize &carSize,
44  const float maxSpeed,const float minSpeed, const float maxAcc,
45  const float minAcc,const float maxDispWheelAngle,std::vector<osg::MatrixTransform*> *const pWheelsVec,
46  const float wheelR,Lights *const pLights,const osg::Vec3 &carDirection,const osg::Vec3 &carNormal,
47  const osg::Vec3 &carPositionOnRoad,vrecko::EnvironmentObject *const pFutureCarEOownerToSet);
49 
50  void preInitialize(void);
51  void update(void);
52 
53  bool loadXMLParameters(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *pParametersNode);
54  protected:
56  float vPrevious;
57 
58  float maxSpeed;
59  float minSpeed;
60  // maximalni uhel zobrazovaneho zatoceni kol
62 
63  // aby zobrazene natoceni kol melo vetsi setrvacnost a nesekalo se tolik,
64  // budou se zobrazena kola natacet (kolem normaly auta) o uhel,
65  // ktery je vazenym prumerem skutecneho
66  // natoceni kol v tomto snimku a dosavadniho natoceni kol pro zobrazeni;
67  // natoceni kol pro zobrazeni bude mit (0.25/lastFrameLength)*vetsi vahu nez skutecne natoceni kol;
68  // kde t je cas, ktery trval posledni snimek, takze cim pomalejsi
69  // simulace bude, tim mensi bude setrvacnost
70 
71  // jestlize je vetsi nez maxDispWheelAngle, bude maxDispWheelAngle
72  // jestlize je mensi nez -maxDispWheelAngle, bude -maxDispWheelAngle
73  // (velke uhly by nepusobily prirozene);
75 
76  // uhel natoceni kol podle osy normala^smer auta, bude vzdy v rozmezi [0,2PI)
78 
79  // polomer kola, pro jednoduchost bude uvazovat, ze ji budou mit vsechna kola stejnou
80  float wheelR;
81 
82  // v tomto odkazovanem vektoru budou ukazatele na transformace s koly auta
83  // (postupuje se zleva doprava a odpredu dozadu)
84  std::vector<osg::MatrixTransform*> *const pWheelsVec;
85  // matice kol, ktera urcuji jejich pocatecni rozestaveni
86  // (v ramci lokalniho souradneho systemu auta)
87  std::vector<osg::Matrix> wheelsInitMatrixVec;
88 
89  // zde jsou ukazatale na transforamce svetel auta, prvni jsou predni svetla,
90  // pak brzdova svetla a nakonec blinkry - nejdriv levy, pak pravy
91  Lights *const pLights;
92 
93  // stavy svetel
94  unsigned int frontLightState;
95  unsigned int brakeLightState;
96 
97  // faze blinkeru;
98  // uplynuly cas od zacatku posledniho bliknuti blinkru;
99  // jestlize jsou blinkry ve stavu LIGHT_TURNED_OFF, muze obsahovat
100  // hodnotu z drivejsi doby, kdy byl jeste nejaky blinkr zapnuty
102 
103  // zda vzniklo auto pomoci generatoru
104  const bool isGenCar;
105 
106  // zde budou ulozeny cesty k souborum s castmi geometrie auta (bude mit
107  // vyznam jen u negenerovanych aut)
109 
110  // pozice levych kol relativne vzhledem ke stredu auta (odpredu dozadu,
111  // ma vyznam pouze u generovanych aut)
112  std::vector<osg::Vec3> *const pLeftWheelsPosVec;
113 
114  // tato metoda otestuje korektnost vstupnich parametru
115  // z XML souboru
116  void checkXMLparameters();
117 
118  // metoda nastavi smer auta, natoci podle nej EO auta a urci docasnou
119  // normalu auta (metoda pocita s tim, ze pocatecni spravna normala
120  // jeste nebyla urcena)
121  void initDirection(const osg::Vec3 &dir);
122 
123  // metoda nastavi normalu auta, natoci podle ni EO auta
124  // (metoda pocita s tim, ze pocatecni smer auta uz byl urcen)
125  void initNormal(const osg::Vec3 &normal);
126 
127  // vypocita novy stav auta (aktualizuje hodnoty v carState a hodnoty
128  // s tim spojene)
129  void computeCarState(const float lastFrameLength);
130 
131  // metoda prepne svetlo (predni, brzdove nebo blinkry) do pozadovaneho stavu
132  void switchLight(const unsigned int lightType,const unsigned int lightState);
133 
134  // metoda, ktera zjisti, v jake fazi se nachazi zapnuty blinkr (levy nebo pravy
135  // nebo oboje); jestlize ma nejaky blinkr svitit a doposud byl zhasnuty,
136  // rozsviti ho a naopak jestlize ma byt nejaky blinkr zhasnuty a doposud svitil,
137  // zhasne ho; blinkry by nemely byt ve stavu LIGHT_TURNED_OFF, sice metoda nic
138  // zavazneho neudela, ale neni to prilis optimalni;
139  // faze blinkeru jsou dve - zapnuto (timeFromLastBlinkStart in [0,0.5*BLINK_LENGTH],
140  // vypnuto (timeFromLastBlinkStart in (0.5*BLINK_LENGTH,BLINK_LENGTH) )
141  void blink(const float lastFrameLength);
142 
143  // jestlize auto nevzniklo generovanim, nacte tato metoda geometrie casti auta
144  // ze souboru (auto bez kol, kolo, svetla)
145  void loadGeometryParts();
146 
147 
148  DECLARE_INPUT(InAcc, vrecko::MessageFloat);
149  DECLARE_INPUT(InWheelAngle, vrecko::MessageFloat);
151  DECLARE_INPUT(InUpdate, vrecko::MessageFloat);
152  DECLARE_INPUT(InInitNormal, vrecko::MessageVec3);
153  DECLARE_INPUT(InInitDirection, vrecko::MessageVec3);
154  DECLARE_INPUT(InInitPosition, vrecko::MessageVec3);
155  DECLARE_INPUT(InSetCarNormal, vrecko::MessageVec3);
156  DECLARE_INPUT(InPushCarInNormalDir, vrecko::MessageFloat);
157  DECLARE_INPUT(InPushCarInDirectionCrossNormalDir, vrecko::MessageFloat);
158  DECLARE_INPUT(InSetBlinker, vrecko::MessageUnsignedInt);
161 
162 
164  DECLARE_REQUEST_INPUT(InGetCarLength, vrecko::MessageVoid, vrecko::MessageFloat);
165 
166  };
167 
168 }
169 
170 #endif
171 
172 
173