Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/world_entities/terrain.cc @ 3565

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

orxonox/trunk: patched the pNode, now there exists the ability for advanced linkage-modes

File size: 6.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16
17#include "terrain.h"
18
19#include "glincl.h"
20
21using namespace std;
22
23
24/**
25   \brief standard constructor
26
27*/
28Terrain::Terrain () 
29{
30  this->init();
31}
32
33/**
34   \brief a Constructor for the Debug-Worlds
35
36   \todo make it not compileable when not in debug-mode
37*/
38Terrain::Terrain(DebugTerrain debugTerrain)
39{
40  this->init();
41  this->buildDebugTerrain(debugTerrain);
42}
43
44
45/**
46   \brief standard deconstructor
47
48*/
49Terrain::~Terrain () 
50{
51  if (objectList)
52    glDeleteLists(this->objectList, 1);
53}
54
55
56void Terrain::init(void)
57{
58   this->setClassName ("Terrain");
59   this->objectList = 0;
60}
61
62
63void Terrain::draw ()
64{ 
65  glMatrixMode(GL_MODELVIEW);
66  glPushMatrix();
67  float matrix[4][4];
68 
69  /* translate */
70  glTranslatef (this->getAbsCoor ().x, 
71                this->getAbsCoor ().y, 
72                this->getAbsCoor ().z);
73  /* rotate */
74  this->getAbsDir ().matrix (matrix);
75  glMultMatrixf((float*)matrix);
76
77  glCallList(objectList);
78  //  this->model->draw();
79  glPopMatrix();
80}
81
82
83void Terrain::buildDebugTerrain(DebugTerrain debugTerrain)
84{
85  // if the terrain is the Terrain of Dave
86  if (debugTerrain == TERRAIN_DAVE)
87    {
88      objectList = glGenLists(1);
89      glNewList (objectList, GL_COMPILE);
90     
91      glColor3f(1.0,0,0);
92     
93      int sizeX = 100;
94      int sizeZ = 80;
95      float length = 1000;
96      float width = 200;
97      float widthX = float (length /sizeX);
98      float widthZ = float (width /sizeZ);
99     
100      float height [sizeX][sizeZ];
101      Vector normal_vectors[sizeX][sizeZ];
102     
103     
104      for ( int i = 0; i<sizeX-1; i+=1)
105        for (int j = 0; j<sizeZ-1;j+=1)
106          //height[i][j] = rand()/20046 + (j-25)*(j-25)/30;
107#ifdef __WIN32__
108          height[i][j]=(sin((float)j/3)*rand()*i/182400)*.5;
109#else
110      height[i][j]=(sin((float)j/3)*rand()*(long)i/6282450500.0)*.5;
111#endif
112     
113      //Die Huegel ein wenig glaetten
114      for (int h=1; h<2;h++)
115        for (int i=1;i<sizeX-2 ;i+=1 )
116          for(int j=1;j<sizeZ-2;j+=1)
117            height[i][j]=(height[i+1][j]+height[i][j+1]+height[i-1][j]+height[i][j-1])/4;
118     
119      //Berechnung von normalen Vektoren
120      for(int i=1;i<sizeX-2;i+=1)
121        for(int j=1;j<sizeZ-2 ;j+=1)
122          {
123            Vector v1 = Vector (widthX*(1),      height[i][j],      widthZ*(j) );
124            Vector v2 = Vector (widthX*(i-1),    height[i-1][j],    widthZ*(j));
125            Vector v3 = Vector (widthX*(i),      height[i][j+1],    widthZ*(j+1));
126            Vector v4 = Vector (widthX*(i+1),    height[i+1][j],    widthZ*(j));
127            Vector v5 = Vector (widthX*(i),      height[i][j-1],    widthZ*(j-1));
128           
129            Vector c1 = v2 - v1;
130            Vector c2 = v3 - v1;
131            Vector c3=  v4 - v1;
132            Vector c4 = v5 - v1;
133            Vector zero = Vector (0,0,0);
134            normal_vectors[i][j]=c1.cross(v3-v5)+c2.cross(v4-v2)+c3.cross(v5-v3)+c4.cross(v2-v4);
135            normal_vectors[i][j].normalize();
136          }
137     
138      glBegin(GL_QUADS);
139      int snowheight=3;
140      for ( int i = 0; i<sizeX; i+=1)
141        for (int j = 0; j<sizeZ;j+=1)
142          {       
143            Vector v1 = Vector (widthX*(i),      height[i][j]-20,       widthZ*(j)  -width/2);
144            Vector v2 = Vector (widthX*(i+1),    height[i+1][j]-20,     widthZ*(j)  -width/2);
145            Vector v3 = Vector (widthX*(i+1),    height[i+1][j+1]-20,   widthZ*(j+1)-width/2);
146            Vector v4 = Vector (widthX*(i),      height[i][j+1]-20,     widthZ*(j+1)-width/2);
147            float a[3];
148            if(height[i][j]<snowheight){
149              a[0]=0;
150              a[1]=1.0-height[i][j]/10-.3;
151              a[2]=0;
152              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
153            }
154            else{
155              a[0]=1.0;
156              a[1]=1.0;
157              a[2]=1.0;
158              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
159             
160            }
161            glNormal3f(normal_vectors[i][j].x, normal_vectors[i][j].y, normal_vectors[i][j].z);
162            glVertex3f(v1.x, v1.y, v1.z);
163            if(height[i+1][j]<snowheight){
164              a[0]=0;
165              a[1] =1.0-height[i+1][j]/10-.3;
166              a[2]=0;
167              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
168            }
169            else{
170              a[0]=1.0;
171              a[1]=1.0;
172              a[2]=1.0;
173              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
174             
175            }
176            glNormal3f(normal_vectors[i+1][j].x, normal_vectors[i+1][j].y, normal_vectors[i+1][j].z);
177            glVertex3f(v2.x, v2.y, v2.z);
178            if(height[i+1][j+1]<snowheight){
179              a[0]=0;
180              a[1] =1.0-height[i+1][j+1]/10-.3;
181              a[2]=0;
182              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
183            }
184            else{
185              a[0]=1.0;
186              a[1]=1.0;
187              a[2]=1.0;
188              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
189             
190             
191            }
192            glNormal3f(normal_vectors[i+1][j+1].x, normal_vectors[i+1][j+1].y, normal_vectors[i+1][j+1].z);
193            glVertex3f(v3.x, v3.y, v3.z);
194            if(height[i][j+1]<snowheight){
195              a[0]=0;
196              a[1] =1.0-height[i+1][j+1]/10-.3;
197              a[2]=0;
198              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
199            }
200            else{
201              a[0]=1.0;
202              a[1]=1.0;
203              a[2]=1.0;
204              glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
205            }
206            glNormal3f(normal_vectors[i][j+1].x, normal_vectors[i][j+1].y, normal_vectors[i][j+1].z);
207            glVertex3f(v4.x, v4.y, v4.z);
208           
209          }
210      glEnd();
211      glEndList();
212    }
213
214  if (debugTerrain == TERRAIN_BENSCH)
215    {
216      /*
217        this->model = (OBJModel*) new Model();
218      this->model->setName("CUBE");
219      this->model->addVertex (-0.5, -0.5, 0.5);
220      this->model->addVertex (0.5, -0.5, 0.5);
221      this->model->addVertex (-0.5, 0.5, 0.5);
222      this->model->addVertex (0.5, 0.5, 0.5);
223      this->model->addVertex (-0.5, 0.5, -0.5);
224      this->model->addVertex (0.5, 0.5, -0.5);
225      this->model->addVertex (-0.5, -0.5, -0.5);
226      this->model->addVertex (0.5, -0.5, -0.5);
227     
228      this->model->addVertexTexture (0.0, 0.0);
229      this->model->addVertexTexture (1.0, 0.0);
230      this->model->addVertexTexture (0.0, 1.0);
231      this->model->addVertexTexture (1.0, 1.0);
232      this->model->addVertexTexture (0.0, 2.0);
233      this->model->addVertexTexture (1.0, 2.0);
234      this->model->addVertexTexture (0.0, 3.0);
235      this->model->addVertexTexture (1.0, 3.0);
236      this->model->addVertexTexture (0.0, 4.0);
237      this->model->addVertexTexture (1.0, 4.0);
238      this->model->addVertexTexture (2.0, 0.0);
239      this->model->addVertexTexture (2.0, 1.0);
240      this->model->addVertexTexture (-1.0, 0.0);
241      this->model->addVertexTexture (-1.0, 1.0);
242
243      this->model->finalize();
244      */
245    }
246 
247}
Note: See TracBrowser for help on using the repository browser.