1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| CTerrain::CTerrain(void){
this->grillage=false;
}
CTerrain::~CTerrain(void){
delete arbre;
delete [] cases;
delete [] hauteurs;
delete [] hauteurCases;
glDeleteBuffersARB(5, buffer);
glDeleteTextures(1, &texTerrain);
}
void CTerrain::Charger(int numero){
CMenu* menu=CMenu::GetInstance();
char chemin[50];
sprintf(chemin, "./Data/Terrains/%d.tga", numero);
menu->BarreChargement("Chargement de la HeightMap");
CImage* image=new CImage(chemin);
this->longueur=image->Longueur()-1;
this->largeur=image->Largeur()-1;
this->hauteurs=new float[(longueur+1)*(largeur+1)];
this->hauteurCases=new float[longueur*largeur];
this->cases=new int[longueur*largeur];
for(int i=0; i<(longueur+1)*(largeur+1); i++){
this->hauteurs[i]=float(image->Data()[i*image->Bpp()])/50-1;
}
for(int i=0; i<longueur*largeur; i++){
this->hauteurCases[i]=(hauteurs[i+1+i/longueur]+hauteurs[i+1+longueur+i/longueur])/2;
if(hauteurCases[i]>1) cases[i]=1; else cases[i]=0;
}
glGenBuffersARB(5, buffer);
this->GenererTerrain(buffer, longueur, largeur, hauteurs, true);
menu->BarreChargement("Creation des textures");
glGenTextures(1, &texTerrain);
this->GenererTexture();
menu->BarreChargement("Chargement des arbres");
int nbArbres=0;
for(int i=0; i<(longueur+1)*largeur; i++){
if((i+1)%(longueur+1)>0&&image->Data()[i*image->Bpp()+1]>100) nbArbres++;
}
this->arbre=new CArbre(nbArbres);
int compteur=-1;
for(int i=0; i<(longueur+1)*largeur; i++){
if((i+1)%(longueur+1)>0&&image->Data()[i*image->Bpp()+1]>100){
compteur++;
arbre->Positionner(compteur, CVecteur3D(i%(longueur+1)+0.5,i/(longueur+1)+0.5,hauteurCases[i-i/longueur]));
cases[i-i/longueur]=2;
}
}
menu->BarreChargement("Creation du monde");
delete image;
}
void CTerrain::DessinerTerrain(void){
CTextures* textures=CTextures::GetInstance();
glBindTexture(GL_TEXTURE_2D, texTerrain);
double equation1[]={0,0,1,0.2};
glClipPlane(GL_CLIP_PLANE0, equation1);
glEnable(GL_CLIP_PLANE0);
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer[VERTICES] );
glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer[TEXTURES] );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer[NORMALES] );
glNormalPointer( GL_FLOAT, 0, (char *) NULL );
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffer[INDICES]);
glDrawElements(GL_TRIANGLES, 6*longueur*largeur, GL_UNSIGNED_INT, 0);
if(this->grillage){
glPushMatrix();
glEnable(GL_BLEND);
glClipPlane(GL_CLIP_PLANE0, equation1);
glTranslatef(0,0,0.01);
glBindTexture(GL_TEXTURE_2D, textures->Texture("Terrain", 1));
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer[TEXTURES2] );
glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
glDrawElements(GL_TRIANGLES, 6*longueur*largeur, GL_UNSIGNED_INT, 0);
glDisable(GL_BLEND);
glPopMatrix();
}
glDisable(GL_CLIP_PLANE0);
glDisable(GL_CULL_FACE);
glPushMatrix();
double equation2[]={0,0,-1,-0.1};
glClipPlane(GL_CLIP_PLANE1, equation2);
glEnable(GL_CLIP_PLANE1);
glScalef(1.0, 1.0, abs(cos(this->reflet*20))/15-2.0);
glDrawElements(GL_TRIANGLES, 6*longueur*largeur, GL_UNSIGNED_INT, 0);
glDisable(GL_CLIP_PLANE1);
glEnable(GL_CULL_FACE);
glPopMatrix();
}
void CTerrain::DessinerObjets(void){
this->arbre->Dessiner();
}
void CTerrain::GenererTerrain(std::vector<unsigned int> const &buffer_, int longueur, int largeur, std::vector<float> const &hauteurs, bool grillage_){
std::vector<float> vertices[3*(longueur+1)*(largeur+1)];
std::vector<float> textCord[2*(longueur+1)*(largeur+1)];
std::vector<float> textGril[2*(longueur+1)*(largeur+1)];
std::vector<float> normales[3*(longueur+1)*(largeur+1)];
std::vector<unsigned int> faces[6*longueur*largeur]; |
Partager