Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/util/track/track.cc @ 10525

Last change on this file since 10525 was 10512, checked in by bknecht, 18 years ago

some changes so the vertical scroller will work better

File size: 9.6 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 && !this->pause)
236   {
237       // tmp save
238        float oldTime = this->localTime;
239
240        if(this->mode == 0)
241        {
242              // PRINTF(0)("localTime %f and duration %f", this->localTime, this->duration);
243              if(this->localTime + dt < this->duration)
244                this->localTime += dt;
245        }
246        else
247        {
248            this->localTime += dt;
249            if(this->localTime >= this->duration)
250                this->localTime = 0;
251        }
252
253       if(oldTime != this->localTime)
254       {
255           Vector tmp = this->calcPos();
256   
257   
258           Vector dV = tmp - this->trackNode->getAbsCoor();
259           float dx = speed * dt;
260           float ratio = dx / dV.len();
261   
262           if( dt > 0.0f)
263           {
264              float newDt = dt * ratio;
265              this->localTime = oldTime + newDt;
266           }
267           tmp = this->calcPos();
268   
269           Vector v(0.0, 1.0, 0.0);
270           Quaternion quat = Quaternion(this->calcDir(), v);
271           Quaternion q(-PI/2, v);
272           quat = quat * q;
273   
274           // move trackNode of the track
275           this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
276           // set direction and roll angle of trackNode
277           this->trackNode->setAbsDir(quat);
278       }
279    }
280}
281
282/**
283 * @returns the main TrackNode
284*/
285PNode* Track::getTrackNode()
286{
287  return this->trackNode;
288}
289
290/**
291 *  Imports a model of the Graph into the OpenGL-environment.
292 * @param dt The Iterator used in seconds for Painting the Graph.
293
294   This is for testing facility only. Do this if you want to see the Path inside the Level.
295   eventually this will all be packed into a gl-list.
296*/
297void Track::drawGraph(float dt) const
298{
299    glMatrixMode(GL_MODELVIEW);
300    glPushMatrix();
301
302    glPushAttrib(GL_ENABLE_BIT);
303
304    glDisable(GL_LIGHTING);
305    glDisable(GL_TEXTURE_2D);
306    glDisable(GL_BLEND);
307    glLineWidth(2.0);
308
309
310
311    PNode* node = PNode::getNullParent();
312    glTranslatef (node->getAbsCoor ().x,
313                  node->getAbsCoor ().y,
314                  node->getAbsCoor ().z);
315    Vector tmpRot = node->getAbsDir().getSpacialAxis();
316    glRotatef (node->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
317
318
319      glBegin(GL_LINE_STRIP);
320        glColor3f(1.0, 1.0, 0.6);
321
322        Vector tmpVector;
323        for(float f = 0.0; f < 1.0; f+=dt)
324          {
325            //PRINTF(0)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
326            tmpVector = this->curve->calcPos(f);
327            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
328          }
329      glEnd();
330
331      glPopAttrib();
332
333    glPopMatrix();
334}
Note: See TracBrowser for help on using the repository browser.