Browse Source

Fiex bullet crash

Andrea Catania 7 years ago
parent
commit
b252e66414

+ 6 - 1
modules/bullet/area_bullet.cpp

@@ -30,6 +30,7 @@
 
 
 #include "area_bullet.h"
 #include "area_bullet.h"
 
 
+#include "bullet_physics_server.h"
 #include "bullet_types_converter.h"
 #include "bullet_types_converter.h"
 #include "bullet_utilities.h"
 #include "bullet_utilities.h"
 #include "collision_object_bullet.h"
 #include "collision_object_bullet.h"
@@ -57,6 +58,7 @@ AreaBullet::AreaBullet() :
 		spOv_priority(0) {
 		spOv_priority(0) {
 
 
 	btGhost = bulletnew(btGhostObject);
 	btGhost = bulletnew(btGhostObject);
+	btGhost->setCollisionShape(BulletPhysicsServer::get_empty_shape());
 	setupBulletCollisionObject(btGhost);
 	setupBulletCollisionObject(btGhost);
 	/// Collision objects with a callback still have collision response with dynamic rigid bodies.
 	/// Collision objects with a callback still have collision response with dynamic rigid bodies.
 	/// In order to use collision objects as trigger, you have to disable the collision response.
 	/// In order to use collision objects as trigger, you have to disable the collision response.
@@ -162,7 +164,10 @@ bool AreaBullet::is_monitoring() const {
 }
 }
 
 
 void AreaBullet::main_shape_resetted() {
 void AreaBullet::main_shape_resetted() {
-	btGhost->setCollisionShape(get_main_shape());
+	if (get_main_shape())
+		btGhost->setCollisionShape(get_main_shape());
+	else
+		btGhost->setCollisionShape(BulletPhysicsServer::get_empty_shape());
 }
 }
 
 
 void AreaBullet::reload_body() {
 void AreaBullet::reload_body() {

+ 1 - 1
modules/bullet/bullet_physics_server.h

@@ -61,7 +61,7 @@ class BulletPhysicsServer : public PhysicsServer {
 	mutable RID_Owner<JointBullet> joint_owner;
 	mutable RID_Owner<JointBullet> joint_owner;
 
 
 private:
 private:
-	/// This is used when a collision shape is not active, so the bullet compound shapes index are always sync with godot index
+	/// This is used as replacement of collision shape inside a compound or main shape
 	static btEmptyShape *emptyShape;
 	static btEmptyShape *emptyShape;
 
 
 public:
 public:

+ 5 - 2
modules/bullet/rigid_body_bullet.cpp

@@ -279,7 +279,7 @@ RigidBodyBullet::RigidBodyBullet() :
 
 
 	// Initial properties
 	// Initial properties
 	const btVector3 localInertia(0, 0, 0);
 	const btVector3 localInertia(0, 0, 0);
-	btRigidBody::btRigidBodyConstructionInfo cInfo(mass, godotMotionState, NULL, localInertia);
+	btRigidBody::btRigidBodyConstructionInfo cInfo(mass, godotMotionState, BulletPhysicsServer::get_empty_shape(), localInertia);
 
 
 	btBody = bulletnew(btRigidBody(cInfo));
 	btBody = bulletnew(btRigidBody(cInfo));
 	setupBulletCollisionObject(btBody);
 	setupBulletCollisionObject(btBody);
@@ -315,7 +315,10 @@ void RigidBodyBullet::destroy_kinematic_utilities() {
 }
 }
 
 
 void RigidBodyBullet::main_shape_resetted() {
 void RigidBodyBullet::main_shape_resetted() {
-	btBody->setCollisionShape(get_main_shape());
+	if (get_main_shape())
+		btBody->setCollisionShape(get_main_shape());
+	else
+		btBody->setCollisionShape(BulletPhysicsServer::get_empty_shape());
 	set_continuous_collision_detection(is_continuous_collision_detection_enabled()); // Reset
 	set_continuous_collision_detection(is_continuous_collision_detection_enabled()); // Reset
 }
 }