Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/util/track/track.cc @ 10508

Last change on this file since 10508 was 10500, checked in by snellen, 18 years ago

fixed initalisation of pause in track… spaceships arbitrarily refused to go along their track :-)

File size: 9.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2006 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12
13   This is anohter installment of the infamous track system. It serves for
14   temporary use only and is mainly a slimmed version of the old track.
15
16   The track is used to steer the spaceship. In this case the track will have
17   to control a PNode. The spaceship will be able to fly around this node.
18   The camera will always be focused on that point.
19
20   As we do this we have exactly the verticalscroller feeling we want.
21
22   main-programmer: Benjamin Knecht
23*/
24
25#include "util/loading/load_param.h"
26#include "track/track.h"
27
28#include "p_node.h"
29
30#include "stdincl.h"
31
32#include "debug.h"
33
34ObjectListDefinition(Track);
35// CREATE_FACTORY(Track);
36
37
38/**
39 *  standard constructor
40*/
41Track::Track()
42{
43  this->init();
44}
45
46
47/**
48 * this is a constructor for use with the xml loading file
49 * @param root xml root element for this object
50 */
51Track::Track(const TiXmlElement* root)
52{
53  this->init();
54
55  if (root != NULL)
56    this->loadParams(root);
57}
58
59
60/**
61 * initializes this class
62 */
63void Track::init()
64{
65  this->curveType = CURVE_BEZIER;
66//  this->startingTime = 0;
67  this->duration = 20;
68  this->endTime = 20;
69  this->width = 10;
70  this->curve = new BezierCurve();
71  this->trackNode = new PNode(PNode::getNullParent(), PNODE_ALL);
72  this->nodeCount = 0;
73  this->localTime = 0;
74  this->pause = false;
75}
76
77/**
78 *  standard destructor
79*/
80Track::~Track()
81{
82
83}
84
85
86void Track::loadParams(const TiXmlElement* root)
87{
88     LOAD_PARAM_START_CYCLE(root, element);
89     {
90           LoadParam_CYCLE(element, "addPoint", this, Track, addPoint)
91             .describe("Adds a new Point to the currently selected TrackElement");
92           LoadParam_CYCLE(element, "speed", this, Track, setSpeed)
93             .describe("Sets speed of traveling");
94           LoadParam_CYCLE(element, "mode", this, Track, setMode)
95             .describe("Sets mode of track behavior");
96     }
97     LOAD_PARAM_END_CYCLE(element);
98}
99
100
101
102/**
103 * This function adds a point with its coordinates to the track
104 * @param x
105 * @param y
106 * @param z
107 */
108void Track::addPoint(float x, float y, float z)
109{
110     this->addPointV(Vector (x,y,z));
111}
112
113
114/**
115 * This function adds a point to the track as a vector
116 * @param newPoint
117 */
118void Track::addPointV(Vector newPoint)
119{
120   this->curve->addNode(newPoint);
121   if( this->nodeCount == 0) this->trackNode->setAbsCoor(newPoint);
122   this->nodeCount++;
123   // PRINTF(0)("Point added to curve\n");
124}
125
126/**
127 * This function sets the speed of the trackNode by altering the duration
128 * of the time the trackNode travels on the whole track. This is bad because
129 * the speed depends on the length of the curve. (by getting the curve's length
130 * this function will make a lot more sense)
131 */
132void Track::setSpeed(float speed)
133{
134     this->duration = this->duration/speed;
135     this->speed = speed;
136}
137
138/**
139 * Sets the mode of the track. 0 means wait at the end. 1 means rerun track
140 */
141void Track::setMode(int newMode)
142{
143     this->mode = newMode;
144}
145
146/**
147 * Sets the bool if the track runs (false) or not (true)
148 */
149void Track::pauseTrack(bool stop)
150{
151     this->pause = stop;
152}
153
154
155/**
156 * We probably doesn't even need this
157 */
158//void Track::finalize()
159//{
160//   for (int i = 1; i<= trackElemCount ;i++)
161//     {
162//       TrackElement* tmpElem = this->firstTrackElem->findByID(i);
163//       if( tmpElem->childCount > 0)
164//         {
165//           tIterator<TrackElement>* iterator = tmpElem->children->getIterator();
166//           TrackElement* enumElem = iterator->firstElement();
167//           //TrackElement* enumElem = tmpElem->children->enumerate();
168//           while (enumElem)
169//             {
170//
171//               // c1-continuity
172//               enumElem->curve->addNode(enumElem->curve->getNode(0) +
173//                                                    ((enumElem->curve->getNode(0) -
174//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1))
175//                                                     ),2);
176//               enumElem->nodeCount++;
177//               // c2-continuity
178//               enumElem->curve->addNode((tmpElem->curve->getNode(tmpElem->curve->getNodeCount())-
179//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1)) * 4 +
180//                                                    tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-2), 3);
181//               enumElem->nodeCount++;
182//               PRINTF(5)("accelerations: %d-in: count: %d, %f, %f, %f\n                  %d-out: count: %d %f, %f, %f\n",
183//                      tmpElem->ID, tmpElem->nodeCount,
184//                      tmpElem->curve->calcAcc(0.999).x, tmpElem->curve->calcAcc(0.999).y, tmpElem->curve->calcAcc(0.999).z,
185//                      enumElem->ID, enumElem->nodeCount,
186//                      enumElem->curve->calcAcc(0).x, enumElem->curve->calcAcc(0).y, enumElem->curve->calcAcc(0).z);
187//
188//               enumElem = iterator->nextElement();
189//             }
190//           delete iterator;
191//         }
192//     }
193
194
195
196  /*for (int i = 1; i <= trackElemCount;i++)
197    if (this->firstTrackElem->findByID(i)->endTime > this->maxTime)
198      this->maxTime = this->firstTrackElem->findByID(i)->endTime; // very bad implemented :/
199      */
200//}
201
202Vector Track::calcPos() const
203{
204  return this->curve->calcPos(this->localTime/this->duration);
205}
206
207Vector Track::calcDir() const
208{
209  return this->curve->calcDir(this->localTime/this->duration);
210}
211
212void Track::tick(float dt)
213{
214//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
215//   if (this->localTime <= this->firstTrackElem->duration)
216//     this->jumpTo(this->localTime);
217//   if (this->localTime <= this->maxTime)
218
219
220//   if (this->localTime > this->currentTrackElem->endTime
221//       && this->currentTrackElem->children)
222//     {
223//       if (this->currentTrackElem->jumpTime != 0.0)
224//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
225//       // jump to the next TrackElement and also set the history of the new Element to the old one.
226//       TrackElement* tmpHistoryElem = this->currentTrackElem;
227//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
228//       this->currentTrackElem->history = tmpHistoryElem;
229//       if (this->currentTrackElem->getName())
230//         {
231//           this->trackText->setText(this->currentTrackElem->getName());
232//           this->textAnimation->replay();
233//         }
234//     }
235   if (this->trackNode)
236     {
237       // tmp save
238        float oldTime = this->localTime;
239
240        if(this->mode == 0)
241        {
242              if(this->localTime < this->duration)
243                this->localTime += dt;
244        }
245        else
246        {
247            this->localTime += dt;
248            if(this->localTime >= this->duration)
249                this->localTime = 0;
250        }
251
252       Vector tmp = this->calcPos();
253
254
255       Vector dV = tmp - this->trackNode->getAbsCoor();
256       float dx = speed * dt;
257       float ratio = dx / dV.len();
258
259       if( dt > 0.0f)
260       {
261          float newDt = dt * ratio;
262          if(this->pause)
263            newDt = 0;
264          this->localTime = oldTime += newDt;
265       }
266       tmp = this->calcPos();
267
268       Vector v(0.0, 1.0, 0.0);
269       Quaternion quat = Quaternion(this->calcDir(), v);
270       Quaternion q(-PI/2, v);
271       quat = quat * q;
272
273       // move trackNode of the track
274       this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
275       // set direction and roll angle of trackNode
276       this->trackNode->setAbsDir(quat);
277     }
278}
279
280/**
281 * @returns the main TrackNode
282*/
283PNode* Track::getTrackNode()
284{
285  return this->trackNode;
286}
287
288/**
289 *  Imports a model of the Graph into the OpenGL-environment.
290 * @param dt The Iterator used in seconds for Painting the Graph.
291
292   This is for testing facility only. Do this if you want to see the Path inside the Level.
293   eventually this will all be packed into a gl-list.
294*/
295void Track::drawGraph(float dt) const
296{
297    glMatrixMode(GL_MODELVIEW);
298    glPushMatrix();
299
300    glPushAttrib(GL_ENABLE_BIT);
301
302    glDisable(GL_LIGHTING);
303    glDisable(GL_TEXTURE_2D);
304    glDisable(GL_BLEND);
305    glLineWidth(2.0);
306
307
308
309    PNode* node = PNode::getNullParent();
310    glTranslatef (node->getAbsCoor ().x,
311                  node->getAbsCoor ().y,
312                  node->getAbsCoor ().z);
313    Vector tmpRot = node->getAbsDir().getSpacialAxis();
314    glRotatef (node->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
315
316
317      glBegin(GL_LINE_STRIP);
318        glColor3f(1.0, 1.0, 0.6);
319
320        Vector tmpVector;
321        for(float f = 0.0; f < 1.0; f+=dt)
322          {
323            //PRINTF(0)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
324            tmpVector = this->curve->calcPos(f);
325            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
326          }
327      glEnd();
328
329      glPopAttrib();
330
331    glPopMatrix();
332}
Note: See TracBrowser for help on using the repository browser.