Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/camera.cc @ 6782

Last change on this file since 6782 was 6780, checked in by bensch, 19 years ago

trunk: war of the popers

File size: 6.4 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: Christian Meyer
13   co-programmer: Benjamin Grauer
14*/
15#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
16
17#include "camera.h"
18
19#include "event_handler.h"
20
21using namespace std;
22
23
24/**
25 *  creates a Camera
26*/
27Camera::Camera()
28{
29  this->setClassID(CL_CAMERA, "Camera");
30  this->setName("camera");
31  this->target = new CameraTarget();
32
33  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW0);
34  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW1);
35  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW2);
36  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW3);
37  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW4);
38  EventHandler::getInstance()->subscribe(this, ES_GAME, KeyMapper::PEV_VIEW5);
39
40  this->setFovy(90);
41  this->setAspectRatio(1.2f);
42  this->setClipRegion(.1, 2000);
43
44  this->setViewMode(VIEW_NORMAL);
45
46  this->setParentMode(PNODE_ALL);
47}
48
49/**
50 *  default destructor
51*/
52Camera::~Camera()
53{}
54
55/**
56 *  focuses the Camera onto a Target
57 * @param target the new PNode the Camera should look at.
58*/
59void Camera::lookAt(PNode* target)
60{
61  this->target->setParent(target);
62}
63
64/**
65 * @returns The PNode of the Target (from there you can get position and so on
66*/
67PNode* Camera::getTarget()
68{
69  return (PNode*)this->target;
70}
71
72/**
73 *  sets a new AspectRatio
74 * @param aspectRatio the new aspect ratio to set (width / height)
75*/
76void Camera::setAspectRatio(float aspectRatio)
77{
78  this->aspectRatio = aspectRatio;
79}
80
81/**
82 *  sets the Field of View to fofy
83 * @param fovy new field of view factor (in degrees)
84*/
85void Camera::setFovy(float fovy)
86{
87  this->fovy = fovy;
88}
89
90/**
91 * Sets a new clipping region
92 * @param nearClip The near clip plane
93 * @param farClip The far clip plane
94*/
95void Camera::setClipRegion(float nearClip, float farClip)
96{
97  this->nearClip = nearClip;
98  this->farClip = farClip;
99}
100
101/**
102 *  sets the new VideoMode and initializes iteration to it.
103 * @param mode the mode to change to.
104*/
105void Camera::setViewMode(ViewMode mode)
106{
107  currentMode = mode;
108  switch (mode)
109  {
110    default:
111    case VIEW_NORMAL:
112      this->toFovy = 60.0;
113      /*      this->setParentSoft("TrackNode");
114            this->target->setParentSoft("TrackNode"); */
115      this->setRelCoorSoft(-10, 5, 0);
116      this->target->setRelCoorSoft(0,0,0);
117      break;
118    case VIEW_BEHIND:
119      //      this->toFovy = 120.0;
120      //      this->setRelCoorSoft(Vector(3.5, 0, 0));
121      //    this->target->setRelCoorSoft(Vector(10,0,0));
122
123      //       if (!strcmp(this->target->getParent()->getName(), "Player"))
124      //         this->target->setParentSoft("TrackNode");
125      //       else
126      //         this->target->setParentSoft("Player");
127      //       this->getParent()->debugNode(0);
128
129      //      this->setParent("main-Turret");
130      //      this->setParentMode(PNODE_ALL);
131      //      this->target->setParentSoft("Player");
132
133      break;
134    case VIEW_FRONT:
135      this->toFovy = 120.0;
136      /*       this->setParentSoft("Player");
137             this->target->setParentSoft("Player");*/
138      this->setRelCoorSoft(4, 0, 0, 5);
139      this->target->setRelCoorSoft(Vector(10,0,0), 5);
140      //      this->target->setRelDirSoft(Quaternion(M_PI/4.0, Vector(0,1,0)));
141      break;
142    case VIEW_LEFT:
143      this->toFovy = 90;
144      /*      this->setParentSoft("TrackNode");
145            this->target->setParentSoft("TrackNode");*/
146      this->setRelCoorSoft(0, 1, -10, .5);
147      this->target->setRelCoorSoft(0,0,0);
148      break;
149    case VIEW_RIGHT:
150      this->toFovy = 90;
151      /*      this->setParentSoft("TrackNode");
152            this->target->setParentSoft("TrackNode");*/
153      this->setRelCoorSoft(Vector(0, 1, 10));
154      this->target->setRelCoorSoft(0,0,0);
155      break;
156    case VIEW_TOP:
157      this->toFovy= 120;
158      /*      this->setParentSoft("TrackNode");
159            this->target->setParentSoft("TrackNode");*/
160      this->setRelCoorSoft(Vector(30, 50, 0));
161      this->target->setRelCoorSoft(35,0,0);
162  }
163}
164
165
166/**
167 *  Updates the position of the camera.
168 * @param dt: The time that elapsed.
169*/
170void Camera::tick(float dt)
171{
172  float tmpFovy = (this->toFovy - this->fovy) ;
173  if (tmpFovy > 0.01)
174    this->fovy += tmpFovy * fabsf(dt);
175}
176
177
178/**
179 *  initialize rendering perspective according to this camera
180 *
181 * This is called immediately before the rendering cycle starts, it sets all global
182 * rendering options as well as the GL_PROJECTION matrix according to the camera.
183 */
184void Camera::apply ()
185{
186  // switching to Projection Matrix
187  glMatrixMode (GL_PROJECTION);
188  glLoadIdentity ();
189
190  gluPerspective(this->fovy,
191                 this->aspectRatio,
192                 this->nearClip,
193                 this->farClip);
194
195
196    // setting up the perspective
197  // speed-up feature
198  Vector cameraPosition = this->getAbsCoor();
199  Vector targetPosition = this->target->getAbsCoor();
200  Vector up = this->getAbsDirV();
201  Vector delay = Vector(0, 0, 0);
202  if( currentMode != VIEW_FRONT) delay = (this->target->getVelocity()) / 25.0f;
203
204
205  glMatrixMode (GL_MODELVIEW);
206  glLoadIdentity();
207
208 // Setting the Camera Eye, lookAt and up Vectors
209  gluLookAt(cameraPosition.x - delay.x, cameraPosition.y - delay.y, cameraPosition.z - delay.z,
210            targetPosition.x, targetPosition.y, targetPosition.z,
211            up.x, up.y, up.z);
212}
213
214/**
215 *  processes an event
216 * @param event: the event to process
217*/
218void Camera::process(const Event &event)
219{
220  if( event.type == KeyMapper::PEV_VIEW0)
221  {
222    this->setViewMode(VIEW_NORMAL);
223  }
224  else if( event.type == KeyMapper::PEV_VIEW1)
225  {
226    this->setViewMode(VIEW_BEHIND);
227  }
228  else if( event.type == KeyMapper::PEV_VIEW2)
229  {
230    this->setViewMode(VIEW_FRONT);
231  }
232  else if( event.type == KeyMapper::PEV_VIEW3)
233  {
234    this->setViewMode(VIEW_LEFT);
235  }
236  else if( event.type == KeyMapper::PEV_VIEW4)
237  {
238    this->setViewMode(VIEW_RIGHT);
239  }
240  else if( event.type == KeyMapper::PEV_VIEW5)
241  {
242    this->setViewMode(VIEW_TOP);
243  }
244}
245
246
247///////////////////
248// CAMERA-TARGET //
249///////////////////
250
251
252CameraTarget::CameraTarget()
253{
254  this->setClassID(CL_CAMERA_TARGET, "CameraTarget");
255  //  this->setParentMode(PNODE_MOVEMENT);
256}
257
Note: See TracBrowser for help on using the repository browser.