#ifndef FOLIAGE_H #define FOLIAGE_H #include "GeoSubMesh.h" #include "tlista.h" #include "TMatrix.h" #include "VertexData.h" #include "Leaf.h" class ActiveLeafNode { public : // Variable members int index;// Array of pointers to vertices int prev; int next; ActiveLeafNode (void){ index = prev = next = -1; } // Constructor }; class Foliage { public : ActiveLeafNode *Acth; // first active leaf int ppio, final; int nhactivas; TMatrix mat_aux; Foliage (const Geometry::SubMesh *, const char *simpSeq, Geometry::CREATEVERTEXDATAFUNC vdfun=NULL, Geometry::CREATEINDEXDATAFUNC idfun=NULL); Foliage (const Foliage *); virtual ~Foliage (void); // Destructor //culling void Culling (float frustum[6][4]); bool LeafinFrustum ( int i, float frustum[6][4]); bool IsActive( int num) const; int ResolucionV ( char c, float rva, float rvb,float rvc, float rvd, float radio); void ColapsaHoja (int, int&); void SplitHoja (int, int&); bool Forzar_Split(int, int, int&); int AnteriorActivo (int h); int PosteriorActivo (int h); // resolucion constante int ResolucionC (float dist, float dmax, float dmin); void AjusteHojas( int nhojas); void RCecol ( int nhojas); void RCsplit ( int nhojas); Geometry::VertexData *vertexdata; Geometry::IndexData *indexdata; Leaf *Leaves; ActiveLeafNode *MinDet; // primera hoja activa int nHojas; int TotHojas; float cx,cy,cz; //centro de la copa// para los impostores y resolucion variable float rad; //radio de la esfera envolvente int minHojas; int TotVerts; private: Geometry::CREATEVERTEXDATAFUNC create_vertex_data_func; Geometry::CREATEINDEXDATAFUNC create_index_data_func; void ReadLeafs(const Geometry::SubMesh *); void ReadVertices(const Geometry::SubMesh *); bool ReadSimpSeq(const char*); /// returns true when successful void RellenoRaiz (void); void GetNormalH (Leaf&); // void GetNormalT(Tronco&); void CrossProduct(const float *v1, const float *v2, float *res); void Normalize(const float *v, float *res); // void CalculaNormalesVertice(void); void CalculaTexCoordsYNorms(void); }; #endif