/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /* $Header: /Commando/Code/Tools/max2w3d/gmtldlg.cpp 18 5/27/98 8:34a Greg_h $ */ /*********************************************************************************************** *** Confidential - Westwood Studios *** *********************************************************************************************** * * * Project Name : Commando / G 3D engine * * * * File Name : GMTLDLG.CPP * * * * Programmer : Greg Hjelstrom * * * * Start Date : 06/26/97 * * * * Last Update : June 26, 1997 [GH] * * * *---------------------------------------------------------------------------------------------* * Functions: * * GameMtlDlg::GameMtlDlg -- constructor * * GameMtlDlg::~GameMtlDlg -- destructor! * * GameMtlDlg::ClassID -- Returns the ClassID of GameMtl * * GameMtlDlg::Invalidate -- causes the dialog to be redrawn * * GameMtlDlg::ReloadDialog -- Updates the values in all of the dialog's controls * * GameMtlDlg::SetTime -- Sets the time value, updates the material and the dialog * * GameMtlDlg::PanelProc -- Windows Message handler * * PanelDlgProc -- Windows Proc which thunks into GameMtlDlg::PanelProc * * GameMtlDlg::LoadDialog -- Sets the state of all of the dialog's controls * * GameMtlDlg::UpdateMtlDisplay -- Informs MAX that the material parameters have changed * * GameMtlDlg::ActivateDlg -- Activates and deactivates the dialog * * GameMtlDlg::SetThing -- Sets the material to be edited * * GameMtlDlg::BuildDialog -- Adds the dialog to the material editor * * GameMtlDlg::UpdateTexmapDisplay -- Updates the texture map buttons * * NotesDlgProc -- Dialog Proc which thunks to GameMtlDlg::NotesProc * * GameMtlDlg::NotesProc -- Dialog Proc for the Notes panel * * HintsDlgProc -- Dialog proc which thunks to GameMtlDlg::HintsProc * * GameMtlDlg::HintsProc -- Dialog Proc for the hints panel * * GameMtlDlg::PsxProc -- Dialog proc for the PSX options panel * * PsxDlgProc -- Dialog proc which thunks into GameMtlDlg::PsxProc * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include #include #include #include #include "gmtldlg.h" #include "gamemtl.h" #include "gamemaps.h" #include "dllmain.h" #include "resource.h" #include "w3d_file.h" static inline float PcToFrac(int pc) { return (float)pc/100.0f; } static inline int FracToPc(float f) { if (f<0.0) return (int)(100.0f*f - .5f); else return (int) (100.0f*f + .5f); } /*********************************************************************************************** * GameMtlDlg::GameMtlDlg -- constructor * * * * INPUT: * * hwMtlEdit - windows handle of the MAX material editor * * imp - Interface object for MAX materials and textures * * m - pointer to a GameMtl to be edited * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ GameMtlDlg::GameMtlDlg(HWND hwMtlEdit, IMtlParams *imp, GameMtl *m) { HwndEdit = hwMtlEdit; HwndPanel = NULL; HwndHints = NULL; HwndPsx = NULL; HwndNotes = NULL; HpalOld = NULL; TheMtl = m; IParams = imp; Valid = FALSE; IsActive = 0; InstCopy = FALSE; DiffuseSwatch = NULL; SpecularSwatch = NULL; AmbientCoeffSwatch = NULL; DiffuseCoeffSwatch = NULL; SpecularCoeffSwatch = NULL; EmissiveCoeffSwatch = NULL; DCTFramesSpin = NULL; DITFramesSpin = NULL; SCTFramesSpin = NULL; SITFramesSpin = NULL; DCTRateSpin = NULL; DITRateSpin = NULL; SCTRateSpin = NULL; SITRateSpin = NULL; OpacitySpin = NULL; TranslucencySpin = NULL; ShininessSpin = NULL; FogSpin = NULL; } /*********************************************************************************************** * GameMtlDlg::~GameMtlDlg -- destructor! * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ GameMtlDlg::~GameMtlDlg() { if (DiffuseSwatch) { ReleaseIColorSwatch(DiffuseSwatch); DiffuseSwatch = NULL; } if (SpecularSwatch) { ReleaseIColorSwatch(SpecularSwatch); SpecularSwatch = NULL; } if (AmbientCoeffSwatch) { ReleaseIColorSwatch(AmbientCoeffSwatch); AmbientCoeffSwatch = NULL; } if (DiffuseCoeffSwatch) { ReleaseIColorSwatch(DiffuseCoeffSwatch); DiffuseCoeffSwatch = NULL; } if (SpecularCoeffSwatch) { ReleaseIColorSwatch(SpecularCoeffSwatch); SpecularCoeffSwatch = NULL; } if (EmissiveCoeffSwatch) { ReleaseIColorSwatch(EmissiveCoeffSwatch); EmissiveCoeffSwatch = NULL; } if (HwndPanel) { HDC hdc = GetDC(HwndPanel); GetGPort()->RestorePalette(hdc, HpalOld); ReleaseDC(HwndPanel,hdc); } TheMtl->SetFlag(GAMEMTL_ROLLUP1_OPEN,IParams->IsRollupPanelOpen(HwndPanel)); TheMtl->SetFlag(GAMEMTL_ROLLUP2_OPEN,IParams->IsRollupPanelOpen(HwndPsx)); TheMtl->SetFlag(GAMEMTL_ROLLUP3_OPEN,IParams->IsRollupPanelOpen(HwndHints)); TheMtl->SetFlag(GAMEMTL_ROLLUP4_OPEN,IParams->IsRollupPanelOpen(HwndNotes)); TheMtl->RollScroll = IParams->GetRollupScrollPos(); TheMtl->SetParamDlg(NULL); IParams->UnRegisterDlgWnd(HwndPanel); IParams->DeleteRollupPage(HwndPanel); HwndPanel = NULL; IParams->UnRegisterDlgWnd(HwndPsx); IParams->DeleteRollupPage(HwndPsx); HwndPsx = NULL; IParams->UnRegisterDlgWnd(HwndHints); IParams->DeleteRollupPage(HwndHints); HwndHints = NULL; IParams->UnRegisterDlgWnd(HwndNotes); IParams->DeleteRollupPage(HwndNotes); HwndNotes = NULL; } /*********************************************************************************************** * GameMtlDlg::ClassID -- Returns the ClassID of GameMtl * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ Class_ID GameMtlDlg::ClassID() { return GameMaterialClassID; } /*********************************************************************************************** * GameMtlDlg::Invalidate -- causes the dialog to be redrawn * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::Invalidate() { Valid = FALSE; InvalidateRect(HwndPanel,NULL,0); InvalidateRect(HwndPsx,NULL,0); InvalidateRect(HwndHints,NULL,0); InvalidateRect(HwndNotes,NULL,0); } /*********************************************************************************************** * GameMtlDlg::ReloadDialog -- Updates the values in all of the dialog's controls * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::ReloadDialog() { Interval v; TheMtl->Update(IParams->GetTime(),v); LoadDialog(FALSE); } /*********************************************************************************************** * GameMtlDlg::SetTime -- Sets the time value, updates the material and the dialog * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::SetTime(TimeValue t) { if (t!=CurTime) { CurTime = t; Interval v; TheMtl->Update(IParams->GetTime(),v); LoadDialog(TRUE); } } /*********************************************************************************************** * GameMtlDlg::PanelProc -- Windows Message handler * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ BOOL GameMtlDlg::PanelProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { int id = LOWORD(wParam); int code = HIWORD(wParam); int mtype; switch (msg) { case WM_INITDIALOG: { HDC theHDC = GetDC(hwndDlg); HpalOld = GetGPort()->PlugPalette(theHDC); ReleaseDC(hwndDlg,theHDC); DiffuseSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_DIFFUSE_COLOR),TheMtl->GetDiffuse(),Get_String(IDS_DIFFUSE_COLOR)); SpecularSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_SPECULAR_COLOR),TheMtl->GetSpecular(),Get_String(IDS_SPECULAR_COLOR)); AmbientCoeffSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_AMBIENT_COEFF),TheMtl->GetAmbientCoeff(),Get_String(IDS_AMBIENT_COEFF)); DiffuseCoeffSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_DIFFUSE_COEFF),TheMtl->GetDiffuseCoeff(),Get_String(IDS_DIFFUSE_COEFF)); SpecularCoeffSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_SPECULAR_COEFF),TheMtl->GetSpecularCoeff(),Get_String(IDS_SPECULAR_COEFF)); EmissiveCoeffSwatch = GetIColorSwatch(GetDlgItem(hwndDlg, IDC_EMISSIVE_COEFF),TheMtl->GetEmissiveCoeff(),Get_String(IDS_EMISSIVE_COEFF)); DCTFramesSpin = SetupIntSpinner(hwndDlg,IDC_DCT_FRAMES_SPIN,IDC_DCT_FRAMES_EDIT,1,999,TheMtl->DCTFrames); DITFramesSpin = SetupIntSpinner(hwndDlg,IDC_DIT_FRAMES_SPIN,IDC_DIT_FRAMES_EDIT,1,999,TheMtl->DITFrames); SCTFramesSpin = SetupIntSpinner(hwndDlg,IDC_SCT_FRAMES_SPIN,IDC_SCT_FRAMES_EDIT,1,999,TheMtl->SCTFrames); SITFramesSpin = SetupIntSpinner(hwndDlg,IDC_SIT_FRAMES_SPIN,IDC_SIT_FRAMES_EDIT,1,999,TheMtl->SITFrames); DCTRateSpin = SetupFloatSpinner(hwndDlg,IDC_DCT_RATE_SPIN,IDC_DCT_RATE_EDIT,0.0f,60.0f,TheMtl->DCTFrameRate,5.0f); DITRateSpin = SetupFloatSpinner(hwndDlg,IDC_DIT_RATE_SPIN,IDC_DIT_RATE_EDIT,0.0f,60.0f,TheMtl->DITFrameRate,5.0f); SCTRateSpin = SetupFloatSpinner(hwndDlg,IDC_SCT_RATE_SPIN,IDC_SCT_RATE_EDIT,0.0f,60.0f,TheMtl->SCTFrameRate,5.0f); SITRateSpin = SetupFloatSpinner(hwndDlg,IDC_SIT_RATE_SPIN,IDC_SIT_RATE_EDIT,0.0f,60.0f,TheMtl->SITFrameRate,5.0f); OpacitySpin = SetupFloatSpinner(hwndDlg,IDC_OPACITY_SPIN,IDC_OPACITY_EDIT,0.0f,1.0f,TheMtl->GetOpacity(),0.01f); TranslucencySpin = SetupFloatSpinner(hwndDlg,IDC_TRANSLUCENCY_SPIN,IDC_TRANSULCENCY_EDIT,0.0f,1.0f,TheMtl->GetTranslucency(),0.01f); ShininessSpin = SetupFloatSpinner(hwndDlg,IDC_SHININESS_SPIN,IDC_SHININESS_EDIT,1.0f,1000.0f,TheMtl->GetShininess(),1.0f); FogSpin = SetupFloatSpinner(hwndDlg,IDC_FOG_SPIN,IDC_FOG_EDIT,0.0f,1.0f,TheMtl->FogCoeff,0.01f); SendDlgItemMessage( hwndDlg, IDC_DCT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_UV_MAPPING)); SendDlgItemMessage( hwndDlg, IDC_DCT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_ENVIRONMENT_MAPPING) ); SendDlgItemMessage( hwndDlg, IDC_DIT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_UV_MAPPING)); SendDlgItemMessage( hwndDlg, IDC_DIT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_ENVIRONMENT_MAPPING) ); SendDlgItemMessage( hwndDlg, IDC_SCT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_UV_MAPPING)); SendDlgItemMessage( hwndDlg, IDC_SCT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_ENVIRONMENT_MAPPING) ); SendDlgItemMessage( hwndDlg, IDC_SIT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_UV_MAPPING)); SendDlgItemMessage( hwndDlg, IDC_SIT_MAPPING_COMBO, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) Get_String(IDS_ENVIRONMENT_MAPPING) ); /* Installing a windproc for texmap buttons which will handle drag-n-drop HWND hw = GetDlgItem(hwndDlg, texMapID[i]); WNDPROC oldp = (WNDPROC)GetWindowLong(hw, GWL_WNDPROC); SetWindowLong( hw, GWL_WNDPROC, (LONG)TexSlotWndProc); SetWindowLong( hw, GWL_USERDATA, (LONG)oldp); */ return TRUE; } break; case WM_COMMAND: { switch (id) { case IDC_DCT_BUTTON: { BitmapInfo bmi; BitmapTex * texture; if (TheManager->SelectFileInput(&bmi, HwndEdit)) { texture = NewDefaultBitmapTex(); if (texture) { texture->SetMapName((char *)bmi.Name()); TheMtl->SetSubTexmap(ID_DI,texture); UpdateMtlDisplay(); TheMtl->NotifyChanged(); } } } break; case IDC_DIT_BUTTON: { BitmapInfo bmi; BitmapTex * texture; if (TheManager->SelectFileInput(&bmi, HwndEdit)) { texture = NewDefaultBitmapTex(); if (texture) { texture->SetMapName((char *)bmi.Name()); TheMtl->SetSubTexmap(ID_SI,texture); UpdateMtlDisplay(); TheMtl->NotifyChanged(); } } } break; case IDC_SCT_BUTTON: { BitmapInfo bmi; BitmapTex * texture; if (TheManager->SelectFileInput(&bmi, HwndEdit)) { texture = NewDefaultBitmapTex(); if (texture) { texture->SetMapName((char *)bmi.Name()); TheMtl->SetSubTexmap(ID_SP,texture); UpdateMtlDisplay(); TheMtl->NotifyChanged(); } } } break; case IDC_SIT_BUTTON: { BitmapInfo bmi; BitmapTex * texture; if (TheManager->SelectFileInput(&bmi, HwndEdit)) { texture = NewDefaultBitmapTex(); if (texture) { texture->SetMapName((char *)bmi.Name()); TheMtl->SetSubTexmap(ID_RL,texture); UpdateMtlDisplay(); TheMtl->NotifyChanged(); } } } break; case IDC_MAPON_DCT: TheMtl->EnableMap(ID_DI,GetCheckBox(hwndDlg, id)); if (!GetCheckBox(hwndDlg,id)) TheMtl->SetSubTexmap(ID_DI,NULL); UpdateTexmapDisplay(ID_DI); UpdateMtlDisplay(); TheMtl->NotifyChanged(); break; case IDC_MAPON_DIT: TheMtl->EnableMap(ID_SI,GetCheckBox(hwndDlg, id)); if (!GetCheckBox(hwndDlg,id)) TheMtl->SetSubTexmap(ID_SI,NULL); UpdateTexmapDisplay(ID_SI); UpdateMtlDisplay(); TheMtl->NotifyChanged(); break; case IDC_MAPON_SCT: TheMtl->EnableMap(ID_SP,GetCheckBox(hwndDlg, id)); if (!GetCheckBox(hwndDlg,id)) TheMtl->SetSubTexmap(ID_SP,NULL); UpdateTexmapDisplay(ID_SP); UpdateMtlDisplay(); TheMtl->NotifyChanged(); break; case IDC_MAPON_SIT: TheMtl->EnableMap(ID_RL,GetCheckBox(hwndDlg, id)); if (!GetCheckBox(hwndDlg,id)) TheMtl->SetSubTexmap(ID_RL,NULL); UpdateTexmapDisplay(ID_RL); UpdateMtlDisplay(); TheMtl->NotifyChanged(); break; case IDC_USE_ALPHA_CHECK: TheMtl->SetAttribute(GAMEMTL_USE_ALPHA,GetCheckBox(hwndDlg,IDC_USE_ALPHA_CHECK)); UpdateMtlDisplay(); TheMtl->NotifyChanged(); break; case IDC_USE_SORTING_CHECK: TheMtl->SetAttribute(GAMEMTL_USE_SORTING,GetCheckBox(hwndDlg,IDC_USE_SORTING_CHECK)); break; case IDC_DCT_MAPPING_COMBO: mtype = SendDlgItemMessage(hwndDlg,IDC_DCT_MAPPING_COMBO,CB_GETCURSEL,0,0); TheMtl->DCTMappingType = mtype; break; case IDC_DIT_MAPPING_COMBO: mtype = SendDlgItemMessage(hwndDlg,IDC_DIT_MAPPING_COMBO,CB_GETCURSEL,0,0); TheMtl->DITMappingType = mtype; break; case IDC_SCT_MAPPING_COMBO: mtype = SendDlgItemMessage(hwndDlg,IDC_SCT_MAPPING_COMBO,CB_GETCURSEL,0,0); TheMtl->SCTMappingType = mtype; break; case IDC_SIT_MAPPING_COMBO: mtype = SendDlgItemMessage(hwndDlg,IDC_SIT_MAPPING_COMBO,CB_GETCURSEL,0,0); TheMtl->SITMappingType = mtype; break; case IDC_VIEWPORT_DISPLAY_CHECK: TheMtl->Set_Viewport_Display_Status(GetCheckBox(hwndDlg,IDC_VIEWPORT_DISPLAY_CHECK)); TheMtl->NotifyChanged(); UpdateMtlDisplay(); break; } } break; case CC_COLOR_CHANGE: { // just update all of the colors TheMtl->Diffuse = DiffuseSwatch->GetColor(); TheMtl->Specular = SpecularSwatch->GetColor(); TheMtl->AmbientCoeff = AmbientCoeffSwatch->GetColor(); TheMtl->DiffuseCoeff = DiffuseCoeffSwatch->GetColor(); TheMtl->SpecularCoeff = SpecularCoeffSwatch->GetColor(); TheMtl->EmissiveCoeff = EmissiveCoeffSwatch->GetColor(); TheMtl->NotifyChanged(); UpdateMtlDisplay(); } break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: { IParams->RollupMouseMessage(hwndDlg,msg,wParam,lParam); } return FALSE; case CC_SPINNER_CHANGE: { TheMtl->DCTFrames = DCTFramesSpin->GetIVal(); TheMtl->DITFrames = DITFramesSpin->GetIVal(); TheMtl->SCTFrames = SCTFramesSpin->GetIVal(); TheMtl->SITFrames = SITFramesSpin->GetIVal(); TheMtl->DCTFrameRate = DCTRateSpin->GetFVal(); TheMtl->DITFrameRate = DITRateSpin->GetFVal(); TheMtl->SCTFrameRate = SCTRateSpin->GetFVal(); TheMtl->SITFrameRate = SITRateSpin->GetFVal(); TheMtl->SetOpacity(OpacitySpin->GetFVal()); TheMtl->SetTranslucency(TranslucencySpin->GetFVal()); TheMtl->SetShininess(ShininessSpin->GetFVal()); TheMtl->FogCoeff = FogSpin->GetFVal(); TheMtl->NotifyChanged(); UpdateMtlDisplay(); } break; case CC_SPINNER_BUTTONUP: { #if 0 UpdateMtlDisplay(); #endif } break; case WM_PAINT: { if (!Valid) { Valid = TRUE; ReloadDialog(); } } return FALSE; case WM_CLOSE: break; case WM_DESTROY: TheMtl->DCTFrames = DCTFramesSpin->GetIVal(); TheMtl->DITFrames = DITFramesSpin->GetIVal(); TheMtl->SCTFrames = SCTFramesSpin->GetIVal(); TheMtl->SITFrames = SITFramesSpin->GetIVal(); TheMtl->DCTFrameRate = DCTRateSpin->GetFVal(); TheMtl->DITFrameRate = DITRateSpin->GetFVal(); TheMtl->SCTFrameRate = SCTRateSpin->GetFVal(); TheMtl->SITFrameRate = SITRateSpin->GetFVal(); TheMtl->SetOpacity(OpacitySpin->GetFVal()); TheMtl->SetTranslucency(TranslucencySpin->GetFVal()); TheMtl->SetShininess(ShininessSpin->GetFVal()); TheMtl->FogCoeff = FogSpin->GetFVal(); ReleaseISpinner(DCTFramesSpin); ReleaseISpinner(DITFramesSpin); ReleaseISpinner(SCTFramesSpin); ReleaseISpinner(SITFramesSpin); ReleaseISpinner(DCTRateSpin); ReleaseISpinner(DITRateSpin); ReleaseISpinner(SCTRateSpin); ReleaseISpinner(SITRateSpin); ReleaseISpinner(OpacitySpin); ReleaseISpinner(TranslucencySpin); ReleaseISpinner(ShininessSpin); ReleaseISpinner(FogSpin); DCTFramesSpin = DITFramesSpin = SCTFramesSpin = SITFramesSpin = NULL; DCTRateSpin = DITRateSpin = SCTRateSpin = SITRateSpin = NULL; OpacitySpin = TranslucencySpin = ShininessSpin = FogSpin = NULL; break; } return FALSE; } /*********************************************************************************************** * PanelDlgProc -- Windows Proc which thunks into GameMtlDlg::PanelProc * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ static BOOL CALLBACK PanelDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { GameMtlDlg *theDlg; if (msg==WM_INITDIALOG) { theDlg = (GameMtlDlg*)lParam; theDlg->HwndPanel = hwndDlg; SetWindowLong(hwndDlg, GWL_USERDATA,lParam); } else { if ((theDlg = (GameMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) { return FALSE; } } BOOL res; theDlg->IsActive = 1; res = theDlg->PanelProc(hwndDlg,msg,wParam,lParam); theDlg->IsActive = 0; return res; } /*********************************************************************************************** * GameMtlDlg::NotesProc -- Dialog Proc for the Notes panel * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ BOOL GameMtlDlg::NotesProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int id = LOWORD(wParam); int code = HIWORD(wParam); switch (msg) { case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: { IParams->RollupMouseMessage(hwndDlg,msg,wParam,lParam); return FALSE; } case WM_COMMAND: { int i = lParam; } break; } return FALSE; } /*********************************************************************************************** * NotesDlgProc -- Dialog Proc which thunks to GameMtlDlg::NotesProc * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ static BOOL CALLBACK NotesDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { GameMtlDlg *theDlg; if (msg==WM_INITDIALOG) { theDlg = (GameMtlDlg*)lParam; theDlg->HwndNotes = hwndDlg; SetWindowLong(hwndDlg, GWL_USERDATA,lParam); } else { if ((theDlg = (GameMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) { return FALSE; } } BOOL res; theDlg->IsActive = 1; res = theDlg->NotesProc(hwndDlg,msg,wParam,lParam); theDlg->IsActive = 0; return res; } /*********************************************************************************************** * GameMtlDlg::HintsProc -- Dialog Proc for the hints panel * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 3/30/98 GTH : Created. * *=============================================================================================*/ BOOL GameMtlDlg::HintsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int id = LOWORD(wParam); int code = HIWORD(wParam); switch (msg) { case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: { IParams->RollupMouseMessage(hwndDlg,msg,wParam,lParam); return FALSE; } case WM_COMMAND: { switch(id) { case IDC_DIT_OVER_DCT_CHECK: TheMtl->SetAttribute(GAMEMTL_DIT_OVER_DCT, GetCheckBox(hwndDlg, IDC_DIT_OVER_DCT_CHECK)); break; case IDC_SIT_OVER_SCT_CHECK: TheMtl->SetAttribute(GAMEMTL_SIT_OVER_SCT, GetCheckBox(hwndDlg, IDC_SIT_OVER_SCT_CHECK)); break; case IDC_DIT_OVER_DIG_CHECK: TheMtl->SetAttribute(GAMEMTL_DIT_OVER_DIG, GetCheckBox(hwndDlg, IDC_DIT_OVER_DIG_CHECK)); break; case IDC_SIT_OVER_SIG_CHECK: TheMtl->SetAttribute(GAMEMTL_SIT_OVER_SIG, GetCheckBox(hwndDlg, IDC_SIT_OVER_SIG_CHECK)); break; case IDC_FAST_SPECULAR_AFTER_ALPHA_CHECK: TheMtl->SetAttribute(GAMEMTL_FAST_SPECULAR_AFTER_ALPHA, GetCheckBox(hwndDlg, IDC_FAST_SPECULAR_AFTER_ALPHA_CHECK)); break; } } break; } return FALSE; } /*********************************************************************************************** * HintsDlgProc -- Dialog proc which thunks to GameMtlDlg::HintsProc * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 3/30/98 GTH : Created. * *=============================================================================================*/ static BOOL CALLBACK HintsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { GameMtlDlg *theDlg; if (msg==WM_INITDIALOG) { theDlg = (GameMtlDlg*)lParam; theDlg->HwndHints = hwndDlg; SetWindowLong(hwndDlg, GWL_USERDATA,lParam); } else { if ((theDlg = (GameMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) { return FALSE; } } BOOL res; theDlg->IsActive = 1; res = theDlg->HintsProc(hwndDlg,msg,wParam,lParam); theDlg->IsActive = 0; return res; } /*********************************************************************************************** * GameMtlDlg::PsxProc -- Dialog proc for the PSX options panel * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 3/31/98 GTH : Created. * *=============================================================================================*/ BOOL GameMtlDlg::PsxProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int id = LOWORD(wParam); int code = HIWORD(wParam); switch (msg) { case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: { IParams->RollupMouseMessage(hwndDlg,msg,wParam,lParam); return FALSE; } case WM_COMMAND: { switch(id) { case IDC_NO_TRANS: TheMtl->SetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK,0); break; case IDC_100_TRANS: TheMtl->SetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK,GAMEMTL_PSX_100_TRANS); break; case IDC_50_TRANS: TheMtl->SetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK,GAMEMTL_PSX_50_TRANS); break; case IDC_25_TRANS: TheMtl->SetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK,GAMEMTL_PSX_25_TRANS); break; case IDC_MINUS_100_TRANS: TheMtl->SetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK,GAMEMTL_PSX_MINUS_100_TRANS); break; case IDC_NO_RT_LIGHTING: TheMtl->SetAttribute(GAMEMTL_PSX_NO_RT_LIGHTING, GetCheckBox(hwndDlg, IDC_NO_RT_LIGHTING)); break; } } break; } return FALSE; } /*********************************************************************************************** * PsxDlgProc -- Dialog proc which thunks into GameMtlDlg::PsxProc * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 3/31/98 GTH : Created. * *=============================================================================================*/ static BOOL CALLBACK PsxDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { GameMtlDlg *theDlg; if (msg==WM_INITDIALOG) { theDlg = (GameMtlDlg*)lParam; theDlg->HwndPsx = hwndDlg; SetWindowLong(hwndDlg, GWL_USERDATA,lParam); } else { if ((theDlg = (GameMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) { return FALSE; } } BOOL res; theDlg->IsActive = 1; res = theDlg->PsxProc(hwndDlg,msg,wParam,lParam); theDlg->IsActive = 0; return res; } /*********************************************************************************************** * GameMtlDlg::LoadDialog -- Sets the state of all of the dialog's controls * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::LoadDialog(BOOL draw) { /* ** Set the state of the entire panel based on the current material. */ if (TheMtl && HwndPanel) { /* ** Init all of the color swatches */ if (DiffuseSwatch) { DiffuseSwatch->InitColor(TheMtl->GetDiffuse()); } if (SpecularSwatch) { SpecularSwatch->InitColor(TheMtl->GetSpecular()); } if (AmbientCoeffSwatch) { AmbientCoeffSwatch->InitColor(TheMtl->GetAmbientCoeff()); } if (DiffuseCoeffSwatch) { DiffuseCoeffSwatch->InitColor(TheMtl->GetDiffuseCoeff()); } if (SpecularCoeffSwatch) { SpecularCoeffSwatch->InitColor(TheMtl->GetSpecularCoeff()); } if (EmissiveCoeffSwatch) { EmissiveCoeffSwatch->InitColor(TheMtl->GetEmissiveCoeff()); } /* ** Checkboxes */ SetCheckBox(HwndPanel,IDC_USE_ALPHA_CHECK, TheMtl->GetAttribute(GAMEMTL_USE_ALPHA)); SetCheckBox(HwndPanel,IDC_USE_SORTING_CHECK, TheMtl->GetAttribute(GAMEMTL_USE_SORTING)); SetCheckBox(HwndPanel,IDC_VIEWPORT_DISPLAY_CHECK,TheMtl->Get_Viewport_Display_Status()); /* ** Texture maps enable checks. */ SetCheckBox(HwndPanel,IDC_MAPON_DCT, TheMtl->SubTexmapOn(ID_DI)); SetCheckBox(HwndPanel,IDC_MAPON_DIT, TheMtl->SubTexmapOn(ID_SI)); SetCheckBox(HwndPanel,IDC_MAPON_SCT, TheMtl->SubTexmapOn(ID_SP)); SetCheckBox(HwndPanel,IDC_MAPON_SIT, TheMtl->SubTexmapOn(ID_RL)); /* ** Mapping types */ SendDlgItemMessage( HwndPanel, IDC_DCT_MAPPING_COMBO, CB_SETCURSEL, TheMtl->DCTMappingType, 0 ); SendDlgItemMessage( HwndPanel, IDC_DIT_MAPPING_COMBO, CB_SETCURSEL, TheMtl->DITMappingType, 0 ); SendDlgItemMessage( HwndPanel, IDC_SCT_MAPPING_COMBO, CB_SETCURSEL, TheMtl->SCTMappingType, 0 ); SendDlgItemMessage( HwndPanel, IDC_SIT_MAPPING_COMBO, CB_SETCURSEL, TheMtl->SITMappingType, 0 ); /* ** Texture animation parameters */ DCTFramesSpin->SetValue(TheMtl->DCTFrames,FALSE); DITFramesSpin->SetValue(TheMtl->DITFrames,FALSE); SCTFramesSpin->SetValue(TheMtl->SCTFrames,FALSE); SITFramesSpin->SetValue(TheMtl->SITFrames,FALSE); DCTRateSpin->SetValue(TheMtl->DCTFrameRate,FALSE); DITRateSpin->SetValue(TheMtl->DITFrameRate,FALSE); SCTRateSpin->SetValue(TheMtl->SCTFrameRate,FALSE); SITRateSpin->SetValue(TheMtl->SITFrameRate,FALSE); /* ** Opacity, translucency, etc */ OpacitySpin->SetValue(TheMtl->Opacity,FALSE); TranslucencySpin->SetValue(TheMtl->Translucency,FALSE); ShininessSpin->SetValue(TheMtl->Shininess,FALSE); FogSpin->SetValue(TheMtl->FogCoeff,FALSE); /* ** Init the Psx flags state */ SetCheckBox(HwndPsx,IDC_NO_RT_LIGHTING, TheMtl->GetAttribute(GAMEMTL_PSX_NO_RT_LIGHTING)); SetCheckBox(HwndPsx,IDC_NO_TRANS, false); SetCheckBox(HwndPsx,IDC_100_TRANS, false); SetCheckBox(HwndPsx,IDC_50_TRANS, false); SetCheckBox(HwndPsx,IDC_25_TRANS, false); SetCheckBox(HwndPsx,IDC_MINUS_100_TRANS, false); switch (TheMtl->GetMaskedAttribute(GAMEMTL_PSX_TRANS_MASK)) { case 0: SetCheckBox(HwndPsx,IDC_NO_TRANS,true); break; case GAMEMTL_PSX_100_TRANS: SetCheckBox(HwndPsx,IDC_100_TRANS,true); break; case GAMEMTL_PSX_50_TRANS: SetCheckBox(HwndPsx,IDC_50_TRANS,true); break; case GAMEMTL_PSX_25_TRANS: SetCheckBox(HwndPsx,IDC_25_TRANS,true); break; case GAMEMTL_PSX_MINUS_100_TRANS: SetCheckBox(HwndPsx,IDC_MINUS_100_TRANS,true); break; } /* ** Init the Hints state */ SetCheckBox(HwndHints,IDC_DIT_OVER_DCT_CHECK, TheMtl->GetAttribute(GAMEMTL_DIT_OVER_DCT)); SetCheckBox(HwndHints,IDC_SIT_OVER_SCT_CHECK, TheMtl->GetAttribute(GAMEMTL_SIT_OVER_SCT)); SetCheckBox(HwndHints,IDC_DIT_OVER_DIG_CHECK, TheMtl->GetAttribute(GAMEMTL_DIT_OVER_DIG)); SetCheckBox(HwndHints,IDC_SIT_OVER_SIG_CHECK, TheMtl->GetAttribute(GAMEMTL_SIT_OVER_SIG)); SetCheckBox(HwndHints,IDC_FAST_SPECULAR_AFTER_ALPHA_CHECK, TheMtl->GetAttribute(GAMEMTL_FAST_SPECULAR_AFTER_ALPHA)); /* ** Init the texmaps state */ for (int i=0; iMtlChanged(); } /*********************************************************************************************** * GameMtlDlg::ActivateDlg -- Activates and deactivates the dialog * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::ActivateDlg(BOOL onOff) { if (DiffuseSwatch) { DiffuseSwatch->Activate(onOff); } if (SpecularSwatch) { SpecularSwatch->Activate(onOff); } if (AmbientCoeffSwatch) { AmbientCoeffSwatch->Activate(onOff); } if (DiffuseCoeffSwatch) { DiffuseCoeffSwatch->Activate(onOff); } if (SpecularCoeffSwatch) { SpecularCoeffSwatch->Activate(onOff); } if (EmissiveCoeffSwatch) { EmissiveCoeffSwatch->Activate(onOff); } } /*********************************************************************************************** * GameMtlDlg::SetThing -- Sets the material to be edited * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::SetThing(ReferenceTarget *m) { assert (m->SuperClassID()==MATERIAL_CLASS_ID); assert (m->ClassID()==GameMaterialClassID); if (TheMtl) { TheMtl->ParamPanel = NULL; } TheMtl = (GameMtl *)m; if (TheMtl) { TheMtl->ParamPanel = this; } LoadDialog(TRUE); if (HwndPanel && DiffuseSwatch) { DiffuseSwatch->InitColor(TheMtl->GetDiffuse()); } if (HwndPanel && SpecularSwatch) { SpecularSwatch->InitColor(TheMtl->GetSpecular()); } if (HwndPanel && AmbientCoeffSwatch) { AmbientCoeffSwatch->InitColor(TheMtl->GetAmbientCoeff()); } if (HwndPanel && DiffuseCoeffSwatch) { DiffuseCoeffSwatch->InitColor(TheMtl->GetDiffuseCoeff()); } if (HwndPanel && SpecularCoeffSwatch) { SpecularCoeffSwatch->InitColor(TheMtl->GetSpecularCoeff()); } if (HwndPanel && EmissiveCoeffSwatch) { EmissiveCoeffSwatch->InitColor(TheMtl->GetEmissiveCoeff()); } } /*********************************************************************************************** * GameMtlDlg::BuildDialog -- Adds the dialog to the material editor * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::BuildDialog() { if ((TheMtl->Flags&(GAMEMTL_ROLLUP_FLAGS))==0) { TheMtl->SetFlag(GAMEMTL_ROLLUP1_OPEN,TRUE); } HwndPanel = IParams->AddRollupPage( AppInstance, MAKEINTRESOURCE(IDD_GAMEMTL_PANEL), PanelDlgProc, Get_String(IDS_PARAMETERS), (LPARAM)this, (TheMtl->GetFlag(GAMEMTL_ROLLUP1_OPEN) ? 0:APPENDROLL_CLOSED) ); HwndPsx = IParams->AddRollupPage( AppInstance, MAKEINTRESOURCE(IDD_GAMEMTL_PSX_PANEL), PsxDlgProc, Get_String(IDS_PSX_OPTIONS), (LPARAM)this, (TheMtl->GetFlag(GAMEMTL_ROLLUP2_OPEN) ? 0:APPENDROLL_CLOSED) ); HwndHints = IParams->AddRollupPage( AppInstance, MAKEINTRESOURCE(IDD_GAMEMTL_HINTS_PANEL), HintsDlgProc, Get_String(IDS_MATERIAL_HINTS), (LPARAM)this, (TheMtl->GetFlag(GAMEMTL_ROLLUP3_OPEN) ? 0:APPENDROLL_CLOSED) ); HwndNotes = IParams->AddRollupPage( AppInstance, MAKEINTRESOURCE(IDD_MATERIAL_NOTES_PANEL), NotesDlgProc, Get_String(IDS_NOTES), (LPARAM)this, (TheMtl->GetFlag(GAMEMTL_ROLLUP4_OPEN) ? 0:APPENDROLL_CLOSED) ); IParams->SetRollupScrollPos(TheMtl->RollScroll); } /*********************************************************************************************** * GameMtlDlg::UpdateTexmapDisplay -- Updates the texture map buttons * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 06/26/1997 GH : Created. * *=============================================================================================*/ void GameMtlDlg::UpdateTexmapDisplay(int i) { TSTR nm = Get_String(IDS_NONE); Texmap *texmap = (*TheMtl->Maps)[i].Map; if (texmap) nm = texmap->GetFullName(); // Diffuse Map -> Surrender Diffuse Color Channel if (i == ID_DI) { SetCheckBox(HwndPanel, IDC_MAPON_DCT, TheMtl->IsMapEnabled(i)); SetDlgItemText(HwndPanel, IDC_DCT_BUTTON, nm.data()); } // Self Illumination Map -> Surrender Diffuse Illumination Channel if (i == ID_SI) { SetCheckBox(HwndPanel, IDC_MAPON_DIT, TheMtl->IsMapEnabled(i)); SetDlgItemText(HwndPanel, IDC_DIT_BUTTON, nm.data()); } // Specular Map -> Surrender Specular Color Channel if (i == ID_SP) { SetCheckBox(HwndPanel, IDC_MAPON_SCT, TheMtl->IsMapEnabled(i)); SetDlgItemText(HwndPanel, IDC_SCT_BUTTON, nm.data()); } // Reflection Map -> Surrender Specular Illumination Channel if (i == ID_RL) { SetCheckBox(HwndPanel, IDC_MAPON_SIT, TheMtl->IsMapEnabled(i)); SetDlgItemText(HwndPanel, IDC_SIT_BUTTON, nm.data()); } }