From 16c75cf594a92b232e46f922d644ac0a70088bad Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Mon, 17 Feb 2014 14:35:09 -0800 Subject: Fix T38654: Using a non-camera object for the SetCamera Scene Actuator causes a segfault. Non-camera objects are not supported as cameras, and trying to use them just causes memory errors (some bad typecasts are involved). When converting a Scene Actuator, only use the object as a camera if it is actually a camera. Also, the logic brick UI now filters for camera objects, which should help avoid confusion. --- source/blender/makesrna/intern/rna_actuator.c | 4 ++-- source/gameengine/Converter/KX_ConvertActuators.cpp | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 7747c5e78b3..e5545f9cb95 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1479,10 +1479,10 @@ static void rna_def_scene_actuator(BlenderRNA *brna) RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Mode", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); - - /*XXX filter only camera objects */ + prop = RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); + RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Camera_object_poll"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Camera Object", "Set this Camera (leave empty to refer to self object)"); RNA_def_property_update(prop, NC_LOGIC, NULL); diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 26401fcd868..725e9815a67 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -758,7 +758,9 @@ void BL_ConvertActuators(const char* maggiename, mode = KX_SceneActuator::KX_SCENE_SET_CAMERA; if (sceneact->camera) { - cam = (KX_Camera*) converter->FindGameObject(sceneact->camera); + KX_GameObject *tmp = converter->FindGameObject(sceneact->camera); + if (tmp && tmp->GetGameObjectType() == SCA_IObject::OBJ_CAMERA) + cam = (KX_Camera*)tmp; } break; case ACT_SCENE_RESTART: -- cgit v1.2.3