Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/new_class_id: almost killed off the old ResourceManager

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