diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2010-05-04 04:06:13 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2010-05-04 04:06:13 +0400 |
commit | 44c0f38e6ceb6d7b2a07aa23b2c0811a609d17d5 (patch) | |
tree | 586192ad47d9191ef26aabbf9d7af2c4232af193 /source | |
parent | e09c47a0daeee84f6c17498620c3b8e9dca8ba9b (diff) |
BGE Logics UI: commit to receive some feedback from Matt
To test use debug mode > 0 (Ctrl+Alt+D)
* primarly the goal is to put all the bricks there, and then to worry about the proper layout
* sensor header added (need to be more compressed). Also checkbox will not work that well here in my opinion.
we need to see what can be used instead (icons?)
* sensors, and actuators in alphabetical order
* a lot of sensors using the rna (//XXXSENSOR in the ones not using it)
* the logic_window.c code for controller and actuator is there only to display the draw functions for controller and actuators. But the code it's a really bad copy of the sensor code, so it will be fixed later (Matt? :)
* I would love if the non-expanded mode were more compact, more like in 2.49 (the name non-editable).
but this is the kind of think we can worry in the end.
Also instead of "move up/move down" it would be nice to drag/drop the sensors/controllers/actuators
* to do: rna_actuators: to rename type to mode for the enum
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/space_logic/logic_ops.c | 279 | ||||
-rw-r--r-- | source/blender/editors/space_logic/logic_window.c | 495 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_controller_types.h | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_sensor_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_enum_types.h | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_actuator.c | 67 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_controller.c | 52 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_sensor.c | 53 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_space.c | 42 |
9 files changed, 924 insertions, 73 deletions
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c index 0ed1367e7ea..92db4748ce3 100644 --- a/source/blender/editors/space_logic/logic_ops.c +++ b/source/blender/editors/space_logic/logic_ops.c @@ -30,6 +30,8 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_sensor_types.h" +#include "DNA_controller_types.h" +#include "DNA_actuator_types.h" #include "BLI_blenlib.h" @@ -59,6 +61,22 @@ static int edit_sensor_poll(bContext *C) return 1; } +static int edit_controller_poll(bContext *C) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "controller", &RNA_Controller); + + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + return 1; +} + +static int edit_actuator_poll(bContext *C) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "actuator", &RNA_Actuator); + + if (ptr.data && ((ID*)ptr.id.data)->lib) return 0; + return 1; +} + /* this is the nice py-api-compatible way to do it, like modifiers, but not entirely working yet.. @@ -104,8 +122,95 @@ static bSensor *edit_sensor_property_get(bContext *C, wmOperator *op, Object *ob return sens; } */ +/* +static void edit_controller_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "controller", "", 32, "Controller", "Name of the controller to edit"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the controller belongs to"); +} + +static int edit_controller_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "controller", &RNA_Controller); + + if (RNA_property_is_set(op->ptr, "controller") && RNA_property_is_set(op->ptr, "object") ) + return 1; + + if (ptr.data) { + bController *cont = ptr.data; + Object *ob = ptr.id.data; + + RNA_string_set(op->ptr, "controller", cont->name); + RNA_string_set(op->ptr, "object", ob->id.name+2); + return 1; + } + + return 0; +} + +static bController *edit_controller_property_get(bContext *C, wmOperator *op, Object *ob) +{ + char controller_name[32]; + char ob_name[32]; + bController *cont; + + RNA_string_get(op->ptr, "controller", controller_name); + RNA_string_get(op->ptr, "object", ob_name); + + ob = BLI_findstring(&(CTX_data_main(C)->object), ob_name, offsetof(ID, name) + 2); + if (!ob) + return NULL; + + cont = BLI_findstring(&(ob->controllers), controller_name, offsetof(bController, name)); + return cont; +} + */ + +/* +static void edit_actuator_properties(wmOperatorType *ot) +{ + RNA_def_string(ot->srna, "actuator", "", 32, "Actuator", "Name of the actuator to edit"); + RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the actuator belongs to"); +} + +static int edit_actuator_invoke_properties(bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "actuator", &RNA_Actuator); + + if (RNA_property_is_set(op->ptr, "actuator") && RNA_property_is_set(op->ptr, "object") ) + return 1; + + if (ptr.data) { + bActuator *act = ptr.data; + Object *ob = ptr.id.data; + + RNA_string_set(op->ptr, "actuator",act->name); + RNA_string_set(op->ptr, "object", ob->id.name+2); + return 1; + } + + return 0; +} + +static bController *edit_actuator_property_get(bContext *C, wmOperator *op, Object *ob) +{ + char actuator_name[32]; + char ob_name[32]; + bActuator *act; + + RNA_string_get(op->ptr, "actuator", actuator_name); + RNA_string_get(op->ptr, "object", ob_name); + + ob = BLI_findstring(&(CTX_data_main(C)->object), ob_name, offsetof(ID, name) + 2); + if (!ob) + return NULL; + + cont = BLI_findstring(&(ob->actuators), actuator_name, offsetof(bActuator, name)); + return act; +} + -/* ************* Remove Sensor Operator ************* */ +/* ************* Add/Remove Sensor Operator ************* */ static int sensor_remove_exec(bContext *C, wmOperator *op) { @@ -189,8 +294,180 @@ void LOGIC_OT_sensor_add(wmOperatorType *ot) prop= RNA_def_enum(ot->srna, "type", sensor_type_items, SENS_ALWAYS, "Type", "Type of sensor to add"); } +/* ************* Add/Remove Controller Operator ************* */ + +static int controller_remove_exec(bContext *C, wmOperator *op) +{ + /* Object *ob; + bController *cont = edit_controller_property_get(C, op, ob); */ + PointerRNA ptr = CTX_data_pointer_get_type(C, "controller", &RNA_Controller); + Object *ob= ptr.id.data; + bController *cont= ptr.data; + + if (!cont) + return OPERATOR_CANCELLED; + + BLI_remlink(&(ob->controllers), cont); + free_controller(cont); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + + +/* commented along with above stuff + static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_controller_invoke_properties(C, op)) + return controller_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + */ + +void LOGIC_OT_controller_remove(wmOperatorType *ot) +{ + ot->name= "Remove Controller"; + ot->description= "Remove a controller from the active object"; + ot->idname= "LOGIC_OT_controller_remove"; + + //ot->invoke= controller_remove_invoke; + ot->exec= controller_remove_exec; + ot->poll= edit_controller_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + //edit_controller_properties(ot); +} + +static int controller_add_exec(bContext *C, wmOperator *op) +{ + Object *ob = ED_object_active_context(C); + bController *cont; + int type= RNA_enum_get(op->ptr, "type"); + + cont= new_controller(type); + BLI_addtail(&(ob->controllers), cont); + make_unique_prop_names(C, cont->name); + ob->scaflag |= OB_SHOWCONT; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void LOGIC_OT_controller_add(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Add Controller"; + ot->description = "Add a controller to the active object"; + ot->idname= "LOGIC_OT_controller_add"; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= controller_add_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + prop= RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add"); +} + +/* ************* Add/Remove Actuator Operator ************* */ + +static int actuator_remove_exec(bContext *C, wmOperator *op) +{ + /* Object *ob; + bActuator *cont = edit_actuator_property_get(C, op, ob); */ + PointerRNA ptr = CTX_data_pointer_get_type(C, "actuator", &RNA_Actuator); + Object *ob= ptr.id.data; + bActuator *act= ptr.data; + + if (!act) + return OPERATOR_CANCELLED; + + BLI_remlink(&(ob->actuators), act); + free_actuator(act); + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + + +/* commented along with above stuff + static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + if (edit_actuator_invoke_properties(C, op)) + return actuator_remove_exec(C, op); + else + return OPERATOR_CANCELLED; +} + */ + +void LOGIC_OT_actuator_remove(wmOperatorType *ot) +{ + ot->name= "Remove Actuator"; + ot->description= "Remove a actuator from the active object"; + ot->idname= "LOGIC_OT_actuator_remove"; + + //ot->invoke= actuator_remove_invoke; + ot->exec= actuator_remove_exec; + ot->poll= edit_actuator_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + //edit_controller_properties(ot); +} + +static int actuator_add_exec(bContext *C, wmOperator *op) +{ + Object *ob = ED_object_active_context(C); + bActuator *act; + int type= RNA_enum_get(op->ptr, "type"); + + act= new_actuator(type); + BLI_addtail(&(ob->actuators), act); + make_unique_prop_names(C, act->name); + ob->scaflag |= OB_SHOWCONT; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void LOGIC_OT_actuator_add(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Add Actuator"; + ot->description = "Add a actuator to the active object"; + ot->idname= "LOGIC_OT_actuator_add"; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= actuator_add_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + prop= RNA_def_enum(ot->srna, "type", actuator_type_items, CONT_LOGIC_AND, "Type", "Type of actuator to add"); +} + void ED_operatortypes_logic(void) { WM_operatortype_append(LOGIC_OT_sensor_remove); WM_operatortype_append(LOGIC_OT_sensor_add); + WM_operatortype_append(LOGIC_OT_controller_remove); + WM_operatortype_append(LOGIC_OT_controller_add); + WM_operatortype_append(LOGIC_OT_actuator_remove); + WM_operatortype_append(LOGIC_OT_actuator_add); } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index de8c5ae6ba2..6e145a69139 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -3170,6 +3170,8 @@ static int is_sensor_linked(uiBlock *block, bSensor *sens) /* never used, see CVS 1.120 for the code */ /* static uiBlock *freecamera_menu(void) */ +/* Sensors code */ + static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr) { uiLayout *box, *row; @@ -3183,17 +3185,154 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr) uiItemO(row, "", ICON_X, "LOGIC_OT_sensor_remove"); } +static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box, *row; -static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr) + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + row= uiLayoutRow(box, 0); + uiItemR(row, ptr, "pulse_true_level", 0, "", ICON_DOTSUP); + uiItemR(row, ptr, "pulse_false_level", 0, "", ICON_DOTSDOWN); + uiItemR(row, ptr, "frequency", 0, "", 0); + uiItemR(row, ptr, "level", 0, "", 0); + uiItemR(row, ptr, "tap", 0, "", 0); + uiItemR(row, ptr, "invert", 0, "", 0); +} +/* sensors in alphabetical order */ + +static void draw_sensor_actuator(uiLayout *layout, PointerRNA *ptr) { - uiItemR(layout, ptr, "material", 0, NULL, 0); + uiItemR(layout, ptr, "actuator", 0, NULL, 0); +} + +static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "armature_type", 0, NULL, 0); + uiItemR(layout, ptr, "channel_name", 0, NULL, 0); + uiItemR(layout, ptr, "constraint_name", 0, NULL, 0); + uiItemR(layout, ptr, "value", 0, NULL, 0); +} + +static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr) +{ + //XXXSENSOR + /* // need to solve problems in rna_sensor.c + uiItemR(layout, ptr, "pulse", 0, NULL, 0); + uiItemR(layout, ptr, "collision_type", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "collision_type")) { + case SENS_COLLISION_PROPERTY: + uiItemR(layout, ptr, "property", 0, NULL, 0); + break; + case SENS_COLLISION_MATERIAL: + uiItemR(layout, ptr, "material", 0, NULL, 0); + break; + } + */ } static void draw_sensor_delay(uiLayout *layout, PointerRNA *ptr) { - uiItemR(layout, ptr, "delay", 0, NULL, 0); - uiItemR(layout, ptr, "duration", 0, NULL, 0); - uiItemR(layout, ptr, "repeat", 0, NULL, 0); + uiLayout *row; + + row= uiLayoutRow(layout, 0); + + uiItemR(row, ptr, "delay", 0, NULL, 0); + uiItemR(row, ptr, "duration", 0, NULL, 0); + uiItemR(row, ptr, "repeat", 0, NULL, 0); +} + +static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr) +{ + //XXXSENSOR +} + +static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "key", 0, NULL, 0); + uiItemR(layout, ptr, "all_keys", 0, NULL, 0); + uiItemR(layout, ptr, "modifier_key", 0, NULL, 0); + uiItemR(layout, ptr, "second_modifier_key", 0, NULL, 0); + uiItemR(layout, ptr, "target", 0, NULL, 0); + uiItemR(layout, ptr, "log", 0, NULL, 0); + + //XXXSENSOR +} + +static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "subject", 0, NULL, 0); +} + +static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mouse_event", 0, NULL, 0); +} + +static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "property", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "distance", 0, NULL, 0); + uiItemR(row, ptr, "reset_distance", 0, NULL, 0); +} + +static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + uiItemR(layout, ptr, "evaluation_type", 0, NULL, 0); + uiItemR(layout, ptr, "property", 0, NULL, 0); + + switch (RNA_enum_get(ptr, "evaluation_type")) { + case SENS_PROP_INTERVAL: + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "min_value", 0, NULL, 0); + uiItemR(row, ptr, "max_value", 0, NULL, 0); + break; + case SENS_PROP_EQUAL: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case SENS_PROP_NEQUAL: + uiItemR(layout, ptr, "value", 0, NULL, 0); + break; + case SENS_PROP_CHANGED: + break; + } +} + +static void draw_sensor_radar(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "property", 0, NULL, 0); + uiItemR(layout, ptr, "axis", 0, NULL, 0); + + row= uiLayoutRow(layout, 0); + uiItemR(layout, ptr, "angle", 0, NULL, 0); + uiItemR(layout, ptr, "distance", 0, NULL, 0); +} + +static void draw_sensor_random(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "seed", 0, NULL, 0); +} + +static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr) +{ + //XXXSENSOR +} + +static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "material", 0, NULL, 0); } void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr) @@ -3204,16 +3343,176 @@ void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr) return; box = uiLayoutBox(layout); + + draw_sensor_internal_header(box, ptr); switch (RNA_enum_get(ptr, "type")) { + + case SENS_ACTUATOR: + draw_sensor_actuator(box, ptr); + break; case SENS_ALWAYS: break; - case SENS_TOUCH: - draw_sensor_touch(box, ptr); + case SENS_ARMATURE: + draw_sensor_armature(box, ptr); + break; + case SENS_COLLISION: + draw_sensor_collision(box, ptr); break; case SENS_DELAY: draw_sensor_delay(box, ptr); break; + case SENS_JOYSTICK: + draw_sensor_joystick(box, ptr); + break; + case SENS_KEYBOARD: + draw_sensor_keyboard(box, ptr); + break; + case SENS_MESSAGE: + draw_sensor_message(box, ptr); + break; + case SENS_MOUSE: + draw_sensor_mouse(box, ptr); + break; + case SENS_NEAR: + draw_sensor_near(box, ptr); + break; + case SENS_PROPERTY: + draw_sensor_property(box, ptr); + break; + case SENS_RADAR: + draw_sensor_radar(box, ptr); + break; + case SENS_RANDOM: + draw_sensor_random(box, ptr); + break; + case SENS_RAY: + draw_sensor_ray(box, ptr); + break; + case SENS_TOUCH: + draw_sensor_touch(box, ptr); + break; + } +} + +/* Controller code */ +static void draw_controller_header(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box, *row; + + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + uiItemR(row, ptr, "expanded", UI_ITEM_R_NO_BG, "", 0); + uiItemR(row, ptr, "type", 0, "", 0); + uiItemR(row, ptr, "name", 0, "", 0); + uiItemR(row, ptr, "priority", 0, "", 0); + uiItemO(row, "", ICON_X, "LOGIC_OT_controller_remove"); +} + +static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "expression", 0, NULL, 0); +} + +static void draw_controller_python(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + if (RNA_enum_get(ptr, "mode") == CONT_PY_SCRIPT) { + uiItemR(layout, ptr, "text", 0, NULL, 0); + } + else { + row= uiLayoutRow(layout, 0); + uiItemR(row, ptr, "module", 0, NULL, 0); + uiItemR(row, ptr, "debug", 0, NULL, 0); + } +} + +static void draw_controller_state(uiLayout *layout, PointerRNA *ptr) +{ + +} + +void draw_brick_controller(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box; + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + box = uiLayoutBox(layout); + + draw_controller_state(box, ptr); + + switch (RNA_enum_get(ptr, "type")) { + case CONT_LOGIC_AND: + break; + case CONT_LOGIC_OR: + break; + case CONT_EXPRESSION: + draw_controller_expression(box, ptr); + break; + case CONT_PYTHON: + draw_controller_python(box, ptr); + break; + case CONT_LOGIC_NAND: + break; + case CONT_LOGIC_NOR: + break; + case CONT_LOGIC_XOR: + break; + case CONT_LOGIC_XNOR: + break; + } +} + +/* Actuator code */ +static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box, *row; + + box= uiLayoutBox(layout); + row= uiLayoutRow(box, 0); + + uiItemR(row, ptr, "expanded", UI_ITEM_R_NO_BG, "", 0); + uiItemR(row, ptr, "type", 0, "", 0); + uiItemR(row, ptr, "name", 0, "", 0); + uiItemO(row, "", ICON_X, "LOGIC_OT_actuator_remove"); +} + +static void draw_actuator_scene(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mode", 0, NULL, 0); + uiItemR(layout, ptr, "camera", 0, NULL, 0); + uiItemR(layout, ptr, "scene", 0, NULL, 0); +} + +static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr) +{ + uiItemR(layout, ptr, "mode", 0, NULL, 0); + uiItemR(layout, ptr, "object", 0, NULL, 0); + uiItemR(layout, ptr, "compound", 0, NULL, 0); + uiItemR(layout, ptr, "ghost", 0, NULL, 0); +} + +void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *box; + + if (!RNA_boolean_get(ptr, "expanded")) + return; + + box = uiLayoutBox(layout); + + switch (RNA_enum_get(ptr, "type")) { + case ACT_PARENT: + draw_actuator_parent(box, ptr); + break; + case ACT_SCENE: + draw_actuator_scene(box, ptr); + break; } } @@ -3269,6 +3568,112 @@ void logic_buttons(bContext *C, ARegion *ar) /* ******************************* */ xco= 400; yco= 170; width= 300; + + if (G.rt >0) { // new UI code to replace old one + + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); + row = uiLayoutRow(layout, 1); + + uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco, 70, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */ + + uiItemR(row, &logic_ptr, "controllers_show_selected_objects", 0, "Sel", 0); + uiItemR(row, &logic_ptr, "controllers_show_active_objects", 0, "Act", 0); + uiItemR(row, &logic_ptr, "controllers_show_linked_controller", 0, "Link", 0); + + + + /* State part - ugly */ + if(ob->scaflag & OB_SHOWCONT) { + unsigned int controller_state_mask = 0; /* store a bitmask for states that are used */ + + /* first show the state */ + uiDefBlockBut(block, object_state_mask_menu, ob, "State", (short)(xco-10), (short)(yco-10), 36, UI_UNIT_Y, "Object state menu: store and retrieve initial state"); + + if (!ob->state) + ob->state = 1; + for (offset=0; offset<15; offset+=5) { + uiBlockBeginAlign(block); + for (stbit=0; stbit<5; stbit++) { + but = uiDefButBitI(block, controller_state_mask&(1<<(stbit+offset)) ? BUT_TOGDUAL:TOG, 1<<(stbit+offset), stbit+offset, "", (short)(xco+31+12*stbit+13*offset), yco, 12, 12, (int *)&(ob->state), 0, 0, 0, 0, get_state_name(ob, (short)(stbit+offset))); + uiButSetFunc(but, check_state_mask, but, &(ob->state)); + } + for (stbit=0; stbit<5; stbit++) { + but = uiDefButBitI(block, controller_state_mask&(1<<(stbit+offset+15)) ? BUT_TOGDUAL:TOG, 1<<(stbit+offset+15), stbit+offset+15, "", (short)(xco+31+12*stbit+13*offset), yco-12, 12, 12, (int *)&(ob->state), 0, 0, 0, 0, get_state_name(ob, (short)(stbit+offset+15))); + uiButSetFunc(but, check_state_mask, but, &(ob->state)); + } + } + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, OB_SETSTBIT, B_SET_STATE_BIT, "All",(short)(xco+226), yco-10, 22, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Set all state bits"); + uiDefButBitS(block, TOG, OB_INITSTBIT, B_INIT_STATE_BIT, "Ini",(short)(xco+248), yco-10, 22, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Set the initial state"); + uiDefButBitS(block, TOG, OB_DEBUGSTATE, 0, "D",(short)(xco+270), yco-10, 15, UI_UNIT_Y, &ob->scaflag, 0, 0, 0, 0, "Print state debug info"); + uiBlockEndAlign(block); + + yco-=35; + + /* display only the controllers that match the current state */ + offset = 0; + for (stbit=0; stbit<32; stbit++) { + if (!(ob->state & (1<<stbit))) + continue; + /* add a separation between controllers of different states */ + if (offset) { + offset = 0; + yco -= 6; + } + + //draw controller + } + } +// cont= ob->controllers.first; + /* draw individual controllers*/ + + row = uiLayoutRow(layout, 1); + uiDefButBitS(block, TOG, OB_SHOWCONT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide controllers"); + uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", 0); + + for(a=0; a<count; a++) { + PointerRNA ptr; + uiLayout *split, *col; + ob= (Object *)idar[a]; + + if (!(ob->scavisflag & OB_VIS_CONT) || !(ob->scaflag & OB_SHOWCONT)) continue; + + uiItemS(layout); + + for(cont= ob->controllers.first; cont; cont=cont->next) { + RNA_pointer_create(&ob->id, &RNA_Controller, cont, &ptr); + +// if (!(cont->state_mask & (1<<stbit))) +// continue; + + /* this controller is visible, mark all its actuator */ + for (iact=0; iact<cont->totlinks; iact++) { + act = cont->links[iact]; + if (act) + act->flag |= ACT_VISIBLE; + } + + split = uiLayoutSplit(layout, 0.95, 0); + col = uiLayoutColumn(split, 1); + uiLayoutSetContextPointer(col, "controller", &ptr); + + /* should make UI template for controller header.. function will do for now */ + draw_controller_header(col, &ptr); + + /* draw the brick contents */ + draw_brick_controller(col, &ptr); + + /* put link button to the right */ + col = uiLayoutColumn(split, 0); + /* use oldskool uiButtons for links for now */ + but= uiDefIconBut(block, LINK, 0, ICON_LINK, (short)(xco+width+UI_UNIT_X), yco, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + uiSetButLink(but, NULL, (void ***)&(cont->links), &cont->totlinks, LINK_CONTROLLER, LINK_ACTUATOR); + } + } + uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ + + + } else { //G.rt == 0 // to be removed ... old code uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco+35, 100, UI_UNIT_Y, ""); uiBlockBeginAlign(block); @@ -3405,12 +3810,12 @@ void logic_buttons(bContext *C, ARegion *ar) yco-= 6; } } - + } //XXX endif G.rt == 0 // new UI code to replace old one + /* ******************************* */ - xco= 10; yco= 205; width= 320; + xco= 10; yco= 170; width= 300; -#if 0 - + if (G.rt >0) { //XXX new UI code to replace old one layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); row = uiLayoutRow(layout, 1); @@ -3442,7 +3847,7 @@ void logic_buttons(bContext *C, ARegion *ar) (sens->flag & SENS_PIN && slogic->scaflag & BUTS_SENS_STATE) || /* states can hide some sensors, pinned sensors ignore the visible state */ (is_sensor_linked(block, sens)) ) - { + { // gotta check if the current state is visible or not uiLayout *split, *col; split = uiLayoutSplit(layout, 0.95, 0); @@ -3464,9 +3869,8 @@ void logic_buttons(bContext *C, ARegion *ar) } } uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ -#endif + } else { //XXX G.rt == 0 { // to be removed == new UI code to replace old one -#if 1 uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco+35, 70, UI_UNIT_Y, ""); uiBlockBeginAlign(block); @@ -3548,12 +3952,71 @@ void logic_buttons(bContext *C, ARegion *ar) yco-= 6; } } -#endif + } //XXX endif G.rt == 0 // new UI code to replace old one /* ******************************* */ xco= 800; yco= 170; width= 300; + + if (G.rt >0) { //XXX new UI code to replace old one + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, xco, yco, width, 20, U.uistyles.first); + row = uiLayoutRow(layout, 1); + + uiDefBlockBut(block, sensor_menu, NULL, "Actuators", xco-10, yco, 70, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */ + + uiItemR(row, &logic_ptr, "actuators_show_selected_objects", 0, "Sel", 0); + uiItemR(row, &logic_ptr, "actuators_show_active_objects", 0, "Act", 0); + uiItemR(row, &logic_ptr, "actuators_show_linked_controller", 0, "Link", 0); + uiItemR(row, &logic_ptr, "actuators_show_active_states", 0, "State", 0); + + row = uiLayoutRow(layout, 1); + uiDefButBitS(block, TOG, OB_SHOWACT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide actuators"); + uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", 0); + for(a=0; a<count; a++) { + PointerRNA ptr; + + ob= (Object *)idar[a]; + + if (!(ob->scavisflag & OB_VIS_ACT) || !(ob->scaflag & OB_SHOWACT)) continue; + + uiItemS(layout); + + for(act= ob->actuators.first; act; act=act->next) { + + RNA_pointer_create(&ob->id, &RNA_Actuator, act, &ptr); + + if ((slogic->scaflag & BUTS_ACT_STATE) || + !(act->flag & ACT_LINKED) || /* always display actuators without links so that is can be edited */ + (act->flag & ACT_VISIBLE) || /* this actuator has visible connection, display it */ + (act->flag & ACT_PIN && slogic->scaflag & BUTS_ACT_STATE) /* states can hide some sensors, pinned sensors ignore the visible state */ + ) + { // gotta check if the current state is visible or not + uiLayout *split, *col; + + split = uiLayoutSplit(layout, 0.95, 0); + col = uiLayoutColumn(split, 1); + uiLayoutSetContextPointer(col, "actuator", &ptr); + + /* should make UI template for actuator header.. function will do for now */ + draw_actuator_header(col, &ptr); + + /* draw the brick contents */ + draw_brick_actuator(col, &ptr); + + /* put link button to the right */ + col = uiLayoutColumn(split, 0); + /* use oldskool uiButtons for links for now */ + + uiDefIconBut(block, INLINK, 0, ICON_INLINK,(short)(xco-19), ycoo, UI_UNIT_X, UI_UNIT_Y, act, LINK_ACTUATOR, 0, 0, 0, ""); + } + } + } + uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ + + } else { //XXX G.rt == 0 { // to be removed == new UI code to replace old one + + uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco+35, 90, UI_UNIT_Y, ""); uiBlockBeginAlign(block); @@ -3632,6 +4095,8 @@ void logic_buttons(bContext *C, ARegion *ar) } } + } //XXX endif G.rt == 0 // new UI code to replace old one + uiComposeLinks(block); uiEndBlock(C, block); diff --git a/source/blender/makesdna/DNA_controller_types.h b/source/blender/makesdna/DNA_controller_types.h index 026f2a489fc..fcd5587b14b 100644 --- a/source/blender/makesdna/DNA_controller_types.h +++ b/source/blender/makesdna/DNA_controller_types.h @@ -84,5 +84,9 @@ typedef struct bController { /* pyctrl->flag */ #define CONT_PY_DEBUG 1 +/* pyctrl->mode */ +#define CONT_PY_SCRIPT 0 +#define CONT_PY_MODULE 1 + #endif diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h index 3bbcb128f07..f8c9097bdc9 100644 --- a/source/blender/makesdna/DNA_sensor_types.h +++ b/source/blender/makesdna/DNA_sensor_types.h @@ -261,6 +261,7 @@ typedef struct bJoystickSensor { * and have a proper default value for this thing. * */ /* #define SENS_COLLISION_PROPERTY 0 */ +#define SENS_COLLISION_PROPERTY 0 // uncommenting to use with RNA/UI. will check if it's working/fix it later - dfelinto #define SENS_COLLISION_MATERIAL 1 #define SENS_COLLISION_PULSE 2 /* ray specific mode */ diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 13a743201a8..c8d9febb96f 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -77,6 +77,10 @@ extern EnumPropertyItem object_type_curve_items[]; extern EnumPropertyItem sensor_type_items[]; +extern EnumPropertyItem controller_type_items[]; + +extern EnumPropertyItem actuator_type_items[]; + extern EnumPropertyItem space_type_items[]; extern EnumPropertyItem keymap_propvalue_items[]; diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 88bd88ec746..db6cc5c717c 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -33,8 +33,31 @@ #include "WM_types.h" +EnumPropertyItem actuator_type_items[] ={ + {ACT_ACTION, "ACTION", 0, "Action", ""}, + {ACT_ARMATURE, "ARMATURE", 0, "Armature", ""}, + {ACT_CAMERA, "CAMERA", 0, "Camera", ""}, + {ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""}, + {ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""}, + {ACT_2DFILTER, "FILTER_2D", 0, "2D Filter", ""}, + {ACT_GAME, "GAME", 0, "Game", ""}, + {ACT_IPO, "IPO", 0, "IPO", ""}, + {ACT_MESSAGE, "MESSAGE", 0, "Message", ""}, + {ACT_OBJECT, "OBJECT", 0, "Motion", ""}, + {ACT_PARENT, "PARENT", 0, "Parent", ""}, + {ACT_PROPERTY, "PROPERTY", 0, "Property", ""}, + {ACT_RANDOM, "RANDOM", 0, "Random", ""}, + {ACT_SCENE, "SCENE", 0, "Scene", ""}, + {ACT_SHAPEACTION, "SHAPE_ACTION", 0, "Shape Action", ""}, + {ACT_SOUND, "SOUND", 0, "Sound", ""}, + {ACT_STATE, "STATE", 0, "State", ""}, + {ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BKE_sca.h" + static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) { bActuator *actuator= (bActuator*)ptr->data; @@ -79,6 +102,13 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) } } +static void rna_Actuator_type_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bActuator *act= (bActuator *)ptr->data; + + init_actuator(act); +} + #else void rna_def_actuator(BlenderRNA *brna) @@ -86,27 +116,6 @@ void rna_def_actuator(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem actuator_type_items[] ={ - {ACT_OBJECT, "OBJECT", 0, "Motion", ""}, - {ACT_IPO, "IPO", 0, "IPO", ""}, - {ACT_CAMERA, "CAMERA", 0, "Camera", ""}, - {ACT_SOUND, "SOUND", 0, "Sound", ""}, - {ACT_PROPERTY, "PROPERTY", 0, "Property", ""}, - {ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""}, - {ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""}, - {ACT_SCENE, "SCENE", 0, "Scene", ""}, - {ACT_RANDOM, "RANDOM", 0, "Random", ""}, - {ACT_MESSAGE, "MESSAGE", 0, "Message", ""}, - {ACT_ACTION, "ACTION", 0, "Action", ""}, - {ACT_GAME, "GAME", 0, "Game", ""}, - {ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""}, - {ACT_2DFILTER, "FILTER_2D", 0, "2D Filter", ""}, - {ACT_PARENT, "PARENT", 0, "Parent", ""}, - {ACT_SHAPEACTION, "SHAPE_ACTION", 0, "Shape Action", ""}, - {ACT_STATE, "STATE", 0, "State", ""}, - {ACT_ARMATURE, "ARMATURE", 0, "Armature", ""}, - {0, NULL, 0, NULL, NULL}}; - srna= RNA_def_struct(brna, "Actuator", NULL); RNA_def_struct_ui_text(srna, "Actuator", "Actuator to apply actions in the game engine"); RNA_def_struct_sdna(srna, "bActuator"); @@ -115,12 +124,18 @@ void rna_def_actuator(BlenderRNA *brna) prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); RNA_def_property_ui_text(prop, "Name", ""); - /* type is not editable, would need to do proper data free/alloc */ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, actuator_type_items); RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_update(prop, 0, "rna_Actuator_type_update"); + + prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_SHOW); + RNA_def_property_ui_text(prop, "Expanded", "Set actuator expanded in the user interface"); + RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); + } static void rna_def_object_actuator(BlenderRNA *brna) @@ -688,7 +703,8 @@ static void rna_def_scene_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Scene Actuator", "Actuator to .."); RNA_def_struct_sdna_from(srna, "bSceneActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Scene", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -1021,7 +1037,8 @@ static void rna_def_parent_actuator(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Parent Actuator", ""); RNA_def_struct_sdna_from(srna, "bParentActuator", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Scene", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c index 67c7bd0f2d8..fe68fbc6b7c 100644 --- a/source/blender/makesrna/intern/rna_controller.c +++ b/source/blender/makesrna/intern/rna_controller.c @@ -30,8 +30,21 @@ #include "DNA_controller_types.h" +EnumPropertyItem controller_type_items[] ={ + {CONT_LOGIC_AND, "LOGIC_AND", 0, "And", "Logic And"}, + {CONT_LOGIC_OR, "LOGIC_OR", 0, "Or", "Logic Or"}, + {CONT_LOGIC_NAND, "LOGIC_NAND", 0, "Nand", "Logic Nand"}, + {CONT_LOGIC_NOR, "LOGIC_NOR", 0, "Nor", "Logic Nor"}, + {CONT_LOGIC_XOR, "LOGIC_XOR", 0, "Xor", "Logic Xor"}, + {CONT_LOGIC_XNOR, "LOGIC_XNOR", 0, "Xnor", "Logic Xnor"}, + {CONT_EXPRESSION, "EXPRESSION", 0, "Expression", ""}, + {CONT_PYTHON, "PYTHON", 0, "Python Script", ""}, + {0, NULL, 0, NULL, NULL}}; + #ifdef RNA_RUNTIME +#include "BKE_sca.h" + static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) { bController *controller= (bController*)ptr->data; @@ -58,21 +71,23 @@ static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr) } } +static void rna_Controller_type_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bController *cont= (bController *)ptr->data; + + init_controller(cont); +} + #else void RNA_def_controller(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem controller_type_items[] ={ - {CONT_LOGIC_AND, "LOGIC_AND", 0, "Logic And", ""}, - {CONT_LOGIC_OR, "LOGIC_OR", 0, "Logic Or", ""}, - {CONT_LOGIC_NAND, "LOGIC_NAND", 0, "Logic Nand", ""}, - {CONT_LOGIC_NOR, "LOGIC_NOR", 0, "Logic Nor", ""}, - {CONT_LOGIC_XOR, "LOGIC_XOR", 0, "Logic Xor", ""}, - {CONT_LOGIC_XNOR, "LOGIC_XNOR", 0, "Logic Xnor", ""}, - {CONT_EXPRESSION, "EXPRESSION", 0, "Expression", ""}, - {CONT_PYTHON, "PYTHON", 0, "Python Script", ""}, + + static EnumPropertyItem python_controller_modes[] ={ + {CONT_PY_SCRIPT, "SCRIPT", 0, "Script", ""}, + {CONT_PY_MODULE, "MODULE", 0, "Module", ""}, {0, NULL, 0, NULL, NULL}}; /* Controller */ @@ -85,12 +100,23 @@ void RNA_def_controller(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Name", ""); RNA_def_struct_name_property(srna, prop); - /* type is not editable, would need to do proper data free/alloc */ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, controller_type_items); RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_update(prop, 0, "rna_Controller_type_update"); + + prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_SHOW); + RNA_def_property_ui_text(prop, "Expanded", "Set controller expanded in the user interface"); + RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); + + prop= RNA_def_property(srna, "priority", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_PRIO); + RNA_def_property_ui_text(prop, "Priority", "Mark controller for execution before all non-marked controllers (good for startup scripts)"); + RNA_def_property_ui_icon(prop, ICON_BOOKMARKS, 1); + /* Expression Controller */ srna= RNA_def_struct(brna, "ExpressionController", "Controller"); RNA_def_struct_sdna_from(srna, "bExpressionCont", "data"); @@ -106,6 +132,10 @@ void RNA_def_controller(BlenderRNA *brna) RNA_def_struct_sdna_from(srna, "bPythonCont", "data"); RNA_def_struct_ui_text(srna, "Python Controller", "Controller executing a python script"); + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, python_controller_modes); + RNA_def_property_ui_text(prop, "Execution Method", "Python script type (textblock or module - faster)"); + prop= RNA_def_property(srna, "text", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Text"); RNA_def_property_flag(prop, PROP_EDITABLE); diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index 3159591625a..b4147fba2a6 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -31,21 +31,21 @@ #include "DNA_sensor_types.h" EnumPropertyItem sensor_type_items[] ={ + {SENS_ACTUATOR, "ACTUATOR", 0, "Actuator", ""}, {SENS_ALWAYS, "ALWAYS", 0, "Always", ""}, - {SENS_TOUCH, "TOUCH", 0, "Touch", ""}, - {SENS_NEAR, "NEAR", 0, "Near", ""}, + {SENS_ARMATURE, "ARMATURE", 0, "Armature", ""}, + {SENS_COLLISION, "COLLISION", 0, "Collision", ""}, + {SENS_DELAY, "DELAY", 0, "Delay", ""}, + {SENS_JOYSTICK, "JOYSTICK", 0, "Joystick", ""}, {SENS_KEYBOARD, "KEYBOARD", 0, "Keyboard", ""}, - {SENS_PROPERTY, "PROPERTY", 0, "Property", ""}, + {SENS_MESSAGE, "MESSAGE", 0, "Message", ""}, {SENS_MOUSE, "MOUSE", 0, "Mouse", ""}, - {SENS_COLLISION, "COLLISION", 0, "Collision", ""}, + {SENS_NEAR, "NEAR", 0, "Near", ""}, + {SENS_PROPERTY, "PROPERTY", 0, "Property", ""}, {SENS_RADAR, "RADAR", 0, "Radar", ""}, {SENS_RANDOM, "RANDOM", 0, "Random", ""}, {SENS_RAY, "RAY", 0, "Ray", ""}, - {SENS_MESSAGE, "MESSAGE", 0, "Message", ""}, - {SENS_JOYSTICK, "JOYSTICK", 0, "joystick", ""}, - {SENS_ACTUATOR, "ACTUATOR", 0, "Actuator", ""}, - {SENS_DELAY, "DELAY", 0, "Delay", ""}, - {SENS_ARMATURE, "ARMATURE", 0, "Armature", ""}, + {SENS_TOUCH, "TOUCH", 0, "Touch", ""}, {0, NULL, 0, NULL, NULL}}; #ifdef RNA_RUNTIME @@ -140,10 +140,14 @@ static void rna_def_sensor(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "pulse", SENS_NEG_PULSE_MODE); RNA_def_property_ui_text(prop, "Pulse False Level", "Activate FALSE level triggering (pulse mode)"); - prop= RNA_def_property(srna, "frequence", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "freq"); RNA_def_property_ui_text(prop, "Frequency", "Delay between repeated pulses(in logic tics, 0=no delay)"); RNA_def_property_range(prop, 0, 10000); + + prop= RNA_def_property(srna, "tap", PROP_BOOLEAN, PROP_NONE);\ + RNA_def_property_boolean_sdna(prop, NULL, "tap", 1); + RNA_def_property_ui_text(prop, "Tap", "Trigger controllers only for an instant, even while the sensor remains true"); } static void rna_def_always_sensor(BlenderRNA *brna) @@ -228,7 +232,7 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Keyboard Sensor", "Sensor to detect keyboard events"); RNA_def_struct_sdna_from(srna, "bKeyboardSensor", "data"); - prop= RNA_def_property(srna, "key", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "key", PROP_INT, PROP_NONE);//XXX need to use another input template RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* need better range or enum check */ RNA_def_property_ui_text(prop, "Key", "Input key code"); RNA_def_property_range(prop, 0, 255); @@ -251,7 +255,7 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna) prop= RNA_def_property(srna, "log", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "toggleName"); - RNA_def_property_ui_text(prop, "Log", "Property that receive the keystrokes in case a string is logged"); + RNA_def_property_ui_text(prop, "Log Toggle", "Property that receive the keystrokes in case a string is logged"); prop= RNA_def_property(srna, "all_keys", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "type", 1); @@ -312,7 +316,7 @@ static void rna_def_armature_sensor(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Armature Sensor", "Sensor to detect values and changes in values of IK solver"); RNA_def_struct_sdna_from(srna, "bArmatureSensor", "data"); - prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "armature_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Test Type", "Type of value and test"); @@ -372,18 +376,33 @@ static void rna_def_collision_sensor(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; static EnumPropertyItem prop_type_items[] ={ - {0, "PROPERTY", 0, "Property", ""}, - {1, "MATERIAL", 0, "Material", ""}, +// {SENS_COLLISION_PULSE, "PULSE", 0, "Property", ""}, + {SENS_COLLISION_PROPERTY, "PROPERTY", 0, "Property", ""}, + {SENS_COLLISION_MATERIAL, "MATERIAL", 0, "Material", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "CollisionSensor", "Sensor"); RNA_def_struct_ui_text(srna, "Collision Sensor", "Sensor to detect objects colliding with the current object, with more settings than the Touch sensor"); RNA_def_struct_sdna_from(srna, "bCollisionSensor", "data"); + prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, prop_type_items); + RNA_def_property_ui_text(prop, "Collision Type", "Toggle collision on material or property"); + + /* + //XXX bad, ugly. pulse in 2.49 is part of the same "enum" of collision type + //to investigate: is pulse exclusive? or it works with mat/prop? + prop= RNA_def_property(srna, "pulse", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "mode"); + RNA_def_property_ui_text(prop, "Property Name", "changes to the set of colliding objects generates pulse"); + */ + prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "name"); RNA_def_property_ui_text(prop, "Property Name", "Only look for Objects with this property"); + //XXX to make a setFunction to create a lookup with all materials in Blend File (not only this object mat.) prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "materialName"); RNA_def_property_ui_text(prop, "Material Name", "Only look for Objects with this material"); @@ -395,10 +414,6 @@ static void rna_def_collision_sensor(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "ma"); RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material"); */ - prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "mode"); - RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "Collision Type", "Toggle collision on material or property"); } static void rna_def_radar_sensor(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index fe6298b3006..9eae622a2c9 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2111,7 +2111,8 @@ static void rna_def_space_logic(BlenderRNA *brna) srna= RNA_def_struct(brna, "SpaceLogicEditor", "Space"); RNA_def_struct_sdna(srna, "SpaceLogic"); RNA_def_struct_ui_text(srna, "Space Logic Editor", "Logic editor space data"); - + + /* sensors */ prop= RNA_def_property(srna, "sensors_show_selected_objects", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_SEL); RNA_def_property_ui_text(prop, "Show Selected Object", "Show sensors of all selected objects"); @@ -2126,12 +2127,49 @@ static void rna_def_space_logic(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_LINK); RNA_def_property_ui_text(prop, "Show Linked to Controller", "Show linked objects to the controller"); RNA_def_property_update(prop, NC_LOGIC, NULL); - + prop= RNA_def_property(srna, "sensors_show_active_states", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_SENS_STATE); RNA_def_property_ui_text(prop, "Show Active States", "Show only sensors connected to active states"); RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* controllers */ + prop= RNA_def_property(srna, "controllers_show_selected_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_SEL); + RNA_def_property_ui_text(prop, "Show Selected Object", "Show controllers of all selected objects"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "controllers_show_active_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_ACT); + RNA_def_property_ui_text(prop, "Show Active Object", "Show controllers of active object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "controllers_show_linked_controller", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_CONT_LINK); + RNA_def_property_ui_text(prop, "Show Linked to Controller", "Show linked objects to sensor/actuator"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + /* actuators */ + prop= RNA_def_property(srna, "actuators_show_selected_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_SEL); + RNA_def_property_ui_text(prop, "Show Selected Object", "Show actuators of all selected objects"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "actuators_show_active_objects", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_ACT); + RNA_def_property_ui_text(prop, "Show Active Object", "Show actuators of active object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "actuators_show_linked_controller", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_LINK); + RNA_def_property_ui_text(prop, "Show Linked to Actuator", "Show linked objects to the actuator"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "actuators_show_active_states", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "scaflag", BUTS_ACT_STATE); + RNA_def_property_ui_text(prop, "Show Active States", "Show only actuators connected to active states"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + } void RNA_def_space(BlenderRNA *brna) |