Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/world_entities/skybox.cc @ 4640

Last change on this file since 4640 was 4621, checked in by bensch, 19 years ago

orxonox/trunk: SkyBox now loads property size

File size: 6.6 KB
Line 
1
2/*
3   orxonox - the future of 3D-vertical-scrollers
4
5   Copyright (C) 2004 orx
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   ### File Specific:
13   main-programmer: Benjamin Grauer
14   co-programmer: ...
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19
20#include "skybox.h"
21
22#include "stdincl.h"
23#include "factory.h"
24
25#include "material.h"
26#include "vector.h"
27#include "resource_manager.h"
28#include "model.h"
29//#include "world_entity.h"
30
31CREATE_FACTORY(SkyBox);
32
33using namespace std;
34
35/**
36   \brief Constructs a SkyBox and takes fileName as a map.
37   \param fileName the file to take as input for the SkyBox
38*/
39SkyBox::SkyBox(const char* fileName)
40{
41  this->preInit();
42  if (fileName)
43    this->setTextureAndType(fileName, ".jpg");
44  this->postInit();
45}
46
47/**
48   \brief initializes a skybox from a XmlElement
49*/
50SkyBox::SkyBox(const TiXmlElement* root)
51{
52  this->preInit();
53
54  this->loadParams(root);
55
56  this->postInit();
57}
58
59void SkyBox::loadParams(const TiXmlElement* root)
60{
61  static_cast<WorldEntity*>(this)->loadParams(root);
62
63  LoadParam<SkyBox>(root, "Materialset", this, &SkyBox::setTexture)
64      .describe("Sets the material on the SkyBox. The string must be the path relative to the data-dir, and without a trailing .jpg");
65
66  LoadParam<SkyBox>(root, "Size", this, &SkyBox::setSize)
67      .describe("Sets the Size of the SkyBox (normally this should be 90% of the maximal viewing Distance).");
68}
69
70void SkyBox::preInit(void)
71{
72  this->setClassID(CL_SKYBOX, "SkyBox");
73
74  this->size = 100.0;
75
76  this->skyModel = NULL;
77  this->material = new Material*[6];
78  for (int i = 0; i < 6; i++)
79    {
80      this->material[i] = new Material();
81      this->material[i]->setIllum(3);
82      this->material[i]->setDiffuse(0.0,0.0,0.0);
83      this->material[i]->setSpecular(0.0,0.0,0.0);
84      this->material[i]->setAmbient(2.0, 2.0, 2.0);
85    }
86  this->setParentMode(PNODE_MOVEMENT);
87}
88
89void SkyBox::postInit(void)
90{
91  this->rebuild();
92}
93
94
95/**
96   \brief default destructor
97*/
98SkyBox::~SkyBox()
99{
100  PRINTF(5)("Deleting SkyBox\n");
101  for (int i = 0; i < 6; i++)
102    delete this->material[i];
103  delete []this->material;
104}
105
106/**
107   \brief sets A set of textures when just giving a Name and an extension:
108
109   usage: give this function an argument like
110   setTexture("skybox", "jpg");
111   and it will convert this to
112   setTextures("skybox_top.jpg", "skybox_bottom.jpg", "skybox_left.jpg",
113               "skybox_right.jpg", "skybox_front.jpg", "skybox_back.jpg");
114*/
115void SkyBox::setTextureAndType(const char* name, const char* extension)
116{
117  char* top    = new char[strlen(name)+strlen(extension)+ 10];
118  char* bottom = new char[strlen(name)+strlen(extension)+ 10];
119  char* left   = new char[strlen(name)+strlen(extension)+ 10];
120  char* right  = new char[strlen(name)+strlen(extension)+ 10];
121  char* front  = new char[strlen(name)+strlen(extension)+ 10];
122  char* back   = new char[strlen(name)+strlen(extension)+ 10];
123
124  sprintf(top, "%s_top.%s", name, extension);
125  sprintf(bottom, "%s_bottom.%s", name, extension);
126  sprintf(left, "%s_left.%s", name, extension);
127  sprintf(right, "%s_right.%s", name, extension);
128  sprintf(front, "%s_front.%s", name, extension);
129  sprintf(back, "%s_back.%s", name, extension);
130
131  this->setTextures(top, bottom, left, right, front, back);
132
133  // deleted alocated memory of this function
134  delete []top;
135  delete []bottom;
136  delete []left;
137  delete []right;
138  delete []front;
139  delete []back;
140}
141
142/**
143   \brief Defines which textures should be loaded onto the SkyBox.
144   \param top the top texture.
145   \param bottom the bottom texture.
146   \param left the left texture.
147   \param right the right texture.
148   \param front the front texture.
149   \param back the back texture.
150*/
151void SkyBox::setTextures(const char* top, const char* bottom, const char* left, const char* right, const char* front, const char* back)
152{
153  this->material[0]->setDiffuseMap(top);
154  this->material[1]->setDiffuseMap(bottom);
155  this->material[2]->setDiffuseMap(left);
156  this->material[3]->setDiffuseMap(right);
157  this->material[4]->setDiffuseMap(front);
158  this->material[5]->setDiffuseMap(back);
159}
160
161/**
162   \param size The new size of the SkyBox
163
164 * do not forget to rebuild the SkyBox after this.
165*/
166void SkyBox::setSize(float size)
167{
168  this->size = size;
169}
170
171/**
172   \brief draws the SkyBox
173*/
174void SkyBox::draw()
175{
176  glPushMatrix();
177  glMatrixMode(GL_MODELVIEW);
178  Vector r = this->getAbsCoor();
179  glTranslatef(r.x, r.y, r.z);
180
181  this->skyModel->draw();
182
183  glPopMatrix();
184}
185
186
187/**
188   \brief rebuilds the SkyBox
189
190   this must be done, when changing the Size of the Skybox (runtime-efficency)
191*/
192void SkyBox::rebuild()
193{
194  if (this->skyModel)
195    delete skyModel;
196  skyModel = new Model();
197
198  this->skyModel->addVertex (-0.5*size, -0.5*size, 0.5*size);
199  this->skyModel->addVertex (0.5*size, -0.5*size, 0.5*size);
200  this->skyModel->addVertex (-0.5*size, 0.5*size, 0.5*size);
201  this->skyModel->addVertex (0.5*size, 0.5*size, 0.5*size);
202  this->skyModel->addVertex (-0.5*size, 0.5*size, -0.5*size);
203  this->skyModel->addVertex (0.5*size, 0.5*size, -0.5*size);
204  this->skyModel->addVertex (-0.5*size, -0.5*size, -0.5*size);
205  this->skyModel->addVertex (0.5*size, -0.5*size, -0.5*size);
206
207  this->skyModel->addVertexTexture (0.0, 1.0);
208  this->skyModel->addVertexTexture (1.0, 1.0);
209  this->skyModel->addVertexTexture (1.0, 0.0);
210  this->skyModel->addVertexTexture (0.0, 0.0);
211
212  this->skyModel->addVertexNormal (0.0, 0.0, 1.0);
213  this->skyModel->addVertexNormal (0.0, 1.0, 0.0);
214  this->skyModel->addVertexNormal (0.0, 0.0, -1.0);
215  this->skyModel->addVertexNormal (0.0, -1.0, 0.0);
216  this->skyModel->addVertexNormal (1.0, 0.0, 0.0);
217  this->skyModel->addVertexNormal (-1.0, 0.0, 0.0);
218
219  this->skyModel->setMaterial(material[0]);
220  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,0,3, 3,1,3, 5,2,3, 4,3,3); // top
221  this->skyModel->setMaterial(material[1]);
222  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,1, 7,1,1, 1,2,1, 0,3,1); // bottom
223  this->skyModel->setMaterial(material[2]);
224  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,2,2, 5,3,2, 7,0,2, 6,1,2); // left
225  this->skyModel->setMaterial(material[3]);
226  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,0, 3,2,0, 2,3,0); // right
227  this->skyModel->setMaterial(material[4]);
228  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,0,5, 7,1,5, 5,2,5, 3,3,5); // front
229  this->skyModel->setMaterial(material[5]);
230  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,4, 0,1,4, 2,2,4, 4,3,4); // back
231
232  this->skyModel->finalize();
233}
Note: See TracBrowser for help on using the repository browser.