mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-04-10 13:52:38 +02:00
Ported: Fix navmesh baking, fixes #57148
- improved mesh data calculation from standalone static colliders so that no
VisualServer calls are performed - and thus no VS mutexes need to
be locked in case of on-thread baking
- improved the same for GridMap's static colliders
- Scony
3035b9c44c
This commit is contained in:
parent
7747a3e85a
commit
35eabcb846
@ -122,6 +122,28 @@ void NavigationMeshGenerator::_add_mesh(const Ref<Mesh> &p_mesh, const Transform
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NavigationMeshGenerator::_add_mesh_array(const Array &p_array, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices) {
|
||||||
|
PoolVector<Vector3> mesh_vertices = p_array[Mesh::ARRAY_VERTEX];
|
||||||
|
PoolVector<Vector3>::Read vr = mesh_vertices.read();
|
||||||
|
|
||||||
|
PoolVector<int> mesh_indices = p_array[Mesh::ARRAY_INDEX];
|
||||||
|
PoolVector<int>::Read ir = mesh_indices.read();
|
||||||
|
|
||||||
|
const int face_count = mesh_indices.size() / 3;
|
||||||
|
const int current_vertex_count = p_vertices.size() / 3;
|
||||||
|
|
||||||
|
for (int j = 0; j < mesh_vertices.size(); j++) {
|
||||||
|
_add_vertex(p_xform.xform(vr[j]), p_vertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < face_count; j++) {
|
||||||
|
// CCW
|
||||||
|
p_indices.push_back(current_vertex_count + (ir[j * 3 + 0]));
|
||||||
|
p_indices.push_back(current_vertex_count + (ir[j * 3 + 2]));
|
||||||
|
p_indices.push_back(current_vertex_count + (ir[j * 3 + 1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NavigationMeshGenerator::_add_faces(const PoolVector3Array &p_faces, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices) {
|
void NavigationMeshGenerator::_add_faces(const PoolVector3Array &p_faces, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices) {
|
||||||
int face_count = p_faces.size() / 3;
|
int face_count = p_faces.size() / 3;
|
||||||
int current_vertex_count = p_vertices.size() / 3;
|
int current_vertex_count = p_vertices.size() / 3;
|
||||||
@ -172,43 +194,38 @@ void NavigationMeshGenerator::_parse_geometry(const Transform &p_navmesh_xform,
|
|||||||
|
|
||||||
Transform transform = p_navmesh_xform * static_body->get_global_transform() * col_shape->get_transform();
|
Transform transform = p_navmesh_xform * static_body->get_global_transform() * col_shape->get_transform();
|
||||||
|
|
||||||
Ref<Mesh> mesh;
|
|
||||||
Ref<Shape> s = col_shape->get_shape();
|
Ref<Shape> s = col_shape->get_shape();
|
||||||
|
|
||||||
BoxShape *box = Object::cast_to<BoxShape>(*s);
|
BoxShape *box = Object::cast_to<BoxShape>(*s);
|
||||||
if (box) {
|
if (box) {
|
||||||
Ref<CubeMesh> cube_mesh;
|
Array arr;
|
||||||
cube_mesh.instance();
|
arr.resize(VS::ARRAY_MAX);
|
||||||
cube_mesh->set_size(box->get_extents() * 2.0);
|
CubeMesh::create_mesh_array(arr, box->get_extents() * 2.0);
|
||||||
mesh = cube_mesh;
|
_add_mesh_array(arr, transform, p_vertices, p_indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
CapsuleShape *capsule = Object::cast_to<CapsuleShape>(*s);
|
CapsuleShape *capsule = Object::cast_to<CapsuleShape>(*s);
|
||||||
if (capsule) {
|
if (capsule) {
|
||||||
Ref<CapsuleMesh> capsule_mesh;
|
Array arr;
|
||||||
capsule_mesh.instance();
|
arr.resize(VS::ARRAY_MAX);
|
||||||
capsule_mesh->set_radius(capsule->get_radius());
|
CapsuleMesh::create_mesh_array(arr, capsule->get_radius(), capsule->get_height() / 2.0);
|
||||||
capsule_mesh->set_mid_height(capsule->get_height() / 2.0);
|
_add_mesh_array(arr, transform, p_vertices, p_indices);
|
||||||
mesh = capsule_mesh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CylinderShape *cylinder = Object::cast_to<CylinderShape>(*s);
|
CylinderShape *cylinder = Object::cast_to<CylinderShape>(*s);
|
||||||
if (cylinder) {
|
if (cylinder) {
|
||||||
Ref<CylinderMesh> cylinder_mesh;
|
Array arr;
|
||||||
cylinder_mesh.instance();
|
arr.resize(VS::ARRAY_MAX);
|
||||||
cylinder_mesh->set_height(cylinder->get_height());
|
CylinderMesh::create_mesh_array(arr, cylinder->get_radius(), cylinder->get_radius(), cylinder->get_height());
|
||||||
cylinder_mesh->set_bottom_radius(cylinder->get_radius());
|
_add_mesh_array(arr, transform, p_vertices, p_indices);
|
||||||
cylinder_mesh->set_top_radius(cylinder->get_radius());
|
|
||||||
mesh = cylinder_mesh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SphereShape *sphere = Object::cast_to<SphereShape>(*s);
|
SphereShape *sphere = Object::cast_to<SphereShape>(*s);
|
||||||
if (sphere) {
|
if (sphere) {
|
||||||
Ref<SphereMesh> sphere_mesh;
|
Array arr;
|
||||||
sphere_mesh.instance();
|
arr.resize(VS::ARRAY_MAX);
|
||||||
sphere_mesh->set_radius(sphere->get_radius());
|
SphereMesh::create_mesh_array(arr, sphere->get_radius(), sphere->get_radius() * 2.0);
|
||||||
sphere_mesh->set_height(sphere->get_radius() * 2.0);
|
_add_mesh_array(arr, transform, p_vertices, p_indices);
|
||||||
mesh = sphere_mesh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ConcavePolygonShape *concave_polygon = Object::cast_to<ConcavePolygonShape>(*s);
|
ConcavePolygonShape *concave_polygon = Object::cast_to<ConcavePolygonShape>(*s);
|
||||||
@ -239,10 +256,6 @@ void NavigationMeshGenerator::_parse_geometry(const Transform &p_navmesh_xform,
|
|||||||
_add_faces(faces, transform, p_vertices, p_indices);
|
_add_faces(faces, transform, p_vertices, p_indices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mesh.is_valid()) {
|
|
||||||
_add_mesh(mesh, transform, p_vertices, p_indices);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,7 @@ protected:
|
|||||||
|
|
||||||
static void _add_vertex(const Vector3 &p_vec3, Vector<float> &p_vertices);
|
static void _add_vertex(const Vector3 &p_vec3, Vector<float> &p_vertices);
|
||||||
static void _add_mesh(const Ref<Mesh> &p_mesh, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices);
|
static void _add_mesh(const Ref<Mesh> &p_mesh, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices);
|
||||||
|
static void _add_mesh_array(const Array &p_array, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices);
|
||||||
static void _add_faces(const PoolVector3Array &p_faces, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices);
|
static void _add_faces(const PoolVector3Array &p_faces, const Transform &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices);
|
||||||
static void _parse_geometry(const Transform &p_navmesh_xform, Node *p_node, Vector<float> &p_vertices, Vector<int> &p_indices, int p_generate_from, uint32_t p_collision_mask, bool p_recurse_children);
|
static void _parse_geometry(const Transform &p_navmesh_xform, Node *p_node, Vector<float> &p_vertices, Vector<int> &p_indices, int p_generate_from, uint32_t p_collision_mask, bool p_recurse_children);
|
||||||
|
|
||||||
|
@ -270,6 +270,10 @@ PrimitiveMesh::~PrimitiveMesh() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
|
void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
|
create_mesh_array(p_arr, radius, mid_height, radial_segments, rings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CapsuleMesh::create_mesh_array(Array &p_arr, const float radius, const float mid_height, const int radial_segments, const int rings) {
|
||||||
int i, j, prevrow, thisrow, point;
|
int i, j, prevrow, thisrow, point;
|
||||||
float x, y, z, u, v, w;
|
float x, y, z, u, v, w;
|
||||||
float onethird = 1.0 / 3.0;
|
float onethird = 1.0 / 3.0;
|
||||||
@ -481,6 +485,10 @@ CapsuleMesh::CapsuleMesh() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void CubeMesh::_create_mesh_array(Array &p_arr) const {
|
void CubeMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
|
create_mesh_array(p_arr, size, subdivide_w, subdivide_h, subdivide_d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CubeMesh::create_mesh_array(Array &p_arr, const Vector3 size, const int subdivide_w, const int subdivide_h, const int subdivide_d) {
|
||||||
int i, j, prevrow, thisrow, point;
|
int i, j, prevrow, thisrow, point;
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
float onethird = 1.0 / 3.0;
|
float onethird = 1.0 / 3.0;
|
||||||
@ -738,6 +746,10 @@ CubeMesh::CubeMesh() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void CylinderMesh::_create_mesh_array(Array &p_arr) const {
|
void CylinderMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
|
create_mesh_array(p_arr, top_radius, bottom_radius, height, radial_segments, rings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CylinderMesh::create_mesh_array(Array &p_arr, float top_radius, float bottom_radius, float height, int radial_segments, int rings) {
|
||||||
int i, j, prevrow, thisrow, point;
|
int i, j, prevrow, thisrow, point;
|
||||||
float x, y, z, u, v, radius;
|
float x, y, z, u, v, radius;
|
||||||
|
|
||||||
@ -1453,6 +1465,10 @@ Vector3 QuadMesh::get_center_offset() const {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void SphereMesh::_create_mesh_array(Array &p_arr) const {
|
void SphereMesh::_create_mesh_array(Array &p_arr) const {
|
||||||
|
create_mesh_array(p_arr, radius, height, radial_segments, rings, is_hemisphere);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SphereMesh::create_mesh_array(Array &p_arr, float radius, float height, int radial_segments, int rings, bool is_hemisphere) {
|
||||||
int i, j, prevrow, thisrow, point;
|
int i, j, prevrow, thisrow, point;
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
|
||||||
|
@ -110,6 +110,8 @@ protected:
|
|||||||
virtual void _create_mesh_array(Array &p_arr) const;
|
virtual void _create_mesh_array(Array &p_arr) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static void create_mesh_array(Array &p_arr, float radius, float mid_height, int radial_segments = 64, int rings = 8);
|
||||||
|
|
||||||
void set_radius(const float p_radius);
|
void set_radius(const float p_radius);
|
||||||
float get_radius() const;
|
float get_radius() const;
|
||||||
|
|
||||||
@ -142,6 +144,8 @@ protected:
|
|||||||
virtual void _create_mesh_array(Array &p_arr) const;
|
virtual void _create_mesh_array(Array &p_arr) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static void create_mesh_array(Array &p_arr, Vector3 size, int subdivide_w = 0, int subdivide_h = 0, int subdivide_d = 0);
|
||||||
|
|
||||||
void set_size(const Vector3 &p_size);
|
void set_size(const Vector3 &p_size);
|
||||||
Vector3 get_size() const;
|
Vector3 get_size() const;
|
||||||
|
|
||||||
@ -176,6 +180,8 @@ protected:
|
|||||||
virtual void _create_mesh_array(Array &p_arr) const;
|
virtual void _create_mesh_array(Array &p_arr) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static void create_mesh_array(Array &p_arr, float top_radius, float bottom_radius, float height, int radial_segments = 64, int rings = 4);
|
||||||
|
|
||||||
void set_top_radius(const float p_radius);
|
void set_top_radius(const float p_radius);
|
||||||
float get_top_radius() const;
|
float get_top_radius() const;
|
||||||
|
|
||||||
@ -305,6 +311,8 @@ protected:
|
|||||||
virtual void _create_mesh_array(Array &p_arr) const;
|
virtual void _create_mesh_array(Array &p_arr) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static void create_mesh_array(Array &p_arr, float radius, float height, int radial_segments = 64, int rings = 32, bool is_hemisphere = false);
|
||||||
|
|
||||||
void set_radius(const float p_radius);
|
void set_radius(const float p_radius);
|
||||||
float get_radius() const;
|
float get_radius() const;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user