1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-27 17:28:41 +00:00

Network: Send IEEE floats (#7768)

This commit is contained in:
SmallJoker 2018-12-13 11:20:57 +01:00 committed by Loïc Blot
parent 8471d027b9
commit 839e935ba0
9 changed files with 317 additions and 12 deletions

View file

@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_bloated.h"
#include "exceptions.h" // for SerializationError
#include "debug.h" // for assert
#include "ieee_float.h"
#include "config.h"
#if HAVE_ENDIAN_H
@ -60,6 +61,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define LONG_STRING_MAX_LEN (64 * 1024 * 1024)
extern FloatType g_serialize_f32_type;
#if HAVE_ENDIAN_H
// use machine native byte swapping routines
// Note: memcpy below is optimized out by modern compilers
@ -188,6 +191,25 @@ inline f32 readF1000(const u8 *data)
return (f32)readS32(data) / FIXEDPOINT_FACTOR;
}
inline f32 readF32(const u8 *data)
{
u32 u = readU32(data);
switch (g_serialize_f32_type) {
case FLOATTYPE_SYSTEM: {
f32 f;
memcpy(&f, &u, 4);
return f;
}
case FLOATTYPE_SLOW:
return u32Tof32Slow(u);
case FLOATTYPE_UNKNOWN: // First initialization
g_serialize_f32_type = getFloatSerializationType();
return readF32(data);
}
throw SerializationError("readF32: Unreachable code");
}
inline video::SColor readARGB8(const u8 *data)
{
video::SColor p(readU32(data));
@ -245,6 +267,15 @@ inline v3f readV3F1000(const u8 *data)
return p;
}
inline v3f readV3F32(const u8 *data)
{
v3f p;
p.X = (float)readF32(&data[0]);
p.Y = (float)readF32(&data[4]);
p.Z = (float)readF32(&data[8]);
return p;
}
/////////////// write routines ////////////////
inline void writeU8(u8 *data, u8 i)
@ -259,7 +290,7 @@ inline void writeS8(u8 *data, s8 i)
inline void writeS16(u8 *data, s16 i)
{
writeU16(data, (u16)i);
writeU16(data, (u16)i);
}
inline void writeS32(u8 *data, s32 i)
@ -278,6 +309,23 @@ inline void writeF1000(u8 *data, f32 i)
writeS32(data, i * FIXEDPOINT_FACTOR);
}
inline void writeF32(u8 *data, f32 i)
{
switch (g_serialize_f32_type) {
case FLOATTYPE_SYSTEM: {
u32 u;
memcpy(&u, &i, 4);
return writeU32(data, u);
}
case FLOATTYPE_SLOW:
return writeU32(data, f32Tou32Slow(i));
case FLOATTYPE_UNKNOWN: // First initialization
g_serialize_f32_type = getFloatSerializationType();
return writeF32(data, i);
}
throw SerializationError("writeF32: Unreachable code");
}
inline void writeARGB8(u8 *data, video::SColor p)
{
writeU32(data, p.color);
@ -322,6 +370,13 @@ inline void writeV3F1000(u8 *data, v3f p)
writeF1000(&data[8], p.Z);
}
inline void writeV3F32(u8 *data, v3f p)
{
writeF32(&data[0], p.X);
writeF32(&data[4], p.Y);
writeF32(&data[8], p.Z);
}
////
//// Iostream wrapper for data read/write
////
@ -351,12 +406,14 @@ MAKE_STREAM_READ_FXN(s16, S16, 2);
MAKE_STREAM_READ_FXN(s32, S32, 4);
MAKE_STREAM_READ_FXN(s64, S64, 8);
MAKE_STREAM_READ_FXN(f32, F1000, 4);
MAKE_STREAM_READ_FXN(f32, F32, 4);
MAKE_STREAM_READ_FXN(v2s16, V2S16, 4);
MAKE_STREAM_READ_FXN(v3s16, V3S16, 6);
MAKE_STREAM_READ_FXN(v2s32, V2S32, 8);
MAKE_STREAM_READ_FXN(v3s32, V3S32, 12);
MAKE_STREAM_READ_FXN(v2f, V2F1000, 8);
MAKE_STREAM_READ_FXN(v3f, V3F1000, 12);
MAKE_STREAM_READ_FXN(v3f, V3F32, 12);
MAKE_STREAM_READ_FXN(video::SColor, ARGB8, 4);
MAKE_STREAM_WRITE_FXN(u8, U8, 1);
@ -368,12 +425,14 @@ MAKE_STREAM_WRITE_FXN(s16, S16, 2);
MAKE_STREAM_WRITE_FXN(s32, S32, 4);
MAKE_STREAM_WRITE_FXN(s64, S64, 8);
MAKE_STREAM_WRITE_FXN(f32, F1000, 4);
MAKE_STREAM_WRITE_FXN(f32, F32, 4);
MAKE_STREAM_WRITE_FXN(v2s16, V2S16, 4);
MAKE_STREAM_WRITE_FXN(v3s16, V3S16, 6);
MAKE_STREAM_WRITE_FXN(v2s32, V2S32, 8);
MAKE_STREAM_WRITE_FXN(v3s32, V3S32, 12);
MAKE_STREAM_WRITE_FXN(v2f, V2F1000, 8);
MAKE_STREAM_WRITE_FXN(v3f, V3F1000, 12);
MAKE_STREAM_WRITE_FXN(v3f, V3F32, 12);
MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4);
////