/** ******************************************************************************* @file /gui/model/ModelRep.h @brief Datove struktury pro reprezenaci modelovych dat. @author Vajicek @version 0.1 ******************************************************************************/ #ifndef MODELREP_H #define MODELREP_H // #include "common/types.h" #include "common/mm.h" #include "gui/engine/SceneGeom.h" // #include namespace gui{ ///velikost bufferu pro nazvy #define STD_NAMELEN 32 /*MATERIAL*/ /******************************************************************************/ /** Material map - mapovani textury. */ struct TMaterialMap{ char* bitmap_file; float uvw_angle; float uvw_u_offset; float uvw_v_offset; float uvw_u_tiling; float uvw_v_tiling; HWTID id; ///< jmeno textury, to co vraci glGenTextures }; /** Material. */ struct TMaterial { char name[STD_NAMELEN]; ///< jmeno materialu P4F ambient; ///< Ambientni slozka odrazivosti. P4F diffuse; ///< Difusni slozka odrazivosti. P4F specular; ///< Leskla slozka odrazivosti. float shininess; ///< Lesk float transparency; ///< Pruhlednost // int mmap_c; ///< Pocet mapovani textur TMaterialMap* mmap; ///< Mapovani // int submat_c; ///< Pocet submaterialu. TMaterial* submat; ///< Submaterialy }; /// Pointer na material. typedef TMaterial* PMaterial; /*Hierarchie*/ /******************************************************************************/ /** Mesh Nod. */ struct TMeshNode { char name[STD_NAMELEN]; ///< jmeno nodu //lokalni transformace uzlu P3F translate; ///< translace AXISANG rotate; ///< rotace P3F scale; ///< skalovani P3F initial_translate;///< inicialni translace AXISANG initial_rotate; ///< inicialni rotace P3F initial_scale; ///< inicialni skalovani //globalni transformace uzlu MX4 global; P3F glob_scale; ///< skalovani int mesh; ///< index do pole obj.mesh P3DObject obj; ///< geometricky objekt /// pocet nasledniku int childs_c; /// naslednici TMeshNode** childs; /// predek TMeshNode* parent; }; /// Zjistuje jestli jde o pomocny mesh obsahujici data k jinemu ucelu #define ISHELPER(mn) ((mn)->name[0] == '_') /// Pointer na meshnod typedef TMeshNode* PMeshNode; /** LOD level. */ struct TLODLevel { float dist; ///< Vzdalenost od kamery teto urovne detailu int hierarchy_c; ///< pocet nodu PMeshNode* hierarchy; ///< hierarchy lod P3DObject object; ///< for non-hierarchy lod; }; /*Animacni data*/ /******************************************************************************/ /** Jeden vzorek rotace. */ struct TRot_track_sample{ int keyframe; ///< cislo snimku float angle; ///< uhel otoceni kolem osy P3F axis; ///< osa }; /** Jeden vzorek posunuti. */ struct TPos_track_sample{ int keyframe; ///< cislo snimku P3F position; ///< pozice }; /** Jeden vzorek zvetesni. */ struct TScale_track_sample{ int keyframe; ///< cislo snimku P3F size; ///< velikost }; /** Objekt a jeho animacni stopy. */ struct TAnim_object{ // char mesh_name[STD_NAMELEN]; ///< jmeno meshe TMeshNode* mesh; ///< mesh // TPos_track_sample* pos_track; ///< vzorky posunuti int pos_track_c; ///< pocet vzorku TRot_track_sample* rot_track; ///< vzorky rotace int rot_track_c; ///< pocet vzorku TScale_track_sample* scl_track; ///< vzorky zvetseni int scl_track_c; ///< pocet vzorku }; /** Animovane objekty(nezpracovana animace). */ struct TKeyframer{ char framer_name[STD_NAMELEN]; ///< jmeno animace int frame_per_sec; ///< frame rate int frames; ///< pocet snimku int anim_object_nodes_c; ///< pocet animacnich stop. TAnim_object* anim_object_nodes; ///< animacni stopy }; /// pointer na animace typedef TKeyframer* PKeyframer; /*MODEL*/ /******************************************************************************/ #define LOD_OFF -1 struct TModelInstance; /** Model*/ class TModel //## { private: PMeshNode copyHierarchy(PMeshNode from, PMeshNode parent, std::vector* vmn); public: TModel* hard_parent; ///< rodic softkopie TAABB aabb; ///< aabb std::vector instances; ///< instances /// Pomocne struktury HIERARCHIE. //@{ //lod hierarchie int lod_count; ///< pocet lodu, -1..lod off TLODLevel* lod_level; ///< lody //obycejna hierarchie int hierarchy_c; ///< pocet korenu PMeshNode* hierarchy; ///< non-lod hierarchy //@} //HLAVNI DATA //@{ std::vector data; ///< geometrie std::vector matr; ///< materialy std::vector keyframers; ///< animace std::vector nodes; ///< hierarchie //@} /// Konstruktor TModel(); /// Konstruktor TModel(int lod, int hierarchy); /// Destruktor ~TModel(); /// Inicializace void initModel(int lod, int hierarchy); /// Dealokace void freeModel(); /** nahrava geometrii z ASE @throws E_8K_ASE_READER */ void loadGeometry(void* data); /** nahrava animace z ASE @throws E_8K_ASE_READER */ void loadAnimation(void* data); /** Kopie. @return Nova kopie. */ TModel* softCopyModel(); /** Instance. @return Nova instance. */ TModelInstance* instantiateModel(); /// Geometrie. //@{ /** Prida geometrii do modelu. @return Nova geometrie. */ P3DObject addGeometry(); /** Prida LOD do geometrie. @param dist Ktere vzdalenosti LOD odpovida. @return Nova LOD. */ TLODLevel* addLODLevel(double dist); /** Najde meshnode podle jmena. @param mesh_nodename Jmeno mesh. @return Nalezeny mesh, nebo NULL. */ TMeshNode* findMeshNode(char* mesh_nodename); /** Prida meshnode do modelu. @param parent Ke kteremu rodici. @return Novy mesh. */ TMeshNode* addMeshNodToModel(TMeshNode* parent); /** Odstrani mesh. @param mesh Odstranovany mesh. @return Zda se povedlo odstranit. */ int removeMeshNodFromModel(TMeshNode* mesh); //@} /// Framer. //@{ /** Prida balicek s animacnimi daty. @return Nova animacni data(prazdna). */ TKeyframer* addFramer(); /** Najde balicek animacnich dat podle nazvu. @param name Nazev, odpovida nazvu v externim souboru. @return Nalezeny balicek. */ TKeyframer* findFramer(char* name); /** Vynuluje lokalni transformace. */ void resetPosition(); //@} /// Material. //@{ /** Prida material do modelu. @return Novy material. */ TMaterial* addMaterialToModel(); /** Nalezne material. @param name Nazev materialu. @return Novy material. */ TMaterial* findMaterial(const char* name); //@} /** AABB modelu. @param[out] aabb AAABB. */ void calculateAABB(TAABB* aabb); }; /*INSTANCE*/ /******************************************************************************/ /**Instance modelu, lightweight*/ struct TModelInstance{ TModel* model_class; ///< Model. /// pomocne struktury HIERARCHIE //@{ //lod hierarchie int lod_count; ///< pocet lodu, -1..lod off TLODLevel* lod_level; ///< lody //obycejna hierarchie int hierarchy_c; ///< pocet korenu PMeshNode* hierarchy; ///< non-lod hierarchy int nodes_c; ///< pocet nodu PMeshNode* nodes; ///< nody //@} }; /** @name "Metody" instance. */ //@{ /** Uvolneni instance z pameti. @param in Rusena instance. */ extern void DestroyInstance(TModelInstance* in); /** Nalezeni nodu v instanci. @param m Instance. @param mesh_nodename Jmeno nodu. @return Nalezeny meshnode, nebo NULL. */ extern TMeshNode* FindMeshNode(TModelInstance* m, char* mesh_nodename); /** Resetuje pozice lokalnich transformaci. @param in Instance. */ extern void ResetPosition(TModelInstance* in); //@} /** @name Funkce pro generovani AABB. */ //@{ /** Projede mesh, ulozi do aabb. @param mn Meshnode. @param tr Transformace do lokalnich souradnic. @param[out] aabb AABB. */ extern void CalculateAABB(TMeshNode* mn, MX4 tr, TAABB* aabb); /** Projede transformovany mesh. @param m Mesh, cista geometrie. @param tr Transformace do lokalnich souradnic. @param[out] aabb AABB. */ extern void CalculateAABB(TMesh* m, MX4 tr, TAABB* aabb); /** Projede nody instance. @param inst Instance. @param tr Transformace do lokalnich souradnic. @param[out] aabb AABB. */ extern void CalculateAABB(TModelInstance* inst, MX4 tr, TAABB* aabb); /** Projede meshe, ulozi do aabb @param o Objekt. @param[out] aabb AABB. */ extern void CalculateAABB(T3DObject* o, TAABB* aabb); //@} /** @name "Metody" frameru. */ //@{ /** Pridani nove stopy do balicku animacnich dat. @param k Balicek animacnich dat. @param mn Meshnode kteremu stopa odpovida. @return Stopa. */ TAnim_object* AddFramerObjectNode(TKeyframer* k, TMeshNode* mn); //@) /** @name "Metody" materialu. */ //@{ /** Pridani submaterialu do materialu. @param mat Material. @return Novy submaterial. */ extern TMaterial* AddSubMaterialToMaterial(TMaterial* mat); /** Pridani nove mapterialove mapy(mapovani textury). @param mat Material. @return Nova materialova mapa. */ extern TMaterialMap* AddMaterialMapToMaterial(TMaterial* mat); //@} }//namespace #endif /*****************************************************************************/