#include "dxstdafx.h" #include "Parameters.h" float noconvert(float a) { return a; } float convertToMinusOne_One(float a) { return a*2.0-1.0; } void OnChange() { } void Parameters::Setup( CDXUTDialog* g_HUD ) { Setup(g_HUD, OnChange, OnChange, OnChange); } void Parameters::Setup( CDXUTDialog* g_HUD, ONCHANGE_CALLBACK OnReset, ONCHANGE_CALLBACK OnSave, ONCHANGE_CALLBACK OnLoad ) { assert( g_HUD != NULL ); this->g_HUD = g_HUD; g_HUD->GetDefaultElement( DXUT_CONTROL_STATIC, 0 )->dwTextFormat = DT_VCENTER | DT_LEFT; for (int i=0; iAddButton( IDC_RESET_BUTTON, L"[R] Reset", posX, posY += 30, 60, 16, 'R' ); g_HUD->AddButton( IDC_SAVE_BUTTON, L"[S] Save", posX + 70, posY, 60, 16, 'S' ); g_HUD->AddButton( IDC_LOAD_BUTTON, L"[L] Load", posX + 140, posY, 60, 16, 'L' ); chfunc[ LAST_NUMBER ] = OnReset; chfunc[ LAST_NUMBER+1 ] = OnSave; chfunc[ LAST_NUMBER+2 ] = OnLoad; } bool Parameters::Get( bool_t i ) { return bparam[i]; } float Parameters::Get( number_t i ) { //assert( ffunc[i] != NULL ); return ffunc[i]( (float)param[i] / numsteps[i] ); // 0..1 } int Parameters::GetInt( number_t i ) { //assert( ffunc[i] != NULL ); float r = (float)ffunc[i]( param[i] ); return (int)(r+0.5); // 0..numsteps[i] } void Parameters::Add( bool_t ID, char* label, char cHotKey ) { assert( cHotKey != 'R' && cHotKey != 'S' && cHotKey != 'L' ); mbstowcs( bname[ID], label, CHARBUFFER_SIZE ); int posX = 380; int posY = 50; g_HUD->AddCheckBox( ID+checkboxID0, bname[ID], posX, posY + ID*16, 150, 16, false, cHotKey, 0 ); // checked=false } void Parameters::SetBool( bool_t ID, bool b ) { bparam[ID] = b; bSilent = true; if( g_HUD->GetCheckBox( ID+checkboxID0 ) != NULL ) g_HUD->GetCheckBox( ID+checkboxID0 )->SetChecked( bparam[ID] ); bSilent = false; } void Parameters::SetFloat( number_t ID, float v ) { SetInt( ID, (int)( v*numsteps[ID] + 0.5 )); } void Parameters::SetInt( number_t ID, int v ) { param[ID] = v; if ( param[ID] < 0 ) param[ID] = 0; else if ( param[ID] > numsteps[ID] ) param[ID] = numsteps[ID]; bSilent = true; // minden frissül if( g_HUD->GetSlider( ID+sliderID0 ) != NULL ) g_HUD->GetSlider( ID+sliderID0 )->SetValue( v ); wchar_t text[30]; _sntprintf( text, 30, L"%.2f", Get( (number_t)ID ) ); if( g_HUD->GetStatic( ID+staticID0 ) != NULL ) g_HUD->GetStatic( ID+staticID0 )->SetText( text ); // user-defined callback //assert( chfunc[ID] != NULL ); chfunc[ID](); bSilent = false; } void Parameters::Add( number_t ID, char* label, int num_steps) { Add( ID, label, num_steps, noconvert ); } void Parameters::Add( number_t ID, char* label, int num_steps, CONVERTER ff, ONCHANGE_CALLBACK chf ) { char cKeyDown = 0; char cKeyUp = 0; Add( ID, label, num_steps, cKeyDown, cKeyUp, ff, chf); } void Parameters::Add( number_t ID, char* label, int num_steps, char cKeyDecr, char cKeyIncr, CONVERTER ff, ONCHANGE_CALLBACK chf ) { assert( cKeyDecr != 'R' && cKeyDecr != 'S' && cKeyDecr != 'L' ); assert( cKeyIncr != 'R' && cKeyIncr != 'S' && cKeyIncr != 'L' ); mbstowcs( name[ID], label, CHARBUFFER_SIZE ); /*wchar_t val[30]; _sntprintf( val, 30, L"%.2f", param[ID] / 100.0f ); // nem kell */ //cHotKey ffunc[ID] = ff; chfunc[ID] = chf; numsteps[ID] = num_steps; int posX = 210; int posY = 50; g_HUD->AddStatic( 0, name[ID], posX-180, posY + ID*16, 120, 14 ); g_HUD->AddStatic( ID+staticID0, L"", posX-50, posY + ID*16, 120, 14 ); g_HUD->AddSlider( ID+sliderID0, posX, posY + ID*16, 120, 14, 0, num_steps,0 ); //UpdateFromHUD( ID+sliderID0 ); // hogy ne kelljen azt eltárolni, hogy melyik hotkey melyik sliderhez tartozik, // 2 láthatatlan checkboxot hozok létre ezekkel a hotkeyekkel. // a checkbox id alapján azonosíthatom az érintett slidert. CDXUTCheckBox* c; g_HUD->AddCheckBox( ID+downID0, L"d", posX-20, posY + ID*16, 200, 16, 0, cKeyDecr, 0, &c ); c->m_bVisible = false; g_HUD->AddCheckBox( ID+upID0, L"u", posX-20, posY + ID*16, 200, 16, 0, cKeyIncr, 0, &c ); c->m_bVisible = false; } void Parameters::UpdateFromHUD( int controlID ) { //if (bSilent) return; // Reset, Save & Load buttons if (controlID == IDC_RESET_BUTTON ) { LoadFromFile( ".params0" ); chfunc[ LAST_NUMBER ](); } else if (controlID == IDC_SAVE_BUTTON ) { SaveToFile( ".params" ); chfunc[ LAST_NUMBER+1 ](); } else if (controlID == IDC_LOAD_BUTTON ) { LoadFromFile( ".params" ); chfunc[ LAST_NUMBER+2 ](); } // a checkbox else if (controlID >= checkboxID0 && controlID < checkboxID0+LAST_BOOL) { bool b = g_HUD->GetCheckBox( controlID )->GetChecked(); int ID = controlID - checkboxID0; SetBool( (bool_t)ID, b); } // a slider else if (controlID >= sliderID0 && controlID < sliderID0+LAST_NUMBER) { int v = g_HUD->GetSlider( controlID )->GetValue(); int ID = controlID - sliderID0; SetInt( (number_t)ID, v); } // a hotkey (bound to an invisible checkbox) that decrements a slider else if (controlID >= downID0 && controlID < downID0+LAST_NUMBER) { // down int ID = controlID-downID0; SetInt( (number_t)ID, param[ID]-1 ); } // a hotkey (bound to an invisible checkbox) that increments a slider else if (controlID >= upID0 && controlID < upID0+LAST_NUMBER) { // up int ID = controlID-upID0; SetInt( (number_t)ID, param[ID]+1 ); } } void Parameters::SaveToFile( char* fileName ) { FILE* fileS; if( ( fileS = fopen( fileName, "wt" ) ) == NULL ) { wchar_t wbuf[ CHARBUF ]; mbstowcs( wbuf, fileName, CHARBUF ); MessageBox( NULL, wbuf, L"File creation failed!", MB_ICONERROR ); // show error message return; } fwprintf( fileS, L"----- RayTraceEffects: Saved parameters of the algorithm -----\n" ); fwprintf( fileS, L"Bool values:\n" ); for ( int i=0; i 0 ); } fgets( buf, CHARBUF, fileL ); // skip line fgets( buf, CHARBUF, fileL ); // skip comment fgets( buf, CHARBUF, fileL ); // skip comment for ( int i=0; i