⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmodexporter.cpp

📁 liu7788414
💻 CPP
字号:
/**********************************************************************
 *<
	FILE: GModExporter.cpp

	DESCRIPTION:	Appwizard generated plugin

	CREATED BY: 

	HISTORY: 

 *>	Copyright (c) 2000, All Rights Reserved.
 **********************************************************************/

#include "GModExporter.h"
#include "ModData.h"	// Added by ClassView
#include "SceneReader.h"

#define GMODEXPORTER_CLASS_ID	Class_ID(0x227b8169, 0x3eaca03f)


class GModExporter : public SceneExport {
public:
		CMesh m_mesh;


		static HWND hParams;


		int				ExtCount();					// Number of extensions supported
		const TCHAR *	Ext(int n);					// Extension #n (i.e. "3DS")
		const TCHAR *	LongDesc();					// Long ASCII description (i.e. "Autodesk 3D Studio File")
		const TCHAR *	ShortDesc();				// Short ASCII description (i.e. "3D Studio")
		const TCHAR *	AuthorName();				// ASCII Author name
		const TCHAR *	CopyrightMessage();			// ASCII Copyright message
		const TCHAR *	OtherMessage1();			// Other message #1
		const TCHAR *	OtherMessage2();			// Other message #2
		unsigned int	Version();					// Version number * 100 (i.e. v3.01 = 301)
		void			ShowAbout(HWND hWnd);		// Show DLL's "About..." box

		BOOL SupportsOptions(int ext, DWORD options);
		int				DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts=FALSE, DWORD options=0);


		
		//Constructor/Destructor

		GModExporter();
		~GModExporter();		

};


class GModExporterClassDesc:public ClassDesc2 {
	public:
	int 			IsPublic() { return TRUE; }
	void *			Create(BOOL loading = FALSE) { return new GModExporter(); }
	const TCHAR *	ClassName() { return GetString(IDS_CLASS_NAME); }
	SClass_ID		SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
	Class_ID		ClassID() { return GMODEXPORTER_CLASS_ID; }
	const TCHAR* 	Category() { return GetString(IDS_CATEGORY); }

	const TCHAR*	InternalName() { return _T("GModExporter"); }	// returns fixed parsable name (scripter-visible name)
	HINSTANCE		HInstance() { return hInstance; }				// returns owning module handle

};



static GModExporterClassDesc GModExporterDesc;
ClassDesc2* GetGModExporterDesc() { return &GModExporterDesc; }

BOOL CALLBACK GModExporterTypeSelectProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
		static int *type = NULL;
		
		switch(message) {
		case WM_INITDIALOG:
			
			type = (int *)lParam;

			CenterWindow(hWnd,GetParent(hWnd));			
			CheckRadioButton(hWnd, IDC_RADIO1, IDC_RADIO2, (*type == 0)?IDC_RADIO1:IDC_RADIO2);
			
			return TRUE;
			
			case WM_CLOSE:
				*type = -1;
				EndDialog(hWnd, 0);
				return TRUE;
				
			case WM_COMMAND:
				switch(LOWORD(wParam))
				{
				case IDOK:					
					EndDialog(hWnd,0);
					break;
					
				case IDCANCEL:
					*type = -1;
					EndDialog(hWnd,0);
					break;

				case IDC_RADIO1:
					*type = 0;
					break;

				case IDC_RADIO2:
					*type = 1;
					break;
					
				default:
					break;
				}
		}
		return FALSE;
}


void UpdateList(HWND hwnd, list<SampleMethod> &actionlist)
{
	GetDlgItem(hwnd, IDC_LIST_SAMPLE);
	list<SampleMethod>::iterator itr = actionlist.begin();
	int count = actionlist.size();
	char data[100];
	for (int i=0; i<count; i++, itr++)
	{		
		sprintf( data, "%s: %d, %d, %d", itr->ActionName, itr->startTime, itr->endTime, itr->FrameCount);
		SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM)data); 
	}
}

