mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-14 23:45:06 +00:00
350 lines
10 KiB
C
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
|
||
|
|
||
|
|