DMX model: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(updated from some ASCII DMX examples)
(deciphered Dag and Indicies)
Line 8: Line 8:
class DmeModelRoot
class DmeModelRoot
{
{
// model and skeleton point to the same object
// model and skeleton should point to the same object
DmeModel* model;
DmeModel* model;
DmeModel* skeleton;
DmeModel* skeleton;
DmeCombinationOperator* combinationOperator; // flex animations only
DmeCombinationOperator* combinationOperator; // flex animations only
};
};


class DmeCombinationOperator
class DmeCombinationOperator // flex controller global settings
{
{
DmeCombinationInputControl controls[];
DmeCombinationInputControl controls[];
Vector controlValues[]; // rest position...but why a 3D vector?
Vector controlValues[]; // rest position...but why a 3D vector?
Vector controlValuesLagged[];
Vector controlValuesLagged[]; // unknown
bool usesLaggedValues;
bool usesLaggedValues;
DmeMesh* dominators[];
DmeMesh* dominators[]; // unknown
DmeMesh* targets[]; // mesh with shapes on
DmeMesh* targets[]; // mesh with the shapes on
};
};


class DmeCombinationInputControl // flex controller
class DmeCombinationInputControl // a flex controller
{
{
CUtlString rawControlNames[];
CUtlString rawControlNames[]; // which controls are being wrapped
bool stereo;
bool stereo; // equivalent to QC 'split'?
bool eyelid;
bool eyelid; // flags as an eyelid used by AI for blinking
float wrinkleScales[];
float wrinkleScales[]; // wrinkle map, a recent tech that is not documented yet. One value for each named control.
};
};


class DmeModel
class DmeModel
{
{
DmeTransform* transform; // global model transform?
DmeTransform* transform; // global model transform? DAG not supported here?
DmeAttachment* shape; // defines
DmeAttachment* shape;
bool visible;
bool visible;
DmeModel children[]; // also seen with "DmeDag" elements, which seem identical to DmeModels...?
DmeModel children[];
DmeJoint jointList[];
DmeJoint jointList[];
DmeVertexData BaseStates[];
DmeVertexData BaseStates[];
CUtlString upAxis; // uppercase character
CUtlString upAxis; // uppercase character
};
};


class DmeDag // purpose unclear: seen defining both bones and meshes
// A "DAG" is a generic Maya container, appearing here in order to transform objects.
// It can take the place of a DmeMesh, DmeJoint or DmeAttachment at any time.
class DmeDag
{
{
DmeTransform* transform;
DmeTransform* transform;
bool visible;
void children[]; // never seen used
// One of the following:
CUtlString name // of a DmeJoint
DmeMesh* shape;
DmeAttachment* shape;
DmeAttachment* shape;
bool visible;
DmeDag children[];
};
};


Line 65: Line 72:
};
};


class DmeAttachment
class DmeAttachment // an attachment
{
{
bool visible;
bool visible;
bool IsRigid;
bool IsRigid; // does not animate with associated bone
bool isWorldAligned;
bool isWorldAligned; // transform in world co-ords
};
};


class DmeMesh // Collection of states...suspected that there will only be more than one in a vertex animation DMX.
class DmeMesh
{
{
bool visible;
bool visible;


DmeVertexData bindState; // needs confirmation - only seen empty
DmeVertexData bindState; // needs confirmation - only seen empty
DmeVertexData* currentState; // pointer to default baseState
DmeVertexData* currentState; // pointer to default baseState
DmeVertexData baseStates[];
DmeVertexData baseStates[]; // never seen with more than one member
DmeVertexData deltaStates[];
DmeVertexData deltaStates[]; // unknown


DmeFaceSet faceSets[];
DmeFaceSet faceSets[];
Line 87: Line 94:
};
};


// Actual model/skeleton data
class DmeVertexData // mesh data
class DmeVertexData
{
{
CUtlString vertexFormat[];
CUtlString vertexFormat[]; // positions, normals, textureCoordinates
int jointCount;
int jointCount; // what is this doing here?
bool flipVCoordinates;
bool flipVCoordinates; // left-hand to right hand?


Vector positions[];
// In each of the below cases, the "Indicies" value contains one entry for each vertex.
int positionsIndicies[];
// the indice value defines which value from the 'real' array the vertex takes. In this
// way, vertices can share data. This is a useful optimisation since each poly has its
// own three verts, even if they overlap other verts.
Vector positions[]; // location of each vertex
int positionsIndicies[]; // unknown


Vector normals[];
Vector normals[]; // normal of each vertex
int normalsIndicies[];
int normalsIndicies[]; // unknown


Vector2D textureCoordinates[];
Vector2D textureCoordinates[]; // UV co-ord of each vertex
int textureCoordinatesIndicies[];
int textureCoordinatesIndicies[]; // the vertex that each value applies to -
};
};


