DMX model: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(deciphered Dag and Indicies)
mNo edit summary
Line 96: Line 96:
class DmeVertexData // mesh data
class DmeVertexData // mesh data
{
{
CUtlString vertexFormat[]; // positions, normals, textureCoordinates
CUtlString vertexFormat[]; // positions, normals, textureCoordinates, jointWeights, jointIndices
int jointCount; // what is this doing here?
int jointCount; // total number of bones this mesh is weighted to
bool flipVCoordinates; // left-hand to right hand?
bool flipVCoordinates; // left-handed to right-handed?


// In each of the below cases, the "Indicies" value contains one entry for each vertex.
// In each of the below cases, the "Indicies" value contains one entry for each vertex.
Line 105: Line 105:
// own three verts, even if they overlap other verts.
// own three verts, even if they overlap other verts.
Vector positions[]; // location of each vertex
Vector positions[];
int positionsIndicies[]; // unknown
int positionsIndicies[];


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


Vector2D textureCoordinates[]; // UV co-ord of each vertex
Vector2D textureCoordinates[];
int textureCoordinatesIndicies[]; // the vertex that each value applies to -
int textureCoordinatesIndicies[];
float jointWeights[]; // Optional. TODO: why do the numbers of values here not match up?
int jointIndicies[];
};
};


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

Revision as of 15:49, 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, jointWeights, jointIndices
	int			jointCount;			// total number of bones this mesh is weighted to
	bool		flipVCoordinates;	// left-handed to right-handed?

	// 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[];
	int			positionsIndicies[];

	Vector		normals[];
	int			normalsIndicies[];

	Vector2D	textureCoordinates[];
	int			textureCoordinatesIndicies[];
	
	float		jointWeights[];		// Optional. TODO: why do the numbers of values here not match up?
	int			jointIndicies[];
};

class DmeFaceSet // defines faces, including their material
{
	DmeMaterial*	material; // the material these faces are 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
};