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

350 lines
10 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
THIS IS A CODE REVIEWED FILE
Basic scene classes:
Scene (SCEN)
BASE ---> SCEN
Scene Actor Undo Object (SUNA)
BASE ---> UNDB ---> MUNB ---> SUNA
***************************************************************************/
#ifndef SCEN_H
#define SCEN_H
//
// Undo object for actor operations
//
typedef class SUNA *PSUNA;
#define SUNA_PAR MUNB
// Undo types
enum
{
utAdd = 0x1,
utDel,
utRep,
};
#define kclsSUNA 'SUNA'
class SUNA : public SUNA_PAR
{
RTCLASS_DEC
MARKMEM
ASSERT
protected:
PACTR _pactr;
long _ut; // Tells which type of undo this is.
SUNA(void) { }
public:
static PSUNA PsunaNew(void);
~SUNA(void);
void SetActr(PACTR pactr) { _pactr = pactr; }
void SetType(long ut) { _ut = ut; }
virtual bool FDo(PDOCB pdocb);
virtual bool FUndo(PDOCB pdocb);
};
//
// Different reasons for pausing in a scene
//
enum WIT
{
witNil,
witUntilClick,
witUntilSnd,
witForTime,
witLim
};
//
// Functionality that can be turned off and on. If the bit
// is set, it is disabled.
//
enum
{
fscenSounds = 0x1,
fscenPauses = 0x2,
fscenTboxes = 0x4,
fscenActrs = 0x8,
fscenPosition = 0x10,
fscenAction = 0x20,
fscenCams = 0x40,
fscenAll = 0xFFFF
};
typedef struct SSE *PSSE;
typedef struct TAGC *PTAGC;
typedef class SCEN *PSCEN;
//
// Notes:
//
// This assumes that struct SND contains at least,
// - Everything necessary to play the sound.
//
// This assumes that struct TBOX contains at least,
// - Everything necessary to display the text.
// - Enumerating through text boxes in a scene is not necessary.
//
#define SCEN_PAR BASE
#define kclsSCEN 'SCEN'
class SCEN : public SCEN_PAR
{
RTCLASS_DEC
MARKMEM
ASSERT
protected:
typedef struct SEV *PSEV;
//
// These variables keep track of the internal frame numbers.
//
long _nfrmCur; // Current frame number
long _nfrmLast; // Last frame number in scene.
long _nfrmFirst; // First frame number in scene.
//
// Frames with events in them. This stuff works as follows.
// _isevFrmLim is the index into the GG of a sev with nfrm > nCurFrm.
//
PGG _pggsevFrm; // List of events that occur in frames.
long _isevFrmLim; // Next event to process.
//
// Global information
//
STN _stnName; // Name of this scene
PGL _pglpactr; // List of actors in the scene.
PGL _pglptbox; // List of text boxes in the scene.
PGG _pggsevStart; // List of frame independent events.
PMVIE _pmvie; // Movie this scene is a part of.
PBKGD _pbkgd; // Background for this scene.
ulong _grfscen; // Disabled functionality.
PACTR _pactrSelected; // Currently selected actor, if any
PTBOX _ptboxSelected; // Currently selected tbox, if any
TRANS _trans; // Transition at the end of the scene.
PMBMP _pmbmp; // The thumbnail for this scene.
PSSE _psseBkgd; // Background scene sound (starts playing
// at start time even if snd event is
// earlier)
long _nfrmSseBkgd; // Frame at which _psseBkgd starts
TAG _tagBkgd; // Tag to current BKGD
protected:
SCEN(PMVIE pmvie);
~SCEN(void);
//
// Event stuff
//
bool _FPlaySev(PSEV psev, void *qvVar, ulong grfscen);// Plays a single scene event.
bool _FUnPlaySev(PSEV psev, void *qvVar); // Undoes a single scene event.
bool _FAddSev(PSEV psev, long cbVar, void *pvVar); // Adds scene event to the current frame.
void _MoveBackFirstFrame(long nfrm);
//
// Dirtying stuff
//
void _MarkMovieDirty(void);
void _DoPrerenderingWork(bool fStartNow); // Does any prerendering for _nfrmCur
void _EndPrerendering(void); // Stops prerendering
//
// Make actors go to a specific frame
//
bool _FForceActorsToFrm(long nfrm, bool *pfSoundInFrame = pvNil);
bool _FForceTboxesToFrm(long nfrm);
//
// Thumbnail routines
//
void _UpdateThumbnail(void);
public:
//
// Create and destroy
//
static SCEN *PscenNew(PMVIE pmvie); // Returns pvNil if it fails.
static SCEN *PscenRead(PMVIE pmvie, PCRF pcrf, CNO cno); // Returns pvNil if it fails.
bool FWrite(PCRF pcrf, CNO *pcno); // Returns fFalse if it fails, else the cno written.
static void Close(PSCEN *ppscen); // Public destructor
void RemActrsFromRollCall(bool fDelIfOnlyRef = fFalse); // Removes actors from movie roll call.
bool FAddActrsToRollCall(void); // Adds actors from movie roll call.
//
// Tag collection
//
static bool FAddTagsToTagl(PCFL pcfl, CNO cno, PTAGL ptagl);
//
// Frame functions
//
bool FPlayStartEvents(bool fActorsOnly = fFalse); // Play all one-time starting scene events.
void InvalFrmRange(void); // Mark the frame count dirty
bool FGotoFrm(long nfrm); // Jumps to an arbitrary frame.
long Nfrm(void) // Returns the current frame number
{ return (_nfrmCur); }
long NfrmFirst(void) // Returns the number of the first frame in the scene.
{ return (_nfrmFirst); }
long NfrmLast(void) // Returns the number of the last frame in the scene.
{ return (_nfrmLast); }
bool FReplayFrm(ulong grfscen); // Replay events in this scene.
//
// Undo accessor functions
//
void SetNfrmCur(long nfrm)
{ _nfrmCur = nfrm; }
//
// Edit functions
//
void SetMvie(PMVIE pmvie); // Sets the associated movie.
void GetName(PSTN pstn) // Gets name of current scene.
{ *pstn = _stnName; }
void SetNameCore(PSTN pstn) // Sets name of current scene.
{ _stnName = *pstn; }
bool FSetName(PSTN pstn); // Sets name of current scene, and undo
bool FChopCore(void); // Chops off the rest of the scene.
bool FChop(void); // Chops off the rest of the scene and undo
bool FChopBackCore(void); // Chops off the rest of the scene, backwards.
bool FChopBack(void); // Chops off the rest of the scene, backwards, and undo.
//
// Transition functions
//
void SetTransitionCore(TRANS trans) // Set the final transition to be.
{ _trans = trans; }
bool FSetTransition(TRANS trans); // Set the final transition to be and undo.
TRANS Trans(void) { return _trans; }// Returns the transition setting.
// These two operate a specific SCEN chunk rather than a SCEN in memory
static FTransOnFile(PCRF pcrf, CNO cno, TRANS *ptrans);
static FSetTransOnFile(PCRF pcrf, CNO cno, TRANS trans);
//
// State functions
//
void Disable(ulong grfscen) // Disables functionality.
{ _grfscen |= grfscen; }
void Enable(ulong grfscen) // Enables functionality.
{ _grfscen &= ~grfscen;}
long GrfScen(void) // Currently disabled functionality.
{ return _grfscen; }
bool FIsEmpty(void); // Is the scene empty?
//
// Actor functions
//
bool FAddActrCore(ACTR *pactr); // Adds an actor to the scene at current frame.
bool FAddActr(ACTR *pactr); // Adds an actor to the scene at current frame, and undo
void RemActrCore(long arid); // Removes an actor from the scene.
bool FRemActr(long arid); // Removes an actor from the scene, and undo
PACTR PactrSelected(void) // Returns selected actor
{ return _pactrSelected; }
void SelectActr(ACTR *pactr); // Sets the selected actor
PACTR PactrFromPt(long xp, long yp, long *pibset);// Gets actor pointed at by the mouse.
PGL PglRollCall(void) // Return a list of all actors in scene.
{ return (_pglpactr); } // Only to be used by the movie-class
void HideActors(void);
void ShowActors(void);
PACTR PactrFromArid(long arid); // Finds a current actor in this scene.
long Cactr(void) { return (_pglpactr == pvNil ? 0 : _pglpactr->IvMac()); }
//
// Sound functions
//
bool FAddSndCore(bool fLoop, bool fQueue, long vlm, long sty, long ctag, PTAG prgtag); // Adds a sound to the current frame.
bool FAddSndCoreTagc(bool fLoop, bool fQueue, long vlm, long sty, long ctagc, PTAGC prgtagc);
bool FAddSnd(PTAG ptag, bool fLoop, bool fQueue, long vlm, long sty); // Adds a sound to the current frame, and undo
void RemSndCore(long sty); // Removes the sound from current frame.
bool FRemSnd(long sty); // Removes the sound from current frame, and undo
bool FGetSnd(long sty, bool *pfFound, PSSE *ppsse); // Allows for retrieval of sounds.
void PlayBkgdSnd(void);
bool FQuerySnd(long sty, PGL *pgltagSnd, long *pvlm, bool *pfLoop);
void SetSndVlmCore(long sty, long vlmNew);
void UpdateSndFrame(void);
bool FResolveAllSndTags(CNO cnoScen);
//
// Text box functions
//
bool FAddTboxCore(PTBOX ptbox); // Adds a text box to the current frame.
bool FAddTbox(PTBOX ptbox); // Adds a text box to the current frame.
bool FRemTboxCore(PTBOX ptbox); // Removes a text box from the scene.
bool FRemTbox(PTBOX ptbox); // Removes a text box from the scene.
PTBOX PtboxFromItbox(long itbox); // Returns the ith tbox in this frame.
PTBOX PtboxSelected(void) // Returns the tbox currently selected.
{ return _ptboxSelected; }
void SelectTbox(PTBOX ptbox); // Selects this tbox.
void HideTboxes(void); // Hides all text boxes.
long Ctbox(void) { return (_pglptbox == pvNil ? 0 : _pglptbox->IvMac()); }
//
// Pause functions
//
bool FPauseCore(WIT *pwit, long *pdts); // Adds\Removes a pause to the current frame.
bool FPause(WIT wit, long dts); // Adds\Removes a pause to the current frame, and undo
//
// Background functions
//
bool FSetBkgdCore(PTAG ptag, PTAG ptagOld); // Sets the background for this scene.
bool FSetBkgd(PTAG ptag); // Sets the background for this scene, and undo
BKGD *Pbkgd(void) { return _pbkgd; }// Gets the background for this scene.
bool FChangeCamCore(long icam, long *picamOld); // Changes camera viewpoint at current frame.
bool FChangeCam(long icam); // Changes camera viewpoint at current frame, and undo
PMBMP PmbmpThumbnail(void); // Returns the thumbnail.
bool FGetTagBkgd(PTAG ptag); // Returns the tag for the background for this scene
//
// Movie functions
//
PMVIE Pmvie() { return (_pmvie); } // Get the parent movie
//
// Mark scene as dirty
//
void MarkDirty(bool fDirty = fTrue);// Mark the scene as changed.
//
// Clipboard type functions
//
bool FPasteActrCore(PACTR pactr); // Pastes actor into current frame
bool FPasteActr(PACTR pactr); // Pastes actor into current frame and undo
//
// Playing functions
//
bool FStartPlaying(void); // For special behavior when playback starts
void StopPlaying(void); // Used to clean up after playback has stopped.
};
#endif //!SCEN_H