| [10642] | 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 |    the actual playing shoult take place within this box | 
|---|
 | 14 |  | 
|---|
 | 15 |    main-programmer: Christoph Renner | 
|---|
 | 16 | */ | 
|---|
 | 17 |  | 
|---|
 | 18 | #include "action_box.h" | 
|---|
 | 19 | #include "track.h" | 
|---|
 | 20 | #include "state.h" | 
|---|
 | 21 |  | 
|---|
 | 22 | /** | 
|---|
 | 23 |  * this function is called each frame. update your state here | 
|---|
 | 24 |  * @param time time since last tick | 
|---|
 | 25 |  */ | 
|---|
 | 26 | void ActionBox::tick( float time ) | 
|---|
 | 27 | { | 
|---|
 | 28 |   updatePlanes(); | 
|---|
 | 29 | } | 
|---|
 | 30 |  | 
|---|
 | 31 | /** | 
|---|
 | 32 |  * draws the box for debugging | 
|---|
 | 33 |  */ | 
|---|
 | 34 | void ActionBox::draw( ) const | 
|---|
 | 35 | { | 
|---|
 | 36 |   glMatrixMode(GL_MODELVIEW); | 
|---|
 | 37 |   glPushMatrix(); | 
|---|
 | 38 |  | 
|---|
 | 39 |   glPushAttrib(GL_ENABLE_BIT); | 
|---|
 | 40 |  | 
|---|
 | 41 |   glDisable(GL_LIGHTING); | 
|---|
 | 42 |   glDisable(GL_TEXTURE_2D); | 
|---|
 | 43 |   glDisable(GL_BLEND); | 
|---|
 | 44 |   glLineWidth(2.0); | 
|---|
 | 45 |   glTranslatef ( track->getTrackNode()->getAbsCoor ().x, | 
|---|
 | 46 |                 track->getTrackNode()->getAbsCoor ().y, | 
|---|
 | 47 |                 track->getTrackNode()->getAbsCoor ().z); | 
|---|
 | 48 |   Vector tmpRot = track->getTrackNode()->getAbsDir().getSpacialAxis(); | 
|---|
 | 49 |   glRotatef (track->getTrackNode()->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z ); | 
|---|
 | 50 |  | 
|---|
 | 51 |  | 
|---|
 | 52 |   glColor3f(1.0, 1.0, 0.0); | 
|---|
 | 53 |   glBegin(GL_LINE_STRIP); | 
|---|
 | 54 |     glVertex3f(0, height_2, width_2); | 
|---|
 | 55 |     glVertex3f(0, -height_2, width_2); | 
|---|
 | 56 |     glVertex3f(0, -height_2, -width_2); | 
|---|
 | 57 |     glVertex3f(0, height_2, -width_2); | 
|---|
 | 58 |     glVertex3f(0, height_2, width_2); | 
|---|
 | 59 |   glEnd(); | 
|---|
 | 60 |  | 
|---|
 | 61 |   glColor3f(1.0, 0.0, 0.0 ); | 
|---|
 | 62 |   glBegin(GL_LINE_STRIP); | 
|---|
 | 63 |     glVertex3f(depth, height_2 * stretch, width_2 * stretch); | 
|---|
 | 64 |     glVertex3f(depth, -height_2 * stretch, width_2 * stretch); | 
|---|
 | 65 |     glVertex3f(depth, -height_2 * stretch, -width_2 * stretch); | 
|---|
 | 66 |     glVertex3f(depth, height_2 * stretch, -width_2 * stretch); | 
|---|
 | 67 |     glVertex3f(depth, height_2 * stretch, width_2 * stretch); | 
|---|
 | 68 |   glEnd(); | 
|---|
 | 69 |  | 
|---|
 | 70 |   glBegin(GL_LINE_STRIP); | 
|---|
 | 71 |     glVertex3f(depth, height_2 * stretch, width_2 * stretch); | 
|---|
 | 72 |     glVertex3f(0, height_2, width_2); | 
|---|
 | 73 |     glVertex3f(0, -height_2, width_2); | 
|---|
 | 74 |     glVertex3f(depth, -height_2 * stretch, width_2 * stretch); | 
|---|
 | 75 |   glEnd(); | 
|---|
 | 76 |  | 
|---|
 | 77 |   glBegin(GL_LINE_STRIP); | 
|---|
 | 78 |     glVertex3f(depth, height_2 * stretch, -width_2 * stretch); | 
|---|
 | 79 |     glVertex3f(0, height_2, -width_2); | 
|---|
 | 80 |     glVertex3f(0, -height_2, -width_2); | 
|---|
 | 81 |     glVertex3f(depth, -height_2 * stretch, -width_2 * stretch); | 
|---|
 | 82 |   glEnd(); | 
|---|
 | 83 |  | 
|---|
| [10668] | 84 |   glPopAttrib(); | 
|---|
| [10642] | 85 |   glPopMatrix(); | 
|---|
 | 86 | } | 
|---|
 | 87 |  | 
