mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-29 21:25:54 +01:00
124 lines
3.9 KiB
C
124 lines
3.9 KiB
C
|
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
|
||
|
|
||
|
#ifndef SE_INCL_EMSGBUFFER_H
|
||
|
#define SE_INCL_EMSGBUFFER_H
|
||
|
#ifdef PRAGMA_ONCE
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include <Engine/Math/Placement.h>
|
||
|
#include "Buffer.h"
|
||
|
|
||
|
#define EM_SIZE 256
|
||
|
#define MAX_TICKS_KEPT 20 // data for how many ticks will be accumulated before an error is reported
|
||
|
|
||
|
|
||
|
// max 31 type of messages - stored in the lowest 4 bits of the em_uwType word
|
||
|
// upper 12 bits contain event code, for create and copy messages
|
||
|
#define EMT_CREATE 1
|
||
|
#define EMT_COPY 2
|
||
|
#define EMT_SETPLACEMENT 3
|
||
|
#define EMT_DESTROY 4
|
||
|
#define EMT_EVENT 5
|
||
|
|
||
|
#define EMT_NUMBEROFTYPES 5 // how many different types of messages are there
|
||
|
|
||
|
#define EMB_SUCCESS_OK 0
|
||
|
#define EMB_ERR_MAX_TICKS 1
|
||
|
#define EMB_ERR_NOT_IN_BUFFER 2
|
||
|
#define EMB_ERR_TICK_NOT_COMPLETE 4
|
||
|
#define EMB_ERR_BUFFER_TOO_SMALL 5
|
||
|
#define EMB_ERR_BUFFER_EMPTY 6
|
||
|
|
||
|
|
||
|
|
||
|
class CEntityMessage {
|
||
|
public:
|
||
|
ULONG em_ulType;
|
||
|
UBYTE em_aubMessage[EM_SIZE];
|
||
|
UBYTE em_ubSize;
|
||
|
ULONG em_ulEntityID;
|
||
|
|
||
|
CEntityMessage(){};
|
||
|
~CEntityMessage(){};
|
||
|
|
||
|
void WritePlacement(ULONG &ulEntityID,CPlacement3D &plPlacement);
|
||
|
void ReadPlacement(ULONG &ulEntityID,CPlacement3D &plPlacement);
|
||
|
|
||
|
void WriteEntityCreate(ULONG &ulEntityID,CPlacement3D &plPlacement,UWORD &uwEntityClassID,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
void ReadEntityCreate(ULONG &ulEntityID,CPlacement3D &plPlacement,UWORD &uwEntityClassID,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
|
||
|
void WriteEntityCopy(ULONG &ulSourceEntityID,ULONG &ulTargetEntityID,CPlacement3D &plPlacement,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
void ReadEntityCopy(ULONG &ulSourceEntityID,ULONG &ulTargetEntityID,CPlacement3D &plPlacement,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
|
||
|
void WriteEntityDestroy(ULONG &ulEntityID);
|
||
|
void ReadEntityDestroy(ULONG &ulEntityID);
|
||
|
|
||
|
void WriteEntityEvent(ULONG &ulEntityID,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
void ReadEntityEvent(ULONG &ulEntityID,UWORD &uwEventCode,void* pvEventData,UWORD &uwDataSize);
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
struct TickMarker {
|
||
|
float tm_fTickTime;
|
||
|
SLONG tm_slTickOffset;
|
||
|
UBYTE tm_ubAcknowledgesExpected;
|
||
|
UWORD tm_uwNumMessages;
|
||
|
|
||
|
TickMarker() {
|
||
|
tm_fTickTime = -1;
|
||
|
tm_slTickOffset = -1;
|
||
|
tm_ubAcknowledgesExpected = 0;
|
||
|
tm_uwNumMessages = 0;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// Entity message buffer - stores entity messages - create, copy, destroy, set placement...
|
||
|
class CEMsgBuffer : public CBuffer{
|
||
|
public:
|
||
|
CBuffer emb_bufMsgBuffer; // a buffer to store entity messages in
|
||
|
TickMarker emb_atmTickMarkers[MAX_TICKS_KEPT]; // pointers into the buffer, they point to the first message for eachtick
|
||
|
UWORD emb_uwNumTickMarkers;
|
||
|
INDEX emb_iFirstTickMarker;
|
||
|
INDEX emb_iCurrentTickMarker;
|
||
|
float emb_fCurrentTickTime;
|
||
|
|
||
|
CEMsgBuffer();
|
||
|
~CEMsgBuffer();
|
||
|
|
||
|
virtual void Clear(void);
|
||
|
|
||
|
// expand buffer to be given number of bytes in size
|
||
|
virtual void Expand(SLONG slNewSize);
|
||
|
|
||
|
// write one block
|
||
|
virtual void WriteBytes(const void *pv, SLONG slSize);
|
||
|
SLONG PeekBytes(const void *pv, SLONG slSize);
|
||
|
SLONG PeekBytesAtOffset(const void *pv, SLONG slSize,SLONG &slTickOffset);
|
||
|
|
||
|
int StartNewTick(float fTickTime);
|
||
|
int SetCurrentTick(float fTickTime);
|
||
|
int GetTickIndex(float fTickTime,INDEX &iTickIndex);
|
||
|
int GetTickOffset(float fTickTime,SLONG &slTickOffset);
|
||
|
int GetNextTickTime(float fTickTime,float &fNextTickTime);
|
||
|
int RequestTickAcknowledge(float fTickTime,UBYTE ubNumAcknowledges);
|
||
|
int ReceiveTickAcknowledge(float fTickTime);
|
||
|
int MoveToStartOfTick(float fTickTime);
|
||
|
|
||
|
|
||
|
// write the message from _emEntityMessage to the buffer
|
||
|
void WriteMessage(CEntityMessage &emEntityMessage);
|
||
|
int ReadMessage(CEntityMessage &emEntityMessage);
|
||
|
int PeekMessageAtOffset(CEntityMessage &emEntityMessage,SLONG &slTickOffset);
|
||
|
|
||
|
int ReadTick(float fTickTime,const void *pv, SLONG &slSize);
|
||
|
void WriteTick(float fTickTime,const void *pv, SLONG slSize);
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|