Changeset 7014 in orxonox.OLD for trunk/src/lib/graphics/importer
- Timestamp:
- Feb 3, 2006, 2:14:22 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/graphics/importer/height_map.cc
r6956 r7014 30 30 #endif 31 31 32 Tile::Tile(int i1, int j1, int i2, int j2, HeightMap* hm ) 32 Tile::Tile(int i1, int j1, int i2, int j2, HeightMap* hm ) 33 33 { 34 34 … … 54 54 void Tile::draw() 55 55 { 56 57 58 float cameraDistance = (State::getCamera ()->getAbsCoor() - Vector(this->x, hmref->offsetY , this->z) ).len();59 56 // This Draws the LOD's 57 //FIXME 58 float cameraDistance = (State::getCameraNode()->getAbsCoor() - Vector(this->x, hmref->offsetY , this->z) ).len(); 59 if(cameraDistance < 0) cameraDistance = -cameraDistance; 60 60 if(cameraDistance > 5000 ) 61 61 { … … 66 66 this->drawLowRes(); 67 67 } 68 else 68 else 69 69 { 70 70 this->drawHighRes(); … … 86 86 void Tile::load(int i1, int j1, int i2, int j2, HeightMap* hm, VertexArrayModel* model, int Res) 87 87 { 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 this->z = hm->offsetZ + ((j1 + j2 )/2 )* scaleZ;103 104 105 106 107 108 109 110 111 112 113 114 115 88 89 #define heightMap hm->heightMap 90 #define colours hm->colours 91 #define scaleX hm->scaleX 92 #define scaleY hm->scaleY 93 #define scaleZ hm->scaleZ 94 #define shiftX hm->shiftX 95 #define shiftY hm->shiftY 96 #define shiftZ hm->shiftZ 97 #define normalVectorField hm->normalVectorField 98 99 hmref = hm; // FIXME 100 101 this->x = hm->offsetX + (heightMap->h - ((i1+i2)/2))*scaleX; 102 this->z = hm->offsetZ + ((j1 + j2 )/2 ) * scaleZ; 103 104 int sampleRate = Res; 105 106 float height = 0; 107 int offset = 0; 108 109 float r = 0.0; 110 float g = 0.0; 111 float b = 0.0; 112 113 114 115 116 116 if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 ) 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 model->addVertex(scaleX*(heightMap->h -i) + shiftX ,((double)(height)*scaleY) + shiftY ,scaleZ*(j) + shiftZ); // Top Right 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 model->newStripe(); 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right 216 217 218 model->addColor(r/255.0,g/255.0,b/255.0);219 220 221 222 223 224 225 226 227 228 229 230 231 232 model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right 254 255 256 model->addColor(r/255.0,g/255.0,b/255.0);257 258 259 260 261 262 263 264 265 266 267 268 269 270 model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 model->newStripe(); 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 #undef heightMap 319 #undef colours 320 #undef scaleX 321 #undef scaleY 322 #undef scaleZ 323 #undef shiftX 324 #undef shiftY 325 #undef shiftZ 326 #undef normalVectorField 327 117 118 SDL_LockSurface(heightMap); 119 SDL_LockSurface(hm->colourMap); 120 121 for(int i = i1 ; i <= i2 ; i +=sampleRate) 122 { 123 int w = 0; 124 125 126 127 if(hm->hasColourMap) 128 { 129 r = colours[(3*w+2 + 3*i*(heightMap->w )) ]; 130 g = colours[(3*w+1 + 3*i*(heightMap->w)) ]; 131 b = colours[(3*w+0 + 3*i*(heightMap->w))]; 132 } 133 134 w = j1; 135 model->addVertex(scaleX*(heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right 136 model->addNormal(normalVectorField[i % heightMap->h][w % heightMap->w].y,normalVectorField[i % heightMap->h][w % heightMap->w].z,normalVectorField[i % heightMap->h][w % heightMap->w].x); 137 model->addTexCoor((float)(j1-sampleRate) /(texRate), (float)(i %heightMap->h)/(texRate)); 138 139 model->addColor(r/255.0,g/255.0,b/255.0); 140 141 for(int j = j1 ; j <= j2 ; j += sampleRate) 142 { 143 144 145 // To be fixed 146 if(hm->hasColourMap) 147 { 148 r = colours[(3*j+2 + 3*i*(heightMap->w )) ]; 149 g = colours[(3*j+1 + 3*i*(heightMap->w)) ]; 150 b = colours[(3*j+0 + 3*i*(heightMap->w))]; 151 } 152 height = (float)(unsigned char) hm->heights[(j +sampleRate+ i*(heightMap->w )) ]; 153 height += (float)(unsigned char) hm->heights[(j+ 1 + sampleRate + (i+1)*(heightMap->w )) ]; 154 height += (float) (unsigned char) hm->heights[(j -1+ sampleRate + (i+1)*(heightMap->w ))]; 155 height += (float)(unsigned char)hm->heights[(j +sampleRate+ (i+2)*(heightMap->w )) ]; 156 height += (float)(unsigned char)hm->heights[(j+sampleRate + (i)*(heightMap->w )) ]; 157 height=height/5.0; 158 159 model->addVertex(scaleX*(heightMap->h -i) + shiftX ,((double)(height)*scaleY) + shiftY ,scaleZ*(j) + shiftZ); // Top Right 160 model->addNormal(normalVectorField[i % heightMap->h][j % heightMap->w].y,normalVectorField[i % heightMap->h][j % heightMap->w].z,normalVectorField[i % heightMap->h][j % heightMap->w].x); 161 model->addTexCoor((float)(j) /(texRate), (float)(i %heightMap->h)/(texRate)); 162 163 //PRINTF(0)("TexCoord: %f %f \n",(float)j / 100.0, (float)(i %heightMap->h)/100.0); 164 165 model->addColor(r/255.0,g/255.0,b/255.0); 166 w = j; 167 } 168 169 170 model->addVertex(scaleX*(heightMap->h -i)+ shiftX,shiftY,scaleZ*(w)+ shiftZ); // Top Right 171 model->addNormal(normalVectorField[i % heightMap->h][w % heightMap->w].y,normalVectorField[i % heightMap->h][w % heightMap->w].z,normalVectorField[i% heightMap->h][w % heightMap->w].x); 172 model->addTexCoor((float)(j2+sampleRate) /(texRate), (float)(i %heightMap->h)/(texRate)); 173 model->addColor(r/255.0,g/255.0,b/255.0); 174 175 } 176 177 178 179 180 181 SDL_UnlockSurface(heightMap); 182 int cnt = 0; 183 for(int i = i1 ; i < i2 ; i +=sampleRate) 184 { 185 186 for(int j = j1-sampleRate ; j < j2 + 2*sampleRate ; j += sampleRate) 187 { 188 189 model->addIndice(cnt); 190 model->addIndice(cnt + (j2 -j1 + 3* sampleRate )/ sampleRate ); 191 cnt++; 192 193 } 194 195 196 197 model->newStripe(); 198 199 200 } 201 cnt += (j2 -j1 + 3* sampleRate)/ sampleRate; 202 203 for(int j = j1 ; j <= j2 ; j += sampleRate) 204 { 205 int i = i1; 206 207 // To be fixed 208 if(hm->hasColourMap) 209 { 210 r = (float)colours[(3*j+2 + 3*i*(heightMap->w )) ]; 211 g = (float)colours[(3*j+1 + 3*i*(heightMap->w)) ]; 212 b = (float)colours[(3*j+0 + 3*i*(heightMap->w))]; 213 } 214 215 model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right 216 model->addNormal(normalVectorField[i % heightMap->h][j % heightMap->w].y,normalVectorField[i % heightMap->h][j % heightMap->w].z,normalVectorField[i % heightMap->h][j % heightMap->w].x); 217 model->addTexCoor((float)j /(texRate), (float)((i - sampleRate) %heightMap->h)/(texRate)); 218 model->addColor(r/255.0,g/255.0,b/255.0); 219 220 } 221 222 for(int j = j1 ; j <= j2 ; j += sampleRate) 223 { 224 int i = i1; 225 height = (float)(unsigned char) hm->heights[(j +sampleRate+ i*(heightMap->w )) ]; 226 height += (float)(unsigned char) hm->heights[(j+ 1 + sampleRate + (i+1)*(heightMap->w )) ]; 227 height += (float) (unsigned char) hm->heights[(j -1+ sampleRate + (i+1)*(heightMap->w ))]; 228 height += (float)(unsigned char)hm->heights[(j +sampleRate+ (i+2)*(heightMap->w )) ]; 229 height += (float)(unsigned char)hm->heights[(j+sampleRate + (i)*(heightMap->w )) ]; 230 height=height/5.0; 231 232 model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right 233 model->addNormal(normalVectorField[i % heightMap->h][j % heightMap->w].y,normalVectorField[i % heightMap->h][j% heightMap->w].z,normalVectorField[i%heightMap->h][j%heightMap->w].x); 234 model->addTexCoor((float)j /(texRate), (float)(i %heightMap->h)/(texRate)); 235 model->addColor(r/255.0,g/255.0,b/255.0); 236 237 } 238 239 240 241 for(int j = j1 ; j <= j2 ; j += sampleRate) 242 { 243 int i = i2; 244 245 // To be fixed 246 if(hm->hasColourMap) 247 { 248 r = (float)colours[3*j+2 + 3*i*(heightMap->w )]; 249 g = (float)colours[3*j+1 + 3*i*(heightMap->w)]; 250 b = (float)colours[3*j+0 + 3*i*(heightMap->w)]; 251 } 252 253 model->addVertex(scaleX*(heightMap->h -i) + shiftX , shiftY ,scaleZ*(j) + shiftZ); // Top Right 254 model->addNormal(normalVectorField[i%heightMap->h][j%heightMap->w].y,normalVectorField[i%heightMap->h][j%heightMap->w].z,normalVectorField[i%heightMap->h][j%heightMap->w].x); 255 model->addTexCoor((float)j /(texRate), (float)((i+ sampleRate) %heightMap->h)/(texRate)); 256 model->addColor(r/255.0,g/255.0,b/255.0); 257 258 } 259 260 261 for(int j = j1 ; j <= j2 ; j += sampleRate) 262 { 263 int i = i2; 264 height = (float)(unsigned char) hm->heights[(j +sampleRate+ i*(heightMap->w )) ]; 265 height += (float)(unsigned char) hm->heights[(j+ 1 + sampleRate + (i+1)*(heightMap->w )) ]; 266 height += (float) (unsigned char) hm->heights[(j -1+ sampleRate + (i+1)*(heightMap->w ))]; 267 height += (float)(unsigned char)hm->heights[(j +sampleRate+ (i+2)*(heightMap->w ))]; 268 height += (float)(unsigned char)hm->heights[(j+sampleRate + (i)*(heightMap->w )) ]; 269 height=height/5.0; 270 model->addVertex(scaleX*(heightMap->h -i) + shiftX , ((double)(height)*scaleY) +shiftY ,scaleZ*(j) + shiftZ); // Top Right 271 model->addNormal(normalVectorField[i%heightMap->h][j%heightMap->w].y,normalVectorField[i%heightMap->h][j%heightMap->w].z,normalVectorField[i%heightMap->h][j%heightMap->w].x); 272 model->addTexCoor((float)j /(texRate), (float)(i %heightMap->h)/(texRate)); 273 model->addColor(r/255.0,g/255.0,b/255.0); 274 275 } 276 277 278 279 280 // link Boarder Stripe 281 for(int j = j1-sampleRate ; j < j2 ; j += sampleRate) 282 { 283 284 model->addIndice(cnt); 285 model->addIndice(cnt + (j2 -j1 + sampleRate )/ sampleRate ); 286 cnt++; 287 288 } 289 290 cnt++; 291 292 model->newStripe(); 293 294 295 296 297 298 cnt += (j2-j1)/ sampleRate; 299 300 // link 2nd BoarderStripe 301 for(int j = j1-sampleRate ; j < j2 ; j += sampleRate) 302 { 303 304 model->addIndice(cnt); 305 model->addIndice(cnt + (j2 -j1 + sampleRate )/ sampleRate ); 306 cnt++; 307 308 } 309 310 311 SDL_UnlockSurface(hm->colourMap); 312 313 model->finalize(); 314 315 316 317 318 #undef heightMap 319 #undef colours 320 #undef scaleX 321 #undef scaleY 322 #undef scaleZ 323 #undef shiftX 324 #undef shiftY 325 #undef shiftZ 326 #undef normalVectorField 327 328 328 } 329 329 … … 339 339 if(heightMap!=NULL) { 340 340 341 342 343 344 345 346 347 348 349 350 341 PRINTF(0)("loading Image %s\n", height_map_name); 342 PRINTF(0)("width : %i\n", heightMap->w); 343 PRINTF(0)("height : %i\n", heightMap->h); 344 PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel); 345 PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift); 346 PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift); 347 PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift); 348 PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask); 349 PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask); 350 } 351 351 352 352 else PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name); 353 353 354 354 355 355 generateNormalVectorField(); 356 356 … … 368 368 if(heightMap!=NULL) { 369 369 370 371 372 373 374 375 376 377 378 379 370 PRINTF(0)("loading Image %s\n", height_map_name); 371 PRINTF(0)("width : %i\n", heightMap->w); 372 PRINTF(0)("height : %i\n", heightMap->h); 373 PRINTF(0)("%i Byte(s) per Pixel \n", heightMap->format->BytesPerPixel); 374 PRINTF(0)("Rshift : %i\n", heightMap->format->Rshift); 375 PRINTF(0)("Bshift: %i\n", heightMap->format->Bshift); 376 PRINTF(0)("Gshift: %i\n", heightMap->format->Gshift); 377 PRINTF(0)("Rmask: %i\n", heightMap->format->Rmask); 378 PRINTF(0)("Gmask: %i\n", heightMap->format->Gmask); 379 } 380 380 381 381 else PRINTF(4)("oops! couldn't load %s for some reason.\n", height_map_name); … … 389 389 colourMap = IMG_Load(colour_map_name); 390 390 } 391 391 392 392 if(colourMap != NULL) 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 393 { 394 PRINTF(0)("loading Image %s\n", colour_map_name); 395 PRINTF(0)("width : %i\n", colourMap->w); 396 PRINTF(0)("height : %i\n", colourMap->h); 397 PRINTF(0)("%i Byte(s) per Pixel \n", colourMap->format->BytesPerPixel); 398 PRINTF(0)("Rshift : %i\n", colourMap->format->Rshift); 399 PRINTF(0)("Bshift: %i\n", colourMap->format->Bshift); 400 PRINTF(0)("Gshift: %i\n", colourMap->format->Gshift); 401 PRINTF(0)("Rmask: %i\n", colourMap->format->Rmask); 402 PRINTF(0)("Gmask: %i\n", colourMap->format->Gmask); 403 } 404 else PRINTF(0)("oops! couldn't load colorMap for some reason.\n"); 405 406 407 408 408 if(colourMap != NULL) 409 409 { … … 412 412 } 413 413 else hasColourMap = false; 414 415 414 415 416 416 heights = (unsigned char*) heightMap->pixels; 417 417 shiftX = 0; … … 423 423 HeightMap::~HeightMap() 424 424 { 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 425 delete heightMap; 426 delete colourMap; 427 428 429 for(int i=0;i < heightMap->h/tileSize ; i++) 430 { 431 for(int j = 0; j < heightMap->w/ tileSize; j++) 432 { 433 delete tiles [i][j]; 434 } 435 } 436 for(int i=0;i < heightMap->h/tileSize ; i++) 437 delete[] tiles[i]; 438 delete[] tiles; 439 440 441 442 442 443 443 … … 449 449 450 450 451 452 453 451 452 453 454 454 } 455 455 … … 465 465 for(int i = 0; i < (heightMap->h )/ tileSize; i ++) 466 466 { 467 468 469 470 471 472 } 473 474 } 475 476 477 void HeightMap::draw() 478 { 479 const PNode* camera = State::getCamera ();467 for(int j = 0; j < (heightMap->w )/ tileSize; j ++) 468 { 469 470 tiles[i][j] = new Tile( i*tileSize , j*tileSize , (i+1)*tileSize, (j+1)*tileSize , this ) ; 471 } 472 } 473 474 } 475 476 477 void HeightMap::draw() 478 { 479 const PNode* camera = State::getCameraNode(); 480 480 Vector v = camera->getAbsCoor(); 481 481 … … 487 487 488 488 489 for(int i = 0; i < i_max 490 { 491 492 493 494 } 495 } 489 for(int i = 0; i < i_max ; i ++) 490 { 491 for(int j = 0; j < j_max ; j++) 492 { 493 tiles[i][j]->draw(); 494 } 495 } 496 496 497 497 } … … 509 509 510 510 511 // Initialize 511 // Initialize 512 512 for(int i=0; i< heightMap->h; i++) 513 513 { 514 515 516 517 518 514 for(int j = 0; j> heightMap->w; j++) 515 { 516 Vector v = Vector(0.0, 1.0, 0.0); 517 normalVectorField[i][j] = v; 518 } 519 519 } 520 520 … … 522 522 523 523 if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 ) 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 } 547 548 524 { 525 SDL_LockSurface(heightMap); 526 for(int i = 0 ; i < heightMap->h - 1 ; i ++) 527 { 528 for(int j = 0; j < heightMap->w - 1 ; j ++) 529 { 530 531 532 delta = (int)heights[j + (i+1)*(heightMap->w )] - (int) heights[j + i*(heightMap->w )]; 533 Vector a = Vector(-scaleX,(float)delta*scaleY ,0.0f); 534 535 delta = (int)heights[j+1 + i*(heightMap->w )] - (int)heights[j + i*(heightMap->w )]; 536 Vector b = Vector(0.0f,(float) delta*scaleY ,scaleZ); 537 538 539 normalVectorField[i][j] = b.cross(a); 540 normalVectorField[i][j].normalize(); 541 542 } 543 } 544 SDL_UnlockSurface(heightMap); 545 546 } 547 548 549 549 550 550 … … 568 568 569 569 570 float HeightMap::getHeight(float x, float y) 570 float HeightMap::getHeight(float x, float y) 571 571 { 572 572 573 573 x -= offsetX; 574 y -= offsetZ; 575 576 574 y -= offsetZ; 575 576 577 577 int xInt = (int)x / scaleX; x -= (float)((int)x); xInt = heightMap->h - xInt; 578 578 int yInt = (int)y / scaleZ; y -= (float) ((int) y); /*yInt = heightMap->w - yInt;*/ 579 579 580 580 //PRINTF(0)("xInt: %i, yInt: %i, x: %f, y: %f\n", xInt, yInt, x, y); 581 581 582 582 if(xInt <= 0 || xInt >= heightMap->h || yInt <= 0 || yInt >= heightMap->w ) return 0; 583 583 if( y >= 0.5*x) 584 584 { 585 // Check for ... 585 // Check for ... 586 586 } 587 587 588 588 float height = heights[yInt + (xInt)*heightMap->w]*scaleY; 589 590 589 590 591 591 float a = normalVectorField[(xInt)][yInt].x; 592 592 float b = normalVectorField [(xInt)][yInt].z; 593 593 float c = normalVectorField [(xInt)][yInt].y; 594 594 595 595 PRINTF(0)("a: %f \n" ,a); 596 596 PRINTF(0)("b: %f \n" ,b); 597 597 PRINTF(0)("c: %f \n" ,c); 598 598 599 599 height -= ( (a/c)*(x) + (b/c)*(y)); 600 600 601 601 PRINTF(0)("height: %f \n" ,height ); 602 602 return (height + offsetZ);
Note: See TracChangeset
for help on using the changeset viewer.