| [2068] | 1 |  | 
|---|
 | 2 |  | 
|---|
 | 3 | /*  | 
|---|
 | 4 |    orxonox - the future of 3D-vertical-scrollers | 
|---|
 | 5 |  | 
|---|
 | 6 |    Copyright (C) 2004 orx | 
|---|
 | 7 |  | 
|---|
 | 8 |    This program is free software; you can redistribute it and/or modify | 
|---|
 | 9 |    it under the terms of the GNU General Public License as published by | 
|---|
 | 10 |    the Free Software Foundation; either version 2, or (at your option) | 
|---|
 | 11 |    any later version. | 
|---|
 | 12 |  | 
|---|
 | 13 |    ### File Specific: | 
|---|
| [2080] | 14 |    main-programmer: Christian Meyer | 
|---|
| [3005] | 15 |    co-programmer: ... | 
|---|
| [2068] | 16 | */ | 
|---|
 | 17 |  | 
|---|
 | 18 | #include "track.h" | 
|---|
 | 19 |  | 
|---|
 | 20 | using namespace std; | 
|---|
 | 21 |  | 
|---|
| [2141] | 22 | /** | 
|---|
| [3238] | 23 |    \brief creates a null Track part | 
|---|
| [2141] | 24 | */ | 
|---|
| [2101] | 25 | Track::Track () | 
|---|
 | 26 | { | 
|---|
| [3238] | 27 |   this->ID = 0; | 
|---|
 | 28 |   this->offset = NULL; | 
|---|
 | 29 |   this->end = NULL; | 
|---|
 | 30 |   this->nextID = 0; | 
|---|
| [2101] | 31 | } | 
|---|
 | 32 |  | 
|---|
| [2141] | 33 | /** | 
|---|
| [3238] | 34 |    \brief creates a functional base Track part | 
|---|
 | 35 |    \param number: the ID if this Track part | 
|---|
 | 36 |    \param next: the ID of the next Track part | 
|---|
 | 37 |    \param start: pointer to an anchor point (Vector) representing the offset of this part | 
|---|
 | 38 |    \param finish: pointer to an anchor point (Vector) representing the end of this part | 
|---|
| [2141] | 39 | */ | 
|---|
| [2080] | 40 | Track::Track (Uint32 number, Uint32 next, Vector* start, Vector* finish) | 
|---|
| [2068] | 41 | { | 
|---|
| [3238] | 42 |   this->ID = number; | 
|---|
 | 43 |   this->offset = start; | 
|---|
 | 44 |   this->end = finish; | 
|---|
 | 45 |   this->nextID = next; | 
|---|
| [2068] | 46 | } | 
|---|
 | 47 |  | 
|---|
| [2141] | 48 | /** | 
|---|
| [3238] | 49 |    \brief removes the Track part from memory | 
|---|
| [2141] | 50 | */ | 
|---|
| [2068] | 51 | Track::~Track () | 
|---|
 | 52 | { | 
|---|
 | 53 | } | 
|---|
 | 54 |  | 
|---|
| [2636] | 55 | void Track::init() | 
|---|
 | 56 | { | 
|---|
 | 57 |    | 
|---|
 | 58 | } | 
|---|
 | 59 |  | 
|---|
 | 60 |  | 
|---|
| [2141] | 61 | /** | 
|---|
| [2551] | 62 |    \brief calculate a camera Placement from a "look at"-Location | 
|---|
 | 63 |    \param lookat: the Location the camera should be centered on | 
|---|
 | 64 |    \param camplc: pointer to a buffer where the new camera Placement should be put into | 
|---|
 | 65 |     | 
|---|
 | 66 |    Theoretically you can place the camera wherever you want, but for the sake of  | 
|---|
 | 67 |    common sense I suggest that you at least try to keep the thing that should be looked | 
|---|
 | 68 |    at inside camera boundaries. | 
|---|
| [2141] | 69 | */ | 
|---|
| [3238] | 70 | void Track::mapCamera (Location* lookat, Placement* camplc) | 
|---|
| [2068] | 71 | { | 
|---|
| [2551] | 72 |   Line trace(*offset, *end - *offset); | 
|---|
 | 73 |   float l = trace.len (); | 
|---|
 | 74 |    | 
|---|
 | 75 |   //    camplc->r = *offset + Vector(0,0,0.5); | 
|---|
 | 76 |   //    camplc->w = Quaternion (trace.a, Vector(0,0,1)); | 
|---|
| [3005] | 77 |   float r = (lookat->dist)*PI / l; | 
|---|
| [2551] | 78 |   camplc->r = trace.r + (trace.a * ((lookat->dist-10.0) / l)) + Vector(0,0,5.0); | 
|---|
 | 79 |    | 
|---|
 | 80 |   Vector w(0.0,0.0,0.0); | 
|---|
 | 81 |   w=Vector(0,0,0) - ((trace.r + (trace.a * ((lookat->dist) / l)) - camplc->r)); | 
|---|
 | 82 |   //Vector up(0.0,sin(r),cos(r)); // corrupt... | 
|---|
 | 83 |   Vector up(0.0, 0.0, 1.0); | 
|---|
 | 84 |  | 
|---|
 | 85 |   camplc->w = Quaternion(w, up); | 
|---|
 | 86 |  | 
|---|
 | 87 |   //printf("\n------\nup vector: [%f, %f, %f]\n", up.x, up.y, up.z); | 
|---|
 | 88 |   //printf("direction: [%f, %f, %f]\n", w.x, w.y, w.z); | 
|---|
 | 89 |   //printf("quaternion: w[ %f ], v[ %f, %f, %f ]\n", camplc->w.w, camplc->w.v.x, camplc->w.v.y, camplc->w.v.z); | 
|---|
| [2068] | 90 | } | 
|---|
 | 91 |  | 
