summaryrefslogtreecommitdiffstats
path: root/src/terrain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/terrain.cpp')
-rw-r--r--src/terrain.cpp140
1 files changed, 77 insertions, 63 deletions
diff --git a/src/terrain.cpp b/src/terrain.cpp
index 3d19cac..c87494f 100644
--- a/src/terrain.cpp
+++ b/src/terrain.cpp
@@ -1,4 +1,18 @@
-// terrain.cpp
+// * This file is part of the COLOBOT source code
+// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
+// *
+// * This program is free software: you can redistribute it and/or modify
+// * it under the terms of the GNU General Public License as published by
+// * the Free Software Foundation, either version 3 of the License, or
+// * (at your option) any later version.
+// *
+// * This program is distributed in the hope that it will be useful,
+// * but WITHOUT ANY WARRANTY; without even the implied warranty of
+// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// * GNU General Public License for more details.
+// *
+// * You should have received a copy of the GNU General Public License
+// * along with this program. If not, see .
#define STRICT
#define D3D_OVERLOADS
@@ -71,14 +85,14 @@ CTerrain::~CTerrain()
}
-// Génère un nouveau terrain plat.
-// Le terrain est composé de mosaïques, elles-mêmes composées
-// de briques. Chaque brique est composée de 2 triangles.
-// mosaic: nombre de mosaïques selon les axes X et Z
+// G�n�re un nouveau terrain plat.
+// Le terrain est compos� de mosa�ques, elles-m�mes compos�es
+// de briques. Chaque brique est compos�e de 2 triangles.
+// mosaic: nombre de mosa�ques selon les axes X et Z
// brick: nombre de briques (puissance de 2)
// size: taille d'une brique selon les axes X et Z
-// vision: vision avant un changement de résolution
-// scaleMapping: échelle pour mapper les textures
+// vision: vision avant un changement de r�solution
+// scaleMapping: �chelle pour mapper les textures
//
// ^ z
// | <---> brick*size
@@ -153,7 +167,7 @@ float CTerrain::RetScaleRelief()
}
-// Initialise les noms des textures à utiliser pour le terrain.
+// Initialise les noms des textures � utiliser pour le terrain.
BOOL CTerrain::InitTextures(char* baseName, int* table, int dx, int dy)
{
@@ -163,7 +177,7 @@ BOOL CTerrain::InitTextures(char* baseName, int* table, int dx, int dy)
m_bLevelText = FALSE;
strcpy(m_texBaseName, baseName);
- p = strchr(m_texBaseName, '.'); // p <- ^début de l'extension
+ p = strchr(m_texBaseName, '.'); // p <- ^d�but de l'extension
if ( p == 0 )
{
strcpy(m_texBaseExt, ".tga");
@@ -195,7 +209,7 @@ void CTerrain::LevelFlush()
LevelCloseTable();
}
-// Initialise les noms des textures à utiliser pour le terrain.
+// Initialise les noms des textures � utiliser pour le terrain.
BOOL CTerrain::LevelMaterial(int id, char* baseName, float u, float v,
int up, int right, int down, int left,
@@ -237,16 +251,16 @@ BOOL CTerrain::LevelMaterial(int id, char* baseName, float u, float v,
// Charge le relief dans un fichier BMP.
-// La taille de l'image doit être de dimension dx et dy,
+// La taille de l'image doit �tre de dimension dx et dy,
// avec dx=dy=(mosaic*brick)+1.
// L'image doit avoir 8 bits/pixels, 256 couleurs avec
// une palette standard.
-// Conversion coordonnée image (x;y) -> world (x;-;z) :
+// Conversion coordonn�e image (x;y) -> world (x;-;z) :
// Wx = 5*Ix-400
// Wz = -(5*Iy-400)
-// Conversion coordonnée world (x;-;z) -> image (x;y) :
+// Conversion coordonn�e world (x;-;z) -> image (x;y) :
// Ix = (400+Wx)/5
// Iy = (400-Wz)/5
@@ -259,7 +273,7 @@ BOOL CTerrain::ResFromBMP(const char* filename)
if ( file == NULL ) return FALSE;
size = (m_mosaic*m_brick)+1;
- sizem = ((size+4-1)/4)*4; // taille multiple de 4 supérieur
+ sizem = ((size+4-1)/4)*4; // taille multiple de 4 sup�rieur
if ( m_resources != 0 )
{
@@ -297,7 +311,7 @@ TerrainRes CTerrain::RetResource(const D3DVECTOR &p)
y < 0 || y > m_mosaic*m_brick ) return TR_NULL;
size = (m_mosaic*m_brick)+1;
- sizem = ((size+4-1)/4)*4; // taille multiple de 4 supérieur
+ sizem = ((size+4-1)/4)*4; // taille multiple de 4 sup�rieur
ress = m_resources[BMPHEAD+x+sizem*y];
if ( ress == 5 ) return TR_STONE; // rouge ?
@@ -321,17 +335,17 @@ void CTerrain::FlushRelief()
}
// Charge le relief dans un fichier BMP.
-// La taille de l'image doit être de dimension dx et dy,
+// La taille de l'image doit �tre de dimension dx et dy,
// avec dx=dy=(mosaic*brick)+1.
// L'image doit avoir 8 bits/pixels, 256 niveaux de gris :
// blanc = sol (y=0)
// noir = montagne (y=255*scaleRelief)
-// Conversion coordonnée image (x;y) -> world (x;-;z) :
+// Conversion coordonn�e image (x;y) -> world (x;-;z) :
// Wx = 5*Ix-400
// Wz = -(5*Iy-400)
-// Conversion coordonnée world (x;-;z) -> image (x;y) :
+// Conversion coordonn�e world (x;-;z) -> image (x;y) :
// Ix = (400+Wx)/5
// Iy = (400-Wz)/5
@@ -349,7 +363,7 @@ BOOL CTerrain::ReliefFromBMP(const char* filename, float scaleRelief,
if ( file == NULL ) return FALSE;
size = (m_mosaic*m_brick)+1;
- sizem = ((size+4-1)/4)*4; // taille multiple de 4 supérieur
+ sizem = ((size+4-1)/4)*4; // taille multiple de 4 sup�rieur
buffer = (unsigned char*)malloc(BMPHEAD+sizem*size);
fread(buffer, BMPHEAD+sizem*size, 1, file);
@@ -389,7 +403,7 @@ BOOL CTerrain::ReliefFromBMP(const char* filename, float scaleRelief,
return TRUE;
}
-// Ajoute un point d'élévation dans le buffer du relief.
+// Ajoute un point d'�l�vation dans le buffer du relief.
BOOL CTerrain::ReliefAddDot(D3DVECTOR pos, float scaleRelief)
{
@@ -550,7 +564,7 @@ BOOL CTerrain::ReliefFromDXF(const char* filename, float scaleRelief)
}
-// Ajuste une position pour qu'elle ne dépasse pas les limites.
+// Ajuste une position pour qu'elle ne d�passe pas les limites.
void CTerrain::LimitPos(D3DVECTOR &pos)
{
@@ -569,8 +583,8 @@ void CTerrain::LimitPos(D3DVECTOR &pos)
}
-// Ajuste les bords de chaque mosaïque pour être compatible
-// avec toutes les résolutions inférieures.
+// Ajuste les bords de chaque mosa�que pour �tre compatible
+// avec toutes les r�solutions inf�rieures.
void CTerrain::AdjustRelief()
{
@@ -735,8 +749,8 @@ D3DVERTEX2 CTerrain::RetVertex(int x, int y, int step)
return v;
}
-// Crée tous les objets d'une mosaïque.
-// L'origine d'une mosaïque est son centre.
+// Cr�e tous les objets d'une mosa�que.
+// L'origine d'une mosa�que est son centre.
//
// ^ z
// |
@@ -920,12 +934,12 @@ BOOL CTerrain::CreateMosaic(int ox, int oy, int step, int objRank,
// | | | |
// 0.0 min max 1.0
//
-// Les coordonnées u-v utilisées pour le texturage sont comprises
+// Les coordonn�es u-v utilis�es pour le texturage sont comprises
// entre min et max (au lieu de 0 et 1). Ceci permet d'exclure les
-// pixels situés dans une marge d'un pixel tout autour de la surface.
+// pixels situ�s dans une marge d'un pixel tout autour de la surface.
-// Cherche un matériaux d'après son identificateur.
+// Cherche un mat�riaux d'apr�s son identificateur.
TerrainMaterial* CTerrain::LevelSearchMat(int id)
{
@@ -942,7 +956,7 @@ TerrainMaterial* CTerrain::LevelSearchMat(int id)
return 0;
}
-// Choix de la texture à utiliser pour un carré donné.
+// Choix de la texture � utiliser pour un carr� donn�.
void CTerrain::LevelTextureName(int x, int y, char *name, FPOINT &uv)
{
@@ -983,7 +997,7 @@ float CTerrain::LevelRetHeight(int x, int y)
return m_relief[x+y*size];
}
-// Décide si un point utilise le matériaux.
+// D�cide si un point utilise le mat�riaux.
BOOL CTerrain::LevelGetDot(int x, int y, float min, float max, float slope)
{
@@ -1031,7 +1045,7 @@ BOOL CTerrain::LevelGetDot(int x, int y, float min, float max, float slope)
return FALSE;
}
-// Cherche si un matériau existe.
+// Cherche si un mat�riau existe.
// Retourne l'index dans m_levelMat ou -1 s'il n'existe pas.
// m_levelMat[i].id donne l'identificateur.
@@ -1050,7 +1064,7 @@ int CTerrain::LevelTestMat(char *mat)
return -1;
}
-// Modifie l'état d'un point et de ses 4 voisins, sans tester si
+// Modifie l'�tat d'un point et de ses 4 voisins, sans tester si
// c'est possible.
void CTerrain::LevelSetDot(int x, int y, int id, char *mat)
@@ -1078,7 +1092,7 @@ void CTerrain::LevelSetDot(int x, int y, int id, char *mat)
m_levelDot[x+y*m_levelDotSize].mat[2] = mat[2];
m_levelDot[x+y*m_levelDotSize].mat[3] = mat[3];
- // Modifie le voisin inférieur.
+ // Modifie le voisin inf�rieur.
if ( (x+0) >= 0 && (x+0) < m_levelDotSize &&
(y-1) >= 0 && (y-1) < m_levelDotSize )
{
@@ -1110,7 +1124,7 @@ void CTerrain::LevelSetDot(int x, int y, int id, char *mat)
}
}
- // Modifie le voisin supérieur.
+ // Modifie le voisin sup�rieur.
if ( (x+0) >= 0 && (x+0) < m_levelDotSize &&
(y+1) >= 0 && (y+1) < m_levelDotSize )
{
@@ -1143,14 +1157,14 @@ void CTerrain::LevelSetDot(int x, int y, int id, char *mat)
}
}
-// Teste si un matériau est possible à un endroit donné, en fonction
+// Teste si un mat�riau est possible � un endroit donn�, en fonction
// de ses 4 voisins. Si oui, met le point.
BOOL CTerrain::LevelIfDot(int x, int y, int id, char *mat)
{
char test[4];
- // Compatible avec voisin inférieur ?
+ // Compatible avec voisin inf�rieur ?
if ( x+0 >= 0 && x+0 < m_levelDotSize &&
y-1 >= 0 && y-1 < m_levelDotSize )
{
@@ -1174,7 +1188,7 @@ BOOL CTerrain::LevelIfDot(int x, int y, int id, char *mat)
if ( LevelTestMat(test) == -1 ) return FALSE;
}
- // Compatible avec voisin supérieur ?
+ // Compatible avec voisin sup�rieur ?
if ( x+0 >= 0 && x+0 < m_levelDotSize &&
y+1 >= 0 && y+1 < m_levelDotSize )
{
@@ -1202,7 +1216,7 @@ BOOL CTerrain::LevelIfDot(int x, int y, int id, char *mat)
return TRUE;
}
-// Modifie l'état d'un point.
+// Modifie l'�tat d'un point.
BOOL CTerrain::LevelPutDot(int x, int y, int id)
{
@@ -1366,7 +1380,7 @@ BOOL CTerrain::LevelPutDot(int x, int y, int id)
return FALSE;
}
-// Initialise tout le terrain avec un matériau.
+// Initialise tout le terrain avec un mat�riau.
BOOL CTerrain::LevelInit(int id)
{
@@ -1389,7 +1403,7 @@ BOOL CTerrain::LevelInit(int id)
return TRUE;
}
-// Génère un niveau dans le terrain.
+// G�n�re un niveau dans le terrain.
BOOL CTerrain::LevelGenerate(int *id, float min, float max,
float slope, float freq,
@@ -1424,7 +1438,7 @@ BOOL CTerrain::LevelGenerate(int *id, float min, float max,
group = m_brick/m_subdivMapping;
- if ( radius > 0.0f && radius < 5.0f ) // juste un carré ?
+ if ( radius > 0.0f && radius < 5.0f ) // juste un carr� ?
{
dim = (m_mosaic*m_brick*m_size)/2.0f;
@@ -1483,7 +1497,7 @@ void CTerrain::LevelOpenTable()
int i, j;
if ( !m_bLevelText ) return;
- if ( m_levelDot != 0 ) return; // déjà alloué
+ if ( m_levelDot != 0 ) return; // d�j� allou�
m_levelDotSize = (m_mosaic*m_brick)/(m_brick/m_subdivMapping)+1;
m_levelDot = (DotLevel*)malloc(m_levelDotSize*m_levelDotSize*sizeof(DotLevel));
@@ -1507,7 +1521,7 @@ void CTerrain::LevelCloseTable()
-// Crée tous les objets pour une maille carrée du terrain.
+// Cr�e tous les objets pour une maille carr�e du terrain.
BOOL CTerrain::CreateSquare(BOOL bMultiRes, int x, int y)
{
@@ -1549,7 +1563,7 @@ BOOL CTerrain::CreateSquare(BOOL bMultiRes, int x, int y)
return TRUE;
}
-// Crée tous les objets du terrain dans le moteur 3D.
+// Cr�e tous les objets du terrain dans le moteur 3D.
BOOL CTerrain::CreateObjects(BOOL bMultiRes)
{
@@ -1650,7 +1664,7 @@ BOOL CTerrain::Terraform(const D3DVECTOR &p1, const D3DVECTOR &p2, float height)
for ( x=pp1.x ; x<=pp2.x ; x++ )
{
m_engine->DeleteObject(m_objRank[x+y*m_mosaic]);
- CreateSquare(m_bMultiText, x, y); // recrée le carré
+ CreateSquare(m_bMultiText, x, y); // recr�e le carr�
}
}
m_engine->Update();
@@ -1672,7 +1686,7 @@ D3DVECTOR CTerrain::RetWind()
}
-// Donne la pente exacte du terrain à un endroit donné.
+// Donne la pente exacte du terrain � un endroit donn�.
float CTerrain::RetFineSlope(const D3DVECTOR &pos)
{
@@ -1682,7 +1696,7 @@ float CTerrain::RetFineSlope(const D3DVECTOR &pos)
return Abs(RotateAngle(Length(n.x, n.z), n.y)-PI/2.0f);
}
-// Donne la pente approximative du terrain à un endroit donné.
+// Donne la pente approximative du terrain � un endroit donn�.
float CTerrain::RetCoarseSlope(const D3DVECTOR &pos)
{
@@ -1710,7 +1724,7 @@ float CTerrain::RetCoarseSlope(const D3DVECTOR &pos)
return atanf((max-min)/m_size);
}
-// Donne le vecteur normal à la position p(x,-,z) du terrain.
+// Donne le vecteur normal � la position p(x,-,z) du terrain.
BOOL CTerrain::GetNormal(D3DVECTOR &n, const D3DVECTOR &p)
{
@@ -1827,7 +1841,7 @@ float CTerrain::RetFloorHeight(const D3DVECTOR &p, BOOL bBrut, BOOL bWater)
return p.y-ps.y;
}
-// Modifie la coordonnée "y" du point "p" pour qu'il repose
+// Modifie la coordonn�e "y" du point "p" pour qu'il repose
// sur le sol du terrain.
BOOL CTerrain::MoveOnFloor(D3DVECTOR &p, BOOL bBrut, BOOL bWater)
@@ -1869,8 +1883,8 @@ BOOL CTerrain::MoveOnFloor(D3DVECTOR &p, BOOL bBrut, BOOL bWater)
return TRUE;
}
-// Modifie une coordonnée pour qu'elle soit sur le terrain.
-// Retourne FALSE si la coordonnée initiale était trop loin.
+// Modifie une coordonn�e pour qu'elle soit sur le terrain.
+// Retourne FALSE si la coordonn�e initiale �tait trop loin.
BOOL CTerrain::ValidPosition(D3DVECTOR &p, float marging)
{
@@ -1908,14 +1922,14 @@ BOOL CTerrain::ValidPosition(D3DVECTOR &p, float marging)
-// Vide la table des élévations.
+// Vide la table des �l�vations.
void CTerrain::FlushBuildingLevel()
{
m_buildingUsed = 0;
}
-// Ajoute une nouvelle élévation pour un batiment.
+// Ajoute une nouvelle �l�vation pour un batiment.
BOOL CTerrain::AddBuildingLevel(D3DVECTOR center, float min, float max,
float height, float factor)
@@ -1949,8 +1963,8 @@ BOOL CTerrain::AddBuildingLevel(D3DVECTOR center, float min, float max,
return TRUE;
}
-// Met à jour l'élévation pour un batiment lorsqu'il a été déplacé
-// en hauteur (suite à un terraformage).
+// Met � jour l'�l�vation pour un batiment lorsqu'il a �t� d�plac�
+// en hauteur (suite � un terraformage).
BOOL CTerrain::UpdateBuildingLevel(D3DVECTOR center)
{
@@ -1969,7 +1983,7 @@ BOOL CTerrain::UpdateBuildingLevel(D3DVECTOR center)
return FALSE;
}
-// Supprime l'élévation pour un batiment lorsqu'il a été détruit.
+// Supprime l'�l�vation pour un batiment lorsqu'il a �t� d�truit.
BOOL CTerrain::DeleteBuildingLevel(D3DVECTOR center)
{
@@ -1992,7 +2006,7 @@ BOOL CTerrain::DeleteBuildingLevel(D3DVECTOR center)
}
// Retourne le facteur d'influence si une position est sur une
-// élévation éventuelle.
+// �l�vation �ventuelle.
float CTerrain::RetBuildingFactor(const D3DVECTOR &p)
{
@@ -2016,7 +2030,7 @@ float CTerrain::RetBuildingFactor(const D3DVECTOR &p)
return 1.0f; // on est sur le sol normnal
}
-// Ajuste une position en fonction d'une élévation éventuelle.
+// Ajuste une position en fonction d'une �l�vation �ventuelle.
void CTerrain::AdjustBuildingLevel(D3DVECTOR &p)
{
@@ -2067,8 +2081,8 @@ void CTerrain::AdjustBuildingLevel(D3DVECTOR &p)
}
-// Retourne la dureté du terrain à un endroit donné.
-// La dureté détermine le bruit (SOUND_STEP et SOUND_BOUM).
+// Retourne la duret� du terrain � un endroit donn�.
+// La duret� d�termine le bruit (SOUND_STEP et SOUND_BOUM).
float CTerrain::RetHardness(const D3DVECTOR &p)
{
@@ -2077,7 +2091,7 @@ float CTerrain::RetHardness(const D3DVECTOR &p)
int x, y, id;
factor = RetBuildingFactor(p);
- if ( factor != 1.0f ) return 1.0f; // sur bâtiment
+ if ( factor != 1.0f ) return 1.0f; // sur b�timent
if ( m_levelDot == 0 ) return m_defHardness;
@@ -2145,7 +2159,7 @@ void CTerrain::GroundFlat(D3DVECTOR pos)
// Calcule le rayon de la plus grande zone platte disponible.
-// Ce calcul n'est pas optimisé !
+// Ce calcul n'est pas optimis� !
float CTerrain::RetFlatZoneRadius(D3DVECTOR center, float max)
{
@@ -2186,7 +2200,7 @@ float CTerrain::RetFlatZoneRadius(D3DVECTOR center, float max)
-// Spécifie la hauteur maximale de vol.
+// Sp�cifie la hauteur maximale de vol.
void CTerrain::SetFlyingMaxHeight(float height)
{