/*
** 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 .
*/
/***********************************************************************************************
*** 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:: /Bay/Tools/max2w3d/GameMtlPassDlg.cpp $*
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 10/22/99 9:54a $*
* *
* $Revision:: 9 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* PassDlgProc -- dialog proc which thunks into a GameMtlPassDlg *
* GameMtlPassDlg::GameMtlPassDlg -- constructor *
* GameMtlPassDlg::~GameMtlPassDlg -- destructor *
* GameMtlPassDlg::DialogProc -- windows message handler *
* GameMtlPassDlg::Invalidate -- invalidate the dialog *
* GameMtlPassDlg::ReloadDialog -- update the contents of all of the controls *
* GameMtlPassDlg::ClassID -- returns classID of the object being edited *
* GameMtlPassDlg::SetThing -- set the material being edited *
* GameMtlPassDlg::ActivateDlg -- activate or deactivate the dialog *
* GameMtlPassDlg::SetTime -- set the current time *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "GameMtlPassDlg.h"
#include "dllmain.h"
#include "resource.h"
#include "GameMtl.h"
#include "GameMtlDlg.h"
#include "GameMtlShaderDlg.h"
#include "PS2GameMtlShaderDlg.h"
#include "GameMtlTextureDlg.h"
#include "GameMtlVertexMaterialDlg.h"
#include "w3d_file.h"
static int _Pass_Index_To_Flag[] =
{
GAMEMTL_PASS0_ROLLUP_OPEN,
GAMEMTL_PASS1_ROLLUP_OPEN,
GAMEMTL_PASS2_ROLLUP_OPEN,
GAMEMTL_PASS3_ROLLUP_OPEN,
};
/***********************************************************************************************
* PassDlgProc -- dialog proc which thunks into a GameMtlPassDlg *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
static BOOL CALLBACK PassDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
GameMtlPassDlg *theDlg;
if (msg==WM_INITDIALOG) {
theDlg = (GameMtlPassDlg*)lParam;
theDlg->HwndPanel = hwndDlg;
SetWindowLong(hwndDlg, GWL_USERDATA,lParam);
} else {
if ((theDlg = (GameMtlPassDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) {
return FALSE;
}
}
return theDlg->DialogProc(hwndDlg,msg,wParam,lParam);
}
/***********************************************************************************************
* GameMtlPassDlg::GameMtlPassDlg -- constructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
GameMtlPassDlg::GameMtlPassDlg(HWND hwMtlEdit, IMtlParams *imp, GameMtl *m,int pass)
{
HwndEdit = hwMtlEdit;
TheMtl = m;
IParams = imp;
PassIndex = pass;
char title[200];
sprintf(title, "Pass %d", pass + 1);
HwndPanel = IParams->AddRollupPage(
AppInstance,
MAKEINTRESOURCE(IDD_GAMEMTL_PASS),
PassDlgProc,
title,
(LPARAM)this,
TheMtl->Get_Flag(_Pass_Index_To_Flag[PassIndex]) ? 0 : APPENDROLL_CLOSED
);
}
/***********************************************************************************************
* GameMtlPassDlg::~GameMtlPassDlg -- destructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
GameMtlPassDlg::~GameMtlPassDlg()
{
TheMtl->Set_Flag(_Pass_Index_To_Flag[PassIndex],IParams->IsRollupPanelOpen(HwndPanel));
IParams->DeleteRollupPage(HwndPanel);
SetWindowLong(HwndPanel, GWL_USERDATA, NULL);
}
/***********************************************************************************************
* GameMtlPassDlg::DialogProc -- windows message handler *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
BOOL GameMtlPassDlg::DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int i=0;
int id = LOWORD(wParam);
int code = HIWORD(wParam);
switch (message) {
case WM_INITDIALOG:
{
Page[0] = new GameMtlVertexMaterialDlg(HwndPanel,IParams,TheMtl,PassIndex);
if (TheMtl->Get_Shader_Type() == GameMtl::STE_PC_SHADER) {
Page[1] = new GameMtlShaderDlg(HwndPanel,IParams,TheMtl,PassIndex);
} else {
// The PS2 shader is different.
Page[1] = new PS2GameMtlShaderDlg(HwndPanel,IParams,TheMtl,PassIndex);
}
Page[2] = new GameMtlTextureDlg(HwndPanel,IParams,TheMtl,PassIndex);
for (i=0; iGet_Hwnd();
// set the tab names
char name[64];
::GetWindowText(hwnd,name,sizeof(name));
TC_ITEM tcitem = { TCIF_TEXT,0,0,name,0 };
TabCtrl_InsertItem(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB),i,&tcitem);
}
// Get the display rectangle of the tab control
RECT rect;
::GetWindowRect(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB),&rect);
TabCtrl_AdjustRect(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB),FALSE, &rect);
// Convert the display rectangle from screen to client coords
ScreenToClient(HwndPanel,(POINT *)(&rect));
ScreenToClient(HwndPanel, ((LPPOINT)&rect) + 1);
for (i=0; iGet_Hwnd();
// Loop through all the tabs in the property sheet
// Get a pointer to this tab
SetWindowPos( hwnd,
NULL,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOZORDER);
}
CurPage = 0;
TabCtrl_SetCurSel(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB),CurPage);
Page[CurPage]->Show();
break;
}
case WM_PAINT:
{
if (!Valid) {
Valid = TRUE;
ReloadDialog();
}
return FALSE;
}
case WM_NOTIFY:
{
NMHDR * header = (NMHDR *)lParam;
switch(header->code) {
case TCN_SELCHANGE:
{
int sel = TabCtrl_GetCurSel(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB));
Page[sel]->Show();
for (int i=0; i < PAGE_COUNT; i++) {
if (i != sel) Page[i]->Show(false);
}
CurPage = sel;
TheMtl->Set_Current_Page(PassIndex,CurPage);
}
};
break;
}
}
return FALSE;
}
/***********************************************************************************************
* GameMtlPassDlg::Invalidate -- invalidate the dialog *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlPassDlg::Invalidate()
{
Valid = FALSE;
InvalidateRect(HwndPanel,NULL,0);
}
/***********************************************************************************************
* GameMtlPassDlg::ReloadDialog -- update the contents of all of the controls *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlPassDlg::ReloadDialog()
{
int i;
DebugPrint("GameMtlPassDlg::ReloadDialog\n");
Interval v;
TheMtl->Update(IParams->GetTime(),v);
for (i=0; iReloadDialog();
}
CurPage = TheMtl->Get_Current_Page(PassIndex);
TabCtrl_SetCurSel(GetDlgItem(HwndPanel,IDC_GAMEMTL_TAB),CurPage);
Page[CurPage]->Show();
for (i=0; i < PAGE_COUNT; i++) {
if (i != CurPage) Page[i]->Show(false);
}
}
/***********************************************************************************************
* GameMtlPassDlg::ClassID -- returns classID of the object being edited *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
Class_ID GameMtlPassDlg::ClassID()
{
return GameMaterialClassID;
}
/***********************************************************************************************
* GameMtlPassDlg::SetThing -- set the material being edited *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlPassDlg::SetThing(ReferenceTarget* target)
{
// Note, parent will "reload" when our "thing" changes :-)
assert (target->SuperClassID()==MATERIAL_CLASS_ID);
assert (target->ClassID()==GameMaterialClassID);
TheMtl = (GameMtl *)target;
for (int i=0; iSetThing(target);
}
}
/***********************************************************************************************
* GameMtlPassDlg::ActivateDlg -- activate or deactivate the dialog *
* *
* some of the custom max controls need to be activated and deactivated *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlPassDlg::ActivateDlg(BOOL onoff)
{
for (int i=0; iActivateDlg(onoff);
}
}
/***********************************************************************************************
* GameMtlPassDlg::SetTime -- set the current time *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 11/23/98 GTH : Created. *
*=============================================================================================*/
void GameMtlPassDlg::SetTime(TimeValue t)
{
// parent dialog class keeps track of the validty and we
// don't have to do anything in this function (it will never
// be called in fact)
}