Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 10498 was 10498, checked in by bknecht, 17 years ago

use pauseCamera in scripts to pause the track of the camera. this works also with pause on NPCs and spaceships with tracks

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}
75
76/**
77 *  standard destructor
78*/
79Track::~Track()
80{
81
82}
83
84
85void Track::loadParams(const TiXmlElement* root)
86{
87     LOAD_PARAM_START_CYCLE(root, element);
88     {
89           LoadParam_CYCLE(element, "addPoint", this, Track, addPoint)
90             .describe("Adds a new Point to the currently selected TrackElement");
91           LoadParam_CYCLE(element, "speed", this, Track, setSpeed)
92             .describe("Sets speed of traveling");
93           LoadParam_CYCLE(element, "mode", this, Track, setMode)
94             .describe("Sets mode of track behavior");
95     }
96     LOAD_PARAM_END_CYCLE(element);
97}
98
99
100
101/**
102 * This function adds a point with its coordinates to the track
103 * @param x
104 * @param y
105 * @param z
106 */
107void Track::addPoint(float x, float y, float z)
108{
109     this->addPointV(Vector (x,y,z));
110}
111
112
113/**
114 * This function adds a point to the track as a vector
115 * @param newPoint
116 */
117void Track::addPointV(Vector newPoint)
118{
119   this->curve->addNode(newPoint);
120   if( this->nodeCount == 0) this->trackNode->setAbsCoor(newPoint);
121   this->nodeCount++;
122   // PRINTF(0)("Point added to curve\n");
123}
124
125/**
126 * This function sets the speed of the trackNode by altering the duration
127 * of the time the trackNode travels on the whole track. This is bad because
128 * the speed depends on the length of the curve. (by getting the curve's length
129 * this function will make a lot more sense)
130 */
131void Track::setSpeed(float speed)
132{
133     this->duration = this->duration/speed;
134     this->speed = speed;
135}
136
137/**
138 * Sets the mode of the track. 0 means wait at the end. 1 means rerun track
139 */
140void Track::setMode(int newMode)
141{
142     this->mode = newMode;
143}
144
145/**
146 * Sets the bool if the track runs (false) or not (true)
147 */
148void Track::pauseTrack(bool stop)
149{
150     this->pause = stop;
151}
152
153
154/**
155 * We probably doesn't even need this
156 */
157//void Track::finalize()
158//{
159//   for (int i = 1; i<= trackElemCount ;i++)
160//     {
161//       TrackElement* tmpElem = this->firstTrackElem->findByID(i);
162//       if( tmpElem->childCount > 0)
163//         {
164//           tIterator<TrackElement>* iterator = tmpElem->children->getIterator();
165//           TrackElement* enumElem = iterator->firstElement();
166//           //TrackElement* enumElem = tmpElem->children->enumerate();
167//           while (enumElem)
168//             {
169//
170//               // c1-continuity
171//               enumElem->curve->addNode(enumElem->curve->getNode(0) +
172//                                                    ((enumElem->curve->getNode(0) -
173//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1))
174//                                                     ),2);
175//               enumElem->nodeCount++;
176//               // c2-continuity
177//               enumElem->curve->addNode((tmpElem->curve->getNode(tmpElem->curve->getNodeCount())-
178//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1)) * 4 +
179//                                                    tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-2), 3);
180//               enumElem->nodeCount++;
181//               PRINTF(5)("accelerations: %d-in: count: %d, %f, %f, %f\n                  %d-out: count: %d %f, %f, %f\n",
182//                      tmpElem->ID, tmpElem->nodeCount,
183//                      tmpElem->curve->calcAcc(0.999).x, tmpElem->curve->calcAcc(0.999).y, tmpElem->curve->calcAcc(0.999).z,
184//                      enumElem->ID, enumElem->nodeCount,
185//                      enumElem->curve->calcAcc(0).x, enumElem->curve->calcAcc(0).y, enumElem->curve->calcAcc(0).z);
186//
187//               enumElem = iterator->nextElement();
188//             }
189//           delete iterator;
190//         }
191//     }
192
193
194
195  /*for (int i = 1; i <= trackElemCount;i++)
196    if (this->firstTrackElem->findByID(i)->endTime > this->maxTime)
197      this->maxTime = this->firstTrackElem->findByID(i)->endTime; // very bad implemented :/
198      */
199//}
200
201Vector Track::calcPos() const
202{
203  return this->curve->calcPos(this->localTime/this->duration);
204}
205
206Vector Track::calcDir() const
207{
208  return this->curve->calcDir(this->localTime/this->duration);
209}
210
211void Track::tick(float dt)
212{
213//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
214//   if (this->localTime <= this->firstTrackElem->duration)
215//     this->jumpTo(this->localTime);
216//   if (this->localTime <= this->maxTime)
217
218
219//   if (this->localTime > this->currentTrackElem->endTime
220//       && this->currentTrackElem->children)
221//     {
222//       if (this->currentTrackElem->jumpTime != 0.0)
223//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
224//       // jump to the next TrackElement and also set the history of the new Element to the old one.
225//       TrackElement* tmpHistoryElem = this->currentTrackElem;
226//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
227//       this->currentTrackElem->history = tmpHistoryElem;
228//       if (this->currentTrackElem->getName())
229//         {
230//           this->trackText->setText(this->currentTrackElem->getName());
231//           this->textAnimation->replay();
232//         }
233//     }
234   if (this->trackNode)
235     {
236       // tmp save
237        float oldTime = this->localTime;
238
239        if(this->mode == 0)
240        {
241              if(this->localTime < this->duration)
242                this->localTime += dt;
243        }
244        else
245        {
246            this->localTime += dt;
247            if(this->localTime >= this->duration)
248                this->localTime = 0;
249        }
250
251       Vector tmp = this->calcPos();
252
253
254       Vector dV = tmp - this->trackNode->getAbsCoor();
255       float dx = speed * dt;
256       float ratio = dx / dV.len();
257
258       if( dt > 0.0f)
259       {
260          float newDt = dt * ratio;
261          if(this->pause)
262            newDt = 0;
263          this->localTime = oldTime += newDt;
264       }
265       tmp = this->calcPos();
266
267       Vector v(0.0, 1.0, 0.0);
268       Quaternion quat = Quaternion(this->calcDir(), v);
269       Quaternion q(-PI/2, v);
270       quat = quat * q;
271
272       // move trackNode of the track
273       this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
274       // set direction and roll angle of trackNode
275       this->trackNode->setAbsDir(quat);
276     }
277}
278
279/**
280 * @returns the main TrackNode
281*/
282PNode* Track::getTrackNode()
283{
284  return this->trackNode;
285}
286
287/**
288 *  Imports a model of the Graph into the OpenGL-environment.
289 * @param dt The Iterator used in seconds for Painting the Graph.
290
291   This is for testing facility only. Do this if you want to see the Path inside the Level.
292   eventually this will all be packed into a gl-list.
293*/
294void Track::drawGraph(float dt) const
295{
296    glMatrixMode(GL_MODELVIEW);
297    glPushMatrix();
298
299    glPushAttrib(GL_ENABLE_BIT);
300
301    glDisable(GL_LIGHTING);
302    glDisable(GL_TEXTURE_2D);
303    glDisable(GL_BLEND);
304    glLineWidth(2.0);
305
306
307
308    PNode* node = PNode::getNullParent();
309    glTranslatef (node->getAbsCoor ().x,
310                  node->getAbsCoor ().y,
311                  node->getAbsCoor ().z);
312    Vector tmpRot = node->getAbsDir().getSpacialAxis();
313    glRotatef (node->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
314
315
316      glBegin(GL_LINE_STRIP);
317        glColor3f(1.0, 1.0, 0.6);
318
319        Vector tmpVector;
320        for(float f = 0.0; f < 1.0; f+=dt)
321          {
322            //PRINTF(0)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
323            tmpVector = this->curve->calcPos(f);
324            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
325          }
326      glEnd();
327
328      glPopAttrib();
329
330    glPopMatrix();
331}
Note: See TracBrowser for help on using the repository browser.