Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: setClassID implemented in all files

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