From 4b3b5eba86d89e65e751b9e9b8e901a17f8e35ef Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Thu, 19 Mar 2015 23:53:54 +0000 Subject: Use Vector for storing areas --- core/vector.h | 11 ++++++++++- servers/physics/body_sw.h | 9 ++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/vector.h b/core/vector.h index 90a9bf715b..d6453a3b83 100644 --- a/core/vector.h +++ b/core/vector.h @@ -149,7 +149,16 @@ public: sort_custom<_DefaultComparator >(); } - + void ordered_insert(const T& p_val) { + int i; + for (i=0; iget_self() < p_cmp.area->get_self() ; } + _FORCE_INLINE_ bool operator==(const AreaCMP& p_cmp) const { return area->get_self() == p_cmp.area->get_self();} + _FORCE_INLINE_ bool operator<(const AreaCMP a) const { return area->get_priority() < a.area->get_priority();} _FORCE_INLINE_ AreaCMP() {} _FORCE_INLINE_ AreaCMP(AreaSW *p_area) { area=p_area;} }; - - VSet areas; + Vector areas; struct Contact { @@ -134,8 +134,7 @@ public: void set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata=Variant()); - - _FORCE_INLINE_ void add_area(AreaSW *p_area) { areas.insert(AreaCMP(p_area)); } + _FORCE_INLINE_ void add_area(AreaSW *p_area) { areas.ordered_insert(AreaCMP(p_area)); } _FORCE_INLINE_ void remove_area(AreaSW *p_area) { areas.erase(AreaCMP(p_area)); } _FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; if (mode==PhysicsServer::BODY_MODE_KINEMATIC && p_size) set_active(true);} -- cgit v1.2.3 From 18a1403fcf3ea8907001178ba413bd8b10da815b Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 20 Mar 2015 03:38:12 +0000 Subject: Implement combine mode for area --- servers/physics/body_sw.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp index c7c20a8bd1..9638e8a3b3 100644 --- a/servers/physics/body_sw.cpp +++ b/servers/physics/body_sw.cpp @@ -358,10 +358,10 @@ void BodySW::_compute_area_gravity(const AreaSW *p_area) { if (p_area->is_gravity_point()) { - gravity = (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity(); + gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity(); } else { - gravity = p_area->get_gravity_vector() * p_area->get_gravity(); + gravity += p_area->get_gravity_vector() * p_area->get_gravity(); } } @@ -371,23 +371,28 @@ void BodySW::integrate_forces(real_t p_step) { if (mode==PhysicsServer::BODY_MODE_STATIC) return; - AreaSW *current_area = get_space()->get_default_area(); - ERR_FAIL_COND(!current_area); + AreaSW *def_area = get_space()->get_default_area(); + ERR_FAIL_COND(!def_area); - int prio = current_area->get_priority(); int ac = areas.size(); + bool replace = false; + gravity=Vector3(0,0,0); if (ac) { const AreaCMP *aa = &areas[0]; - for(int i=0;iget_priority() > prio) { - current_area=aa[i].area; - prio=current_area->get_priority(); + density = aa[ac-1].area->get_density(); + for(int i=ac-1;i>=0;i--) { + _compute_area_gravity(aa[i].area); + if (aa[i].area->get_space_override_mode() == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE) { + replace = true; + break; } } + } else { + density=def_area->get_density(); + } + if( !replace ) { + _compute_area_gravity(def_area); } - - _compute_area_gravity(current_area); - density=current_area->get_density(); Vector3 motion; bool do_motion=false; @@ -455,7 +460,7 @@ void BodySW::integrate_forces(real_t p_step) { } - current_area=NULL; // clear the area, so it is set in the next frame + def_area=NULL; // clear the area, so it is set in the next frame contact_count=0; } -- cgit v1.2.3 From 600bae34bd4a2d57a1c8c7b108b873846b26830e Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Tue, 24 Mar 2015 04:05:56 +0000 Subject: Re-sort Area array during integration step --- servers/physics/body_sw.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp index 9638e8a3b3..5682ad8498 100644 --- a/servers/physics/body_sw.cpp +++ b/servers/physics/body_sw.cpp @@ -378,6 +378,7 @@ void BodySW::integrate_forces(real_t p_step) { bool replace = false; gravity=Vector3(0,0,0); if (ac) { + areas.sort(); const AreaCMP *aa = &areas[0]; density = aa[ac-1].area->get_density(); for(int i=ac-1;i>=0;i--) { -- cgit v1.2.3