Implement CollisionShape3D.make_convex_from_siblings()
This commit is contained in:
parent
227494be59
commit
5f86aeffe2
|
@ -10,7 +10,7 @@
|
||||||
<link>https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html</link>
|
<link>https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html</link>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="make_convex_from_brothers">
|
<method name="make_convex_from_siblings">
|
||||||
<return type="void">
|
<return type="void">
|
||||||
</return>
|
</return>
|
||||||
<description>
|
<description>
|
||||||
|
|
|
@ -44,23 +44,36 @@
|
||||||
|
|
||||||
//TODO: Implement CylinderShape and HeightMapShape?
|
//TODO: Implement CylinderShape and HeightMapShape?
|
||||||
|
|
||||||
void CollisionShape3D::make_convex_from_brothers() {
|
void CollisionShape3D::make_convex_from_siblings() {
|
||||||
Node *p = get_parent();
|
Node *p = get_parent();
|
||||||
if (!p) {
|
if (!p) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<Vector3> vertices;
|
||||||
|
|
||||||
for (int i = 0; i < p->get_child_count(); i++) {
|
for (int i = 0; i < p->get_child_count(); i++) {
|
||||||
Node *n = p->get_child(i);
|
Node *n = p->get_child(i);
|
||||||
MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(n);
|
MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(n);
|
||||||
if (mi) {
|
if (mi) {
|
||||||
Ref<Mesh> m = mi->get_mesh();
|
Ref<Mesh> m = mi->get_mesh();
|
||||||
if (m.is_valid()) {
|
if (m.is_valid()) {
|
||||||
Ref<Shape3D> s = m->create_convex_shape();
|
for (int j = 0; j < m->get_surface_count(); j++) {
|
||||||
set_shape(s);
|
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) {
|
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("get_shape"), &CollisionShape3D::get_shape);
|
||||||
ClassDB::bind_method(D_METHOD("set_disabled", "enable"), &CollisionShape3D::set_disabled);
|
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("is_disabled"), &CollisionShape3D::is_disabled);
|
||||||
ClassDB::bind_method(D_METHOD("make_convex_from_brothers"), &CollisionShape3D::make_convex_from_brothers);
|
ClassDB::bind_method(D_METHOD("make_convex_from_siblings"), &CollisionShape3D::make_convex_from_siblings);
|
||||||
ClassDB::set_method_flags("CollisionShape3D", "make_convex_from_brothers", METHOD_FLAGS_DEFAULT | METHOD_FLAG_EDITOR);
|
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);
|
ClassDB::bind_method(D_METHOD("_update_debug_shape"), &CollisionShape3D::_update_debug_shape);
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void make_convex_from_brothers();
|
void make_convex_from_siblings();
|
||||||
|
|
||||||
void set_shape(const Ref<Shape3D> &p_shape);
|
void set_shape(const Ref<Shape3D> &p_shape);
|
||||||
Ref<Shape3D> get_shape() const;
|
Ref<Shape3D> get_shape() const;
|
||||||
|
|
Loading…
Reference in New Issue