mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-22 10:22:40 +01:00
144 lines
4.3 KiB
C++
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
|