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

📄 mrcexport.cpp

📁 游戏编程精粹2第一章源码
💻 CPP
字号:
/**********************************************************************
 	MODULE: MRCexport
	
	DESCRIPTION: This module is the plugin for MAX 3 to export in MRC format
	
	Version:		1.22			

	DEVELOPED BY:		MARCO TOMBESI
	CONTACT:		e-mail:		baggior@libero.it		
					web-page:	digilander.iol.it/baggior

 *>	Copyright (c) Marco Tombesi, 2001
 **********************************************************************/

#include "MRCexport.h"
#include "MRCformat2.h"
#include "MRChelper.h"


//====================================================================================
BOOL CALLBACK MRCexportOptionsDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
BOOL CALLBACK MRCAboutDialogFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
static DWORD WINAPI fn(LPVOID arg) { return(0); }
//====================================================================================


//====================================================================================
//--- MRCexport -------------------------------------------------------
MRCexport::MRCexport()
{
	i=NULL;
	ei=NULL;
	sampleDelta=100;
}

MRCexport::~MRCexport() 
{

}

void MRCexport::ShowAbout(HWND hWnd)
{			
	DialogBox(hInstance,  
		MAKEINTRESOURCE(IDD_ABOUT),
		hWnd, 
		MRCAboutDialogFunc
		);

}

int MRCexport::DoExport(const TCHAR *name,
						ExpInterface *ei,
						Interface *i,
						BOOL suppressPrompts, DWORD options)
{
	//===================================================
	//					START DIALOG				   //
	if	(!DialogBoxParam
			(
			hInstance, 
			MAKEINTRESOURCE(IDD_PANEL), 
			GetActiveWindow(), 
			MRCexportOptionsDlgProc, 
			(LPARAM)this
			)
		)	return FALSE;
	//===================================================

	FILE *out = fopen(name, "wb");
	if(!out)
	{
		MessageBox(NULL, "Couldn't open file for writing.", NULL, MB_OK);
		return 0;
	}
	
	this->ei = ei;
	this->i = i;

	i->ProgressStart(_T("Exporting to MRC File: ..."), TRUE, fn, NULL);
	
	
	Write(out);	
	

	// Implement the actual file export here and 
	// return TRUE If the file is imported properly

	
	i->ProgressEnd();

	if (out) fclose(out);

	return TRUE;
}

// ============================================================================
bool MRCexport::Write(FILE *out) {
	rewind (out);
	//write format version info
	fwrite(&mrc_version, sizeof(mrc_version), 1, out);

	bool ok=false;
	long startPos = ftell(out);
	fseek(out, sizeof(MRCobject_hdr), SEEK_CUR);

	MRCobject_hdr oHdr;
	memset(&oHdr, 0, sizeof(MRCobject_hdr));

	if (!i->GetSelNodeCount()) {
		MessageBox(NULL,"You must select a mesh to export",NULL,MB_OK);
		return false;
	}
	INode* pNode = i->GetSelNode(0);
	INode* const pRoot = i->GetRootNode();	

	i->ProgressUpdate(0,FALSE,_T("..writing MESH data..."));

	// writing Mesh data to file
		ok = ExportMesh(pNode, out);
	
	oHdr.boneCnt = CountBones(pRoot);
	// Not only a mesh
	if (oHdr.boneCnt) 
	{	
		//Bone data
		i->ProgressUpdate(15,FALSE,_T("..Processing BONE data..."));
////
			oHdr.boneOfs = ftell(out);		
////
		BoneData_t* boneData = new BoneData_t [ oHdr.boneCnt ];
		
			ok = ProcessBoneWeights (pNode,pRoot, boneData);
			
		i->ProgressUpdate(20,FALSE,_T(".....Skel struct..."));
		
			ProcessBoneStruct (pRoot, pRoot, -1, boneData);
	
		i->ProgressUpdate(30,FALSE,_T(".....ANIM data..."));
		
			Interval range = i->GetAnimRange();
			oHdr.animLast  = TicksToMilliSec(range.Duration());
			oHdr.animFPS = GetFrameRate();

			oHdr.keyCnt = ProcessBoneAnim (pRoot, range, sampleDelta, boneData);
		
		i->ProgressUpdate(50,FALSE,_T("..writing BONE data..."));

		// writing Bones to file
			ok = ExportBoneData(boneData, oHdr.boneCnt, oHdr.keyCnt, out);

		// bone data deallocation
		if (boneData) delete [] boneData;
	}

	long endPos = ftell(out);
	fseek(out, startPos, SEEK_SET);
	fwrite(&oHdr, sizeof(MRCobject_hdr), 1, out);
	fseek(out, endPos, SEEK_SET);
	
	return ok;
}
// ============================================================================
//--- MRCexport -------------------------------------------------------
//====================================================================================	


//====================================================================================	
//==============================DIALOGUES=============================================	
//====================================================================================	
BOOL CALLBACK MRCexportOptionsDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static MRCexport *exp = NULL;

	switch(message) {
		case WM_INITDIALOG:
			exp = (MRCexport *)lParam;
			CenterWindow(hWnd,GetParent(hWnd));
			return FALSE;

		case WM_CLOSE:
			delete exp;
			EndDialog(hWnd, 0);
			break;

		case WM_COMMAND:
			switch(LOWORD(wParam)) 
			{
				case IDC_BUTTON_ABOUT:
					exp->ShowAbout(hWnd);
					break;
				
				case IDC_BUTTON_OK:
					/// set export sample rate
					{
						BOOL ok;
						UINT val = GetDlgItemInt(hWnd, IDC_EDIT, &ok, false);
						if (ok)
						{
							exp->setSampleDelta(val);
						}
					}

					EndDialog(hWnd, 1);
					break;
					
				case IDC_BUTTON_CANCEL:
					EndDialog(hWnd, 0);
					break;
			}
		
		default:		//message not catched
			return FALSE;
	}
	return TRUE;		//message catched
}

//====================================================================================	
BOOL CALLBACK MRCAboutDialogFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message) {
		case WM_INITDIALOG:
			SetDlgItemText(hWnd,IDC_ABOUT_TITLE ,
				GetString(IDS_TITLE));
			SetDlgItemText(hWnd,IDC_ABOUT_COPYRIGHT,
				GetString(IDS_COPYRIGHT));
			SetDlgItemText(hWnd,IDC_ABOUT_CONTACT1 ,
				GetString(IDS_CONTACT1));
			SetDlgItemText(hWnd,IDC_ABOUT_CONTACT2 ,
				GetString(IDS_CONTACT2));
			return FALSE;

		case WM_LBUTTONDOWN:
			EndDialog(hWnd, 0);
			return TRUE;
	}

	return FALSE;
}

⌨️ 快捷键说明

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