Implemented offsets.

This commit is contained in:
Relintai 2020-06-30 14:42:12 +02:00
parent fbf96617e3
commit 5f8ab950b1
4 changed files with 61 additions and 39 deletions

View File

@ -35,41 +35,52 @@ void MeshDataResource::set_array(const Array &p_arrays) {
_arrays = p_arrays.duplicate(true);
}
Vector<Ref<Shape> > MeshDataResource::get_collision_shapes() {
return _collision_shapes;
}
void MeshDataResource::set_collision_shapes(const Vector<Ref<Shape> > &shapes) {
_collision_shapes = shapes;
}
void MeshDataResource::add_collision_shape(const Vector3 &offset, const Ref<Shape> &shape) {
MDRData d;
void MeshDataResource::add_collision_shape(const Ref<Shape> &shape) {
_collision_shapes.push_back(shape);
d.offset = offset;
d.shape = shape;
_collision_shapes.push_back(d);
}
Ref<Shape> MeshDataResource::get_collision_shape(const int index) {
ERR_FAIL_INDEX_V(index, _collision_shapes.size(), Ref<Shape>());
return _collision_shapes[index];
return _collision_shapes[index].shape;
}
Vector3 MeshDataResource::get_collision_shape_offset(const int index) {
ERR_FAIL_INDEX_V(index, _collision_shapes.size(), Vector3());
return _collision_shapes[index].offset;
}
int MeshDataResource::get_collision_shape_count() const {
return _collision_shapes.size();
}
Vector<Variant> MeshDataResource::get_collision_shapes_bind() {
Vector<Variant> MeshDataResource::get_collision_shapes() {
Vector<Variant> r;
for (int i = 0; i < _collision_shapes.size(); i++) {
#if VERSION_MAJOR < 4
r.push_back(_collision_shapes[i].get_ref_ptr());
r.push_back(_collision_shapes[i].offset);
r.push_back(_collision_shapes[i].shape.get_ref_ptr());
#else
r.push_back(_collision_shapes[i]);
r.push_back(_collision_shapes[i].offset);
r.push_back(_collision_shapes[i].shape);
#endif
}
return r;
}
void MeshDataResource::set_collision_shapes_bind(const Vector<Variant> &p_arrays) {
void MeshDataResource::set_collision_shapes(const Vector<Variant> &p_arrays) {
ERR_FAIL_COND(p_arrays.size() % 2 == 1);
_collision_shapes.clear();
for (int i = 0; i < p_arrays.size(); i++) {
Ref<Shape> e = Ref<Shape>(p_arrays[i]);
_collision_shapes.push_back(e);
for (int i = 0; i < p_arrays.size(); i += 2) {
MDRData d;
d.offset = p_arrays[i];
d.shape = Ref<Shape>(p_arrays[i + 1]);
_collision_shapes.push_back(d);
}
}
@ -86,8 +97,8 @@ void MeshDataResource::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_array", "array"), &MeshDataResource::set_array);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "array"), "set_array", "get_array");
ClassDB::bind_method(D_METHOD("get_collision_shapes"), &MeshDataResource::get_collision_shapes_bind);
ClassDB::bind_method(D_METHOD("set_collision_shapes", "array"), &MeshDataResource::set_collision_shapes_bind);
ClassDB::bind_method(D_METHOD("get_collision_shapes"), &MeshDataResource::get_collision_shapes);
ClassDB::bind_method(D_METHOD("set_collision_shapes", "array"), &MeshDataResource::set_collision_shapes);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "collision_shapes"), "set_collision_shapes", "get_collision_shapes");
ClassDB::bind_method(D_METHOD("add_collision_shape", "shape"), &MeshDataResource::add_collision_shape);

View File

@ -51,25 +51,29 @@ public:
Array get_array();
void set_array(const Array &p_arrays);
Vector<Ref<Shape> > get_collision_shapes();
void set_collision_shapes(const Vector<Ref<Shape> > &shapes);
void add_collision_shape(const Ref<Shape> &shape);
void add_collision_shape(const Vector3 &offset, const Ref<Shape> &shape);
Ref<Shape> get_collision_shape(const int index);
Vector3 get_collision_shape_offset(const int index);
int get_collision_shape_count() const;
Vector<Variant> get_collision_shapes_bind();
void set_collision_shapes_bind(const Vector<Variant> &p_arrays);
Vector<Variant> get_collision_shapes();
void set_collision_shapes(const Vector<Variant> &p_arrays);
MeshDataResource();
~MeshDataResource();
protected:
struct MDRData {
Ref<Shape> shape;
Vector3 offset;
};
protected:
static void _bind_methods();
private:
Array _arrays;
Vector<Ref<Shape> > _collision_shapes;
Vector<MDRData> _collision_shapes;
};
VARIANT_ENUM_CAST(MeshDataResource::ColliderType);

View File

@ -114,7 +114,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
Ref<Shape> shape = m->create_trimesh_shape();
if (!shape.is_null()) {
mdr->add_collision_shape(scale_shape(shape, scale));
mdr->add_collision_shape(Vector3(), scale_shape(shape, scale));
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) {
Ref<ArrayMesh> m;
@ -124,7 +124,6 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
Ref<Shape> shape = mesh->create_convex_shape();
if (!shape.is_null()) {
mdr->add_collision_shape(scale_shape(shape, scale));
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) {
Ref<ArrayMesh> m;
@ -137,7 +136,9 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
scale_shape(shapes[j], scale);
}
mdr->set_collision_shapes(shapes);
for (int j = 0; j < shapes.size(); ++j) {
mdr->add_collision_shape(Vector3(), shapes[j]);
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
Ref<ArrayMesh> m;
m.instance();
@ -151,7 +152,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
shape->set_extents(size * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
Ref<ArrayMesh> m;
m.instance();
@ -166,7 +167,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
Ref<ArrayMesh> m;
m.instance();
@ -181,7 +182,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
Ref<ArrayMesh> m;
m.instance();
@ -195,7 +196,9 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5);
mdr->add_collision_shape(shape);
Vector3 mid = aabb.get_size() / 2.0;
mdr->add_collision_shape(aabb.position + mid, shape);
}
n->queue_delete();

View File

@ -115,7 +115,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
Ref<Shape> shape = m->create_trimesh_shape();
if (!shape.is_null()) {
mdr->add_collision_shape(scale_shape(shape, scale));
mdr->add_collision_shape(Vector3(), scale_shape(shape, scale));
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) {
Ref<ArrayMesh> m;
@ -125,7 +125,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
Ref<Shape> shape = mesh->create_convex_shape();
if (!shape.is_null()) {
mdr->add_collision_shape(scale_shape(shape, scale));
mdr->add_collision_shape(Vector3(), scale_shape(shape, scale));
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) {
Ref<ArrayMesh> m;
@ -138,7 +138,9 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
scale_shape(shapes[j], scale);
}
mdr->set_collision_shapes(shapes);
for (int j = 0; j < shapes.size(); ++j) {
mdr->add_collision_shape(Vector3(), shapes[j]);
}
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
Ref<ArrayMesh> m;
m.instance();
@ -152,7 +154,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
shape->set_extents(size * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
Ref<ArrayMesh> m;
m.instance();
@ -167,7 +169,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
Ref<ArrayMesh> m;
m.instance();
@ -182,7 +184,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
shape->set_height(size.y * 0.5);
shape->set_radius(MIN(size.x, size.z) * 0.5);
mdr->add_collision_shape(shape);
mdr->add_collision_shape(aabb.position, shape);
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
Ref<ArrayMesh> m;
m.instance();
@ -196,7 +198,9 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
shape->set_radius(MIN(size.x, MIN(size.y, size.z)) * 0.5);
mdr->add_collision_shape(shape);
Vector3 mid = aabb.get_size() / 2.0;
mdr->add_collision_shape(aabb.position + mid, shape);
}
n->queue_delete();