Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: baseObject now implements loading of objectNames

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