From 17e048a044660916a8b0bae82c15ac5aa0b85734 Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 8 Feb 2025 07:44:55 +0100 Subject: [PATCH] Added a new helper method to TerrainWorld. --- modules/terraman/world/terrain_world.cpp | 13 +++++++++++++ modules/terraman/world/terrain_world.h | 1 + 2 files changed, 14 insertions(+) diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp index cd05a4200..b92f221bf 100644 --- a/modules/terraman/world/terrain_world.cpp +++ b/modules/terraman/world/terrain_world.cpp @@ -876,6 +876,18 @@ Ref TerrainWorld::get_or_create_chunk_at_world_position(const Vect return chunk_get_or_create(x, z); } +Vector2i TerrainWorld::world_position_to_chunk_position(const Vector3 &p_world_position) { + // TODO rework this so it works directly with ints. + + Vector3 pos = p_world_position / get_voxel_scale(); + + //Note: floor is needed to handle negative numbers properly + int x = static_cast(Math::floor(pos.x / get_chunk_size_x())); + int z = static_cast(Math::floor(pos.z / get_chunk_size_z())); + + return Vector2i(x, z); +} + Vector2i TerrainWorld::world_position_to_world_data_position(const Vector3 &world_position) { Vector3 pos = world_position / get_voxel_scale(); @@ -1567,6 +1579,7 @@ void TerrainWorld::_bind_methods() { ClassDB::bind_method(D_METHOD("set_voxel_at_world_position", "world_position", "data", "channel_index", "rebuild"), &TerrainWorld::set_voxel_at_world_position, DEFVAL(true)); ClassDB::bind_method(D_METHOD("get_chunk_at_world_position", "world_position"), &TerrainWorld::get_chunk_at_world_position); ClassDB::bind_method(D_METHOD("get_or_create_chunk_at_world_position", "world_position"), &TerrainWorld::get_or_create_chunk_at_world_position); + ClassDB::bind_method(D_METHOD("world_position_to_chunk_position", "world_position"), &TerrainWorld::world_position_to_chunk_position); ClassDB::bind_method(D_METHOD("world_position_to_world_data_position", "world_position"), &TerrainWorld::world_position_to_world_data_position); ClassDB::bind_method(D_METHOD("get_voxel_at_world_data_position", "world_data_position", "channel_index"), &TerrainWorld::get_voxel_at_world_data_position); diff --git a/modules/terraman/world/terrain_world.h b/modules/terraman/world/terrain_world.h index 54468e86f..5ff26acca 100644 --- a/modules/terraman/world/terrain_world.h +++ b/modules/terraman/world/terrain_world.h @@ -192,6 +192,7 @@ public: void set_voxel_at_world_position(const Vector3 &world_position, const uint8_t data, const int channel_index, const bool rebuild = true); Ref get_chunk_at_world_position(const Vector3 &world_position); Ref get_or_create_chunk_at_world_position(const Vector3 &world_position); + Vector2i world_position_to_chunk_position(const Vector3 &p_world_position); Vector2i world_position_to_world_data_position(const Vector3 &world_position); uint8_t get_voxel_at_world_data_position(const Vector2i &world_data_position, const int channel_index);