Merge pull request #12966 from SaracenOne/convcol

Added 'convcol' flag for importing meshes as convex collision
This commit is contained in:
Rémi Verschelde 2017-11-16 16:38:38 +01:00 committed by GitHub
commit 2070b80fc0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -232,16 +232,26 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Array
} }
} }
if (_teststr(name, "colonly")) { if (_teststr(name, "colonly") || _teststr(name, "convcolonly")) {
if (isroot) if (isroot)
return p_node; return p_node;
MeshInstance *mi = Object::cast_to<MeshInstance>(p_node); MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
if (mi) { if (mi) {
Node *col = mi->create_trimesh_collision_node(); Node *col;
ERR_FAIL_COND_V(!col, NULL);
if (_teststr(name, "colonly")) {
col = mi->create_trimesh_collision_node();
ERR_FAIL_COND_V(!col, NULL);
col->set_name(_fixstr(name, "colonly"));
} else {
col = mi->create_convex_collision_node();
ERR_FAIL_COND_V(!col, NULL);
col->set_name(_fixstr(name, "convcolonly"));
}
col->set_name(_fixstr(name, "colonly"));
Object::cast_to<Spatial>(col)->set_transform(mi->get_transform()); Object::cast_to<Spatial>(col)->set_transform(mi->get_transform());
p_node->replace_by(col); p_node->replace_by(col);
memdelete(p_node); memdelete(p_node);
@ -328,15 +338,25 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Array
rb->add_child(colshape); rb->add_child(colshape);
colshape->set_owner(p_node->get_owner()); colshape->set_owner(p_node->get_owner());
} else if (_teststr(name, "col") && Object::cast_to<MeshInstance>(p_node)) { } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<MeshInstance>(p_node)) {
MeshInstance *mi = Object::cast_to<MeshInstance>(p_node); MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
Node *col;
mi->set_name(_fixstr(name, "col")); if (_teststr(name, "col")) {
Node *col = mi->create_trimesh_collision_node(); mi->set_name(_fixstr(name, "col"));
ERR_FAIL_COND_V(!col, NULL); col = mi->create_trimesh_collision_node();
ERR_FAIL_COND_V(!col, NULL);
col->set_name("col");
} else {
mi->set_name(_fixstr(name, "convcol"));
col = mi->create_convex_collision_node();
ERR_FAIL_COND_V(!col, NULL);
col->set_name("convcol");
}
col->set_name("col");
p_node->add_child(col); p_node->add_child(col);
StaticBody *sb = Object::cast_to<StaticBody>(col); StaticBody *sb = Object::cast_to<StaticBody>(col);
@ -527,26 +547,55 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Array
#endif #endif
} else if (Object::cast_to<MeshInstance>(p_node)) { } else if (Object::cast_to<MeshInstance>(p_node)) {
//last attempt, maybe collision insde the mesh data //last attempt, maybe collision inside the mesh data
MeshInstance *mi = Object::cast_to<MeshInstance>(p_node); MeshInstance *mi = Object::cast_to<MeshInstance>(p_node);
Ref<ArrayMesh> mesh = mi->get_mesh(); Ref<ArrayMesh> mesh = mi->get_mesh();
if (!mesh.is_null()) { if (!mesh.is_null()) {
if (_teststr(mesh->get_name(), "col")) { if (_teststr(mesh->get_name(), "col") || _teststr(mesh->get_name(), "convcol")) {
mesh->set_name(_fixstr(mesh->get_name(), "col"));
Ref<Shape> shape; Ref<Shape> shape;
if (_teststr(mesh->get_name(), "col")) {
mesh->set_name(_fixstr(mesh->get_name(), "col"));
if (collision_map.has(mesh)) { if (collision_map.has(mesh)) {
shape = collision_map[mesh]; shape = collision_map[mesh];
} else { } else {
shape = mesh->create_trimesh_shape(); shape = mesh->create_trimesh_shape();
if (!shape.is_null()) if (!shape.is_null())
collision_map[mesh] = shape; collision_map[mesh] = shape;
}
} else if (_teststr(mesh->get_name(), "convcol")) {
mesh->set_name(_fixstr(mesh->get_name(), "convcol"));
if (collision_map.has(mesh)) {
shape = collision_map[mesh];
} else {
shape = mesh->create_convex_shape();
if (!shape.is_null())
collision_map[mesh] = shape;
}
}
if (!shape.is_null()) {
StaticBody *col = memnew(StaticBody);
CollisionShape *cshape = memnew(CollisionShape);
cshape->set_shape(shape);
col->add_child(cshape);
col->set_transform(mi->get_transform());
col->set_name(mi->get_name());
p_node->replace_by(col);
memdelete(p_node);
p_node = col;
cshape->set_name("shape");
cshape->set_owner(p_node->get_owner());
} }
} }
} }