Microsoft-3D-Movie-Maker/INC/BODY.H

144 lines
4.3 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/*************************************************************************
body.h: Body class
Primary Author: ******
Review Status: REVIEWED - any changes to this file must be reviewed!
BASE ---> BODY
*************************************************************************/
#ifndef BODY_H
#define BODY_H
/****************************************
The BODY class
****************************************/
typedef class BODY *PBODY;
#define BODY_PAR BASE
#define kclsBODY 'BODY'
class BODY : public BODY_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
static BMTL *_pbmtlHilite; // hilight material
static BODY *_pbodyClosestClicked;
static long _dzpClosestClicked;
static BACT *_pbactClosestClicked;
BACT *_prgbact; // array of BACTs
PGL _pglibset; // body part set IDs
long _cbset; // count of body part sets
PCMTL *_prgpcmtl; // array of PCMTLs -- one per body part set
long _cbactPart; // count of model body parts in body
long _cactHidden; // for Show() / Hide()
PBWLD _pbwld; // world that body lives in
RC _rcBounds; // bounds of body after last render
RC _rcBoundsLastVis;// bounds of body last time it was visible
bool _fFound; // is the actor found under the mouse?
long _ibset; // which body part got hit.
protected:
BODY(void) {} // can't instantiate directly; must use PbodyNew
void _DestroyShape(void);
bool _FInit(PGL pglibactPar, PGL pglibset);
bool _FInitShape(PGL pglibactPar, PGL pglibset);
PBACT _PbactRoot(void) // ptr to root BACT
{ return _prgbact; }
PBACT _PbactHilite(void) // ptr to hilite BACT
{ return _prgbact + 1; } // skip root BACT
PBACT _PbactPart(long ipart) // ptr to ipart'th body part
{ return _prgbact + 1 + 1 + ipart; } // skip root and hilite BACTs
long _Cbact(void) // count in _prgbact
{ return 1 + 1 + _cbactPart; } // root, hilite, and body part BACTs
long _Ibset(long ipart) // body part set that this part belongs to
{ return *(short *)_pglibset->QvGet(ipart);}
void _RemoveMaterial(long ibset);
// Callbacks from BRender:
static int BR_CALLBACK _FFilterSearch(BACT *pbact, PBMDL pbmdl,
PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear,
BRS dzpFar, void *pvArg);
static void _BactRendered(PBACT pbact, RC *prc);
static void _PrepareToRender(PBACT pbact);
static void _GetRc(PBACT pbact, RC *prc);
public:
static PBODY PbodyNew(PGL pglibactPar, PGL pglibset);
static PBODY PbodyFromBact(BACT *pbact, long *pibset = pvNil);
static PBODY PbodyClicked(long xp, long yp, PBWLD pbwld, long *pibset = pvNil);
~BODY(void);
PBODY PbodyDup(void);
void Restore(PBODY pbodyDup);
static int BR_CALLBACK _FFilter(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl,
BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar,
void *pv);
bool FChangeShape(PGL pglibactPar, PGL pglibset);
void SetBwld(PBWLD pbwld) { _pbwld = pbwld; }
void Show(void);
void Hide(void);
void Hilite(void);
void Unhilite(void);
static void SetHiliteColor(long iclr);
void LocateOrient(BRS xr, BRS yr, BRS zr, BMAT34 *pbmat34);
void SetPartModel(long ibact, MODL *pmodl);
void SetPartMatrix(long ibact, BMAT34 *pbmat34);
void SetPartSetMtrl(long ibset, MTRL *pmtrl);
void SetPartSetCmtl(CMTL *pcmtl);
void GetPartSetMaterial(long ibset, bool *pfMtrl, MTRL **ppmtrl,
CMTL **ppcmtl);
long Cbset() { return _cbset; }
void GetBcbBounds(BCB *pbcb, bool fWorld = fFalse);
void GetRcBounds(RC *prc);
void GetCenter(long *pxp, long *pyp);
void GetPosition(BRS *pxr, BRS *pyr, BRS *pzr);
bool FPtInBody(long xp, long yp, long *pibset);
bool FIsInView(void);
};
/****************************************
The COST class, which is used to
save and restore a BODY's entire
costume for unwinding purposes
****************************************/
typedef class COST *PCOST;
#define COST_PAR BASE
#define kclsCOST 'COST'
class COST : public COST_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
private:
long _cbset; // count of body part sets in _prgpo
BASE **_prgpo; // array of MTRLs and CMTLs
private:
void _Clear(void); // release _prgpo and material references
public:
COST(void);
~COST(void);
bool FGet(PBODY pbody); // read and store BODY's costume
// replace BODY's costume with this one
void Set(PBODY pbody, bool fAllowDifferentShape = fFalse);
};
#endif // !BODY_H