Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/cameraman.cc @ 10414

Last change on this file since 10414 was 10414, checked in by snellen, 17 years ago

fixed segfault if syntax error in xml

File size: 7.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: Filip Gospodinov
13   co-programmer: Silvan Nellen
14*/
15
16#include "shell_command.h"
17#include "cameraman.h"
18#include "game_world_data.h"
19#include "state.h"
20#include "sound_engine.h"
21#include <string>
22#include "script_class.h"
23#include "loading/load_param_xml.h"
24#include "blackscreen.h"
25#include "p_node.h"
26#include "camera.h"
27
28ObjectListDefinition(CameraMan);
29
30SHELL_COMMAND(camerainfo, CameraMan, cameraInfo);
31
32
33CREATE_SCRIPTABLE_CLASS(CameraMan,
34                        addMethod("changeCurrTarget", Executor2<CameraMan, lua_State*,const std::string&,const std::string&>(&CameraMan::changeCurrTarget))
35                        ->addMethod("atachCurrCameraToWorldEntity", Executor2<CameraMan, lua_State*,const std::string&,const std::string&>(&CameraMan::atachCurrCameraToWorldEntity))
36                        ->addMethod("changeTarget", Executor3<CameraMan, lua_State*, const std::string&, const std::string&,const std::string&>(&CameraMan::changeTarget))
37                        ->addMethod("detachCurrCamera", Executor0<CameraMan, lua_State*>(&CameraMan::detachCurrCamera))
38                        ->addMethod("setCam", Executor1<CameraMan, lua_State*, const std::string&>(&CameraMan::setCam))
39                        ->addMethod("togglFade", Executor0<CameraMan, lua_State*>(&CameraMan::togglFade))
40                        ->addMethod("getCurrCameraCoorX", Executor0ret<CameraMan, lua_State*,float>(&CameraMan::getCurrCameraCoorX))
41                        ->addMethod("getCurrCameraCoorY", Executor0ret<CameraMan, lua_State*,float>(&CameraMan::getCurrCameraCoorY))
42                        ->addMethod("getCurrCameraCoorZ", Executor0ret<CameraMan, lua_State*,float>(&CameraMan::getCurrCameraCoorZ))
43                       );
44
45
46CameraMan::CameraMan(const TiXmlElement* root)
47{
48  this->registerObject(this, CameraMan::_objectList);
49
50  this->nearClip = 1.0;
51  this->farClip = 1000.0;
52
53  this->fadeToBlack=new BlackScreen();
54
55  this->setCam( State::getCamera());
56
57  if (root != NULL)
58    this->loadParams(root);
59}
60
61
62void CameraMan::loadParams(const TiXmlElement* root)
63{
64  BaseObject::loadParams(root);
65  LoadParamXML(root, "Cameras", this, CameraMan, createCameras);
66}
67
68
69void CameraMan::createCameras(const TiXmlElement* camerasTag)
70{
71
72    LOAD_PARAM_START_CYCLE(camerasTag, object);
73    {
74      this->createCam(object);
75    }
76    LOAD_PARAM_END_CYCLE(object);
77
78}
79
80
81
82void CameraMan::createCam(const TiXmlElement* root)
83{
84  //Camera* newCamera=new Camera(root);
85  this->cameras.push_back(new Camera(root));
86 // cameras[cameras.size()-1]->target->detach();
87  cameras[cameras.size()-1]->setClipRegion(nearClip, farClip);
88
89}
90
91void CameraMan::setCam(int cameraNo)
92{
93  if (cameraNo<cameras.size())
94  {
95    this->setCam( cameras[cameraNo]);
96  }
97}
98
99void CameraMan::setCam(const std::string& camName)
100{
101  BaseObject* object = ObjectListBase::getBaseObject("Camera", camName);
102
103  if(object != NULL)
104  {
105    Camera* currentCam = dynamic_cast<Camera*>(object) ;
106
107    this->setCam(currentCam);
108    return;
109  }
110  printf("ERROR CAMERAMANAGER: Couldn't set camera : %s \n", camName.c_str());
111}
112
113
114void CameraMan::setCam(Camera* camera)
115{
116  if( camera == NULL)
117  {
118    PRINTF(0)("trying to add a zero camera! uiuiui!\n");
119  }
120  this->currentCam = camera;
121
122  State::setCamera(currentCam, currentCam->getTarget());
123  OrxSound::SoundEngine::getInstance()->setListener(currentCam);
124
125  // check if it is already added
126  if( ! this->cameraIsInVector(currentCam) )
127    this->cameras.push_back(currentCam);
128
129  this->fadeToBlack->setRelCoor(0., 0., 0.);
130  this->fadeToBlack->setParent(this->currentCam);
131}
132
133
134void CameraMan::moveCurrCam(int x, int y, int z)
135{
136  currentCam->target->trans(x,y,z);
137}
138
139
140void CameraMan::moveCam(int x, int y, int z, int camNo)
141{
142  cameras[camNo]->target->trans(x,y,z);
143}
144
145
146void CameraMan::changeTarget(int camNo,const std::string& className, const std::string& objectName)
147{
148  BaseObject* object = ObjectListBase::getBaseObject(className, objectName);
149  if( object != NULL && object->isA(PNode::staticClassID()))
150    cameras[camNo]->lookAt(dynamic_cast<PNode*>(object));
151}
152
153
154void CameraMan::changeTarget(const std::string& camName,const std::string& className, const std::string& objectName)
155{
156  BaseObject* object = ObjectListBase::getBaseObject(className, objectName);
157  BaseObject* newCam = ObjectListBase::getBaseObject("Camera", camName);
158  if( object != NULL && newCam != NULL && object->isA(PNode::staticClassID()))
159    dynamic_cast<Camera*>(newCam)->lookAt(dynamic_cast<PNode*>(object));
160}
161
162void CameraMan::changeCurrTarget(const std::string& className, const std::string& objectName)
163{
164  BaseObject* object = ObjectListBase::getBaseObject(className, objectName);
165  if( object != NULL && object->isA(PNode::staticClassID()))
166    currentCam->lookAt(dynamic_cast<PNode*>(object));
167}
168
169void CameraMan::atachCurrTarget(PNode* target)
170{
171  currentCam->target->atach(target);
172}
173
174void CameraMan::atachCurrCameraToWorldEntity(const std::string& className, const std::string& targetEntity)
175{
176  BaseObject* object = ObjectListBase::getBaseObject(className, targetEntity);
177
178  if(object != NULL)
179  {
180   this->atachCurrTarget(dynamic_cast<PNode*>(object));
181   return;
182  }
183
184printf("ERROR CAMERAMANAGER: Couldn't set camera target to: %s %s \n", className.c_str(),targetEntity.c_str() );
185}
186
187void CameraMan::detachCurrCamera()
188{
189  currentCam->target->detach();
190}
191
192void CameraMan::jumpCam(int x, int y, int z, int camNo)
193{
194  cameras[camNo]->target->jump(x, y, z);
195}
196
197
198
199void CameraMan::setClipRegion(float nearCli, float farCli)
200{
201  this->nearClip=nearCli;
202  this->farClip=farCli;
203
204  for(int i = 0; i < this->cameras.size(); i++)
205    cameras[i]->setClipRegion(nearCli, farCli);
206}
207
208
209void CameraMan::jumpCurrCam(int x, int y, int z)
210{
211  currentCam->target->jump(x, y, z);
212}
213
214
215
216
217void CameraMan::togglFade()
218{
219  if( this->fadeToBlack)
220    fadeToBlack->toggleFade();
221}
222
223
224
225bool CameraMan::cameraIsInVector(Camera* camera)
226{
227
228  for(std::vector<Camera*>::const_iterator it = cameras.begin(); it != cameras.end(); it++ )
229  {
230    if( (*it) == camera)
231    {
232      return true;
233    }
234  }
235  return false;
236
237
238}
239
240
241void CameraMan::cameraInfo()
242{
243  bool sameCam = (this->currentCam == State::getCamera());
244
245
246  PRINT(0)("==== CameraMan::cameraInfo ===\n");
247  PRINT(0)("=  Camera Name: %s\n", this->currentCam->getName().c_str());
248  PRINT(0)("=  Tests:\n");
249  PRINT(0)("==  State::Cam == this::Cam  %i\n", sameCam);
250  PRINT(0)("==  Parenting Informations:\n");
251  this->currentCam->debugNode(10);
252  PRINT(0)("==============================\n");
253}
254
255
256float CameraMan::getCurrCameraCoorX()
257{ return this->currentCam->getAbsCoorX(); }
258
259float CameraMan::getCurrCameraCoorY()
260{ return this->currentCam->getAbsCoorY(); }
261
262float CameraMan::getCurrCameraCoorZ()
263{ return this->currentCam->getAbsCoorZ(); }
264
265
266
267//how to get a class fkt pointer
268
269//BaseObject* object = ObjectListBase::getBaseObject(className, objectName);
270
271
272
273
274
275
276
277
278
279
280
281
282
283
Note: See TracBrowser for help on using the repository browser.