// Defines a group of faces, and associates them with a material
class DmeFaceSet // defines faces, including their material
class DmeFaceSet
{
{
DmeMaterial material;
DmeMaterial* material; // the material this face is drawn with
int faces[];
int faces[]; // the vertices that make up each face, delimited by -1. Supports quads.
};
};


// A material reference
class DmeMaterial // a material
class DmeMaterial
{
{
CUtlString mtlName; // relative to /materials, no extension
CUtlString mtlName; // relative to \game\materials\, no extension
};
};
</source>
</source>

Revision as of 15:28, 4 January 2011

Help.png
This article contains speculation that needs to be confirmed.

For sanity's sake, the data structure is expressed in pseudo-C++.

  • Todo: Are names case sensitive?
class DmeModelRoot
{
	// model and skeleton should point to the same object
	DmeModel*	model;
	DmeModel*	skeleton;
	
	DmeCombinationOperator*	combinationOperator; // flex animations only
};

class DmeCombinationOperator // flex controller global settings
{
	DmeCombinationInputControl	controls[];
	Vector		controlValues[];		// rest position...but why a 3D vector?
	Vector		controlValuesLagged[];	// unknown
	bool		usesLaggedValues;
	DmeMesh*	dominators[];			// unknown
	DmeMesh*	targets[];				// mesh with the shapes on
};

class DmeCombinationInputControl // a flex controller
{
	CUtlString	rawControlNames[];	// which controls are being wrapped
	bool		stereo;				// equivalent to QC 'split'?
	bool		eyelid;				// flags as an eyelid used by AI for blinking
	float		wrinkleScales[];	// wrinkle map, a recent tech that is not documented yet. One value for each named control.
};

class DmeModel
{
	DmeTransform*	transform;		// global model transform? DAG not supported here?
	DmeAttachment*	shape;
	bool			visible;
	DmeModel		children[];
	DmeJoint		jointList[];
	DmeVertexData	BaseStates[];
	CUtlString		upAxis;			// uppercase character
};

// A "DAG" is a generic Maya container, appearing here in order to transform objects.
// It can take the place of a DmeMesh, DmeJoint or DmeAttachment at any time.
class DmeDag
{
	DmeTransform*	transform;
	bool			visible;
	void			children[]; // never seen used
	
	// One of the following:
	CUtlString		name // of a DmeJoint
	DmeMesh*		shape;
	DmeAttachment*	shape;
};

class DmeJoint // a bone
{
	DmeTransform*	transform;
	void*			shape; // only seen empty
	bool			visible;
	DmeJoint		children[];
	bool			lockInfluenceWeights;

class DmeTransform // name is of a defined model if there are children, otherwise blank
{
	Vector		position;
	Quaternion	orientation;
};

class DmeAttachment // an attachment
{
	bool		visible;
	bool		IsRigid; // does not animate with associated bone
	bool		isWorldAligned; // transform in world co-ords
};

class DmeMesh
{
	bool				visible;

	DmeVertexData		bindState;		// needs confirmation - only seen empty
	DmeVertexData*		currentState;	// pointer to default baseState
	DmeVertexData		baseStates[];	// never seen with more than one member
	DmeVertexData		deltaStates[];	// unknown

	DmeFaceSet			faceSets[];

	Vector2D			deltaStateWeights[];
	Vector2D			deltaStateWeightsLagged[];
};

class DmeVertexData // mesh data
{
	CUtlString	vertexFormat[];		// positions, normals, textureCoordinates
	int			jointCount;			// what is this doing here?
	bool		flipVCoordinates;	// left-hand to right hand?

	// In each of the below cases, the "Indicies" value contains one entry for each vertex.
	// the indice value defines which value from the 'real' array the vertex takes. In this
	// way, vertices can share data. This is a useful optimisation since each poly has its
	// own three verts, even if they overlap other verts.
	
	Vector		positions[];			// location of each vertex
	int			positionsIndicies[];	// unknown

	Vector		normals[];			// normal of each vertex
	int			normalsIndicies[];	// unknown

	Vector2D	textureCoordinates[];			// UV co-ord of each vertex
	int			textureCoordinatesIndicies[];	// the vertex that each value applies to - 
};

class DmeFaceSet // defines faces, including their material
{
	DmeMaterial*	material; // the material this face is drawn with
	int				faces[]; // the vertices that make up each face, delimited by -1. Supports quads.
};

class DmeMaterial // a material
{
	CUtlString	mtlName; // relative to \game\materials\, no extension
};