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