CnC_Generals_Zero_Hour/GeneralsMD/Code/Tools/WW3D/max2w3d/GameMtlVertexMaterialDlg.cpp

393 lines
17 KiB
C++
Raw Normal View History

/*
** 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 <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 : Max2W3d *
* *
* $Archive:: /Commando/Code/Tools/max2w3d/GameMtlVertexMaterialDlg.cpp $*
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 7/10/00 3:37p $*
* *
* $Revision:: 12 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* GameMtlVertexMaterialDlg::GameMtlVertexMaterialDlg -- constructor *
* GameMtlVertexMaterialDlg::~GameMtlVertexMaterialDlg -- destructor *
* GameMtlVertexMaterialDlg::Dialog_Proc -- windows message handler *
* GameMtlVertexMaterialDlg::ReloadDialog -- reload the contents of the controls *
* GameMtlVertexMaterialDlg::ActivateDlg -- activate / deactivate this dialog *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "GameMtlVertexMaterialDlg.h"
#include "GameMtl.h"
#include "dllmain.h"
#include "resource.h"
/***********************************************************************************************
* GameMtlVertexMaterialDlg::GameMtlVertexMaterialDlg -- constructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
GameMtlVertexMaterialDlg::GameMtlVertexMaterialDlg
(
HWND parent,
IMtlParams * imp,
GameMtl * mtl,
int pass
) :
GameMtlFormClass(imp,mtl,pass)
{
AmbientSwatch = NULL;
DiffuseSwatch = NULL;
SpecularSwatch = NULL;
EmissiveSwatch = NULL;
OpacitySpin = NULL;
TranslucencySpin = NULL;
ShininessSpin = NULL;
for (int i=0; i<MAX_STAGES; i++) {
UVChannelSpin[i] = NULL;
}
Create_Form(parent,IDD_GAMEMTL_VERTEX_MATERIAL);
}
/***********************************************************************************************
* GameMtlVertexMaterialDlg::~GameMtlVertexMaterialDlg -- destructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
GameMtlVertexMaterialDlg::~GameMtlVertexMaterialDlg()
{
if (AmbientSwatch) {
ReleaseIColorSwatch(AmbientSwatch);
}
if (DiffuseSwatch) {
ReleaseIColorSwatch(DiffuseSwatch);
}
if (SpecularSwatch) {
ReleaseIColorSwatch(SpecularSwatch);
}
if (EmissiveSwatch) {
ReleaseIColorSwatch(EmissiveSwatch);
}
if (OpacitySpin) {
ReleaseISpinner(OpacitySpin);
}
if (TranslucencySpin) {
ReleaseISpinner(TranslucencySpin);
}
if (ShininessSpin) {
ReleaseISpinner(ShininessSpin);
}
for (int i=0; i<MAX_STAGES; i++) {
if (UVChannelSpin[i] != NULL) {
ReleaseISpinner(UVChannelSpin[i]);
}
}
}
/***********************************************************************************************
* GameMtlVertexMaterialDlg::Dialog_Proc -- windows message handler *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
BOOL GameMtlVertexMaterialDlg::Dialog_Proc(HWND dlg_wnd, UINT message, WPARAM wparam, LPARAM lparam)
{
int val;
int id = LOWORD(wparam);
int code = HIWORD(wparam);
switch (message)
{
case WM_INITDIALOG:
{
AmbientSwatch = GetIColorSwatch(GetDlgItem(dlg_wnd, IDC_AMBIENT_COLOR),TheMtl->Get_Ambient(PassIndex,IParams->GetTime()),Get_String(IDS_AMBIENT_COLOR));
DiffuseSwatch = GetIColorSwatch(GetDlgItem(dlg_wnd, IDC_DIFFUSE_COLOR),TheMtl->Get_Diffuse(PassIndex,IParams->GetTime()),Get_String(IDS_DIFFUSE_COLOR));
SpecularSwatch = GetIColorSwatch(GetDlgItem(dlg_wnd, IDC_SPECULAR_COLOR),TheMtl->Get_Specular(PassIndex,IParams->GetTime()),Get_String(IDS_SPECULAR_COLOR));
EmissiveSwatch = GetIColorSwatch(GetDlgItem(dlg_wnd, IDC_EMISSIVE_COLOR),TheMtl->Get_Emissive(PassIndex,IParams->GetTime()),Get_String(IDS_EMISSIVE_COLOR));
OpacitySpin = SetupFloatSpinner(dlg_wnd,IDC_OPACITY_SPIN,IDC_OPACITY_EDIT,0.0f,1.0f,TheMtl->Get_Opacity(PassIndex,IParams->GetTime()),0.01f);
TranslucencySpin = SetupFloatSpinner(dlg_wnd,IDC_TRANSLUCENCY_SPIN,IDC_TRANSULCENCY_EDIT,0.0f,1.0f,TheMtl->Get_Translucency(PassIndex,IParams->GetTime()),0.01f);
ShininessSpin = SetupFloatSpinner(dlg_wnd,IDC_SHININESS_SPIN,IDC_SHININESS_EDIT,1.0f,1000.0f,TheMtl->Get_Shininess(PassIndex,IParams->GetTime()),1.0f);
UVChannelSpin[0] = SetupIntSpinner(dlg_wnd,IDC_STAGE0UVCHAN_SPIN,IDC_STAGE0UVCHAN_EDIT,1,99,1);
UVChannelSpin[1] = SetupIntSpinner(dlg_wnd,IDC_STAGE1UVCHAN_SPIN,IDC_STAGE1UVCHAN_EDIT,1,99,1);
break;
}
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
{
IParams->RollupMouseMessage(dlg_wnd,message,wparam,lparam);
return FALSE;
}
case WM_COMMAND:
{
switch (id)
{
case IDC_COPY_SPECULAR_DIFFUSE:
TheMtl->Set_Copy_Specular_To_Diffuse(PassIndex,GetCheckBox(dlg_wnd, IDC_COPY_SPECULAR_DIFFUSE) == TRUE);
break;
case IDC_MAPPING0_COMBO:
if (code == CBN_SELCHANGE) {
val = SendDlgItemMessage(dlg_wnd,IDC_MAPPING0_COMBO,CB_GETCURSEL,0,0);
TheMtl->Set_Mapping_Type(PassIndex,0,val);
}
break;
case IDC_MAPPING1_COMBO:
if (code == CBN_SELCHANGE) {
val = SendDlgItemMessage(dlg_wnd,IDC_MAPPING1_COMBO,CB_GETCURSEL,0,0);
TheMtl->Set_Mapping_Type(PassIndex,1,val);
}
break;
case IDC_MAPPING0_ARGS_EDIT:
switch (code) {
case EN_SETFOCUS:
DisableAccelerators();
break;
case EN_KILLFOCUS:
EnableAccelerators();
break;
case EN_CHANGE:
int len = GetWindowTextLength(GetDlgItem(dlg_wnd, IDC_MAPPING0_ARGS_EDIT));
char *buffer = TheMtl->Get_Mapping_Arg_Buffer(PassIndex, 0, len);
GetWindowText(GetDlgItem(dlg_wnd, IDC_MAPPING0_ARGS_EDIT), buffer, len + 1);
break;
}
break;
case IDC_MAPPING1_ARGS_EDIT:
switch (code) {
case EN_SETFOCUS:
DisableAccelerators();
break;
case EN_KILLFOCUS:
EnableAccelerators();
break;
case EN_CHANGE:
int len = GetWindowTextLength(GetDlgItem(dlg_wnd, IDC_MAPPING1_ARGS_EDIT));
char *buffer = TheMtl->Get_Mapping_Arg_Buffer(PassIndex, 1, len);
GetWindowText(GetDlgItem(dlg_wnd, IDC_MAPPING1_ARGS_EDIT), buffer, len + 1);
break;
}
break;
case IDC_NO_TRANS:
TheMtl->Set_PSX_Translucency(PassIndex,GAMEMTL_PSX_TRANS_NONE);
break;
case IDC_100_TRANS:
TheMtl->Set_PSX_Translucency(PassIndex,GAMEMTL_PSX_TRANS_100);
break;
case IDC_50_TRANS:
TheMtl->Set_PSX_Translucency(PassIndex,GAMEMTL_PSX_TRANS_50);
break;
case IDC_25_TRANS:
TheMtl->Set_PSX_Translucency(PassIndex,GAMEMTL_PSX_TRANS_25);
break;
case IDC_MINUS_100_TRANS:
TheMtl->Set_PSX_Translucency(PassIndex,GAMEMTL_PSX_TRANS_MINUS_100);
break;
case IDC_NO_RT_LIGHTING:
TheMtl->Set_PSX_Lighting(PassIndex,!GetCheckBox(dlg_wnd, IDC_NO_RT_LIGHTING));
break;
}
break;
}
case CC_COLOR_CHANGE:
{
// just update all of the colors
TheMtl->Set_Ambient(PassIndex,IParams->GetTime(),AmbientSwatch->GetColor());
TheMtl->Set_Diffuse(PassIndex,IParams->GetTime(),DiffuseSwatch->GetColor());
TheMtl->Set_Specular(PassIndex,IParams->GetTime(),SpecularSwatch->GetColor());
TheMtl->Set_Emissive(PassIndex,IParams->GetTime(),EmissiveSwatch->GetColor());
TheMtl->Notify_Changed();
break;
}
case CC_SPINNER_CHANGE:
{
TheMtl->Set_Shininess(PassIndex,IParams->GetTime(),ShininessSpin->GetFVal());
TheMtl->Set_Opacity(PassIndex,IParams->GetTime(),OpacitySpin->GetFVal());
TheMtl->Set_Translucency(PassIndex,IParams->GetTime(),TranslucencySpin->GetFVal());
for (int i=0; i<MAX_STAGES; i++) {
TheMtl->Set_Map_Channel(PassIndex,i,UVChannelSpin[i]->GetIVal());
}
break;
}
case CC_SPINNER_BUTTONUP:
{
TheMtl->Notify_Changed();
break;
}
}
return FALSE;
}
/***********************************************************************************************
* GameMtlVertexMaterialDlg::ReloadDialog -- reload the contents of the controls *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlVertexMaterialDlg::ReloadDialog(void)
{
// Vertex Material Controls
DebugPrint("GameMtlVertexMaterialDlg::ReloadDialog\n");
assert(AmbientSwatch && DiffuseSwatch && SpecularSwatch && EmissiveSwatch);
assert(ShininessSpin && OpacitySpin && TranslucencySpin);
AmbientSwatch->InitColor(TheMtl->Get_Ambient(PassIndex,IParams->GetTime()));
DiffuseSwatch->InitColor(TheMtl->Get_Diffuse(PassIndex,IParams->GetTime()));
SpecularSwatch->InitColor(TheMtl->Get_Specular(PassIndex,IParams->GetTime()));
EmissiveSwatch->InitColor(TheMtl->Get_Emissive(PassIndex,IParams->GetTime()));
ShininessSpin->SetValue(TheMtl->Get_Shininess(PassIndex,IParams->GetTime()),FALSE);
OpacitySpin->SetValue(TheMtl->Get_Opacity(PassIndex,IParams->GetTime()),FALSE);
TranslucencySpin->SetValue(TheMtl->Get_Translucency(PassIndex,IParams->GetTime()),FALSE);
for (int i=0; i<MAX_STAGES; i++) {
UVChannelSpin[i]->SetValue(TheMtl->Get_Map_Channel(PassIndex,i),FALSE);
}
SetCheckBox(m_hWnd,IDC_COPY_SPECULAR_DIFFUSE, TheMtl->Get_Copy_Specular_To_Diffuse(PassIndex));
SendDlgItemMessage( m_hWnd,
IDC_MAPPING0_COMBO,
CB_SETCURSEL,
TheMtl->Get_Mapping_Type(PassIndex, 0),
0 );
SendDlgItemMessage( m_hWnd,
IDC_MAPPING1_COMBO,
CB_SETCURSEL,
TheMtl->Get_Mapping_Type(PassIndex, 1),
0 );
// PSX Controls
SetCheckBox(m_hWnd,IDC_NO_RT_LIGHTING, !TheMtl->Get_PSX_Lighting(PassIndex));
SetCheckBox(m_hWnd,IDC_NO_TRANS, false);
SetCheckBox(m_hWnd,IDC_100_TRANS, false);
SetCheckBox(m_hWnd,IDC_50_TRANS, false);
SetCheckBox(m_hWnd,IDC_25_TRANS, false);
SetCheckBox(m_hWnd,IDC_MINUS_100_TRANS, false);
switch (TheMtl->Get_PSX_Translucency(PassIndex)) {
case 0:
SetCheckBox(m_hWnd,IDC_NO_TRANS,true);
break;
case GAMEMTL_PSX_TRANS_100:
SetCheckBox(m_hWnd,IDC_100_TRANS,true);
break;
case GAMEMTL_PSX_TRANS_50:
SetCheckBox(m_hWnd,IDC_50_TRANS,true);
break;
case GAMEMTL_PSX_TRANS_25:
SetCheckBox(m_hWnd,IDC_25_TRANS,true);
break;
case GAMEMTL_PSX_TRANS_MINUS_100:
SetCheckBox(m_hWnd,IDC_MINUS_100_TRANS,true);
break;
}
// Reload contents of mapper args edit box:
char *buffer = TheMtl->Get_Mapping_Arg_Buffer(PassIndex, 0);
SetWindowText(GetDlgItem(m_hWnd, IDC_MAPPING0_ARGS_EDIT), buffer);
buffer = TheMtl->Get_Mapping_Arg_Buffer(PassIndex, 1);
SetWindowText(GetDlgItem(m_hWnd, IDC_MAPPING1_ARGS_EDIT), buffer);
}
/***********************************************************************************************
* GameMtlVertexMaterialDlg::ActivateDlg -- activate / deactivate this dialog *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlVertexMaterialDlg::ActivateDlg(BOOL onoff)
{
if (AmbientSwatch) {
AmbientSwatch->Activate(onoff);
}
if (DiffuseSwatch) {
DiffuseSwatch->Activate(onoff);
}
if (SpecularSwatch) {
SpecularSwatch->Activate(onoff);
}
if (EmissiveSwatch) {
EmissiveSwatch->Activate(onoff);
}
}