diff options
Diffstat (limited to 'servers/physics_3d/shape_3d_sw.cpp')
-rw-r--r-- | servers/physics_3d/shape_3d_sw.cpp | 174 |
1 files changed, 0 insertions, 174 deletions
diff --git a/servers/physics_3d/shape_3d_sw.cpp b/servers/physics_3d/shape_3d_sw.cpp index 61c32b779a..2c248a4d38 100644 --- a/servers/physics_3d/shape_3d_sw.cpp +++ b/servers/physics_3d/shape_3d_sw.cpp @@ -48,7 +48,6 @@ void Shape3DSW::configure(const AABB &p_aabb) { } Vector3 Shape3DSW::get_support(const Vector3 &p_normal) const { - Vector3 res; int amnt; get_supports(p_normal, 1, &res, amnt); @@ -56,7 +55,6 @@ Vector3 Shape3DSW::get_support(const Vector3 &p_normal) const { } void Shape3DSW::add_owner(ShapeOwner3DSW *p_owner) { - Map<ShapeOwner3DSW *, int>::Element *E = owners.find(p_owner); if (E) { E->get()++; @@ -66,7 +64,6 @@ void Shape3DSW::add_owner(ShapeOwner3DSW *p_owner) { } void Shape3DSW::remove_owner(ShapeOwner3DSW *p_owner) { - Map<ShapeOwner3DSW *, int>::Element *E = owners.find(p_owner); ERR_FAIL_COND(!E); E->get()--; @@ -76,7 +73,6 @@ void Shape3DSW::remove_owner(ShapeOwner3DSW *p_owner) { } bool Shape3DSW::is_owner(ShapeOwner3DSW *p_owner) const { - return owners.has(p_owner); } @@ -85,35 +81,29 @@ const Map<ShapeOwner3DSW *, int> &Shape3DSW::get_owners() const { } Shape3DSW::Shape3DSW() { - custom_bias = 0; configured = false; } Shape3DSW::~Shape3DSW() { - ERR_FAIL_COND(owners.size()); } Plane PlaneShape3DSW::get_plane() const { - return plane; } void PlaneShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - // gibberish, a plane is infinity r_min = -1e7; r_max = 1e7; } Vector3 PlaneShape3DSW::get_support(const Vector3 &p_normal) const { - return p_normal * 1e15; } bool PlaneShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - bool inters = plane.intersects_segment(p_begin, p_end, &r_result); if (inters) r_normal = plane.normal; @@ -121,12 +111,10 @@ bool PlaneShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_ } bool PlaneShape3DSW::intersect_point(const Vector3 &p_point) const { - return plane.distance_to(p_point) < 0; } Vector3 PlaneShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - if (plane.is_point_over(p_point)) { return plane.project(p_point); } else { @@ -135,23 +123,19 @@ Vector3 PlaneShape3DSW::get_closest_point_to(const Vector3 &p_point) const { } Vector3 PlaneShape3DSW::get_moment_of_inertia(real_t p_mass) const { - return Vector3(); //wtf } void PlaneShape3DSW::_setup(const Plane &p_plane) { - plane = p_plane; configure(AABB(Vector3(-1e4, -1e4, -1e4), Vector3(1e4 * 2, 1e4 * 2, 1e4 * 2))); } void PlaneShape3DSW::set_data(const Variant &p_data) { - _setup(p_data); } Variant PlaneShape3DSW::get_data() const { - return plane; } @@ -161,7 +145,6 @@ PlaneShape3DSW::PlaneShape3DSW() { // real_t RayShape3DSW::get_length() const { - return length; } @@ -170,14 +153,12 @@ bool RayShape3DSW::get_slips_on_slope() const { } void RayShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - // don't think this will be even used r_min = 0; r_max = 1; } Vector3 RayShape3DSW::get_support(const Vector3 &p_normal) const { - if (p_normal.z > 0) return Vector3(0, 0, length); else @@ -185,9 +166,7 @@ Vector3 RayShape3DSW::get_support(const Vector3 &p_normal) const { } void RayShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - if (Math::abs(p_normal.z) < _EDGE_IS_VALID_SUPPORT_THRESHOLD) { - r_amount = 2; r_supports[0] = Vector3(0, 0, 0); r_supports[1] = Vector3(0, 0, length); @@ -201,17 +180,14 @@ void RayShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_s } bool RayShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - return false; //simply not possible } bool RayShape3DSW::intersect_point(const Vector3 &p_point) const { - return false; //simply not possible } Vector3 RayShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - Vector3 s[2] = { Vector3(0, 0, 0), Vector3(0, 0, length) @@ -221,25 +197,21 @@ Vector3 RayShape3DSW::get_closest_point_to(const Vector3 &p_point) const { } Vector3 RayShape3DSW::get_moment_of_inertia(real_t p_mass) const { - return Vector3(); } void RayShape3DSW::_setup(real_t p_length, bool p_slips_on_slope) { - length = p_length; slips_on_slope = p_slips_on_slope; configure(AABB(Vector3(0, 0, 0), Vector3(0.1, 0.1, length))); } void RayShape3DSW::set_data(const Variant &p_data) { - Dictionary d = p_data; _setup(d["length"], d["slips_on_slope"]); } Variant RayShape3DSW::get_data() const { - Dictionary d; d["length"] = length; d["slips_on_slope"] = slips_on_slope; @@ -247,7 +219,6 @@ Variant RayShape3DSW::get_data() const { } RayShape3DSW::RayShape3DSW() { - length = 1; slips_on_slope = false; } @@ -255,12 +226,10 @@ RayShape3DSW::RayShape3DSW() { /********** SPHERE *************/ real_t SphereShape3DSW::get_radius() const { - return radius; } void SphereShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - real_t d = p_normal.dot(p_transform.origin); // figure out scale at point @@ -272,28 +241,23 @@ void SphereShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_ } Vector3 SphereShape3DSW::get_support(const Vector3 &p_normal) const { - return p_normal * radius; } void SphereShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - *r_supports = p_normal * radius; r_amount = 1; } bool SphereShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - return Geometry::segment_intersects_sphere(p_begin, p_end, Vector3(), radius, &r_result, &r_normal); } bool SphereShape3DSW::intersect_point(const Vector3 &p_point) const { - return p_point.length() < radius; } Vector3 SphereShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - Vector3 p = p_point; float l = p.length(); if (l < radius) @@ -302,36 +266,30 @@ Vector3 SphereShape3DSW::get_closest_point_to(const Vector3 &p_point) const { } Vector3 SphereShape3DSW::get_moment_of_inertia(real_t p_mass) const { - real_t s = 0.4 * p_mass * radius * radius; return Vector3(s, s, s); } void SphereShape3DSW::_setup(real_t p_radius) { - radius = p_radius; configure(AABB(Vector3(-radius, -radius, -radius), Vector3(radius * 2.0, radius * 2.0, radius * 2.0))); } void SphereShape3DSW::set_data(const Variant &p_data) { - _setup(p_data); } Variant SphereShape3DSW::get_data() const { - return radius; } SphereShape3DSW::SphereShape3DSW() { - radius = 0; } /********** BOX *************/ void BoxShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - // no matter the angle, the box is mirrored anyway Vector3 local_normal = p_transform.basis.xform_inv(p_normal); @@ -343,7 +301,6 @@ void BoxShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_tra } Vector3 BoxShape3DSW::get_support(const Vector3 &p_normal) const { - Vector3 point( (p_normal.x < 0) ? -half_extents.x : half_extents.x, (p_normal.y < 0) ? -half_extents.y : half_extents.y, @@ -353,17 +310,14 @@ Vector3 BoxShape3DSW::get_support(const Vector3 &p_normal) const { } void BoxShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - static const int next[3] = { 1, 2, 0 }; static const int next2[3] = { 2, 0, 1 }; for (int i = 0; i < 3; i++) { - Vector3 axis; axis[i] = 1.0; real_t dot = p_normal.dot(axis); if (Math::abs(dot) > _FACE_IS_VALID_SUPPORT_THRESHOLD) { - //Vector3 axis_b; bool neg = dot < 0; @@ -384,7 +338,6 @@ void BoxShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_s }; for (int j = 0; j < 4; j++) { - point[i_n] = sign[j][0] * half_extents[i_n]; point[i_n2] = sign[j][1] * half_extents[i_n2]; r_supports[j] = neg ? -point : point; @@ -402,12 +355,10 @@ void BoxShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_s } for (int i = 0; i < 3; i++) { - Vector3 axis; axis[i] = 1.0; if (Math::abs(p_normal.dot(axis)) < _EDGE_IS_VALID_SUPPORT_THRESHOLD) { - r_amount = 2; int i_n = next[i]; @@ -440,24 +391,20 @@ void BoxShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_s } bool BoxShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - AABB aabb(-half_extents, half_extents * 2.0); return aabb.intersects_segment(p_begin, p_end, &r_result, &r_normal); } bool BoxShape3DSW::intersect_point(const Vector3 &p_point) const { - return (Math::abs(p_point.x) < half_extents.x && Math::abs(p_point.y) < half_extents.y && Math::abs(p_point.z) < half_extents.z); } Vector3 BoxShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - int outside = 0; Vector3 min_point; for (int i = 0; i < 3; i++) { - if (Math::abs(p_point[i]) > half_extents[i]) { outside++; if (outside == 1) { @@ -486,7 +433,6 @@ Vector3 BoxShape3DSW::get_closest_point_to(const Vector3 &p_point) const { }; for (int i = 0; i < 3; i++) { - s[1] = closest_vertex; s[1][i] = -s[1][i]; //edge @@ -503,7 +449,6 @@ Vector3 BoxShape3DSW::get_closest_point_to(const Vector3 &p_point) const { } Vector3 BoxShape3DSW::get_moment_of_inertia(real_t p_mass) const { - real_t lx = half_extents.x; real_t ly = half_extents.y; real_t lz = half_extents.z; @@ -512,19 +457,16 @@ Vector3 BoxShape3DSW::get_moment_of_inertia(real_t p_mass) const { } void BoxShape3DSW::_setup(const Vector3 &p_half_extents) { - half_extents = p_half_extents.abs(); configure(AABB(-half_extents, half_extents * 2)); } void BoxShape3DSW::set_data(const Variant &p_data) { - _setup(p_data); } Variant BoxShape3DSW::get_data() const { - return half_extents; } @@ -534,7 +476,6 @@ BoxShape3DSW::BoxShape3DSW() { /********** CAPSULE *************/ void CapsuleShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - Vector3 n = p_transform.basis.xform_inv(p_normal).normalized(); real_t h = (n.z > 0) ? height : -height; @@ -546,7 +487,6 @@ void CapsuleShape3DSW::project_range(const Vector3 &p_normal, const Transform &p } Vector3 CapsuleShape3DSW::get_support(const Vector3 &p_normal) const { - Vector3 n = p_normal; real_t h = (n.z > 0) ? height : -height; @@ -557,13 +497,11 @@ Vector3 CapsuleShape3DSW::get_support(const Vector3 &p_normal) const { } void CapsuleShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - Vector3 n = p_normal; real_t d = n.z; if (Math::abs(d) < _EDGE_IS_VALID_SUPPORT_THRESHOLD) { - // make it flat n.z = 0.0; n.normalize(); @@ -576,7 +514,6 @@ void CapsuleShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 r_supports[1].z -= height * 0.5; } else { - real_t h = (d > 0) ? height : -height; n *= radius; @@ -587,7 +524,6 @@ void CapsuleShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 } bool CapsuleShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - Vector3 norm = (p_end - p_begin).normalized(); real_t min_d = 1e20; @@ -637,7 +573,6 @@ bool CapsuleShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 & } if (collision) { - r_result = res; r_normal = n; } @@ -645,7 +580,6 @@ bool CapsuleShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 & } bool CapsuleShape3DSW::intersect_point(const Vector3 &p_point) const { - if (Math::abs(p_point.z) < height * 0.5) { return Vector3(p_point.x, p_point.y, 0).length() < radius; } else { @@ -656,7 +590,6 @@ bool CapsuleShape3DSW::intersect_point(const Vector3 &p_point) const { } Vector3 CapsuleShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - Vector3 s[2] = { Vector3(0, 0, -height * 0.5), Vector3(0, 0, height * 0.5), @@ -671,7 +604,6 @@ Vector3 CapsuleShape3DSW::get_closest_point_to(const Vector3 &p_point) const { } Vector3 CapsuleShape3DSW::get_moment_of_inertia(real_t p_mass) const { - // use bad AABB approximation Vector3 extents = get_aabb().size * 0.5; @@ -682,14 +614,12 @@ Vector3 CapsuleShape3DSW::get_moment_of_inertia(real_t p_mass) const { } void CapsuleShape3DSW::_setup(real_t p_height, real_t p_radius) { - height = p_height; radius = p_radius; configure(AABB(Vector3(-radius, -radius, -height * 0.5 - radius), Vector3(radius * 2, radius * 2, height + radius * 2.0))); } void CapsuleShape3DSW::set_data(const Variant &p_data) { - Dictionary d = p_data; ERR_FAIL_COND(!d.has("radius")); ERR_FAIL_COND(!d.has("height")); @@ -697,7 +627,6 @@ void CapsuleShape3DSW::set_data(const Variant &p_data) { } Variant CapsuleShape3DSW::get_data() const { - Dictionary d; d["radius"] = radius; d["height"] = height; @@ -705,14 +634,12 @@ Variant CapsuleShape3DSW::get_data() const { } CapsuleShape3DSW::CapsuleShape3DSW() { - height = radius = 0; } /********** CONVEX POLYGON *************/ void ConvexPolygonShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - int vertex_count = mesh.vertices.size(); if (vertex_count == 0) return; @@ -720,7 +647,6 @@ void ConvexPolygonShape3DSW::project_range(const Vector3 &p_normal, const Transf const Vector3 *vrts = &mesh.vertices[0]; for (int i = 0; i < vertex_count; i++) { - real_t d = p_normal.dot(p_transform.xform(vrts[i])); if (i == 0 || d > r_max) @@ -731,7 +657,6 @@ void ConvexPolygonShape3DSW::project_range(const Vector3 &p_normal, const Transf } Vector3 ConvexPolygonShape3DSW::get_support(const Vector3 &p_normal) const { - Vector3 n = p_normal; int vert_support_idx = -1; @@ -744,7 +669,6 @@ Vector3 ConvexPolygonShape3DSW::get_support(const Vector3 &p_normal) const { const Vector3 *vrts = &mesh.vertices[0]; for (int i = 0; i < vertex_count; i++) { - real_t d = n.dot(vrts[i]); if (i == 0 || d > support_max) { @@ -757,7 +681,6 @@ Vector3 ConvexPolygonShape3DSW::get_support(const Vector3 &p_normal) const { } void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - const Geometry::MeshData::Face *faces = mesh.faces.ptr(); int fc = mesh.faces.size(); @@ -772,7 +695,6 @@ void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Ve int vtx = 0; for (int i = 0; i < vc; i++) { - real_t d = p_normal.dot(vertices[i]); if (i == 0 || d > max) { @@ -782,9 +704,7 @@ void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Ve } for (int i = 0; i < fc; i++) { - if (faces[i].plane.normal.dot(p_normal) > _FACE_IS_VALID_SUPPORT_THRESHOLD) { - int ic = faces[i].indices.size(); const int *ind = faces[i].indices.ptr(); @@ -801,7 +721,6 @@ void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Ve int m = MIN(p_max, ic); for (int j = 0; j < m; j++) { - r_supports[j] = vertices[ind[j]]; } r_amount = m; @@ -810,11 +729,9 @@ void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Ve } for (int i = 0; i < ec; i++) { - real_t dot = (vertices[edges[i].a] - vertices[edges[i].b]).normalized().dot(p_normal); dot = ABS(dot); if (dot < _EDGE_IS_VALID_SUPPORT_THRESHOLD && (edges[i].a == vtx || edges[i].b == vtx)) { - r_amount = 2; r_supports[0] = vertices[edges[i].a]; r_supports[1] = vertices[edges[i].b]; @@ -827,7 +744,6 @@ void ConvexPolygonShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Ve } bool ConvexPolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - const Geometry::MeshData::Face *faces = mesh.faces.ptr(); int fc = mesh.faces.size(); @@ -838,7 +754,6 @@ bool ConvexPolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Vec bool col = false; for (int i = 0; i < fc; i++) { - if (faces[i].plane.normal.dot(n) > 0) continue; //opposing face @@ -846,7 +761,6 @@ bool ConvexPolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Vec const int *ind = faces[i].indices.ptr(); for (int j = 1; j < ic - 1; j++) { - Face3 f(vertices[ind[0]], vertices[ind[j]], vertices[ind[j + 1]]); Vector3 result; if (f.intersects_segment(p_begin, p_end, &result)) { @@ -867,12 +781,10 @@ bool ConvexPolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Vec } bool ConvexPolygonShape3DSW::intersect_point(const Vector3 &p_point) const { - const Geometry::MeshData::Face *faces = mesh.faces.ptr(); int fc = mesh.faces.size(); for (int i = 0; i < fc; i++) { - if (faces[i].plane.distance_to(p_point) >= 0) return false; } @@ -881,14 +793,12 @@ bool ConvexPolygonShape3DSW::intersect_point(const Vector3 &p_point) const { } Vector3 ConvexPolygonShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - const Geometry::MeshData::Face *faces = mesh.faces.ptr(); int fc = mesh.faces.size(); const Vector3 *vertices = mesh.vertices.ptr(); bool all_inside = true; for (int i = 0; i < fc; i++) { - if (!faces[i].plane.is_point_over(p_point)) continue; @@ -898,7 +808,6 @@ Vector3 ConvexPolygonShape3DSW::get_closest_point_to(const Vector3 &p_point) con const int *indices = faces[i].indices.ptr(); for (int j = 0; j < ic; j++) { - Vector3 a = vertices[indices[j]]; Vector3 b = vertices[indices[(j + 1) % ic]]; Vector3 n = (a - b).cross(faces[i].plane.normal).normalized(); @@ -924,7 +833,6 @@ Vector3 ConvexPolygonShape3DSW::get_closest_point_to(const Vector3 &p_point) con const Geometry::MeshData::Edge *edges = mesh.edges.ptr(); int ec = mesh.edges.size(); for (int i = 0; i < ec; i++) { - Vector3 s[2] = { vertices[edges[i].a], vertices[edges[i].b] @@ -942,7 +850,6 @@ Vector3 ConvexPolygonShape3DSW::get_closest_point_to(const Vector3 &p_point) con } Vector3 ConvexPolygonShape3DSW::get_moment_of_inertia(real_t p_mass) const { - // use bad AABB approximation Vector3 extents = get_aabb().size * 0.5; @@ -953,7 +860,6 @@ Vector3 ConvexPolygonShape3DSW::get_moment_of_inertia(real_t p_mass) const { } void ConvexPolygonShape3DSW::_setup(const Vector<Vector3> &p_vertices) { - Error err = QuickHull::build(p_vertices, mesh); if (err != OK) ERR_PRINT("Failed to build QuickHull"); @@ -961,7 +867,6 @@ void ConvexPolygonShape3DSW::_setup(const Vector<Vector3> &p_vertices) { AABB _aabb; for (int i = 0; i < mesh.vertices.size(); i++) { - if (i == 0) _aabb.position = mesh.vertices[i]; else @@ -972,12 +877,10 @@ void ConvexPolygonShape3DSW::_setup(const Vector<Vector3> &p_vertices) { } void ConvexPolygonShape3DSW::set_data(const Variant &p_data) { - _setup(p_data); } Variant ConvexPolygonShape3DSW::get_data() const { - return mesh.vertices; } @@ -987,9 +890,7 @@ ConvexPolygonShape3DSW::ConvexPolygonShape3DSW() { /********** FACE POLYGON *************/ void FaceShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - for (int i = 0; i < 3; i++) { - Vector3 v = p_transform.xform(vertex[i]); real_t d = p_normal.dot(v); @@ -1002,12 +903,10 @@ void FaceShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_tr } Vector3 FaceShape3DSW::get_support(const Vector3 &p_normal) const { - int vert_support_idx = -1; real_t support_max = 0; for (int i = 0; i < 3; i++) { - real_t d = p_normal.dot(vertex[i]); if (i == 0 || d > support_max) { @@ -1020,15 +919,12 @@ Vector3 FaceShape3DSW::get_support(const Vector3 &p_normal) const { } void FaceShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { - Vector3 n = p_normal; /** TEST FACE AS SUPPORT **/ if (normal.dot(n) > _FACE_IS_VALID_SUPPORT_THRESHOLD) { - r_amount = 3; for (int i = 0; i < 3; i++) { - r_supports[i] = vertex[i]; } return; @@ -1040,7 +936,6 @@ void FaceShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_ real_t support_max = 0; for (int i = 0; i < 3; i++) { - real_t d = n.dot(vertex[i]); if (i == 0 || d > support_max) { @@ -1052,7 +947,6 @@ void FaceShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_ /** TEST EDGES AS SUPPORT **/ for (int i = 0; i < 3; i++) { - int nx = (i + 1) % 3; if (i != vert_support_idx && nx != vert_support_idx) continue; @@ -1061,7 +955,6 @@ void FaceShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_ real_t dot = (vertex[i] - vertex[nx]).normalized().dot(n); dot = ABS(dot); if (dot < _EDGE_IS_VALID_SUPPORT_THRESHOLD) { - r_amount = 2; r_supports[0] = vertex[i]; r_supports[1] = vertex[nx]; @@ -1074,7 +967,6 @@ void FaceShape3DSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_ } bool FaceShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - bool c = Geometry::segment_intersects_triangle(p_begin, p_end, vertex[0], vertex[1], vertex[2], &r_result); if (c) { r_normal = Plane(vertex[0], vertex[1], vertex[2]).normal; @@ -1087,36 +979,29 @@ bool FaceShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_e } bool FaceShape3DSW::intersect_point(const Vector3 &p_point) const { - return false; //face is flat } Vector3 FaceShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - return Face3(vertex[0], vertex[1], vertex[2]).get_closest_point_to(p_point); } Vector3 FaceShape3DSW::get_moment_of_inertia(real_t p_mass) const { - return Vector3(); // Sorry, but i don't think anyone cares, FaceShape! } FaceShape3DSW::FaceShape3DSW() { - configure(AABB()); } Vector<Vector3> ConcavePolygonShape3DSW::get_faces() const { - Vector<Vector3> rfaces; rfaces.resize(faces.size() * 3); for (int i = 0; i < faces.size(); i++) { - Face f = faces.get(i); for (int j = 0; j < 3; j++) { - rfaces.set(i * 3 + j, vertices.get(f.indices[j])); } } @@ -1125,7 +1010,6 @@ Vector<Vector3> ConcavePolygonShape3DSW::get_faces() const { } void ConcavePolygonShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - int count = vertices.size(); if (count == 0) { r_min = 0; @@ -1135,7 +1019,6 @@ void ConcavePolygonShape3DSW::project_range(const Vector3 &p_normal, const Trans const Vector3 *vptr = vertices.ptr(); for (int i = 0; i < count; i++) { - real_t d = p_normal.dot(p_transform.xform(vptr[i])); if (i == 0 || d > r_max) @@ -1146,7 +1029,6 @@ void ConcavePolygonShape3DSW::project_range(const Vector3 &p_normal, const Trans } Vector3 ConcavePolygonShape3DSW::get_support(const Vector3 &p_normal) const { - int count = vertices.size(); if (count == 0) return Vector3(); @@ -1159,7 +1041,6 @@ Vector3 ConcavePolygonShape3DSW::get_support(const Vector3 &p_normal) const { real_t support_max = 0; for (int i = 0; i < count; i++) { - real_t d = n.dot(vptr[i]); if (i == 0 || d > support_max) { @@ -1172,7 +1053,6 @@ Vector3 ConcavePolygonShape3DSW::get_support(const Vector3 &p_normal) const { } void ConcavePolygonShape3DSW::_cull_segment(int p_idx, _SegmentCullParams *p_params) const { - const BVH *bvh = &p_params->bvh[p_idx]; /* @@ -1182,12 +1062,10 @@ void ConcavePolygonShape3DSW::_cull_segment(int p_idx, _SegmentCullParams *p_par //printf("addr: %p\n",bvh); if (!bvh->aabb.intersects_segment(p_params->from, p_params->to)) { - return; } if (bvh->face_index >= 0) { - Vector3 res; Vector3 vertices[3] = { p_params->vertices[p_params->faces[bvh->face_index].indices[0]], @@ -1202,11 +1080,9 @@ void ConcavePolygonShape3DSW::_cull_segment(int p_idx, _SegmentCullParams *p_par vertices[1], vertices[2], &res)) { - real_t d = p_params->dir.dot(res) - p_params->dir.dot(p_params->from); //TODO, seems segmen/triangle intersection is broken :( if (d > 0 && d < p_params->min_d) { - p_params->min_d = d; p_params->result = res; p_params->normal = Plane(vertices[0], vertices[1], vertices[2]).normal; @@ -1215,7 +1091,6 @@ void ConcavePolygonShape3DSW::_cull_segment(int p_idx, _SegmentCullParams *p_par } } else { - if (bvh->left >= 0) _cull_segment(bvh->left, p_params); if (bvh->right >= 0) @@ -1224,7 +1099,6 @@ void ConcavePolygonShape3DSW::_cull_segment(int p_idx, _SegmentCullParams *p_par } bool ConcavePolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { - if (faces.size() == 0) return false; @@ -1248,35 +1122,29 @@ bool ConcavePolygonShape3DSW::intersect_segment(const Vector3 &p_begin, const Ve _cull_segment(0, ¶ms); if (params.collisions > 0) { - r_result = params.result; r_normal = params.normal; return true; } else { - return false; } } bool ConcavePolygonShape3DSW::intersect_point(const Vector3 &p_point) const { - return false; //face is flat } Vector3 ConcavePolygonShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - return Vector3(); } void ConcavePolygonShape3DSW::_cull(int p_idx, _CullParams *p_params) const { - const BVH *bvh = &p_params->bvh[p_idx]; if (!p_params->aabb.intersects(bvh->aabb)) return; if (bvh->face_index >= 0) { - const Face *f = &p_params->faces[bvh->face_index]; FaceShape3DSW *face = p_params->face; face->normal = f->normal; @@ -1286,21 +1154,17 @@ void ConcavePolygonShape3DSW::_cull(int p_idx, _CullParams *p_params) const { p_params->callback(p_params->userdata, face); } else { - if (bvh->left >= 0) { - _cull(bvh->left, p_params); } if (bvh->right >= 0) { - _cull(bvh->right, p_params); } } } void ConcavePolygonShape3DSW::cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const { - // make matrix local to concave if (faces.size() == 0) return; @@ -1328,7 +1192,6 @@ void ConcavePolygonShape3DSW::cull(const AABB &p_local_aabb, Callback p_callback } Vector3 ConcavePolygonShape3DSW::get_moment_of_inertia(real_t p_mass) const { - // use bad AABB approximation Vector3 extents = get_aabb().size * 0.5; @@ -1339,38 +1202,30 @@ Vector3 ConcavePolygonShape3DSW::get_moment_of_inertia(real_t p_mass) const { } struct _VolumeSW_BVH_Element { - AABB aabb; Vector3 center; int face_index; }; struct _VolumeSW_BVH_CompareX { - _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const { - return a.center.x < b.center.x; } }; struct _VolumeSW_BVH_CompareY { - _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const { - return a.center.y < b.center.y; } }; struct _VolumeSW_BVH_CompareZ { - _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const { - return a.center.z < b.center.z; } }; struct _VolumeSW_BVH { - AABB aabb; _VolumeSW_BVH *left; _VolumeSW_BVH *right; @@ -1379,7 +1234,6 @@ struct _VolumeSW_BVH { }; _VolumeSW_BVH *_volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements, int p_size, int &count) { - _VolumeSW_BVH *bvh = memnew(_VolumeSW_BVH); if (p_size == 1) { @@ -1391,13 +1245,11 @@ _VolumeSW_BVH *_volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements, int p_siz count++; return bvh; } else { - bvh->face_index = -1; } AABB aabb; for (int i = 0; i < p_size; i++) { - if (i == 0) aabb = p_elements[i].aabb; else @@ -1405,20 +1257,16 @@ _VolumeSW_BVH *_volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements, int p_siz } bvh->aabb = aabb; switch (aabb.get_longest_axis_index()) { - case 0: { - SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareX> sort_x; sort_x.sort(p_elements, p_size); } break; case 1: { - SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareY> sort_y; sort_y.sort(p_elements, p_size); } break; case 2: { - SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareZ> sort_z; sort_z.sort(p_elements, p_size); } break; @@ -1434,7 +1282,6 @@ _VolumeSW_BVH *_volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements, int p_siz } void ConcavePolygonShape3DSW::_fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_array, int &p_idx) { - int idx = p_idx; p_bvh_array[idx].aabb = p_bvh_tree->aabb; @@ -1446,7 +1293,6 @@ void ConcavePolygonShape3DSW::_fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_ar _fill_bvh(p_bvh_tree->left, p_bvh_array, p_idx); } else { - p_bvh_array[p_idx].left = -1; } @@ -1455,7 +1301,6 @@ void ConcavePolygonShape3DSW::_fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_ar _fill_bvh(p_bvh_tree->right, p_bvh_array, p_idx); } else { - p_bvh_array[p_idx].right = -1; } @@ -1463,7 +1308,6 @@ void ConcavePolygonShape3DSW::_fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_ar } void ConcavePolygonShape3DSW::_setup(Vector<Vector3> p_faces) { - int src_face_count = p_faces.size(); if (src_face_count == 0) { configure(AABB()); @@ -1489,7 +1333,6 @@ void ConcavePolygonShape3DSW::_setup(Vector<Vector3> p_faces) { AABB _aabb; for (int i = 0; i < src_face_count; i++) { - Face3 face(facesr[i * 3 + 0], facesr[i * 3 + 1], facesr[i * 3 + 2]); bvh_arrayw[i].aabb = face.get_aabb(); @@ -1522,12 +1365,10 @@ void ConcavePolygonShape3DSW::_setup(Vector<Vector3> p_faces) { } void ConcavePolygonShape3DSW::set_data(const Variant &p_data) { - _setup(p_data); } Variant ConcavePolygonShape3DSW::get_data() const { - return get_faces(); } @@ -1537,36 +1378,29 @@ ConcavePolygonShape3DSW::ConcavePolygonShape3DSW() { /* HEIGHT MAP SHAPE */ Vector<real_t> HeightMapShape3DSW::get_heights() const { - return heights; } int HeightMapShape3DSW::get_width() const { - return width; } int HeightMapShape3DSW::get_depth() const { - return depth; } real_t HeightMapShape3DSW::get_cell_size() const { - return cell_size; } void HeightMapShape3DSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const { - //not very useful, but not very used either p_transform.xform(get_aabb()).project_range_in_plane(Plane(p_normal, 0), r_min, r_max); } Vector3 HeightMapShape3DSW::get_support(const Vector3 &p_normal) const { - //not very useful, but not very used either return get_aabb().get_support(p_normal); } bool HeightMapShape3DSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const { - return false; } @@ -1575,7 +1409,6 @@ bool HeightMapShape3DSW::intersect_point(const Vector3 &p_point) const { } Vector3 HeightMapShape3DSW::get_closest_point_to(const Vector3 &p_point) const { - return Vector3(); } @@ -1583,7 +1416,6 @@ void HeightMapShape3DSW::cull(const AABB &p_local_aabb, Callback p_callback, voi } Vector3 HeightMapShape3DSW::get_moment_of_inertia(real_t p_mass) const { - // use bad AABB approximation Vector3 extents = get_aabb().size * 0.5; @@ -1594,7 +1426,6 @@ Vector3 HeightMapShape3DSW::get_moment_of_inertia(real_t p_mass) const { } void HeightMapShape3DSW::_setup(Vector<real_t> p_heights, int p_width, int p_depth, real_t p_cell_size) { - heights = p_heights; width = p_width; depth = p_depth; @@ -1605,9 +1436,7 @@ void HeightMapShape3DSW::_setup(Vector<real_t> p_heights, int p_width, int p_dep AABB aabb; for (int i = 0; i < depth; i++) { - for (int j = 0; j < width; j++) { - real_t h = r[i * width + j]; Vector3 pos(j * cell_size, h, i * cell_size); @@ -1622,7 +1451,6 @@ void HeightMapShape3DSW::_setup(Vector<real_t> p_heights, int p_width, int p_dep } void HeightMapShape3DSW::set_data(const Variant &p_data) { - ERR_FAIL_COND(p_data.get_type() != Variant::DICTIONARY); Dictionary d = p_data; ERR_FAIL_COND(!d.has("width")); @@ -1643,12 +1471,10 @@ void HeightMapShape3DSW::set_data(const Variant &p_data) { } Variant HeightMapShape3DSW::get_data() const { - ERR_FAIL_V(Variant()); } HeightMapShape3DSW::HeightMapShape3DSW() { - width = 0; depth = 0; cell_size = 0; |