BOOL CALLBACK GModExporterOptionsDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) {
	
	//static GModExporter *imp = NULL;	
	TCHAR buff[8];
	static ExportOptions *options = NULL;
	
	switch(message) {
		case WM_INITDIALOG:
			
			options = (ExportOptions *)lParam;
			//imp = (GModExporter *)lParam;
			CenterWindow(hWnd,GetParent(hWnd));

			CheckDlgButton(hWnd, IDC_CHECK_ADDANIMATION, 
				options->bHaveAnimation ? BST_CHECKED : BST_UNCHECKED);
			CheckDlgButton(hWnd, IDC_HAVENORMAL, 
				options->bHaveVertexNormal ? BST_CHECKED : BST_UNCHECKED);
			
			switch (options->format)
			{
			case 0:
				CheckRadioButton(hWnd,IDC_FORMAT_BIN,IDC_FORMAT_ASCII,IDC_FORMAT_BIN);
				break;
				
			case 1:
				CheckRadioButton(hWnd,IDC_FORMAT_BIN,IDC_FORMAT_ASCII,IDC_FORMAT_ASCII);
				break;
			}
			
			switch (options->unit)
			{
			case UNIT_NORMAL:
				CheckRadioButton(hWnd,IDC_UNITNORMAL,IDC_UNITDIV16,IDC_UNITNORMAL);
				break;
				
			case UNIT_DIV16:
				CheckRadioButton(hWnd,IDC_UNITNORMAL,IDC_UNITDIV16,IDC_UNITDIV16);
				break;
			}

			switch (options->iAnimationType)
			{
			case VERTEX_ANIMATION:
				CheckRadioButton(hWnd,IDC_BONEANIM,IDC_VERTEXANIM,IDC_VERTEXANIM);
				break;
				
			case BONE_ANIMATION:
				CheckRadioButton(hWnd,IDC_BONEANIM,IDC_VERTEXANIM,IDC_BONEANIM);
				break;
			}
						
			switch (options->iMaxBoneCount)
			{
			case MAX_ONE_BONE:
				CheckRadioButton(hWnd,IDC_TWOBONES, IDC_ONEBONE,IDC_ONEBONE);
				break;
				
			case MAX_TWO_BONES:
				CheckRadioButton(hWnd,IDC_TWOBONES,IDC_ONEBONE,IDC_TWOBONES);
				break;
			}
			
			_stprintf(buff,_T("%d"),options->m_curSample.startTime);
			SetDlgItemText(hWnd,IDC_STARTTIME,buff);
			_stprintf(buff,_T("%d"),options->m_curSample.endTime);
			SetDlgItemText(hWnd,IDC_ENDTIME,buff);
			_stprintf(buff,_T("%d"),options->m_curSample.FrameCount);
			SetDlgItemText(hWnd,IDC_FRAMECOUNT,buff);
			SetDlgItemText(hWnd,IDC_ACTIONNAME,options->m_curSample.ActionName);
//			SetDlgItemText(hWnd,IDC_SAMPLE_RATE,buff);
			return TRUE;

		case WM_CLOSE:
			options->bExport = FALSE;
			EndDialog(hWnd, 0);
			return TRUE;
			
		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
			case IDC_EXPORT:
				options->bExport = TRUE;
				
				EndDialog(hWnd,0);
				break;
				
			case IDC_CANCEL:
				options->bExport = FALSE;
				
				EndDialog(hWnd,0);
				break;
				
			case IDC_FORMAT_ASCII:
				options->format = 1;
				break;
				
			case IDC_FORMAT_BIN:
				options->format = 0;
				break;

			case IDC_UNITNORMAL:
				options->unit = UNIT_NORMAL;
				break;
				
			case IDC_UNITDIV16:
				options->unit = UNIT_DIV16;
				break;
				
			case IDC_ONEBONE:
				options->iMaxBoneCount = MAX_ONE_BONE;
				break;
				
			case IDC_TWOBONES:
				options->iMaxBoneCount = MAX_TWO_BONES;
				break;

			case IDC_BONEANIM:
				options->iAnimationType = BONE_ANIMATION;
				break;
				
			case IDC_VERTEXANIM:
				options->iAnimationType = VERTEX_ANIMATION;
				break;
				
			case IDC_CHECK_ADDANIMATION:
				options->bHaveAnimation = !options->bHaveAnimation;
				break;

			case IDC_HAVENORMAL:
				options->bHaveVertexNormal = !options->bHaveVertexNormal;
				break;
				
			case IDC_STARTTIME:
				GetDlgItemText(hWnd,IDC_STARTTIME,buff,sizeof(buff) / sizeof(TCHAR));				
				options->m_curSample.startTime = _ttoi(buff);
				break;
				
			case IDC_ENDTIME:
				GetDlgItemText(hWnd,IDC_ENDTIME,buff,sizeof(buff) / sizeof(TCHAR));				
				options->m_curSample.endTime = _ttoi(buff);
				break;

			case IDC_FRAMECOUNT:
				GetDlgItemText(hWnd,IDC_FRAMECOUNT,buff,sizeof(buff) / sizeof(TCHAR));				
				options->m_curSample.FrameCount = _ttoi(buff);
				break;

			case IDC_ACTIONNAME:
				GetDlgItemText(hWnd,IDC_ACTIONNAME,options->m_curSample.ActionName,sizeof(buff) / sizeof(TCHAR));				
				break;

			case IDC_ADDACTION:
				options->m_Sample.push_back(options->m_curSample);

				char data[100];
				sprintf( data, "%s: %d, %d, %d", options->m_curSample.ActionName, 
					options->m_curSample.startTime, options->m_curSample.endTime, options->m_curSample.FrameCount);
				SendMessage(GetDlgItem(hWnd,IDC_LIST_SAMPLE), LB_ADDSTRING, 0, (LPARAM)data); 
				break;
				
			case IDC_REMOVEACTION:
				{
					int count = options->m_Sample.size();
					list<SampleMethod>::iterator itr = options->m_Sample.begin();
					for (int i=0; i<options->m_curSelect; i++, itr++);
					options->m_Sample.erase(itr);
					SendMessage(GetDlgItem(hWnd,IDC_LIST_SAMPLE), LB_DELETESTRING, options->m_curSelect, 0); 
					break;			
				}
				
			case IDC_LIST_SAMPLE:				
				switch(HIWORD(wParam))
				{
					case LBN_SELCHANGE:
						options->m_curSelect = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
						break;
				}
				break;

			default:
				break;
			}
	}
	return FALSE;
}

