summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chunk-collision.cpp2
-rw-r--r--src/chunk-scenery.cpp13
-rw-r--r--src/chunk-scenery.hpp9
-rw-r--r--src/chunk.hpp9
4 files changed, 24 insertions, 9 deletions
diff --git a/src/chunk-collision.cpp b/src/chunk-collision.cpp
index dfb0fdd6..2c612576 100644
--- a/src/chunk-collision.cpp
+++ b/src/chunk-collision.cpp
@@ -155,7 +155,7 @@ void chunk::_replace_bbox(const bbox& x0, const bbox& x1, bool b0, bool b1)
bool chunk::can_place_entity(const entity_proto& proto, local_coords pos)
{
- (void)ensure_scenery_mesh({});
+ (void)ensure_scenery_mesh();
const auto center = Vector2(pos)*TILE_SIZE2 + Vector2(proto.offset) + Vector2(proto.bbox_offset),
min = center - Vector2(proto.bbox_size/2), max = min + Vector2(proto.bbox_size);
diff --git a/src/chunk-scenery.cpp b/src/chunk-scenery.cpp
index f2c1c80a..bbb26709 100644
--- a/src/chunk-scenery.cpp
+++ b/src/chunk-scenery.cpp
@@ -9,9 +9,12 @@
namespace floormat {
-auto chunk::ensure_scenery_mesh(Array<entity_draw_order>&& array) noexcept -> scenery_mesh_tuple
+auto chunk::ensure_scenery_mesh() noexcept -> scenery_mesh_tuple
{
- return ensure_scenery_mesh(static_cast<Array<entity_draw_order>&>(array));
+ Array<entity_draw_order> array;
+ std::vector<std::array<vertex, 4>> scenery_vertexes;
+ std::vector<std::array<UnsignedShort, 6>> scenery_indexes;
+ return ensure_scenery_mesh({array, scenery_vertexes, scenery_indexes});
}
bool chunk::topo_sort_data::intersects(const topo_sort_data& o) const
@@ -124,12 +127,15 @@ auto chunk::make_topo_sort_data(entity& e, uint32_t mesh_idx) -> topo_sort_data
return data;
}
-auto chunk::ensure_scenery_mesh(Array<entity_draw_order>& array) noexcept -> scenery_mesh_tuple
+auto chunk::ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept -> scenery_mesh_tuple
{
fm_assert(_entities_sorted);
if (_scenery_modified)
{
+ auto& scenery_vertexes = buffers.scenery_vertexes;
+ auto& scenery_indexes = buffers.scenery_indexes;
+
_scenery_modified = false;
const auto count = fm_begin(
@@ -173,6 +179,7 @@ auto chunk::ensure_scenery_mesh(Array<entity_draw_order>& array) noexcept -> sce
}
const auto size = _entities.size();
+ auto& array = buffers.array;
ensure_scenery_draw_array(array);
uint32_t j = 0;
for (uint32_t i = 0; const auto& e : _entities)
diff --git a/src/chunk-scenery.hpp b/src/chunk-scenery.hpp
index 1363479b..5657b536 100644
--- a/src/chunk-scenery.hpp
+++ b/src/chunk-scenery.hpp
@@ -19,6 +19,7 @@ struct chunk::topo_sort_data
bool intersects(const topo_sort_data& other) const;
};
+
struct chunk::entity_draw_order
{
entity *e;
@@ -26,10 +27,18 @@ struct chunk::entity_draw_order
float ord;
topo_sort_data data;
};
+
struct chunk::scenery_mesh_tuple {
GL::Mesh& mesh;
ArrayView<entity_draw_order> array;
size_t size;
};
+struct chunk::scenery_scratch_buffers
+{
+ Array<entity_draw_order>& array;
+ std::vector<std::array<vertex, 4>>& scenery_vertexes;
+ std::vector<std::array<UnsignedShort, 6>>& scenery_indexes;
+};
+
} // namespace floormat
diff --git a/src/chunk.hpp b/src/chunk.hpp
index c98ae9a3..b1d445ef 100644
--- a/src/chunk.hpp
+++ b/src/chunk.hpp
@@ -84,6 +84,7 @@ struct chunk final
struct topo_sort_data;
struct entity_draw_order;
struct scenery_mesh_tuple;
+ struct scenery_scratch_buffers;
struct vertex {
Vector3 position;
@@ -97,8 +98,9 @@ struct chunk final
tile_atlas* ground_atlas_at(size_t i) const noexcept;
wall_mesh_tuple ensure_wall_mesh() noexcept;
tile_atlas* wall_atlas_at(size_t i) const noexcept;
- scenery_mesh_tuple ensure_scenery_mesh(Array<entity_draw_order>&& array) noexcept;
- scenery_mesh_tuple ensure_scenery_mesh(Array<entity_draw_order>& array) noexcept;
+
+ scenery_mesh_tuple ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept;
+ scenery_mesh_tuple ensure_scenery_mesh() noexcept;
void ensure_passability() noexcept;
RTree* rtree() noexcept;
@@ -121,9 +123,6 @@ private:
std::array<variant_t, TILE_COUNT*2> _wall_variants = {};
std::vector<std::shared_ptr<entity>> _entities;
- std::vector<std::array<UnsignedShort, 6>> scenery_indexes; // todo move to anim_mesh
- std::vector<std::array<vertex, 4>> scenery_vertexes; // same
-
struct world* _world;
GL::Mesh ground_mesh{NoCreate}, wall_mesh{NoCreate}, scenery_mesh{NoCreate};