Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

you're now able to set the track's mode

File size: 8.4 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");
[10088]95
[10085]96     }
97     LOAD_PARAM_END_CYCLE(element);
98}
99
[10088]100
101
102/**
[10096]103 * This function adds a point with its coordinates to the track
[10088]104 * @param x
105 * @param y
106 * @param z
107 */
[10085]108void Track::addPoint(float x, float y, float z)
109{
[10284]110     this->addPointV(Vector (x,y,z));
[10085]111}
112
[10088]113
114/**
[10096]115 * This function adds a point to the track as a vector
[10088]116 * @param newPoint
117 */
[10284]118void Track::addPointV(Vector newPoint)
[10085]119{
[10091]120   this->curve->addNode(newPoint);
[10284]121   if( this->nodeCount == 0) this->trackNode->setAbsCoor(newPoint);
[10091]122   this->nodeCount++;
[10297]123   // PRINTF(0)("Point added to curve\n");
[10085]124}
125
[10088]126/**
[10297]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     
136}
137
138/**
[10385]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/**
[10096]147 * We probably doesn't even need this
[10088]148 */
[10284]149//void Track::finalize()
150//{
[10088]151//   for (int i = 1; i<= trackElemCount ;i++)
152//     {
153//       TrackElement* tmpElem = this->firstTrackElem->findByID(i);
154//       if( tmpElem->childCount > 0)
155//         {
156//           tIterator<TrackElement>* iterator = tmpElem->children->getIterator();
157//           TrackElement* enumElem = iterator->firstElement();
158//           //TrackElement* enumElem = tmpElem->children->enumerate();
159//           while (enumElem)
160//             {
161//
162//               // c1-continuity
163//               enumElem->curve->addNode(enumElem->curve->getNode(0) +
164//                                                    ((enumElem->curve->getNode(0) -
165//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1))
166//                                                     ),2);
167//               enumElem->nodeCount++;
168//               // c2-continuity
169//               enumElem->curve->addNode((tmpElem->curve->getNode(tmpElem->curve->getNodeCount())-
170//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1)) * 4 +
171//                                                    tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-2), 3);
172//               enumElem->nodeCount++;
173//               PRINTF(5)("accelerations: %d-in: count: %d, %f, %f, %f\n                  %d-out: count: %d %f, %f, %f\n",
174//                      tmpElem->ID, tmpElem->nodeCount,
175//                      tmpElem->curve->calcAcc(0.999).x, tmpElem->curve->calcAcc(0.999).y, tmpElem->curve->calcAcc(0.999).z,
176//                      enumElem->ID, enumElem->nodeCount,
177//                      enumElem->curve->calcAcc(0).x, enumElem->curve->calcAcc(0).y, enumElem->curve->calcAcc(0).z);
178//
179//               enumElem = iterator->nextElement();
180//             }
181//           delete iterator;
182//         }
183//     }
[10085]184
185
[10088]186
[10085]187  /*for (int i = 1; i <= trackElemCount;i++)
188    if (this->firstTrackElem->findByID(i)->endTime > this->maxTime)
189      this->maxTime = this->firstTrackElem->findByID(i)->endTime; // very bad implemented :/
190      */
[10284]191//}
[10085]192
[10091]193Vector Track::calcPos() const
[10085]194{
[10096]195  return this->curve->calcPos(this->localTime/this->duration);
[10085]196}
197
[10091]198Vector Track::calcDir() const
[10085]199{
[10096]200  return this->curve->calcDir(this->localTime/this->duration);
[10085]201}
202
203void Track::tick(float dt)
204{
[10088]205//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
206//   if (this->localTime <= this->firstTrackElem->duration)
207//     this->jumpTo(this->localTime);
208//   if (this->localTime <= this->maxTime)
[10385]209     if(this->mode == 0)
210     {
211          if(this->localTime >= this->duration)
212             this->localTime += dt;
213     }
214     else
215     {
216         this->localTime += dt;
217         if(this->localTime >= this->duration)
218            this->localTime = 0;
219     }
220     
[10088]221//   if (this->localTime > this->currentTrackElem->endTime
222//       && this->currentTrackElem->children)
223//     {
224//       if (this->currentTrackElem->jumpTime != 0.0)
225//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
226//       // jump to the next TrackElement and also set the history of the new Element to the old one.
227//       TrackElement* tmpHistoryElem = this->currentTrackElem;
228//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
229//       this->currentTrackElem->history = tmpHistoryElem;
230//       if (this->currentTrackElem->getName())
231//         {
232//           this->trackText->setText(this->currentTrackElem->getName());
233//           this->textAnimation->replay();
234//         }
235//     }
[10096]236   if (this->trackNode)
237     {
238       Vector tmp = this->calcPos();
[10209]239       //Quaternion quat = Quaternion(this->calcDir(), Vector(this->curve->calcAcc(this->localTime/this->duration).x,1,this->curve->calcAcc(this->localTime/this->duration).z));
[10335]240       
[10096]241
242       Vector v(0.0, 1.0, 0.0);
[10335]243       Quaternion quat = Quaternion(this->calcDir(), v);
[10096]244       Quaternion q(-PI/2, v);
245       quat = quat * q;
246
247       // move trackNode of the track
[10284]248       this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
[10096]249       // set direction and roll angle of trackNode
[10297]250       this->trackNode->setAbsDir(quat);
[10096]251     }
[10085]252}
253
254/**
255 * @returns the main TrackNode
256*/
[10091]257PNode* Track::getTrackNode()
[10085]258{
259  return this->trackNode;
260}
[10284]261
262/**
263 *  Imports a model of the Graph into the OpenGL-environment.
264 * @param dt The Iterator used in seconds for Painting the Graph.
265
266   This is for testing facility only. Do this if you want to see the Path inside the Level.
267   eventually this will all be packed into a gl-list.
268*/
[10297]269/*void Track::drawGraph(float dt) const
[10284]270{
271      glBegin(GL_LINE_STRIP);
272        for(float f = 0.0; f < 1.0; f+=dt)
273          {
274            // PRINTF(4)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
275            Vector tmpVector = this->curve->calcPos(f);
276            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
277          }
278      glEnd();
[10297]279}*/
Note: See TracBrowser for help on using the repository browser.