| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- /*
- ** Command & Conquer Renegade(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 <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project name : Buccaneer Bay *
- * *
- * File name : PS2GameMtlShaderDlg.cpp *
- * *
- * Programmer : Mike Lytle *
- * *
- * Start date : 10/12/1999 *
- * *
- * Last update : 10/12/1999 *
- * *
- * Taken from GTH's GameMtlShaderDlg.cpp *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * PS2GameMtlShaderDlg -- Constructor. *
- * PGMSD::Dialog_Proc -- Respond to user selections. *
- * PGMSD::ReloadDialog -- Setup the dialog box. *
- * PGMSD::Apply_Preset -- Notify the material of the values for the selected setting. *
- * PGMSD::Set_Preset -- Sets the dialog to one of the presets or custom. *
- * PGMSD::CompareShaderToBlendPreset -- Determine if the settings conform to one of the prese*
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "PS2GameMtlShaderDlg.h"
- #include "GameMtlDlg.h"
- #include "GameMtl.h"
- #include "resource.h"
- #define NUM_PS2_SHADER_BLEND_PRESETS 7
- static char * _PS2ShaderBlendSettingPresetNames[NUM_PS2_SHADER_BLEND_PRESETS + 1] =
- {
- "Opaque",
- "Additive",
- "Source Subtracted",
- "Destination Subtracted",
- "Alpha Blend",
- "Alpha Test",
- "Alpha Test and Blend",
- "------ Custom -----"
- };
- struct PS2ShaderBlendSettingPreset
- {
- int A;
- int B;
- int C;
- int D;
- bool DepthMask;
- bool AlphaTest;
- };
- // (A - B) * C + D
- static const PS2ShaderBlendSettingPreset PS2ShaderBlendSettingPresets[NUM_PS2_SHADER_BLEND_PRESETS] = {
- {PSS_SRC, PSS_ZERO, PSS_ONE, PSS_ZERO, true, false}, // Opaque
- {PSS_SRC, PSS_ZERO, PSS_ONE, PSS_DEST, false, false}, // Additive
- {PSS_DEST, PSS_SRC, PSS_ONE, PSS_ZERO, false, false}, // Src subtracted
- {PSS_SRC, PSS_DEST, PSS_ONE, PSS_ZERO, false, false}, // Dest subtracted
- {PSS_SRC, PSS_DEST, PSS_SRC_ALPHA, PSS_DEST, false, false}, // Alpha blend
- {PSS_SRC, PSS_ZERO, PSS_ONE, PSS_ZERO, true, true}, // Alpha test
- {PSS_SRC, PSS_DEST, PSS_SRC_ALPHA, PSS_DEST, true, true}, // Alpha test & blend
- };
- /***********************************************************************************************
- * PS2GameMtlShaderDlg -- Constructor. *
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- PS2GameMtlShaderDlg::PS2GameMtlShaderDlg
- (
- HWND parent,
- IMtlParams * imp,
- GameMtl * mtl,
- int pass
- ) : GameMtlFormClass(imp,mtl,pass)
- {
- Create_Form(parent, IDD_GAMEMTL_PS2_SHADER);
- }
- /***********************************************************************************************
- * PGMSD::Dialog_Proc -- Respond to user selections. *
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- BOOL PS2GameMtlShaderDlg::Dialog_Proc (HWND dlg_wnd, UINT message, WPARAM wparam, LPARAM lparam)
- {
- int cursel;
- int i;
- int id = LOWORD(wparam);
- int code = HIWORD(wparam);
-
- switch (message)
- {
- case WM_INITDIALOG:
- for(i = 0; i <= NUM_PS2_SHADER_BLEND_PRESETS; i++) {
- SendDlgItemMessage(dlg_wnd,IDC_PS2_PRESET_COMBO,CB_ADDSTRING,0,(LONG)_PS2ShaderBlendSettingPresetNames[i]);
- }
- SendDlgItemMessage(dlg_wnd,IDC_PS2_PRESET_COMBO,CB_SETCURSEL,0,0);
- break;
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_MOUSEMOVE:
- {
- IParams->RollupMouseMessage(dlg_wnd,message,wparam,lparam);
- }
- return FALSE;
- case WM_COMMAND:
- {
- if (code == CBN_SELCHANGE) {
-
- switch (id)
- {
- // Shared by both shaders.
- case IDC_DEPTHCOMPARE_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_DEPTHCOMPARE_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_Depth_Compare(PassIndex,cursel);
- break;
- case IDC_PRIGRADIENT_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_PRIGRADIENT_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_Pri_Gradient(PassIndex,cursel);
- TheMtl->Notify_Changed();
- break;
- case IDC_SECGRADIENT_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_SECGRADIENT_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_Sec_Gradient(PassIndex,cursel);
- TheMtl->Notify_Changed();
- break;
- case IDC_DETAILCOLOR_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_DETAILCOLOR_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_Detail_Color_Func(PassIndex,cursel);
- TheMtl->Notify_Changed();
- break;
- case IDC_DETAILALPHA_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_DETAILALPHA_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_Detail_Alpha_Func(PassIndex,cursel);
- TheMtl->Notify_Changed();
- break;
- // Playstation 2 specific.
- case IDC_PS2_PRESET_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_PS2_PRESET_COMBO,CB_GETCURSEL,0,0);
- Apply_Preset(cursel);
- break;
- case IDC_A_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_A_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_PS2_Shader_Param_A(PassIndex,cursel);
- TheMtl->Notify_Changed();
- Set_Preset();
- break;
- case IDC_B_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_B_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_PS2_Shader_Param_B(PassIndex,cursel);
- TheMtl->Notify_Changed();
- Set_Preset();
- break;
- case IDC_C_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_C_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_PS2_Shader_Param_C(PassIndex,cursel);
- TheMtl->Notify_Changed();
- Set_Preset();
- break;
- case IDC_D_COMBO:
- cursel = SendDlgItemMessage(dlg_wnd,IDC_D_COMBO,CB_GETCURSEL,0,0);
- TheMtl->Set_PS2_Shader_Param_D(PassIndex,cursel);
- TheMtl->Notify_Changed();
- Set_Preset();
- break;
- }
- } else {
-
- switch(id) {
-
- case IDC_DEPTHMASK_CHECK:
- if (SendDlgItemMessage(dlg_wnd,IDC_DEPTHMASK_CHECK,BM_GETCHECK,0,0)) {
- TheMtl->Set_Depth_Mask(PassIndex,W3DSHADER_DEPTHMASK_WRITE_ENABLE);
- } else {
- TheMtl->Set_Depth_Mask(PassIndex,W3DSHADER_DEPTHMASK_WRITE_DISABLE);
- }
- Set_Preset();
- break;
- case IDC_ALPHATEST_CHECK:
- if (SendDlgItemMessage(dlg_wnd,IDC_ALPHATEST_CHECK,BM_GETCHECK,0,0)) {
- TheMtl->Set_Alpha_Test(PassIndex,W3DSHADER_ALPHATEST_ENABLE);
- } else {
- TheMtl->Set_Alpha_Test(PassIndex,W3DSHADER_ALPHATEST_DISABLE);
- }
- Set_Preset();
- break;
- case IDC_SHADER_DEFAULTS_BUTTON:
- Set_Advanced_Defaults();
- break;
- }
- }
- }
- }
- return FALSE;
- }
- /***********************************************************************************************
- * PGMSD::ReloadDialog -- Setup the dialog box. *
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- void PS2GameMtlShaderDlg::ReloadDialog(void)
- {
- DebugPrint("GameMtlShaderDlg::ReloadDialog\n");
- SendDlgItemMessage(m_hWnd, IDC_PRIGRADIENT_COMBO, CB_SETCURSEL, TheMtl->Get_Pri_Gradient(PassIndex), 0 );
- SendDlgItemMessage(m_hWnd, IDC_SECGRADIENT_COMBO, CB_SETCURSEL, TheMtl->Get_Sec_Gradient(PassIndex), 0 );
- SendDlgItemMessage(m_hWnd, IDC_DEPTHCOMPARE_COMBO, CB_SETCURSEL, TheMtl->Get_Depth_Compare(PassIndex), 0 );
- SendDlgItemMessage(m_hWnd, IDC_DETAILCOLOR_COMBO, CB_SETCURSEL, TheMtl->Get_Detail_Color_Func(PassIndex), 0 );
- SendDlgItemMessage(m_hWnd, IDC_DETAILALPHA_COMBO, CB_SETCURSEL, TheMtl->Get_Detail_Alpha_Func(PassIndex), 0 );
- SendDlgItemMessage(m_hWnd, IDC_A_COMBO, CB_SETCURSEL, TheMtl->Get_PS2_Shader_Param_A(PassIndex), 0);
- SendDlgItemMessage(m_hWnd, IDC_B_COMBO, CB_SETCURSEL, TheMtl->Get_PS2_Shader_Param_B(PassIndex), 0);
- SendDlgItemMessage(m_hWnd, IDC_C_COMBO, CB_SETCURSEL, TheMtl->Get_PS2_Shader_Param_C(PassIndex), 0);
- SendDlgItemMessage(m_hWnd, IDC_D_COMBO, CB_SETCURSEL, TheMtl->Get_PS2_Shader_Param_D(PassIndex), 0);
- Set_Preset();
-
- SetCheckBox(m_hWnd,IDC_DEPTHMASK_CHECK, TheMtl->Get_Depth_Mask(PassIndex));
- SetCheckBox(m_hWnd,IDC_ALPHATEST_CHECK, TheMtl->Get_Alpha_Test(PassIndex));
- }
- /***********************************************************************************************
- * PGMSD::Apply_Preset -- Notify the material of the values for the selected setting. *
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- void PS2GameMtlShaderDlg::Apply_Preset(int preset_index)
- {
- if (preset_index < 0 || preset_index >= NUM_PS2_SHADER_BLEND_PRESETS) return;
- const PS2ShaderBlendSettingPreset &preset = PS2ShaderBlendSettingPresets[preset_index];
- int depth_mask = preset.DepthMask ? W3DSHADER_DEPTHMASK_WRITE_ENABLE : W3DSHADER_DEPTHMASK_WRITE_DISABLE;
- TheMtl->Set_Depth_Mask(PassIndex, depth_mask);
- int alpha_test = preset.AlphaTest ? W3DSHADER_ALPHATEST_ENABLE : W3DSHADER_ALPHATEST_DISABLE;
- TheMtl->Set_Alpha_Test(PassIndex, alpha_test);
- TheMtl->Set_PS2_Shader_Param_A(PassIndex, preset.A);
- TheMtl->Set_PS2_Shader_Param_B(PassIndex, preset.B);
- TheMtl->Set_PS2_Shader_Param_C(PassIndex, preset.C);
- TheMtl->Set_PS2_Shader_Param_D(PassIndex, preset.D);
- TheMtl->Notify_Changed();
- ReloadDialog();
- if (TheMtl->Compute_PC_Shader_From_PS2_Shader(PassIndex))
- SetWindowText(GetDlgItem(m_hWnd,IDC_COMPATIBLE), " Compatible");
- else
- SetWindowText(GetDlgItem(m_hWnd,IDC_COMPATIBLE), " NOT Compatible");
- }
- /***********************************************************************************************
- * PGMSD::Set_Preset -- Sets the dialog to one of the presets or custom. *
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- void PS2GameMtlShaderDlg::Set_Preset(void)
- {
- for (int i = 0; i < NUM_PS2_SHADER_BLEND_PRESETS; i++) {
- if (CompareShaderToBlendPreset(PS2ShaderBlendSettingPresets[i])) break;
- }
- SendDlgItemMessage(m_hWnd, IDC_PS2_PRESET_COMBO, CB_SETCURSEL, i, 0);
- if (TheMtl->Compute_PC_Shader_From_PS2_Shader(PassIndex))
- SetWindowText(GetDlgItem(m_hWnd,IDC_COMPATIBLE), " Compatible");
- else
- SetWindowText(GetDlgItem(m_hWnd,IDC_COMPATIBLE), " NOT Compatible");
- }
- /***********************************************************************************************
- * PGMSD::CompareShaderToBlendPreset -- Determine if the settings conform to one of the presets*
- * *
- * *
- * *
- * *
- * HISTORY: *
- * 10/12/1999MLL: Created. *
- *=============================================================================================*/
- bool PS2GameMtlShaderDlg::CompareShaderToBlendPreset(const PS2ShaderBlendSettingPreset &blend_preset)
- {
- bool depthmask = TheMtl->Get_Depth_Mask(PassIndex) != W3DSHADER_DEPTHMASK_WRITE_DISABLE;
- if (depthmask != blend_preset.DepthMask) return false;
- bool alphatest = TheMtl->Get_Alpha_Test(PassIndex) != W3DSHADER_ALPHATEST_DISABLE;
- if (alphatest != blend_preset.AlphaTest) return false;
- if (TheMtl->Get_PS2_Shader_Param_A(PassIndex) != blend_preset.A) return false;
- if (TheMtl->Get_PS2_Shader_Param_B(PassIndex) != blend_preset.B) return false;
- if (TheMtl->Get_PS2_Shader_Param_C(PassIndex) != blend_preset.C) return false;
- if (TheMtl->Get_PS2_Shader_Param_D(PassIndex) != blend_preset.D) return false;
- return true;
- }
- /***********************************************************************************************
- * GameMtlShaderDlg::Set_Advanced_Defaults -- set advanced settings to defaults *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * *
- * WARNINGS: *
- * *
- * HISTORY: *
- * 02/26/99 NH : Created. *
- *=============================================================================================*/
- void PS2GameMtlShaderDlg::Set_Advanced_Defaults(void)
- {
- TheMtl->Set_Pri_Gradient(PassIndex, PSS_PRIGRADIENT_MODULATE);
- TheMtl->Set_Depth_Compare(PassIndex, PSS_DEPTHCOMPARE_PASS_LEQUAL);
- TheMtl->Set_Detail_Color_Func(PassIndex, W3DSHADER_DETAILCOLORFUNC_DEFAULT);
- TheMtl->Set_Detail_Alpha_Func(PassIndex, W3DSHADER_DETAILALPHAFUNC_DEFAULT);
- TheMtl->Notify_Changed();
- ReloadDialog();
- }
|