3es  0.7
3esmessages.h
1 //
2 // author: Kazys Stepanas
3 //
4 #ifndef _3ESMESSAGES_H_
5 #define _3ESMESSAGES_H_
6 
7 #include "3es-core.h"
8 
9 #include "3espacketreader.h"
10 #include "3espacketwriter.h"
11 
12 #include <cinttypes>
13 #include <cstring>
14 
15 namespace tes
16 {
22  {
23  MtNull,
24  MtServerInfo,
25  MtControl,
26  MtCollatedPacket,
27 
28  // TODO: Move MtMesh and MtMaterial into a resources set.
29  MtMesh,
30  MtCamera,
31  MtCategory,
34 
38  UserIDStart = 2048
39  };
40 
43  {
44  SIdSphere = ShapeHandlersIDStart,
45  SIdBox,
46  SIdCone,
47  SIdCylinder,
48  SIdCapsule,
49  SIdPlane,
50  SIdStar,
51  SIdArrow,
52  SIdMeshShape,
53  SIdMeshSet,
54  SIdPointCloud,
55  SIdText3D,
56  SIdText2D,
57 
58  SIdBuiltInLast = SIdText2D
59  };
60 
62  enum ControlId
63  {
64  CIdNull,
71  };
72 
75  {
77  };
78 
81  {
82  OIdNull,
83  OIdCreate,
84  OIdUpdate,
85  OIdDestroy,
86  OIdData
87  };
88 
90  enum
91  {
92  OFNone = 0,
93  OFWire = (1 << 0),
94  OFTransparent = (1 << 1),
95  OFTwoSided = (1 << 2),
96 
97  OFUpdateMode = (1 << 3),
98  OFPosition = (1 << 4),
99  OFRotation = (1 << 5),
100  OFScale = (1 << 6),
101  OFColour = (1 << 7),
103 
104  OFUser = (1 << 12)
105  };
106 
109  {
110  PAFNone = 0,
111  PAFNormals = (1 << 0),
112  PAFColours = (1 << 1)
113  };
114 
117  {
119  };
122 
125  {
127  };
128 
131  {
133  };
134 
137  {
138  UFNone = 0,
139  UFInterpolate = (1 << 0)
143  };
144 
147  {
148  CPFCompress = (1<<0),
149  };
150 
153  {
155  CFFramePersist = (1 << 0),
156  };
157 
160  struct _3es_coreAPI ServerInfoMessage
161  {
168  uint64_t timeUnit;
182  uint8_t reserved[35];
183 
187  inline bool read(PacketReader &reader)
188  {
189  bool ok = true;
190  ok = reader.readElement(timeUnit) == sizeof(timeUnit) && ok;
191  ok = reader.readElement(coordinateFrame) == sizeof(coordinateFrame) && ok;
192  ok = reader.readArray(reserved, sizeof(reserved) / sizeof(reserved[0])) == sizeof(reserved) / sizeof(reserved[0]) && ok;
193  return ok;
194  }
195 
199  inline bool write(PacketWriter &writer) const
200  {
201  bool ok = true;
202  ok = writer.writeElement(timeUnit) == sizeof(timeUnit) && ok;
203  ok = writer.writeElement(defaultFrameTime) == sizeof(defaultFrameTime) && ok;
204  ok = writer.writeElement(coordinateFrame) == sizeof(coordinateFrame) && ok;
205  ok = writer.writeArray(reserved, sizeof(reserved) / sizeof(reserved[0])) == sizeof(reserved) / sizeof(reserved[0]) && ok;
206  return ok;
207  }
208  };
209 
212  void _3es_coreAPI initDefaultServerInfo(ServerInfoMessage *info);
213 
215  struct _3es_coreAPI ControlMessage
216  {
218  uint32_t controlFlags;
220  uint32_t value32;
222  uint64_t value64;
223 
227  inline bool read(PacketReader &reader)
228  {
229  bool ok = true;
230  ok = reader.readElement(controlFlags) == sizeof(controlFlags) && ok;
231  ok = reader.readElement(value32) == sizeof(value32) && ok;
232  ok = reader.readElement(value64) == sizeof(value64) && ok;
233  return ok;
234  }
235 
239  inline bool write(PacketWriter &writer) const
240  {
241  bool ok = true;
242  ok = writer.writeElement(controlFlags) == sizeof(controlFlags) && ok;
243  ok = writer.writeElement(value32) == sizeof(value32) && ok;
244  ok = writer.writeElement(value64) == sizeof(value64) && ok;
245  return ok;
246  }
247  };
248 
250  struct _3es_coreAPI CategoryNameMessage
251  {
253  enum { MessageId = CMIdName };
255  uint16_t categoryId;
257  uint16_t parentId;
259  uint16_t defaultActive;
261  uint16_t nameLength;
264  const char *name;
265 
270  inline bool read(PacketReader &reader, char *nameBuffer, size_t nameBufferSize)
271  {
272  bool ok = true;
273  ok = reader.readElement(categoryId) == sizeof(categoryId) && ok;
274  ok = reader.readElement(parentId) == sizeof(parentId) && ok;
275  ok = reader.readElement(defaultActive) == sizeof(defaultActive) && ok;
276  ok = reader.readElement(nameLength) == sizeof(nameLength) && ok;
277  name = nameBuffer;
278 
279  if (!nameBuffer && nameLength || nameLength + 1 > nameBufferSize)
280  {
281  return false;
282  }
283 
284  reader.readRaw((uint8_t *)nameBuffer, nameLength);
285  nameBuffer[nameLength] = '\0';
286 
287  return ok;
288  }
289 
293  inline bool write(PacketWriter &writer) const
294  {
295  bool ok = true;
296  uint16_t nameLength = (uint16_t)((name) ? strlen(name) : 0);
297  ok = writer.writeElement(categoryId) == sizeof(categoryId) && ok;
298  ok = writer.writeElement(parentId) == sizeof(parentId) && ok;
299  ok = writer.writeElement(defaultActive) == sizeof(defaultActive) && ok;
300  ok = writer.writeElement(nameLength) == sizeof(nameLength) && ok;
301  if (nameLength > 0)
302  {
303  if (name)
304  {
305  ok = writer.writeRaw((const uint8_t *)name, nameLength) == nameLength && ok;
306  }
307  else
308  {
309  ok = false;
310  }
311  }
312  return ok;
313  }
314  };
315 
317  struct _3es_coreAPI CollatedPacketMessage
318  {
320  uint16_t flags;
322  uint16_t reserved;
325 
329  inline bool read(PacketReader &reader)
330  {
331  bool ok = true;
332  ok = reader.readElement(flags) == sizeof(flags) && ok;
333  ok = reader.readElement(reserved) == sizeof(reserved) && ok;
334  ok = reader.readElement(uncompressedBytes) == sizeof(uncompressedBytes) && ok;
335  return ok;
336  }
337 
341  inline bool write(PacketWriter &writer) const
342  {
343  bool ok = true;
344  ok = writer.writeElement(flags) == sizeof(flags) && ok;
345  ok = writer.writeElement(reserved) == sizeof(reserved) && ok;
346  ok = writer.writeElement(uncompressedBytes) == sizeof(uncompressedBytes) && ok;
347  return ok;
348  }
349  };
350 
353  struct _3es_coreAPI ObjectAttributes
354  {
355  uint32_t colour;
356  float position[3];
357  float rotation[4];
358  float scale[3];
359 
361  inline void identity()
362  {
363  colour = 0xffffffffu;
364  position[0] = position[1] = position[2] =
365  rotation[0] = rotation[1] = rotation[2] = 0.0f;
366  rotation[3] = 1.0f;
367  scale[0] = scale[1] = scale[2] = 1.0f;
368  }
369 
373  inline bool read(PacketReader &reader)
374  {
375  bool ok = true;
376  ok = reader.readElement(colour) == sizeof(colour) && ok;
377  ok = reader.readArray(&position[0], 3) == 3 && ok;
378  ok = reader.readArray(&rotation[0], 4) == 4 && ok;
379  ok = reader.readArray(&scale[0], 3) == 3 && ok;
380  return ok;
381  }
382 
386  inline bool write(PacketWriter &writer) const
387  {
388  bool ok = true;
389  ok = writer.writeElement(colour) == sizeof(colour) && ok;
390  ok = writer.writeArray(&position[0], 3) == 3 && ok;
391  ok = writer.writeArray(&rotation[0], 4) == 4 && ok;
392  ok = writer.writeArray(&scale[0], 3) == 3 && ok;
393  return ok;
394  }
395  };
396 
399  struct _3es_coreAPI CreateMessage
400  {
402  enum { MessageId = OIdCreate };
403 
404  uint32_t id;
405  uint16_t category;
406  uint16_t flags;
407  uint16_t reserved;
409 
415  inline bool read(PacketReader &reader)
416  {
417  bool ok = true;
418  ok = reader.readElement(id) == sizeof(id) && ok;
419  ok = reader.readElement(category) == sizeof(category) && ok;
420  ok = reader.readElement(flags) == sizeof(flags) && ok;
421  ok = reader.readElement(reserved) == sizeof(reserved) && ok;
422  ok = attributes.read(reader) && ok;
423  return ok;
424  }
425 
429  inline bool write(PacketWriter &writer) const
430  {
431  bool ok = true;
432  ok = writer.writeElement(id) == sizeof(id) && ok;
433  ok = writer.writeElement(category) == sizeof(category) && ok;
434  ok = writer.writeElement(flags) == sizeof(flags) && ok;
435  ok = writer.writeElement(reserved) == sizeof(reserved) && ok;
436  ok = attributes.write(writer) && ok;
437  return ok;
438  }
439  };
440 
445  struct _3es_coreAPI DataMessage
446  {
448  enum { MessageId = OIdData };
449 
450  uint32_t id;
451 
457  inline bool read(PacketReader &reader)
458  {
459  bool ok = true;
460  ok = reader.readElement(id) == sizeof(id) && ok;
461  return ok;
462  }
463 
467  inline bool write(PacketWriter &writer) const
468  {
469  bool ok = true;
470  ok = writer.writeElement(id) == sizeof(id) && ok;
471  return ok;
472  }
473  };
474 
477  struct _3es_coreAPI UpdateMessage
478  {
480  enum { MessageId = OIdUpdate };
481 
482  uint32_t id;
483  uint16_t flags;
485 
491  inline bool read(PacketReader &reader)
492  {
493  bool ok = true;
494  ok = reader.readElement(id) == sizeof(id) && ok;
495  ok = reader.readElement(flags) == sizeof(flags) && ok;
496  ok = attributes.read(reader) && ok;
497  return ok;
498  }
499 
503  inline bool write(PacketWriter &writer) const
504  {
505  bool ok = true;
506  ok = writer.writeElement(id) == sizeof(id) && ok;
507  ok = writer.writeElement(flags) == sizeof(flags) && ok;
508  ok = attributes.write(writer) && ok;
509  return ok;
510  }
511  };
512 
514  struct _3es_coreAPI DestroyMessage
515  {
517  enum { MessageId = OIdDestroy };
518 
519  uint32_t id;
520 
526  inline bool read(PacketReader &reader)
527  {
528  bool ok = true;
529  ok = reader.readElement(id) == sizeof(id) && ok;
530  return ok;
531  }
532 
536  inline bool write(PacketWriter &writer) const
537  {
538  bool ok = true;
539  ok = writer.writeElement(id) == sizeof(id) && ok;
540  return ok;
541  }
542  };
543 }
544 
545 #endif // _3ESMESSAGES_H_
uint16_t flags
Message flags. See CollatedPacketFlag.
Definition: 3esmessages.h:320
Set the total number of frames to expect (value32). More for serialised streams.
Definition: 3esmessages.h:67
uint32_t colour
Initial object colour.
Definition: 3esmessages.h:355
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:239
uint32_t id
Id of the object to update data.
Definition: 3esmessages.h:450
ControlFlag
Flags for various ControlId messages.
Definition: 3esmessages.h:152
bool read(PacketReader &reader)
Read message content.
Definition: 3esmessages.h:526
ObjectAttributes attributes
Initial transformation and colour.
Definition: 3esmessages.h:484
size_t writeArray(const uint8_t *bytes, size_t elementSize, size_t elementCount)
Writes an array of data items from the current position.
Position is given in world space and mapped to screen space.
Definition: 3esmessages.h:118
Text is oriented to face the screen.
Definition: 3esmessages.h:126
Update attributes using only explicitly specified flags from the following.
Definition: 3esmessages.h:97
uint16_t reserved
Reserved: must be zero.
Definition: 3esmessages.h:322
Per point normals.
Definition: 3esmessages.h:111
uint16_t flags
Update flags from ObjectFlag.
Definition: 3esmessages.h:483
size_t readRaw(uint8_t *bytes, size_t byteCount)
Reads raw bytes from the packet at the current position up to byteCount.
Information about the server.
Definition: 3esmessages.h:160
uint16_t nameLength
Number of bytes in name, excluding a null terminator.
Definition: 3esmessages.h:261
ObjectMessageId
Object/shape management message ID. Used with ShapeHandlerIDs routing IDs.
Definition: 3esmessages.h:80
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:386
Specifies the a change in coordinate frame view.
Definition: 3esmessages.h:66
uint32_t controlFlags
Flags particular to this type of control message.
Definition: 3esmessages.h:218
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:199
uint8_t coordinateFrame
Specifies the CoordinateFrame used by this server.
Definition: 3esmessages.h:179
void identity()
Set to an identity transform coloured white.
Definition: 3esmessages.h:361
uint16_t parentId
The (new) parent category for categoryId. Zero for none.
Definition: 3esmessages.h:257
Text2DFlag
ObjectFlag extensions for Text2D rendering.
Definition: 3esmessages.h:116
Clear the scene. This drops all existing data.
Definition: 3esmessages.h:69
No flags.
Definition: 3esmessages.h:138
bool read(PacketReader &reader)
Read message content.
Definition: 3esmessages.h:457
A update message is identical in header to a CreateMessage.
Definition: 3esmessages.h:477
uint32_t id
Id of the object to create. Zero for transient objects.
Definition: 3esmessages.h:404
Use a two sided shader.
Definition: 3esmessages.h:95
uint32_t id
Object creation id. Zero if defining a transient/single frame message.
Definition: 3esmessages.h:482
size_t writeRaw(const uint8_t *bytes, size_t byteCount)
Writes raw bytes from the packet at the current position up to byteCount.
Text3DFlag
ObjectFlag extensions for Text2D rendering.
Definition: 3esmessages.h:124
Definition: 3esbounds.h:13
Update rotation data.
Definition: 3esmessages.h:99
CollatedPacketFlag
Flags for CollatedPacketMessage.
Definition: 3esmessages.h:146
First ID for renderers.
Definition: 3esmessages.h:36
No flags. Default appearance.
Definition: 3esmessages.h:92
UpdateFlag
Flags controlling the creation and appearance of an object.
Definition: 3esmessages.h:136
uint32_t defaultFrameTime
The default time delta between frames to used when none is specified.
Definition: 3esmessages.h:175
MeshShapeFlag
ObjectFlag extensions for MeshShape.
Definition: 3esmessages.h:130
The object supports transparency. Use the colour alpha channel.
Definition: 3esmessages.h:94
uint64_t timeUnit
Specifies the time unit in a CIdFrame ControlMessage.
Definition: 3esmessages.h:168
Update position data.
Definition: 3esmessages.h:98
A packet collation message header.
Definition: 3esmessages.h:317
No additional data (points only)
Definition: 3esmessages.h:110
Update colour data.
Definition: 3esmessages.h:101
bool read(PacketReader &reader)
Read this message from reader.
Definition: 3esmessages.h:329
Contains core object attributes.
Definition: 3esmessages.h:353
Category name message.
Definition: 3esmessages.h:250
ControlId
Message IDs for a ControlMessage.
Definition: 3esmessages.h:62
uint32_t id
Id of the object to destroy, matching the CreateMessage id.
Definition: 3esmessages.h:519
Forces a frame update (render) without advancing the time.
Definition: 3esmessages.h:68
Request a frame snapshot during playback. value32 is the frame number to snap.
Definition: 3esmessages.h:70
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:467
bool read(PacketReader &reader)
Read this message from reader.
Definition: 3esmessages.h:227
size_t readArray(uint8_t *bytes, size_t elementSize, size_t elementCount)
Reads an array of data items from the current position.
Defines an object data message.
Definition: 3esmessages.h:445
Defines an object creation message.
Definition: 3esmessages.h:399
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:536
uint32_t value32
32-bit value particular to this type of control message.
Definition: 3esmessages.h:220
uint16_t reserved
Reserved for future use.
Definition: 3esmessages.h:407
Extension. NYI.
Definition: 3esmessages.h:33
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:503
First user ID.
Definition: 3esmessages.h:38
uint16_t flags
Flags controlling the appearance and creation of the object.
Definition: 3esmessages.h:406
uint16_t category
Object categorisation. Used to control visibility.
Definition: 3esmessages.h:405
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:429
Show the object as a wireframe mesh.
Definition: 3esmessages.h:93
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:341
Category name definition.
Definition: 3esmessages.h:76
uint16_t categoryId
Identifies the category for the message.
Definition: 3esmessages.h:255
Message to destroy an exiting object by id and type.
Definition: 3esmessages.h:514
const char * name
The name string without a null terminator.
Definition: 3esmessages.h:264
MessageTypeIDs
List of routing IDs of common, built in message handlers.
Definition: 3esmessages.h:21
size_t readElement(uint8_t *bytes, size_t elementSize)
Reads a single data element from the current position.
uint64_t value64
32-bit value particular to this type of control message.
Definition: 3esmessages.h:222
bool read(PacketReader &reader)
Read this message from reader.
Definition: 3esmessages.h:373
bool read(PacketReader &reader)
Read message content.
Definition: 3esmessages.h:415
Defines a new frame. value32 is the delta time in microseconds.
Definition: 3esmessages.h:65
bool write(PacketWriter &writer) const
Write this message to writer.
Definition: 3esmessages.h:293
A system control message.
Definition: 3esmessages.h:215
Update scale data.
Definition: 3esmessages.h:100
CategoryMessageId
Message IDs for MtCategory routing.
Definition: 3esmessages.h:74
bool read(PacketReader &reader)
Read this message from reader.
Definition: 3esmessages.h:187
bool read(PacketReader &reader, char *nameBuffer, size_t nameBufferSize)
Read message content.
Definition: 3esmessages.h:270
ObjectAttributes attributes
Initial transformation and colour.
Definition: 3esmessages.h:408
A utility class for writing payload data to a PacketHeader.
Definition: 3espacketwriter.h:34
uint16_t defaultActive
Default categoryId to active? Non zero for yes (1).
Definition: 3esmessages.h:259
Per point colours.
Definition: 3esmessages.h:112
ShapeHandlerIDs
Default/built in renderers (routing IDs).
Definition: 3esmessages.h:42
uint32_t uncompressedBytes
Number of uncompressed bytes in the payload.
Definition: 3esmessages.h:324
PointsAttributeFlag
Additional attributes for point data sources.
Definition: 3esmessages.h:108
Calculate normals and rendering with lighting.
Definition: 3esmessages.h:132
size_t writeElement(const uint8_t *bytes, size_t elementSize)
Writes a single data element from the current position.
bool read(PacketReader &reader)
Read message content.
Definition: 3esmessages.h:491
Flag for CIdFrame indicating transient objects should be maintained and not flushed for this frame...
Definition: 3esmessages.h:155
Transition to the new position, colour, etc., is interpolated over the render frames.
Definition: 3esmessages.h:142
A utility class for dealing with reading packets.
Definition: 3espacketreader.h:18
Spelling alias for colour.
Definition: 3esmessages.h:102
void _3es_coreAPI initDefaultServerInfo(ServerInfoMessage *info)
Initialise info to the defaults.
Use flags start here.
Definition: 3esmessages.h:104