00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _ZOIDREPLICATORMOVEMENT_H_
00011 #define _ZOIDREPLICATORMOVEMENT_H_
00012
00016 #include "zoidcom.h"
00017 #include "zoidcom_typehelper.h"
00018
00019
00020 template <typename T, int SIZE> class ZCom_ReplicateMovementPrivate;
00021
00027
00028
00029 #define ZCOM_REPMOVE_USE_ERROR_FUNC (1L << 2)
00030
00031
00033
00035
00038 template <typename T>
00039 class ZCOM_API ZCom_RSetupMovement : public ZCom_RSetupNumeric
00040 {
00041 public:
00043 ZCOM_TAPI ZCom_RSetupMovement(zU8 _rbits, zU8 _flags, zU8 _rules, zU8 _intercept_id = 0,
00044 zS16 _mindelay = -1, zS16 _maxdelay = -1)
00045 : ZCom_RSetupNumeric(_rbits, _flags, _rules, _intercept_id, _mindelay, _maxdelay)
00046 {
00047 m_inputsizebits = 8;
00048 m_extflags = 0;
00049 m_interpolation_time = 100;
00050 m_error.constant = 25;
00051 }
00052
00053 ZCOM_TAPI ZCom_ReplicatorSetup* Duplicate();
00054
00062 void setInputsizeBits(zU8 _inputbits) { m_inputsizebits = _inputbits; }
00066 zU8 getInputsizeBits() const { return m_inputsizebits; }
00067
00069 zU8 getExtendedFlags() const { return m_extflags; }
00070
00072 void setConstantErrorThreshold(zFloat _threshold) { m_error.constant = _threshold; }
00074 zFloat getConstantErrorThreshold() const { return m_error.constant; }
00075
00077 zU32 getInterpolationTime() const { return m_interpolation_time; }
00078
00080 void setInterpolationTime(zU32 _time) { m_interpolation_time = _time; }
00081
00082 protected:
00083 zU8 m_extflags;
00084 zU8 m_inputsizebits;
00085 zU32 m_interpolation_time;
00086
00087
00088 union {
00089 zFloat constant;
00090 } m_error;
00091 };
00092
00094
00096
00100 template <typename T>
00101 class ZCOM_API ZCom_MoveUpdateListener
00102 {
00103 public:
00108 virtual void
00109 inputUpdated(ZCom_BitStream& _inputstream, bool _inputchanged, zU32 _client_time, zU32 _estimated_time_sent) = 0;
00110
00115 virtual void
00116 inputSent(ZCom_BitStream& _inputstream) = 0;
00117
00126 virtual void
00127 correctionReceived(T *_pos, zFloat* _vel, zFloat *_acc, bool _teleport, zU32 _estimated_time_sent) = 0;
00128
00132 virtual void
00133 updateReceived(ZCom_BitStream& _inputstream, T *_pos, zFloat* _vel, zFloat *_acc, zU32 _estimated_time_sent) = 0;
00134 };
00135
00136
00138
00140
00155 template <typename T, int SIZE>
00156 class ZCOM_API ZCom_Replicate_Movement : public ZCom_ReplicatorAdvanced
00157 {
00158
00159 typedef typename ZCom_TypeHelper<T>::value_type TYPE;
00160 public:
00161
00162 class UpdateListener;
00163 public:
00165 ZCOM_TAPI ZCom_Replicate_Movement(ZCom_RSetupMovement<TYPE>* _setup);
00167 ZCOM_TAPI ZCom_Replicate_Movement(zU8 _rbits, zU8 _flags, zU8 _rules, zU8 _intercept_id = 0,
00168 zS16 _mindelay = -1, zS16 _maxdelay = -1);
00169 ZCOM_TAPI ~ZCom_Replicate_Movement();
00170
00185 ZCOM_TAPI void setTimeScale(zFloat _scale);
00186
00196 ZCOM_TAPI void setUpdateListener(ZCom_MoveUpdateListener<TYPE> *_listener);
00197
00224 ZCOM_TAPI void updateInput(T *_pos, ZCom_BitStream *_inputstream);
00225
00239 ZCOM_TAPI ZCom_BitStream* getNextInputHistoryEntry(zU32* _deltatime, void** _iter);
00240
00260 ZCOM_TAPI void updateState(TYPE *_newpos, zFloat *_newvel, zFloat *_newaccel, bool _teleport);
00261
00283 ZCOM_TAPI void overrideState(TYPE *_newpos, zFloat *_newvel, zFloat *_newaccel, zS32 _time = 0);
00284
00300 ZCOM_TAPI void getExtrapolatedPosition(zS32 _attime, TYPE *_data);
00301
00307 ZCOM_TAPI void getExtrapolatedVelocity(zS32 _attime, zFloat *_data);
00308
00315 ZCOM_TAPI void getAcceleration(zFloat *_data);
00316
00321 ZCOM_TAPI void getLastReceivedPosition(T *_data);
00322
00327 ZCOM_TAPI void getLastReceivedVelocity(zFloat *_data);
00328
00343 ZCOM_TAPI void getSplinePoint(zFloat t, TYPE *_data);
00344
00350 ZCOM_TAPI void getSplineControlPoint(zU32 _idx, TYPE *_data);
00351
00354 protected:
00355 ZCOM_TAPI virtual void onPreSendData(ZCom_ConnID _cid, eZCom_NodeRole _remoterole, zU32 *_lastupdate);
00356 ZCOM_TAPI virtual void onDataReceived(ZCom_ConnID _cid, eZCom_NodeRole _remoterole, ZCom_BitStream &_stream,
00357 bool _store, zU32 _estimated_time_sent);
00358 ZCOM_TAPI virtual void onDataLost(ZCom_ConnID _cid, zU32 _reference_id, ZCom_BitStream *_data);
00359 ZCOM_TAPI virtual void onDataAcked(ZCom_ConnID _cid, zU32 _reference_id, ZCom_BitStream *_data);
00360 ZCOM_TAPI virtual void onPacketReceived(ZCom_ConnID _cid);
00361 ZCOM_TAPI virtual void onConnectionAdded(ZCom_ConnID _cid, eZCom_NodeRole _remoterole);
00362 ZCOM_TAPI virtual void onConnectionRemoved(ZCom_ConnID _cid, eZCom_NodeRole _remoterole);
00363 ZCOM_TAPI virtual void onLocalRoleChanged(eZCom_NodeRole _oldrole, eZCom_NodeRole _newrole);
00364 ZCOM_TAPI virtual void onRemoteRoleChanged(ZCom_ConnID _cid, eZCom_NodeRole _oldrole, eZCom_NodeRole _newrole) {};
00365
00366 ZCOM_TAPI virtual void Process(eZCom_NodeRole _localrole, zU32 _simulation_time_passed);
00367 ZCOM_TAPI virtual void* peekData();
00368 ZCOM_TAPI virtual void clearPeekData() {};
00369 protected:
00370 ZCom_ReplicateMovementPrivate<T, SIZE> *m_priv;
00371 };
00372
00373 #endif