Skip to content

Commit

Permalink
Merge pull request #20 from winterpixelgames/4.0
Browse files Browse the repository at this point in the history
4.0
  • Loading branch information
briansemrau authored Dec 8, 2020
2 parents 6f4a601 + 9089cf5 commit 63b8f67
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
41 changes: 34 additions & 7 deletions scene/2d/box2d_physics_body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ bool Box2DPhysicsBody::create_b2Body() {
ERR_FAIL_COND_V(!world_node->world, false);

// Create body
bodyDef.position = gd_to_b2(get_global_transform().get_origin());
bodyDef.angle = get_global_transform().get_rotation();
bodyDef.position = gd_to_b2(get_box2dworld_transform().get_origin());
bodyDef.angle = get_box2dworld_transform().get_rotation();

body = world_node->world->CreateBody(&bodyDef);
body->GetUserData().owner = this;
Expand Down Expand Up @@ -84,12 +84,36 @@ void Box2DPhysicsBody::update_filterdata() {
}
}

Transform2D Box2DPhysicsBody::get_box2dworld_transform() {
#ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(!world_node, get_global_transform());
#endif
return get_relative_transform_to_parent(world_node);
}

void Box2DPhysicsBody::set_box2dworld_transform(const Transform2D &p_transform) {

CanvasItem *pi = get_parent_item();
if (pi) {
set_transform(pi->get_global_transform().affine_inverse() * p_transform);
} else {
set_transform(p_transform);
}

Node2D *parent_2d = Object::cast_to<Node2D>(get_parent());
if(!parent_2d) {
ERR_PRINT("Unsupported Node in between physics world and physics body");
return;
}
set_transform(parent_2d->get_relative_transform_to_parent(world_node).affine_inverse() * p_transform);
}

void Box2DPhysicsBody::state_changed() {
set_block_transform_notify(true);
set_global_transform(b2_to_gd(body->GetTransform()));
set_box2dworld_transform(b2_to_gd(body->GetTransform()));
set_block_transform_notify(false);
//if (get_script_instance())
// get_script_instance()->call("_integrate_forces");
set_block_transform_notify(false);

// TODO something? check rigidbody2d impl
//if (contact_monitoring) {
Expand Down Expand Up @@ -117,7 +141,8 @@ void Box2DPhysicsBody::_notification(int p_what) {
} break;

case NOTIFICATION_ENTER_TREE: {
last_valid_xform = get_global_transform();
//last_valid_xform = get_global_transform();
last_valid_xform = get_box2dworld_transform();

// Find the Box2DWorld
Node *_ancestor = get_parent();
Expand Down Expand Up @@ -165,7 +190,9 @@ void Box2DPhysicsBody::_notification(int p_what) {

case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
// Send new transform to physics
Transform2D new_xform = get_global_transform();
//Transform2D new_xform = get_global_transform();
//Transform2D new_xform = get_box2dworld_transform();
Transform2D new_xform = get_box2dworld_transform();

bodyDef.position = gd_to_b2(new_xform.get_origin());
bodyDef.angle = new_xform.get_rotation();
Expand Down Expand Up @@ -227,7 +254,7 @@ void Box2DPhysicsBody::_notification(int p_what) {
b2WorldManifold worldManifold;
ce->contact->GetWorldManifold(&worldManifold);
for (int i = 0; i < count; i++) {
draw_circle(get_global_transform().xform_inv(b2_to_gd(worldManifold.points[i])), 1.0f, Color(1.0f, 1.0f, 0.0f));
draw_circle(get_box2dworld_transform().xform_inv(b2_to_gd(worldManifold.points[i])), 1.0f, Color(1.0f, 1.0f, 0.0f));
}

ce = ce->next;
Expand Down
4 changes: 4 additions & 0 deletions scene/2d/box2d_physics_body.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,12 @@ class Box2DPhysicsBody : public Node2D {
Set<Box2DJoint *> joints;

Transform2D last_valid_xform;

bool prev_sleeping_state = true;

void set_box2dworld_transform(const Transform2D &p_transform);
Transform2D get_box2dworld_transform();

void on_parent_created(Node *);

bool create_b2Body();
Expand Down

0 comments on commit 63b8f67

Please sign in to comment.