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

// W3DViewDoc.h : interface of the CW3DViewDoc class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_W3DVIEWDOC_H__2BB39E31_5D3A_11D2_9FC6_00104B791122__INCLUDED_)
#define AFX_W3DVIEWDOC_H__2BB39E31_5D3A_11D2_9FC6_00104B791122__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "scene.h"
#include "Chunkio.h"
#include "HAnim.H"
#include "HCAnim.H"
#include "dynamesh.h"
#include "rendobj.h"
#include "LODDefs.H"


///////////////////////////////////////////////////////////
//
//  Constants
//
const DWORD SAVE_SETTINGS_LIGHT     = 0x00000001;
const DWORD SAVE_SETTINGS_BACK      = 0x00000002;
const DWORD SAVE_SETTINGS_CAMERA    = 0x00000004;


// Forward declarations
class ParticleEmitterClass;
class CameraClass;
class SceneClass;
class LightClass;
class RenderObjClass;
class HAnimClass;
class CGraphicView;
class CDataTreeView;
class DistLODClass;
class Bitmap2DObjClass;
class AssetInfoClass;
class HLodPrototypeClass;
class HLodClass;
class ViewerSceneClass;
class EmitterInstanceListClass;
class ScreenCursorClass;
class DazzleLayerClass;


/////////////////////////////////////////////////////////////////////
//
//  CW3DViewDoc
//
/////////////////////////////////////////////////////////////////////
class CW3DViewDoc : public CDocument
{
protected: // create from serialization only
	CW3DViewDoc();
	DECLARE_DYNCREATE(CW3DViewDoc)

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CW3DViewDoc)
	public:
	virtual BOOL OnNewDocument();
	virtual void Serialize(CArchive& ar);
	virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CW3DViewDoc();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
	//{{AFX_MSG(CW3DViewDoc)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

