summaryrefslogtreecommitdiffhomepage
path: root/serialize
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-24 21:25:51 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-24 21:25:51 +0100
commit4251d32844db32330942ed49b38b28aad5dcc34e (patch)
treedfd2611486456357f1ea06fcaeaefad185e46743 /serialize
parentfb0201967310fbaf4f6ddbeebb269acef8951363 (diff)
collision bbox WIP
Diffstat (limited to 'serialize')
-rw-r--r--serialize/world-impl.hpp12
-rw-r--r--serialize/world-reader.cpp10
-rw-r--r--serialize/world-writer.cpp12
3 files changed, 28 insertions, 6 deletions
diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp
index 3403631d..5a43654e 100644
--- a/serialize/world-impl.hpp
+++ b/serialize/world-impl.hpp
@@ -17,14 +17,16 @@
* 3) Serialize scenery. Tile flag (1 << 6) added.
* 4) Scenery dt now stored as fixed-point uint16_t.
* 5) Serialize scenery pixel offset.
+ * 6) Serialize scenery bboxes.
+ * 7) Serialize scenery bbox_size offset.
*/
namespace floormat::Serialize {
-using tilemeta = std::uint8_t;
-using atlasid = std::uint16_t;
-using chunksiz = std::uint16_t;
-using proto_t = std::uint16_t;
+using tilemeta = std::uint8_t;
+using atlasid = std::uint16_t;
+using chunksiz = std::uint16_t;
+using proto_t = std::uint16_t;
namespace {
@@ -35,7 +37,7 @@ template<typename T> constexpr inline T int_max = std::numeric_limits<T>::max();
constexpr inline std::size_t atlas_name_max = 128;
constexpr inline auto null_atlas = (atlasid)-1LL;
-constexpr inline proto_t proto_version = 5;
+constexpr inline proto_t proto_version = 7;
constexpr inline proto_t min_proto_version = 1;
constexpr inline auto chunk_magic = (std::uint16_t)~0xc0d3;
constexpr inline auto scenery_magic = (std::uint16_t)~0xb00b;
diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp
index e108747e..4f31b88b 100644
--- a/serialize/world-reader.cpp
+++ b/serialize/world-reader.cpp
@@ -177,6 +177,16 @@ void reader_state::read_chunks(reader_t& s)
sc.frame.offset[0] << s;
sc.frame.offset[1] << s;
}
+ if (PROTO >= 6) [[likely]]
+ {
+ sc.frame.bbox_size[0] << s;
+ sc.frame.bbox_size[1] << s;
+ }
+ if (PROTO >= 7) [[likely]]
+ {
+ sc.frame.bbox_offset[0] << s;
+ sc.frame.bbox_offset[1] << s;
+ }
if (sc.frame.active)
{
if (PROTO >= 4) [[likely]]
diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp
index 2860a118..6d1a0e94 100644
--- a/serialize/world-writer.cpp
+++ b/serialize/world-writer.cpp
@@ -352,7 +352,11 @@ void writer_state::serialize_chunk(const chunk& c, chunk_coords coord)
id |= meta_long_scenery_bit * sc_exact;
id |= atlasid(scenery.r) << sizeof(atlasid)*8-1-rotation_BITS;
s << id;
- if (!sc_exact || !scenery.offset.isZero())
+ if (constexpr struct scenery default_scenery;
+ !sc_exact ||
+ scenery.offset != default_scenery.offset ||
+ scenery.bbox_size != default_scenery.bbox_size ||
+ scenery.bbox_offset != default_scenery.bbox_offset)
{
fm_assert(scenery.active || scenery.delta == 0);
write_scenery_flags(s, scenery);
@@ -363,6 +367,12 @@ void writer_state::serialize_chunk(const chunk& c, chunk_coords coord)
s << scenery.offset[0];
s << scenery.offset[1];
+ s << scenery.bbox_size[0];
+ s << scenery.bbox_size[1];
+
+ s << scenery.bbox_offset[0];
+ s << scenery.bbox_offset[1];
+
if (scenery.active)
s << scenery.delta;
}