www.pudn.com > sxdl.zip > terrain.h
#if !defined Terrain_Included
#define Terrain_Included
#include "sxdl.h"
enum RenderMode {BRUTEFORCE, LOD };
struct SGEOMM_PATCH
{
float m_fDistance;
int m_iLOD;
bool m_bVisible;
};
struct SGEOMM_NEIGHBOR
{
bool m_bLeft;
bool m_bUp;
bool m_bRight;
bool m_bDown;
};
class CTerrain :
public CCustomRenderer
{
public:
// iXSize : largeur du terrain.
// iYSize : longueur du terrain.
CTerrain ( int Tex1 , int Tex2 , int Data , int iXSize = 512, int iYSize = 512 );
~CTerrain ( void ) ;
bool Initialise ( float fRayonMin = 10.0f,
float fRayonMax = 40.0f,
float fHauteurMin = 0.0f,
float fHauteurMax = 25.0f,
unsigned short uNbMontagnes = 150,
unsigned short uLissage = 1,
bool bIle = false,
unsigned int uGenerateur = 210372 );
// Construit un paysage.
// Les valeurs sont stockées dans un tableau de flottants de taille iXSize * iYSize.
// De plus chaque point de ce tableau se voit affecté d'un vecteur normal qui est constitué
// de 3 flotants. La taille mémoire allouée est donc de iXSize * iYSize * 4 * sizeof(float)
// et donc en prenant 4 octets pour un float et un tableau de 100 sur 100 on se retrouve avec
// une allocation de 160000 octets soit 156Ko. Une zone de 256 de coté consomme elle tout un Mo
// de mémoire.
// arguments:
// fRayonMin : rayon minimum d'une montagne.
// fRayonMax : rayon maximum d'une montagne.
// fHauteurMin : la hauteur par rapport au niveau de la mer du point le plus bas.
// fHauteurMax : la hauteur par rapport au niveau de la mer du point le plus élevé.
// uNbMontagnes : nombre de montagnes à générer.
// uLissage : paramètre de "lissage" des montagnes qui permet d'adoucir un pau les vallées.
// attention : la valeur 1 signifie "pas de lissage", une valeur supérieure indiquera le nombre
// de "passes de lissage" a effectuer
// bIle : si ce flag est a true, le programme génèrera une "île", c'est a dire un terrain dont tous
// les bords sont au niveau fHauteurMin
// uGenerateur : ce nombre initialise le générateur de nombres pseudo-aléatoire. Si on utilise deux fois le même
// nombre on obtiendra exactement le meme paysage. Permet de "stocker" un terrain en ne conservant que
// ses paramètres d'initialisation et ensuite de le recréer au besoin.
bool InitialiseDeRawfile( LPCTSTR sFileName,
int iXYSize,
float fHauteurMin = 0.0f,
float fHauteurMax = 25.0f);
// Cet appel de fonction construit un terrain à partir d'un fichier bitmap
// et ajuste les hauteurs mini et maxi
bool InitialiseDeRawfile2( float fHauteurMin = 0.0f,
float fHauteurMax = 25.0f,
int iRenderMode = BRUTEFORCE);
// Cet appel de fonction construit un terrain à partir d'un fichier bitmap
// en déterminant la taille des cotés et ajuste les hauteurs mini et maxi
int GetXSize(); // renvoit iXSize
int GetYSize(); // renvoit iYSize
void SetHauteurMax(float f); // permet de changer m_fHauteurMax
float GetHauteurMax(); // renvoit m_fHauteurMax
void SetHauteurMin(float f); // permet de changer m_fHauteurMin
float GetHauteurMin(); // renvoit m_fHauteurMin
float* GetTerrain(); // renvoit un pointeur vers le premier point (0,0) du tableau des hauteurs
D3DXVECTOR3* GetNormales(); // renvoit un pointeur vers le premier point (0,0) tu tableau des normales
void AjouteCase( int x, int y, float valeur );
float HauteurCase(int x, int y); // renvoit la hauteur du point (x,y)
float HauteurPosition(float x, float y); // renvoit la hauteur interpolée du point (x, y)
void SetWorldPosition(float x, float y, float z);
void SetWorldScaling(float x, float y, float z);
void Geometry ( Vector3 Position , Vector3 Scale , Vector3 Angles ) ;
// pour le LOD
bool Init( int iPatchSize );
void Shutdown( void );
void Update( void * Vertices , void * Indices, bool bCullPatches= true );
void RenderLOD( void );
void SetRenderMode(int iMode);
//--------------------------------------------------------------
// Name: CGEOMIPMAPPING::GetNumPatchesPerFrame - public
// Description: Get the number of patches being rendered per frame
// Arguments: None
// Return Value: A integer value: number of rendered patches per frame
//--------------------------------------------------------------
inline int GetNumPatchesPerFrame( void )
{ return m_iPatchesPerFrame; }
//--------------------------------------------------------------
// Name: CTERRAIN::GetPatchNumber - public
// Description: Calculate the current patch number
// Arguments: -PX, PZ: the patch number
// Return Value: An integer value: the patch number (for array access)
//--------------------------------------------------------------
inline int GetPatchNumber( int PX, int PZ )
{ return ( ( PZ*m_iNumPatchesPerSide )+PX ); }
// end LOD
// Modifie la valeur au point (x,y) du tableau des hauteurs en ajoutant
// la valeur donnée
void Activate ( bool Animate = true , bool Render = true ) ;
private :
CEntity * Fake ;
HRESULT OnPopulateBuffers ( void * Vertices , void * Indices ) ;
HRESULT OnPopulateIndexBuffer ( void * Indices );
HRESULT OnRender ( LPDIRECT3DDEVICE9 Device , CEntity * Entity ) ;
virtual HRESULT OnSetRenderStates ( LPDIRECT3DDEVICE9 Device ) ;
virtual HRESULT OnRestoreRenderStates ( LPDIRECT3DDEVICE9 Device ) ;
int DataResourceId ;
// LOD
SGEOMM_PATCH* m_pPatches;
int m_iPatchSize;
int m_iNumPatchesPerSide;
unsigned int* piIndices;
int m_iMaxLOD;
int m_iPatchesPerFrame; //the number of rendered patches per second
int m_iTrisPerFrame[50000];
int m_iCompteur;
void RenderFan( float cX, float cZ, float iSize, SGEOMM_NEIGHBOR neighbor, LPDIRECT3DDEVICE9 pd3dDevice, int* pIndices, LPDIRECT3DINDEXBUFFER9* m_pIBTerrainLOD );
void RenderPatch( int PX, int PZ,LPDIRECT3DDEVICE9 pd3dDevice, int* pIndices, LPDIRECT3DINDEXBUFFER9* m_pIBTerrainLOD );
void ComputePatch( int PX, int PZ, void * Vertices , void * Indices );
void ComputeFan( float cX, float cZ, float iSize, SGEOMM_NEIGHBOR neighbor, void * Vertices , void * Indices );
// end LOD
int m_iXSize;
int m_iYSize;
float m_fRayonMin;
float m_fRayonMax;
float m_fHauteurMin;
float m_fHauteurMax;
unsigned short m_uNbMontagnes;
unsigned short m_uLissage;
bool m_bIle;
unsigned int m_uGenerateur;
Vector3 m_vectWorldZeroPosition; // coordonnées du point (0,0,0) dans le repère du monde
D3DXVECTOR3 m_vectWorldScaling; // coefficients multiplicateurs pour scaling du terrain
D3DXMATRIX m_matWorld;
int m_RenderMode; // bruteforce ou LOD
float * m_pMap; // pointeur sur la carte
Vector3 * m_pNormales; // pointeur sur le tableau des normales
void Vider( void ); // met le terrain a 0 (platitude absolue)
void AjouterMontagne( void ); // ajoute une montagne au hasard sur le terrain
void Normalise( void ); // Redimensionne les hauteurs pour qu'elle soient toutes comprises entre 0 et 1.0
void Lisser( void ); // Effectue u lissage pour adoucir les vallées
void HauteursMinMax( void ); // Remet le terrain à l'échelle selon les paramètres m_fHauteurMin et m_fHauteurMax
void CalcNormales( void ); // Calcule le vecteur normal en chaque point
float GetCase( int x, int y ); // Renvoit la hauteur de la case de coordonnée (x, y)
void SetCase( int x, int y, float valeur); // Affecte au point de coordonnées (x,y) la hauteur valeur
void SetNormale( int x, int y, D3DXVECTOR3 valeur); // Affecte au point de coordonnées (x,y) le vecteur normal valeur
bool Animated ;
bool Rendered ;
struct TERRAINVERTEX
{
D3DXVECTOR3 position; // vertex position
D3DXVECTOR3 normal; // vertex normal
DWORD color; // couleur du point
float tu, tv; // valeurs pour coordonnées de texture 1
float tu1, tv1; // valeurs pour coordonnées de texture 2
};
#define D3DFVF_TERRAINVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DFVF_TEX1|D3DFVF_TEX2)
float HasardIntervalle( float min, float max ); // renvoit un nombre aléatoire compris entre min et max
};
#endif