@@ -182,7 +182,11 @@ void TriangleMesh::create(const Vector<Vector3> &p_faces, const Vector<int32_t>
182182 valid = true ;
183183}
184184
185- bool TriangleMesh::intersect_segment (const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index) const {
185+ bool TriangleMesh::intersect_segment (const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index, int32_t *r_face_index) const {
186+ if (!valid) {
187+ return false ;
188+ }
189+
186190 uint32_t *stack = (uint32_t *)alloca (sizeof (int ) * max_depth);
187191
188192 enum {
@@ -234,6 +238,9 @@ bool TriangleMesh::intersect_segment(const Vector3 &p_begin, const Vector3 &p_en
234238 if (r_surf_index) {
235239 *r_surf_index = s.surface_index ;
236240 }
241+ if (r_face_index) {
242+ *r_face_index = b.face_index ;
243+ }
237244 inters = true ;
238245 }
239246 }
@@ -283,7 +290,11 @@ bool TriangleMesh::intersect_segment(const Vector3 &p_begin, const Vector3 &p_en
283290 return inters;
284291}
285292
286- bool TriangleMesh::intersect_ray (const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index) const {
293+ bool TriangleMesh::intersect_ray (const Vector3 &p_begin, const Vector3 &p_dir, Vector3 &r_point, Vector3 &r_normal, int32_t *r_surf_index, int32_t *r_face_index) const {
294+ if (!valid) {
295+ return false ;
296+ }
297+
287298 uint32_t *stack = (uint32_t *)alloca (sizeof (int ) * max_depth);
288299
289300 enum {
@@ -335,6 +346,9 @@ bool TriangleMesh::intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, V
335346 if (r_surf_index) {
336347 *r_surf_index = s.surface_index ;
337348 }
349+ if (r_face_index) {
350+ *r_face_index = b.face_index ;
351+ }
338352 inters = true ;
339353 }
340354 }
@@ -385,6 +399,10 @@ bool TriangleMesh::intersect_ray(const Vector3 &p_begin, const Vector3 &p_dir, V
385399}
386400
387401bool TriangleMesh::inside_convex_shape (const Plane *p_planes, int p_plane_count, const Vector3 *p_points, int p_point_count, Vector3 p_scale) const {
402+ if (!valid) {
403+ return false ;
404+ }
405+
388406 uint32_t *stack = (uint32_t *)alloca (sizeof (int ) * max_depth);
389407
390408 enum {
@@ -503,6 +521,85 @@ Vector<Face3> TriangleMesh::get_faces() const {
503521 return faces;
504522}
505523
524+ bool TriangleMesh::create_from_faces (const Vector<Vector3> &p_faces) {
525+ create (p_faces);
526+ return is_valid ();
527+ }
528+
529+ Dictionary TriangleMesh::intersect_segment_scriptwrap (const Vector3 &p_begin, const Vector3 &p_end) const {
530+ if (!valid) {
531+ return Dictionary ();
532+ }
533+
534+ Vector3 r_point;
535+ Vector3 r_normal;
536+ int32_t r_face_index = -1 ;
537+
538+ bool intersected = intersect_segment (p_begin, p_end, r_point, r_normal, nullptr , &r_face_index);
539+ if (!intersected) {
540+ return Dictionary ();
541+ }
542+
543+ Dictionary result;
544+ result[" position" ] = r_point;
545+ result[" normal" ] = r_normal;
546+ result[" face_index" ] = r_face_index;
547+
548+ return result;
549+ }
550+
551+ Dictionary TriangleMesh::intersect_ray_scriptwrap (const Vector3 &p_begin, const Vector3 &p_dir) const {
552+ if (!valid) {
553+ return Dictionary ();
554+ }
555+
556+ Vector3 r_point;
557+ Vector3 r_normal;
558+ int32_t r_face_index = -1 ;
559+
560+ bool intersected = intersect_ray (p_begin, p_dir, r_point, r_normal, nullptr , &r_face_index);
561+ if (!intersected) {
562+ return Dictionary ();
563+ }
564+
565+ Dictionary result;
566+ result[" position" ] = r_point;
567+ result[" normal" ] = r_normal;
568+ result[" face_index" ] = r_face_index;
569+
570+ return result;
571+ }
572+
573+ Vector<Vector3> TriangleMesh::get_faces_scriptwrap () const {
574+ if (!valid) {
575+ return Vector<Vector3>();
576+ }
577+
578+ Vector<Vector3> faces;
579+ int ts = triangles.size ();
580+ faces.resize (triangles.size () * 3 );
581+
582+ Vector3 *w = faces.ptrw ();
583+ const Triangle *r = triangles.ptr ();
584+ const Vector3 *rv = vertices.ptr ();
585+
586+ for (int i = 0 ; i < ts; i++) {
587+ for (int j = 0 ; j < 3 ; j++) {
588+ w[i * 3 + j] = rv[r[i].indices [j]];
589+ }
590+ }
591+
592+ return faces;
593+ }
594+
595+ void TriangleMesh::_bind_methods () {
596+ ClassDB::bind_method (D_METHOD (" create_from_faces" , " faces" ), &TriangleMesh::create_from_faces);
597+ ClassDB::bind_method (D_METHOD (" get_faces" ), &TriangleMesh::get_faces_scriptwrap);
598+
599+ ClassDB::bind_method (D_METHOD (" intersect_segment" , " begin" , " end" ), &TriangleMesh::intersect_segment_scriptwrap);
600+ ClassDB::bind_method (D_METHOD (" intersect_ray" , " begin" , " dir" ), &TriangleMesh::intersect_ray_scriptwrap);
601+ }
602+
506603TriangleMesh::TriangleMesh () {
507604 valid = false ;
508605 max_depth = 0 ;
0 commit comments