Skip to content

Commit

Permalink
Trigger broadphase update when changing collision layer/mask, and
Browse files Browse the repository at this point in the history
check for collision layer/mask changes in 2D hash grid broadphase update.
  • Loading branch information
madmiraal committed Jun 27, 2020
1 parent 3e3972d commit de284ea
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 30 deletions.
10 changes: 8 additions & 2 deletions servers/physics/collision_object_sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,16 @@ class CollisionObjectSW : public ShapeOwnerSW {
return shapes[p_idx].disabled;
}

_FORCE_INLINE_ void set_collision_layer(uint32_t p_layer) { collision_layer = p_layer; }
_FORCE_INLINE_ void set_collision_layer(uint32_t p_layer) {
collision_layer = p_layer;
_shape_changed();
}
_FORCE_INLINE_ uint32_t get_collision_layer() const { return collision_layer; }

_FORCE_INLINE_ void set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; }
_FORCE_INLINE_ void set_collision_mask(uint32_t p_mask) {
collision_mask = p_mask;
_shape_changed();
}
_FORCE_INLINE_ uint32_t get_collision_mask() const { return collision_mask; }

_FORCE_INLINE_ bool test_collision_mask(CollisionObjectSW *p_other) const {
Expand Down
51 changes: 25 additions & 26 deletions servers/physics_2d/broad_phase_2d_hash_grid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
/*************************************************************************/

#include "broad_phase_2d_hash_grid.h"
#include "collision_object_2d_sw.h"
#include "core/project_settings.h"

#define LARGE_ELEMENT_FI 1.01239812
Expand Down Expand Up @@ -76,23 +77,22 @@ void BroadPhase2DHashGrid::_check_motion(Element *p_elem) {

for (Map<Element *, PairData *>::Element *E = p_elem->paired.front(); E; E = E->next()) {

bool pairing = p_elem->aabb.intersects(E->key()->aabb);
bool physical_collision = p_elem->aabb.intersects(E->key()->aabb);
bool logical_collision = p_elem->owner->test_collision_mask(E->key()->owner);

if (pairing != E->get()->colliding) {

if (pairing) {

if (pair_callback) {
E->get()->ud = pair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, pair_userdata);
}
} else {

if (unpair_callback) {
unpair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, E->get()->ud, unpair_userdata);
}
if (physical_collision) {
if (!E->get()->colliding || (logical_collision && !E->get()->ud && pair_callback)) {
E->get()->ud = pair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, pair_userdata);
} else if (E->get()->colliding && !logical_collision && E->get()->ud && unpair_callback) {
unpair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, E->get()->ud, unpair_userdata);
E->get()->ud = nullptr;
}

E->get()->colliding = pairing;
E->get()->colliding = true;
} else { // No physcial_collision
if (E->get()->colliding && unpair_callback) {
unpair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, E->get()->ud, unpair_userdata);
}
E->get()->colliding = false;
}
}
}
Expand Down Expand Up @@ -339,25 +339,24 @@ void BroadPhase2DHashGrid::move(ID p_id, const Rect2 &p_aabb) {

Element &e = E->get();

if (p_aabb == e.aabb)
return;
if (p_aabb != e.aabb) {

if (p_aabb != Rect2()) {
if (p_aabb != Rect2()) {

_enter_grid(&e, p_aabb, e._static);
}
_enter_grid(&e, p_aabb, e._static);
}

if (e.aabb != Rect2()) {
if (e.aabb != Rect2()) {

_exit_grid(&e, e.aabb, e._static);
}
_exit_grid(&e, e.aabb, e._static);
}

e.aabb = p_aabb;
e.aabb = p_aabb;
}

_check_motion(&e);

e.aabb = p_aabb;
}

void BroadPhase2DHashGrid::set_static(ID p_id, bool p_static) {

Map<ID, Element>::Element *E = element_map.find(p_id);
Expand Down
10 changes: 8 additions & 2 deletions servers/physics_2d/collision_object_2d_sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,10 +169,16 @@ class CollisionObject2DSW : public ShapeOwner2DSW {
return shapes[p_idx].one_way_collision_margin;
}

void set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; }
void set_collision_mask(uint32_t p_mask) {
collision_mask = p_mask;
_shape_changed();
}
_FORCE_INLINE_ uint32_t get_collision_mask() const { return collision_mask; }

void set_collision_layer(uint32_t p_layer) { collision_layer = p_layer; }
void set_collision_layer(uint32_t p_layer) {
collision_layer = p_layer;
_shape_changed();
}
_FORCE_INLINE_ uint32_t get_collision_layer() const { return collision_layer; }

void remove_shape(Shape2DSW *p_shape);
Expand Down

0 comments on commit de284ea

Please sign in to comment.