Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 10460 was 10454, checked in by patrick, 18 years ago

track now got constant speed

File size: 9.2 KB
RevLine 
[10084]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.
[10088]15
[10084]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.
[10088]19
[10084]20   As we do this we have exactly the verticalscroller feeling we want.
[10088]21
[10084]22   main-programmer: Benjamin Knecht
23*/
24
[10085]25#include "util/loading/load_param.h"
[10088]26#include "track/track.h"
[10085]27
[10088]28#include "p_node.h"
[10085]29
[10284]30#include "stdincl.h"
31
[10088]32#include "debug.h"
33
[10085]34ObjectListDefinition(Track);
[10088]35// CREATE_FACTORY(Track);
[10085]36
[10088]37
[10084]38/**
39 *  standard constructor
40*/
41Track::Track()
42{
[10088]43  this->init();
[10084]44}
[10085]45
[10088]46
[10085]47/**
[10088]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();
[10097]54
55  if (root != NULL)
56    this->loadParams(root);
[10088]57}
58
59
60/**
61 * initializes this class
62 */
63void Track::init()
64{
65  this->curveType = CURVE_BEZIER;
[10096]66//  this->startingTime = 0;
[10297]67  this->duration = 20;
68  this->endTime = 20;
[10091]69  this->width = 10;
70  this->curve = new BezierCurve();
[10088]71  this->trackNode = new PNode(PNode::getNullParent(), PNODE_ALL);
[10284]72  this->nodeCount = 0;
[10335]73  this->localTime = 0;
[10088]74}
75
76/**
[10085]77 *  standard destructor
78*/
79Track::~Track()
80{
[10091]81
[10085]82}
83
[10088]84
[10085]85void Track::loadParams(const TiXmlElement* root)
86{
87     LOAD_PARAM_START_CYCLE(root, element);
88     {
[10284]89           LoadParam_CYCLE(element, "addPoint", this, Track, addPoint)
[10085]90             .describe("Adds a new Point to the currently selected TrackElement");
[10297]91           LoadParam_CYCLE(element, "speed", this, Track, setSpeed)
92             .describe("Sets speed of traveling");
[10385]93           LoadParam_CYCLE(element, "mode", this, Track, setMode)
94             .describe("Sets mode of track behavior");
[10085]95     }
96     LOAD_PARAM_END_CYCLE(element);
97}
98
[10088]99
100
101/**
[10096]102 * This function adds a point with its coordinates to the track
[10088]103 * @param x
104 * @param y
105 * @param z
106 */
[10085]107void Track::addPoint(float x, float y, float z)
108{
[10284]109     this->addPointV(Vector (x,y,z));
[10085]110}
111
[10088]112
113/**
[10096]114 * This function adds a point to the track as a vector
[10088]115 * @param newPoint
116 */
[10284]117void Track::addPointV(Vector newPoint)
[10085]118{
[10091]119   this->curve->addNode(newPoint);
[10284]120   if( this->nodeCount == 0) this->trackNode->setAbsCoor(newPoint);
[10091]121   this->nodeCount++;
[10297]122   // PRINTF(0)("Point added to curve\n");
[10085]123}
124
[10088]125/**
[10297]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;
[10454]134     this->speed = speed;
[10297]135}
136
137/**
[10385]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/**
[10096]146 * We probably doesn't even need this
[10088]147 */
[10284]148//void Track::finalize()
149//{
[10088]150//   for (int i = 1; i<= trackElemCount ;i++)
151//     {
152//       TrackElement* tmpElem = this->firstTrackElem->findByID(i);
153//       if( tmpElem->childCount > 0)
154//         {
155//           tIterator<TrackElement>* iterator = tmpElem->children->getIterator();
156//           TrackElement* enumElem = iterator->firstElement();
157//           //TrackElement* enumElem = tmpElem->children->enumerate();
158//           while (enumElem)
159//             {
160//
161//               // c1-continuity
162//               enumElem->curve->addNode(enumElem->curve->getNode(0) +
163//                                                    ((enumElem->curve->getNode(0) -
164//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1))
165//                                                     ),2);
166//               enumElem->nodeCount++;
167//               // c2-continuity
168//               enumElem->curve->addNode((tmpElem->curve->getNode(tmpElem->curve->getNodeCount())-
169//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1)) * 4 +
170//                                                    tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-2), 3);
171//               enumElem->nodeCount++;
172//               PRINTF(5)("accelerations: %d-in: count: %d, %f, %f, %f\n                  %d-out: count: %d %f, %f, %f\n",
173//                      tmpElem->ID, tmpElem->nodeCount,
174//                      tmpElem->curve->calcAcc(0.999).x, tmpElem->curve->calcAcc(0.999).y, tmpElem->curve->calcAcc(0.999).z,
175//                      enumElem->ID, enumElem->nodeCount,
176//                      enumElem->curve->calcAcc(0).x, enumElem->curve->calcAcc(0).y, enumElem->curve->calcAcc(0).z);
177//
178//               enumElem = iterator->nextElement();
179//             }
180//           delete iterator;
181//         }
182//     }
[10085]183
184
[10088]185
[10085]186  /*for (int i = 1; i <= trackElemCount;i++)
187    if (this->firstTrackElem->findByID(i)->endTime > this->maxTime)
188      this->maxTime = this->firstTrackElem->findByID(i)->endTime; // very bad implemented :/
189      */
[10284]190//}
[10085]191
[10091]192Vector Track::calcPos() const
[10085]193{
[10096]194  return this->curve->calcPos(this->localTime/this->duration);
[10085]195}
196
[10091]197Vector Track::calcDir() const
[10085]198{
[10096]199  return this->curve->calcDir(this->localTime/this->duration);
[10085]200}
201
202void Track::tick(float dt)
203{
[10088]204//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
205//   if (this->localTime <= this->firstTrackElem->duration)
206//     this->jumpTo(this->localTime);
207//   if (this->localTime <= this->maxTime)
[10410]208
[10454]209
[10088]210//   if (this->localTime > this->currentTrackElem->endTime
211//       && this->currentTrackElem->children)
212//     {
213//       if (this->currentTrackElem->jumpTime != 0.0)
214//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
215//       // jump to the next TrackElement and also set the history of the new Element to the old one.
216//       TrackElement* tmpHistoryElem = this->currentTrackElem;
217//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
218//       this->currentTrackElem->history = tmpHistoryElem;
219//       if (this->currentTrackElem->getName())
220//         {
221//           this->trackText->setText(this->currentTrackElem->getName());
222//           this->textAnimation->replay();
223//         }
224//     }
[10096]225   if (this->trackNode)
226     {
[10454]227       // tmp save
228        float oldTime = this->localTime;
229
230        if(this->mode == 0)
231        {
232              if(this->localTime < this->duration)
233                this->localTime += dt;
234        }
235        else
236        {
237            this->localTime += dt;
238            if(this->localTime >= this->duration)
239                this->localTime = 0;
240        }
241
[10096]242       Vector tmp = this->calcPos();
243
[10410]244
[10454]245       Vector dV = tmp - this->trackNode->getAbsCoor();
246       float dx = speed * dt;
247       float ratio = dx / dV.len();
248
249       if( dt > 0.0f)
250       {
251          float newDt = dt * ratio;
252          this->localTime = oldTime += newDt;
253       }
254       tmp = this->calcPos();
255
[10096]256       Vector v(0.0, 1.0, 0.0);
[10335]257       Quaternion quat = Quaternion(this->calcDir(), v);
[10096]258       Quaternion q(-PI/2, v);
259       quat = quat * q;
260
261       // move trackNode of the track
[10284]262       this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
[10096]263       // set direction and roll angle of trackNode
[10297]264       this->trackNode->setAbsDir(quat);
[10096]265     }
[10085]266}
267
268/**
269 * @returns the main TrackNode
270*/
[10091]271PNode* Track::getTrackNode()
[10085]272{
273  return this->trackNode;
274}
[10284]275
276/**
277 *  Imports a model of the Graph into the OpenGL-environment.
278 * @param dt The Iterator used in seconds for Painting the Graph.
279
280   This is for testing facility only. Do this if you want to see the Path inside the Level.
281   eventually this will all be packed into a gl-list.
282*/
[10410]283void Track::drawGraph(float dt) const
[10284]284{
[10410]285    glMatrixMode(GL_MODELVIEW);
286    glPushMatrix();
287
288    glPushAttrib(GL_ENABLE_BIT);
289
290    glDisable(GL_LIGHTING);
291    glDisable(GL_TEXTURE_2D);
292    glDisable(GL_BLEND);
293    glLineWidth(2.0);
294
295
296
297    PNode* node = PNode::getNullParent();
298    glTranslatef (node->getAbsCoor ().x,
299                  node->getAbsCoor ().y,
300                  node->getAbsCoor ().z);
301    Vector tmpRot = node->getAbsDir().getSpacialAxis();
302    glRotatef (node->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
303
[10412]304
[10284]305      glBegin(GL_LINE_STRIP);
[10410]306        glColor3f(1.0, 1.0, 0.6);
307
[10412]308        Vector tmpVector;
[10284]309        for(float f = 0.0; f < 1.0; f+=dt)
310          {
[10410]311            //PRINTF(0)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
[10412]312            tmpVector = this->curve->calcPos(f);
[10284]313            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
314          }
315      glEnd();
[10410]316
317      glPopAttrib();
318
319    glPopMatrix();
320}
Note: See TracBrowser for help on using the repository browser.