/*
**	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/>.
*/

/* $Header: /Commando/Code/Tools/ViewTrans/viewtrans.cpp 3     7/06/98 6:28p Greg_h $ */
/*********************************************************************************************** 
 ***                            Confidential - Westwood Studios                              *** 
 *********************************************************************************************** 
 *                                                                                             * 
 *                 Project Name : Trnasformation Viewer Utility                                * 
 *                                                                                             * 
 *                    File Name : VIEWTRANS.CPP                                                * 
 *                                                                                             * 
 *                   Programmer : Greg Hjelstrom                                               * 
 *                                                                                             * 
 *                   Start Date : 02/24/97                                                     * 
 *                                                                                             * 
 *                  Last Update : February 25, 1997 [GH]                                       * 
 *                                                                                             * 
 *---------------------------------------------------------------------------------------------* 
 * Functions:                                                                                  * 
 *   UtilityDlgProc -- Dialog Proc to handle all of the dialog's windows messages              * 
 *   TVU::TransViewerUtility -- Constructor                                                    * 
 *   TVU::OnInitDialog -- Initializes the custom controls.                                     * 
 *   TVU::BeginEditParams -- Adds the rollup to the control panel                              * 
 *   TVU::EndEditParams -- Removes the rollup from the panel                                   * 
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


#include <MAX.H>
#include <UTILAPI.H>
#include "viewtrans.h"
#include "resource.h"


/*****************************************************************************
** Globals
*/

HINSTANCE			hInstance;
TransViewerUtility	TheUtility;
UtilityClassDesc	UtilityDesc;




/*********************************************************************************************** 
 * UtilityDlgProc -- Dialog Proc to handle all of the dialog's windows messages                * 
 *                                                                                             * 
 * INPUT:                                                                                      * 
 *                                                                                             * 
 * OUTPUT:                                                                                     * 
 *                                                                                             * 
 * WARNINGS:                                                                                   * 
 *                                                                                             * 
 * HISTORY:                                                                                    * 
 *   02/25/1997 GH  : Created.                                                                 * 
 *=============================================================================================*/
BOOL CALLBACK UtilityDlgProc(HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam)
{
	TransViewerUtility *to = &TheUtility;

	// Respond to the message type...
	switch (message) {

		case WM_INITDIALOG:
			// Initialize all our Custom Controls
			TheUtility.OnInitDialog(hDlg, lParam);
		 	return TRUE;

		case WM_DESTROY:
			// Release all our Custom Controls
			return FALSE;

		case WM_LBUTTONDOWN: case WM_LBUTTONUP:	case WM_MOUSEMOVE:
			// Pass these messages on to the RollupMouseMessage method
			// to allow 'hand cursor' scrolling with unused area of the
			// rollup page.
   			to->ip->RollupMouseMessage(hDlg, message, wParam, lParam);
			break;

		case WM_MOUSEACTIVATE:
			to->ip->RealizeParamPanel();
			return FALSE;

		default:
			break;
	}
	return FALSE;
}



/*********************************************************************************************** 
 * TVU::TransViewerUtility -- Constructor                                                      * 
 *                                                                                             * 
 * INPUT:                                                                                      * 
 *                                                                                             * 
 * OUTPUT:                                                                                     * 
 *                                                                                             * 
 * WARNINGS:                                                                                   * 
 *                                                                                             * 
 * HISTORY:                                                                                    * 
 *   02/25/1997 GH  : Created.                                                                 * 
 *=============================================================================================*/
TransViewerUtility::TransViewerUtility(void) 
{
	iu = NULL;
	ip = NULL;	
	hPanel = NULL;	
}


/*********************************************************************************************** 
 * TVU::BeginEditParams -- Adds the rollup to the control panel                                * 
 *                                                                                             * 
 * INPUT:                                                                                      * 
 *                                                                                             * 
 * OUTPUT:                                                                                     * 
 *                                                                                             * 
 * WARNINGS:                                                                                   * 
 *                                                                                             * 
 * HISTORY:                                                                                    * 
 *   02/25/1997 GH  : Created.                                                                 * 
 *=============================================================================================*/
void TransViewerUtility::BeginEditParams(Interface *ip, IUtil *iu) 
{
	this->iu = iu;
	this->ip = ip;

	// Add the rollup page to the command panel.
	hPanel = ip->AddRollupPage(
		hInstance, 
		MAKEINTRESOURCE(IDD_VIEWTRANS),
		UtilityDlgProc,
		ROLLUP_PAGE_TITLE, 
		(LPARAM)this);		

	
	// update the display
	SelectionSetChanged(ip,iu);
}
	
