Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/space_ships/hover.cc @ 8896

Last change on this file since 8896 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
RevLine 
[6443]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
[6799]19#include "hover.h"
[6443]20
21#include "weapons/weapon_manager.h"
22#include "weapons/test_gun.h"
23#include "weapons/turret.h"
24#include "weapons/cannon.h"
25
[7193]26#include "util/loading/factory.h"
[6443]27#include "key_mapper.h"
28#include "state.h"
29
30#include "graphics_engine.h"
31
[8362]32#include "debug.h"
[6443]33
[6799]34CREATE_FACTORY(Hover, CL_HOVER);
[6443]35
36/**
[6799]37 *  destructs the hover, deletes alocated memory
[6443]38 */
[6799]39Hover::~Hover ()
[6986]40{
41  this->setPlayer(NULL);
42}
[6443]43
44/**
[6799]45 * loads a Hover information from a specified file.
46 * @param fileName the name of the File to load the hover from (absolute path)
[6443]47 */
[7221]48Hover::Hover(const std::string& fileName)
[6443]49{
50  this->init();
51  TiXmlDocument doc(fileName);
52
53  if(!doc.LoadFile())
54  {
[7221]55    PRINTF(2)("Loading file %s failed for Hover.\n", fileName.c_str());
[6443]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*/
[6799]68Hover::Hover(const TiXmlElement* root)
[6443]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");
[6811]79  Weapon* cannon = dynamic_cast<Weapon*>(Factory::fabricate(CL_HYPERBLASTER));
[6443]80
81  cannon->setName("BFG");
82
83  this->addWeapon(wpLeft, 1, 0);
84  this->addWeapon(wpRight,1 ,1);
[6803]85  this->addWeapon(cannon, 0, 2);
[6443]86
[7337]87  this->getWeaponManager().changeWeaponConfig(1);
88  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
[6800]89
90  this->loadModel("models/ships/hoverglider_mainbody.obj");
[6443]91}
92
93
94/**
[6799]95 * initializes a Hover
[6443]96 */
[6799]97void Hover::init()
[6443]98{
[6805]99  //  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
[6799]100  this->setClassID(CL_HOVER, "Hover");
[8719]101  this->toReflectionList();
[6443]102
[6807]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);
[6443]106
[6805]107  bForward = bBackward = bLeft = bRight = bAscend = bDescend = false;
[6807]108  mouseSensitivity = 0.005;
[6443]109
[6806]110  this->rotorSpeed = 1000.0f;
111  this->rotorCycle = 0.0f;
[6807]112  this->cameraLook = 0.0f;
113  this->rotation = 0.0f;
[6999]114  this->acceleration = 25.0f;
115  this->airFriction = 3.0f;
[6799]116
[6806]117  // camera - issue
[6800]118  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[6806]119  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
[6880]120  //this->cameraNode.setParentMode(PNODE_ROTATE_MOVEMENT);
[6724]121  this->cameraNode.setParent(this);
[6799]122
[6724]123  // rotors
[6803]124  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT );
125  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
[6801]126  this->wingNodeLeft.setParent(this);
127  this->wingNodeLeft.setRelCoor(-1.5, -.3, -1.0);
[6800]128  this->rotorNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[6801]129  this->rotorNodeLeft.setParent(&this->wingNodeLeft);
130  this->rotorNodeLeft.setRelCoor(0, 1.0, -2.3);
[6799]131
[6801]132  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[6803]133  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
[6800]134  this->wingNodeRight.setParent(this);
[6801]135  this->wingNodeRight.setRelCoor(-1.5, -0.3, 1.0);
136  this->rotorNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[6800]137  this->rotorNodeRight.setParent(&this->wingNodeRight);
[6801]138  this->rotorNodeRight.setRelCoor(0, 1.0, 2.3);
[6443]139
[7337]140  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
[6803]141
[6800]142
[6443]143  //add events to the eventlist
[6997]144  registerEvent(KeyMapper::PEV_FORWARD);
145  registerEvent(KeyMapper::PEV_BACKWARD);
[6637]146  registerEvent(KeyMapper::PEV_LEFT);
147  registerEvent(KeyMapper::PEV_RIGHT);
[6998]148  registerEvent(KeyMapper::PEV_UP);
149  registerEvent(KeyMapper::PEV_DOWN);
[6443]150  registerEvent(KeyMapper::PEV_FIRE1);
151  registerEvent(KeyMapper::PEV_NEXT_WEAPON);
152  registerEvent(KeyMapper::PEV_PREVIOUS_WEAPON);
153  registerEvent(EV_MOUSE_MOTION);
154
155
[6803]156  // WEAPON_MANAGER configuration
[7337]157  this->getWeaponManager().setSlotCount(5);
[6803]158
[7337]159  this->getWeaponManager().setSlotPosition(0, Vector(-0.28, 1.186, -2.750), &this->wingNodeLeft);
160  this->getWeaponManager().setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
[6443]161
[7337]162  this->getWeaponManager().setSlotPosition(1, Vector(-0.28, 1.186, 2.750), &this->wingNodeRight);
163  this->getWeaponManager().setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
[6443]164
[7337]165  this->getWeaponManager().setSlotPosition(2, Vector(-1.63, .809, -.003));
166  this->getWeaponManager().setSlotCapability(2, WTYPE_HEAVY);
[6443]167
[6803]168  /// TODO: THESE ARE TOO MUCH
[7337]169  this->getWeaponManager().setSlotPosition(3, Vector(-1.63, .678, -.652));
170  this->getWeaponManager().setSlotDirection(3, Quaternion(-24/180 * M_PI, Vector(1,0,0)));
[6443]171
[7337]172  this->getWeaponManager().setSlotPosition(4, Vector(-1.63, .678, .652));
173  this->getWeaponManager().setSlotDirection(4, Quaternion(24/180 * M_PI, Vector(1,0,0)));
[6443]174
[6807]175  this->cameraNode.setRelCoor(1,5,0);
[7337]176  this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
177  this->getWeaponManager().getFixedTarget()->setRelCoor(1000,0,0);
[8316]178
[7954]179  // NETWORK THINGS
[8316]180
[7954]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 ) );
[8316]187
[7954]188  registerVar( new SynchronizeableFloat( &rotation, &rotation, "rotation", PERMISSION_OWNER ) );
[6443]189}
190
191/**
[6799]192 * loads the Settings of a Hover from an XML-element.
[6443]193 * @param root the XML-element to load the Spaceship's properties from
194 */
[6799]195void Hover::loadParams(const TiXmlElement* root)
[6443]196{
[6512]197  WorldEntity::loadParams(root);
[6443]198}
199
200
[6799]201void Hover::enter()
[6443]202{
[7337]203  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( true);
[6443]204
[7014]205  State::getCameraNode()->setParentSoft(&this->cameraNode);
206  State::getCameraNode()->setRelCoorSoft(-10, 0,0);
207  State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
[6443]208}
209
[6799]210void Hover::leave()
[6443]211{
[7337]212  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
[6443]213  this->detachCamera();
214
215}
216
217
218/**
[6799]219 *  effect that occurs after the Hover is spawned
[6443]220*/
[6799]221void Hover::postSpawn ()
[6443]222{
223  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
224}
225
226/**
[6799]227 *  the action occuring if the hover left the game
[6443]228*/
[6799]229void Hover::leftWorld ()
[6443]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 */
[6799]238void Hover::collidesWith(WorldEntity* entity, const Vector& location)
[7072]239{
240  Playable::collidesWith(entity, location);
241}
[6443]242
243
244
245/**
246 *  the function called for each passing timeSnap
247 * @param time The timespan passed since last update
248*/
[6804]249void Hover::tick (float dt)
[6443]250{
[6804]251  Playable::tick(dt);
252
[6443]253  // spaceship controlled movement
[6805]254  this->movement(dt);
[6806]255  this->rotorCycle += this->rotorSpeed * dt;
[6443]256}
257
258/**
259 *  calculate the velocity
260 * @param time the timeslice since the last frame
261*/
[6806]262void Hover::movement (float dt)
[6443]263{
264  Vector accel(0.0, 0.0, 0.0);
265
[6814]266  if( this->bForward )
267  {
[6879]268    accel += Vector(this->acceleration, 0, 0);
[6443]269  }
270
[6814]271  if( this->bBackward )
272  {
[6879]273    accel -= Vector(this->acceleration, 0, 0);
[6443]274  }
[6814]275  if( this->bLeft)
276  {
[6879]277    accel -= Vector(0, 0, this->acceleration);
[6443]278  }
[6807]279
[6814]280  if( this->bRight)
281  {
[6879]282    accel += Vector(0, 0, this->acceleration);
[6443]283  }
284
[6814]285  if (this->bAscend )
286  {
[6879]287    accel += Vector(0, this->acceleration, 0);
[6443]288  }
[6814]289  if (this->bDescend )
290  {
[6879]291    accel -= Vector(0, this->acceleration, 0);
[6807]292  }
[6443]293
[6999]294  Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
[6814]295
[6879]296  // this is the air friction (necessary for a smooth control)
[6999]297  Vector damping = (this->velocity * this->airFriction);
298
299
300  this->velocity += (accelerationDir - damping)* dt;
301
302  this->shiftCoor (this->velocity * dt);
[6879]303
[7327]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
[6880]314  this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
[6805]315
[6999]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);
[6805]318
[6999]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);
[6443]321}
322
323
[6799]324void Hover::draw() const
[6443]325{
[6801]326  Vector tmpRot;
[6443]327  WorldEntity::draw();
[6799]328
[6801]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 ();
[6443]338
[6801]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();
[6806]346  glTranslatef(0,-1,0);
347  glRotatef(this->rotorCycle, 0,1,0);
348  this->getModel(5)->draw();
[6801]349  glPopMatrix ();
[6724]350
[6801]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 ();
[6724]361
[6801]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();
[6806]370  glTranslatef(0,-1,0);
371  glRotatef(this->rotorCycle, 0,1,0);
372  this->getModel(5)->draw();
[6801]373  glPopMatrix ();
[6443]374}
375
376/**
377 * @todo switch statement ??
378 */
[6799]379void Hover::process(const Event &event)
[6443]380{
[6804]381  Playable::process(event);
[6443]382
[6637]383  if( event.type == KeyMapper::PEV_LEFT)
[6805]384    this->bLeft = event.bPressed;
[6637]385  else if( event.type == KeyMapper::PEV_RIGHT)
[6805]386    this->bRight = event.bPressed;
[6998]387  else if( event.type == KeyMapper::PEV_UP)
[6443]388    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
[6998]389  else if( event.type == KeyMapper::PEV_DOWN)
[6443]390    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
[6997]391  else if( event.type == KeyMapper::PEV_FORWARD)
[6805]392    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
[6997]393  else if( event.type == KeyMapper::PEV_BACKWARD)
[6805]394    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
[6443]395  else if( event.type == EV_MOUSE_MOTION)
396  {
[6807]397    float xMouse, yMouse;
398    xMouse = event.xRel*mouseSensitivity;
399    yMouse = event.yRel*mouseSensitivity;
[6443]400
[6805]401    // rotate the Player around the y-axis
[6807]402    this->rotation += xMouse;
[6799]403
[6807]404    this->cameraLook += yMouse;
[6805]405    // rotate the Camera around the z-axis
[6807]406    if (cameraLook > M_PI_4)
407      cameraLook = M_PI_4;
[6880]408    else if (cameraLook < -M_PI_4)
409      cameraLook = -M_PI_4;
410    //this->cameraNode.setRelDirSoft(this->direction,10);
[6805]411  }
[6443]412}
Note: See TracBrowser for help on using the repository browser.