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

182 lines
4.5 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
bkgd.h: Background class
Primary Author: ******
Review Status: REVIEWED - any changes to this file must be reviewed!
BASE ---> BACO ---> BKGD
***************************************************************************/
#ifndef BKGD_H
#define BKGD_H
/****************************************
Background on file
****************************************/
struct BKGDF
{
short bo;
short osk;
byte bIndexBase;
byte bPad;
short swPad;
};
const BOM kbomBkgdf = 0x50000000;
/****************************************
Specifies a light's kind, position,
orientation, and brightness
****************************************/
struct LITE
{
BMAT34 bmat34;
BRS rIntensity;
long lt; // light type
};
const BOM kbomLite = 0xfffffff0;
/****************************************
Specifies a camera for a view
****************************************/
typedef union _apos
{
struct
{
BRS xrPlace; // Initial Actor Placement point
BRS yrPlace;
BRS zrPlace;
};
BVEC3 bvec3Actor;
} APOS;
struct CAM
{
short bo;
short osk;
BRS zrHither; // Hither (near) plane
BRS zrYon; // Yon (far) plane
BRA aFov; // Field of view
short swPad;
APOS apos;
BMAT34 bmat34Cam; // Camera view matrix
// APOS rgapos[];
};
const BOM kbomCamOld = 0x5f4fc000;
const BOM kbomCam = BomField(kbomSwapShort,
BomField(kbomSwapShort,
BomField(kbomSwapLong,
BomField(kbomSwapLong,
BomField(kbomSwapShort,
BomField(kbomLeaveShort,
BomField(kbomSwapLong,
BomField(kbomSwapLong,
BomField(kbomSwapLong, 0)))))))));
// Note that CAM is too big for a complete kbomCam. To SwapBytes one,
// SwapBytesBom the cam, then SwapBytesRgLw from bmat34Cam on.
/****************************************
Background Default Sound
****************************************/
struct BDS
{
short bo;
short osk;
long vlm;
bool fLoop;
TAG tagSnd;
};
const BOM kbomBds = 0x5f000000 | kbomTag >> 8;
/****************************************
The background class
****************************************/
typedef class BKGD *PBKGD;
#define BKGD_PAR BACO
#define kclsBKGD 'BKGD'
class BKGD : public BKGD_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
BACT *_prgbactLight; // array of light br_actors
BLIT *_prgblitLight; // array of light data
long _cbactLight; // count of lights
bool _fLites; // lights are on
bool _fLeaveLitesOn; // Don't turn out the lights
long _ccam; // count of cameras in this background
long _icam; // current camera
BMAT34 _bmat34Mouse; // camera matrix for mouse model
BRA _braRotY; // Y rotation of current camera
CNO _cnoSnd; // background sound
STN _stn; // name of this background
PGL _pglclr; // palette for this background
byte _bIndexBase; // first index for palette
long _iaposLast; // Last placement point we used
long _iaposNext; // Next placement point to use
PGL _pglapos; // actor placement point(s) for current view
BRS _xrPlace;
BRS _yrPlace;
BRS _zrPlace;
BDS _bds; // background default sound
BRS _xrCam; // camera position in worldspace
BRS _yrCam;
BRS _zrCam;
protected:
bool _FInit(PCFL pcfl, CTG ctg, CNO cno);
long _Ccam(PCFL pcfl, CTG ctg, CNO cno);
void _SetupLights(PGL pgllite);
public:
static bool FAddTagsToTagl(PTAG ptagBkgd, PTAGL ptagl);
static bool FCacheToHD(PTAG ptagBkgd);
static bool FReadBkgd(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck,
PBACO *ppbaco, long *pcb);
~BKGD(void);
void GetName(PSTN pstn);
void TurnOnLights(PBWLD pbwld);
void TurnOffLights(void);
bool FLeaveLitesOn(void) { return _fLeaveLitesOn; }
void SetFLeaveLitesOn(bool fLeaveLitesOn) { _fLeaveLitesOn = fLeaveLitesOn; }
long Ccam(void) { return _ccam; } // count of cameras in background
long Icam(void) { return _icam; } // currently selected camera
bool FSetCamera(PBWLD pbwld, long icam); // change camera to icam
void GetMouseMatrix(BMAT34 *pbmat34);
BRA BraRotYCamera(void) { return _braRotY; }
void GetActorPlacePoint(BRS *pxr, BRS *pyr, BRS *pzr);
void ReuseActorPlacePoint(void);
void GetDefaultSound(PTAG ptagSnd, long *pvlm, bool *pfLoop)
{
*ptagSnd = _bds.tagSnd;
*pvlm = _bds.vlm;
*pfLoop = _bds.fLoop;
}
bool FGetPalette(PGL *ppglclr, long *piclrMin);
void GetCameraPos(BRS *pxr, BRS *pyr, BRS *pzr);
#ifdef DEBUG
// Authoring only. Writes a special file with the given place info.
bool FWritePlaceFile(BRS xrPlace, BRS yrPlace, BRS zrPlace);
#endif // DEBUG
};
#endif BKGD_H