00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATABLOCK_PREDICT_FLOAT_H__
00012 #define __DATABLOCK_PREDICT_FLOAT_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014
00015 #include "RNReplicaNet/Inc/DataBlock.h"
00016 #include <list>
00017
00018 namespace RNReplicaNet
00019 {
00020
00028 class REPLICANETDLL_API DataBlock_Predict_Float : public DataBlock
00029 {
00030 public:
00034 DataBlock_Predict_Float();
00035
00039 virtual ~DataBlock_Predict_Float();
00040
00041 virtual void Poll(DataBlockReason *reason);
00042
00043 virtual void ParseMessage(MessageHelper *message);
00044
00045 virtual void GiveDeltaHint(void *pdata,int dataLen);
00046
00047 virtual void GiveDeltaHint(const float delta);
00048
00049 virtual void ContinuityBreak(unsigned char breakTypes);
00050
00051 bool IsAttached(void *data);
00052
00058 static DataBlock_Predict_Float *Register(float *data);
00059
00064 void RegisterInClassPointer(float *data)
00065 {
00066 mData = data;
00067 }
00068
00073 void SetMinError(float minerror = 0.1f);
00074
00079 void SetMaxError(float maxerror = 1.0f);
00080
00085 void SetMinDistance(float distance = 0.1f);
00086
00091 void SetMaxDistance(float distance = 1.0f);
00092
00099 void SetInterpolationFilter(float interpolation = 0.1f);
00100
00104 void SetQuadratic(void)
00105 {
00106 mIsQuadratic = true;
00107 }
00108
00112 void SetLinear(void)
00113 {
00114 mIsQuadratic = false;
00115 }
00116
00117 private:
00118 float *mData;
00119 bool mContinuityBreak;
00120 bool mIsDistanceBased;
00121 float mMinDistance;
00122 float mMaxDistance;
00123 float mMinError;
00124 bool mIsQuadratic;
00125 bool mGotData;
00126 bool mImplementTeleport;
00127 bool mDoPrep;
00128 bool mCacheValid;
00129
00130
00131
00132 float mTestData;
00133
00134 float mMaxError;
00135 float mInterpolationFilter;
00136
00137
00138 struct SessionBlock_Predict_Float
00139 {
00140 SessionBlock_Predict_Float(int sessid);
00141
00142 virtual ~SessionBlock_Predict_Float();
00143
00144 int mSessionID;
00145 bool mContinuityBreak;
00146 float mTestData;
00147 float mDelta;
00148
00149 float mSample;
00150 float mSampleTime;
00151
00152 bool mImplementTeleport;
00153
00154
00155
00156 float mLastUpdateSentLocalTime;
00157 int mNumForcedUpdates;
00158 };
00159
00160 std::list<SessionBlock_Predict_Float *> mPerSessionData;
00161
00162 struct ReplicaData
00163 {
00164 bool mFirstTime;
00165
00166 float mDelta;
00167 float mSample;
00168 float mSampleTime;
00169 };
00170
00171 ReplicaData mReplicaData;
00172
00173 struct MasterData
00174 {
00175 float mDelta;
00176 float mSample;
00177 float mSampleTime;
00178 float mSampleHistory[2];
00179 float mSampleHistoryTime[2];
00180 float mSampleHistoryTimeLocal[2];
00181 bool mGotDeltaHint;
00182 float mTheDeltaHint;
00183 };
00184 MasterData mMasterData;
00185
00186 std::list<SessionBlock_Predict_Float *>::iterator mCacheEntry;
00187
00188 bool mDoneMasterPoll;
00189 };
00190
00191 }
00192
00193
00194 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_VAR(x) \
00195 {\
00196 RNReplicaNet::DataBlock_Predict_Float *datablock = 0; \
00197 datablock = RNReplicaNet::DataBlock_Predict_Float::Register(&(basepoint->x)); \
00198 _RO_DO_SETDATABLOCKVARIABLENAME(x);
00199
00200
00201
00202 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXERROR(x) \
00203 datablock->SetMaxError(x);
00204
00205
00206
00207 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINERROR(x) \
00208 datablock->SetMinError(x);
00209
00210
00211
00212 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETERROR(x) \
00213 datablock->SetMinError(x); \
00214 datablock->SetMaxError(x);
00215
00216
00217
00218 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINDISTANCE(x) \
00219 datablock->SetMinDistance(x);
00220
00221
00222
00223 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXDISTANCE(x) \
00224 datablock->SetMaxDistance(x);
00225
00226
00227
00228 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETINTERPOLATIONFILTER(x) \
00229 datablock->SetInterpolationFilter(x);
00230
00231
00232
00233 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLINEAR() \
00234 datablock->SetLinear();
00235
00236
00237
00238 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETQUADRATIC() \
00239 datablock->SetQuadratic();
00240
00241
00242 #endif