Ejemplo n.º 1
0
float CGround::GetOrigHeight(float x, float z)
{
	return InterpolateHeight(x, z, readMap->GetOriginalHeightMapSynced());
}
Ejemplo n.º 2
0
float CGround::GetHeightReal(float x, float z, bool synced)
{
	return InterpolateHeight(x, z, readMap->GetSharedCornerHeightMap(synced));
}
Ejemplo n.º 3
0
float CGround::GetOrigHeight(float x, float y) const
{
	return InterpolateHeight(x, y, readmap->GetOriginalHeightMapSynced());
}
Ejemplo n.º 4
0
//creer une carte de texture en melangeant les quatres types de textures de base
void TERRAIN::GenerateTextureMap( unsigned int size )
{
  unsigned char Red, Green, Blue;
  unsigned int tempID;
  unsigned int x, z;
  unsigned int  TexX,  TexZ;
  float totalRed, totalGreen, totalBlue;
  float blend[4];
  float mapRatio;
  int lastHeight;
  int i;

  //determiner le nombre de textures de bases presentes
  textures.numTextures= 0;
  for( i=0; i<TRN_NUM_TILES; i++ )
    {
      if( !textures.data[i].isNull( ) )
	textures.numTextures++;
    }

  //determiner les intervalles d'affichage pour chaque type de texture de base
  lastHeight= -1;
  for( i=0; i<TRN_NUM_TILES; i++ )
    {
      if( !textures.data[i].isNull( ) )
	{
	  //on a trois valeurs a determiner: inf, opt,sup
	  textures.region[i].lowHeight=lastHeight+1;
	  lastHeight+= 255/textures.numTextures;
	  textures.region[i].optimalHeight=lastHeight;
	  textures.region[i].highHeight= ( lastHeight-textures.region[i].lowHeight )+lastHeight;
	}
    }

#if QT_VERSION < 0x040000
  myTexture.create( size, size, 32 );
#else
  myTexture = QImage(size, size, QImage::Format_ARGB32);
#endif

  //determiner relation entre resolution de la carte d'hauteur et la res. de la texture
  //.. en general, la texture aura une res. plus elevee
  mapRatio= ( float )sizeHeightMap/ size;

  //creation de texture
  for( z=0; z< size; z++ )
    {
      for( x=0; x< size; x++ )
	{
	  totalRed  = 0.0f;
	  totalGreen= 0.0f;
	  totalBlue = 0.0f;

	  //pour chaque texture de base
	  for( i=0; i<TRN_NUM_TILES; i++ )
	    {
	      if( !textures.data[i].isNull( ) )
		{
		  TexX= x;
		  TexZ= z;

		  //quel pixel de texture a choisir pour cette position sur la carte?
		  GetTexCoords( textures.data[i], &TexX, &TexZ );

		  //quelle est la couleur actuelle a cet endroit?
		  GetColor( textures.data[i], TexX,  TexZ, &Red, &Green, &Blue );

		  //combien de pourcent de cette texture de base faut-il ajouter a cet endroit?
		  //.. on interpole la vraie hauteur pour avoir des textures plus realistes
		  blend[i]= RegionPercent( i, Limit( InterpolateHeight( x, z, mapRatio ) ) );

		  //ajouter ce pourcentage a la couleur
		  totalRed  += Red*blend[i];
		  totalGreen+= Green*blend[i];
		  totalBlue += Blue*blend[i];
		}
	    }

	  //modifier la couleur de la texture a cet endroit, limiter les valeurs a 0..255
	  SetColor( myTexture, x, z, Limit( totalRed ),Limit( totalGreen ),Limit( totalBlue ) );
	}
    }

  //construire la texture
  glGenTextures( 1, &tempID );
  glBindTexture( GL_TEXTURE_2D, tempID );
  //utiliser la moyenne ponderee lineairement pour elargir ou reduire les textures
  glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );


  //le plus grand mystere de tout le code: pour une raison completement pourrie, QImage inverse
  //.. les canaux rouge et bleu lors de l'ecriture dans l'image; mais si j'utilise QGLWidget::convertToGLFormat,
  //.. l'image est inversee; la solution swapRGB marche (apres 3h de recherche desesperee) pour une raison mysterieuse
#if QT_VERSION < 0x040000
  myTexture = myTexture.swapRGB();
#else
  myTexture = myTexture.rgbSwapped();
#endif

  //definir la source de donnees pour la texture
  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, size,  size, 0, GL_RGBA, GL_UNSIGNED_BYTE, myTexture.bits() );

  //associer un no. ID a la texture
  textureColorID =  tempID;

  myTexture.save("texture.bmp","BMP");
}
Ejemplo n.º 5
0
float CGround::GetHeightReal(float x, float y, bool synced) const
{
	return InterpolateHeight(x, y, readmap->GetCornerHeightMap(synced));
}