Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/terrain.older/src/world_entities/space_ships/hover.cc @ 10710

Last change on this file since 10710 was 8719, checked in by bensch, 18 years ago

merged the water branche back. conflicts resolved in favour of the trunk

File size: 12.2 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 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   main-programmer: Benjamin Grauer
13   co-programmer: ...
14
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19#include "hover.h"
20
21#include "weapons/weapon_manager.h"
22#include "weapons/test_gun.h"
23#include "weapons/turret.h"
24#include "weapons/cannon.h"
25
26#include "util/loading/factory.h"
27#include "key_mapper.h"
28#include "state.h"
29
30#include "graphics_engine.h"
31
32#include "debug.h"
33
34CREATE_FACTORY(Hover, CL_HOVER);
35
36/**
37 *  destructs the hover, deletes alocated memory
38 */
39Hover::~Hover ()
40{
41  this->setPlayer(NULL);
42}
43
44/**
45 * loads a Hover information from a specified file.
46 * @param fileName the name of the File to load the hover from (absolute path)
47 */
48Hover::Hover(const std::string& fileName)
49{
50  this->init();
51  TiXmlDocument doc(fileName);
52
53  if(!doc.LoadFile())
54  {
55    PRINTF(2)("Loading file %s failed for Hover.\n", fileName.c_str());
56    return;
57  }
58
59  this->loadParams(doc.RootElement());
60}
61
62/**
63 *  creates a new Spaceship from Xml Data
64 * @param root the xml element containing spaceship data
65
66   @todo add more parameters to load
67*/
68Hover::Hover(const TiXmlElement* root)
69{
70  this->init();
71  if (root != NULL)
72    this->loadParams(root);
73
74  //weapons:
75  Weapon* wpRight = new TestGun(0);
76  wpRight->setName("testGun Right");
77  Weapon* wpLeft = new TestGun(1);
78  wpLeft->setName("testGun Left");
79  Weapon* cannon = dynamic_cast<Weapon*>(Factory::fabricate(CL_HYPERBLASTER));
80
81  cannon->setName("BFG");
82
83  this->addWeapon(wpLeft, 1, 0);
84  this->addWeapon(wpRight,1 ,1);
85  this->addWeapon(cannon, 0, 2);
86
87  this->getWeaponManager().changeWeaponConfig(1);
88  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
89
90  this->loadModel("models/ships/hoverglider_mainbody.obj");
91}
92
93
94/**
95 * initializes a Hover
96 */
97void Hover::init()
98{
99  //  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
100  this->setClassID(CL_HOVER, "Hover");
101  this->toReflectionList();
102
103  this->loadModel("models/ships/hoverglider_wing.obj", 1.0f, 3);
104  this->loadModel("models/ships/hoverglider_rotor.obj", 1.0f, 4);
105  this->loadModel("models/ships/rotor.obj", .45f, 5);
106
107  bForward = bBackward = bLeft = bRight = bAscend = bDescend = false;
108  mouseSensitivity = 0.005;
109
110  this->rotorSpeed = 1000.0f;
111  this->rotorCycle = 0.0f;
112  this->cameraLook = 0.0f;
113  this->rotation = 0.0f;
114  this->acceleration = 25.0f;
115  this->airFriction = 3.0f;
116
117  // camera - issue
118  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
119  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
120  //this->cameraNode.setParentMode(PNODE_ROTATE_MOVEMENT);
121  this->cameraNode.setParent(this);
122
123  // rotors
124  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT );
125  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
126  this->wingNodeLeft.setParent(this);
127  this->wingNodeLeft.setRelCoor(-1.5, -.3, -1.0);
128  this->rotorNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
129  this->rotorNodeLeft.setParent(&this->wingNodeLeft);
130  this->rotorNodeLeft.setRelCoor(0, 1.0, -2.3);
131
132  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
133  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
134  this->wingNodeRight.setParent(this);
135  this->wingNodeRight.setRelCoor(-1.5, -0.3, 1.0);
136  this->rotorNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
137  this->rotorNodeRight.setParent(&this->wingNodeRight);
138  this->rotorNodeRight.setRelCoor(0, 1.0, 2.3);
139
140  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
141
142
143  //add events to the eventlist
144  registerEvent(KeyMapper::PEV_FORWARD);
145  registerEvent(KeyMapper::PEV_BACKWARD);
146  registerEvent(KeyMapper::PEV_LEFT);
147  registerEvent(KeyMapper::PEV_RIGHT);
148  registerEvent(KeyMapper::PEV_UP);
149  registerEvent(KeyMapper::PEV_DOWN);
150  registerEvent(KeyMapper::PEV_FIRE1);
151  registerEvent(KeyMapper::PEV_NEXT_WEAPON);
152  registerEvent(KeyMapper::PEV_PREVIOUS_WEAPON);
153  registerEvent(EV_MOUSE_MOTION);
154
155
156  // WEAPON_MANAGER configuration
157  this->getWeaponManager().setSlotCount(5);
158
159  this->getWeaponManager().setSlotPosition(0, Vector(-0.28, 1.186, -2.750), &this->wingNodeLeft);
160  this->getWeaponManager().setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
161
162  this->getWeaponManager().setSlotPosition(1, Vector(-0.28, 1.186, 2.750), &this->wingNodeRight);
163  this->getWeaponManager().setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
164
165  this->getWeaponManager().setSlotPosition(2, Vector(-1.63, .809, -.003));
166  this->getWeaponManager().setSlotCapability(2, WTYPE_HEAVY);
167
168  /// TODO: THESE ARE TOO MUCH
169  this->getWeaponManager().setSlotPosition(3, Vector(-1.63, .678, -.652));
170  this->getWeaponManager().setSlotDirection(3, Quaternion(-24/180 * M_PI, Vector(1,0,0)));
171
172  this->getWeaponManager().setSlotPosition(4, Vector(-1.63, .678, .652));
173  this->getWeaponManager().setSlotDirection(4, Quaternion(24/180 * M_PI, Vector(1,0,0)));
174
175  this->cameraNode.setRelCoor(1,5,0);
176  this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
177  this->getWeaponManager().getFixedTarget()->setRelCoor(1000,0,0);
178
179  // NETWORK THINGS
180
181  registerVar( new SynchronizeableBool( &bForward, &bForward, "bForward", PERMISSION_OWNER ) );
182  registerVar( new SynchronizeableBool( &bBackward, &bBackward, "bBackward", PERMISSION_OWNER ) );
183  registerVar( new SynchronizeableBool( &bLeft, &bLeft, "bLeft", PERMISSION_OWNER ) );
184  registerVar( new SynchronizeableBool( &bRight, &bRight, "bRight", PERMISSION_OWNER ) );
185  registerVar( new SynchronizeableBool( &bAscend, &bAscend, "bAscend", PERMISSION_OWNER ) );
186  registerVar( new SynchronizeableBool( &bDescend, &bDescend, "bDescend", PERMISSION_OWNER ) );
187
188  registerVar( new SynchronizeableFloat( &rotation, &rotation, "rotation", PERMISSION_OWNER ) );
189}
190
191/**
192 * loads the Settings of a Hover from an XML-element.
193 * @param root the XML-element to load the Spaceship's properties from
194 */
195void Hover::loadParams(const TiXmlElement* root)
196{
197  WorldEntity::loadParams(root);
198}
199
200
201void Hover::enter()
202{
203  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( true);
204
205  State::getCameraNode()->setParentSoft(&this->cameraNode);
206  State::getCameraNode()->setRelCoorSoft(-10, 0,0);
207  State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
208}
209
210void Hover::leave()
211{
212  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
213  this->detachCamera();
214
215}
216
217
218/**
219 *  effect that occurs after the Hover is spawned
220*/
221void Hover::postSpawn ()
222{
223  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
224}
225
226/**
227 *  the action occuring if the hover left the game
228*/
229void Hover::leftWorld ()
230{}
231
232/**
233 *  this function is called, when two entities collide
234 * @param entity: the world entity with whom it collides
235 *
236 * Implement behaviour like damage application or other miscellaneous collision stuff in this function
237 */
238void Hover::collidesWith(WorldEntity* entity, const Vector& location)
239{
240  Playable::collidesWith(entity, location);
241}
242
243
244
245/**
246 *  the function called for each passing timeSnap
247 * @param time The timespan passed since last update
248*/
249void Hover::tick (float dt)
250{
251  Playable::tick(dt);
252
253  // spaceship controlled movement
254  this->movement(dt);
255  this->rotorCycle += this->rotorSpeed * dt;
256}
257
258/**
259 *  calculate the velocity
260 * @param time the timeslice since the last frame
261*/
262void Hover::movement (float dt)
263{
264  Vector accel(0.0, 0.0, 0.0);
265
266  if( this->bForward )
267  {
268    accel += Vector(this->acceleration, 0, 0);
269  }
270
271  if( this->bBackward )
272  {
273    accel -= Vector(this->acceleration, 0, 0);
274  }
275  if( this->bLeft)
276  {
277    accel -= Vector(0, 0, this->acceleration);
278  }
279
280  if( this->bRight)
281  {
282    accel += Vector(0, 0, this->acceleration);
283  }
284
285  if (this->bAscend )
286  {
287    accel += Vector(0, this->acceleration, 0);
288  }
289  if (this->bDescend )
290  {
291    accel -= Vector(0, this->acceleration, 0);
292  }
293
294  Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
295
296  // this is the air friction (necessary for a smooth control)
297  Vector damping = (this->velocity * this->airFriction);
298
299
300  this->velocity += (accelerationDir - damping)* dt;
301
302  this->shiftCoor (this->velocity * dt);
303
304    // limit the maximum rotation speed.
305  if (this->rotation != 0.0f)
306  {
307    float maxRot = 10.0 * dt;
308    if (unlikely(this->rotation > maxRot)) this->rotation = maxRot;
309    if (unlikely(this->rotation < -maxRot)) this->rotation = -maxRot;
310    this->direction *= Quaternion(-M_PI/4.0*this->rotation, Vector(0,1,0));
311    this->rotation = 0.0f;
312  }
313
314  this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
315
316  this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .03 +this->rotation, Vector(1,0,0)), 5);
317  this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .05+this->rotation + cameraLook, Vector(0,0,1)), 5);
318
319  this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .03 +this->rotation, Vector(1,0,0)), 5);
320  this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.05 -this->rotation + cameraLook, Vector(0,0,1)), 5);
321}
322
323
324void Hover::draw() const
325{
326  Vector tmpRot;
327  WorldEntity::draw();
328
329  glPushMatrix();
330  /// LEFT SIDE
331  glTranslatef (this->wingNodeLeft.getAbsCoor ().x,
332                this->wingNodeLeft.getAbsCoor ().y,
333                this->wingNodeLeft.getAbsCoor ().z);
334  tmpRot = this->wingNodeLeft.getAbsDir().getSpacialAxis();
335  glRotatef (this->wingNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
336  this->getModel(3)->draw();
337  glPopMatrix ();
338
339  glPushMatrix();
340  glTranslatef (this->rotorNodeLeft.getAbsCoor ().x,
341                this->rotorNodeLeft.getAbsCoor ().y,
342                this->rotorNodeLeft.getAbsCoor ().z);
343  tmpRot = this->rotorNodeLeft.getAbsDir().getSpacialAxis();
344  glRotatef (this->rotorNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
345  this->getModel(4)->draw();
346  glTranslatef(0,-1,0);
347  glRotatef(this->rotorCycle, 0,1,0);
348  this->getModel(5)->draw();
349  glPopMatrix ();
350
351  /// RIGHT SIDE
352  glPushMatrix();
353  glTranslatef (this->wingNodeRight.getAbsCoor ().x,
354                this->wingNodeRight.getAbsCoor ().y,
355                this->wingNodeRight.getAbsCoor ().z);
356  tmpRot = this->wingNodeRight.getAbsDir().getSpacialAxis();
357  glRotatef (this->wingNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
358  glScalef(1,1,-1);
359  this->getModel(3)->draw();
360  glPopMatrix ();
361
362  glPushMatrix();
363  glTranslatef (this->rotorNodeRight.getAbsCoor ().x,
364                this->rotorNodeRight.getAbsCoor ().y,
365                this->rotorNodeRight.getAbsCoor ().z);
366  tmpRot = this->rotorNodeRight.getAbsDir().getSpacialAxis();
367  glRotatef (this->rotorNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
368  glScalef(1,1,-1);
369  this->getModel(4)->draw();
370  glTranslatef(0,-1,0);
371  glRotatef(this->rotorCycle, 0,1,0);
372  this->getModel(5)->draw();
373  glPopMatrix ();
374}
375
376/**
377 * @todo switch statement ??
378 */
379void Hover::process(const Event &event)
380{
381  Playable::process(event);
382
383  if( event.type == KeyMapper::PEV_LEFT)
384    this->bLeft = event.bPressed;
385  else if( event.type == KeyMapper::PEV_RIGHT)
386    this->bRight = event.bPressed;
387  else if( event.type == KeyMapper::PEV_UP)
388    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
389  else if( event.type == KeyMapper::PEV_DOWN)
390    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
391  else if( event.type == KeyMapper::PEV_FORWARD)
392    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
393  else if( event.type == KeyMapper::PEV_BACKWARD)
394    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
395  else if( event.type == EV_MOUSE_MOTION)
396  {
397    float xMouse, yMouse;
398    xMouse = event.xRel*mouseSensitivity;
399    yMouse = event.yRel*mouseSensitivity;
400
401    // rotate the Player around the y-axis
402    this->rotation += xMouse;
403
404    this->cameraLook += yMouse;
405    // rotate the Camera around the z-axis
406    if (cameraLook > M_PI_4)
407      cameraLook = M_PI_4;
408    else if (cameraLook < -M_PI_4)
409      cameraLook = -M_PI_4;
410    //this->cameraNode.setRelDirSoft(this->direction,10);
411  }
412}
Note: See TracBrowser for help on using the repository browser.