Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/height_map_merge/src/lib/graphics/importer/height_map.cc @ 6494

Last change on this file since 6494 was 6494, checked in by bensch, 18 years ago

orxonox/branches/height_map: copy the heightMap to the trunk_merge-branche

  • Property svn:executable set to *
File size: 15.1 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: bottac@ee.ethz.ch
13*/
14
15#include "height_map.h"
16#include "model.h"
17#include "texture.h"
18#include "vector.h"
19#include "material.h"
20#include "p_node.h"
21#include "state.h"
22#include "resource_manager.h"
23#include "debug.h"
24
25// INCLUDING SDL_Image
26#ifdef HAVE_SDL_IMAGE_H
27#include <SDL_image.h>
28#else
29#include <SDL/SDL_image.h>
30#endif
31
32Tile::Tile(int i1, int j1, int i2, int j2, HeightMap* hm )
33{
34
35PRINTF(0)("Tile Constructor\n");
36highResModel = new VertexArrayModel();
37lowResModel  = new VertexArrayModel();
38
39this->load(i1,j1,i2,j2,hm,highResModel,4);
40this->load(i1,j1,i2,j2,hm,lowResModel, 32);
41}
42
43Tile::Tile()
44{
45PRINTF(0)("ooops *********************************************************************************************************************************************************************************************************** \n");
46}
47
48Tile::~Tile()
49{
50 delete highResModel;
51 delete lowResModel;
52}
53
54void Tile::draw()
55{
56 lowResModel->draw();
57}
58
59void Tile::drawHighRes()
60{
61 highResModel->draw();
62}
63
64void Tile::drawLowRes()
65{
66 lowResModel->draw();
67}
68
69/*
70*/
71void Tile::load(int i1, int j1, int i2, int j2, HeightMap* hm, VertexArrayModel* model, int Res)
72{
73
74        #define heightMap hm->heightMap
75        #define colours   hm->colours
76        #define scaleX hm->scaleX
77        #define scaleY hm->scaleY
78        #define scaleZ hm->scaleZ
79        #define shiftX hm->shiftX
80        #define shiftY hm->shiftY
81        #define shiftZ hm->shiftZ
82        #define normalVectorField hm->normalVectorField
83
84        int sampleRate = Res;
85
86        unsigned char height = 0;
87        int offset = 0;
88
89        float r = 0.0;
90        float g = 0.0;
91        float b = 0.0;
92
93
94PRINTF(0)("loadin * \n");
95
96 if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 )
97
98        SDL_LockSurface(heightMap);
99
100        for(int i = i1 ; i <= i2  ; i +=sampleRate)
101        {
102                int w = 0;
103
104
105
106                 if(hm->hasColourMap)
107                 {
108                 r = (float)colours[3*w+2 + 3*i*(heightMap->w )];
109                 g = (float)colours[3*w+1 + 3*i*(heightMap->w)];
110                 b = (float)colours[3*w+0 + 3*i*(heightMap->w)];
111                 }
112
113                w = j1;
114                model->addVertex(scaleX*(heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right
115                model->addNormal(normalVectorField[i][w].y,normalVectorField[i][w].z,normalVectorField[i][w].x);
116                model->addTexCoor((((w -sampleRate)/sampleRate)%4)/4.0,(((i-sampleRate)/sampleRate)%4)/4.0);
117                model->addColor(r/255.0,g/255.0,b/255.0);
118
119            for(int j = j1  ; j <= j2    ;  j += sampleRate)
120            {
121
122
123                 // To be fixed
124                 if(hm->hasColourMap)
125                 {
126                 r = (float)colours[3*j+2 + 3*i*(heightMap->w )];
127                 g = (float)colours[3*j+1 + 3*i*(heightMap->w)];
128                 b = (float)colours[3*j+0 + 3*i*(heightMap->w)];
129                 }
130                height =  hm->heights[j+sampleRate + i*(heightMap->w )];
131                model->addVertex(scaleX*(heightMap->h -i) + shiftX ,((double)(height)*scaleY) + shiftY ,scaleZ*(j) + shiftZ); // Top Right
132                model->addNormal(normalVectorField[i][j].y,normalVectorField[i][j].z,normalVectorField[i][j].x);
133                model->addTexCoor(((j/sampleRate)%texRate)/texRatef,((i/sampleRate)%texRate)/texRatef);
134
135                model->addColor(r/255.0,g/255.0,b/255.0);
136
137
138                w = j;
139            }
140
141
142                model->addVertex(scaleX*(heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right
143                model->addNormal(normalVectorField[i][w].y,normalVectorField[i][w].z,normalVectorField[i][w].x);
144                model->addTexCoor((((w+sampleRate)/sampleRate)%4)/4.0,(((i+ sampleRate)/sampleRate)%4)/4.0);
145                model->addColor(r/255.0,g/255.0,b/255.0);
146
147        }
148
149
150
151
152
153        SDL_UnlockSurface(heightMap);
154        int cnt = 0;
155        for(int i = i1   ; i < i2  ; i +=sampleRate)
156        {
157
158            for(int j = j1-sampleRate  ; j < j2  + 2*sampleRate  ;  j += sampleRate)
159            {
160
161                model->addIndice(cnt);
162                model->addIndice(cnt  + (j2 -j1 + 3* sampleRate  )/ sampleRate );
163                cnt++;
164
165            }
166
167
168
169                 model->newStripe();
170
171
172        }
173         cnt += (j2 -j1 + 3* sampleRate)/ sampleRate;
174
175                for(int j = j1 ; j <= j2    ;  j += sampleRate)
176            {
177                int i = i1;
178
179                 // To be fixed
180                 if(hm->hasColourMap)
181                 {
182                 r = (float)colours[3*j+2 + 3*i*(heightMap->w )];
183                 g = (float)colours[3*j+1 + 3*i*(heightMap->w)];
184                 b = (float)colours[3*j+0 + 3*i*(heightMap->w)];
185                 }
186
187                model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right
188                model->addNormal(normalVectorField[i][j].y,normalVectorField[i][j].z,normalVectorField[i][j].x);
189                model->addTexCoor(((j/sampleRate)%texRate)/texRatef,(((i - sampleRate)/sampleRate)%texRate)/texRatef);
190                model->addColor(r/255.0,g/255.0,b/255.0);
191
192            }
193
194                for(int j = j1  ; j <= j2    ;  j += sampleRate)
195            {
196                int i = i1;
197                height =  hm->heights[j+sampleRate + i*(heightMap->w )];
198                model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right
199                model->addNormal(normalVectorField[i][j].y,normalVectorField[i][j].z,normalVectorField[i][j].x);
200                model->addTexCoor(((j/sampleRate)%texRate)/texRatef,(((i)/sampleRate)%texRate)/texRatef);
201                model->addColor(r/255.0,g/255.0,b/255.0);
202
203            }
204
205
206
207            for(int j = j1  ; j <= j2    ;  j += sampleRate)
208            {
209                int i = i2;
210
211                 // To be fixed
212                 if(hm->hasColourMap)
213                 {
214                 r = (float)colours[3*j+2 + 3*i*(heightMap->w )];
215                 g = (float)colours[3*j+1 + 3*i*(heightMap->w)];
216                 b = (float)colours[3*j+0 + 3*i*(heightMap->w)];
217                 }
218
219                model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right
220                model->addNormal(normalVectorField[i][j].y,normalVectorField[i][j].z,normalVectorField[i][j].x);
221                model->addTexCoor(((j/sampleRate)%texRate)/texRatef,(((i- sampleRate)/sampleRate)%texRate)/texRatef);
222                model->addColor(r/255.0,g/255.0,b/255.0);
223
224            }
225
226
227            for(int j = j1 ; j <= j2    ;  j += sampleRate)
228            {
229                int i = i2;
230                height =  hm->heights[j+sampleRate + i*(heightMap->w )];
231                model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right
232                model->addNormal(normalVectorField[i][j].y,normalVectorField[i][j].z,normalVectorField[i][j].x);
233                model->addTexCoor(((j/sampleRate)%texRate)/texRatef,((i/sampleRate)%texRate)/texRatef);
234                model->addColor(r/255.0,g/255.0,b/255.0);
235
236            }
237
238
239
240
241         // link Boarder Stripe
242            for(int j = j1-sampleRate  ; j < j2    ;  j += sampleRate)
243            {
244
245                model->addIndice(cnt);
246                model->addIndice(cnt  + (j2 -j1 +  sampleRate  )/ sampleRate );
247                cnt++;
248
249            }
250
251                cnt++;
252
253                 model->newStripe();
254
255
256
257
258
259         cnt += (j2-j1)/ sampleRate;
260
261        // link 2nd BoarderStripe
262            for(int j = j1-sampleRate  ; j < j2    ;  j += sampleRate)
263            {
264
265                model->addIndice(cnt);
266                model->addIndice(cnt  + (j2 -j1 +  sampleRate  )/ sampleRate );
267                cnt++;
268
269            }
270
271
272
273         model->finalize();
274
275
276
277
278        #undef heightMap
279        #undef colours
280        #undef scaleX
281        #undef scaleY
282        #undef scaleZ
283        #undef shiftX
284        #undef shiftY
285        #undef shiftZ
286        #undef normalVectorField
287
288}
289
290HeightMap::HeightMap()
291{
292
293}
294
295HeightMap::HeightMap(const char* height_map_name = NULL) : VertexArrayModel()
296{
297   this->setClassID(CL_HEIGHT_MAP, "HeightMap");
298   heightMap =  IMG_Load(height_map_name);
299   if(heightMap!=NULL) {
300
301                 PRINTF(0)("loading Image %s\n", height_map_name);
302                 PRINTF(0)("width : %i\n", heightMap->w);
303                 PRINTF(0)("height : %i\n", heightMap->h);
304                 PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel);
305                 PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift);
306                 PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift);
307                 PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift);
308                 PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask);
309                 PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask);
310                }
311
312     else       PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name);
313
314
315  generateNormalVectorField();
316
317  shiftX = 0;
318  shiftY = 0;
319  shiftZ = 0;
320
321}
322
323HeightMap::HeightMap(const char* height_map_name = NULL, const char* colour_map_name = NULL) : VertexArrayModel()
324{
325this->setClassID(CL_HEIGHT_MAP, "HeightMap");
326
327   heightMap =  IMG_Load(height_map_name);
328   if(heightMap!=NULL) {
329
330                 PRINTF(0)("loading Image %s\n", height_map_name);
331                 PRINTF(0)("width : %i\n", heightMap->w);
332                 PRINTF(0)("height : %i\n", heightMap->h);
333                 PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel);
334                 PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift);
335                 PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift);
336                 PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift);
337                 PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask);
338                 PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask);
339                }
340
341     else       PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name);
342
343
344    generateNormalVectorField();
345
346  colourMap=NULL;
347  if(colour_map_name != NULL)
348  {
349  colourMap = IMG_Load(colour_map_name);
350  }
351  if(colourMap != NULL)
352                {
353                 PRINTF(0)("loading Image %s\n", colour_map_name);
354                 PRINTF(0)("width : %i\n", colourMap->w);
355                 PRINTF(0)("height : %i\n", colourMap->h);
356                 PRINTF(0)("%i Byte(s) per Pixel \n", colourMap->format->BytesPerPixel);
357                 PRINTF(0)("Rshift : %i\n", colourMap->format->Rshift);
358                 PRINTF(0)("Bshift: %i\n", colourMap->format->Bshift);
359                 PRINTF(0)("Gshift: %i\n", colourMap->format->Gshift);
360                 PRINTF(0)("Rmask: %i\n", colourMap->format->Rmask);
361                 PRINTF(0)("Gmask: %i\n", colourMap->format->Gmask);
362                 }
363                 else       PRINTF(0)("oops! couldn't load colorMap for some reason.\n");
364
365
366
367  if(colourMap != NULL)
368  {
369  colours = (unsigned char *) colourMap->pixels;
370  hasColourMap = true;
371  }
372  else hasColourMap = false;
373
374
375   heights  = (unsigned char*) heightMap->pixels;
376
377
378}
379HeightMap::~HeightMap()
380{
381        delete heightMap;
382}
383
384void HeightMap::load()
385{
386
387//Create a Dynamicly sized 2D-Array for Tiles
388tiles =  new Tile** [heightMap->h/tileSize];
389for(int i=0;i <    heightMap->h/tileSize ; i++)
390tiles [i]= new (Tile* [heightMap->w /tileSize ]);
391
392//SetUp Arrays
393for(int i = 0; i < (heightMap->h - tileSize )/ tileSize; i ++)
394{
395        for(int j = 0; j < (heightMap->w - tileSize )/ tileSize; j ++)
396        {
397
398         tiles[i][j] =    new Tile( i*tileSize ,  j*tileSize , (i+1)*tileSize, (j+1)*tileSize , this ) ;
399        }
400}
401
402}
403
404
405void HeightMap::draw()
406{
407const PNode* camera = State::getCamera();
408Vector v = camera->getAbsCoor();
409
410int i_min = 1;
411int i_max = (heightMap->h - tileSize)/ tileSize;
412int j_min = 1;
413int j_max= (heightMap->w - tileSize) / tileSize;
414
415// calc i_min , i_max j_min and j_maxt
416
417int centerX =  (int)((heightMap->h - ((v.x - shiftX)/ (float)scaleX ))/ tileSize);
418int  centerY = (int)((v.z - shiftZ)/ (float)scaleZ )/ tileSize;
419//PRINTF(0)("i_max %i \n" , i_max);
420//PRINTF(0)("CENTERY %i \n ",centerY );
421i_min = max(centerX  -1, i_min);
422i_max = min(centerX +2 , i_max );
423
424j_min = max(centerY -1,1);
425j_max = min(centerY +2, j_max);
426
427
428for(int i = 1; i <  i_min        ; i ++)
429{
430        for(int j = 1; j < j_max ; j++)
431        {
432
433         tiles[i][j]->drawLowRes();
434        }
435}
436for(int i = i_min; i <  i_max    ; i ++)
437{
438        for(int j = j_min; j < j_max ; j++)
439        {
440
441         tiles[i][j]->drawHighRes();
442        }
443}
444
445for(int i = i_max; i <  (heightMap->h -tileSize)/tileSize        ; i ++)
446{
447        for(int j = 1; j < j_max ; j++)
448        {
449
450         tiles[i][j]->drawLowRes();
451        }
452}
453
454
455for(int i = 1; i < (heightMap->h -tileSize)/tileSize; i++ )
456{
457        for(int j = 1; j < j_min; j++)
458        {
459         tiles[i][j]->drawLowRes();
460        }
461}
462for(int i = 1; i < (heightMap->h -tileSize)/tileSize; i++)
463{
464        for(int j = j_max; j < (heightMap->w -tileSize)/tileSize; j++ )
465        {
466        tiles[i][j]->drawLowRes();
467        }
468}
469
470}
471void HeightMap::generateNormalVectorField()
472{
473int delta = 1;
474heights  = (unsigned char*) heightMap->pixels;
475
476//Create a Dynamicly sized 2D-Array to store our normals
477normalVectorField =  new Vector* [heightMap->h];
478for(int i=0;i<heightMap->h;i++)
479normalVectorField [i]= new (Vector [heightMap->w]);
480
481
482
483// !!! Does not yet calculate the normals of some border points!!!!!
484
485if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 )
486        {
487        SDL_LockSurface(heightMap);
488        for(int i = 0 ; i < heightMap->h - 1  ; i ++)
489        {
490            for(int j = 0; j < heightMap->- 1  ;  j ++)
491            {
492
493
494                delta = (int)heights[j + (i+1)*(heightMap->w )] -  (int) heights[j + i*(heightMap->w )];
495                Vector a =  Vector(-scaleX,(float)delta*scaleY  ,0.0f);
496
497                delta = (int)heights[j+1 + i*(heightMap->w )] - (int)heights[j + i*(heightMap->w )];
498                Vector b =  Vector(0.0f,(float) delta*scaleY ,scaleZ);
499
500
501                 normalVectorField[i][j] = b.cross(a);
502                 normalVectorField[i][j].normalize();
503
504             }
505        }
506        SDL_UnlockSurface(heightMap);
507
508}
509
510}
511
512
513
514
515
516void HeightMap::scale(Vector v)
517{
518 scaleX = v.x;
519 scaleY = v.y;
520 scaleZ = v.z;
521}
522
523void HeightMap::shift(Vector v)
524{
525 shiftX = v.x;
526 shiftY = v.y;
527 shiftZ = v.z;
528}
529
530
531float HeightMap::getHeight(float x, float y)
532{
533 int xInt = (int)x / scaleX;  x -= (float)xInt*scaleX; xInt = heightMap->h - xInt;
534 int yInt = (int)y / scaleZ;    y -= (float)yInt*scaleZ;
535 if(xInt <= 0 || xInt >= heightMap->h || yInt <= 0 || yInt >= heightMap->) return 0.0f;
536 float height = heights[yInt + (xInt)*heightMap->w]*scaleY;
537 float a = normalVectorField[(xInt)][yInt].x;
538 float b = normalVectorField [(xInt)][yInt].z;
539 float c = normalVectorField [(xInt)][yInt].y;
540  height -= ( (a/c)*(x) + (b/c)*(y))*scaleY;
541 return height;
542}
Note: See TracBrowser for help on using the repository browser.