Changeset 6472 in orxonox.OLD for branches/height_map/src/lib/graphics/importer/height_map.cc
- Timestamp:
- Jan 11, 2006, 2:11:16 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/height_map/src/lib/graphics/importer/height_map.cc
r6329 r6472 29 29 #include <SDL/SDL_image.h> 30 30 #endif 31 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, ((j/sampleRate)%heightMap->w)/float(heightMap->w),((i/sampleRate)%heightMap->h)/float(heightMap->h)); 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, ((j/sampleRate)%heightMap->w)/float(heightMap->w),(((i - sampleRate) /sampleRate)%heightMap->h)/float(heightMap->h)); 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, ((j/sampleRate)%heightMap->w)/float(heightMap->w),(((i)/sampleRate)%heightMap->h)/float(heightMap->h)); 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, ((j/sampleRate)%heightMap->w)/float(heightMap->w),(((i - sampleRate)/sampleRate)%heightMap->h)/float(heightMap->h)); 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, ((j/sampleRate)%heightMap->w)/float(heightMap->w),((i/sampleRate)%heightMap->h)/float(heightMap->h)); 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 } 31 289 32 290 HeightMap::HeightMap() … … 86 344 generateNormalVectorField(); 87 345 88 346 colourMap=NULL; 89 347 if(colour_map_name != NULL) 90 348 { 91 349 colourMap = IMG_Load(colour_map_name); 350 } 92 351 if(colourMap != NULL) 93 352 { … … 102 361 PRINTF(0)("Gmask: %i\n", colourMap->format->Gmask); 103 362 } 104 else PRINTF( 4)("oops! couldn't load %s for some reason.\n", colour_map_name);363 else PRINTF(0)("oops! couldn't load colorMap for some reason.\n"); 105 364 106 365 … … 114 373 115 374 116 shiftX = 0; 117 shiftY = 0; 118 shiftZ = 0; 119 } 375 heights = (unsigned char*) heightMap->pixels; 120 376 121 377 … … 129 385 { 130 386 131 unsigned char height = 0; 132 int offset = 0; 133 int g = 0; 134 135 136 137 heights = (unsigned char*) heightMap->pixels; 138 139 140 141 142 if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 ) 143 144 SDL_LockSurface(heightMap); 145 146 147 for(int i = 0 ; i < heightMap->h -sampleRate ; i +=sampleRate) 148 { 149 int j = 0; 150 151 float r; 152 float g; 153 float b; 154 for(int j = 0 ; j < heightMap->w -sampleRate ; j += sampleRate) 155 { 156 // To be fixed 157 r = (float)colours[3*j+2 + 3*i*(heightMap->w )]; 158 g = (float)colours[3*j+1 + 3*i*(heightMap->w)]; 159 b = (float)colours[3*j+0 + 3*i*(heightMap->w)]; 160 161 height = heights[j+sampleRate + i*(heightMap->w )]; 162 this->addVertex(scaleX*(heightMap->h -i) + shiftX ,((double)(height)*scaleY) + shiftY ,scaleZ*(j+sampleRate) + shiftZ); // Top Right 163 164 165 this->addNormal(normalVectorField[i][j+sampleRate].y,normalVectorField[i][j+sampleRate].z,normalVectorField[i][j+sampleRate].x); 166 this->addTexCoor(((j/sampleRate)%texRate)/texRatef,((i/sampleRate)%texRate)/texRatef); 167 168 this->addColor(r/255.0,g/255.0,b/255.0); 169 170 171 } 172 173 174 j = (heightMap->w/sampleRate - sampleRate); 175 176 this->addVertex(scaleX*(heightMap->h -i)+ shiftX,-1000.0,scaleZ*(j+sampleRate)+ shiftZ); // Top Right 177 178 this->addNormal(normalVectorField[i][j+sampleRate].y,normalVectorField[i][j+sampleRate].z,normalVectorField[i][j+sampleRate].x); 179 this->addTexCoor(((j/sampleRate)%4)/4.0,((i/sampleRate)%4)/4.0); 180 this->addColor(0.1,0.1,0.9); 181 182 183 184 185 } 186 187 SDL_UnlockSurface(heightMap); 188 189 190 int cnt = 0; 191 for(int i = 0 ; i < heightMap->h - 2*sampleRate ; i +=sampleRate) 192 { 193 194 for(int j = 0 ; j < heightMap->w - sampleRate ; j += sampleRate) 195 { 196 197 this->addIndice(cnt); 198 this->addIndice(cnt + (heightMap->w)/ sampleRate ); 199 cnt++; 200 201 } 202 203 cnt++; 204 this->newStripe(); 205 206 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 ) ; 207 399 } 208 209 this->finalize(); 210 211 212 } 213 214 215 216 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 } 217 471 void HeightMap::generateNormalVectorField() 218 472 { … … 227 481 228 482 229 // !!! Does not yet calculate any normals forsome border points!!!!!483 // !!! Does not yet calculate the normals of some border points!!!!! 230 484 231 485 if(heightMap != NULL && heightMap->format->BitsPerPixel == 8 )
Note: See TracChangeset
for help on using the changeset viewer.