/** ******************************************************************************* @file /gui/engine/Animation.h @brief Datove struktury pro klicovanou animaci @author Vajicek @version 0.2 ******************************************************************************/ #ifndef ANIMATION_H #define ANIMATION_H #include "gui/model/ModelRep.h" #include "gui/engine/AdvGeom.h" #include "gui/common/mymath.h" namespace gui{ //data //----------------------------------------------------------------------------- /** Klicova hodnota. V teto strukture jsou ukladany klicove hodnoty. Konkretni pouzitou polozku specifikuje az ten kdo tabulku pouziva podle toho ke kteremu parametru ji ma navazanou. */ struct TKey{ union{ void* p_val; ///< pointer na cokoliv float flt_val; ///< float hodnota double dbl_val; ///< double hodnota int int_val; ///< int hodnota QUATER rot_val; ///< quaterninon popisujici otoceni P3F pos_val; ///< vrchol popisujici polohu }; }; /** Typ pro klicovy snimek. Odpovida konfiguraci kanalu. Pole. */ typedef TKey* TKeyFrame; /** Ukazatel na klic.*/ typedef TKey* PKey; /// Priznaky tabulky. //@{ /// Animace v tabulce je zacyklena. #define AT_LOOP 1 /// Tabulka je docasna. #define AT_TEMP 2 /// Tabulka je nahrana spolecne s modelem. #define AT_MODEL 4 /// Tabulka je v cache. #define AT_CACHED 8 //@} /** Track. Jeden pojmenovany vektor klicovych hodnot a odpovidajicich casovych znamek. */ struct TTrack{ /// Identifikace tracku. int Name; /// Rychlost prehravani. Klice za sekudnu. Slouzi k urychleni hledani klice. int KPS; /// Pole klicu. PKey Keys; /// Velikost pole klicu. int Keys_l; /// Pole casu. Stejne velke jako pole klicu. Jeden cas odpovida klici. int* Stamps; }; /** Animacni tabulka. */ struct TAnimTable{ /// Identifikace tabulky. int iID; /// Delka animace v tabulce. int iAnimLen; /// Pocet tracku = Animovanych hodnot. int iTracks_c; /// Pole tracku. TTrack* Tracks; /// Priznak tabulky. int iFlags; }; /** Ukazatel na tabulku. */ typedef TAnimTable* PAnimTable; /** Globalni cache pro animacni tabulky. Odpovidajici funkce implementuji operace: vyhledej, pridej, uvolni, generuj idcko. */ struct TAnimTablesCache{ /// Pole tabulek. PAnimTable* Tables; /// Pocet tabulek. int Tables_c; }; //----------------------------------------------------------------------------- /// @name Funkce pro praci s animacni cache. //@{ /** Inicializace globalni cache. */ extern void ACache_Init(); /** Pridani tabulky do globalni cache. @param at Tabulka ktera se ma pridat. */ extern void ACache_AddTable(PAnimTable at); /** Vytvor tabulku. Prida tabulku a nastavi ji na cacheovanou, zabrani dealokaci pri zruseni animace. @param iID Idcko nove tabulku. @return Nova tabulka. */ extern PAnimTable ACache_CreateTable(int iID); /** Znic tabulku. @param at Tabulka ktera se ma znicit. */ extern void ACache_DestroyTable(PAnimTable at); /** Odstraní tabulku z cache ale nedealokuje. @param at Tabulka ktera se ma odstranit. */ extern PAnimTable ACache_ReleasedTable(PAnimTable at); /** Najde tabulku podle id. Najde tabulku v cache. @param iID Identifikator hledane tabulky. @return Nalezena tabulka, nebo NULL, pokud neexistuje. */ extern PAnimTable ACache_GetTable(int iID); /** Vyprázdni cache. Vyprazni cache a dealokuje tabulky. */ extern void ACache_Free(); //@} /** @name Manipulace s animacni tabulkou. */ //@{ /** Vytvoří tabulku pro animaci z dat modelu. @param mod Model, z jehoz dat se ma tabulka vytvorit. @param aid Id dat v modelu z nihz se ma animace vytvorit. */ extern int CreateTableForModel(TModel* mod, int aid); /** Vytvoří tabulku pro animaci z dat modelu. @param mod Model, z jehoz dat se ma tabulka vytvorit. @return Pocet tabulek. */ extern int CreateTablesForModel(TModel* mod); /** Uvolni animacni tabulku z pameti. @param at Animacni tabulka. */ extern void FreeAnimTable(PAnimTable at); /** Prida tracky do animacni tabulky. @param at Animacni tabulka. @param names Jmena tracku. @param names_c Pocet tracku. */ extern int AddTracks(TAnimTable* at,int* names, int names_c); /** Najde track podle id. @param at Animacni tabulka. @param chindx Jmeno tracku. */ extern int GetTrack(TAnimTable* at,int chindx); /** Prida klicove snimky do tracku v animacni tabulce. @param at Animacni tabulka. @param name Jmeno tracku. @param count Pocet klicu. */ extern TTrack* AddKeyFramesToTrack(TAnimTable* at, int name, int count); //@} }//namespace #endif /*****************************************************************************/