|---|
| [2141] | 92 | /** | 
|---|
| [2551] | 93 |    \brief calculate a Placement from a given Location | 
|---|
 | 94 |    \param loc: the Location the entity is in | 
|---|
 | 95 |    \param plc: a pointer to a buffer where the corresponding Placement should be put | 
|---|
 | 96 |    into | 
|---|
 | 97 |    \return: true if track changes - false if track stays | 
|---|
 | 98 |     | 
|---|
 | 99 |    There are no limitations to how you transform a Location into a Placement, but for  | 
|---|
 | 100 |    the sake of placement compatibility between track parts you should make sure that  | 
|---|
 | 101 |    the resulting Placement at dist == 0 is equal to the offset Vector and the Placement | 
|---|
 | 102 |    at dist == len() is equal to the end Vector. Elseway there will be ugly artifacts  | 
|---|
 | 103 |    when transfering between track parts. | 
|---|
| [2141] | 104 | */ | 
|---|
| [3238] | 105 | bool Track::mapCoords (Location* loc, Placement* plc) | 
|---|
| [2068] | 106 | { | 
|---|
| [3238] | 107 |   Line trace(*offset, *end - *offset); | 
|---|
 | 108 |   float l = trace.len (); | 
|---|
 | 109 |    | 
|---|
 | 110 |   /* change to the next track? */ | 
|---|
 | 111 |   if( loc->dist > l) | 
|---|
 | 112 |     { | 
|---|
 | 113 |       loc->dist -= l; | 
|---|
 | 114 |       loc->part = nextID; | 
|---|
 | 115 |       //FIXME: loc->track = this; | 
|---|
 | 116 |       return true; | 
|---|
 | 117 |     } | 
|---|
 | 118 |    | 
|---|
 | 119 |   /* this quaternion represents the rotation from start-vector (0,0,1) to the direction of | 
|---|
 | 120 |    * the track */ | 
|---|
 | 121 |   Quaternion dir(trace.a, Vector(0,0,1));  | 
|---|
 | 122 |    | 
|---|
 | 123 |   plc->r = trace.r + (trace.a * ((loc->dist) / l)) + /*dir.apply*/(loc->pos); | 
|---|
 | 124 |   plc->w = dir * loc->rot; | 
|---|
 | 125 |    | 
|---|
 | 126 |   return false; | 
|---|
| [2068] | 127 | } | 
|---|
 | 128 |  | 
|---|
| [3238] | 129 |  | 
|---|
| [2141] | 130 | /** | 
|---|
| [3238] | 131 |    \brief this is called when a WorldEntity enters a Track part | 
|---|
 | 132 |    \param entity: pointer to the WorldEntity in question | 
|---|
 | 133 |     | 
|---|
 | 134 |    You can do stuff like add or remove effects, do some coordinate finetuning  | 
|---|
 | 135 |    or whatever in here. | 
|---|
| [2141] | 136 | */ | 
|---|
| [3238] | 137 | void Track::postEnter (WorldEntity* entity) | 
|---|
| [2080] | 138 | { | 
|---|
 | 139 | } | 
|---|
| [2068] | 140 |  | 
|---|
| [3238] | 141 |  | 
|---|
| [2141] | 142 | /** | 
|---|
| [3238] | 143 |    \brief this is called when a WorldEntity leaves a Track part | 
|---|
 | 144 |    \param entity: pointer to the WorldEntity in question | 
|---|
 | 145 |     | 
|---|
 | 146 |    You can do stuff like add or remove effects, do some coordinate finetuning  | 
|---|
 | 147 |    or whatever in here. | 
|---|
| [2141] | 148 | */ | 
|---|
| [3238] | 149 | void Track::postLeave (WorldEntity* entity) | 
|---|
| [2080] | 150 | { | 
|---|
 | 151 | } | 
|---|
| [2068] | 152 |  | 
|---|
| [3238] | 153 |  | 
|---|
| [2141] | 154 | /** | 
|---|
| [3238] | 155 |    \brief this is called every frame | 
|---|
 | 156 |    \param deltaT: amount of time passed since the last frame in seconds | 
|---|
 | 157 |     | 
|---|
 | 158 |    Do time based or polling scripts here.  | 
|---|
| [2141] | 159 | */ | 
|---|
| [2080] | 160 | void Track::tick (float deltaT) | 
|---|
 | 161 | { | 
|---|
 | 162 | } | 
|---|
| [2068] | 163 |  | 
|---|
 | 164 |  | 
|---|
| [2080] | 165 |  | 
|---|
 | 166 |  | 
|---|
 | 167 |  | 
|---|