/*
**	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);
	}
}