Microsoft-3D-Movie-Maker/INC/TMPL.H
2022-05-03 16:31:19 -07:00

202 lines
5.8 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/*************************************************************************
tmpl.h: Actor template class
Primary Author: ******
Review Status: REVIEWED - any changes to this file must be reviewed!
BASE ---> BACO ---> ACTN
BASE ---> BACO ---> TMPL
A TMPL encapsulates all the data that distinguishes one actor
"species" from another, including the species' models, actions,
and custom texture maps. One or more BODY classes are created based
on a TMPL, and the TMPL attaches models and materials to the body
based on more abstract concepts like actions and costumes.
*************************************************************************/
#ifndef TMPL_H
#define TMPL_H
/****************************************
Cel part spec: tells what model and
xfrm to apply to a body part for
one cel
****************************************/
struct CPS
{
short chidModl; // CHID (under TMPL chunk) of model for this body part
short imat34; // index into ACTN's GL of transforms
};
const BOM kbomCps = 0x50000000;
/****************************************
Cel: tells what CPS's to apply to an
actor for one cel. It also tells
what sound to play (if any), and how
far the actor should move from the
previous cel (dwr).
****************************************/
struct CEL
{
CHID chidSnd; // sound to play at this cel (CHID under ACTN chunk)
BRS dwr; // distance from previous cel
// CPS rgcps[]; // list of cel part specs (variable part of pggcel)
};
const BOM kbomCel = 0xf0000000;
// template on file
struct TMPLF
{
short bo;
short osk;
BRA xaRest; // reminder: BRAs are shorts
BRA yaRest;
BRA zaRest;
short swPad; // so grftmpl (and the whole TMPLF) is long-aligned
ulong grftmpl;
};
#define kbomTmplf 0x554c0000
// action chunk on file
struct ACTNF
{
short bo;
short osk;
long grfactn;
};
const ulong kbomActnf = 0x5c000000;
// grfactn flags
enum
{
factnRotateX = 1, // Tells whether actor should rotate around this
factnRotateY = 2, // axis when following a path
factnRotateZ = 4,
factnStatic = 8, // Tells whether this is a stationary action
};
/****************************************
ACTN (action): all the information
for an action like 'rest' or 'walk'.
****************************************/
typedef class ACTN *PACTN;
#define ACTN_PAR BACO
#define kclsACTN 'ACTN'
class ACTN : public ACTN_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
PGG _pggcel; // GG of CELs; variable part is a rgcps[]
PGL _pglbmat34; // GL of transformation matrices used in this action
PGL _pgltagSnd; // GL of motion-match sounds for this action
ulong _grfactn; // various flags for this action
protected:
ACTN(void) {} // can't instantiate directly; must use FReadActn
bool _FInit(PCFL pcfl, CTG ctg, CNO cno);
public:
static PACTN PactnNew(PGG pggcel, PGL pglbmat34, ulong grfactn);
static bool FReadActn(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck,
PBACO *ppbaco, long *pcb);
~ACTN(void);
ulong Grfactn(void) { return _grfactn; }
long Ccel(void) { return _pggcel->IvMac(); }
void GetCel(long icel, CEL *pcel);
void GetCps(long icel, long icps, CPS *pcps);
void GetMatrix(long imat34, BMAT34 *pbmat34);
void GetSnd(long icel, PTAG ptagSnd);
};
// grftmpl flags
enum
{
ftmplOnlyCustomCostumes = 1, // fTrue means don't apply generic MTRLs
ftmplTdt = 2, // fTrue means this is a 3-D Text object
ftmplProp = 4, // fTrue means this is a "prop" actor
};
/****************************************
TMPL: The template class.
anid is an action ID.
cmid is a costume ID.
celn is a cel number.
****************************************/
typedef class TMPL *PTMPL;
#define TMPL_PAR BACO
#define kclsTMPL 'TMPL'
class TMPL : public TMPL_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
BRA _xaRest; // Rest orientation
BRA _yaRest;
BRA _zaRest;
ulong _grftmpl;
PGL _pglibactPar; // GL of parent IDs (shorts) to build BODY
PGL _pglibset; // GL of body-part-set IDs to build BODY
PGG _pggcmid; // List of costumes for each body part set
long _ccmid; // Count of custom costumes
long _cbset; // Count of body part sets
long _cactn; // Count of actions
STN _stn; // Template name
protected:
TMPL(void) {} // can't instantiate directly; must use FReadTmpl
bool _FReadTmplf(PCFL pcfl, CTG ctg, CNO cno);
virtual bool _FInit(PCFL pcfl, CTG ctgTmpl, CNO cnoTmpl);
virtual PACTN _PactnFetch(long anid);
virtual PMODL _PmodlFetch(CHID chidModl);
bool _FWriteTmplf(PCFL pcfl, CTG ctg, CNO *pcno);
public:
static bool FReadTmpl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck,
PBACO *ppbaco, long *pcb);
~TMPL(void);
static PGL PgltagFetch(PCFL pcfl, CTG ctg, CNO cno, bool *pfError);
// TMPL / BODY stuff
void GetName(PSTN pstn); // default name of actor or text of the TDT
PBODY PbodyCreate(void); // Creates a body based on this TMPL
void GetRestOrien(BRA *pxa, BRA *pya, BRA *pza);
bool FIsTdt(void) { return FPure(_grftmpl & ftmplTdt); }
bool FIsProp(void) { return FPure(_grftmpl & ftmplProp); }
// Action stuff
long Cactn(void) { return _cactn; } // count of actions
virtual bool FGetActnName(long anid, PSTN pstn);
bool FSetActnCel(PBODY pbody, long anid, long celn, BRS *pdwr = pvNil);
bool FGetGrfactn(long anid, ulong *pgrfactn);
bool FGetDwrActnCel(long anid, long celn, BRS *pdwr);
bool FGetCcelActn(long anid, long *pccel);
bool FGetSndActnCel(long anid, long celn, bool *pfSoundExists,
PTAG ptag);
// Costume stuff
virtual bool FSetDefaultCost(PBODY pbody); // applies default costume
virtual PCMTL PcmtlFetch(long cmid);
long CcmidOfBset(long ibset);
long CmidOfBset(long ibset, long icmid);
bool FBsetIsAccessory(long ibset); // whether ibset holds accessories
bool FIbsetAccOfIbset(long ibset, long *pibsetAcc);
bool FSameAccCmids(long cmid1, long cmid2);
};
#endif TMPL_H