Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4336 was 4320, checked in by patrick, 20 years ago

orxonox/trunk: now string name of a class works parallel to the int id representation and is only used for documentation purposes

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