Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/lib/graphics/importer/height_map.cc @ 9788

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

renamed newclassid to classid and newobjectlist to objectlist

  • Property svn:executable set to *
File size: 20.8 KB
RevLine 
[5942]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:
[6956]12   main-programmer: bottac@ee.ethz.ch
[7468]13
14   review: patrick boenzli, patrick@orxonox.ethz.ch
[5942]15*/
16
17#include "height_map.h"
18#include "model.h"
[5967]19#include "texture.h"
20#include "vector.h"
[6956]21#include "material.h"
22#include "p_node.h"
23#include "state.h"
[7193]24#include "util/loading/resource_manager.h"
[5967]25#include "debug.h"
26
27// INCLUDING SDL_Image
28#ifdef HAVE_SDL_IMAGE_H
29#include <SDL_image.h>
30#else
31#include <SDL/SDL_image.h>
32#endif
33
[7467]34
[7468]35/**
36 * default constructor
[7499]37 *  @param xOffset
[7468]38 */
[7499]39Tile::Tile(int xOffset, int yOffset, int i2, int j2, HeightMap* heightMapReference )
[5942]40{
[7499]41  PRINTF(0)("Tile Constructor\n");
[7490]42
[7469]43  this->highResModel = new VertexArrayModel();
44  this->lowResModel  = new VertexArrayModel();
[6956]45
[7469]46  this->heightMapReference = heightMapReference;
47
48  // create high res model
[7499]49  this->load(xOffset, yOffset, i2, j2, this->highResModel, 4);
[7469]50  // create low res model
[7499]51  this->load(xOffset, yOffset, i2, j2, this->lowResModel, 8);
[6956]52}
53
[7468]54
[6956]55Tile::~Tile()
56{
[7468]57  if( highResModel)
58    delete highResModel;
59  if( lowResModel)
60    delete lowResModel;
[6956]61}
62
[7468]63
[7469]64/**
65 * this darws the tile in diefferent resolutions
66 */
[6956]67void Tile::draw()
68{
[7468]69  // draw the tile depending on the distance from the camera with different LOD (level of details)
70  float cameraDistance = fabs((State::getCameraNode()->getAbsCoor() - Vector(this->x, heightMapReference->offsetY , this->z) ).len());
71
72  if (cameraDistance < HM_LOD_HIGH_RES )
[7467]73  {
[7468]74    this->drawHighRes();
[7467]75  }
[7468]76  else if( cameraDistance < HM_LOD_LOW_RES)
[7467]77  {
78    this->drawLowRes();
79  }
[6956]80}
81
82
[7469]83/**
84 * loads a tile
85 */
[7499]86void Tile::load(int xOffset, int yOffset, int i2, int j2, VertexArrayModel* model, int sampleRate)
[6956]87{
88
[7469]89// #define heightMap this->heightMapReference->heightMap
[7490]90#define colors   this->heightMapReference->colors
[7469]91#define scaleX this->heightMapReference->scaleX
92#define scaleY this->heightMapReference->scaleY
93#define scaleZ this->heightMapReference->scaleZ
94#define shiftX this->heightMapReference->shiftX
95#define shiftY this->heightMapReference->shiftY
96#define shiftZ this->heightMapReference->shiftZ
97#define normalVectorField this->heightMapReference->normalVectorField
[6956]98
[7482]99
[7490]100  //FIXME: OLD implementation
[7499]101  this->x = this->heightMapReference->offsetX + ( this->heightMapReference->heightMap->h - ((xOffset + i2) / 2)) * scaleX;
102  this->z = this->heightMapReference->offsetZ + ((yOffset + j2 ) / 2 ) * scaleZ;
[7490]103  //NEW:
[7499]104  this->setAbsCoor(this->heightMapReference->offsetX + ( this->heightMapReference->heightMap->h - ((xOffset + i2) / 2)) * scaleX,
[7490]105                   0,
[7499]106                   this->heightMapReference->offsetZ + ((yOffset + j2 ) / 2 ) * scaleZ);
[7014]107
[7490]108
[7467]109  float height = 0;
[7014]110
[7467]111  float r = 0.0;
112  float g = 0.0;
113  float b = 0.0;
[7014]114
115
[7490]116  //if( this->heightMapReference->heightMap != NULL && this->heightMapReference->heightMap->format->BitsPerPixel == 8 )
[7014]117
[7469]118  SDL_LockSurface(this->heightMapReference->heightMap);
[7490]119  SDL_LockSurface(this->heightMapReference->colorMap);
[6956]120
[7499]121  for( int i = xOffset ; i <= i2  ; i +=sampleRate)
[7467]122  {
123    int w = 0;
[6956]124
[7490]125    // adjust the colors acoring to the color map
126    if( this->heightMapReference->hasColourMap)
[7467]127    {
[7492]128      r = colors[3 * w + 2 + 3 * i * this->heightMapReference->heightMap->w];
129      g = colors[3 * w + 1 + 3 * i * this->heightMapReference->heightMap->w];
130      b = colors[3 * w + 0 + 3 * i * this->heightMapReference->heightMap->w];
[7467]131    }
[7014]132
[7499]133    w = yOffset;
[7491]134
[8068]135//    PRINTF(0)("Values: i = %i, w = %i\n", i, w);
[7499]136
[7491]137    // add a vertex to the list
[7499]138    model->addVertex(scaleX * (this->heightMapReference->heightMap->h - i) + shiftX, shiftY, scaleZ * w + shiftZ); // Top Right
[7491]139    model->addNormal(normalVectorField[i % this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].y,
140                     normalVectorField[i % this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].z,
141                     normalVectorField[i % this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].x);
[7500]142    model->addTexCoor((float)(yOffset-sampleRate) /(HM_TEX_RATE), (float)(i %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7492]143    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7014]144
145
[7499]146    for(int j = yOffset; j <= j2; j += sampleRate)
[7467]147    {
[7491]148      // adjust the colors acording to the color map
149      if( this->heightMapReference->hasColourMap)
[7467]150      {
[7492]151        r = colors[3 * j + 2 + 3 * i * this->heightMapReference->heightMap->w];
152        g = colors[3 * j + 1 + 3 * i * this->heightMapReference->heightMap->w];
153        b = colors[3 * j + 0 + 3 * i * this->heightMapReference->heightMap->w];
[7467]154      }
[7491]155      height =  (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * (this->heightMapReference->heightMap->w)];
156      height += (float)(unsigned char)this->heightMapReference->heights[j + 1 + sampleRate + (i + 1) *
[7494]157                                                                        this->heightMapReference->heightMap->w];
[7491]158      height += (float)(unsigned char)this->heightMapReference->heights[j - 1 + sampleRate + (i + 1) *
[7494]159                                                                        this->heightMapReference->heightMap->w];
[7491]160      height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + (i + 2) *
[7494]161                                                                        this->heightMapReference->heightMap->w];
[7491]162      height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * (this->heightMapReference->heightMap->w)];
163      height /= 5.0;
[7014]164
[7492]165      model->addVertex(scaleX * (this->heightMapReference->heightMap->h -i) + shiftX ,
166                       ((double)(height)*scaleY) + shiftY ,
167                       scaleZ*(j) + shiftZ); // Top Right
168      model->addNormal(normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].y,
169                       normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].z,
170                       normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].x);
[7500]171      model->addTexCoor((float)(j) /(HM_TEX_RATE), (float)(i %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7492]172      model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7469]173      //PRINTF(0)("TexCoord:  %f %f \n",(float)j / 100.0, (float)(i %this->heightMapReference->h)/100.0);
[7014]174
[7467]175      w = j;
176    }
[7469]177    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right
[7494]178    model->addNormal(normalVectorField[i % this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].y,
179                     normalVectorField[i % this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].z,
180                     normalVectorField[i% this->heightMapReference->heightMap->h][w % this->heightMapReference->heightMap->w].x);
[7500]181    model->addTexCoor((float)(j2+sampleRate) /(HM_TEX_RATE), (float)(i %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7494]182    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7467]183  }
[7014]184
[7469]185  SDL_UnlockSurface(this->heightMapReference->heightMap);
[7467]186  int cnt = 0;
[7492]187
[7499]188  for( int i = xOffset; i < i2; i +=sampleRate)
[7467]189  {
[7499]190    for( int j = yOffset-sampleRate; j < j2  + 2 * sampleRate; j += sampleRate)
[7467]191    {
192      model->addIndice(cnt);
[7499]193      model->addIndice(cnt  + (j2 -yOffset + 3* sampleRate  )/ sampleRate );
[7467]194      cnt++;
195    }
196    model->newStripe();
197  }
[7499]198  cnt += (j2 -yOffset + 3* sampleRate)/ sampleRate;
[7014]199
[7499]200  for( int j = yOffset; j <= j2; j += sampleRate)
[7467]201  {
[7499]202    int i = xOffset;
[7014]203
[7467]204    // To be fixed
[7469]205    if(this->heightMapReference->hasColourMap)
[7467]206    {
[7492]207      r = (float)colors[3 * j + 2 + 3 * i * this->heightMapReference->heightMap->w];
208      g = (float)colors[3 * j + 1 + 3 * i * this->heightMapReference->heightMap->w];
209      b = (float)colors[3 * j + 0 + 3 * i * this->heightMapReference->heightMap->w];
[7467]210    }
[7014]211
[7492]212    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i) + shiftX ,
213                     shiftY ,
214                     scaleZ*(j) + shiftZ); // Top Right
215    model->addNormal(normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].y,
216                     normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].z,
217                     normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].x);
[7500]218    model->addTexCoor((float)j /(HM_TEX_RATE), (float)((i - sampleRate) %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7492]219    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7467]220  }
[7014]221
[7494]222
[7499]223  for(int j = yOffset  ; j <= j2    ;  j += sampleRate)
[7467]224  {
[7499]225    int i = xOffset;
[7494]226    height =  (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * this->heightMapReference->heightMap->w];
227    height += (float)(unsigned char)this->heightMapReference->heights[j + 1 + sampleRate + (i + 1) *
228                                                                      this->heightMapReference->heightMap->w];
229    height += (float)(unsigned char)this->heightMapReference->heights[j - 1 + sampleRate + (i + 1) *
230                                                                      this->heightMapReference->heightMap->w];
231    height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + (i + 2) *
232                                                                      this->heightMapReference->heightMap->w];
233    height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * this->heightMapReference->heightMap->w];
[7467]234    height=height/5.0;
[7014]235
[7494]236    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i) + shiftX ,
237                     ((double)(height)*scaleY) +shiftY ,
238                     scaleZ*(j) + shiftZ); // Top Right
239    model->addNormal(normalVectorField[i % this->heightMapReference->heightMap->h][j % this->heightMapReference->heightMap->w].y,
240                     normalVectorField[i % this->heightMapReference->heightMap->h][j% this->heightMapReference->heightMap->w].z,
241                     normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].x);
[7500]242    model->addTexCoor((float)j /(HM_TEX_RATE), (float)(i %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7494]243    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7467]244  }
[7014]245
246
[7499]247  for(int j = yOffset; j <= j2; j += sampleRate)
[7467]248  {
249    int i = i2;
250    // To be fixed
[7494]251    if( this->heightMapReference->hasColourMap)
[7467]252    {
[7494]253      r = (float)colors[3 * j + 2 + 3 * i * this->heightMapReference->heightMap->w];
254      g = (float)colors[3 * j + 1 + 3 * i * this->heightMapReference->heightMap->w];
255      b = (float)colors[3 * j + 0 + 3 * i * this->heightMapReference->heightMap->w];
[7467]256    }
[7014]257
[7494]258    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i) + shiftX ,
259                     shiftY ,
260                     scaleZ*(j) + shiftZ); // Top Right
261    model->addNormal(normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].y,
262                     normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].z,
263                     normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].x);
[7500]264    model->addTexCoor((float)j /(HM_TEX_RATE), (float)((i+ sampleRate) %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7494]265    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7467]266  }
[7014]267
268
[7499]269  for(int j = yOffset; j <= j2; j += sampleRate)
[7467]270  {
271    int i = i2;
[7494]272    height =  (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * this->heightMapReference->heightMap->w];
273    height += (float)(unsigned char)this->heightMapReference->heights[j + 1 + sampleRate + (i + 1)
274                                                                      * this->heightMapReference->heightMap->w];
[7496]275    height += (float)(unsigned char)this->heightMapReference->heights[j - 1 + sampleRate + (i + 1) *
276                                                                      this->heightMapReference->heightMap->w];
277    height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + (i + 2) *
278                                                                      this->heightMapReference->heightMap->w];
279    height +=  (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * this->heightMapReference->heightMap->w];
280    height /= 5.0;
281    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i) + shiftX ,
282                     ((double)(height)*scaleY) +shiftY ,
283                     scaleZ*(j) + shiftZ); // Top Right
284    model->addNormal(normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].y,
285                     normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].z,
286                     normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].x);
[7500]287    model->addTexCoor((float)j /(HM_TEX_RATE), (float)(i %this->heightMapReference->heightMap->h)/(HM_TEX_RATE));
[7496]288    model->addColor(r/255.0f, g/255.0f, b/255.0f);
[7467]289  }
[7014]290
[7467]291  // link Boarder Stripe
[7499]292  for(int j = yOffset - sampleRate; j < j2; j += sampleRate)
[7467]293  {
294    model->addIndice(cnt);
[7499]295    model->addIndice(cnt + (j2 - yOffset + sampleRate) / sampleRate );
[7467]296    cnt++;
297  }
298  cnt++;
[7014]299
[7496]300
[7467]301  model->newStripe();
[7014]302
303
[7499]304  cnt += (j2-yOffset)/ sampleRate;
[7467]305  // link 2nd BoarderStripe
[7499]306  for(int j = yOffset-sampleRate; j < j2;  j += sampleRate)
[7467]307  {
308    model->addIndice(cnt);
[7499]309    model->addIndice(cnt + (j2 - yOffset + sampleRate) / sampleRate);
[7467]310    cnt++;
311  }
[7014]312
[7490]313  SDL_UnlockSurface(this->heightMapReference->colorMap);
[7014]314
[7467]315  model->finalize();
[7014]316
[7469]317// #undef heightMap
[7490]318        #undef colors
[7014]319        #undef scaleX
320        #undef scaleY
321        #undef scaleZ
322        #undef shiftX
323        #undef shiftY
324        #undef shiftZ
325        #undef normalVectorField
[5942]326}
327
[7469]328
[9715]329ObjectListDefinition(HeightMap);
[6956]330
[7469]331
[7498]332/**
333 * constructor
334 *  @param heightMapName file name of the height map
335 */
[7497]336HeightMap::HeightMap(const std::string& heightMapName)
[7467]337    : VertexArrayModel()
[6956]338{
[7497]339  this->init(heightMapName);
[6956]340
[7497]341  this->colorMap = NULL;
[6956]342}
343
[7498]344
345/**
346 * constructor
347 *  @param heightMapName file name of the height map
348 *  @param colorMapName file name of the color map
349 */
[7497]350HeightMap::HeightMap(const std::string& heightMapName, const std::string& colorMapName)
[7467]351    : VertexArrayModel()
[6956]352{
[7497]353  this->init(heightMapName);
[6956]354
[7497]355  this->colorMap = IMG_Load(colorMapName.c_str());
356  if( this->colorMap != NULL)
[6956]357  {
[7497]358    PRINTF(0)("loading Image %s\n", colorMapName.c_str());
359    PRINTF(0)("width : %i\n", this->colorMap->w);
360    PRINTF(0)("height : %i\n", this->colorMap->h);
361    PRINTF(0)("%i Byte(s) per Pixel \n", this->colorMap->format->BytesPerPixel);
362    PRINTF(0)("Rshift : %i\n", this->colorMap->format->Rshift);
363    PRINTF(0)("Bshift: %i\n", this->colorMap->format->Bshift);
364    PRINTF(0)("Gshift: %i\n", this->colorMap->format->Gshift);
365    PRINTF(0)("Rmask: %i\n", this->colorMap->format->Rmask);
366    PRINTF(0)("Gmask: %i\n", this->colorMap->format->Gmask);
[7498]367
368    this->colors = (unsigned char *) colorMap->pixels;
369    this->hasColourMap = true;
[6956]370  }
[7467]371  else
[7498]372  {
[7467]373    PRINTF(0)("oops! couldn't load colorMap for some reason.\n");
[7498]374    this->hasColourMap = false;
[6956]375  }
[5967]376}
377
378
[7498]379/**
380 * deconstructor
381 */
[5967]382HeightMap::~HeightMap()
383{
[7526]384  if( heightMap)
385    delete heightMap;
386  if( colorMap)
387    delete colorMap;
[6956]388
[7526]389  if( this->tiles)
[7467]390  {
[7526]391    for( int i = 0; i < heightMap->h / HM_TILE_SIZE; i++) {
392      for( int j = 0; j < heightMap->w / HM_TILE_SIZE; j++) {
393        delete tiles [i][j];
394      }
[7467]395    }
[7526]396
397    for( int i = 0; i < heightMap->h / HM_TILE_SIZE; i++)
398      delete[] tiles[i];
399    delete[] tiles;
[7467]400  }
[6956]401
[7526]402  if( this->normalVectorField)
403  {
404    for(int i = 0; i < heightMap->h; i++)
405      delete[] normalVectorField[i];
406    delete[] normalVectorField;
407  }
[7497]408}
[6956]409
410
[7526]411/**
412 * this is the init function with stuff shared between all constructors
413 */
[7497]414void HeightMap::init(const std::string& heightMapName)
415{
[9684]416  this->registerObject(this, HeightMap::_objectList);
[6956]417
[7497]418  this->shiftX = 0;
419  this->shiftY = 0;
420  this->shiftZ = 0;
[7014]421
[7497]422  heightMap =  IMG_Load(heightMapName.c_str());
423  if( heightMap != NULL)
424  {
425    /*
426    WHAT about following checks:
427    - image size (rectangular?)
428    - image file type (bw?)
429    */
430    PRINTF(1)("loading Image %s\n", heightMapName.c_str());
431    PRINTF(1)("width : %i\n", heightMap->w);
432    PRINTF(1)("height : %i\n", heightMap->h);
433    PRINTF(1)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel);
434    PRINTF(1)("Rshift : %i\n", heightMap->format->Rshift);
435    PRINTF(1)("Bshift: %i\n", heightMap->format->Bshift);
436    PRINTF(1)("Gshift: %i\n", heightMap->format->Gshift);
437    PRINTF(1)("Rmask: %i\n", heightMap->format->Rmask);
438    PRINTF(1)("Gmask: %i\n", heightMap->format->Gmask);
439  }
440  else
441    PRINTF(1)("oops! couldn't load %s for some reason.\n", heightMapName.c_str());
[7014]442
[7526]443  this->generateNormalVectorField();
[7498]444
445  this->heights = (unsigned char*)heightMap->pixels;
[5967]446}
447
[7497]448
[7498]449/**
450 * this function loads the heightmap by creatin tiles
451 */
[5942]452void HeightMap::load()
453{
[7499]454  // create a dynamicly sized 2D-array for tiles
[7500]455  this->tiles =  new Tile**[this->heightMap->h / HM_TILE_SIZE];
[5967]456
[7500]457  for( int i = 0;i < heightMap->h / HM_TILE_SIZE; i++)
458    this->tiles [i]= new Tile*[this->heightMap->w / HM_TILE_SIZE];
[7014]459
[7499]460  // setup arrays
[7500]461  for( int i = 0; i < this->heightMap->h / HM_TILE_SIZE; i++)  {
462    for( int j = 0; j < this->heightMap->w / HM_TILE_SIZE; j++) {
463      this->tiles[i][j] = new Tile( i * HM_TILE_SIZE ,  j * HM_TILE_SIZE , (i+1) * HM_TILE_SIZE, (j+1) * HM_TILE_SIZE , this);
[7467]464    }
465  }
[6956]466}
[5993]467
468
[7498]469/**
470 * this function draws the height map
471 */
472void HeightMap::draw() const
[6956]473{
[7526]474  Vector v = State::getCameraNode()->getAbsCoor();
[6956]475
[7500]476  int i_max = (heightMap->h )/ HM_TILE_SIZE;
477  int j_max= (heightMap->) / HM_TILE_SIZE;
[6956]478
479
480
[7526]481  /* process the draw command to the tiles, FIXME: think of something more efficient*/
482  for( int i = 0; i < i_max; i++)  {
483    for( int j = 0; j < j_max; j++)  {
[7467]484      tiles[i][j]->draw();
485    }
486  }
[7498]487}
[5980]488
[7498]489
490/**
491 * this function generates the normal vector field
492 */
[6956]493void HeightMap::generateNormalVectorField()
494{
[7467]495  int delta = 1;
496  heights  = (unsigned char*) heightMap->pixels;
[6956]497
[7467]498  //Create a Dynamicly sized 2D-Array to store our normals
499  normalVectorField =  new Vector* [heightMap->h];
500  for(int i=0;i<heightMap->h;i++)
501    normalVectorField [i]= new (Vector [heightMap->w]);
[6956]502
[7467]503  // Initialize
504  for(int i=0; i< heightMap->h; i++)
505  {
506    for(int j = 0; j> heightMap->w; j++)
507    {
508      Vector v = Vector(0.0, 1.0, 0.0);
509      normalVectorField[i][j] = v;
510    }
511  }
[5967]512
[7467]513  // !!! Does not yet calculate the normals of some border points!!!!!
[5990]514
[7467]515  if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 )
516  {
517    SDL_LockSurface(heightMap);
518    for(int i = 0 ; i < heightMap->h - 1  ; i ++)
519    {
520      for(int j = 0; j < heightMap->- 1  ;  j ++)
521      {
[5942]522
523
[7467]524        delta = (int)heights[j + (i+1)*(heightMap->w )] -  (int) heights[j + i*(heightMap->w )];
525        Vector a =  Vector(-scaleX,(float)delta*scaleY  ,0.0f);
[5942]526
[7467]527        delta = (int)heights[j+1 + i*(heightMap->w )] - (int)heights[j + i*(heightMap->w )];
528        Vector b =  Vector(0.0f,(float) delta*scaleY ,scaleZ);
[5942]529
[6956]530
[7467]531        normalVectorField[i][j] = b.cross(a);
532        normalVectorField[i][j].normalize();
[5942]533
[7467]534      }
535    }
536    SDL_UnlockSurface(heightMap);
[7014]537
[7467]538  }
[5942]539}
[6956]540
541
[7498]542/**
543 * scales the height map about a vector
544 *  @param v scaling vector
545 */
[6956]546void HeightMap::scale(Vector v)
547{
[7467]548  scaleX = v.x;
549  scaleY = v.y;
550  scaleZ = v.z;
551  generateNormalVectorField();
[6956]552}
553
[7498]554
555/**
556 * sets the absolute coordinates of the height map
557 *  @param v the moving vector
558 */
[6956]559void HeightMap::setAbsCoor(Vector v)
560{
[7467]561  offsetX = v.x;
562  offsetY = v.y;
[7498]563  offsetZ = v.z;
[6956]564}
565
566
[7498]567/**
568 * returns the height at a given 2D coordinate
569 *  @param x x coordinate of the height map (world space)
570 *  @param y y coordinate of the height map (world space)
571 *  @return the height (z)
572 */
[7014]573float HeightMap::getHeight(float x, float y)
[6956]574{
[7467]575  x -= offsetX;
576  y -= offsetZ;
[7014]577
[7497]578  int xInt = (int)( x / scaleX);
[7467]579  x -= (float)((int)x);
580  xInt = heightMap->h - xInt;
[7497]581  int yInt = (int)( y / scaleZ);
[7467]582  y -= (float) ((int) y); /*yInt = heightMap->w - yInt;*/
[7014]583
[7467]584  //PRINTF(0)("xInt: %i, yInt: %i, x: %f, y: %f\n", xInt, yInt, x, y);
[7014]585
[7467]586  if(xInt <= 0 || xInt >= heightMap->h || yInt <= 0 || yInt >= heightMap->)
587    return 0;
588  if( y >= 0.5*x)
589  {
590    // Check for ...
591  }
[6956]592
[7467]593  float height = heights[yInt + (xInt)*heightMap->w]*scaleY;
[7014]594
[7467]595  float a = normalVectorField[(xInt)][yInt].x;
596  float b = normalVectorField [(xInt)][yInt].z;
597  float c = normalVectorField [(xInt)][yInt].y;
[7014]598
[8068]599//  PRINTF(0)("a: %f \n" ,a);
600//  PRINTF(0)("b: %f \n" ,b);
601//  PRINTF(0)("c: %f \n" ,c);
[7014]602
[7954]603
[7467]604  height -= ( (a/c)*(x) + (b/c)*(y));
[7014]605
[7954]606  // PRINTF(0)("height: %f \n" ,height );
[7467]607  return (height + offsetZ);
[7954]608
[6956]609}
Note: See TracBrowser for help on using the repository browser.