Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: WorldEntity now has the ability to return its FaceCounts

File size: 6.4 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->material = new Material*[6];
77  for (int i = 0; i < 6; i++)
78    {
79      this->material[i] = new Material();
80      this->material[i]->setIllum(3);
81      this->material[i]->setDiffuse(0.0,0.0,0.0);
82      this->material[i]->setSpecular(0.0,0.0,0.0);
83      this->material[i]->setAmbient(2.0, 2.0, 2.0);
84    }
85  this->setParentMode(PNODE_MOVEMENT);
86}
87
88void SkyBox::postInit(void)
89{
90  this->rebuild();
91}
92
93
94/**
95   \brief default destructor
96*/
97SkyBox::~SkyBox()
98{
99  PRINTF(5)("Deleting SkyBox\n");
100  for (int i = 0; i < 6; i++)
101    delete this->material[i];
102  delete []this->material;
103}
104
105/**
106   \brief sets A set of textures when just giving a Name and an extension:
107
108   usage: give this function an argument like
109   setTexture("skybox", "jpg");
110   and it will convert this to
111   setTextures("skybox_top.jpg", "skybox_bottom.jpg", "skybox_left.jpg",
112               "skybox_right.jpg", "skybox_front.jpg", "skybox_back.jpg");
113*/
114void SkyBox::setTextureAndType(const char* name, const char* extension)
115{
116  char* top    = new char[strlen(name)+strlen(extension)+ 10];
117  char* bottom = new char[strlen(name)+strlen(extension)+ 10];
118  char* left   = new char[strlen(name)+strlen(extension)+ 10];
119  char* right  = new char[strlen(name)+strlen(extension)+ 10];
120  char* front  = new char[strlen(name)+strlen(extension)+ 10];
121  char* back   = new char[strlen(name)+strlen(extension)+ 10];
122
123  sprintf(top, "%s_top.%s", name, extension);
124  sprintf(bottom, "%s_bottom.%s", name, extension);
125  sprintf(left, "%s_left.%s", name, extension);
126  sprintf(right, "%s_right.%s", name, extension);
127  sprintf(front, "%s_front.%s", name, extension);
128  sprintf(back, "%s_back.%s", name, extension);
129
130  this->setTextures(top, bottom, left, right, front, back);
131
132  // deleted alocated memory of this function
133  delete []top;
134  delete []bottom;
135  delete []left;
136  delete []right;
137  delete []front;
138  delete []back;
139}
140
141/**
142   \brief Defines which textures should be loaded onto the SkyBox.
143   \param top the top texture.
144   \param bottom the bottom texture.
145   \param left the left texture.
146   \param right the right texture.
147   \param front the front texture.
148   \param back the back texture.
149*/
150void SkyBox::setTextures(const char* top, const char* bottom, const char* left, const char* right, const char* front, const char* back)
151{
152  this->material[0]->setDiffuseMap(top);
153  this->material[1]->setDiffuseMap(bottom);
154  this->material[2]->setDiffuseMap(left);
155  this->material[3]->setDiffuseMap(right);
156  this->material[4]->setDiffuseMap(front);
157  this->material[5]->setDiffuseMap(back);
158}
159
160/**
161   \param size The new size of the SkyBox
162
163 * do not forget to rebuild the SkyBox after this.
164*/
165void SkyBox::setSize(float size)
166{
167  this->size = size;
168}
169
170/**
171   \brief draws the SkyBox
172*/
173void SkyBox::draw()
174{
175  glPushMatrix();
176  glMatrixMode(GL_MODELVIEW);
177  Vector r = this->getAbsCoor();
178  glTranslatef(r.x, r.y, r.z);
179
180  this->model->draw();
181
182  glPopMatrix();
183}
184
185
186/**
187   \brief rebuilds the SkyBox
188
189   this must be done, when changing the Size of the Skybox (runtime-efficency)
190*/
191void SkyBox::rebuild()
192{
193  if (this->model)
194    delete this->model;
195  model = new Model();
196
197  this->model->addVertex (-0.5*size, -0.5*size, 0.5*size);
198  this->model->addVertex (0.5*size, -0.5*size, 0.5*size);
199  this->model->addVertex (-0.5*size, 0.5*size, 0.5*size);
200  this->model->addVertex (0.5*size, 0.5*size, 0.5*size);
201  this->model->addVertex (-0.5*size, 0.5*size, -0.5*size);
202  this->model->addVertex (0.5*size, 0.5*size, -0.5*size);
203  this->model->addVertex (-0.5*size, -0.5*size, -0.5*size);
204  this->model->addVertex (0.5*size, -0.5*size, -0.5*size);
205
206  this->model->addVertexTexture (0.0, 1.0);
207  this->model->addVertexTexture (1.0, 1.0);
208  this->model->addVertexTexture (1.0, 0.0);
209  this->model->addVertexTexture (0.0, 0.0);
210
211  this->model->addVertexNormal (0.0, 0.0, 1.0);
212  this->model->addVertexNormal (0.0, 1.0, 0.0);
213  this->model->addVertexNormal (0.0, 0.0, -1.0);
214  this->model->addVertexNormal (0.0, -1.0, 0.0);
215  this->model->addVertexNormal (1.0, 0.0, 0.0);
216  this->model->addVertexNormal (-1.0, 0.0, 0.0);
217
218  this->model->setMaterial(material[0]);
219  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,0,3, 3,1,3, 5,2,3, 4,3,3); // top
220  this->model->setMaterial(material[1]);
221  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,1, 7,1,1, 1,2,1, 0,3,1); // bottom
222  this->model->setMaterial(material[2]);
223  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,2,2, 5,3,2, 7,0,2, 6,1,2); // left
224  this->model->setMaterial(material[3]);
225  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,0, 3,2,0, 2,3,0); // right
226  this->model->setMaterial(material[4]);
227  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,0,5, 7,1,5, 5,2,5, 3,3,5); // front
228  this->model->setMaterial(material[5]);
229  this->model->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,4, 0,1,4, 2,2,4, 4,3,4); // back
230
231  this->model->finalize();
232}
Note: See TracBrowser for help on using the repository browser.