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:
parent
8471d027b9
commit
839e935ba0
9 changed files with 317 additions and 12 deletions
|
@ -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);
|
||||
|
||||
////
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue