Browse Source

-Fix crash at exit due to unnecesary check in command queue, fixes #2034
-Fix memory corruption due to using wrong singleton in multithreaded physics, fixes #2760

Juan Linietsky 9 years ago
parent
commit
0e71d49ef4
3 changed files with 6 additions and 5 deletions
  1. 1 1
      core/command_queue_mt.h
  2. 1 0
      demos/2d/rubegoldberg/engine.cfg
  3. 4 4
      servers/physics_2d/space_2d_sw.cpp

+ 1 - 1
core/command_queue_mt.h

@@ -983,7 +983,7 @@ public:
 	
 	void flush_all() {
 			
-		ERR_FAIL_COND(sync);
+		//ERR_FAIL_COND(sync);
 		lock();
 		while (true) {
 			bool exit = !flush_one();

+ 1 - 0
demos/2d/rubegoldberg/engine.cfg

@@ -6,5 +6,6 @@ icon="res://icon.png"
 
 [physics_2d]
 
+thread_model=2
 default_gravity=500
 default_density=0.01

+ 4 - 4
servers/physics_2d/space_2d_sw.cpp

@@ -192,7 +192,7 @@ int Physics2DDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Matri
 	if (p_result_max<=0)
 		return 0;
 
-	Shape2DSW *shape = static_cast<Physics2DServerSW*>(Physics2DServer::get_singleton())->shape_owner.get(p_shape);
+	Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
 	ERR_FAIL_COND_V(!shape,0);
 
 	Rect2 aabb = p_xform.xform(shape->get_aabb());
@@ -239,7 +239,7 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32
 
 
 
-	Shape2DSW *shape = static_cast<Physics2DServerSW*>(Physics2DServer::get_singleton())->shape_owner.get(p_shape);
+	Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
 	ERR_FAIL_COND_V(!shape,false);
 
 	Rect2 aabb = p_xform.xform(shape->get_aabb());
@@ -367,7 +367,7 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32& p_s
 	if (p_result_max<=0)
 		return 0;
 
-	Shape2DSW *shape = static_cast<Physics2DServerSW*>(Physics2DServer::get_singleton())->shape_owner.get(p_shape);
+	Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
 	ERR_FAIL_COND_V(!shape,0);
 
 	Rect2 aabb = p_shape_xform.xform(shape->get_aabb());
@@ -474,7 +474,7 @@ static void _rest_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,v
 bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
 
 
-	Shape2DSW *shape = static_cast<Physics2DServerSW*>(Physics2DServer::get_singleton())->shape_owner.get(p_shape);
+	Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
 	ERR_FAIL_COND_V(!shape,0);
 
 	Rect2 aabb = p_shape_xform.xform(shape->get_aabb());