diff --git a/mesh_data_resource.cpp b/mesh_data_resource.cpp index 3983567..54b2da2 100644 --- a/mesh_data_resource.cpp +++ b/mesh_data_resource.cpp @@ -35,41 +35,52 @@ void MeshDataResource::set_array(const Array &p_arrays) { _arrays = p_arrays.duplicate(true); } -Vector > MeshDataResource::get_collision_shapes() { - return _collision_shapes; -} -void MeshDataResource::set_collision_shapes(const Vector > &shapes) { - _collision_shapes = shapes; -} +void MeshDataResource::add_collision_shape(const Vector3 &offset, const Ref &shape) { + MDRData d; -void MeshDataResource::add_collision_shape(const Ref &shape) { - _collision_shapes.push_back(shape); + d.offset = offset; + d.shape = shape; + + _collision_shapes.push_back(d); } Ref MeshDataResource::get_collision_shape(const int index) { ERR_FAIL_INDEX_V(index, _collision_shapes.size(), Ref()); - return _collision_shapes[index]; + return _collision_shapes[index].shape; +} +Vector3 MeshDataResource::get_collision_shape_offset(const int index) { + ERR_FAIL_INDEX_V(index, _collision_shapes.size(), Vector3()); + + return _collision_shapes[index].offset; } int MeshDataResource::get_collision_shape_count() const { return _collision_shapes.size(); } -Vector MeshDataResource::get_collision_shapes_bind() { +Vector MeshDataResource::get_collision_shapes() { Vector r; for (int i = 0; i < _collision_shapes.size(); i++) { #if VERSION_MAJOR < 4 - r.push_back(_collision_shapes[i].get_ref_ptr()); + r.push_back(_collision_shapes[i].offset); + r.push_back(_collision_shapes[i].shape.get_ref_ptr()); #else - r.push_back(_collision_shapes[i]); + r.push_back(_collision_shapes[i].offset); + r.push_back(_collision_shapes[i].shape); #endif } return r; } -void MeshDataResource::set_collision_shapes_bind(const Vector &p_arrays) { +void MeshDataResource::set_collision_shapes(const Vector &p_arrays) { + ERR_FAIL_COND(p_arrays.size() % 2 == 1); + _collision_shapes.clear(); - for (int i = 0; i < p_arrays.size(); i++) { - Ref e = Ref(p_arrays[i]); - _collision_shapes.push_back(e); + for (int i = 0; i < p_arrays.size(); i += 2) { + MDRData d; + + d.offset = p_arrays[i]; + d.shape = Ref(p_arrays[i + 1]); + + _collision_shapes.push_back(d); } } @@ -86,8 +97,8 @@ void MeshDataResource::_bind_methods() { ClassDB::bind_method(D_METHOD("set_array", "array"), &MeshDataResource::set_array); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "array"), "set_array", "get_array"); - ClassDB::bind_method(D_METHOD("get_collision_shapes"), &MeshDataResource::get_collision_shapes_bind); - ClassDB::bind_method(D_METHOD("set_collision_shapes", "array"), &MeshDataResource::set_collision_shapes_bind); + ClassDB::bind_method(D_METHOD("get_collision_shapes"), &MeshDataResource::get_collision_shapes); + ClassDB::bind_method(D_METHOD("set_collision_shapes", "array"), &MeshDataResource::set_collision_shapes); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "collision_shapes"), "set_collision_shapes", "get_collision_shapes"); ClassDB::bind_method(D_METHOD("add_collision_shape", "shape"), &MeshDataResource::add_collision_shape); diff --git a/mesh_data_resource.h b/mesh_data_resource.h index dcbb65e..600903c 100644 --- a/mesh_data_resource.h +++ b/mesh_data_resource.h @@ -51,25 +51,29 @@ public: Array get_array(); void set_array(const Array &p_arrays); - Vector > get_collision_shapes(); - void set_collision_shapes(const Vector > &shapes); - - void add_collision_shape(const Ref &shape); + void add_collision_shape(const Vector3 &offset, const Ref &shape); Ref get_collision_shape(const int index); + Vector3 get_collision_shape_offset(const int index); int get_collision_shape_count() const; - Vector get_collision_shapes_bind(); - void set_collision_shapes_bind(const Vector &p_arrays); + Vector get_collision_shapes(); + void set_collision_shapes(const Vector &p_arrays); MeshDataResource(); ~MeshDataResource(); +protected: + struct MDRData { + Ref shape; + Vector3 offset; + }; + protected: static void _bind_methods(); private: Array _arrays; - Vector > _collision_shapes; + Vector _collision_shapes; }; VARIANT_ENUM_CAST(MeshDataResource::ColliderType); diff --git a/plugin_collada/editor_import_collada_mdr.cpp b/plugin_collada/editor_import_collada_mdr.cpp index ecf7ef3..1a70bb7 100644 --- a/plugin_collada/editor_import_collada_mdr.cpp +++ b/plugin_collada/editor_import_collada_mdr.cpp @@ -114,7 +114,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & Ref shape = m->create_trimesh_shape(); if (!shape.is_null()) { - mdr->add_collision_shape(scale_shape(shape, scale)); + mdr->add_collision_shape(Vector3(), scale_shape(shape, scale)); } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) { Ref m; @@ -124,7 +124,6 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & Ref shape = mesh->create_convex_shape(); if (!shape.is_null()) { - mdr->add_collision_shape(scale_shape(shape, scale)); } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) { Ref m; @@ -137,7 +136,9 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & scale_shape(shapes[j], scale); } - mdr->set_collision_shapes(shapes); + for (int j = 0; j < shapes.size(); ++j) { + mdr->add_collision_shape(Vector3(), shapes[j]); + } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) { Ref m; m.instance(); @@ -151,7 +152,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & shape->set_extents(size * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) { Ref m; m.instance(); @@ -166,7 +167,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & shape->set_height(size.y * 0.5); shape->set_radius(MIN(size.x, size.z) * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) { Ref m; m.instance(); @@ -181,7 +182,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & shape->set_height(size.y * 0.5); shape->set_radius(MIN(size.x, size.z) * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) { Ref m; m.instance(); @@ -195,7 +196,9 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String & shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5); - mdr->add_collision_shape(shape); + Vector3 mid = aabb.get_size() / 2.0; + + mdr->add_collision_shape(aabb.position + mid, shape); } n->queue_delete(); diff --git a/plugin_gltf/editor_import_gltf_mdr.cpp b/plugin_gltf/editor_import_gltf_mdr.cpp index 5c18198..ea7cea9 100644 --- a/plugin_gltf/editor_import_gltf_mdr.cpp +++ b/plugin_gltf/editor_import_gltf_mdr.cpp @@ -115,7 +115,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s Ref shape = m->create_trimesh_shape(); if (!shape.is_null()) { - mdr->add_collision_shape(scale_shape(shape, scale)); + mdr->add_collision_shape(Vector3(), scale_shape(shape, scale)); } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) { Ref m; @@ -125,7 +125,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s Ref shape = mesh->create_convex_shape(); if (!shape.is_null()) { - mdr->add_collision_shape(scale_shape(shape, scale)); + mdr->add_collision_shape(Vector3(), scale_shape(shape, scale)); } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) { Ref m; @@ -138,7 +138,9 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s scale_shape(shapes[j], scale); } - mdr->set_collision_shapes(shapes); + for (int j = 0; j < shapes.size(); ++j) { + mdr->add_collision_shape(Vector3(), shapes[j]); + } } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) { Ref m; m.instance(); @@ -152,7 +154,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s shape->set_extents(size * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) { Ref m; m.instance(); @@ -167,7 +169,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s shape->set_height(size.y * 0.5); shape->set_radius(MIN(size.x, size.z) * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) { Ref m; m.instance(); @@ -182,7 +184,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s shape->set_height(size.y * 0.5); shape->set_radius(MIN(size.x, size.z) * 0.5); - mdr->add_collision_shape(shape); + mdr->add_collision_shape(aabb.position, shape); } else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) { Ref m; m.instance(); @@ -196,7 +198,9 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5); - mdr->add_collision_shape(shape); + Vector3 mid = aabb.get_size() / 2.0; + + mdr->add_collision_shape(aabb.position + mid, shape); } n->queue_delete();