📄 control.h
字号:
/**********************************************************************
*<
FILE: control.h
DESCRIPTION: Control definitions
CREATED BY: Dan Silva and Rolf Berteig
HISTORY: created 9 September 1994
*> Copyright (c) 1994, All Rights Reserved.
**********************************************************************/
#ifndef __CONTROL__
#define __CONTROL__
#include "plugapi.h"
extern CoreExport void ApplyScaling(Matrix3 &m, const ScaleValue &v);
extern CoreExport void InitControlLists();
class ScaleValue;
class ViewExp;
class INode;
class XFormModes;
class INodeTab;
class View;
CoreExport ScaleValue operator+(const ScaleValue& s0, const ScaleValue& s1);
CoreExport ScaleValue operator-(const ScaleValue& s0, const ScaleValue& s1);
CoreExport ScaleValue operator*(const ScaleValue& s, float f);
CoreExport ScaleValue operator*(float f, const ScaleValue& s);
CoreExport ScaleValue operator+(const ScaleValue& s, float f);
CoreExport ScaleValue operator+(float f, const ScaleValue& s);
class ScaleValue {
public:
Point3 s;
Quat q;
ScaleValue() {}
ScaleValue(const Point3& as) { s = as; q = IdentQuat(); }
ScaleValue(const Point3& as, const Quat& aq) {s = as; q = aq;}
ScaleValue& operator+=(const ScaleValue& s) {(*this)=(*this)+s;return (*this);}
ScaleValue& operator*=(const float s) {(*this)=(*this)*s;return (*this);}
ScaleValue& operator=(const ScaleValue &v) {s=v.s;q=v.q;return (*this);}
float& operator[](int el) {return s[el];}
};
// Types of ORTs
#define ORT_BEFORE 1
#define ORT_AFTER 2
// ORTs
#define ORT_CONSTANT 1
#define ORT_CYCLE 2
#define ORT_LOOP 3 // This is cycle with continuity.
#define ORT_OSCILLATE 4
#define ORT_LINEAR 5
#define ORT_IDENTITY 6
#define ORT_RELATIVE_REPEAT 7
/*---------------------------------------------------------------------*/
// A list of ease curves.
class EaseCurveList : public ReferenceTarget {
friend class AddEaseRestore;
friend class DeleteEaseRestore;
private:
Tab<Control*> eases;
public:
EaseCurveList() {OpenTreeEntry(1,ALL_TRACK_VIEWS);}
CoreExport ~EaseCurveList();
CoreExport TimeValue ApplyEase(TimeValue t,Interval &valid);
CoreExport void AppendEaseCurve(Control *cont);
CoreExport void DeleteEaseCurve(int i);
CoreExport void DisableEaseCurve(int i);
CoreExport void EnableEaseCurve(int i);
CoreExport BOOL IsEaseEnabled(int i);
int NumEaseCurves() {return eases.Count();}
// Animatable
void GetClassName(TSTR& s) { s= TSTR(_T("EaseCurve")); }
Class_ID ClassID() { return Class_ID(EASE_LIST_CLASS_ID,0); }
SClass_ID SuperClassID() { return EASE_LIST_CLASS_ID; }
CoreExport int NumSubs();
CoreExport Animatable* SubAnim(int i);
CoreExport TSTR SubAnimName(int i);
int SubNumToRefNum(int subNum) {return subNum;}
BOOL BypassTreeView() { return TRUE; }
void DeleteThis() { delete this; }
ParamDimension* GetParamDimension(int i) {return stdTimeDim;}
CoreExport BOOL AssignController(Animatable *control,int subAnim);
CoreExport void* GetInterface(ULONG id);
CoreExport IOResult Save(ISave *isave);
CoreExport IOResult Load(ILoad *iload);
// Reference
CoreExport int NumRefs();
CoreExport RefTargetHandle GetReference(int i);
CoreExport void SetReference(int i, RefTargetHandle rtarg);
CoreExport RefTargetHandle Clone(RemapDir &remap = NoRemap());
CoreExport RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget,
PartID& partID, RefMessage message);
};
class EaseCurveAnimProp : public AnimProperty {
public:
EaseCurveList *el;
EaseCurveAnimProp() { el=NULL; }
DWORD ID() {return PROPID_EASELIST;}
};
#define GetEaseListInterface(anim) ((EaseCurveList*)anim->GetInterface(I_EASELIST))
/*---------------------------------------------------------------------*/
// A list of multiplier curves.
class MultCurveList : public ReferenceTarget {
friend class AddMultRestore;
friend class DeleteMultRestore;
private:
Tab<Control*> mults;
public:
MultCurveList() {OpenTreeEntry(1,ALL_TRACK_VIEWS);}
CoreExport ~MultCurveList();
CoreExport float GetMultVal(TimeValue t,Interval &valid);
CoreExport void AppendMultCurve(Control *cont);
CoreExport void DeleteMultCurve(int i);
CoreExport void DisableMultCurve(int i);
CoreExport void EnableMultCurve(int i);
CoreExport BOOL IsMultEnabled(int i);
int NumMultCurves() {return mults.Count();}
// Animatable
void GetClassName(TSTR& s) { s= TSTR(_T("MultCurve")); }
Class_ID ClassID() { return Class_ID(MULT_LIST_CLASS_ID,0); }
SClass_ID SuperClassID() { return MULT_LIST_CLASS_ID; }
CoreExport int NumSubs();
CoreExport Animatable* SubAnim(int i);
CoreExport TSTR SubAnimName(int i);
int SubNumToRefNum(int subNum) {return subNum;}
BOOL BypassTreeView() { return TRUE; }
void DeleteThis() { delete this; }
ParamDimension* GetParamDimension(int i) {return stdNormalizedDim;}
CoreExport BOOL AssignController(Animatable *control,int subAnim);
CoreExport void* GetInterface(ULONG id);
CoreExport IOResult Save(ISave *isave);
CoreExport IOResult Load(ILoad *iload);
// Reference
CoreExport int NumRefs();
CoreExport RefTargetHandle GetReference(int i);
CoreExport void SetReference(int i, RefTargetHandle rtarg);
CoreExport RefTargetHandle Clone(RemapDir &remap = NoRemap());
CoreExport RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget,
PartID& partID, RefMessage message);
};
class MultCurveAnimProp : public AnimProperty {
public:
MultCurveList *ml;
MultCurveAnimProp() { ml=NULL; }
DWORD ID() {return PROPID_MULTLIST;}
};
#define GetMultListInterface(anim) ((MultCurveList*)anim->GetInterface(I_MULTLIST))
/*---------------------------------------------------------------------*/
//
// For hit testing controller apparatus
//
class CtrlHitRecord {
friend class CtrlHitLog;
CtrlHitRecord *next;
public:
INode *nodeRef;
DWORD distance;
ulong hitInfo;
DWORD infoExtra;
CtrlHitRecord() {next=NULL; distance=0; hitInfo=0; nodeRef=NULL;}
CtrlHitRecord(CtrlHitRecord *nxt,INode *nr, DWORD d, ulong inf, DWORD extra) {
next=nxt;nodeRef=nr;distance=d;hitInfo=inf;infoExtra=extra;}
CtrlHitRecord *Next() {return next;}
};
class CtrlHitLog {
CtrlHitRecord *first;
int hitIndex;
public:
CtrlHitLog() { first = NULL; }
~CtrlHitLog() { Clear(); }
CoreExport void Clear();
CoreExport void ClearHitIndex() { hitIndex = 0; }
CoreExport void IncrHitIndex() { hitIndex++; }
CtrlHitRecord* First() { return first; }
CoreExport CtrlHitRecord* ClosestHit();
void LogHit(INode *nr,DWORD dist,ulong info,DWORD infoExtra)
{first = new CtrlHitRecord(first,nr,dist,info,infoExtra);}
};
// For enumerating IK paramaters
class IKEnumCallback {
public:
virtual void proc(Control *c, int index)=0;
};
class IKDeriv {
public:
virtual int NumEndEffectors()=0;
virtual Point3 EndEffectorPos(int index)=0;
virtual void DP(Point3 dp,int index)=0;
virtual void DR(Point3 dr,int index)=0;
virtual void NextDOF()=0;
};
// Flags passed to CompDerivs
#define POSITION_DERIV (1<<0)
#define ROTATION_DERIV (1<<1)
// This class is used to store IK parameters that have been
// copied to a clipboard.
class IKClipObject {
public:
// Identifies the creator of the clip object
virtual SClass_ID SuperClassID()=0;
virtual Class_ID ClassID()=0;
virtual void DeleteThis()=0;
};
// Values for 'which' pasted to Copy/PasteIKParams
#define COPYPASTE_IKPOS 1
#define COPYPASTE_IKROT 2
// Passed to InitIKJoints() which is called when importing
// R4 3DS files that have IK joint data.
class InitJointData {
public:
BOOL active[3];
BOOL limit[3];
BOOL ease[3];
Point3 min, max, damping;
};
// This structure is passed to GetDOFParams().
// Controllers that support IK can provide info about their DOFs
// so that bones can display this information.
// The first 3 DOFs are assumed to be position
// and the next 3 are assumed to be rotation
class DOFParams {
public:
BOOL display[6]; // Should this DOF be displayed?
Point3 axis[6]; // DOF axis
Point3 pos[6]; // Base of axis
BOOL limit[6]; // is joint limited?
float min[6]; // min limit
float max[6]; // max limit
float curval[6]; // Current value of the parameter
BOOL sel[6]; // should DOF be highlighted
BOOL endEffector; // is there an end effector for this controller
Matrix3 eeTM; // world TM of the end effector if present
};
// These two ways values can be retreived or set.
// For get:
// RELATIVE = Apply
// ABSOLUTE = Just get the value
// For set:
// RELATIVE = Add the value to the existing value (i.e Move/Rotate/Scale)
// ABSOLUTE = Just set the value
enum GetSetMethod {CTRL_RELATIVE,CTRL_ABSOLUTE};
// Control class provides default implementations for load and save which save the ORT type in these chunks:
#define CONTROLBASE_CHUNK 0x8499
#define INORT_CHUNK 0x3000
#define OUTORT_CHUNK 0x3001
#define CONT_DISABLED_CHUNK 0x3002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -