enum MATIERE_BLOC
{
MB_AIR = 0, // si aucune matière
MB_TRANSPARENCE = 1, // si le bloc utilise la transparence (l'eau par exemple)
MB_MATIERE1 = 2, // si matière 1
MB_MATIERE2 = 4, // si matière 2
};
typedef s32 TypeBloc;
/**
Il est ainsi possible d'utiliser enum MATIERE_BLOC en tant que Flags.
ex:
- Un bloc de matière 1 et utilisant la transparence
-> TypeBloc type = MB_TRANSPARENCE | MB_MATIERE1;
**/
/* Je te laise implémenté^^.
Revoir peut-être la surface d'un chunk
car pas optimisé tel quel.
*/
class Chunk : public ISceneNode
{
public:
//! constructeur par défaut
Chunk();
//! constructeur par copie (pour une création rapide de chunks identiques)
Chunk(const Chunk& other);
//! destructeur
virtual Chunk();
//! dessine les buffer à l'écran (implémentation de "virtual ISceneNode::render()=0;" )
void render();
/**
Une meilleur méthode serait de ne pas dérivé Chunk de ISceneNode mais
faire une autre classe dérivée de ISceneNode contenant un tableau de chunk
qui effectuerait le rendu en fusionnant au passage les chunks ayant le même matériaux 1 et 2.
Il serait ainsi possible de tirer parti de la taille des buffers (2^16 vertices), réduire le
nombres de Call du driver et d'utiliser le potentiel des VBOs.
**/
//! dessine les faces visibles (contact avec un bloc air ou transparent) blocs dans les buffers
void updateChunk();
//! récupère le type d'un bloc
const TypeBloc& getTypeBloc(const s32& X, const s32& Y, const s32& Z);
//! implémentation de OnRegisterSceneNode() et getBoundingBox()
protected:
//! MEMBRES
u8 ListeBloc[16][16][25];
SMeshBuffer *BufferMatiere1, *BufferMatiere2;
SMaterial Material1, Material2;
aabbox3df BoundingBox;
//! dessine un bloc
void drawBloc(const s32& X, const s32& Y, const s32& Z);
}