Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/importer/height_map.cc @ 7530

Last change on this file since 7530 was 7526, checked in by patrick, 19 years ago

orxonox: work flush on hm

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