mirror of
https://github.com/Relintai/mesh_data_resource.git
synced 2025-02-20 17:14:31 +01:00
Implemented offsets.
This commit is contained in:
parent
fbf96617e3
commit
5f8ab950b1
@ -35,41 +35,52 @@ void MeshDataResource::set_array(const Array &p_arrays) {
|
|||||||
_arrays = p_arrays.duplicate(true);
|
_arrays = p_arrays.duplicate(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Ref<Shape> > MeshDataResource::get_collision_shapes() {
|
void MeshDataResource::add_collision_shape(const Vector3 &offset, const Ref<Shape> &shape) {
|
||||||
return _collision_shapes;
|
MDRData d;
|
||||||
}
|
|
||||||
void MeshDataResource::set_collision_shapes(const Vector<Ref<Shape> > &shapes) {
|
|
||||||
_collision_shapes = shapes;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshDataResource::add_collision_shape(const Ref<Shape> &shape) {
|
d.offset = offset;
|
||||||
_collision_shapes.push_back(shape);
|
d.shape = shape;
|
||||||
|
|
||||||
|
_collision_shapes.push_back(d);
|
||||||
}
|
}
|
||||||
Ref<Shape> MeshDataResource::get_collision_shape(const int index) {
|
Ref<Shape> MeshDataResource::get_collision_shape(const int index) {
|
||||||
ERR_FAIL_INDEX_V(index, _collision_shapes.size(), Ref<Shape>());
|
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 {
|
int MeshDataResource::get_collision_shape_count() const {
|
||||||
return _collision_shapes.size();
|
return _collision_shapes.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Variant> MeshDataResource::get_collision_shapes_bind() {
|
Vector<Variant> MeshDataResource::get_collision_shapes() {
|
||||||
Vector<Variant> r;
|
Vector<Variant> r;
|
||||||
for (int i = 0; i < _collision_shapes.size(); i++) {
|
for (int i = 0; i < _collision_shapes.size(); i++) {
|
||||||
#if VERSION_MAJOR < 4
|
#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
|
#else
|
||||||
r.push_back(_collision_shapes[i]);
|
r.push_back(_collision_shapes[i].offset);
|
||||||
|
r.push_back(_collision_shapes[i].shape);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return r;
|
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();
|
_collision_shapes.clear();
|
||||||
for (int i = 0; i < p_arrays.size(); i++) {
|
for (int i = 0; i < p_arrays.size(); i += 2) {
|
||||||
Ref<Shape> e = Ref<Shape>(p_arrays[i]);
|
MDRData d;
|
||||||
_collision_shapes.push_back(e);
|
|
||||||
|
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);
|
ClassDB::bind_method(D_METHOD("set_array", "array"), &MeshDataResource::set_array);
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "array"), "set_array", "get_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("get_collision_shapes"), &MeshDataResource::get_collision_shapes);
|
||||||
ClassDB::bind_method(D_METHOD("set_collision_shapes", "array"), &MeshDataResource::set_collision_shapes_bind);
|
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");
|
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);
|
ClassDB::bind_method(D_METHOD("add_collision_shape", "shape"), &MeshDataResource::add_collision_shape);
|
||||||
|
@ -51,25 +51,29 @@ public:
|
|||||||
Array get_array();
|
Array get_array();
|
||||||
void set_array(const Array &p_arrays);
|
void set_array(const Array &p_arrays);
|
||||||
|
|
||||||
Vector<Ref<Shape> > get_collision_shapes();
|
void add_collision_shape(const Vector3 &offset, const Ref<Shape> &shape);
|
||||||
void set_collision_shapes(const Vector<Ref<Shape> > &shapes);
|
|
||||||
|
|
||||||
void add_collision_shape(const Ref<Shape> &shape);
|
|
||||||
Ref<Shape> get_collision_shape(const int index);
|
Ref<Shape> get_collision_shape(const int index);
|
||||||
|
Vector3 get_collision_shape_offset(const int index);
|
||||||
int get_collision_shape_count() const;
|
int get_collision_shape_count() const;
|
||||||
|
|
||||||
Vector<Variant> get_collision_shapes_bind();
|
Vector<Variant> get_collision_shapes();
|
||||||
void set_collision_shapes_bind(const Vector<Variant> &p_arrays);
|
void set_collision_shapes(const Vector<Variant> &p_arrays);
|
||||||
|
|
||||||
MeshDataResource();
|
MeshDataResource();
|
||||||
~MeshDataResource();
|
~MeshDataResource();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct MDRData {
|
||||||
|
Ref<Shape> shape;
|
||||||
|
Vector3 offset;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Array _arrays;
|
Array _arrays;
|
||||||
Vector<Ref<Shape> > _collision_shapes;
|
Vector<MDRData> _collision_shapes;
|
||||||
};
|
};
|
||||||
|
|
||||||
VARIANT_ENUM_CAST(MeshDataResource::ColliderType);
|
VARIANT_ENUM_CAST(MeshDataResource::ColliderType);
|
||||||
|
@ -114,7 +114,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
|
|||||||
Ref<Shape> shape = m->create_trimesh_shape();
|
Ref<Shape> shape = m->create_trimesh_shape();
|
||||||
|
|
||||||
if (!shape.is_null()) {
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
@ -124,7 +124,6 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
|
|||||||
Ref<Shape> shape = mesh->create_convex_shape();
|
Ref<Shape> shape = mesh->create_convex_shape();
|
||||||
|
|
||||||
if (!shape.is_null()) {
|
if (!shape.is_null()) {
|
||||||
mdr->add_collision_shape(scale_shape(shape, scale));
|
|
||||||
}
|
}
|
||||||
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
@ -137,7 +136,9 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
|
|||||||
scale_shape(shapes[j], scale);
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
m.instance();
|
||||||
@ -151,7 +152,7 @@ Error EditorImportColladaMdr::import(const String &p_source_file, const String &
|
|||||||
|
|
||||||
shape->set_extents(size * 0.5);
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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_height(size.y * 0.5);
|
||||||
shape->set_radius(MIN(size.x, size.z) * 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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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_height(size.y * 0.5);
|
||||||
shape->set_radius(MIN(size.x, size.z) * 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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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);
|
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();
|
n->queue_delete();
|
||||||
|
@ -115,7 +115,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
|
|||||||
Ref<Shape> shape = m->create_trimesh_shape();
|
Ref<Shape> shape = m->create_trimesh_shape();
|
||||||
|
|
||||||
if (!shape.is_null()) {
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_SINGLE_CONVEX_COLLISION_SHAPE) {
|
||||||
Ref<ArrayMesh> m;
|
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();
|
Ref<Shape> shape = mesh->create_convex_shape();
|
||||||
|
|
||||||
if (!shape.is_null()) {
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_MULTIPLE_CONVEX_COLLISION_SHAPES) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
@ -138,7 +138,9 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
|
|||||||
scale_shape(shapes[j], scale);
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_BOX) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
m.instance();
|
||||||
@ -152,7 +154,7 @@ Error EditorImportGLTFMdr::import(const String &p_source_file, const String &p_s
|
|||||||
|
|
||||||
shape->set_extents(size * 0.5);
|
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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CAPSULE) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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_height(size.y * 0.5);
|
||||||
shape->set_radius(MIN(size.x, size.z) * 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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_CYLINDER) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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_height(size.y * 0.5);
|
||||||
shape->set_radius(MIN(size.x, size.z) * 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) {
|
} else if (collider_type == MeshDataResource::COLLIDER_TYPE_APPROXIMATED_SPHERE) {
|
||||||
Ref<ArrayMesh> m;
|
Ref<ArrayMesh> m;
|
||||||
m.instance();
|
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);
|
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();
|
n->queue_delete();
|
||||||
|
Loading…
Reference in New Issue
Block a user