Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/world_entities/skybox.cc @ 9768

Last change on this file since 9768 was 9727, checked in by bensch, 18 years ago

orxonox/new_class_id: new Executor construct, that is much more typesafe, faster, and easier to extend…

Also changed the LoadParam process, and adapted ScriptEngine calls

Then at the end, some missing headers appeared, and appended them to all the cc-files again.

File size: 9.1 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#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
17
18#include "skybox.h"
19
20#include "util/loading/load_param.h"
21#include "util/loading/factory.h"
22#include "static_model.h"
23
24#include "material.h"
25#include "texture.h"
26
27#include "network_game_manager.h"
28#include "converter.h"
29#include "util/loading/resource_manager.h"
30
31#include "debug.h"
32
33#include "class_id_DEPRECATED.h"
34ObjectListDefinitionID(SkyBox, CL_SKYBOX);
35CREATE_FACTORY(SkyBox);
36
37/**
38 * Constructs a SkyBox and takes fileName as a map.
39 * @param fileName the file to take as input for the SkyBox
40*/
41SkyBox::SkyBox(const std::string& fileName)
42{
43  this->preInit();
44  if (!fileName.empty())
45    this->setTextureAndType(fileName, ".jpg");
46  this->postInit();
47}
48
49/**
50 *  initializes a skybox from a XmlElement
51*/
52SkyBox::SkyBox(const TiXmlElement* root)
53{
54  this->preInit();
55
56  if( root != NULL)
57    this->loadParams(root);
58
59  this->postInit();
60}
61
62void SkyBox::loadParams(const TiXmlElement* root)
63{
64  WorldEntity::loadParams(root);
65
66  LoadParam(root, "Materialset", this, SkyBox, setTexture)
67      .describe("Sets the material on the SkyBox. The string must be the path relative to the data-dir, and without a trailing .jpg");
68
69  LoadParam(root, "Size", this, SkyBox, setSize)
70      .describe("Sets the Size of the SkyBox (normally this should be 90% of the maximal viewing Distance).");
71}
72
73void SkyBox::preInit()
74{
75  this->registerObject(this, SkyBox::_objectList);
76  this->toList(OM_BACKGROUND);
77  this->toReflectionList();
78  //this->size = 100.0;
79  this->textureSize = 1024.0f;
80
81  for (int i = 0; i < 6; i++)
82    {
83      this->material[i] = new Material();
84      this->material[i]->setIllum(3);
85      this->material[i]->setDiffuse(0.0,0.0,0.0);
86      this->material[i]->setSpecular(0.0,0.0,0.0);
87      this->material[i]->setAmbient(2.0, 2.0, 2.0);
88
89      this->cubeTexture[i] = NULL;
90    }
91  this->setParentMode(PNODE_MOVEMENT);
92
93  this->textureName = "";
94}
95
96void SkyBox::postInit()
97{
98  this->rebuild();
99
100  textureName_handle = registerVarId( new SynchronizeableString( &textureName, &textureName, "textureName", PERMISSION_MASTER_SERVER) );
101  size_handle = registerVarId( new SynchronizeableFloat( &size, &size, "size", PERMISSION_MASTER_SERVER ) );
102}
103
104
105/**
106 *  default destructor
107*/
108SkyBox::~SkyBox()
109{
110  PRINTF(5)("Deleting SkyBox\n");
111  for (int i = 0; i < 6; i++)
112  {
113    if (this->material[i])
114      delete this->material[i];
115    if (this->cubeTexture[i])
116      ResourceManager::getInstance()->unload(this->cubeTexture[i]);
117  }
118}
119
120void SkyBox::setTexture(const std::string& name)
121{
122  this->textureName = name;
123  this->setTextureAndType (name, "jpg");
124};
125
126
127/**
128 * @brief sets A set of textures when just giving a Name and an extension:
129 * @param name the prefix of the Name
130 * @param extension the file extension (jpg by default)
131 * usage: give this function an argument like
132 * setTexture("skybox", "jpg");
133 * and it will convert this to
134 * setTextures("skybox_negx.jpg", "skybox_posx.jpg", "skybox_negy.jpg",
135 *             "skybox_posy.jpg", "skybox_negz.jpg", "skybox_posz.jpg");
136 */
137void SkyBox::setTextureAndType(const std::string& name, const std::string& extension)
138{
139  std::string negX = name + "_negx." + extension;
140  std::string posX = name + "_posx." + extension;
141
142  std::string negY = name + "_negy." + extension;
143  std::string posY = name + "_posy." + extension;
144
145  std::string negZ = name + "_negz." + extension;
146  std::string posZ = name + "_posz." + extension;
147
148  this->setTextures(negX, posX, negY, posY, negZ, posZ);
149}
150
151/**
152 * @brief Defines which textures should be loaded onto the SkyBox.
153 * @param negX the top texture.
154 * @param posX the bottom texture.
155 * @param negY the left texture.
156 * @param posY the right texture.
157 * @param negZ the front texture.
158 * @param posZ the back texture.
159*/
160void SkyBox::setTextures(const std::string& negX, const std::string& posX,
161                         const std::string& negY, const std::string& posY,
162                         const std::string& negZ, const std::string& posZ)
163{
164  this->material[0]->setDiffuseMap(negX);
165  this->material[1]->setDiffuseMap(posX);
166  this->material[2]->setDiffuseMap(negY);
167  this->material[3]->setDiffuseMap(posY);
168  this->material[4]->setDiffuseMap(negZ);
169  this->material[5]->setDiffuseMap(posZ);
170  if (GLEW_EXT_texture_cube_map)
171    this->loadCubeMapTextures(negX, posX, negY, posY, negZ, posZ);
172}
173
174void SkyBox::loadCubeMapTextures(const std::string& posY, const std::string& negY, const std::string& negZ,
175                                  const std::string& posZ, const std::string& posX, const std::string& negX)
176{
177  this->cubeTexture[0] = (Texture*)ResourceManager::getInstance()->load(negX, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT);
178  this->cubeTexture[1] = (Texture*)ResourceManager::getInstance()->load(posX, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT);
179
180  this->cubeTexture[2] = (Texture*)ResourceManager::getInstance()->load(negY, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT);
181  this->cubeTexture[3] = (Texture*)ResourceManager::getInstance()->load(posY, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT);
182
183  this->cubeTexture[4] = (Texture*)ResourceManager::getInstance()->load(negZ, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT);
184  this->cubeTexture[5] = (Texture*)ResourceManager::getInstance()->load(posZ, RP_LEVEL, IMAGE, GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT);
185}
186
187void SkyBox::enableCubeMap()
188{
189  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
190  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
191  glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
192
193  glEnable(GL_TEXTURE_CUBE_MAP_EXT);
194
195  glEnable(GL_TEXTURE_GEN_S);
196  glEnable(GL_TEXTURE_GEN_T);
197  glEnable(GL_TEXTURE_GEN_R);
198
199}
200
201void SkyBox::disableCubeMap()
202{
203  glDisable(GL_TEXTURE_CUBE_MAP);
204  glDisable(GL_TEXTURE_2D);
205  glDisable(GL_TEXTURE_GEN_S);
206  glDisable(GL_TEXTURE_GEN_T);
207  glDisable(GL_TEXTURE_GEN_R);
208
209  glDisable(GL_TEXTURE_GEN_S);
210  glDisable(GL_TEXTURE_GEN_T);
211  glDisable(GL_TEXTURE_GEN_R);
212}
213
214
215
216/**
217 * @param size The new size of the SkyBox
218
219 * do not forget to rebuild the SkyBox after this.
220*/
221void SkyBox::setSize(float size)
222{
223  this->size = size;
224}
225
226
227
228void SkyBox::draw()
229{
230  glPushAttrib(GL_ENABLE_BIT);
231//   glPushAttrib(GL_LIGHTING_BIT);
232  glDisable(GL_LIGHTING);
233
234  glDisable(GL_FOG);
235
236  WorldEntity::draw();
237
238  glPopAttrib();
239
240}
241
242
243/**
244 *  rebuilds the SkyBox
245
246   this must be done, when changing the Size of the Skybox (runtime-efficency)
247*/
248void SkyBox::rebuild()
249{
250  StaticModel* model = new StaticModel();
251
252  model->addVertex (-0.5*size, -0.5*size, 0.5*size);
253  model->addVertex (0.5*size, -0.5*size, 0.5*size);
254  model->addVertex (-0.5*size, 0.5*size, 0.5*size);
255  model->addVertex (0.5*size, 0.5*size, 0.5*size);
256  model->addVertex (-0.5*size, 0.5*size, -0.5*size);
257  model->addVertex (0.5*size, 0.5*size, -0.5*size);
258  model->addVertex (-0.5*size, -0.5*size, -0.5*size);
259  model->addVertex (0.5*size, -0.5*size, -0.5*size);
260
261//   model->addVertexTexture (0.0, 1.0);
262//   model->addVertexTexture (1.0, 1.0);
263//   model->addVertexTexture (1.0, 0.0);
264//   model->addVertexTexture (0.0, 0.0);
265
266  model->addVertexTexture (1.0/this->textureSize, (this->textureSize - 1.0)/this->textureSize);
267  model->addVertexTexture ((this->textureSize - 1.0)/this->textureSize, (this->textureSize - 1.0)/this->textureSize);
268  model->addVertexTexture ((this->textureSize - 1.0)/this->textureSize, 1.0/this->textureSize);
269  model->addVertexTexture (1.0/this->textureSize, 1.0/this->textureSize);
270
271
272  model->addVertexNormal (0.0, 0.0, 1.0);
273  model->addVertexNormal (0.0, 1.0, 0.0);
274  model->addVertexNormal (0.0, 0.0, -1.0);
275  model->addVertexNormal (0.0, -1.0, 0.0);
276  model->addVertexNormal (1.0, 0.0, 0.0);
277  model->addVertexNormal (-1.0, 0.0, 0.0);
278
279  model->setMaterial(material[0]);
280  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,4, 0,1,4, 2,2,4, 4,3,4); // back
281  model->setMaterial(material[1]);
282  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,0,5, 7,1,5, 5,2,5, 3,3,5); // front
283  model->setMaterial(material[2]);
284  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,1, 7,1,1, 1,2,1, 0,3,1); // bottom
285  model->setMaterial(material[3]);
286  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,0,3, 3,1,3, 5,2,3, 4,3,3); // top
287  model->setMaterial(material[4]);
288  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,2,2, 5,3,2, 7,0,2, 6,1,2); // left
289  model->setMaterial(material[5]);
290  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,0, 3,2,0, 2,3,0); // right
291
292  model->finalize();
293
294  this->setModel(model);
295}
296
297void SkyBox::varChangeHandler( std::list< int > & id )
298{
299  bool somethinChanged = false;
300
301  if ( std::find( id.begin(), id.end(), textureName_handle ) != id.end() )
302  {
303    somethinChanged = true;
304    setTexture( textureName );
305  }
306
307  if ( std::find( id.begin(), id.end(), size_handle ) != id.end() )
308  {
309    somethinChanged = true;
310  }
311
312  rebuild();
313
314  WorldEntity::varChangeHandler( id );
315}
Note: See TracBrowser for help on using the repository browser.