|---|
 | 88 | /** | 
|---|
 | 89 |  * create a new action box. you must not create more than one action box | 
|---|
 | 90 |  * @param _track track to assign actionbox to  | 
|---|
 | 91 |  * @param width_2 width/2 of near plane | 
|---|
 | 92 |  * @param height_2 height/2 of near plane | 
|---|
 | 93 |  * @param depth distance between near and far plane | 
|---|
 | 94 |  * @param stretch far plane will be stretched by this factor | 
|---|
 | 95 |  */ | 
|---|
 | 96 | ActionBox::ActionBox( Track* _track, float width_2, float height_2, float depth, float stretch ) | 
|---|
 | 97 | { | 
|---|
 | 98 |   assert( _track ); | 
|---|
 | 99 |   assert( State::getActionBox() == NULL ); | 
|---|
 | 100 |    | 
|---|
 | 101 |   State::setActionBox( this ); | 
|---|
 | 102 |    | 
|---|
 | 103 |   this->width_2 = width_2; | 
|---|
 | 104 |   this->height_2 = height_2; | 
|---|
 | 105 |   this->depth = depth; | 
|---|
 | 106 |   this->stretch = stretch; | 
|---|
 | 107 |   this->track = _track; | 
|---|
 | 108 |    | 
|---|
 | 109 |   setParent( _track->getTrackNode() ); | 
|---|
 | 110 |      | 
|---|
 | 111 |   toList( OM_COMMON ); | 
|---|
 | 112 | } | 
|---|
 | 113 |  | 
|---|
 | 114 | /** | 
|---|
 | 115 |  * destructor | 
|---|
 | 116 |  */ | 
|---|
 | 117 | ActionBox::~ActionBox( ) | 
|---|
 | 118 | { | 
|---|
 | 119 |   assert( State::getActionBox() ); | 
|---|
 | 120 |   State::setActionBox( NULL ); | 
|---|
 | 121 | } | 
|---|
 | 122 |  | 
|---|
 | 123 | /** | 
|---|
 | 124 |  * checks wether a point is inside this box | 
|---|
 | 125 |  * @param pos point to check (absCoor) | 
|---|
 | 126 |  * @return true if inside | 
|---|
 | 127 |  */ | 
|---|
 | 128 | bool ActionBox::isPointInBox( const Vector & pos ) | 
|---|
 | 129 | { | 
|---|
 | 130 |   for ( int i = 0; i<6; i++ ) | 
|---|
 | 131 |   { | 
|---|
 | 132 |     if ( planes[i].distancePoint( pos ) < 0 ) | 
|---|
 | 133 |     { | 
|---|
| [10667] | 134 |       return false; | 
|---|
| [10642] | 135 |     } | 
|---|
 | 136 |   } | 
|---|
| [10667] | 137 |   return true; | 
|---|
| [10642] | 138 | } | 
|---|
 | 139 |  | 
|---|
 | 140 | /** | 
|---|
 | 141 |  * update planes with new coordiantes. nomals must point to the inside | 
|---|
 | 142 |  */ | 
|---|
 | 143 | void ActionBox::updatePlanes( ) | 
|---|
 | 144 | { | 
|---|
 | 145 |   Vector p[7]; | 
|---|
| [10645] | 146 |  | 
|---|
| [10642] | 147 |   p[0] = Vector( 0.0, height_2, -width_2 ); | 
|---|
 | 148 |   p[1] = Vector( 0.0, height_2, width_2 ); | 
|---|
 | 149 |   p[2] = Vector( 0.0, -height_2, -width_2 ); | 
|---|
 | 150 |   p[3] = Vector( depth, height_2, -width_2 ); | 
|---|
 | 151 |   p[4] = Vector( depth, height_2, width_2 ); | 
|---|
 | 152 |   p[5] = Vector( depth, -height_2, width_2 ); | 
|---|
 | 153 |   p[6] = Vector( depth, -height_2, -width_2 ); | 
|---|
| [10645] | 154 |  | 
|---|
| [10642] | 155 |   for ( int i = 0; i<7; i++ ) | 
|---|
 | 156 |   { | 
|---|
 | 157 |     p[i] = track->getTrackNode()->getAbsDir().apply( p[i] ); | 
|---|
 | 158 |     p[i] += track->getTrackNode()->getAbsCoor(); | 
|---|
 | 159 |   } | 
|---|
| [10645] | 160 |  | 
|---|
| [10642] | 161 |   planes[0] = Plane( p[1], p[0], p[2] ); | 
|---|
 | 162 |   planes[1] = Plane( p[3], p[4], p[5] ); | 
|---|
 | 163 |   planes[2] = Plane( p[5], p[4], p[1] ); | 
|---|
 | 164 |   planes[3] = Plane( p[2], p[0], p[3] ); | 
|---|
 | 165 |   planes[4] = Plane( p[3], p[0], p[1] ); | 
|---|
 | 166 |   planes[5] = Plane( p[2], p[6], p[5] ); | 
|---|
 | 167 | } | 
|---|
 | 168 |  | 
|---|
 | 169 |  | 
|---|
 | 170 |  | 
|---|