1 #ifndef VIRTUAL_COUPLING_EFFECTOR_FILTER_H
2 #define VIRTUAL_COUPLING_EFFECTOR_FILTER_H
6 #ifdef COMPILE_PHANTOM_DEVICE
8 namespace vreckoDP_PHANToM {
18 class VirtualCouplingEffectorFilter :
public PHANToMFilter {
20 VirtualCouplingEffectorFilter();
22 virtual bool loadXMLParameters(XERCES_CPP_NAMESPACE_QUALIFIER
DOMNode *parameters);
23 virtual void apply(PHANToMSTATE &pState, osg::Vec3 &force, osg::Vec3 &torque);
26 template<
class _Type,
int _MaxData>
class OldDataStorage {
34 inline void getMaxData() {
return _MaxData; }
36 inline _Type &getValue() {
return data[0]; }
37 inline const _Type &getValue()
const {
return data[0]; }
39 inline _Type getVelocity() {
return (data[0] - data[1]); }
40 inline _Type getAccel() {
return (data[0] - 2 * data[1] + data[2]); }
42 inline void fillWithSingleValue(_Type& newData) {
43 for (
int i = 0; i < _MaxData; ++i)
47 inline void addNew(_Type& newData) {
48 for (
int i = _MaxData - 1; i > 1; --i)
49 data[i] = data[i - 1];
56 template<
class _Type,
int _MaxData>
class StorageWithDamping :
public OldDataStorage<_Type, _MaxData> {
58 StorageWithDamping(
float _springDamping,
float _velocityDamping) : OldDataStorage() {
59 springDamping = _springDamping;
60 velocityDamping = _velocityDamping;
63 void dampAndStoreValue(_Type *value) {
64 *value = (*value * springDamping + getVelocity() * velocityDamping);
68 void setDamping(
float newSpringDamping,
float newVelocityDamping) {
69 springDamping = newSpringDamping;
70 velocityDamping = newVelocityDamping;
73 float getSpringDamping() {
return springDamping; }
74 float getVelocityDamping() {
return velocityDamping; }
78 float velocityDamping;
81 unsigned int realPhantomPosObjectID;
83 DynamicArray<osg::Matrix> originalScales;
86 osg::Vec3 offsetFromCenter;
88 OldDataStorage<osg::Vec3, 4> lastRealPos;
89 OldDataStorage<osg::Vec3, 4> lastVirtualPos;
92 OldDataStorage<osg::Quat, 4> lastRealRot;
93 OldDataStorage<osg::Quat, 4> lastVirtualRot;
95 void inverseQuadraticScale(osg::Vec3 *valueToRescale,
float inputMaxLength,
float outputMaxLength);
100 void linearScale(osg::Vec3 *valueToRescale,
float inputMaxLength,
float outputMaxLength);
104 void forceScale(osg::Vec3 *valueToRescale,
float inputMaxLength,
float outputMaxLength);
106 float virtToolWeight;
109 osg::Vec3 virtToolLinMomentum;
110 osg::Vec3 virtToolAngMomentum;
113 float fSpringLinDamping;
114 float fSpringLinFriction;
115 float fSpringAngDamping;
116 float fSpringAngFriction;
118 float fDragLinForceTool;
119 float fDragLinDistTool;
120 float fDragLinForceUser;
121 float fDragLinDistUser;
123 float fDragAngForceTool;
124 float fDragAngForceUser;
126 float fMaxLinDistTool;
128 float fMaxAngDistTool;
130 float fDistanceToReset;
134 bool bPauseIfColStructsAreNotReady;
140 int computeCollisionThroughtLastXFrame;
141 int collisionsFrontPosition;
142 bool collisionsFront[5000];
143 bool collisionsOccuredLastXFrame(
int X);
144 void pushCollisionToFront(
bool value);
146 bool bStickyObjectsEnabled;
147 float fStickyObjectsDistance;
150 struct dampingValues {
156 int iDampingEndValuesX;
157 dampingValues dampingField[5000];
158 int iDampingValuesFieldPosition;
159 void getAvarageLastXDampingValues(osg::Vec3f *force,
float *
angle);
160 float getAvarageLastXDampingValuesRotAngle(
int count);
161 void pushValuesToDamping(osg::Vec3f force,
float fRotAngle);