Implement CollisionShape3D.make_convex_from_siblings()

This commit is contained in:
hoontee 2020-08-05 03:51:41 -05:00
parent 227494be59
commit 5f86aeffe2
3 changed files with 20 additions and 7 deletions

View File

@ -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>

View File

@ -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);

View File

@ -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;