1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Expose TriangleMesh api functions wrapped for scripting

Adds script wrapped TriangleMesh api functions to create and query the triangle BVH tree.
This commit is contained in:
smix8
2025-03-25 19:43:15 +01:00
parent c7ea8614d7
commit f2197a1013
5 changed files with 250 additions and 12 deletions

View File

@@ -40,9 +40,12 @@ public:
struct Triangle {
Vector3 normal;
int indices[3];
int32_t surface_index;
int32_t surface_index = 0;
};
protected:
static void _bind_methods();
private:
Vector<Triangle> triangles;
Vector<Vector3> vertices;
@@ -50,10 +53,10 @@ private:
struct BVH {
AABB aabb;
Vector3 center; //used for sorting
int left;
int right;
int left = -1;
int right = -1;
int face_index;
int32_t face_index = -1;
};
struct BVHCmpX {
@@ -76,13 +79,13 @@ private:
int _create_bvh(BVH *p_bvh, BVH **p_bb, int p_from, int p_size, int p_depth, int &max_depth, int &max_alloc);
Vector<BVH> bvh;
int max_depth;
bool valid;
int max_depth = 0;
bool valid = false;
public:
bool is_valid() const;
bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index = nullptr) const;
bool intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index = nullptr) const;
bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index = nullptr, int32_t *r_face_index = nullptr) const;
bool intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index = nullptr, int32_t *r_face_index = nullptr) const;
bool inside_convex_shape(const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale = Vector3(1, 1, 1)) const;
Vector<Face3> get_faces() const;
@@ -91,5 +94,13 @@ public:
void get_indices(Vector<int> *r_triangles_indices) const;
void create(const Vector<Vector3> &p_faces, const Vector<int32_t> &p_surface_indices = Vector<int32_t>());
// Wrapped functions for compatibility with method bindings
// and user exposed script api that can't use more native types.
bool create_from_faces(const Vector<Vector3> &p_faces);
Dictionary intersect_segment_scriptwrap(const Vector3 &p_begin, const Vector3 &p_end) const;
Dictionary intersect_ray_scriptwrap(const Vector3 &p_begin, const Vector3 &p_dir) const;
Vector<Vector3> get_faces_scriptwrap() const;
TriangleMesh();
};