/*********************************************************************************************** 
 * TVU::EndEditParams -- Removes the rollup from the panel                                     * 
 *                                                                                             * 
 * INPUT:                                                                                      * 
 *                                                                                             * 
 * OUTPUT:                                                                                     * 
 *                                                                                             * 
 * WARNINGS:                                                                                   * 
 *                                                                                             * 
 * HISTORY:                                                                                    * 
 *   02/25/1997 GH  : Created.                                                                 * 
 *=============================================================================================*/
void TransViewerUtility::EndEditParams(Interface *ip, IUtil *iu) 
{
	// Delete the rollup page
	ip->DeleteRollupPage(hPanel);		

	// The panel index is only valid within BeginEditParams and 
	// EndEditParams.  Set it to null for safety.
	hPanel = NULL;				
}

/*********************************************************************************************** 
 * TVU::OnInitDialog -- Initializes the custom controls.                                       * 
 *                                                                                             * 
 * INPUT:                                                                                      * 
 *                                                                                             * 
 * OUTPUT:                                                                                     * 
 *                                                                                             * 
 * WARNINGS:                                                                                   * 
 *                                                                                             * 
 * HISTORY:                                                                                    * 
 *   02/25/1997 GH  : Created.                                                                 * 
 *=============================================================================================*/
void TransViewerUtility::OnInitDialog(HWND hDlg, LPARAM lParam)
{
	
}


void TransViewerUtility::SelectionSetChanged(Interface *ip,IUtil *iu)
{
	// If there is not one and only one selected, clear
	// the display with zeros.
	if (ip->GetSelNodeCount() != 1) {
		Display_Data(
			Matrix3(1),
			Matrix3(1),
			Point3(0.0f,0.0f,0.0f),
			Quat(0.0f,0.0f,0.0f,0.0f),
			ScaleValue(Point3(1.0f,1.0f,1.0f))
		);
		return;
	}

	// Get all sorts of info about this node!
	INode * node = ip->GetSelNode(0);
	Matrix3 nodetm = node->GetNodeTM(ip->GetTime());
	Matrix3 objtm = node->GetObjectTM(ip->GetTime());
	Point3  objoffpos = node->GetObjOffsetPos();
	Quat    objoffrot = node->GetObjOffsetRot();
	ScaleValue objoffscl = node->GetObjOffsetScale();

	// display on the panel
	Display_Data(nodetm,objtm,objoffpos,objoffrot,objoffscl);
}


void TransViewerUtility::Display_Data
(
	Matrix3 &nodetm,
	Matrix3 &objtm,
	Point3  &objoffpos,
	Quat    &objoffrot,
	ScaleValue &objoffscl
)
{
	char string[256];
	Point3 vect;

	//////////////////////////////////////////
	// 3x3 sub-matrix of the ObjectTM
	//////////////////////////////////////////
	vect = objtm.GetRow(0);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_0),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_1),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_2),string);

	vect = objtm.GetRow(1);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_3),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_4),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_5),string);

	vect = objtm.GetRow(2);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_6),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_7),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_8),string);

	
	///////////////////////////////////////////
	// Translation portion of the ObjectTM
	///////////////////////////////////////////
	vect = objtm.GetTrans();
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_9),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_10),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJTM_11),string);

	///////////////////////////////////////////
	// 3x3 sub-matrix of the NodeTM
	///////////////////////////////////////////
	vect = objtm.GetRow(0);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_0),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_1),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_2),string);

	vect = objtm.GetRow(1);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_3),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_4),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_5),string);

	vect = objtm.GetRow(2);
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_6),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_7),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_8),string);
	
	///////////////////////////////////////////
	// Translation portion of the NodeTM
	///////////////////////////////////////////
	vect = nodetm.GetTrans();
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_9),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_10),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_NODETM_11),string);

	///////////////////////////////////////////
	// Object-Offset translation:
	///////////////////////////////////////////
	vect = objoffpos;
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_TRANS_X),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_TRANS_Y),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_TRANS_Z),string);

	///////////////////////////////////////////
	// Object-Offset scaling:
	///////////////////////////////////////////
	vect = objoffscl.s;
	sprintf(string,"%5.3f",vect.x);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_SCALE_X),string);
	sprintf(string,"%5.3f",vect.y);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_SCALE_Y),string);
	sprintf(string,"%5.3f",vect.z);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_SCALE_Z),string);

	///////////////////////////////////////////
	// Object-Offset Quaternion:
	///////////////////////////////////////////
	sprintf(string,"%5.3f",objoffrot[0]);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_ROT_X),string);
	sprintf(string,"%5.3f",objoffrot[1]);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_ROT_Y),string);
	sprintf(string,"%5.3f",objoffrot[2]);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_ROT_Z),string);
	sprintf(string,"%5.3f",objoffrot[3]);
	SetWindowText(GetDlgItem(hPanel, IDC_OBJOFF_ROT_W),string);


}