//--- GModExporter -------------------------------------------------------
GModExporter::GModExporter()
{

}

GModExporter::~GModExporter() 
{

}

int GModExporter::ExtCount()
{
	//TODO: Returns the number of file name extensions supported by the plug-in.
	return 1;
}

const TCHAR *GModExporter::Ext(int n)
{		
	//TODO: Return the 'i-th' file name extension (i.e. "3DS").
	return _T("GMOD");
}

const TCHAR *GModExporter::LongDesc()
{
	//TODO: Return long ASCII description (i.e. "Targa 2.0 Image File")
	return _T("Gameloft model file with animation data");
}
	
const TCHAR *GModExporter::ShortDesc() 
{			
	//TODO: Return short ASCII description (i.e. "Targa")
	return _T("GLModel");
}

const TCHAR *GModExporter::AuthorName()
{			
	//TODO: Return ASCII Author name
	return _T("Tao Qing");
}

const TCHAR *GModExporter::CopyrightMessage() 
{	
	// Return ASCII Copyright message
	return _T("Copyright 2004, Gameloft. qtao@gameloft.com.cn");
}

const TCHAR *GModExporter::OtherMessage1() 
{		
	//TODO: Return Other message #1 if any
	return _T("");
}

const TCHAR *GModExporter::OtherMessage2() 
{		
	//TODO: Return other message #2 in any
	return _T("");
}

unsigned int GModExporter::Version()
{				
	//TODO: Return Version number * 100 (i.e. v3.01 = 301)
	return 1; //version 0.01
}

void GModExporter::ShowAbout(HWND hWnd)
{			
	// Optional
}

BOOL GModExporter::SupportsOptions(int ext, DWORD options)
{
	// TODO Decide which options to support.  Simply return
	// true for each option supported by each Extension 
	// the exporter supports.

	return TRUE;
}


int	GModExporter::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
{
	//TODO: Implement the actual file Export here and 
	//		return TRUE If the file is exported properly
	
	ExportOptions DlgOptions;
	DlgOptions.bHaveAnimation = FALSE;
	DlgOptions.bHaveVertexNormal = FALSE;
	DlgOptions.format = 0; //binary
	DlgOptions.unit = UNIT_NORMAL; //normal
//	DlgOptions.iAnimSamplingRate = 10;
	DlgOptions.bExport = FALSE;
	DlgOptions.bExportSelected = ((options == SCENE_EXPORT_SELECTED)? TRUE: FALSE);
	DlgOptions.m_curSelect = -1;
	strcpy(DlgOptions.m_curSample.ActionName, "");
	DlgOptions.m_curSample.startTime = 0;
	DlgOptions.m_curSample.endTime = 0;
	DlgOptions.m_curSample.FrameCount = 0;
	DlgOptions.iAnimationType = BONE_ANIMATION;
	DlgOptions.iMaxBoneCount = MAX_ONE_BONE;
	ei->theScene->FlagFGSelected(0);
	
	int type = 0;
	if(!suppressPrompts)
	{
		if (DlgOptions.bExportSelected)
		{
			DialogBoxParam(hInstance, 
				MAKEINTRESOURCE(IDD_SELECT_TYPE), 
				GetActiveWindow(), 
				GModExporterTypeSelectProc, (LPARAM)&type);
		}
		if (type == 0)
		{
			DialogBoxParam(hInstance, 
				MAKEINTRESOURCE(IDD_PANEL), 
				GetActiveWindow(), 
				GModExporterOptionsDlgProc, (LPARAM)&DlgOptions);
		}
		else if (type == -1)
		{ 		
			return FALSE;
		}
	}
	
	if (DlgOptions.bExport && type == 0)
	{		
		m_mesh.GenerateFromScene(ei->theScene, i, DlgOptions.bExportSelected);
		m_mesh.SaveToFile(name, &DlgOptions);
		return TRUE;
	}
	else if (type == 1)
	{
		//EXPORT THE SELECT OBJECT'S POSITION AND ROTATION	
		CSceneReader reader(ei->theScene, i);
		reader.ExportSelectedNodePath(name);
		return TRUE;
	}
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -