ReplicaNet and RNLobby  1
DataBlock_Predict_Float.h
1 /* START_LICENSE_HEADER
2 
3 Copyright (C) 2000 Martin Piper, original design and program code
4 Copyright (C) 2001 Replica Software
5 
6 This program file is copyright (C) Replica Software and can only be used under license.
7 For more information visit: http://www.replicanet.com/
8 Or email: info@replicanet.com
9 
10 END_LICENSE_HEADER */
11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __DATABLOCK_PREDICT_FLOAT_H__
13 #define __DATABLOCK_PREDICT_FLOAT_H__
14 
15 #include "RNReplicaNet/Inc/DataBlock.h"
16 #include "RNPlatform/Inc/RegistryManagerMap.h"
17 
18 namespace RNReplicaNet
19 {
20 
31 {
32 public:
33  RN_CLASS_MINIMAL_RTTI();
38 
42  virtual ~DataBlock_Predict_Float();
43 
44  virtual void Poll(DataBlockReason *reason,const bool discardOlderIncluded = false,const unsigned int discardOrder = 0);
45 
46  virtual void ParseMessage(MessageHelper *message);
47 
48  virtual void GiveDeltaHint(void *pdata,int dataLen);
49 
50  virtual void GiveDeltaHint(const float delta);
51 
52  virtual void ContinuityBreak(unsigned char breakTypes);
53 
58  virtual bool GetLastDelta(bool &continuityBreak, float &sample, SysTimeType &time, float &delta);
59 
60  bool IsAttached(void *data);
61 
67  static DataBlock_Predict_Float *Register(float *data);
68 
73  void RegisterInClassPointer(float *data)
74  {
75  mData = data;
76  }
77 
82  void SetMinError(float minerror = 0.1f);
83 
88  void SetMaxError(float maxerror = 1.0f);
89 
94  void SetMinDistance(float distance = 0.1f);
95 
100  void SetMaxDistance(float distance = 1.0f);
101 
108  void SetInterpolationFilter(float interpolation = 0.1f);
109 
113  void SetQuadratic(void)
114  {
115  mIsQuadratic = true;
116  }
117 
121  void SetLinear(void)
122  {
123  mIsQuadratic = false;
124  }
125 
131  void SetLagged(const float time = 0.0f);
132 
139  void SetSnapToDifference(const float difference = -1.0f);
140 
147  void BoundaryEnable(void);
148 
152  void BoundaryDisable(void);
153 
157  void BoundaryWrapAround(void);
158 
162  void BoundaryCapped(void);
163 
167  void BoundaryLowerUpper(const float lower,const float upper);
168 
173  void BoundaryApplyToMaster(void);
174 
178  void BoundaryDoNotApplyToMaster(void);
179 
184  static bool BoundaryApplyToValue(ReplicaObject *object,float &value);
185 
190  void SetValueFloat(void);
191 
195  void SetValueShortFloat(void);
196 
201  void SetDeltaFloat(void);
202 
206  void SetDeltaShortFloat(void);
207 
217  void ReplicaContinuityBreak(const SysTimeType time, const float sample, const float delta, const bool continuityBreak, const bool ignoreTimeCheck = false, const bool clearPreviousUpdates = false);
218 
223  void SetTimeDelta(const float timeDelta = 0.0f);
224 
225 protected: // User defined DataBlocks have access to these variables.
226  float *mData;
227  bool mContinuityBreak;
228  bool mIsDistanceBased;
229  float mMinDistance;
230  float mMaxDistance;
231  float mMinError;
232  bool mIsQuadratic;
233  bool mGotData;
234  bool mImplementTeleport;
235  bool mDoPrep;
236 
237 
238  float mTestData;
239 
240  float mMaxError;
241  float mInterpolationFilter;
242 
243 
245  {
247 
248  virtual ~SessionBlock_Predict_Float();
249 
250  unsigned int mDiscardOrder;
251  bool mContinuityBreak;
252  float mTestData;
253  float mDelta;
254 
255  float mSample;
256  SysTimeType mSampleTime;
257 
258  bool mImplementTeleport;
259 
260  // Forced updates
261  // This works off local time, not network time
262  SysTimeType mLastUpdateSentLocalTime;
263  int mNumForcedUpdates;
264  };
265 
267 
268  struct ReplicaData
269  {
270  bool mFirstTime;
271  bool mFirstTimeNotReset;
272 
273  float mDelta;
274  float mSample;
275  SysTimeType mSampleTime;
276  };
277 
278  ReplicaData mReplicaData;
279 
280  struct MasterData
281  {
282  float mDelta;
283  float mSample;
284  SysTimeType mSampleTime;
285  float mSampleHistory[2];
286  SysTimeType mSampleHistoryTime[2]; // This is the network time and is used as values to send to any replicas
287  SysTimeType mSampleHistoryTimeLocal[2]; // This is the local time and is only used to calculate deltas
288  bool mGotDeltaHint;
289  float mTheDeltaHint;
290  };
291  MasterData mMasterData;
292 
293  bool mDoneMasterPoll;
294 
295  // When lagged parsing is enabled any incoming replica packets are stored with this structure into mParsedByTime
296  struct ParsedData
297  {
298  float mSample;
299  float mDelta;
300  bool mFirstTime;
301  };
302  std::map<SysTimeType,ParsedData> mParsedByTime;
303 
304  float mLagged;
305  SysTimeType mFirstLaggedTime;
306 
307  float mSnapToDifference;
308 
309  bool mBoundaryEnable;
310  bool mBoundaryIsWrap;
311  float mBoundaryLower,mBoundaryUpper;
312  bool mBoundaryWriteBack;
313 
314  float ApplyBoundaryToValue(const float value) const;
315 
316  SysTimeType mLastGoodDataTime;
317 
318  bool mShortValue;
319  bool mShortDelta;
320 
321  int AddDataBlockData(DynamicMessageHelper *message,const float sample,const SysTimeType time,const float delta);
322 
323  float mTimeDelta;
324 
325  void FreeSessionBlocks(void);
326 
327  float CalculateReplicaValue(DataBlockReason *reason);
328 };
329 
330 } // namespace RNReplicaNet
331 
332 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_VAR macro starts here */
333 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_VAR(x) \
334  {\
335  RNReplicaNet::DataBlock_Predict_Float *datablock = 0; \
336  datablock = RNReplicaNet::DataBlock_Predict_Float::Register(&(basepoint->x)); \
337  _RO_DO_SETDATABLOCKVARIABLENAME(x);
338 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_VAR macro ends here */
339 
340 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXERROR macro starts here */
341 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXERROR(x) \
342  datablock->SetMaxError((float)x);
343 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXERROR macro ends here */
344 
345 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINERROR macro starts here */
346 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINERROR(x) \
347  datablock->SetMinError((float)x);
348 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINERROR macro ends here */
349 
350 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETERROR macro starts here */
351 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETERROR(x) \
352  datablock->SetMinError((float)x); \
353  datablock->SetMaxError((float)x);
354 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETERROR macro ends here */
355 
356 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINDISTANCE macro starts here */
357 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINDISTANCE(x) \
358  datablock->SetMinDistance((float)x);
359 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMINDISTANCE macro ends here */
360 
361 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXDISTANCE macro starts here */
362 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXDISTANCE(x) \
363  datablock->SetMaxDistance((float)x);
364 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETMAXDISTANCE macro ends here */
365 
366 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETINTERPOLATIONFILTER macro starts here */
367 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETINTERPOLATIONFILTER(x) \
368  datablock->SetInterpolationFilter((float)x);
369 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETINTERPOLATIONFILTER macro ends here */
370 
371 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLINEAR macro starts here */
372 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLINEAR() \
373  datablock->SetLinear();
374 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLINEAR macro ends here */
375 
376 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETQUADRATIC macro starts here */
377 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETQUADRATIC() \
378  datablock->SetQuadratic();
379 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETQUADRATIC macro ends here */
380 
381 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLAGGED macro starts here */
382 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLAGGED(x) \
383  datablock->SetLagged((float)x);
384 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETLAGGED macro ends here */
385 
386 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETSNAPTODIFFERENCE macro starts here */
387 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETSNAPTODIFFERENCE(x) \
388  datablock->SetSnapToDifference((float)x);
389 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETSNAPTODIFFERENCE macro ends here */
390 
391 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYENABLE macro starts here */
392 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYENABLE() \
393  datablock->BoundaryEnable();
394 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYENABLE macro ends here */
395 
396 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDISABLE macro starts here */
397 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDISABLE() \
398  datablock->BoundaryDisable();
399 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDISABLE macro ends here */
400 
401 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYWRAPAROUND macro starts here */
402 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYWRAPAROUND() \
403  datablock->BoundaryWrapAround();
404 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYWRAPAROUND macro ends here */
405 
406 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYCAPPED macro starts here */
407 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYCAPPED() \
408  datablock->BoundaryCapped();
409 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYCAPPED macro ends here */
410 
411 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYLOWERUPPER macro starts here */
412 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYLOWERUPPER(x,y) \
413  datablock->BoundaryLowerUpper((float)x,(float)y);
414 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYLOWERUPPER macro ends here */
415 
416 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYAPPLYTOMASTER macro starts here */
417 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYAPPLYTOMASTER() \
418  datablock->BoundaryApplyToMaster();
419 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYAPPLYTOMASTER macro ends here */
420 
421 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDONOTAPPLYTOMASTER macro starts here */
422 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDONOTAPPLYTOMASTER() \
423  datablock->BoundaryDoNotApplyToMaster();
424 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_BOUNDARYDONOTAPPLYTOMASTER macro ends here */
425 
426 
427 
428 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUEFLOAT macro starts here */
429 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUEFLOAT() \
430  datablock->SetValueFloat();
431 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUEFLOAT macro ends here */
432 
433 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUESHORTFLOAT macro starts here */
434 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUESHORTFLOAT() \
435  datablock->SetValueShortFloat();
436 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETVALUESHORTFLOAT macro ends here */
437 
438 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTAFLOAT macro starts here */
439 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTAFLOAT() \
440  datablock->SetDeltaFloat();
441 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTAFLOAT macro ends here */
442 
443 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTASHORTFLOAT macro starts here */
444 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTASHORTFLOAT() \
445  datablock->SetDeltaShortFloat();
446 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETDELTASHORTFLOAT macro ends here */
447 
448 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETTIMEDELTA macro starts here */
449 #define _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETTIMEDELTA(x) \
450  datablock->SetTimeDelta((float)x);
451 /* _RO_DO_REGISTERBLOCK_PREDICT_FLOAT_SETTIMEDELTA macro ends here */
452 
453 #endif
void SetMaxError(float maxerror=1.0f)
Definition: DataBlock.h:357
virtual void Poll(DataBlockReason *reason, const bool discardOlderIncluded=false, const unsigned int discardOrder=0)
virtual bool GetLastDelta(bool &continuityBreak, float &sample, SysTimeType &time, float &delta)
static DataBlock_Predict_Float * Register(float *data)
Definition: DataBlock_Predict_Float.h:280
virtual void ContinuityBreak(unsigned char breakTypes)
void SetMaxDistance(float distance=1.0f)
void SetMinDistance(float distance=0.1f)
Definition: DataBlock_Predict_Float.h:296
Definition: DataBlock_Predict_Float.h:30
void SetTimeDelta(const float timeDelta=0.0f)
Definition: MessageHelper.h:35
virtual void ParseMessage(MessageHelper *message)
void SetInterpolationFilter(float interpolation=0.1f)
void SetMinError(float minerror=0.1f)
void SetQuadratic(void)
Definition: DataBlock_Predict_Float.h:113
void ReplicaContinuityBreak(const SysTimeType time, const float sample, const float delta, const bool continuityBreak, const bool ignoreTimeCheck=false, const bool clearPreviousUpdates=false)
Definition: RegistryManagerMap.h:25
static bool BoundaryApplyToValue(ReplicaObject *object, float &value)
Definition: ReplicaObject.h:43
void SetSnapToDifference(const float difference=-1.0f)
virtual void GiveDeltaHint(void *pdata, int dataLen)
void BoundaryLowerUpper(const float lower, const float upper)
Definition: MessageHelper.h:211
void RegisterInClassPointer(float *data)
Definition: DataBlock_Predict_Float.h:73
void SetLinear(void)
Definition: DataBlock_Predict_Float.h:121
Definition: DataBlock.h:47
void SetLagged(const float time=0.0f)
Definition: DataBlock_Predict_Float.h:268