public:
	void SetChannelQCompression(bool bCompress){	m_bCompress_channel_Q = bCompress;}
	//
	//  Accessors
	//
	CameraClass *			Get2DCamera (void) const				{ return m_pC2DCamera; }
	CameraClass *			GetBackObjectCamera (void) const		{ return m_pCBackObjectCamera; }
	SceneClass *			Get2DScene (void) const					{ return m_pC2DScene; }        
	SceneClass *			GetCursorScene (void) const			{ return m_pCursorScene; }
	ViewerSceneClass *	GetScene (void) const					{ return m_pCScene; }
	SceneClass *			GetBackObjectScene (void) const		{ return m_pCBackObjectScene; }
	LightClass *			GetSceneLight (void) const				{ return m_pCSceneLight; }
	RenderObjClass *		GetDisplayedObject (void) const		{ return m_pCRenderObj; }	
	HAnimClass *			GetCurrentAnimation (void) const		{ return m_pCAnimation; }
	const HTreeClass *	Get_Current_HTree (void) const;

	//
	// Creation/destruction methods
	//
	void					InitScene (void);
	void					LoadAssetsFromFile (LPCTSTR lpszPathName);
	HLodPrototypeClass *GenerateLOD (LPCTSTR pszLODBaseName, LOD_NAMING_TYPE type);
	void					CleanupResources (void);
	bool					Is_Initialized (void)	{ return m_IsInitialized; }

	void					Reload_Displayed_Object (void);
	void					Display_Emitter (ParticleEmitterClass *pemitter = NULL, bool use_global_reset_flag = true, bool allow_reset = true);
	void					DisplayObject (RenderObjClass *pCModel = NULL, bool use_global_reset_flag = true, bool allow_reset = true, bool add_ghost = false);
	BOOL					SaveSettings (LPCTSTR pszFilename, DWORD dwSettingsMask);
	BOOL					LoadSettings (LPCTSTR pszFileName);
	CGraphicView *		GetGraphicView (void);
	CDataTreeView *	GetDataTreeView (void);

	void					Build_Emitter_List (EmitterInstanceListClass *emitter_list, LPCTSTR emitter_name, RenderObjClass *render_obj = NULL);

	//
	//  Animation methods
	//
	void					Make_Movie (void);
	void					ResetAnimation (void);
	void					StepAnimation (int frame_inc = 1);
	void					PlayAnimation (RenderObjClass *pobj, LPCTSTR panim_name = NULL, bool use_global_reset_flag = true, bool allow_reset = true);
	void					PlayAnimation (RenderObjClass *pobj, HAnimComboClass *pcombo, bool use_global_reset_flag = true, bool allow_reset = true);
	void					UpdateFrame (float time_slice);
	void					SetAnimationBlend (BOOL bBlend)	{ m_bAnimBlend = bBlend; }
	bool					GetChannelQCompression(){ return m_bCompress_channel_Q;}
	int					GetChannelQnBytes(){return m_nChannelQnBytes;}
	void					SetChannelQnBytes(int n_bytes){m_nChannelQnBytes = n_bytes;}
	BOOL					GetAnimationBlend (void) const	{ return m_bAnimBlend; }
	bool					Is_Camera_Animated (void) const	{ return m_bAnimateCamera; }
	void					Animate_Camera (bool banimate);
	void					Import_Facial_Animation (const CString &hierarchy_name, const CString &filename);
	void					Play_Animation_Sound (void);

	//
	//	Camera methods
	//
	bool					Is_Camera_Auto_Reset_On (void) const	{ return m_bAutoCameraReset; }
	void					Turn_Camera_Auto_Reset_On (bool onoff) { m_bAutoCameraReset = onoff; }

	//
	//  Background color methods
	//
	const Vector3 &	GetBackgroundColor (void) const								{ return m_backgroundColor; }
	void					SetBackgroundColor (const Vector3 &backgroundColor);

	//
	//  Background BMP methods
	//
	const CString &	GetBackgroundBMP  (void) const						{ return m_stringBackgroundBMP; }
	void					SetBackgroundBMP  (LPCTSTR pszBackgroundBMP);

	//
	//  Background Object methods
	//
	const CString &	GetBackgroundObjectName (void) const				{ return m_stringBackgroundObject; }
	void					SetBackgroundObject (LPCTSTR pszBackgroundObjectName);

	//
	//  Fogging methods
	//
	bool					IsFogEnabled (void) const								{ return m_bFogEnabled; }
	void					EnableFog (bool enable=true);

	//
	//	Scene methods
	//
	void					Remove_Object_From_Scene (RenderObjClass *prender_obj = NULL);

	//
	//	Emitter serialization methods
	//
	bool					Save_Selected_Emitter (void);
	bool					Save_Current_Emitter (const CString &filename);

	//
	//	Primitive serialization methods
	//
	bool					Save_Selected_Primitive (void);
	bool					Save_Current_Sphere (const CString &filename);
	bool					Save_Current_Ring (const CString &filename);

	//
	//	Aggregate methods
	//
	void					Auto_Assign_Bones (void);
	bool					Save_Selected_Aggregate (void);
	bool					Save_Current_Aggregate (const CString &filename);		  

	//
	//	Sound object methods
	//
	bool					Save_Selected_Sound_Object (void);
	bool					Save_Current_Sound_Object (const CString &filename);

	//
	//  LOD methods
	//
	bool					Save_Current_LOD (const CString &filename);
	bool					Save_Selected_LOD (void);
	void					Switch_LOD (int increment = 1, RenderObjClass *render_obj = NULL);

	//
	// Alternate Material interface.  
	//
	void					Toggle_Alternate_Materials(RenderObjClass * obj = NULL);

	//
	//	Prototype methods
	//
	void					Update_Aggregate_Prototype (RenderObjClass &render_obj);
	void					Update_LOD_Prototype (HLodClass &hlod);

	//
	//	Cursor managment
	//
	void					Show_Cursor (bool onoff);
	void					Set_Cursor (LPCTSTR resource_name);
	bool					Is_Cursor_Shown (void) const;
	void					Create_Cursor (void);

	//
	//	Particle methods
	//
	int					Count_Particles (RenderObjClass *render_obj = NULL);
	void					Update_Particle_Count (void);

	//
	//	Manual settings
	//
	void					Set_Manual_FOV (bool manual)			{ m_ManualFOV = manual; }
	void					Set_Manul_Clip_Planes  (bool manual){ m_ManualClipPlanes = manual; }
	bool					Is_FOV_Manual (void) const				{ return m_ManualFOV; }
	bool					Are_Clip_Planes_Manual (void) const	{ return m_ManualClipPlanes; }

	void					Update_Camera (void);
	void					Save_Camera_Settings (void);
	void					Load_Camera_Settings (void);

	//
	//	File methods
	//
	void					Copy_Assets_To_Dir (LPCTSTR directory);
	bool					Lookup_Path (LPCTSTR asset_name, CString &path);
	const char *		Get_Last_Path (void) const { return (m_LastPath.IsEmpty () ? NULL : (const char *)m_LastPath); }

	//
	//	Texture search paths
	//
	const CString &	Get_Texture_Path1 (void) const { return m_TexturePath1; }
	const CString &	Get_Texture_Path2 (void) const { return m_TexturePath2; }

	void					Set_Texture_Path1 (LPCTSTR path);
	void					Set_Texture_Path2 (LPCTSTR path);

	// 
	// Dazzle rendering support
	//
	void					Render_Dazzles(CameraClass * camera);
		
private:

	//////////////////////////////////////////////////////////////////
	//  Private member data
	//////////////////////////////////////////////////////////////////
	ViewerSceneClass *	m_pCScene;
	SceneClass *			m_pC2DScene;
	SceneClass *			m_pCursorScene;
	SceneClass *			m_pCBackObjectScene;
	DazzleLayerClass *	m_pDazzleLayer;
	RenderObjClass *		m_pCRenderObj;
	RenderObjClass *		m_pCBackgroundObject;
	HAnimClass *			m_pCAnimation;
	HAnimComboClass *		m_pCAnimCombo;
	LightClass *			m_pCSceneLight;	  
	Bitmap2DObjClass *	m_pCBackgroundBMP;
	CameraClass *			m_pC2DCamera;
	CameraClass *			m_pCBackObjectCamera;
	ScreenCursorClass *	m_pCursor;
	Vector3					m_backgroundColor;
	CString					m_stringBackgroundBMP;
	CString					m_stringBackgroundObject;
	
	bool						m_bCompress_channel_Q;
	int						m_nChannelQnBytes;
	float						m_CurrentFrame;
	float						m_animTime;
	BOOL						m_bAnimBlend;
	bool						m_bAnimateCamera;
	bool						m_bAutoCameraReset;
	bool						m_bOneTimeReset;
	bool						m_ManualFOV;
	bool						m_ManualClipPlanes;
	bool						m_IsInitialized;
	bool						m_bFogEnabled;

	CString					m_TexturePath1;
	CString					m_TexturePath2;

	CString					m_LastPath;

	DynamicVectorClass<CString>	m_LoadList;
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_W3DVIEWDOC_H__2BB39E31_5D3A_11D2_9FC6_00104B791122__INCLUDED_)


