Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 7494 was 7494, checked in by patrick, 18 years ago

resuming work on the hm

  • Property svn:executable set to *
File size: 19.9 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 i1
38 */
39Tile::Tile(int i1, int j1, int i2, int j2, HeightMap* heightMapReference )
40{
41  PRINTF(4)("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(i1, j1, i2, j2, this->highResModel, 4);
50  // create low res model
51  this->load(i1, j1, 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 i1, int j1, 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 - ((i1 + i2) / 2)) * scaleX;
102  this->z = this->heightMapReference->offsetZ + ((j1 + j2 ) / 2 ) * scaleZ;
103  //NEW:
104  this->setAbsCoor(this->heightMapReference->offsetX + ( this->heightMapReference->heightMap->h - ((i1 + i2) / 2)) * scaleX,
105                   0,
106                   this->heightMapReference->offsetZ + ((j1 + 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 = i1 ; 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 = j1;
135
136    // add a vertex to the list
137    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right
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);
141    model->addTexCoor((float)(j1-sampleRate) /(texRate), (float)(i %this->heightMapReference->heightMap->h)/(texRate));
142    model->addColor(r/255.0f, g/255.0f, b/255.0f);
143
144
145    for(int j = j1; j <= j2; j += sampleRate)
146    {
147      // adjust the colors acording to the color map
148      if( this->heightMapReference->hasColourMap)
149      {
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];
153      }
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) *
156                                                                        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 + sampleRate + (i + 2) *
160                                                                        this->heightMapReference->heightMap->w];
161      height += (float)(unsigned char)this->heightMapReference->heights[j + sampleRate + i * (this->heightMapReference->heightMap->w)];
162      height /= 5.0;
163
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);
170      model->addTexCoor((float)(j) /(texRate), (float)(i %this->heightMapReference->heightMap->h)/(texRate));
171      model->addColor(r/255.0f, g/255.0f, b/255.0f);
172      //PRINTF(0)("TexCoord:  %f %f \n",(float)j / 100.0, (float)(i %this->heightMapReference->h)/100.0);
173
174      w = j;
175    }
176    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right
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);
180    model->addTexCoor((float)(j2+sampleRate) /(texRate), (float)(i %this->heightMapReference->heightMap->h)/(texRate));
181    model->addColor(r/255.0f, g/255.0f, b/255.0f);
182  }
183
184  SDL_UnlockSurface(this->heightMapReference->heightMap);
185  int cnt = 0;
186
187  for( int i = i1; i < i2; i +=sampleRate)
188  {
189    for( int j = j1-sampleRate; j < j2  + 2 * sampleRate; j += sampleRate)
190    {
191      model->addIndice(cnt);
192      model->addIndice(cnt  + (j2 -j1 + 3* sampleRate  )/ sampleRate );
193      cnt++;
194    }
195    model->newStripe();
196  }
197  cnt += (j2 -j1 + 3* sampleRate)/ sampleRate;
198
199  for( int j = j1; j <= j2; j += sampleRate)
200  {
201    int i = i1;
202
203    // To be fixed
204    if(this->heightMapReference->hasColourMap)
205    {
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];
209    }
210
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);
217    model->addTexCoor((float)j /(texRate), (float)((i - sampleRate) %this->heightMapReference->heightMap->h)/(texRate));
218    model->addColor(r/255.0f, g/255.0f, b/255.0f);
219  }
220
221
222  for(int j = j1  ; j <= j2    ;  j += sampleRate)
223  {
224    int i = i1;
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];
233    height=height/5.0;
234
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);
241    model->addTexCoor((float)j /(texRate), (float)(i %this->heightMapReference->heightMap->h)/(texRate));
242    model->addColor(r/255.0f, g/255.0f, b/255.0f);
243  }
244
245
246  for(int j = j1; j <= j2; j += sampleRate)
247  {
248    int i = i2;
249    // To be fixed
250    if( this->heightMapReference->hasColourMap)
251    {
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];
255    }
256
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);
263    model->addTexCoor((float)j /(texRate), (float)((i+ sampleRate) %this->heightMapReference->heightMap->h)/(texRate));
264    model->addColor(r/255.0f, g/255.0f, b/255.0f);
265  }
266
267
268  for(int j = j1; j <= j2; j += sampleRate)
269  {
270    int i = i2;
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];
274    height +=  (float) (unsigned char) this->heightMapReference->heights[(j -1+ sampleRate   + (i+1)*(this->heightMapReference->heightMap->w ))];
275    height +=  (float)(unsigned char)this->heightMapReference->heights[(j +sampleRate+ (i+2)*(this->heightMapReference->heightMap->w ))];
276    height +=  (float)(unsigned char)this->heightMapReference->heights[(j+sampleRate + (i)*(this->heightMapReference->heightMap->w )) ];
277    height=height/5.0;
278    model->addVertex(scaleX*(this->heightMapReference->heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right
279    model->addNormal(normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].y,normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].z,normalVectorField[i%this->heightMapReference->heightMap->h][j%this->heightMapReference->heightMap->w].x);
280    model->addTexCoor((float)j /(texRate), (float)(i %this->heightMapReference->heightMap->h)/(texRate));
281    model->addColor(r/255.0,g/255.0,b/255.0);
282
283  }
284
285
286
287
288  // link Boarder Stripe
289  for(int j = j1-sampleRate  ; j < j2    ;  j += sampleRate)
290  {
291
292    model->addIndice(cnt);
293    model->addIndice(cnt  + (j2 -j1 +  sampleRate  )/ sampleRate );
294    cnt++;
295
296  }
297
298  cnt++;
299
300  model->newStripe();
301
302
303
304
305
306  cnt += (j2-j1)/ sampleRate;
307
308  // link 2nd BoarderStripe
309  for(int j = j1-sampleRate  ; j < j2    ;  j += sampleRate)
310  {
311
312    model->addIndice(cnt);
313    model->addIndice(cnt  + (j2 -j1 +  sampleRate  )/ sampleRate );
314    cnt++;
315
316  }
317
318
319  SDL_UnlockSurface(this->heightMapReference->colorMap);
320
321  model->finalize();
322
323
324
325
326// #undef heightMap
327        #undef colors
328        #undef scaleX
329        #undef scaleY
330        #undef scaleZ
331        #undef shiftX
332        #undef shiftY
333        #undef shiftZ
334        #undef normalVectorField
335
336}
337
338
339HeightMap::HeightMap()
340{
341}
342
343
344HeightMap::HeightMap(const std::string& height_map_name = "")
345    : VertexArrayModel()
346{
347  this->setClassID(CL_HEIGHT_MAP, "HeightMap");
348  heightMap =  IMG_Load(height_map_name.c_str());
349  if(heightMap!=NULL)
350  {
351    /*
352        WHAT about following checks:
353    - image size (rectangular?)
354    - image file type (bw?)
355
356    */
357
358    PRINTF(0)("loading Image %s\n", height_map_name.c_str());
359    PRINTF(0)("width : %i\n", heightMap->w);
360    PRINTF(0)("height : %i\n", heightMap->h);
361    PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel);
362    PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift);
363    PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift);
364    PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift);
365    PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask);
366    PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask);
367  }
368
369  else
370    PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name.c_str());
371
372
373  generateNormalVectorField();
374
375  shiftX = 0;
376  shiftY = 0;
377  shiftZ = 0;
378
379}
380
381HeightMap::HeightMap(const std::string& height_map_name = NULL, const std::string& color_map_name = NULL)
382    : VertexArrayModel()
383{
384  this->setClassID(CL_HEIGHT_MAP, "HeightMap");
385
386  heightMap =  IMG_Load(height_map_name.c_str());
387  if(heightMap!=NULL)
388  {
389
390    PRINTF(0)("loading Image %s\n", height_map_name.c_str());
391    PRINTF(0)("width : %i\n", heightMap->w);
392    PRINTF(0)("height : %i\n", heightMap->h);
393    PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel);
394    PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift);
395    PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift);
396    PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift);
397    PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask);
398    PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask);
399  }
400
401  else
402    PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name.c_str());
403
404
405  generateNormalVectorField();
406
407  colorMap=NULL;
408  if(color_map_name != "")
409  {
410    colorMap = IMG_Load(color_map_name.c_str());
411  }
412
413  if(colorMap != NULL)
414  {
415    PRINTF(0)("loading Image %s\n", color_map_name.c_str());
416    PRINTF(0)("width : %i\n", colorMap->w);
417    PRINTF(0)("height : %i\n", colorMap->h);
418    PRINTF(0)("%i Byte(s) per Pixel \n", colorMap->format->BytesPerPixel);
419    PRINTF(0)("Rshift : %i\n", colorMap->format->Rshift);
420    PRINTF(0)("Bshift: %i\n", colorMap->format->Bshift);
421    PRINTF(0)("Gshift: %i\n", colorMap->format->Gshift);
422    PRINTF(0)("Rmask: %i\n", colorMap->format->Rmask);
423    PRINTF(0)("Gmask: %i\n", colorMap->format->Gmask);
424  }
425  else
426    PRINTF(0)("oops! couldn't load colorMap for some reason.\n");
427
428
429
430  if(colorMap != NULL)
431  {
432    colors = (unsigned char *) colorMap->pixels;
433    hasColourMap = true;
434  }
435  else
436    hasColourMap = false;
437
438
439  heights  = (unsigned char*) heightMap->pixels;
440  shiftX = 0;
441  shiftY = 0;
442  shiftZ = 0;
443}
444
445
446HeightMap::~HeightMap()
447{
448  delete heightMap;
449  delete colorMap;
450
451
452  for(int i=0;i <    heightMap->h/tileSize ; i++)
453  {
454    for(int j = 0; j < heightMap->w/ tileSize; j++)
455    {
456      delete tiles [i][j];
457    }
458  }
459  for(int i=0;i <    heightMap->h/tileSize ; i++)
460    delete[] tiles[i];
461  delete[] tiles;
462
463
464
465
466
467  for(int i=0;i<heightMap->h;i++)
468    delete[] normalVectorField [i];
469  delete[] normalVectorField;
470
471
472
473
474
475
476
477}
478
479void HeightMap::load()
480{
481
482  //Create a Dynamicly sized 2D-Array for Tiles
483  tiles =  new Tile** [heightMap->h/tileSize];
484  for(int i=0;i <    heightMap->h/tileSize ; i++)
485    tiles [i]= new (Tile* [heightMap->w /tileSize ]);
486
487  //SetUp Arrays
488  for(int i = 0; i < (heightMap->)/ tileSize; i ++)
489  {
490    for(int j = 0; j < (heightMap->w )/ tileSize; j ++)
491    {
492
493      tiles[i][j] =    new Tile( i*tileSize ,  j*tileSize , (i+1)*tileSize, (j+1)*tileSize , this ) ;
494    }
495  }
496
497}
498
499
500void HeightMap::draw()
501{
502  const PNode* camera = State::getCameraNode();
503  Vector v = camera->getAbsCoor();
504
505  int i_min = 0;
506  int i_max = (heightMap->h )/ tileSize;
507  int j_min = 0;
508  int j_max= (heightMap->) / tileSize;
509
510
511
512  for(int i = 0; i <  i_max        ; i ++)
513  {
514    for(int j = 0; j < j_max ; j++)
515    {
516      tiles[i][j]->draw();
517    }
518  }
519
520}
521void HeightMap::generateNormalVectorField()
522{
523  int delta = 1;
524  heights  = (unsigned char*) heightMap->pixels;
525
526  //Create a Dynamicly sized 2D-Array to store our normals
527  normalVectorField =  new Vector* [heightMap->h];
528  for(int i=0;i<heightMap->h;i++)
529    normalVectorField [i]= new (Vector [heightMap->w]);
530
531
532
533
534  // Initialize
535  for(int i=0; i< heightMap->h; i++)
536  {
537    for(int j = 0; j> heightMap->w; j++)
538    {
539      Vector v = Vector(0.0, 1.0, 0.0);
540      normalVectorField[i][j] = v;
541    }
542  }
543
544  // !!! Does not yet calculate the normals of some border points!!!!!
545
546  if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 )
547  {
548    SDL_LockSurface(heightMap);
549    for(int i = 0 ; i < heightMap->h - 1  ; i ++)
550    {
551      for(int j = 0; j < heightMap->- 1  ;  j ++)
552      {
553
554
555        delta = (int)heights[j + (i+1)*(heightMap->w )] -  (int) heights[j + i*(heightMap->w )];
556        Vector a =  Vector(-scaleX,(float)delta*scaleY  ,0.0f);
557
558        delta = (int)heights[j+1 + i*(heightMap->w )] - (int)heights[j + i*(heightMap->w )];
559        Vector b =  Vector(0.0f,(float) delta*scaleY ,scaleZ);
560
561
562        normalVectorField[i][j] = b.cross(a);
563        normalVectorField[i][j].normalize();
564
565      }
566    }
567    SDL_UnlockSurface(heightMap);
568
569  }
570
571
572
573
574}
575
576
577void HeightMap::scale(Vector v)
578{
579  scaleX = v.x;
580  scaleY = v.y;
581  scaleZ = v.z;
582  generateNormalVectorField();
583}
584
585void HeightMap::setAbsCoor(Vector v)
586{
587  offsetX = v.x;
588  offsetY = v.y;
589  offsetZ  = v.z;
590}
591
592
593float HeightMap::getHeight(float x, float y)
594{
595
596  x -= offsetX;
597  y -= offsetZ;
598
599
600  int xInt = (int)x / scaleX;
601  x -= (float)((int)x);
602  xInt = heightMap->h - xInt;
603  int yInt = (int)y / scaleZ;
604  y -= (float) ((int) y); /*yInt = heightMap->w - yInt;*/
605
606  //PRINTF(0)("xInt: %i, yInt: %i, x: %f, y: %f\n", xInt, yInt, x, y);
607
608  if(xInt <= 0 || xInt >= heightMap->h || yInt <= 0 || yInt >= heightMap->)
609    return 0;
610  if( y >= 0.5*x)
611  {
612    // Check for ...
613  }
614
615  float height = heights[yInt + (xInt)*heightMap->w]*scaleY;
616
617
618  float a = normalVectorField[(xInt)][yInt].x;
619  float b = normalVectorField [(xInt)][yInt].z;
620  float c = normalVectorField [(xInt)][yInt].y;
621
622  PRINTF(0)("a: %f \n" ,a);
623  PRINTF(0)("b: %f \n" ,b);
624  PRINTF(0)("c: %f \n" ,c);
625
626  height -= ( (a/c)*(x) + (b/c)*(y));
627
628  PRINTF(0)("height: %f \n" ,height );
629  return (height + offsetZ);
630}
Note: See TracBrowser for help on using the repository browser.