Browse Source

Merge pull request #41044 from hoontee/master-4

Implement CollisionShape3D.make_convex_from_siblings()
Rémi Verschelde 5 năm trước cách đây
mục cha
commit
0864f12f0d

+ 1 - 1
doc/classes/CollisionShape3D.xml

@@ -10,7 +10,7 @@
 		<link title="Physics introduction">https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html</link>
 	</tutorials>
 	<methods>
-		<method name="make_convex_from_brothers">
+		<method name="make_convex_from_siblings">
 			<return type="void">
 			</return>
 			<description>

+ 18 - 5
scene/3d/collision_shape_3d.cpp

@@ -44,23 +44,36 @@
 
 //TODO: Implement CylinderShape and HeightMapShape?
 
-void CollisionShape3D::make_convex_from_brothers() {
+void CollisionShape3D::make_convex_from_siblings() {
 	Node *p = get_parent();
 	if (!p) {
 		return;
 	}
 
+	Vector<Vector3> vertices;
+
 	for (int i = 0; i < p->get_child_count(); i++) {
 		Node *n = p->get_child(i);
 		MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(n);
 		if (mi) {
 			Ref<Mesh> m = mi->get_mesh();
 			if (m.is_valid()) {
-				Ref<Shape3D> s = m->create_convex_shape();
-				set_shape(s);
+				for (int j = 0; j < m->get_surface_count(); j++) {
+					Array a = m->surface_get_arrays(j);
+					if (!a.empty()) {
+						Vector<Vector3> v = a[RenderingServer::ARRAY_VERTEX];
+						for (int k = 0; k < v.size(); k++) {
+							vertices.append(mi->get_transform().xform(v[k]));
+						}
+					}
+				}
 			}
 		}
 	}
+
+	Ref<ConvexPolygonShape3D> shape = memnew(ConvexPolygonShape3D);
+	shape->set_points(vertices);
+	set_shape(shape);
 }
 
 void CollisionShape3D::_update_in_shape_owner(bool p_xform_only) {
@@ -137,8 +150,8 @@ void CollisionShape3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_shape"), &CollisionShape3D::get_shape);
 	ClassDB::bind_method(D_METHOD("set_disabled", "enable"), &CollisionShape3D::set_disabled);
 	ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionShape3D::is_disabled);
-	ClassDB::bind_method(D_METHOD("make_convex_from_brothers"), &CollisionShape3D::make_convex_from_brothers);
-	ClassDB::set_method_flags("CollisionShape3D", "make_convex_from_brothers", METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR);
+	ClassDB::bind_method(D_METHOD("make_convex_from_siblings"), &CollisionShape3D::make_convex_from_siblings);
+	ClassDB::set_method_flags("CollisionShape3D", "make_convex_from_siblings", METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR);
 
 	ClassDB::bind_method(D_METHOD("_update_debug_shape"), &CollisionShape3D::_update_debug_shape);
 

+ 1 - 1
scene/3d/collision_shape_3d.h

@@ -60,7 +60,7 @@ protected:
 	static void _bind_methods();
 
 public:
-	void make_convex_from_brothers();
+	void make_convex_from_siblings();
 
 	void set_shape(const Ref<Shape3D> &p_shape);
 	Ref<Shape3D> get_shape() const;