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

610 lines
21 KiB
C
Raw Normal View History

2022-05-03 23:31:19 +00:00
/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/*******************************************************************
Actor class
Primary Author : *****
Review Status: Reviewed
BASE -------> ACTR
Each actor has a unique route which is defined by one or more nodes,
and which may be a concatenation of one or more subroutes.
Each actor also has an event list describing events which happen
at a specified time and point along the route. A point may coincide
with a node or lie between nodes.
*******************************************************************/
#ifndef ACTOR_H
#define ACTOR_H
//
// XYZ : A point in x,y,z along an actor's RouTE.
//
struct XYZ
{
BRS dxr;
BRS dyr;
BRS dzr;
bool operator==(XYZ &xyz)
{ return ((dxr == xyz.dxr) &&
(dyr == xyz.dyr) &&
(dzr == xyz.dzr)); }
bool operator!=(XYZ &xyz)
{ return ((dxr != xyz.dxr) ||
(dyr != xyz.dyr) ||
(dzr != xyz.dzr)); }
};
typedef XYZ * PXYZ;
const BOM kbomXyz = 0xfc000000;
//
// A RouTE is a general list (GL) of Route PoinTs(RPT)
// A Subroute is a contiguous section of a route.
//
struct RPT
{
XYZ xyz;
BRS dwr; //Distance from this node to the next node on the route
};
const BOM kbomRpt = 0xff000000;
const long knfrmInvalid = klwMax; // invalid frame state. Regenerate correct state
const long kcrptGrow = 32; // quantum growth for rpt
const long kcsmmGrow = 2; // quantum growth for smm
const long kctagSndGrow = 2; // quantum growth for tagSnd
const long smmNil = -1; // Not motion match sound
const BRS kdwrNil = BR_SCALAR(-1.0); // flags use of template cel stepsize
const BRS kzrDefault = BR_SCALAR(-25.0); // initial default z position
const BRS kdwrMax = BR_SCALAR(32767.0); // large BRS value
const ulong kdtsThreshRte = (kdtsSecond >> 2) + (kdtsSecond >> 1); // time threshhold before record in place
const BRS kdwrThreshRte = BR_SCALAR(2.0); // distance threshhold before entering record mode
const long kcaevInit = 10;
const BRS kdwrFast = BR_SCALAR(3.0); // delta world coord change for fast mouse move
const BRS krOriWeightMin = BR_SCALAR(0.1); // orientation weighting for slow mouse move
const BRS krAngleMin = BR_SCALAR(0.1); // Min angle impacting amount of forward movement on placement
const BRS krAngleMinRcp = BR_RCP(krAngleMin);
const BRS krAngleMax = BR_SCALAR(0.4); // Max angle impacting amount of forward movement on placement
const BRS krScaleMinFactor = (BR_SCALAR(0.1)); // Min scaling between Brender update
const krScaleMaxFactor = BrsDiv(rOne, krScaleMinFactor); // Max scaling between Brender update
const krScaleMin = (BR_SCALAR(0.25)); // Min scaling
const krScaleMax = (BR_SCALAR(10.0)); // Max scaling
const krPullMin = krScaleMin;
const krPullMax = BrsDiv(rOne, krPullMin);
#define aridNil ivNil
// Angle valid flags
enum
{
fbraRotateX = factnRotateX,
fbraRotateY = factnRotateY,
fbraRotateZ = factnRotateZ
};
// Normalize flags
enum
{
fnormSize = 1,
fnormRotate = 2
};
// Mouse Actor flags
enum
{
fmafNil = 0,
fmafFreeze = 0x01, // freeze cels
fmafGround = 0x02, // respect ground level
fmafOrient = 0x04, // orient actor during move
fmafEntireScene = 0x08, // position over entire scene, vs subroute only
fmafEntireSubrte = 0x10 // position over entire subroute
};
struct RTEL // RouTE Location - a function of space and time
{
int irpt; // The preceding node for the given point
BRS dwrOffset; // Absolute linear distance beyond node irpt
long dnfrm; // Delta frame number (ie, time) at this point
bool operator==(RTEL &rtel)
{ return (irpt == rtel.irpt &&
dwrOffset == rtel.dwrOffset &&
dnfrm == rtel.dnfrm); }
bool operator!=(RTEL &rtel)
{ return (irpt != rtel.irpt ||
dwrOffset != rtel.dwrOffset ||
dnfrm != rtel.dnfrm); }
bool operator<=(RTEL &rtel)
{ return (irpt < rtel.irpt ||
(irpt == rtel.irpt && (dwrOffset < rtel.dwrOffset ||
(dwrOffset == rtel.dwrOffset && dnfrm <= rtel.dnfrm)))); }
bool operator>=(RTEL &rtel)
{ return (irpt > rtel.irpt ||
(irpt == rtel.irpt && (dwrOffset > rtel.dwrOffset ||
(dwrOffset == rtel.dwrOffset && dnfrm >= rtel.dnfrm)))); }
bool operator<(RTEL &rtel)
{ return (irpt < rtel.irpt ||
(irpt == rtel.irpt && (dwrOffset < rtel.dwrOffset ||
(dwrOffset == rtel.dwrOffset && dnfrm < rtel.dnfrm)))); }
bool operator>(RTEL &rtel)
{ return (irpt > rtel.irpt ||
(irpt == rtel.irpt && (dwrOffset > rtel.dwrOffset ||
(dwrOffset == rtel.dwrOffset && dnfrm > rtel.dnfrm)))); }
};
// Actor EVents are stored in a GG (general group)
// Fixed part of the GG:
struct AEV
{
long aet; //Actor Event Type
long nfrm; //Absolute frame number (* Only valid < current event)
RTEL rtel; //RouTE Location for this event
}; //Additional event parameters (in the GG)
typedef AEV *PAEV;
//
// Actor level Event Types which live in a GG.
// The fixed part of a GG entry is an actor event (aev)
// The variable part is documented in the following comments
//
enum AET
{
aetAdd, // Add Actor onstage: aevadd - internal (no api)
aetActn, // Animate Actor : aevactn
aetCost, // Set Costume : aevcost
aetRotF, // Transform Actor rotate: BMAT34
aetPull, // Transform Actor Pull : aevpull
aetSize, // Transform Actor size uniformly : BRS
aetSnd, // Play a sound : aevsnd
aetMove, // Translate the path at this point : XYZ
aetFreeze, // Freeze (or Un) Actor : long
aetTweak, // Path tweak : XYZ
aetStep, // Force step size (eg, float, wait) : BRS
aetRem, // Remove an actor from the stage : nil
aetRotH, // Single frame rotation : BMAT34
aetLim
};
const BOM kbomAet = 0xc0000000;
const BOM kbomAev = 0xff000000;
//
// Variable part of the Actor EVent GG:
//
struct AEVPULL // Squash/stretch
{
BRS rScaleX;
BRS rScaleY;
BRS rScaleZ;
};
const BOM kbomAevpull = 0xfc000000;
// Every subroute is normalized. The normalization translation is
// stored in the Add Event
// ** nfrmPrev valid for nfrmSub <= _nfrmCur only (optimization)
struct AEVADD
{
BRS dxr; // Translation in x for this subroute
BRS dyr; // Translation in y for this subroute
BRS dzr; // Translation in z for this subroute
BRA xa; // Single point orientation
BRA ya; // Single point orientation
BRA za; // Single point orientation
};
const BOM kbomAevadd = 0xffc00000 | kbomBmat34>>10;
struct AEVACTN
{
long anid;
long celn; // starting cel of action
};
const BOM kbomAevactn = 0xf0000000;
struct AEVCOST
{
long ibset; // body part set
long cmid; // costume ID (for custom costumes)
bool fCmtl; // vs fMtrl
TAG tag;
};
const BOM kbomAevcost = 0xfc000000 | (kbomTag >> 6);
struct AEVSND
{
bool fLoop; // loop count
bool fQueue; // queued sound
long vlm; // volume
long celn; // motion match : ivNil if not
long sty; // sound type
bool fNoSound; // no sound
CHID chid; // user sound requires chid
TAG tag;
};
const BOM kbomAevsnd = 0xfff00000 | (kbomTag >> 12);
const BOM kbomAevsize = 0xc0000000;
const BOM kbomAevfreeze = 0xc0000000;
const BOM kbomAevstep = 0xc0000000;
const BOM kbomAevmove = kbomXyz;
const BOM kbomAevtweak = kbomXyz;
const BOM kbomAevrot = kbomBmat34;
// Separate ggaev variable portion sizes
#define kcbVarAdd (size(AEVADD))
#define kcbVarActn (size(AEVACTN))
#define kcbVarCost (size(AEVCOST))
#define kcbVarRot (size(BMAT34))
#define kcbVarSize (size(BRS))
#define kcbVarPull (size(AEVPULL))
#define kcbVarSnd (size(AEVSND))
#define kcbVarFreeze (size(long))
#define kcbVarMove (size(XYZ))
#define kcbVarTweak (size(XYZ))
#define kcbVarStep (size(BRS))
#define kcbVarZero (0)
//Actor Event Flags
enum
{
faetNil = 0,
faetAdd = 1 << aetAdd,
faetActn = 1 << aetActn,
faetCost = 1 << aetCost,
faetRotF = 1 << aetRotF,
faetPull = 1 << aetPull,
faetSize = 1 << aetSize,
faetFreeze = 1 << aetFreeze,
faetTweak = 1 << aetTweak,
faetStep = 1 << aetStep,
faetRem = 1 << aetRem,
faetMove = 1 << aetMove,
faetRotH = 1 << aetRotH
};
//
// Because rotations are non-abelian, cumulative rotations are stored
// in a BMAT34. It would not be correct to multiply (xa,ya,za) values
// treating x,y,z independently.
//
// Bmat34Fwd does NOT include the path portion of the orientation.
// Bmat34Cur includes all current angular rotation - path rotation is NOT post
// applied to this.
//
// Careful: The task is complicated by the fact that users can apply single
// frame and frame forward orientations in the same frame and must not see the
// actor jump in angle when choosing between the two methods of editing.
//
struct XFRM
{
BMAT34 bmat34Fwd; // Rotation fwd : path rotation post applied to this
AEVPULL aevpull; // Stretching (pulling) constants
BRS rScaleStep; // Uniform scaling to be applied to step size
BMAT34 bmat34Cur; // <<Path independent>> Single frame & static segment rotation
BRA xaPath; // Path portion of the current frame's rotation
BRA yaPath; // Path portion of the current frame's rotation
BRA zaPath; // Path portion of the current frame's rotation
};
//
// Current action Motion Match Sounds
// Aev & Aevsnd grouped together form a gl
// Not to be saved with a movie
//
struct SMM
{
AEV aev; // event for the sound
AEVSND aevsnd;
};
//
// Default hilite colors
//
#define kiclrNormalHilite 108
#define kiclrTimeFreezeHilite 43
/***********************************************
Actor Class
***********************************************/
typedef class ACTR *PACTR;
#define ACTR_PAR BASE
#define kclsACTR 'ACTR'
class ACTR : public ACTR_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
// Components of an actor
// Note: In addition to these components, any complete actor must
// have either fLifeDirty set or _nfrmLast current.
// Note: _tagTmpl cannot be derived from _ptmpl
PGG _pggaev; //GG pointer to Actor EVent list
PGL _pglrpt; //GL pointer to actor's route
TMPL *_ptmpl; //Actor body & action list template
BODY *_pbody; //Actor's body
TAG _tagTmpl; //Note: The sid cannot be queried at save time
TAG _tagSnd; //Sound (played on entrance)
SCEN *_pscen; //Underlying scene
XYZ _dxyzFullRte; //Origin of the route
long _nfrmFirst; //klwMax -or- First frame : Set when event created
long _arid; //Unique id assigned to this actor.
ulong _grfactn; //Cached current grfactn
// Frame Dependent State Information
XYZ _dxyzRte; //_dxyzFullRte + _dxyzSubRte : Set when Add processed
XYZ _dxyzSubRte; //Subpath translation : Set when Add processed
bool _fOnStage : 1; //Versus Brender hidden. Set by Add, Rem only
bool _fFrozen : 1; //Path offset > 0 but not moving
bool _fLifeDirty : 1; //Set if _nfrmLast requires recomputation
bool _fPrerendered : 1; //Set if actor is prerendered
bool _fUseBmat34Cur : 1;//_xfrm.bmat34Cur last used in orienting actor
BRS _dwrStep; //Current step size in use
long _anidCur; //Current action in template
long _ccelCur; //Cached cel count. Retrieving this was hi profile.
long _celnCur; //Current cell
long _nfrmCur; //Current frame number : Set by FGotoFrame
long _nfrmLast; //Latest known frame for this actor.
long _iaevCur; //Current event in event list
long _iaevFrmMin; //First event in current frame
long _iaevActnCur; //Event defining current action
long _iaevAddCur; //Most recent add (useful for Compose)
RTEL _rtelCur; //Current location on route (excludes tweak info)
XYZ _xyzCur; //Last point displayed (may be tweak modified)
XFRM _xfrm; //Current transformation
PGL _pglsmm; //Current action motion match sounds
// Path Recording State Information
RTEL _rtelInsert; //Joining information
ulong _tsInsert; //Starting time of route recording
bool _fModeRecord : 1; //Record a route mode
bool _fRejoin : 1; //Rerecord is extending a subpath from the end
bool _fPathInserted : 1; //More path inserted
bool _fTimeFrozen: 1; //Is the actor frozen wrt time?
long _dnfrmGap; //Frames between subroutes
XYZ _dxyzRaw; //Raw mouse movement from previous frame
//
// Protected functions
//
ACTR(void);
bool _FInit(TAG *ptmplTag); //Constructor allocation & file I/O
void _InitXfrmRot(BMAT34 *pbmat34); //Initialize rotation only
void _InitXfrm(void); //Initialize rotation & scaling
bool _FCreateGroups(void);
void _InitState(void);
void _GetNewOrigin(BRS *pxr, BRS *pyr, BRS *pzr);
void _SetStateRewound(void);
bool _FQuickBackupToFrm(long nfrm, bool *pfQuickMethodValid);
bool _FGetRtelBack(RTEL *prtel, bool fUpdateStateVar);
bool _FDoFrm(bool fPositionBody, bool *pfPositionDirty, bool *pfSoundInFrame = pvNil);
bool _FGetStatic(long anid, bool *pfStatic);
bool _FIsDoneAevSub(long iaev, RTEL rtel);
bool _FIsAddNow(long iaev);
bool _FGetDwrPlay(BRS *pdwr); //Step size if playing
bool _FGetDwrRecord(BRS *pdwr); //Step size if recording
bool _FDoAevCur(void);
bool _FDoAevCore(long iaev);
bool _FDoAetVar(long aet, void *pvVar, long cbVar);
bool _FEnqueueSnd(long iaev);
bool _FEnqueueSmmInMsq(void);
bool _FInsertSmm(long iaev);
bool _FRemoveAevMm(long anid);
bool _FAddAevDefMm(long anid);
bool _FAddDoAev(long aetNew, long kcbNew, void *pvVar);
void _MergeAev(long iaevFirst, long iaevLast, long *piaevNew = pvNil);
bool _FFreeze(void); //insert freeze event
bool _FUnfreeze(void); //insert unfreeze event
void _Hide(void);
bool _FInsertGgRpt(long irpt, RPT *prpt, BRS dwrPrior = rZero);
bool _FAddAevFromPrev(long iaevLim, ulong grfaet);
bool _FAddAevFromLater(void);
bool _FFindNextAevAet(long aet, long iaevCur, long *piaevAdd);
bool _FFindPrevAevAet(long aet, long iaevCur, long *piaevAdd);
void _FindAevLastSub(long iaevAdd, long iaevLim, long *piaevLast);
void _DeleteFwdCore(bool fDeleteAll, bool *pfAlive = pvNil, long iaevCur = ivNil);
bool _FDeleteEntireSubrte(void);
void _DelAddFrame(long iaevAdd, long iaevLim);
void _UpdateXyzRte(void);
bool _FInsertAev(long iaev, long cbNew, void *pvVar, void *paev, bool fUpdateState = fTrue);
void _RemoveAev(long iaev, bool fUpdateState = fTrue);
void _PrepXfrmFill(long aet, void *pvVar,long cbVar,
long iaevMin, long iaevCmp = ivNil, ulong grfaet = faetNil);
void _PrepActnFill(long iaevMin, long anidPrev, long anidNew, ulong grfaet);
void _PrepCostFill(long iaevMin, AEVCOST *paevcost);
void _AdjustAevForRteIns(long irptAdjust, long iaevMin);
void _AdjustAevForRteDel(long irptAdjust, long iaevMin);
bool _FInsertStop(void);
void _CalcRteOrient(BMAT34 *pbmat34,
BRA *pxa = pvNil, BRA *pya = pvNil, BRA *pza = pvNil, ulong *pgrfbra = pvNil);
void _ApplyRotFromVec(XYZ *pxyz, BMAT34 *pbmat34,
BRA *pxa = pvNil, BRA *pya = pvNil, BRA *pza = pvNil, ulong *grfbra = pvNil);
void _SaveCurPathOrien(void);
void _LoadAddOrien(AEVADD *paevadd, bool fNoReset = fFalse);
BRA _BraAvgAngle(BRA a1, BRA a2, BRS rw);
void _UpdateXyzTan(XYZ *pxyz, long irptTan, long rw) ;
void _AdvanceRtel(BRS dwrStep, RTEL *prtel, long iaevCur,
long nfrmCur, bool *pfEndRoute);
void _GetXyzFromRtel(RTEL *prtel, PXYZ pxyz);
void _GetXyzOnLine(PXYZ pxyzFirst, PXYZ pxyzSecond, BRS dwrOffset, PXYZ pxyz);
void _PositionBody(PXYZ pxyz);
void _MatrixRotUpdate(XYZ *pxyz, BMAT34 *pbmat34);
void _TruncateSubRte(long irptDelLim);
bool _FComputeLifetime(long *pnfrmLast = pvNil);
bool _FIsStalled(long iaevFirst, RTEL *prtel, long *piaevLast = pvNil);
void _RestoreFromUndo(PACTR pactrRestore);
bool _FDupCopy(PACTR pactrSrc, PACTR pactrDest);
bool _FWriteTmpl(PCFL pcfl, CNO cno);
bool _FReadActor(PCFL pcfl, CNO cno);
bool _FReadRoute(PCFL pcfl, CNO cno);
bool _FReadEvents(PCFL pcfl, CNO cno);
static void _SwapBytesPggaev(PGG pggaev);
bool _FOpenTags(PCRF pcrf);
static bool _FIsIaevTag(PGG pggaev, long iaev, PTAG *pptag, PAEV *pqaev = pvNil);
void _CloseTags(void);
public:
~ACTR(void);
static PACTR PactrNew(TAG *ptagTmpl);
void SetPscen(SCEN *pscen);
void SetArid(long arid) { AssertBaseThis(0); _arid = arid; }
void SetLifeDirty(void) { AssertBaseThis(0); _fLifeDirty = fTrue; }
PSCEN Pscen(void) { AssertThis(0); return _pscen; }
// ActrSave Routines
static PACTR PactrRead(PCRF pcrf, CNO cno); //Construct from a document
bool FWrite(PCFL pcfl, CNO cno, CNO cnoScene); //Write to a document
static PGL PgltagFetch(PCFL pcfl, CNO cno, bool *pfError);
static bool FAdjustAridOnFile(PCFL pcfl, CNO cno, long darid);
// Visibility
void Hilite(void);
void Unhilite(void) { AssertBaseThis(0); _pbody->Unhilite(); }
void Hide(void) { AssertBaseThis(0); _pbody->Hide(); }
void Show(void) { AssertBaseThis(0); _pbody->Show(); }
bool FIsInView(void) { AssertBaseThis(0); return _pbody->FIsInView(); }
void GetCenter(long *pxp, long *pyp) { AssertBaseThis(0); _pbody->GetCenter(pxp, pyp); }
void GetRcBounds(RC *prc) { AssertBaseThis(0); _pbody->GetRcBounds(prc); }
void SetPrerendered(bool fPrerendered) { AssertBaseThis(0); _fPrerendered = fPrerendered; }
bool FPrerendered(void) { AssertBaseThis(0); return _fPrerendered; }
// Actor Information
long Arid(void) { AssertBaseThis(0); return (_arid); }
bool FOnStage(void) { AssertBaseThis(0); return (_fOnStage); }
bool FIsMyBody(BODY *pbody) { AssertBaseThis(0); return pbody == _pbody;}
bool FIsMyTmpl(TMPL *ptmpl) { AssertBaseThis(0); return _ptmpl == ptmpl; }
bool FIsModeRecord(void) { AssertBaseThis(0); return FPure(_fModeRecord); }
bool FIsRecordValid(BRS dxr, BRS dyr, BRS dzr, ulong tsCurrent);
PTMPL Ptmpl(void) {AssertBaseThis(0); return _ptmpl; }
PBODY Pbody(void) { AssertBaseThis(0); return _pbody; }
long AnidCur(void) { AssertBaseThis(0); return _anidCur; }
long CelnCur(void) { AssertBaseThis(0); return _celnCur; }
bool FFrozen(void) { AssertBaseThis(0); return _fFrozen; }
bool FGetLifetime(long *pnfrmFirst, long *pnfrmLast); //allows nil ptrs
bool FPtIn(long xp, long yp, long *pibset);
void GetTagTmpl(PTAG ptag) { AssertBaseThis(0); *ptag = _tagTmpl; }
void GetName(PSTN pstn);
bool FChangeTagTmpl(PTAG ptagTmplNew);
bool FTimeFrozen(void) { AssertBaseThis(0); return _fTimeFrozen; }
void SetTimeFreeze(bool fTimeFrozen) { AssertBaseThis(0); _fTimeFrozen = fTimeFrozen; }
bool FIsPropBrws(void) { AssertThis(0); return FPure(_ptmpl->FIsProp() || _ptmpl->FIsTdt()); }
bool FIsTdt(void) { AssertThis(0); return FPure(_ptmpl->FIsTdt()); }
bool FMustRender(long nfrmRenderLast);
void GetXyzWorld(BRS *pxr, BRS *pyr, BRS *pzr);
// Animation
bool FGotoFrame(long nfrm, bool *pfSoundInFrame = pvNil); //Prepare for display at frame nfrm
bool FReplayFrame(long grfscen); //Replay a frame.
// Event Editing
bool FAddOnStageCore(void);
bool FSetActionCore(long anid, long celn, bool fFreeze);
bool FRemFromStageCore(void);
bool FSetCostumeCore(long ibsetClicked, TAG *ptag, long cmid, bool fCustom);
bool FSetStep(BRS dwrStep);
bool FRotate(BRA xa, BRA ya, BRA za, bool fFromHereFwd);
bool FNormalizeCore(ulong grfnorm);
void SetAddOrient(BRA xa, BRA ya, BRA za, ulong grfbra, XYZ *pdxyz = pvNil);
bool FScale(BRS rScaleStep);
bool FPull(BRS rScaleX, BRS rScaleY, BRS rScaleZ);
void DeleteFwdCore(bool fDeleteAll, bool *pfAlive = pvNil, long iaevCur = ivNil);
void DeleteBackCore(bool *pfAlive = pvNil);
bool FSoonerLater(long dnfrm);
// ActrEdit Routines
bool FDup(PACTR *ppactr, bool fReset = fFalse); //Duplicate everything
void Restore(PACTR pactr);
bool FCreateUndo(PACTR pactr, bool fSndUndo = fFalse, PSTN pstn = pvNil); //Create undo object
void Reset(void);
bool FAddOnStage(void); //add actor to the stage, w/Undo
bool FSetAction(long anid, long celn, bool fFreeze, PACTR *ppactrDup = pvNil);
bool FSetCostume(long ibset, TAG *ptag, long cmid, bool fCustom);
bool FRemFromStage(void); //add event: rem actor from stage, w/Undo
bool FCopy(PACTR *ppactr, bool fEntireScene = fFalse); //Duplicate actor from this frame on
bool FCopyRte(PACTR *ppactr, bool fEntireScene = fFalse); //Duplicate path from this frame on
bool FPasteRte(PACTR pactr); //Paste from clipboard from this frame on
bool FNormalize(ulong grfnorm);
bool FPaste(long nfrm, SCEN *pscen);
bool FDelete(bool *pfAlive, bool fDeleteAll);
// ActrSnd Routines
bool FSetSnd(PTAG ptag, bool fLoop, bool fQueue, bool fActnCel, long vlm, long sty);
bool FSetSndCore(PTAG ptag, bool fLoop, bool fQueue, bool fActnCel, long vlm, long sty);
bool FSetVlmSnd(long sty, bool fMotionMatch, long vlm); // Set the volume of a sound
bool FQuerySnd(long sty, bool fMotionMatch, PGL *pglTagSnd, long *pvlm,
bool *pfLoop);
bool FDeleteSndCore(long sty, bool fMotionMatch);
bool FSoundInFrm(void);
bool FResolveAllSndTags(CNO cnoScen);
// Route Definition
void SetTsInsert(ulong tsCurrent) { AssertBaseThis(0); _tsInsert = tsCurrent; }
bool FBeginRecord(ulong tsCurrent, bool fReplace, PACTR pactrRestore);
bool FRecordMove(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf,
ulong tsCurrent, bool *pfLonger, bool *pfStep, PACTR pactrRestore);
bool FEndRecord(bool fReplace, PACTR pactrRestore);
bool FTweakRoute(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf = fmafNil);
bool FMoveRoute(BRS dxr, BRS dyr, BRS dzr, bool *pfMoved = pvNil,
ulong grfmaf = fmafNil);
};
//
// Actor document for clipping
//
typedef class ACLP *PACLP;
#define ACLP_PAR DOCB
#define kclsACLP 'ACLP'
class ACLP : public ACLP_PAR
{
RTCLASS_DEC
MARKMEM
ASSERT
protected:
PACTR _pactr;
bool _fRteOnly;
STN _stnName;
ACLP(void) {}
public:
//
// Constructors and destructors
//
static PACLP PaclpNew(PACTR pactr, bool fRteOnly, bool fEndScene = fFalse);
~ACLP(void);
//
// Pasting function
//
bool FPaste(PMVIE pmvie);
bool FRouteOnly(void) { return _fRteOnly; }
};
#endif //!ACTOR_H