diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-09-02 23:13:40 -0300 |
---|---|---|
committer | Dana Olson <dana@shineuponthee.com> | 2014-09-15 17:43:28 -0400 |
commit | 247e7ed716a4c0bd5140c2b2a938f7118e84fb14 (patch) | |
tree | 2487f84d19ea60c4140c085164219a893a4f8566 /servers/physics_2d | |
parent | dbae857b293231882307c52217e9569a17da0f23 (diff) |
3D Physics and Other Stuff
-=-=-=-=-=-=-=-=-=-=-=-=-=
-New Vehicle (Based on Bullet's RaycastVehicle) - Vehiclebody/VehicleWheel. Demo will come soon, old vehicle (CarBody) will go away soon too.
-A lot of fixes to the 3D physics engine
-Added KinematicBody with demo
-Fixed the space query API for 2D (demo will come soon). 3D is WIP.
-Fixed long-standing bug with body_enter/body_exit for Area and Area2D
-Performance variables now includes physics (active bodies, collision pairs and islands)
-Ability to see what's inside of instanced scenes!
-Fixed Blend Shapes (no bs+skeleton yet)
-Added an Android JavaClassWrapper singleton for using Android native classes directly from GDScript. This is very Alpha!
Diffstat (limited to 'servers/physics_2d')
-rw-r--r-- | servers/physics_2d/area_2d_sw.h | 2 | ||||
-rw-r--r-- | servers/physics_2d/collision_solver_2d_sat.cpp | 4 | ||||
-rw-r--r-- | servers/physics_2d/physics_2d_server_sw.cpp | 32 | ||||
-rw-r--r-- | servers/physics_2d/physics_2d_server_sw.h | 7 | ||||
-rw-r--r-- | servers/physics_2d/shape_2d_sw.h | 1 | ||||
-rw-r--r-- | servers/physics_2d/space_2d_sw.cpp | 13 | ||||
-rw-r--r-- | servers/physics_2d/space_2d_sw.h | 12 | ||||
-rw-r--r-- | servers/physics_2d/step_2d_sw.cpp | 4 |
8 files changed, 68 insertions, 7 deletions
diff --git a/servers/physics_2d/area_2d_sw.h b/servers/physics_2d/area_2d_sw.h index 51e6ccd166..0eda1050fa 100644 --- a/servers/physics_2d/area_2d_sw.h +++ b/servers/physics_2d/area_2d_sw.h @@ -71,7 +71,7 @@ class Area2DSW : public CollisionObject2DSW{ return area_shape < p_key.area_shape; } else - return body_shape < p_key.area_shape; + return body_shape < p_key.body_shape; } else return rid < p_key.rid; diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp index 7d85183645..f73ed5732e 100644 --- a/servers/physics_2d/collision_solver_2d_sat.cpp +++ b/servers/physics_2d/collision_solver_2d_sat.cpp @@ -593,8 +593,8 @@ static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_tr //this collision is kind of pointless - if (!separator.test_previous_axis()) - return; + //if (!separator.test_previous_axis()) + // return; if (!separator.test_cast()) return; diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 2171a9c2c4..09fa3f9b6a 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -1086,9 +1086,15 @@ void Physics2DServerSW::step(float p_step) { last_step=p_step; Physics2DDirectBodyStateSW::singleton->step=p_step; + island_count=0; + active_objects=0; + collision_pairs=0; for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) { stepper->step((Space2DSW*)E->get(),p_step,iterations); + island_count+=E->get()->get_island_count(); + active_objects+=E->get()->get_active_objects(); + collision_pairs+=E->get()->get_collision_pairs(); } }; @@ -1118,6 +1124,27 @@ void Physics2DServerSW::finish() { memdelete(direct_state); }; +int Physics2DServerSW::get_process_info(ProcessInfo p_info) { + + switch(p_info) { + + case INFO_ACTIVE_OBJECTS: { + + return active_objects; + } break; + case INFO_COLLISION_PAIRS: { + return collision_pairs; + } break; + case INFO_ISLAND_COUNT: { + + return island_count; + } break; + + } + + return 0; +} + Physics2DServerSW::Physics2DServerSW() { @@ -1125,8 +1152,13 @@ Physics2DServerSW::Physics2DServerSW() { // BroadPhase2DSW::create_func=BroadPhase2DBasic::_create; active=true; + island_count=0; + active_objects=0; + collision_pairs=0; + }; + Physics2DServerSW::~Physics2DServerSW() { }; diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h index 09ca029127..7ffffe669f 100644 --- a/servers/physics_2d/physics_2d_server_sw.h +++ b/servers/physics_2d/physics_2d_server_sw.h @@ -47,6 +47,11 @@ friend class Physics2DDirectSpaceStateSW; bool doing_sync; real_t last_step; + int island_count; + int active_objects; + int collision_pairs; + + Step2DSW *stepper; Set<const Space2DSW*> active_spaces; @@ -223,6 +228,8 @@ public: virtual void flush_queries(); virtual void finish(); + int get_process_info(ProcessInfo p_info); + Physics2DServerSW(); ~Physics2DServerSW(); diff --git a/servers/physics_2d/shape_2d_sw.h b/servers/physics_2d/shape_2d_sw.h index d3fcf1fab2..8500a6194f 100644 --- a/servers/physics_2d/shape_2d_sw.h +++ b/servers/physics_2d/shape_2d_sw.h @@ -582,5 +582,6 @@ public: }; +#undef DEFAULT_PROJECT_RANGE_CAST #endif // SHAPE_2D_2DSW_H diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index 5fbf828c38..21a99cd4b2 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -323,7 +323,7 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32& p_s } -struct _RestCallbackData { +struct _RestCallbackData2D { const CollisionObject2DSW *object; const CollisionObject2DSW *best_object; @@ -337,7 +337,7 @@ struct _RestCallbackData { static void _rest_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) { - _RestCallbackData *rd=(_RestCallbackData*)p_userdata; + _RestCallbackData2D *rd=(_RestCallbackData2D*)p_userdata; Vector2 contact_rel = p_point_B - p_point_A; float len = contact_rel.length(); @@ -365,7 +365,7 @@ bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Matrix32& p_shape int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results); - _RestCallbackData rcd; + _RestCallbackData2D rcd; rcd.best_len=0; rcd.best_object=NULL; rcd.best_shape=0; @@ -443,6 +443,7 @@ void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,Collis } Space2DSW *self = (Space2DSW*)p_self; + self->collision_pairs++; if (type_A==CollisionObject2DSW::TYPE_AREA) { @@ -468,8 +469,8 @@ void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,Collis void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self) { - Space2DSW *self = (Space2DSW*)p_self; + self->collision_pairs--; Constraint2DSW *c = (Constraint2DSW*)p_data; memdelete(c); } @@ -646,6 +647,10 @@ Physics2DDirectSpaceStateSW *Space2DSW::get_direct_state() { Space2DSW::Space2DSW() { + collision_pairs=0; + active_objects=0; + island_count=0; + locked=false; contact_recycle_radius=0.01; contact_max_separation=0.05; diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h index bd41097fba..c638a0c45b 100644 --- a/servers/physics_2d/space_2d_sw.h +++ b/servers/physics_2d/space_2d_sw.h @@ -97,6 +97,10 @@ class Space2DSW { bool locked; + int island_count; + int active_objects; + int collision_pairs; + friend class Physics2DDirectSpaceStateSW; public: @@ -153,6 +157,14 @@ public: void set_param(Physics2DServer::SpaceParameter p_param, real_t p_value); real_t get_param(Physics2DServer::SpaceParameter p_param) const; + void set_island_count(int p_island_count) { island_count=p_island_count; } + int get_island_count() const { return island_count; } + + void set_active_objects(int p_active_objects) { active_objects=p_active_objects; } + int get_active_objects() const { return active_objects; } + + int get_collision_pairs() const { return collision_pairs; } + Physics2DDirectSpaceStateSW *get_direct_state(); Space2DSW(); diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp index 29f4a58287..e75f9300ce 100644 --- a/servers/physics_2d/step_2d_sw.cpp +++ b/servers/physics_2d/step_2d_sw.cpp @@ -137,6 +137,8 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) { active_count++; } + p_space->set_active_objects(active_count); + /* GENERATE CONSTRAINT ISLANDS */ Body2DSW *island_list=NULL; @@ -168,6 +170,8 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) { b=b->next(); } + p_space->set_island_count(island_count); + const SelfList<Area2DSW>::List &aml = p_space->get_moved_area_list(); |