diff --git a/modules/props/prop_instance.cpp b/modules/props/prop_instance.cpp index fcef14a04..8b35ab3a6 100644 --- a/modules/props/prop_instance.cpp +++ b/modules/props/prop_instance.cpp @@ -3,6 +3,7 @@ #include "../mesh_data_resource/nodes/mesh_data_instance.h" #include "scene/3d/light.h" +#include "scene/3d/physics_body.h" #include "modules/modules_enabled.gen.h" @@ -14,6 +15,7 @@ #include "./props/prop_data_light.h" #include "./props/prop_data_prop.h" #include "./props/prop_data_scene.h" +#include "./props/prop_data_static_body.h" #include "./props/prop_data_tiled_wall.h" #include "tiled_wall/tiled_wall.h" @@ -23,8 +25,9 @@ Ref PropInstance::get_prop_data() { return _prop_data; } void PropInstance::set_prop_data(const Ref &data) { - if (_prop_data == data) + if (_prop_data == data) { return; + } _prop_data = data; @@ -103,8 +106,9 @@ void PropInstance::_build() { } } - if (!_prop_data.is_valid()) + if (!_prop_data.is_valid()) { return; + } prop_preprocess(Transform(), _prop_data); } @@ -130,8 +134,9 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref &pr for (int i = 0; i < count; ++i) { Ref e = prop->get_prop(i); - if (!e.is_valid()) + if (!e.is_valid()) { continue; + } Transform t = transform * e->get_transform(); @@ -140,8 +145,9 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref &pr if (prop_entry_data.is_valid()) { Ref p = prop_entry_data->get_prop(); - if (!p.is_valid()) + if (!p.is_valid()) { continue; + } prop_preprocess(t, p); @@ -170,8 +176,9 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref &pr if (scene_data.is_valid()) { Ref sc = scene_data->get_scene(); - if (!sc.is_valid()) + if (!sc.is_valid()) { continue; + } Node *n = sc->instance(); add_child(n); @@ -197,14 +204,24 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref &pr continue; } + Ref static_body_data = e; + + if (static_body_data.is_valid()) { + Node *static_body = static_body_data->processor_get_node_for(t); + add_child(static_body); + + continue; + } + #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED Ref mesh_data = e; if (mesh_data.is_valid()) { Ref mdr = mesh_data->get_mesh(); - if (!mdr.is_valid()) + if (!mdr.is_valid()) { continue; + } MeshDataInstance *mdi = memnew(MeshDataInstance); add_child(mdi); diff --git a/modules/props/prop_instance_merger.cpp b/modules/props/prop_instance_merger.cpp index d22f34b33..37d0f13e3 100644 --- a/modules/props/prop_instance_merger.cpp +++ b/modules/props/prop_instance_merger.cpp @@ -30,6 +30,8 @@ #include "./props/prop_data_light.h" #include "./props/prop_data_prop.h" #include "./props/prop_data_scene.h" +#include "./props/prop_data_static_body.h" + #include "jobs/prop_mesher_job_step.h" #include "lights/prop_light.h" #include "material_cache/prop_material_cache.h" @@ -599,6 +601,22 @@ void PropInstanceMerger::_prop_preprocess(Transform transform, const Ref static_body_data = e; + + if (static_body_data.is_valid()) { + for (int j = 0; j < static_body_data->get_collision_shape_count(); ++j) { + Ref collision_shape = static_body_data->get_collision_shape(j); + + if (collision_shape.is_valid()) { + Transform et = t * static_body_data->get_collision_shape_transform(j); + + _job->add_collision_shape(collision_shape, et, true); + } + } + + continue; + } + Ref tiled_wall_data = e; if (tiled_wall_data.is_valid()) { diff --git a/modules/props/props/prop_data_entry.cpp b/modules/props/props/prop_data_entry.cpp index e4347fecc..12bc7a912 100644 --- a/modules/props/props/prop_data_entry.cpp +++ b/modules/props/props/prop_data_entry.cpp @@ -43,8 +43,9 @@ void PropDataEntry::set_transform(const Transform &value) { #ifdef MODULE_TEXTURE_PACKER_ENABLED void PropDataEntry::add_textures_into(Ref texture_packer) { - if (has_method("_add_textures_into")) + if (has_method("_add_textures_into")) { call("_add_textures_into", texture_packer); + } } #endif diff --git a/modules/props/props/prop_data_static_body.cpp b/modules/props/props/prop_data_static_body.cpp index d2c0243c1..7875c0bb5 100644 --- a/modules/props/props/prop_data_static_body.cpp +++ b/modules/props/props/prop_data_static_body.cpp @@ -73,7 +73,7 @@ void PropDataStaticBody::_processor_process(Ref prop_data, Node *node, Node *PropDataStaticBody::_processor_get_node_for(const Transform &transform) { StaticBody *sb = memnew(StaticBody); - sb->set_transform(get_transform()); + sb->set_transform(transform); sb->set_physics_material_override(_physics_material_override); sb->set_constant_linear_velocity(_constant_linear_velocity); sb->set_constant_angular_velocity(_constant_angular_velocity);