[Bf-blender-cvs] [4cd3754] master: BGE: Fix for T44374 Crash when collision sensor deactivated

Jorge Bernal noreply at git.blender.org
Fri Apr 17 02:13:03 CEST 2015


Commit: 4cd37541b0e44315716d898cd84ee99d89634964
Author: Jorge Bernal
Date:   Fri Apr 17 02:02:30 2015 +0200
Branches: master
https://developer.blender.org/rB4cd37541b0e44315716d898cd84ee99d89634964

BGE: Fix for T44374 Crash when collision sensor deactivated

Don't allocate memory for sensor logic brick if it is deactivated

===================================================================

M	source/gameengine/Converter/KX_ConvertSensors.cpp

===================================================================

diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index b781e4d..854ae5b 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -119,542 +119,542 @@ void BL_ConvertSensors(struct Object* blenderobject,
 	sens = (bSensor*)blenderobject->sensors.first;
 
 	while (sens) {
-		SCA_ISensor* gamesensor=NULL;
-		/* All sensors have a pulse toggle, skipped ticks parameter, and invert field.     */
-		/* These are extracted here, and set when the sensor is added to the */
-		/* list.                                                             */
-		pos_pulsemode = (sens->pulse & SENS_PULSE_REPEAT)!=0;
-		neg_pulsemode = (sens->pulse & SENS_NEG_PULSE_MODE)!=0;
-		
-		skipped_ticks = sens->freq;
-		invert    = !(sens->invert == 0);
-		level     = !(sens->level == 0);
-		tap       = !(sens->tap == 0);
-
-		switch (sens->type)
-		{
-		case  SENS_ALWAYS:
-			{
-				
-				SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
-				if (eventmgr)
-				{
-					gamesensor = new SCA_AlwaysSensor(eventmgr, gameobj);
-				}
-				
-				break;
-			}
-			
-		case  SENS_DELAY:
+		if (!(sens->flag & SENS_DEACTIVATE)) {
+			SCA_ISensor* gamesensor=NULL;
+			/* All sensors have a pulse toggle, skipped ticks parameter, and invert field.     */
+			/* These are extracted here, and set when the sensor is added to the */
+			/* list.                                                             */
+			pos_pulsemode = (sens->pulse & SENS_PULSE_REPEAT)!=0;
+			neg_pulsemode = (sens->pulse & SENS_NEG_PULSE_MODE)!=0;
+
+			skipped_ticks = sens->freq;
+			invert    = !(sens->invert == 0);
+			level     = !(sens->level == 0);
+			tap       = !(sens->tap == 0);
+
+			switch (sens->type)
 			{
-				// we can reuse the Always event manager for the delay sensor
-				SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
-				if (eventmgr)
+			case  SENS_ALWAYS:
 				{
-					bDelaySensor* delaysensor = (bDelaySensor*)sens->data;
-					gamesensor = new SCA_DelaySensor(eventmgr, 
-						gameobj,
-						delaysensor->delay,
-						delaysensor->duration,
-						(delaysensor->flag & SENS_DELAY_REPEAT) != 0);
+
+					SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
+					if (eventmgr)
+					{
+						gamesensor = new SCA_AlwaysSensor(eventmgr, gameobj);
+					}
+
+					break;
 				}
-				break;
-			}
 
-		case SENS_COLLISION:
-			{
-				SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
-				if (eventmgr)
+			case  SENS_DELAY:
 				{
-					// collision sensor can sense both materials and properties. 
-					
-					bool bFindMaterial = false, bTouchPulse = false;
-					
-					bCollisionSensor* blendertouchsensor = (bCollisionSensor*)sens->data;
-					
-					bFindMaterial = (blendertouchsensor->mode & SENS_COLLISION_MATERIAL);
-					bTouchPulse = (blendertouchsensor->mode & SENS_COLLISION_PULSE);
-					
-					
-					const STR_String touchPropOrMatName = bFindMaterial ?
-					                                      blendertouchsensor->materialName : blendertouchsensor->name;
-					
-					
-					if (gameobj->GetPhysicsController())
+					// we can reuse the Always event manager for the delay sensor
+					SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
+					if (eventmgr)
 					{
-						gamesensor = new KX_TouchSensor(eventmgr,
+						bDelaySensor* delaysensor = (bDelaySensor*)sens->data;
+						gamesensor = new SCA_DelaySensor(eventmgr,
 							gameobj,
-							bFindMaterial,
-							bTouchPulse,
-							touchPropOrMatName);
+							delaysensor->delay,
+							delaysensor->duration,
+							(delaysensor->flag & SENS_DELAY_REPEAT) != 0);
 					}
-					
-				}
-				
-				break;
-			}
-		case SENS_MESSAGE:
-			{
-				KX_NetworkEventManager* eventmgr = (KX_NetworkEventManager*)
-					logicmgr->FindEventManager(SCA_EventManager::NETWORK_EVENTMGR);
-				if (eventmgr) {
-					bMessageSensor* msgSens = (bMessageSensor*) sens->data;
-					
-					/* Get our NetworkScene */
-					NG_NetworkScene *NetworkScene = kxscene->GetNetworkScene();
-					/* filter on the incoming subjects, might be empty */
-					const STR_String subject = msgSens->subject;
-					
-					gamesensor = new KX_NetworkMessageSensor(
-						eventmgr,		// our eventmanager
-						NetworkScene,	// our NetworkScene
-						gameobj,		// the sensor controlling object
-						subject);		// subject to filter on
+					break;
 				}
-				break;
-			}
-		case SENS_NEAR:
-			{
-				
-				SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
-				if (eventmgr)
+
+			case SENS_COLLISION:
 				{
-					bNearSensor* blendernearsensor = (bNearSensor*)sens->data;
-					const STR_String nearpropertyname = (char *)blendernearsensor->name;
-
-					//DT_ShapeHandle shape	=	DT_Sphere(0.0);
-					
-					// this sumoObject is not deleted by a gameobj, so delete it ourself
-					// later (memleaks)!
-					float radius = blendernearsensor->dist;
-					const MT_Vector3& wpos = gameobj->NodeGetWorldPosition();
-					bool bFindMaterial = false;
-					PHY_IPhysicsController* physCtrl = kxscene->GetPhysicsEnvironment()->CreateSphereController(radius,wpos);
-
-					//will be done in KX_TouchEventManager::RegisterSensor()  
-					//if (isInActiveLayer)
-					//	kxscene->GetPhysicsEnvironment()->addSensor(physCtrl);
-
-						
-
-					gamesensor = new KX_NearSensor(eventmgr,gameobj,
-						blendernearsensor->dist,
-						blendernearsensor->resetdist,
-						bFindMaterial,
-						nearpropertyname,
-						physCtrl);
-					
+					SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
+					if (eventmgr)
+					{
+						// collision sensor can sense both materials and properties.
+
+						bool bFindMaterial = false, bTouchPulse = false;
+
+						bCollisionSensor* blendertouchsensor = (bCollisionSensor*)sens->data;
+
+						bFindMaterial = (blendertouchsensor->mode & SENS_COLLISION_MATERIAL);
+						bTouchPulse = (blendertouchsensor->mode & SENS_COLLISION_PULSE);
+
+
+						const STR_String touchPropOrMatName = bFindMaterial ?
+															  blendertouchsensor->materialName : blendertouchsensor->name;
+
+
+						if (gameobj->GetPhysicsController())
+						{
+							gamesensor = new KX_TouchSensor(eventmgr,
+								gameobj,
+								bFindMaterial,
+								bTouchPulse,
+								touchPropOrMatName);
+						}
+
+					}
+
+					break;
 				}
-				break;
-			}
-			
-			
-		case SENS_KEYBOARD:
-			{
-				/* temporary input device, for converting the code for the keyboard sensor */
-				
-				bKeyboardSensor* blenderkeybdsensor = (bKeyboardSensor*)sens->data;
-				SCA_KeyboardManager* eventmgr = (SCA_KeyboardManager*) logicmgr->FindEventManager(SCA_EventManager::KEYBOARD_EVENTMGR);
-				if (eventmgr)
+			case SENS_MESSAGE:
 				{
-					gamesensor = new SCA_KeyboardSensor(eventmgr,
-						ConvertKeyCode(blenderkeybdsensor->key),
-						ConvertKeyCode(blenderkeybdsensor->qual),
-						ConvertKeyCode(blenderkeybdsensor->qual2),
-						(blenderkeybdsensor->type == SENS_ALL_KEYS),
-						blenderkeybdsensor->targetName,
-						blenderkeybdsensor->toggleName,
-						gameobj,
-						KX_KetsjiEngine::GetExitKey()); //			blenderkeybdsensor->pad);
-					
-				} 
-				
-				break;
-			}
-		case SENS_MOUSE:
-			{
-				int keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_NODEF;
-				int trackfocus = 0;
-				bMouseSensor *bmouse = (bMouseSensor *)sens->data;
-				
-				/* There are two main types of mouse sensors. If there is
-				 * no focus-related behavior requested, we can make do
-				 * with a basic sensor. This cuts down memory usage and
-				 * gives a slight performance gain. */
-				
-				SCA_MouseManager *eventmgr 
-					= (SCA_MouseManager*) logicmgr->FindEventManager(SCA_EventManager::MOUSE_EVENTMGR);
-				if (eventmgr) {
-					
-					/* Determine key mode. There is at most one active mode. */
-					switch (bmouse->type) {
-					case BL_SENS_MOUSE_LEFT_BUTTON:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_LEFTBUTTON;
-						break;
-					case BL_SENS_MOUSE_MIDDLE_BUTTON:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MIDDLEBUTTON;
-						break;
-					case BL_SENS_MOUSE_RIGHT_BUTTON:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_RIGHTBUTTON;
-						break;
-					case BL_SENS_MOUSE_WHEEL_UP:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELUP;
-						break;
-					case BL_SENS_MOUSE_WHEEL_DOWN:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_WHEELDOWN;
-						break;
-					case BL_SENS_MOUSE_MOVEMENT:
-						keytype = SCA_MouseSensor::KX_MOUSESENSORMODE_MOVEMENT;
-						break;
-					case BL_SENS_MOUSE_MOUSEOVER:
-						trackfocus = 1;
-						break;
-					case BL_SENS_MOUSE_MOUSEOVER_ANY:
-						trackfocus = 2;
-						break;
-
-					default:
-						; /* error */
+					KX_NetworkEventManager* eventmgr = (KX_NetworkEventManager*)
+						logicmgr->FindEventManager(SCA_EventManager::NETWORK_EVENTMGR);
+					if (eventmgr) {
+						bMessageSensor* msgSens = (bMessageSensor*) sens->data;
+
+						/* Get our NetworkScene */
+						NG_NetworkScene *NetworkScene = kxscene->GetNetworkScene();
+						/* filter on the incoming subjects, might be empty */
+						const STR_String subject = msgSens->subject;
+
+						gamesensor = new KX_NetworkMessageSensor(
+							eventmgr,		// our eventmanager
+							NetworkScene,	// our NetworkScene
+							gameobj,		// the sensor controlling object
+							subject);		// subject to filter on
 					}
-					
-					/* initial mouse position */				 
-					int startx  = canvas->GetWidth()/2;
-					int starty = canvas->GetHeight()/2;
-					
-					if (!trackfocus) {
-						/* plain, simple mouse sensor */
-						gamesensor = new SCA_MouseSensor(eventmgr,
-							startx,starty,
-							keytype,
-							gameobj);
-					} else {
-						/* give us a focus-aware sensor */
-						bool bFindMaterial = (bmouse->mode & SENS_COLLISION_MATERIAL);
-						bool bXRay = (bmouse->flag & SENS_RAY_XRAY);					
-						STR_String checkname = (bFindMaterial? bmouse->matname : bmouse->p

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list