From e7aa37fe757151e9e241728c628dde6ccb3e0c07 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sun, 3 May 2015 22:37:10 -0300 Subject: [PATCH] improved kinematic motion, improved demos for kinematic motion --- demos/2d/kinematic_char/circle.png | Bin 0 -> 6107 bytes demos/2d/kinematic_char/colworld.scn | Bin 6596 -> 7459 bytes demos/2d/kinematic_char/long_obstacle.png | Bin 0 -> 534 bytes demos/2d/kinematic_char/player.gd | 33 ++++++++--- scene/2d/physics_body_2d.cpp | 16 ++++++ scene/2d/physics_body_2d.h | 5 ++ scene/resources/theme.cpp | 18 ++++-- servers/physics_2d/space_2d_sw.cpp | 67 ++++++++++++---------- servers/physics_2d/space_2d_sw.h | 2 + 9 files changed, 97 insertions(+), 44 deletions(-) create mode 100644 demos/2d/kinematic_char/circle.png create mode 100644 demos/2d/kinematic_char/long_obstacle.png diff --git a/demos/2d/kinematic_char/circle.png b/demos/2d/kinematic_char/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb3ac4b9c2a73644222036e3848e9e23c705eed GIT binary patch literal 6107 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 iJiktR{=2RJ_itO=?83r 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 bP*C)8;B`-RU|^_GU}30MVCJ5@MN$9&KP~mG delta 4437 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 literal 0 HcmV?d00001 diff --git a/demos/2d/kinematic_char/player.gd b/demos/2d/kinematic_char/player.gd index e8b3cc8d00..3549ba3830 100644 --- a/demos/2d/kinematic_char/player.gd +++ b/demos/2d/kinematic_char/player.gd @@ -21,6 +21,8 @@ const STOP_FORCE = 1300 const JUMP_SPEED = 200 const JUMP_MAX_AIRBORNE_TIME=0.2 +const SLIDE_STOP_VELOCITY=1.0 #one pixel per second +const SLIDE_STOP_MIN_TRAVEL=1.0 #one pixel var velocity = Vector2() var on_air_time=100 var jumping=false @@ -86,16 +88,29 @@ func _fixed_process(delta): #char is on floor on_air_time=0 floor_velocity=get_collider_velocity() - #velocity.y=0 - #But we were moving and our motion was interrupted, - #so try to complete the motion by "sliding" - #by the normal - motion = n.slide(motion) - velocity = n.slide(velocity) - - #then move again - move(motion) + + if (on_air_time==0 and force.x==0 and get_travel().length() < SLIDE_STOP_MIN_TRAVEL and abs(velocity.x) < SLIDE_STOP_VELOCITY and get_collider_velocity()==Vector2()): + #Since this formula will always slide the character around, + #a special case must be considered to to stop it from moving + #if standing on an inclined floor. Conditions are: + # 1) Standin on floor (on_air_time==0) + # 2) Did not move more than one pixel (get_travel().length() < SLIDE_STOP_MIN_TRAVEL) + # 3) Not moving horizontally (abs(velocity.x) < SLIDE_STOP_VELOCITY) + # 4) Collider is not moving + + revert_motion() + velocity.y=0.0 + + else: + #For every other case of motion,our motion was interrupted. + #Try to complete the motion by "sliding" + #by the normal + + motion = n.slide(motion) + velocity = n.slide(velocity) + #then move again + move(motion) if (floor_velocity!=Vector2()): #if floor moves, move with floor diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 6fb798714f..9fd4a25e7f 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -925,6 +925,19 @@ Variant KinematicBody2D::_get_collider() const { return obj; } +void KinematicBody2D::revert_motion() { + + Matrix32 gt = get_global_transform(); + gt.elements[2]-=travel; + travel=Vector2(); + set_global_transform(gt); + +} + +Vector2 KinematicBody2D::get_travel() const { + + return travel; +} Vector2 KinematicBody2D::move(const Vector2& p_motion) { @@ -942,6 +955,7 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) { Matrix32 gt = get_global_transform(); gt.elements[2]+=result.motion; set_global_transform(gt); + travel=result.motion; return result.remainder; #else @@ -1173,6 +1187,8 @@ void KinematicBody2D::_bind_methods() { ObjectTypeDB::bind_method(_MD("move_to","position"),&KinematicBody2D::move_to); ObjectTypeDB::bind_method(_MD("test_move","rel_vec"),&KinematicBody2D::test_move); + ObjectTypeDB::bind_method(_MD("get_travel"),&KinematicBody2D::get_travel); + ObjectTypeDB::bind_method(_MD("revert_motion"),&KinematicBody2D::revert_motion); ObjectTypeDB::bind_method(_MD("is_colliding"),&KinematicBody2D::is_colliding); diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 3cb94b95da..b6be07500f 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -280,6 +280,7 @@ class KinematicBody2D : public PhysicsBody2D { ObjectID collider; int collider_shape; Variant collider_metadata; + Vector2 travel; Variant _get_collider() const; @@ -294,6 +295,10 @@ public: bool test_move(const Vector2& p_motion); bool is_colliding() const; + + Vector2 get_travel() const; + void revert_motion(); + Vector2 get_collision_pos() const; Vector2 get_collision_normal() const; Vector2 get_collider_velocity() const; diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp index 8350bf8cc8..21bdb6c0ab 100644 --- a/scene/resources/theme.cpp +++ b/scene/resources/theme.cpp @@ -105,6 +105,9 @@ bool Theme::_get(const StringName& p_name,Variant &r_ret) const { void Theme::_get_property_list( List *p_list) const { + + List list; + const StringName *key=NULL; while((key=icon_map.next(key))) { @@ -113,7 +116,7 @@ void Theme::_get_property_list( List *p_list) const { while((key2=icon_map[*key].next(key2))) { - p_list->push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/icons/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "Texture" ) ); + list.push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/icons/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "Texture" ) ); } } @@ -125,7 +128,7 @@ void Theme::_get_property_list( List *p_list) const { while((key2=style_map[*key].next(key2))) { - p_list->push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/styles/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "StyleBox" ) ); + list.push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/styles/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "StyleBox" ) ); } } @@ -138,7 +141,7 @@ void Theme::_get_property_list( List *p_list) const { while((key2=font_map[*key].next(key2))) { - p_list->push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/fonts/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "Font" ) ); + list.push_back( PropertyInfo( Variant::OBJECT, String()+*key+"/fonts/"+*key2, PROPERTY_HINT_RESOURCE_TYPE, "Font" ) ); } } @@ -150,7 +153,7 @@ void Theme::_get_property_list( List *p_list) const { while((key2=color_map[*key].next(key2))) { - p_list->push_back( PropertyInfo( Variant::COLOR, String()+*key+"/colors/"+*key2 ) ); + list.push_back( PropertyInfo( Variant::COLOR, String()+*key+"/colors/"+*key2 ) ); } } @@ -162,9 +165,14 @@ void Theme::_get_property_list( List *p_list) const { while((key2=constant_map[*key].next(key2))) { - p_list->push_back( PropertyInfo( Variant::INT, String()+*key+"/constants/"+*key2 ) ); + list.push_back( PropertyInfo( Variant::INT, String()+*key+"/constants/"+*key2 ) ); } } + + list.sort(); + for(List::Element *E=list.front();E;E=E->next()) { + p_list->push_back(E->get()); + } } diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index 40e7b19f6f..b38cf0c2df 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -555,38 +555,10 @@ Physics2DDirectSpaceStateSW::Physics2DDirectSpaceStateSW() { - -bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p_margin,Physics2DServer::MotionResult *r_result) { - - //give me back regular physics engine logic - //this is madness - //and most people using this function will think - //what it does is simpler than using physics - //this took about a week to get right.. - //but is it right? who knows at this point.. - - Rect2 body_aabb; - - for(int i=0;iget_shape_count();i++) { - - if (i==0) - body_aabb=p_body->get_shape_aabb(i); - else - body_aabb=body_aabb.merge(p_body->get_shape_aabb(i)); - } - - body_aabb=body_aabb.grow(p_margin); - - { - //add motion - - Rect2 motion_aabb=body_aabb; - motion_aabb.pos+=p_motion; - body_aabb=body_aabb.merge(motion_aabb); - } +int Space2DSW::_cull_aabb_for_body(Body2DSW *p_body,const Rect2& p_aabb) { - int amount = broadphase->cull_aabb(body_aabb,intersection_query_results,INTERSECTION_QUERY_MAX,intersection_query_subindex_results); + int amount = broadphase->cull_aabb(p_aabb,intersection_query_results,INTERSECTION_QUERY_MAX,intersection_query_subindex_results); for(int i=0;iget_shape_count();i++) { + + if (i==0) + body_aabb=p_body->get_shape_aabb(i); + else + body_aabb=body_aabb.merge(p_body->get_shape_aabb(i)); + } + + body_aabb=body_aabb.grow(p_margin); + + Matrix32 body_transform = p_body->get_transform(); { @@ -642,6 +639,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p bool collided=false; + int amount = _cull_aabb_for_body(p_body,body_aabb); for(int j=0;jget_shape_count();j++) { if (p_body->is_shape_set_as_trigger(j)) @@ -694,6 +692,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p } body_transform.elements[2]+=recover_motion; + body_aabb.pos+=recover_motion; recover_attempts--; @@ -709,7 +708,11 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p { // STEP 2 ATTEMPT MOTION + Rect2 motion_aabb=body_aabb; + motion_aabb.pos+=p_motion; + motion_aabb=motion_aabb.merge(body_aabb); + int amount = _cull_aabb_for_body(p_body,motion_aabb); for(int j=0;jget_shape_count();j++) { @@ -847,6 +850,10 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p Matrix32 body_shape_xform = ugt * p_body->get_shape_transform(best_shape); Shape2DSW *body_shape = p_body->get_shape(best_shape); + body_aabb.pos+=p_motion*unsafe; + + int amount = _cull_aabb_for_body(p_body,body_aabb); + for(int i=0;i