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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to