Просмотр исходного кода

Merge pull request #20727 from muiroc/fix_sw_sat_table

fixed godotphysics sat dispatch table
Juan Linietsky 7 лет назад
Родитель
Сommit
978505a90a
1 измененных файлов с 60 добавлено и 2 удалено
  1. 60 2
      servers/physics/collision_solver_sat.cpp

+ 60 - 2
servers/physics/collision_solver_sat.cpp

@@ -559,6 +559,12 @@ static void _collision_sphere_capsule(const ShapeSW *p_a, const Transform &p_tra
 	separator.generate_contacts();
 }
 
+template <bool withMargin>
+static void _collision_sphere_cylinder(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
 template <bool withMargin>
 static void _collision_sphere_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
 
@@ -850,6 +856,12 @@ static void _collision_box_capsule(const ShapeSW *p_a, const Transform &p_transf
 	separator.generate_contacts();
 }
 
+template <bool withMargin>
+static void _collision_box_cylinder(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
 template <bool withMargin>
 static void _collision_box_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
 
@@ -1126,6 +1138,12 @@ static void _collision_capsule_capsule(const ShapeSW *p_a, const Transform &p_tr
 	separator.generate_contacts();
 }
 
+template <bool withMargin>
+static void _collision_capsule_cylinder(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
 template <bool withMargin>
 static void _collision_capsule_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
 
@@ -1246,6 +1264,24 @@ static void _collision_capsule_face(const ShapeSW *p_a, const Transform &p_trans
 	separator.generate_contacts();
 }
 
+template <bool withMargin>
+static void _collision_cylinder_cylinder(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
+template <bool withMargin>
+static void _collision_cylinder_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
+template <bool withMargin>
+static void _collision_cylinder_face(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
+
+	return;
+}
+
 template <bool withMargin>
 static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, real_t p_margin_a, real_t p_margin_b) {
 
@@ -1475,23 +1511,33 @@ bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_tran
 	ERR_FAIL_COND_V(type_B == PhysicsServer::SHAPE_RAY, false);
 	ERR_FAIL_COND_V(p_shape_B->is_concave(), false);
 
-	static const CollisionFunc collision_table[5][5] = {
+	static const CollisionFunc collision_table[6][6] = {
 		{ _collision_sphere_sphere<false>,
 				_collision_sphere_box<false>,
 				_collision_sphere_capsule<false>,
+				_collision_sphere_cylinder<false>,
 				_collision_sphere_convex_polygon<false>,
 				_collision_sphere_face<false> },
 		{ 0,
 				_collision_box_box<false>,
 				_collision_box_capsule<false>,
+				_collision_box_cylinder<false>,
 				_collision_box_convex_polygon<false>,
 				_collision_box_face<false> },
 		{ 0,
 				0,
 				_collision_capsule_capsule<false>,
+				_collision_capsule_cylinder<false>,
 				_collision_capsule_convex_polygon<false>,
 				_collision_capsule_face<false> },
 		{ 0,
+				0,
+				0,
+				_collision_cylinder_cylinder<false>,
+				_collision_cylinder_convex_polygon<false>,
+				_collision_cylinder_face<false> },
+		{ 0,
+				0,
 				0,
 				0,
 				_collision_convex_polygon_convex_polygon<false>,
@@ -1500,26 +1546,37 @@ bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_tran
 				0,
 				0,
 				0,
+				0,
 				0 },
 	};
 
-	static const CollisionFunc collision_table_margin[5][5] = {
+	static const CollisionFunc collision_table_margin[6][6] = {
 		{ _collision_sphere_sphere<true>,
 				_collision_sphere_box<true>,
 				_collision_sphere_capsule<true>,
+				_collision_sphere_cylinder<true>,
 				_collision_sphere_convex_polygon<true>,
 				_collision_sphere_face<true> },
 		{ 0,
 				_collision_box_box<true>,
 				_collision_box_capsule<true>,
+				_collision_box_cylinder<true>,
 				_collision_box_convex_polygon<true>,
 				_collision_box_face<true> },
 		{ 0,
 				0,
 				_collision_capsule_capsule<true>,
+				_collision_capsule_cylinder<true>,
 				_collision_capsule_convex_polygon<true>,
 				_collision_capsule_face<true> },
 		{ 0,
+				0,
+				0,
+				_collision_cylinder_cylinder<true>,
+				_collision_cylinder_convex_polygon<true>,
+				_collision_cylinder_face<true> },
+		{ 0,
+				0,
 				0,
 				0,
 				_collision_convex_polygon_convex_polygon<true>,
@@ -1528,6 +1585,7 @@ bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_tran
 				0,
 				0,
 				0,
+				0,
 				0 },
 	};