From 7c95171944b3c0f3e4aa4eb67ecd163ef19c8214 Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 12 Jun 2020 18:36:00 +0200 Subject: [PATCH] Added a MarchingCubes World and Chunk. --- SCsub | 3 + config.py | 3 + register_types.cpp | 7 ++ .../voxel_chunk_marching_cubes.cpp | 81 +++++++++++++++++++ .../voxel_chunk_marching_cubes.h | 42 ++++++++++ .../voxel_world_marching_cubes.cpp | 45 +++++++++++ .../voxel_world_marching_cubes.h | 41 ++++++++++ 7 files changed, 222 insertions(+) create mode 100644 world/marching_cubes/voxel_chunk_marching_cubes.cpp create mode 100644 world/marching_cubes/voxel_chunk_marching_cubes.h create mode 100644 world/marching_cubes/voxel_world_marching_cubes.cpp create mode 100644 world/marching_cubes/voxel_world_marching_cubes.h diff --git a/SCsub b/SCsub index 2a6cbc5..19266af 100644 --- a/SCsub +++ b/SCsub @@ -51,6 +51,9 @@ sources = [ "world/default/voxel_world_default.cpp", "world/default/voxel_chunk_default.cpp", + "world/marching_cubes/voxel_chunk_marching_cubes.cpp", + "world/marching_cubes/voxel_world_marching_cubes.cpp", + "meshers/cubic_mesher/voxel_mesher_cubic.cpp", "meshers/cubic_mesher/voxel_cube_points.cpp", diff --git a/config.py b/config.py index 49045be..174afca 100644 --- a/config.py +++ b/config.py @@ -46,6 +46,9 @@ def get_doc_classes(): "VoxelChunkBlocky", "VoxelMesherLiquidBlocky", + "VoxelWorldMarchingCubes", + "VoxelChunkMarchingCubes", + "VoxelMesherDefault", "VoxelWorldDefault", "VoxelChunkBlocky", diff --git a/register_types.cpp b/register_types.cpp index 252cb63..3ee80c3 100644 --- a/register_types.cpp +++ b/register_types.cpp @@ -61,9 +61,13 @@ SOFTWARE. #include "meshers/blocky/voxel_mesher_blocky.h" #include "meshers/blocky/voxel_mesher_liquid_blocky.h" + #include "world/blocky/voxel_chunk_blocky.h" #include "world/blocky/voxel_world_blocky.h" +#include "world/marching_cubes/voxel_chunk_marching_cubes.h" +#include "world/marching_cubes/voxel_world_marching_cubes.h" + void register_voxelman_types() { ClassDB::register_class(); ClassDB::register_class(); @@ -102,6 +106,9 @@ void register_voxelman_types() { ClassDB::register_class(); ClassDB::register_class(); + ClassDB::register_class(); + ClassDB::register_class(); + ClassDB::register_class(); ClassDB::register_class(); diff --git a/world/marching_cubes/voxel_chunk_marching_cubes.cpp b/world/marching_cubes/voxel_chunk_marching_cubes.cpp new file mode 100644 index 0000000..29dc035 --- /dev/null +++ b/world/marching_cubes/voxel_chunk_marching_cubes.cpp @@ -0,0 +1,81 @@ +/* +Copyright (c) 2019-2020 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "voxel_chunk_marching_cubes.h" + +#include "../../meshers/marching_cubes/voxel_mesher_marching_cubes.h" + +#include "../../defines.h" + +VoxelChunkMarchingCubes::VoxelChunkMarchingCubes() { +} + +VoxelChunkMarchingCubes::~VoxelChunkMarchingCubes() { +} + +void VoxelChunkMarchingCubes::_setup_channels() { + set_channel_count(MAX_DEFAULT_CHANNELS); +} + +void VoxelChunkMarchingCubes::_create_meshers() { + add_mesher(Ref(memnew(VoxelMesherMarchingCubes()))); + //add_liquid_mesher(Ref(memnew(VoxelMesherLiquidMarchingCubes()))); + + for (int i = 0; i < _meshers.size(); ++i) { + Ref mesher = _meshers.get(i); + + ERR_CONTINUE(!mesher.is_valid()); + + mesher->set_lod_size(get_lod_size()); + mesher->set_voxel_scale(get_voxel_scale()); + + Ref md = mesher; + + if (md.is_valid()) { + md->set_build_flags(get_build_flags()); + } + } + + /* + for (int i = 0; i < _liquid_meshers.size(); ++i) { + Ref mesher = _liquid_meshers.get(i); + + ERR_CONTINUE(!mesher.is_valid()); + + mesher->set_lod_size(get_lod_size()); + mesher->set_voxel_scale(get_voxel_scale()); + + Ref md = mesher; + + if (md.is_valid()) { + md->set_build_flags(get_build_flags()); + } + }*/ +} + +void VoxelChunkMarchingCubes::_bind_methods() { + ADD_PROPERTYI(PropertyInfo(Variant::POOL_BYTE_ARRAY, "data_channel"), "set_channel_compressed", "get_channel_compressed", 0); + ADD_PROPERTYI(PropertyInfo(Variant::POOL_BYTE_ARRAY, "isolevel_channel"), "set_channel_compressed", "get_channel_compressed", 1); + + //ClassDB::bind_method(D_METHOD("get_channel_compressed", "channel_index"), &VoxelChunk::get_channel_compressed); + //ClassDB::bind_method(D_METHOD("set_channel_compressed", "channel_index", "array"), &VoxelChunk::set_channel_compressed); +} diff --git a/world/marching_cubes/voxel_chunk_marching_cubes.h b/world/marching_cubes/voxel_chunk_marching_cubes.h new file mode 100644 index 0000000..d895be7 --- /dev/null +++ b/world/marching_cubes/voxel_chunk_marching_cubes.h @@ -0,0 +1,42 @@ +/* +Copyright (c) 2019-2020 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef VOXEL_CHUNK_MARCHING_CUBES_H +#define VOXEL_CHUNK_MARCHING_CUBES_H + +#include "../default/voxel_chunk_default.h" + +class VoxelChunkMarchingCubes : public VoxelChunkDefault { + GDCLASS(VoxelChunkMarchingCubes, VoxelChunkDefault); + +public: + VoxelChunkMarchingCubes(); + ~VoxelChunkMarchingCubes(); + +protected: + virtual void _setup_channels(); + virtual void _create_meshers(); + + static void _bind_methods(); +}; + +#endif diff --git a/world/marching_cubes/voxel_world_marching_cubes.cpp b/world/marching_cubes/voxel_world_marching_cubes.cpp new file mode 100644 index 0000000..0ed035e --- /dev/null +++ b/world/marching_cubes/voxel_world_marching_cubes.cpp @@ -0,0 +1,45 @@ +/* +Copyright (c) 2019-2020 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "voxel_world_marching_cubes.h" + +#include "voxel_chunk_marching_cubes.h" + +Ref VoxelWorldMarchingCubes::_create_chunk(int x, int y, int z, Ref chunk) { + + if (!chunk.is_valid()) { + chunk = Ref(memnew(VoxelChunkMarchingCubes)); + } + + return VoxelWorld::_create_chunk(x, y, z, chunk); +} + +VoxelWorldMarchingCubes::VoxelWorldMarchingCubes() { + set_data_margin_start(1); + set_data_margin_end(2); +} + +VoxelWorldMarchingCubes ::~VoxelWorldMarchingCubes() { +} + +void VoxelWorldMarchingCubes::_bind_methods() { +} \ No newline at end of file diff --git a/world/marching_cubes/voxel_world_marching_cubes.h b/world/marching_cubes/voxel_world_marching_cubes.h new file mode 100644 index 0000000..82d396a --- /dev/null +++ b/world/marching_cubes/voxel_world_marching_cubes.h @@ -0,0 +1,41 @@ +/* +Copyright (c) 2019-2020 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef VOXEL_WORLD_MARCHING_CUBES_H +#define VOXEL_WORLD_MARCHING_CUBES_H + +#include "../default/voxel_world_default.h" + +class VoxelWorldMarchingCubes : public VoxelWorldDefault { + GDCLASS(VoxelWorldMarchingCubes, VoxelWorldDefault); + +public: + VoxelWorldMarchingCubes(); + ~VoxelWorldMarchingCubes(); + +protected: + Ref _create_chunk(int x, int y, int z, Ref p_chunk); + + static void _bind_methods(); +}; + +#endif