Revert "make 2d constraint solving more deterministic by solving in push order"

This reverts commit 266314ba26.

There seems to be some performance concerns, so reverting the cherry-pick for
now and we'll revisit later (see https://github.com/godotengine/godot/pull/44112#issuecomment-829426790).
This commit is contained in:
Rémi Verschelde 2021-04-29 19:12:19 +02:00
parent 780188a7b3
commit 594764c2ec
No known key found for this signature in database
GPG key ID: C3336907360768E1
7 changed files with 31 additions and 27 deletions

View file

@ -89,7 +89,7 @@ AreaPair2DSW::~AreaPair2DSW() {
if (area->has_monitor_callback())
area->remove_body_from_query(body, body_shape, area_shape);
}
body->remove_constraint(this, 0);
body->remove_constraint(this);
area->remove_constraint(this);
}

View file

@ -576,13 +576,16 @@ void Body2DSW::integrate_velocities(real_t p_step) {
}
void Body2DSW::wakeup_neighbours() {
for (List<Pair<Constraint2DSW *, int> >::Element *E = constraint_list.front(); E; E = E->next()) {
const Constraint2DSW *c = E->get().first;
for (Map<Constraint2DSW *, int>::Element *E = constraint_map.front(); E; E = E->next()) {
const Constraint2DSW *c = E->key();
Body2DSW **n = c->get_body_ptr();
int bc = c->get_body_count();
for (int i = 0; i < bc; i++) {
if (i == E->get().second)
if (i == E->get())
continue;
Body2DSW *b = n[i];
if (b->mode != Physics2DServer::BODY_MODE_RIGID)

View file

@ -33,8 +33,6 @@
#include "area_2d_sw.h"
#include "collision_object_2d_sw.h"
#include "core/list.h"
#include "core/pair.h"
#include "core/vset.h"
class Constraint2DSW;
@ -86,7 +84,7 @@ class Body2DSW : public CollisionObject2DSW {
virtual void _shapes_changed();
Transform2D new_transform;
List<Pair<Constraint2DSW *, int> > constraint_list;
Map<Constraint2DSW *, int> constraint_map;
struct AreaCMP {
@ -182,10 +180,10 @@ public:
_FORCE_INLINE_ Body2DSW *get_island_list_next() const { return island_list_next; }
_FORCE_INLINE_ void set_island_list_next(Body2DSW *p_next) { island_list_next = p_next; }
_FORCE_INLINE_ void add_constraint(Constraint2DSW *p_constraint, int p_pos) { constraint_list.push_back({ p_constraint, p_pos }); }
_FORCE_INLINE_ void remove_constraint(Constraint2DSW *p_constraint, int p_pos) { constraint_list.erase({ p_constraint, p_pos }); }
const List<Pair<Constraint2DSW *, int> > &get_constraint_list() const { return constraint_list; }
_FORCE_INLINE_ void clear_constraint_list() { constraint_list.clear(); }
_FORCE_INLINE_ void add_constraint(Constraint2DSW *p_constraint, int p_pos) { constraint_map[p_constraint] = p_pos; }
_FORCE_INLINE_ void remove_constraint(Constraint2DSW *p_constraint) { constraint_map.erase(p_constraint); }
const Map<Constraint2DSW *, int> &get_constraint_map() const { return constraint_map; }
_FORCE_INLINE_ void clear_constraint_map() { constraint_map.clear(); }
_FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration = p_omit_force_integration; }
_FORCE_INLINE_ bool get_omit_force_integration() const { return omit_force_integration; }

View file

@ -516,6 +516,7 @@ BodyPair2DSW::BodyPair2DSW(Body2DSW *p_A, int p_shape_A, Body2DSW *p_B, int p_sh
}
BodyPair2DSW::~BodyPair2DSW() {
A->remove_constraint(this, 0);
B->remove_constraint(this, 1);
A->remove_constraint(this);
B->remove_constraint(this);
}

View file

@ -204,12 +204,11 @@ PinJoint2DSW::PinJoint2DSW(const Vector2 &p_pos, Body2DSW *p_body_a, Body2DSW *p
}
PinJoint2DSW::~PinJoint2DSW() {
if (A) {
A->remove_constraint(this, 0);
}
if (B) {
B->remove_constraint(this, 1);
}
if (A)
A->remove_constraint(this);
if (B)
B->remove_constraint(this);
}
//////////////////////////////////////////////
@ -351,8 +350,9 @@ GrooveJoint2DSW::GrooveJoint2DSW(const Vector2 &p_a_groove1, const Vector2 &p_a_
}
GrooveJoint2DSW::~GrooveJoint2DSW() {
A->remove_constraint(this, 0);
B->remove_constraint(this, 1);
A->remove_constraint(this);
B->remove_constraint(this);
}
//////////////////////////////////////////////
@ -463,6 +463,7 @@ DampedSpringJoint2DSW::DampedSpringJoint2DSW(const Vector2 &p_anchor_a, const Ve
}
DampedSpringJoint2DSW::~DampedSpringJoint2DSW() {
A->remove_constraint(this, 0);
B->remove_constraint(this, 1);
A->remove_constraint(this);
B->remove_constraint(this);
}

View file

@ -598,7 +598,7 @@ void Physics2DServerSW::body_set_space(RID p_body, RID p_space) {
if (body->get_space() == space)
return; //pointless
body->clear_constraint_list();
body->clear_constraint_map();
body->set_space(space);
};

View file

@ -37,8 +37,9 @@ void Step2DSW::_populate_island(Body2DSW *p_body, Body2DSW **p_island, Constrain
p_body->set_island_next(*p_island);
*p_island = p_body;
for (const List<Pair<Constraint2DSW *, int> >::Element *E = p_body->get_constraint_list().front(); E; E = E->next()) {
Constraint2DSW *c = (Constraint2DSW *)E->get().first;
for (Map<Constraint2DSW *, int>::Element *E = p_body->get_constraint_map().front(); E; E = E->next()) {
Constraint2DSW *c = (Constraint2DSW *)E->key();
if (c->get_island_step() == _step)
continue; //already processed
c->set_island_step(_step);
@ -46,7 +47,7 @@ void Step2DSW::_populate_island(Body2DSW *p_body, Body2DSW **p_island, Constrain
*p_constraint_island = c;
for (int i = 0; i < c->get_body_count(); i++) {
if (i == E->get().second)
if (i == E->get())
continue;
Body2DSW *b = c->get_body_ptr()[i];
if (b->get_island_step() == _step || b->get_mode() == Physics2DServer::BODY_MODE_STATIC || b->get_mode() == Physics2DServer::BODY_MODE_KINEMATIC)