1236 lines
53 KiB
C++
Raw Permalink 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/>.
*/
/* $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 <Max.h>
#include <gport.h>
#include <hsv.h>
#include <bmmlib.h>
#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; i<NTEXMAPS; i++) {
UpdateTexmapDisplay(i);
}
}
}
/***********************************************************************************************
* GameMtlDlg::UpdateMtlDisplay -- Informs MAX that the material parameters have changed *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 06/26/1997 GH : Created. *
*=============================================================================================*/
void GameMtlDlg::UpdateMtlDisplay()
{
IParams->MtlChanged();
}
/***********************************************************************************************
* 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());
}
}