Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
306 lines
9.9 KiB
C++
306 lines
9.9 KiB
C++
#ifndef __EXPCTRL__H
|
|
#define __EXPCTRL__H
|
|
|
|
#include "ctrl.h"
|
|
#include "units.h"
|
|
#include "exprlib.h"
|
|
|
|
#define EXPR_POS_CONTROL_CNAME GetString(IDS_DB_POSITION_EXPR)
|
|
#define EXPR_P3_CONTROL_CNAME GetString(IDS_DB_POINT3_EXPR)
|
|
#define EXPR_FLOAT_CONTROL_CNAME GetString(IDS_DB_FLOAT_EXPR)
|
|
#define EXPR_SCALE_CONTROL_CNAME GetString(IDS_DB_SCALE_EXPR)
|
|
#define EXPR_ROT_CONTROL_CNAME GetString(IDS_DB_ROTATION_EXPR)
|
|
|
|
#define EXPR_TICKS 0
|
|
#define EXPR_SECS 1
|
|
#define EXPR_FRAMES 2
|
|
#define EXPR_NTIME 3
|
|
|
|
class ExprControl;
|
|
|
|
// for the debug floater window
|
|
class ExprDebug : public TimeChangeCallback {
|
|
public:
|
|
HWND hWnd;
|
|
ExprControl *ec;
|
|
TimeValue t;
|
|
static int winX, winY;
|
|
|
|
ExprDebug(HWND hParent, ExprControl *exprControl);
|
|
~ExprDebug();
|
|
|
|
void Invalidate();
|
|
void SetTime(TimeValue tm) { t = tm; }
|
|
void Update();
|
|
void Init(HWND hWnd);
|
|
|
|
void TimeChanged(TimeValue t) { SetTime(t); Update(); }
|
|
};
|
|
|
|
// scalar variables
|
|
class SVar {
|
|
public:
|
|
TSTR name;
|
|
int regNum; // register number variable is assigned to
|
|
int refID; // < 0 means constant
|
|
float val; // value, if constant
|
|
int subNum;
|
|
int offset; // tick offset
|
|
};
|
|
|
|
class VVar {
|
|
public:
|
|
TSTR name;
|
|
int regNum; // reg num this var is assigned to
|
|
int refID; // < 0 means constant
|
|
Point3 val; // value, if const
|
|
int subNum;
|
|
int offset; // tick offset
|
|
};
|
|
|
|
MakeTab(SVar);
|
|
MakeTab(VVar);
|
|
|
|
class VarRef {
|
|
public:
|
|
VarRef() { client = NULL; refCt = 0; }
|
|
VarRef(ReferenceTarget *c) { client = c; refCt = 1; }
|
|
ReferenceTarget *client;
|
|
int refCt;
|
|
};
|
|
|
|
MakeTab(VarRef);
|
|
|
|
class ExprControl : public StdControl
|
|
{
|
|
public:
|
|
int type;
|
|
Expr expr;
|
|
int timeSlots[4];
|
|
int sRegCt;
|
|
int vRegCt;
|
|
int curIndex;
|
|
Point3 curPosVal;
|
|
float curFloatVal;
|
|
Interval ivalid;
|
|
Interval range;
|
|
HWND hParams;
|
|
IObjParam * ip;
|
|
SVarTab sVars;
|
|
VVarTab vVars;
|
|
VarRefTab refTab;
|
|
TSTR desc;
|
|
HFONT hFixedFont;
|
|
HWND hDlg;
|
|
ExprDebug *edbg;
|
|
static int winX, winY;
|
|
|
|
void updRegCt(int val, int type);
|
|
BOOL dfnVar(int type, TCHAR *buf, int slot, int offset);
|
|
int getVarCount(int type) { return type == SCALAR_VAR ? sVars.Count() : vVars.Count(); }
|
|
TCHAR * getVarName(int type, int i);
|
|
int getVarOffset(int type, int i);
|
|
int getRegNum(int type, int i);
|
|
float getScalarValue(int i);
|
|
Point3 getVectorValue(int i);
|
|
BOOL assignScalarValue(int i, float val);
|
|
BOOL assignVectorValue(int i, Point3 &val);
|
|
BOOL assignController(int type, int i, ReferenceTarget *client, int subNum);
|
|
void deleteAllVars();
|
|
|
|
ExprControl(int type, ExprControl &ctrl);
|
|
ExprControl(int type, BOOL loading);
|
|
~ExprControl();
|
|
|
|
// Animatable methods
|
|
int TrackParamsType() { return TRACKPARAMS_WHOLE; }
|
|
|
|
void DeleteThis() { delete this; }
|
|
int IsKeyable() { return 0; }
|
|
BOOL IsAnimated() {return TRUE;}
|
|
Interval GetTimeRange(DWORD flags) { return range; }
|
|
void EditTimeRange(Interval range,DWORD flags);
|
|
void Hold();
|
|
void MapKeys( TimeMap *map, DWORD flags );
|
|
|
|
void BeginEditParams( IObjParam *ip, ULONG flags,Animatable *prev );
|
|
void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next );
|
|
|
|
void EditTrackParams(
|
|
TimeValue t, // The horizontal position of where the user right clicked.
|
|
ParamDimensionBase *dim,
|
|
TCHAR *pname,
|
|
HWND hParent,
|
|
IObjParam *ip,
|
|
DWORD flags);
|
|
|
|
// Reference methods
|
|
int NumRefs() { return StdControl::NumRefs() + refTab.Count(); }
|
|
ReferenceTarget* GetReference(int i);
|
|
void SetReference(int i, RefTargetHandle rtarg);
|
|
RefResult NotifyRefChanged(Interval, RefTargetHandle, PartID&, RefMessage);
|
|
void RefDeleted();
|
|
|
|
IOResult Save(ISave *isave);
|
|
IOResult Load(ILoad *iload);
|
|
|
|
// Control methods
|
|
void Copy(Control *from);
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) {
|
|
ExprControl *ctrl = new ExprControl(this->type, *this);
|
|
CloneControl(ctrl,remap);
|
|
return ctrl;
|
|
}
|
|
BOOL IsLeaf() { return TRUE; }
|
|
void GetValueLocalTime(TimeValue t, void *val, Interval &valid, GetSetMethod method=CTRL_ABSOLUTE);
|
|
void SetValueLocalTime(TimeValue t, void *val, int commit, GetSetMethod method) {}
|
|
void Extrapolate(Interval range,TimeValue t,void *val,Interval &valid,int type);
|
|
void *CreateTempValue();
|
|
void DeleteTempValue(void *val);
|
|
void ApplyValue(void *val, void *delta);
|
|
void MultiplyValue(void *val, float m);
|
|
|
|
void GetAbsoluteControlValue(INode *node,TimeValue t,Point3 *pt,Interval &iv);
|
|
};
|
|
|
|
|
|
class ExprPosControl : public ExprControl
|
|
{
|
|
public:
|
|
ExprPosControl(ExprPosControl &ctrl) : ExprControl(EXPR_POS_CONTROL_CLASS_ID, ctrl) {}
|
|
ExprPosControl(BOOL loading=FALSE) : ExprControl(EXPR_POS_CONTROL_CLASS_ID, loading) {}
|
|
~ExprPosControl() {}
|
|
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) { return(new ExprPosControl(*this)); }
|
|
void GetClassName(TSTR& s) { s = EXPR_POS_CONTROL_CNAME; }
|
|
Class_ID ClassID() { return Class_ID(EXPR_POS_CONTROL_CLASS_ID,0); }
|
|
SClass_ID SuperClassID() { return CTRL_POSITION_CLASS_ID; }
|
|
};
|
|
|
|
class ExprP3Control : public ExprControl
|
|
{
|
|
public:
|
|
ExprP3Control(ExprP3Control &ctrl) : ExprControl(EXPR_P3_CONTROL_CLASS_ID, ctrl) {}
|
|
ExprP3Control(BOOL loading=FALSE) : ExprControl(EXPR_P3_CONTROL_CLASS_ID, loading) {}
|
|
~ExprP3Control() {}
|
|
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) { return(new ExprP3Control(*this)); }
|
|
void GetClassName(TSTR& s) { s = EXPR_P3_CONTROL_CNAME; }
|
|
Class_ID ClassID() { return Class_ID(EXPR_P3_CONTROL_CLASS_ID,0); }
|
|
SClass_ID SuperClassID() { return CTRL_POINT3_CLASS_ID; }
|
|
};
|
|
|
|
class ExprFloatControl : public ExprControl
|
|
{
|
|
public:
|
|
ExprFloatControl(ExprFloatControl &ctrl) : ExprControl(EXPR_FLOAT_CONTROL_CLASS_ID, ctrl) {}
|
|
ExprFloatControl(BOOL loading=FALSE) : ExprControl(EXPR_FLOAT_CONTROL_CLASS_ID, loading) {}
|
|
~ExprFloatControl() {}
|
|
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) { return(new ExprFloatControl(*this)); }
|
|
void GetClassName(TSTR& s) { s = EXPR_FLOAT_CONTROL_CNAME; }
|
|
Class_ID ClassID() { return Class_ID(EXPR_FLOAT_CONTROL_CLASS_ID,0); }
|
|
SClass_ID SuperClassID() { return CTRL_FLOAT_CLASS_ID; }
|
|
};
|
|
|
|
class ExprScaleControl : public ExprControl
|
|
{
|
|
public:
|
|
ExprScaleControl(ExprScaleControl &ctrl) : ExprControl(EXPR_SCALE_CONTROL_CLASS_ID, ctrl) {}
|
|
ExprScaleControl(BOOL loading=FALSE) : ExprControl(EXPR_SCALE_CONTROL_CLASS_ID, loading) {}
|
|
~ExprScaleControl() {}
|
|
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) { return(new ExprScaleControl(*this)); }
|
|
void GetClassName(TSTR& s) { s = EXPR_SCALE_CONTROL_CNAME; }
|
|
Class_ID ClassID() { return Class_ID(EXPR_SCALE_CONTROL_CLASS_ID,0); }
|
|
SClass_ID SuperClassID() { return CTRL_SCALE_CLASS_ID; }
|
|
};
|
|
|
|
class ExprRotControl : public ExprControl
|
|
{
|
|
public:
|
|
ExprRotControl(ExprRotControl &ctrl) : ExprControl(EXPR_ROT_CONTROL_CLASS_ID, ctrl) {}
|
|
ExprRotControl(BOOL loading=FALSE) : ExprControl(EXPR_ROT_CONTROL_CLASS_ID, loading) {}
|
|
~ExprRotControl() {}
|
|
|
|
RefTargetHandle Clone(RemapDir& remap=NoRemap()) { return(new ExprRotControl(*this)); }
|
|
void GetClassName(TSTR& s) { s = EXPR_ROT_CONTROL_CNAME; }
|
|
Class_ID ClassID() { return Class_ID(EXPR_ROT_CONTROL_CLASS_ID,0); }
|
|
SClass_ID SuperClassID() { return CTRL_ROTATION_CLASS_ID; }
|
|
};
|
|
|
|
//********************************************************
|
|
// EXPRESSION CONTROL
|
|
//********************************************************
|
|
static Class_ID exprPosControlClassID(EXPR_POS_CONTROL_CLASS_ID,0);
|
|
class ExprPosClassDesc:public ClassDesc
|
|
{
|
|
public:
|
|
int IsPublic() { return 1; }
|
|
void * Create(BOOL loading) { return new ExprPosControl(loading); }
|
|
const TCHAR * ClassName() { return EXPR_POS_CONTROL_CNAME; }
|
|
SClass_ID SuperClassID() { return CTRL_POSITION_CLASS_ID; }
|
|
Class_ID ClassID() { return exprPosControlClassID; }
|
|
const TCHAR* Category() { return _T(""); }
|
|
};
|
|
static ExprPosClassDesc exprPosCD;
|
|
ClassDesc* GetExprPosCtrlDesc();
|
|
|
|
static Class_ID exprP3ControlClassID(EXPR_P3_CONTROL_CLASS_ID,0);
|
|
class ExprP3ClassDesc:public ClassDesc
|
|
{
|
|
public:
|
|
int IsPublic() { return 1; }
|
|
void * Create(BOOL loading) { return new ExprP3Control(loading); }
|
|
const TCHAR * ClassName() { return EXPR_P3_CONTROL_CNAME; }
|
|
SClass_ID SuperClassID() { return CTRL_POINT3_CLASS_ID; }
|
|
Class_ID ClassID() { return exprP3ControlClassID; }
|
|
const TCHAR* Category() { return _T(""); }
|
|
};
|
|
static ExprP3ClassDesc exprP3CD;
|
|
ClassDesc* GetExprP3CtrlDesc();
|
|
|
|
static Class_ID exprFloatControlClassID(EXPR_FLOAT_CONTROL_CLASS_ID,0);
|
|
class ExprFloatClassDesc:public ClassDesc
|
|
{
|
|
public:
|
|
int IsPublic() { return 1; }
|
|
void * Create(BOOL loading) { return new ExprFloatControl(loading); }
|
|
const TCHAR * ClassName() { return EXPR_FLOAT_CONTROL_CNAME; }
|
|
SClass_ID SuperClassID() { return CTRL_FLOAT_CLASS_ID; }
|
|
Class_ID ClassID() { return exprFloatControlClassID; }
|
|
const TCHAR* Category() { return _T(""); }
|
|
};
|
|
static ExprFloatClassDesc exprFloatCD;
|
|
ClassDesc* GetExprFloatCtrlDesc();
|
|
|
|
static Class_ID exprScaleControlClassID(EXPR_SCALE_CONTROL_CLASS_ID,0);
|
|
class ExprScaleClassDesc:public ClassDesc
|
|
{
|
|
public:
|
|
int IsPublic() { return 1; }
|
|
void * Create(BOOL loading) { return new ExprScaleControl(loading); }
|
|
const TCHAR * ClassName() { return EXPR_SCALE_CONTROL_CNAME; }
|
|
SClass_ID SuperClassID() { return CTRL_SCALE_CLASS_ID; }
|
|
Class_ID ClassID() { return exprScaleControlClassID; }
|
|
const TCHAR* Category() { return _T(""); }
|
|
};
|
|
static ExprScaleClassDesc exprScaleCD;
|
|
ClassDesc* GetExprScaleCtrlDesc();
|
|
|
|
static Class_ID exprRotControlClassID(EXPR_ROT_CONTROL_CLASS_ID,0);
|
|
class ExprRotClassDesc:public ClassDesc
|
|
{
|
|
public:
|
|
int IsPublic() { return 1; }
|
|
void * Create(BOOL loading) { return new ExprRotControl(loading); }
|
|
const TCHAR * ClassName() { return EXPR_ROT_CONTROL_CNAME; }
|
|
SClass_ID SuperClassID() { return CTRL_ROTATION_CLASS_ID; }
|
|
Class_ID ClassID() { return exprRotControlClassID; }
|
|
const TCHAR* Category() { return _T(""); }
|
|
};
|
|
static ExprFloatClassDesc exprRotCD;
|
|
ClassDesc* GetExprRotCtrlDesc();
|
|
|
|
|
|
#endif |