mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-20 04:34:48 +00:00
virtuals removed and replaced with override where necessary on the rest of the code base, clang-tidy to the rescue.
678 lines
23 KiB
C++
678 lines
23 KiB
C++
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames
|
|
// Copyright (C) 2015 Faust Logic, Inc.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
|
|
#ifndef _AFX_CONSTRAINT_H_
|
|
#define _AFX_CONSTRAINT_H_
|
|
|
|
#include "core/util/tVector.h"
|
|
#include "T3D/shapeBase.h"
|
|
|
|
#include "afxEffectDefs.h"
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxConstraintDef
|
|
|
|
class afxEffectBaseData;
|
|
|
|
struct afxConstraintDef : public afxEffectDefs
|
|
{
|
|
enum DefType
|
|
{
|
|
CONS_UNDEFINED,
|
|
CONS_PREDEFINED,
|
|
CONS_SCENE,
|
|
CONS_EFFECT,
|
|
CONS_GHOST
|
|
};
|
|
|
|
DefType mDef_type;
|
|
|
|
StringTableEntry mCons_src_name;
|
|
StringTableEntry mCons_node_name;
|
|
F32 mHistory_time;
|
|
U8 mSample_rate;
|
|
|
|
bool mRuns_on_server;
|
|
bool mRuns_on_client;
|
|
bool mPos_at_box_center;
|
|
bool mTreat_as_camera;
|
|
|
|
/*C*/ afxConstraintDef();
|
|
|
|
bool isDefined();
|
|
|
|
bool isArbitraryObject();
|
|
void reset();
|
|
bool parseSpec(const char* spec, bool runs_on_server, bool runs_on_client);
|
|
|
|
static void gather_cons_defs(Vector<afxConstraintDef>& defs, Vector<afxEffectBaseData*>& fx);
|
|
|
|
static StringTableEntry SCENE_CONS_KEY;
|
|
static StringTableEntry EFFECT_CONS_KEY;
|
|
static StringTableEntry GHOST_CONS_KEY;
|
|
};
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxConstraint
|
|
// Abstract base-class for a simple constraint mechanism used to constrain
|
|
// special effects to spell related objects such as the spellcaster, target,
|
|
// projectile, or impact location.
|
|
//
|
|
// note -- the direction vectors don't really fit... should probably consider separate
|
|
// constraint types for position, orientation, and possibly a look-at constraint.
|
|
//
|
|
|
|
class SceneObject;
|
|
class afxConstraintMgr;
|
|
|
|
class afxConstraint : public SimObject, public afxEffectDefs
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef SimObject Parent;
|
|
|
|
protected:
|
|
afxConstraintMgr* mMgr;
|
|
afxConstraintDef mCons_def;
|
|
bool mIs_defined;
|
|
bool mIs_valid;
|
|
Point3F mLast_pos;
|
|
MatrixF mLast_xfm;
|
|
F32 mHistory_time;
|
|
bool mIs_alive;
|
|
bool mGone_missing;
|
|
U32 mChange_code;
|
|
|
|
public:
|
|
/*C*/ afxConstraint(afxConstraintMgr*);
|
|
virtual ~afxConstraint();
|
|
|
|
virtual bool getPosition(Point3F& pos, F32 hist=0.0f)
|
|
{ pos = mLast_pos; return mIs_valid; }
|
|
virtual bool getTransform(MatrixF& xfm, F32 hist=0.0f)
|
|
{ xfm = mLast_xfm; return mIs_valid;}
|
|
virtual bool getAltitudes(F32& terrain_alt, F32& interior_alt) { return false; }
|
|
|
|
virtual bool isDefined() { return mIs_defined; }
|
|
virtual bool isValid() { return mIs_valid; }
|
|
virtual U32 getChangeCode() { return mChange_code; }
|
|
|
|
virtual U32 setAnimClip(const char* clip, F32 pos, F32 rate, F32 trans, bool is_death_anim)
|
|
{ return 0; };
|
|
virtual void resetAnimation(U32 tag) { };
|
|
virtual U32 lockAnimation() { return 0; }
|
|
virtual void unlockAnimation(U32 tag) { }
|
|
virtual F32 getAnimClipDuration(const char* clip) { return 0.0f; }
|
|
|
|
virtual S32 getDamageState() { return -1; }
|
|
virtual void setLivingState(bool state) { mIs_alive = state; };
|
|
virtual bool getLivingState() { return mIs_alive; };
|
|
|
|
virtual void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos)=0;
|
|
|
|
virtual SceneObject* getSceneObject()=0;
|
|
virtual void restoreObject(SceneObject*)=0;
|
|
virtual U16 getScopeId()=0;
|
|
|
|
virtual U32 getTriggers()=0;
|
|
|
|
virtual void set_scope_id(U16 scope_id) { }
|
|
virtual void unset() { }
|
|
};
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxConstraintMgr
|
|
|
|
class ShapeBase;
|
|
class afxEffectWrapper;
|
|
class afxShapeConstraint;
|
|
class afxObjectConstraint;
|
|
class BitStream;
|
|
class NetConnection;
|
|
|
|
struct afxConstraintID
|
|
{
|
|
S16 index;
|
|
S16 sub_index;
|
|
|
|
afxConstraintID() { index = -1; sub_index = 0; }
|
|
afxConstraintID(S16 idx, S16 sub=0) { index = idx; sub_index = sub; }
|
|
bool undefined() const { return (index < 0); }
|
|
};
|
|
|
|
typedef Vector<afxConstraint*> afxConstraintList;
|
|
|
|
class afxConstraintMgr : public afxEffectDefs
|
|
{
|
|
typedef SimObject Parent;
|
|
|
|
struct preDef
|
|
{
|
|
StringTableEntry name;
|
|
U32 type;
|
|
};
|
|
|
|
Vector<afxConstraintList*> mConstraints_v;
|
|
|
|
Vector<StringTableEntry> mNames_on_server;
|
|
Vector<S32> mGhost_ids;
|
|
Vector<preDef> mPredefs;
|
|
U32 mStartTime;
|
|
bool mOn_server;
|
|
bool mInitialized;
|
|
F32 mScoping_dist_sq;
|
|
|
|
SceneObject* find_object_from_name(StringTableEntry);
|
|
S32 find_cons_idx_from_name(StringTableEntry);
|
|
S32 find_effect_cons_idx_from_name(StringTableEntry);
|
|
|
|
void create_constraint(const afxConstraintDef&);
|
|
void set_ref_shape(afxConstraintID which_id, ShapeBase*);
|
|
void set_ref_shape(afxConstraintID which_id, U16 scope_id);
|
|
|
|
public:
|
|
/*C*/ afxConstraintMgr();
|
|
/*D*/ ~afxConstraintMgr();
|
|
|
|
void defineConstraint(U32 type, StringTableEntry);
|
|
|
|
afxConstraintID setReferencePoint(StringTableEntry which, Point3F point);
|
|
afxConstraintID setReferencePoint(StringTableEntry which, Point3F point, Point3F vector);
|
|
afxConstraintID setReferenceTransform(StringTableEntry which, MatrixF& xfm);
|
|
afxConstraintID setReferenceObject(StringTableEntry which, SceneObject*);
|
|
afxConstraintID setReferenceObjectByScopeId(StringTableEntry which, U16 scope_id, bool is_shape);
|
|
afxConstraintID setReferenceEffect(StringTableEntry which, afxEffectWrapper*);
|
|
afxConstraintID createReferenceEffect(StringTableEntry which, afxEffectWrapper*);
|
|
|
|
void setReferencePoint(afxConstraintID which_id, Point3F point);
|
|
void setReferencePoint(afxConstraintID which_id, Point3F point, Point3F vector);
|
|
void setReferenceTransform(afxConstraintID which_id, MatrixF& xfm);
|
|
void setReferenceObject(afxConstraintID which_id, SceneObject*);
|
|
void setReferenceObjectByScopeId(afxConstraintID which_id, U16 scope_id, bool is_shape);
|
|
void setReferenceEffect(afxConstraintID which_id, afxEffectWrapper*);
|
|
|
|
void invalidateReference(afxConstraintID which_id);
|
|
|
|
afxConstraintID getConstraintId(const afxConstraintDef&);
|
|
afxConstraint* getConstraint(afxConstraintID cons_id);
|
|
|
|
void sample(F32 dt, U32 now, const Point3F* cam_pos=0);
|
|
|
|
void setStartTime(U32 timestamp) { mStartTime = timestamp; }
|
|
void initConstraintDefs(Vector<afxConstraintDef>&, bool on_server, F32 scoping_dist=-1.0f);
|
|
void packConstraintNames(NetConnection* conn, BitStream* stream);
|
|
void unpackConstraintNames(BitStream* stream);
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
|
|
// scope-tracking
|
|
private:
|
|
Vector<SceneObject*> scopeable_objs;
|
|
Vector<U16> scopeable_ids;
|
|
Vector<afxConstraint*>* missing_objs;
|
|
Vector<afxConstraint*>* missing_objs2;
|
|
Vector<afxConstraint*> missing_objs_a;
|
|
Vector<afxConstraint*> missing_objs_b;
|
|
|
|
public:
|
|
void addScopeableObject(SceneObject*);
|
|
void removeScopeableObject(SceneObject*);
|
|
void clearAllScopeableObjs();
|
|
|
|
void postMissingConstraintObject(afxConstraint*, bool is_deleting=false);
|
|
void restoreScopedObject(SceneObject*, afxChoreographer* ch);
|
|
void adjustProcessOrdering(afxChoreographer*);
|
|
|
|
F32 getScopingDistanceSquared() const { return mScoping_dist_sq; }
|
|
};
|
|
|
|
inline afxConstraintID afxConstraintMgr::setReferencePoint(StringTableEntry which, Point3F point)
|
|
{
|
|
return setReferencePoint(which, point, Point3F(0,0,1));
|
|
}
|
|
|
|
inline void afxConstraintMgr::setReferencePoint(afxConstraintID which, Point3F point)
|
|
{
|
|
setReferencePoint(which, point, Point3F(0,0,1));
|
|
}
|
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxPointConstraint
|
|
// This constrains to a specific 3D position such as an impact location.
|
|
//
|
|
|
|
class afxPointConstraint : public afxConstraint
|
|
{
|
|
typedef afxConstraint Parent;
|
|
|
|
protected:
|
|
Point3F mPoint;
|
|
Point3F mVector;
|
|
|
|
public:
|
|
/*C*/ afxPointConstraint(afxConstraintMgr*);
|
|
virtual ~afxPointConstraint();
|
|
|
|
virtual void set(Point3F point, Point3F vector);
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
SceneObject* getSceneObject() override { return 0; }
|
|
void restoreObject(SceneObject*) override { }
|
|
U16 getScopeId() override { return 0; }
|
|
U32 getTriggers() override { return 0; }
|
|
|
|
void unset() override { set(Point3F::Zero, Point3F(0,0,1)); }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxTransformConstraint
|
|
// This constrains to a specific 3D transformation.
|
|
//
|
|
|
|
class afxTransformConstraint : public afxConstraint
|
|
{
|
|
typedef afxConstraint Parent;
|
|
|
|
protected:
|
|
MatrixF mXfm;
|
|
|
|
public:
|
|
/*C*/ afxTransformConstraint(afxConstraintMgr*);
|
|
virtual ~afxTransformConstraint();
|
|
|
|
virtual void set(const MatrixF& xfm);
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
SceneObject* getSceneObject() override { return 0; }
|
|
void restoreObject(SceneObject*) override { }
|
|
U16 getScopeId() override { return 0; }
|
|
U32 getTriggers() override { return 0; }
|
|
|
|
void unset() override { set(MatrixF::Identity); }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxShapeConstraint
|
|
// This constrains to a hierarchical shape (subclasses of ShapeBase), such as a
|
|
// Player or a Vehicle. You can also constrain to named sub-nodes of a shape.
|
|
|
|
class ShapeBase;
|
|
class SceneObject;
|
|
|
|
class afxShapeConstraint : public afxConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxConstraint Parent;
|
|
|
|
protected:
|
|
StringTableEntry mArb_name;
|
|
ShapeBase* mShape;
|
|
U16 mScope_id;
|
|
U32 mClip_tag;
|
|
U32 mLock_tag;
|
|
|
|
public:
|
|
/*C*/ afxShapeConstraint(afxConstraintMgr*);
|
|
/*C*/ afxShapeConstraint(afxConstraintMgr*, StringTableEntry arb_name);
|
|
virtual ~afxShapeConstraint();
|
|
|
|
virtual void set(ShapeBase* shape);
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
U32 setAnimClip(const char* clip, F32 pos, F32 rate, F32 trans, bool is_death_anim) override;
|
|
void resetAnimation(U32 tag) override;
|
|
U32 lockAnimation() override;
|
|
void unlockAnimation(U32 tag) override;
|
|
F32 getAnimClipDuration(const char* clip) override;
|
|
|
|
void remapAnimation(U32 tag, ShapeBase* other_shape);
|
|
|
|
S32 getDamageState() override;
|
|
|
|
SceneObject* getSceneObject() override { return mShape; }
|
|
void restoreObject(SceneObject*) override;
|
|
U16 getScopeId() override { return mScope_id; }
|
|
U32 getTriggers() override;
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
|
|
void unset() override { set(0); }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxShapeNodeConstraint
|
|
|
|
class afxShapeNodeConstraint : public afxShapeConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxShapeConstraint Parent;
|
|
|
|
protected:
|
|
StringTableEntry mArb_node;
|
|
S32 mShape_node_ID;
|
|
|
|
public:
|
|
/*C*/ afxShapeNodeConstraint(afxConstraintMgr*);
|
|
/*C*/ afxShapeNodeConstraint(afxConstraintMgr*, StringTableEntry arb_name, StringTableEntry arb_node);
|
|
|
|
void set(ShapeBase* shape) override;
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
void restoreObject(SceneObject*) override;
|
|
|
|
S32 getNodeID() const { return mShape_node_ID; }
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxObjectConstraint
|
|
// This constrains to a simple 3D object (subclasses of SceneObject), such as an
|
|
// afxMagicMissile or a Projectile. You cannot constrain to sub-nodes with an
|
|
// afxObjectConstraint, use afxShapeConstraint instead.
|
|
|
|
class SceneObject;
|
|
|
|
class afxObjectConstraint : public afxConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxConstraint Parent;
|
|
|
|
protected:
|
|
StringTableEntry mArb_name;
|
|
SceneObject* mObj;
|
|
U16 mScope_id;
|
|
bool mIs_camera;
|
|
|
|
public:
|
|
afxObjectConstraint(afxConstraintMgr*);
|
|
afxObjectConstraint(afxConstraintMgr*, StringTableEntry arb_name);
|
|
virtual ~afxObjectConstraint();
|
|
|
|
virtual void set(SceneObject* obj);
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
SceneObject* getSceneObject() override { return mObj; }
|
|
void restoreObject(SceneObject*) override;
|
|
U16 getScopeId() override { return mScope_id; }
|
|
U32 getTriggers() override;
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
|
|
void unset() override { set(0); }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxEffectConstraint
|
|
// This constrains to a hierarchical shape (subclasses of ShapeBase), such as a
|
|
// Player or a Vehicle. You can also constrain to named sub-nodes of a shape.
|
|
|
|
class afxEffectWrapper;
|
|
|
|
class afxEffectConstraint : public afxConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxConstraint Parent;
|
|
|
|
protected:
|
|
StringTableEntry mEffect_name;
|
|
afxEffectWrapper* mEffect;
|
|
U32 mClip_tag;
|
|
bool mIs_death_clip;
|
|
U32 mLock_tag;
|
|
|
|
public:
|
|
/*C*/ afxEffectConstraint(afxConstraintMgr*);
|
|
/*C*/ afxEffectConstraint(afxConstraintMgr*, StringTableEntry effect_name);
|
|
virtual ~afxEffectConstraint();
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
bool getAltitudes(F32& terrain_alt, F32& interior_alt) override;
|
|
|
|
virtual void set(afxEffectWrapper* effect);
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override { }
|
|
|
|
U32 setAnimClip(const char* clip, F32 pos, F32 rate, F32 trans, bool is_death_anim) override;
|
|
void resetAnimation(U32 tag) override;
|
|
F32 getAnimClipDuration(const char* clip) override;
|
|
|
|
SceneObject* getSceneObject() override { return 0; }
|
|
void restoreObject(SceneObject*) override { }
|
|
U16 getScopeId() override { return 0; }
|
|
U32 getTriggers() override;
|
|
|
|
void unset() override { set(0); }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxEffectNodeConstraint
|
|
|
|
class afxEffectNodeConstraint : public afxEffectConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxEffectConstraint Parent;
|
|
|
|
protected:
|
|
StringTableEntry mEffect_node;
|
|
S32 mEffect_node_ID;
|
|
|
|
public:
|
|
/*C*/ afxEffectNodeConstraint(afxConstraintMgr*);
|
|
/*C*/ afxEffectNodeConstraint(afxConstraintMgr*, StringTableEntry name, StringTableEntry node);
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
|
|
void set(afxEffectWrapper* effect) override;
|
|
|
|
S32 getNodeID() const { return mEffect_node_ID; }
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxSampleBuffer
|
|
|
|
class afxSampleBuffer
|
|
{
|
|
protected:
|
|
U32 mBuffer_sz;
|
|
U32 mBuffer_ms;
|
|
U32 mMS_per_sample;
|
|
U32 mElapsed_ms;
|
|
U32 mLast_sample_ms;
|
|
U32 mNext_sample_num;
|
|
U32 mNum_samples;
|
|
|
|
virtual void recSample(U32 idx, void* data) = 0;
|
|
bool compute_idx_from_lag(F32 lag, U32& idx);
|
|
bool compute_idx_from_lag(F32 lag, U32& idx1, U32& idx2, F32& t);
|
|
|
|
public:
|
|
/*C*/ afxSampleBuffer();
|
|
virtual ~afxSampleBuffer();
|
|
|
|
virtual void configHistory(F32 hist_len, U8 sample_rate);
|
|
void recordSample(F32 dt, U32 elapsed_ms, void* data);
|
|
virtual void getSample(F32 lag, void* data, bool& oob) = 0;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxSampleXfmBuffer
|
|
|
|
class afxSampleXfmBuffer : public afxSampleBuffer
|
|
{
|
|
typedef afxSampleBuffer Parent;
|
|
|
|
protected:
|
|
MatrixF* mXfm_buffer;
|
|
|
|
void recSample(U32 idx, void* data) override;
|
|
|
|
public:
|
|
/*C*/ afxSampleXfmBuffer();
|
|
virtual ~afxSampleXfmBuffer();
|
|
|
|
void configHistory(F32 hist_len, U8 sample_rate) override;
|
|
void getSample(F32 lag, void* data, bool& oob) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxPointHistConstraint
|
|
// This class extends afxPointConstraint to remember its values for a period of time.
|
|
|
|
class afxPointHistConstraint : public afxPointConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxPointConstraint Parent;
|
|
|
|
protected:
|
|
afxSampleBuffer* mSamples;
|
|
|
|
public:
|
|
/*C*/ afxPointHistConstraint(afxConstraintMgr*);
|
|
virtual ~afxPointHistConstraint();
|
|
|
|
void set(Point3F point, Point3F vector) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxPointHistConstraint
|
|
// This class extends afxTransformConstraint to remember its values for a period of time.
|
|
|
|
class afxTransformHistConstraint : public afxTransformConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxTransformConstraint Parent;
|
|
|
|
protected:
|
|
afxSampleBuffer* mSamples;
|
|
|
|
public:
|
|
/*C*/ afxTransformHistConstraint(afxConstraintMgr*);
|
|
virtual ~afxTransformHistConstraint();
|
|
|
|
void set(const MatrixF& xfm) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxShapeHistConstraint
|
|
// This class extends afxShapeConstraint to remember its values for a period of time.
|
|
|
|
class afxShapeHistConstraint : public afxShapeConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxShapeConstraint Parent;
|
|
|
|
protected:
|
|
afxSampleBuffer* mSamples;
|
|
|
|
public:
|
|
/*C*/ afxShapeHistConstraint(afxConstraintMgr*);
|
|
/*C*/ afxShapeHistConstraint(afxConstraintMgr*, StringTableEntry arb_name);
|
|
virtual ~afxShapeHistConstraint();
|
|
|
|
void set(ShapeBase* shape) override;
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxShapeNodeHistConstraint
|
|
// This class extends afxShapeConstraint to remember its values for a period of time.
|
|
|
|
class afxShapeNodeHistConstraint : public afxShapeNodeConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxShapeNodeConstraint Parent;
|
|
|
|
protected:
|
|
afxSampleBuffer* mSamples;
|
|
|
|
public:
|
|
/*C*/ afxShapeNodeHistConstraint(afxConstraintMgr*);
|
|
/*C*/ afxShapeNodeHistConstraint(afxConstraintMgr*, StringTableEntry arb_name, StringTableEntry arb_node);
|
|
virtual ~afxShapeNodeHistConstraint();
|
|
|
|
void set(ShapeBase* shape) override;
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
// afxObjectHistConstraint
|
|
// This class extends afxObjectConstraint to remember its values for a period of time.
|
|
|
|
class SceneObject;
|
|
|
|
class afxObjectHistConstraint : public afxObjectConstraint
|
|
{
|
|
friend class afxConstraintMgr;
|
|
typedef afxObjectConstraint Parent;
|
|
|
|
protected:
|
|
afxSampleBuffer* mSamples;
|
|
|
|
public:
|
|
afxObjectHistConstraint(afxConstraintMgr*);
|
|
afxObjectHistConstraint(afxConstraintMgr*, StringTableEntry arb_name);
|
|
virtual ~afxObjectHistConstraint();
|
|
|
|
void set(SceneObject* obj) override;
|
|
void set_scope_id(U16 scope_id) override;
|
|
void sample(F32 dt, U32 elapsed_ms, const Point3F* cam_pos) override;
|
|
|
|
bool getPosition(Point3F& pos, F32 hist=0.0f) override;
|
|
bool getTransform(MatrixF& xfm, F32 hist=0.0f) override;
|
|
|
|
void onDeleteNotify(SimObject*) override;
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|
|
|
|
#endif // _AFX_CONSTRAINT_H_
|
|
|