diff --git a/modules/terraman/world/terrain_world.cpp b/modules/terraman/world/terrain_world.cpp index 176946f6d..e28facf25 100644 --- a/modules/terraman/world/terrain_world.cpp +++ b/modules/terraman/world/terrain_world.cpp @@ -33,6 +33,8 @@ #include "core/containers/hash_set.h" +#include "core/object/method_bind_ext.gen.inc" + #include "core/object/message_queue.h" #include "core/os/main_loop.h" #include "terrain_chunk.h" @@ -59,6 +61,10 @@ #include "scene/3d/camera.h" #endif +#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED +#include "modules/mesh_data_resource/mesh_data_resource.h" +#endif + const String TerrainWorld::BINDING_STRING_CHANNEL_TYPE_INFO = "Type,Isolevel,Liquid,Liquid Level"; bool TerrainWorld::get_active() const { @@ -734,6 +740,30 @@ void TerrainWorld::prop_add(Transform transform, const Ref &prop, cons } #endif +#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED +void TerrainWorld::mesh_data_resource_add(const Ref &p_mesh, const Transform &p_transform, const Ref &p_texture, const Color &p_color, const bool p_original, const String &p_name) { + ERR_FAIL_COND(!p_mesh.is_valid()); + + Vector3 wp; + wp = p_transform.xform(wp); + Ref chunk = get_or_create_chunk_at_world_position(wp); + + chunk->mesh_data_resource_add(chunk->get_global_transform().affine_inverse() * p_transform, p_mesh, p_texture, p_color, false, p_original, p_name); + chunk->build(); +} + +void TerrainWorld::mesh_data_resource_add_material(const Ref &p_mesh, const Transform &p_transform, const Ref &p_texture, const Ref &p_material, const bool p_original, const String &p_name) { + ERR_FAIL_COND(!p_mesh.is_valid()); + + Vector3 wp; + wp = p_transform.xform(wp); + Ref chunk = get_or_create_chunk_at_world_position(wp); + + chunk->mesh_data_resource_add_material(chunk->get_global_transform().affine_inverse() * p_transform, p_mesh, p_texture, p_material, false, p_original, p_name); + chunk->build(); +} +#endif + //Lights void TerrainWorld::light_add(const Ref &light) { if (!light.is_valid()) { @@ -1625,6 +1655,11 @@ void TerrainWorld::_bind_methods() { ClassDB::bind_method(D_METHOD("prop_add", "transform", "prop", "apply_voxel_scale", "original", "name"), &TerrainWorld::prop_add, DEFVAL(true), DEFVAL(true), DEFVAL(String())); #endif +#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED + ClassDB::bind_method(D_METHOD("mesh_data_resource_add", "mesh", "transform", "texture", "color", "original", "name"), &TerrainWorld::mesh_data_resource_add, DEFVAL(Ref()), DEFVAL(Color(1, 1, 1, 1)), DEFVAL(true), DEFVAL(String())); + ClassDB::bind_method(D_METHOD("mesh_data_resource_add_material", "mesh", "transform", "texture", "material", "original", "name"), &TerrainWorld::mesh_data_resource_add_material, DEFVAL(Ref()), DEFVAL(Color(1, 1, 1, 1)), DEFVAL(true), DEFVAL(String())); +#endif + //Lights ClassDB::bind_method(D_METHOD("light_add", "chunk"), &TerrainWorld::light_add); ClassDB::bind_method(D_METHOD("light_remove", "chunk"), &TerrainWorld::light_remove); diff --git a/modules/terraman/world/terrain_world.h b/modules/terraman/world/terrain_world.h index 9c0810a31..e73e491a5 100644 --- a/modules/terraman/world/terrain_world.h +++ b/modules/terraman/world/terrain_world.h @@ -54,6 +54,7 @@ class TerrainStructure; class TerrainChunk; class PropData; +class MeshDataResource; class TerrainWorld : public Spatial { GDCLASS(TerrainWorld, Spatial); @@ -181,6 +182,11 @@ public: void prop_add(Transform transform, const Ref &prop, const bool apply_voxel_scale = true, const bool p_original = true, const String &p_name = String()); #endif +#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED + void mesh_data_resource_add(const Ref &p_mesh, const Transform &p_transform, const Ref &p_texture = Ref(), const Color &p_color = Color(1, 1, 1, 1), const bool p_original = true, const String &p_name = String()); + void mesh_data_resource_add_material(const Ref &p_mesh, const Transform &p_transform, const Ref &p_texture = Ref(), const Ref &p_material = Ref(), const bool p_original = true, const String &p_name = String()); +#endif + //Lights void light_add(const Ref &light); void light_remove(const Ref &light);