diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2014-07-18 10:00:30 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2014-07-18 10:00:30 +0400 |
commit | 73079730638f1f21c04b075839d87377315e8f86 (patch) | |
tree | cb00518c3e35b0e73ba3998585fa3bd3a8ee33e6 /source/blender | |
parent | 841ade32bee1ce9128b98c11d0fc3ae6d74aaf86 (diff) |
BGE: Add property/material detection and X-Ray for mouse over any sensor
This patch adds a Property/Material detection and a X-Ray mode to the mouse over any sensor like on the ray sensor.
Proposal:
http://blenderartists.org/forum/showthread.php?261847-BGE-proposal-Mouse-Over-Any-sensor-with-Property-and-X-Ray&highlight=proposal
Reviewers: moguri
Reviewed By: moguri
Differential Revision: https://developer.blender.org/D653
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/space_logic/logic_window.c | 26 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_sensor_types.h | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_sensor.c | 27 |
3 files changed, 53 insertions, 4 deletions
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 32547275e56..1a0aab75fb8 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -1144,15 +1144,35 @@ static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "subject", 0, NULL, ICON_NONE); } -static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr) +static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr, bContext *C) { - uiLayout *split; + uiLayout *split, *split2; + + Object *ob = (Object *)ptr->id.data; + PointerRNA main_ptr; split = uiLayoutSplit(layout, 0.8f, false); uiItemR(split, ptr, "mouse_event", 0, NULL, ICON_NONE); if (RNA_enum_get(ptr, "mouse_event") == BL_SENS_MOUSE_MOUSEOVER_ANY) + { uiItemR(split, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + + split = uiLayoutSplit(layout, 0.3f, false); + uiItemR(split, ptr, "use_material", 0, "", ICON_NONE); + + split2 = uiLayoutSplit(split, 0.7f, false); + if (RNA_enum_get(ptr, "use_material") == SENS_RAY_PROPERTY) + { + uiItemR(split2, ptr, "property", 0, "", ICON_NONE); + } + else + { + RNA_main_pointer_create(CTX_data_main(C), &main_ptr); + uiItemPointerR(split2, ptr, "material", &main_ptr, "materials", "", ICON_MATERIAL_DATA); + } + uiItemR(split2, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); + } } static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr) @@ -1273,7 +1293,7 @@ static void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C) draw_sensor_message(box, ptr); break; case SENS_MOUSE: - draw_sensor_mouse(box, ptr); + draw_sensor_mouse(box, ptr, C); break; case SENS_NEAR: draw_sensor_near(box, ptr); diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h index cd1977c0ce3..8d59a13768b 100644 --- a/source/blender/makesdna/DNA_sensor_types.h +++ b/source/blender/makesdna/DNA_sensor_types.h @@ -57,7 +57,9 @@ typedef struct bMouseSensor { short type; short flag; short pad1; - short pad2; + short mode; /* flag to choose material or property */ + char propname[64]; + char matname[64]; } bMouseSensor; /* DEPRECATED */ diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index aeef04f4ac7..3944b59dff7 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -405,6 +405,12 @@ static void rna_def_mouse_sensor(BlenderRNA *brna) {0, NULL, 0, NULL, NULL} }; + static const EnumPropertyItem prop_mouse_type_items[] = { + {SENS_COLLISION_PROPERTY, "PROPERTY", ICON_LOGIC, "Property", "Use a material for ray intersections"}, + {SENS_COLLISION_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "Material", "Use a property for ray intersections"}, + {0, NULL, 0, NULL, NULL} + }; + srna = RNA_def_struct(brna, "MouseSensor", "Sensor"); RNA_def_struct_ui_text(srna, "Mouse Sensor", "Sensor to detect mouse events"); RNA_def_struct_sdna_from(srna, "bMouseSensor", "data"); @@ -419,6 +425,27 @@ static void rna_def_mouse_sensor(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_MOUSE_FOCUS_PULSE); RNA_def_property_ui_text(prop, "Pulse", "Moving the mouse over a different object generates a pulse"); RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop = RNA_def_property(srna, "use_material", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_mouse_type_items); + RNA_def_property_ui_text(prop, "M/P", "Toggle collision on material or property"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop = RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "propname"); + RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop = RNA_def_property(srna, "material", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "matname"); + RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop = RNA_def_property(srna, "use_x_ray", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_RAY_XRAY); + RNA_def_property_ui_text(prop, "X-Ray", "Toggle X-Ray option (see through objects that don't have the property)"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } static void rna_def_keyboard_sensor(BlenderRNA *brna) |