#include #define CHARBUF 250 ///< length of the buffer (one line to be saved to file) /// Boolean variables that will be displayed as GUI checkboxes. typedef enum { bShowHelp, /*bAutoGenCubeMap, bUseCosTexture, */ bShowFireballs, bMultipleObjects, bConfineToRoom, LAST_BOOL } bool_t; /// Numeric variables that will be displayed as GUI sliders. typedef enum { iWhichMethod, iWhichMesh, fMeshScale, iResolution, iShowCubeMap, fIntensity, iShininess, LAST_NUMBER } number_t; /// Possible values for #iWhichMethod. typedef enum { DIFFUSE_SPECULAR_CLASSIC, ///< Classic environment mapping technique. DIFFUSE_SPECULAR_LOCALIZED_P2P, ///< Point to point form factor DIFFUSE_SPECULAR_LOCALIZED, ///< Our proposal. DIFFUSE_SPECULAR_LOCALIZED_5TEX, ///< Our proposal, using 5 texel only. DIFFUSE_SPECULAR_LOCALIZED_NEW ///< Our proposal with roboust form factor } method_t; /// Parameter-manager buttons typedef enum { IDC_RESET_BUTTON = -3, IDC_SAVE_BUTTON, IDC_LOAD_BUTTON } std_buttons_t; /// Conversion function (see Parameters::Add()). /// E.g. to create a slider that produces exponential values. typedef float (*CONVERTER)(float a); /// Change callback function (see Parameters::Add()). /// To be called when the respective parameter is modified. typedef void (*ONCHANGE_CALLBACK)(void); /// Default conversion function (see #CONVERTER). /// Does nothing but returning the value passed. float noconvert(float a); // { return a; } /// Default change callback function (see #ONCHANGE_CALLBACK). /// Does nothing. void OnChange(); // {} /** \brief Manages application parameters. \brief Creates GUI controls (sliders, checkboxes) and hotkeys. \author Istvan Lazanyi, TU Budapest \date 2006-04-26 */ class Parameters { bool bparam[LAST_BOOL]; ///< current param value (boolean) wchar_t bname[LAST_BOOL][CHARBUF]; ///< param name int radiogroup[LAST_BOOL]; ///< for boolean params that are represented by a checkbox int param[LAST_NUMBER]; ///< current param value (numeric) wchar_t name[LAST_NUMBER][CHARBUF]; ///< param name int numsteps[LAST_NUMBER]; ///< number of possible steps for param bool rotate[LAST_NUMBER]; ///< stores whether the slider can rotate around CONVERTER ffunc[LAST_NUMBER]; ONCHANGE_CALLBACK chfunc[LAST_NUMBER+3]; ONCHANGE_CALLBACK bchfunc[LAST_BOOL]; CDXUTDialog* g_HUD; bool bSilent; ///< to avoid an endless loop due to a change const static int CHARBUFFER_SIZE = 200; enum { checkboxID0 = 1000, sliderID0 = 2000, staticID0 = 3000, upID0 = 4000, downID0 = 5000 }; public: void Setup( CDXUTDialog* g_HUD ); void Setup( CDXUTDialog* g_HUD, ONCHANGE_CALLBACK OnReset, ONCHANGE_CALLBACK OnSave = OnChange, ONCHANGE_CALLBACK OnLoad = OnChange); bool Get( bool_t i ); float Get( number_t i ); int GetInt( number_t i ); void SetBool( bool_t ID, bool b ); void SetFloat( number_t ID, float v ); void SetInt( number_t ID, int v ); void Add( bool_t ID, char* label, char cHotKey = 0, ONCHANGE_CALLBACK bchf = OnChange ); void Add( int radiogroupID, bool_t ID, char* label, char cHotKey = 0, ONCHANGE_CALLBACK bchf = OnChange ); void Add( number_t ID, char* label, int num_steps); void Add( number_t ID, char* label, int num_steps, CONVERTER ff, ONCHANGE_CALLBACK chf = OnChange ); void Add( number_t ID, char* label, int num_steps, char cKeyDecr, char cKeyIncr = 0, CONVERTER ff = noconvert, ONCHANGE_CALLBACK chf = OnChange ); void SetEnabled( bool_t ID, bool bEnabled ); void SetEnabled( number_t ID, bool bEnabled ); void UpdateFromHUD( int controlID ); void SaveToFile( char* fileName ); void LoadFromFile( char* fileName ); };