summaryrefslogtreecommitdiff
path: root/utils/vweightexp/vweightimp.h
blob: 9a0e5862f1324f0f0ed7560a644e0ab2fc482296 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//
//=============================================================================//

//===================================================================
// Useful macros
//
#define CONSTRUCTOR
#define DESTRUCTOR

#define EXPORT_THIS		__declspec(dllexport)

#define DEFAULT_EXT		_T("vvw")

#define FStrEq(sz1, sz2) (strcmp((sz1), (sz2)) == 0)


//===================================================================
// Class that implements the scene-export.
//
class VWeightImportClass : public SceneImport
{
	// friend BOOL CALLBACK ImportOptionsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
	// friend class DumpModelTEP;
	// friend class DumpDeformsTEP;

public:
	CONSTRUCTOR				VWeightImportClass	(void);
	DESTRUCTOR				~VWeightImportClass	(void);

	// Required by classes derived from SceneExport
	virtual int				ExtCount		(void)		{ return 1;						}
	virtual const TCHAR*	Ext				(int i)		{ return DEFAULT_EXT;			}
	virtual const TCHAR*	LongDesc		(void)		{ return _T("Valve Skeletal Model Exporter for 3D Studio Max");	}
	virtual const TCHAR*	ShortDesc		(void)		{ return _T("Valve VVW");			}
	virtual const TCHAR*	AuthorName		(void)		{ return _T("Valve, LLC");			}
	virtual const TCHAR*	CopyrightMessage(void)		{ return _T("Copyright (c) 1998, Valve LLC");			}
	virtual const TCHAR*	OtherMessage1	(void)		{ return _T("");				}
	virtual const TCHAR*	OtherMessage2	(void)		{ return _T("");				}
	virtual unsigned int	Version			(void)		{ return 201;					}
	virtual void			ShowAbout		(HWND hWnd)	{ return;						}
	// virtual int				DoExport		(const TCHAR *name, ExpInterface *ei, Interface *i);
	virtual int		DoImport(const TCHAR *name,ImpInterface *ii,Interface *i, BOOL suppressPrompts=FALSE); // Export	file

	MaxNode		m_SrcMaxNode[512];		// array of nodes
	long		m_cSrcMaxNodes;		// # of nodes

	MaxVertWeight *m_SrcMaxVertex[10000];
	long		m_cSrcMaxVertex;

	MaxNode		m_MaxNode[512];		// array of nodes
	long		m_cMaxNodes;		// # of nodes

	int			m_iToSrc[512];	// translate src nodes to local bones

	// Animation metrics (gleaned from 3dsMax and cached for convenience)
	Interval	m_intervalOfAnimation;
	TimeValue	m_tvStart;
	TimeValue	m_tvEnd;
	int			m_tpf;		// ticks-per-frame

private:
	void		CollectNodes( INode *pnode );
	void		NodeEnum( INode *node );
	int			UpdateModel( INode *node );
	void		CollectWeights(int iVertex, MaxVertWeight *pweight);
	void		RemapSrcWeights( void );

	IPhyContextExport		*m_mcExport;
	IPhysiqueExport			*m_phyExport;
    Modifier				*m_phyMod;
	Modifier				*m_bonesProMod;
	BonesPro_WeightArray	*m_wa;

};


//===================================================================
// Basically just a ClassFactory for communicating with 3DSMAX.
//
class VWeightImportClassDesc : public ClassDesc
{
public:
	int				IsPublic		(void)					{ return TRUE;								}
	void *			Create			(BOOL loading=FALSE)	{ return new VWeightImportClass;				}
	const TCHAR *	ClassName		(void)					{ return _T("VWeightImport");					}
	SClass_ID 		SuperClassID	(void)					{ return SCENE_IMPORT_CLASS_ID;				}
	Class_ID 		ClassID			(void)					{ return Class_ID(0x554b1092, 0x206a444f);	}
	const TCHAR *	Category		(void)					{ return _T("");							}
};


//===================================================================
// Tree Enumeration Callback
//		Collects the nodes in the tree into the global array
//
class UpdateNodesTEP : public ITreeEnumProc
{
public:
	virtual int				callback(INode *node);
	VWeightImportClass		*m_phec;
};


//===================================================================
// Tree Enumeration Callback
//		Dumps the triangle meshes to a file.
//
class UpdateModelTEP : public ITreeEnumProc
{
public:
	virtual int				callback(INode *node);
	void					cleanup(void);
	// FILE					*m_pfile;		// write to this file
	TimeValue				m_tvToDump;		// dump snapshot at this frame time
	VWeightImportClass		*m_phec;
	IPhyContextExport		*m_mcExport;
	IPhysiqueExport			*m_phyExport;
    Modifier				*m_phyMod;
	Modifier				*m_bonesProMod;
	BonesPro_WeightArray	*m_wa;
private:
	void					CollectWeights( int iVertex, MaxVertWeight *pweight );
};