Added automatically approximated simple shape collider generation to the importers. (They don't have offset support yet. Soon.)

This commit is contained in:
Relintai 2020-06-30 12:49:29 +02:00
parent f06da26b6b
commit fbf96617e3
4 changed files with 121 additions and 1 deletions

View File

@ -24,7 +24,7 @@ SOFTWARE.
#include "core/version.h"
const String MeshDataResource::BINDING_STRING_COLLIDER_TYPE = "None,Trimesh Collision Shape,Single Convex Collision Shape,Multiple Convex Collision Shapes";
const String MeshDataResource::BINDING_STRING_COLLIDER_TYPE = "None,Trimesh Collision Shape,Single Convex Collision Shape,Multiple Convex Collision Shapes,Approximated Box,Approximated Capsule,Approximated Cylinder,Approximated Sphere";
Array MeshDataResource::get_array() {
return _arrays;

View File

@ -41,6 +41,10 @@ public:
COLLIDER_TYPE_TRIMESH_COLLISION_SHAPE,
COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE,
COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES,
COLLIDER_TYPE_APPROXIMATED_BOX,
COLLIDER_TYPE_APPROXIMATED_CAPSULE,
COLLIDER_TYPE_APPROXIMATED_CYLINDER,
COLLIDER_TYPE_APPROXIMATED_SPHERE,
};
public:

View File

@ -138,6 +138,64 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
}
mdr->set_collision_shapes(shapes);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<BoxShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_extents(size * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<CapsuleShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<CylinderShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<SphereShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5);
mdr->add_collision_shape(shape);
}
n->queue_delete();

View File

@ -139,6 +139,64 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
}
mdr->set_collision_shapes(shapes);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<BoxShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_extents(size * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<CapsuleShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<CylinderShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
Ref<ArrayMesh> m;
m.instance();
m->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, mdr->get_array());
Ref<SphereShape> shape;
shape.instance();
AABB aabb = m->get_aabb();
Vector3 size = aabb.get_size();
shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5);
mdr->add_collision_shape(shape);
}
n->queue_delete();