BGE - button for deactivate sensors, controllers and actuators

This change introduces a new checkbox to deactivate the sensors, controllers and/or actuators. It is useful during the development phase to avoid delete sensors, controllers or actuators if you want to test something new.

NOC: The wiki page is being updated (the images mostly), but the feature is already in the 2.71 release log.

{F61628}

Reviewers: moguri, dfelinto, campbellbarton, dingto, #user_interface, billrey

Reviewed By: moguri

CC: billrey

Differential Revision: https://developer.blender.org/D16
This commit is contained in:
Jorge Bernal 2014-04-16 22:23:29 -03:00 committed by Dalai Felinto
parent 8a4210074c
commit a5b9f22454
13 changed files with 160 additions and 56 deletions

View File

@ -173,6 +173,7 @@ enum {
UI_BUT_COLOR_CUBIC = (1 << 23), /* cubic saturation for the color wheel */ UI_BUT_COLOR_CUBIC = (1 << 23), /* cubic saturation for the color wheel */
UI_BUT_LIST_ITEM = (1 << 24), /* This but is "inside" a list item (currently used to change theme colors). */ UI_BUT_LIST_ITEM = (1 << 24), /* This but is "inside" a list item (currently used to change theme colors). */
UI_BUT_DRAG_MULTI = (1 << 25), /* edit this button as well as the active button (not just dragging) */ UI_BUT_DRAG_MULTI = (1 << 25), /* edit this button as well as the active button (not just dragging) */
UI_BUT_SCA_LINK_GREY = (1 << 26), /* used to flag if sca links shoud be grey out */
}; };
#define UI_PANEL_WIDTH 340 #define UI_PANEL_WIDTH 340

View File

@ -443,7 +443,7 @@ static int ui_but_float_precision(uiBut *but, double value)
/* link line drawing is not part of buttons or theme.. so we stick with it here */ /* link line drawing is not part of buttons or theme.. so we stick with it here */
static void ui_draw_linkline(uiLinkLine *line, int highlightActiveLines) static void ui_draw_linkline(uiLinkLine *line, int highlightActiveLines, int dashInactiveLines)
{ {
rcti rect; rcti rect;
@ -454,11 +454,13 @@ static void ui_draw_linkline(uiLinkLine *line, int highlightActiveLines)
rect.xmax = BLI_rctf_cent_x(&line->to->rect); rect.xmax = BLI_rctf_cent_x(&line->to->rect);
rect.ymax = BLI_rctf_cent_y(&line->to->rect); rect.ymax = BLI_rctf_cent_y(&line->to->rect);
if (line->flag & UI_SELECT) if (dashInactiveLines)
UI_ThemeColor(TH_GRID);
else if (line->flag & UI_SELECT)
glColor3ub(100, 100, 100); glColor3ub(100, 100, 100);
else if (highlightActiveLines && ((line->from->flag & UI_ACTIVE) || (line->to->flag & UI_ACTIVE))) else if (highlightActiveLines && ((line->from->flag & UI_ACTIVE) || (line->to->flag & UI_ACTIVE)))
UI_ThemeColor(TH_TEXT_HI); UI_ThemeColor(TH_TEXT_HI);
else else
glColor3ub(0, 0, 0); glColor3ub(0, 0, 0);
ui_draw_link_bezier(&rect); ui_draw_link_bezier(&rect);
@ -469,7 +471,8 @@ static void ui_draw_links(uiBlock *block)
uiBut *but; uiBut *but;
uiLinkLine *line; uiLinkLine *line;
/* Draw the inactive lines (lines with neither button being hovered over). /* Draw the grey out lines. Do this first so they appear at the
* bottom of inactive or active lines.
* As we go, remember if we see any active or selected lines. */ * As we go, remember if we see any active or selected lines. */
bool found_selectline = false; bool found_selectline = false;
bool found_activeline = false; bool found_activeline = false;
@ -477,8 +480,10 @@ static void ui_draw_links(uiBlock *block)
for (but = block->buttons.first; but; but = but->next) { for (but = block->buttons.first; but; but = but->next) {
if (but->type == LINK && but->link) { if (but->type == LINK && but->link) {
for (line = but->link->lines.first; line; line = line->next) { for (line = but->link->lines.first; line; line = line->next) {
if (!(line->from->flag & UI_ACTIVE) && !(line->to->flag & UI_ACTIVE)) if (!(line->from->flag & UI_ACTIVE) && !(line->to->flag & UI_ACTIVE)) {
ui_draw_linkline(line, 0); if (line->deactive)
ui_draw_linkline(line, 0, true);
}
else else
found_activeline = true; found_activeline = true;
@ -488,14 +493,26 @@ static void ui_draw_links(uiBlock *block)
} }
} }
/* Draw the inactive lines (lines with neither button being hovered over) */
for (but = block->buttons.first; but; but = but->next) {
if (but->type == LINK && but->link) {
for (line = but->link->lines.first; line; line = line->next) {
if (!(line->from->flag & UI_ACTIVE) && !(line->to->flag & UI_ACTIVE)) {
if (!line->deactive)
ui_draw_linkline(line, 0, false);
}
}
}
}
/* Draw any active lines (lines with either button being hovered over). /* Draw any active lines (lines with either button being hovered over).
* Do this last so they appear on top of inactive lines. */ * Do this last so they appear on top of inactive and grey out lines. */
if (found_activeline) { if (found_activeline) {
for (but = block->buttons.first; but; but = but->next) { for (but = block->buttons.first; but; but = but->next) {
if (but->type == LINK && but->link) { if (but->type == LINK && but->link) {
for (line = but->link->lines.first; line; line = line->next) { for (line = but->link->lines.first; line; line = line->next) {
if ((line->from->flag & UI_ACTIVE) || (line->to->flag & UI_ACTIVE)) if ((line->from->flag & UI_ACTIVE) || (line->to->flag & UI_ACTIVE))
ui_draw_linkline(line, !found_selectline); ui_draw_linkline(line, !found_selectline, false);
} }
} }
} }
@ -1348,7 +1365,7 @@ static uiBut *ui_find_inlink(uiBlock *block, void *poin)
return NULL; return NULL;
} }
static void ui_add_link_line(ListBase *listb, uiBut *but, uiBut *bt) static void ui_add_link_line(ListBase *listb, uiBut *but, uiBut *bt, short deactive)
{ {
uiLinkLine *line; uiLinkLine *line;
@ -1356,6 +1373,7 @@ static void ui_add_link_line(ListBase *listb, uiBut *but, uiBut *bt)
BLI_addtail(listb, line); BLI_addtail(listb, line);
line->from = but; line->from = but;
line->to = bt; line->to = bt;
line->deactive = deactive;
} }
uiBut *uiFindInlink(uiBlock *block, void *poin) uiBut *uiFindInlink(uiBlock *block, void *poin)
@ -1382,14 +1400,25 @@ void uiComposeLinks(uiBlock *block)
for (a = 0; a < *(link->totlink); a++) { for (a = 0; a < *(link->totlink); a++) {
bt = ui_find_inlink(block, (*ppoin)[a]); bt = ui_find_inlink(block, (*ppoin)[a]);
if (bt) { if (bt) {
ui_add_link_line(&link->lines, but, bt); if ((but->flag & UI_BUT_SCA_LINK_GREY) || (bt->flag & UI_BUT_SCA_LINK_GREY)){
ui_add_link_line(&link->lines, but, bt, true);
}
else {
ui_add_link_line(&link->lines, but, bt, false);
}
} }
} }
} }
else if (link->poin) { else if (link->poin) {
bt = ui_find_inlink(block, *(link->poin) ); bt = ui_find_inlink(block, *(link->poin) );
if (bt) { if (bt) {
ui_add_link_line(&link->lines, but, bt); if ((but->flag & UI_BUT_SCA_LINK_GREY) || (bt->flag & UI_BUT_SCA_LINK_GREY)){
ui_add_link_line(&link->lines, but, bt, true);
}
else {
ui_add_link_line(&link->lines, but, bt, false);
}
} }
} }
} }

View File

@ -147,7 +147,7 @@ enum {
typedef struct uiLinkLine { /* only for draw/edit */ typedef struct uiLinkLine { /* only for draw/edit */
struct uiLinkLine *next, *prev; struct uiLinkLine *next, *prev;
struct uiBut *from, *to; struct uiBut *from, *to;
short flag, pad; short flag, deactive;
} uiLinkLine; } uiLinkLine;
typedef struct { typedef struct {

View File

@ -945,28 +945,37 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *lo
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
row = uiLayoutRow(box, false); row = uiLayoutRow(box, false);
uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemR(sub, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")) { if (RNA_boolean_get(ptr, "show_expanded")) {
uiItemR(row, ptr, "type", 0, "", ICON_NONE); uiItemR(sub, ptr, "type", 0, "", ICON_NONE);
uiItemR(row, ptr, "name", 0, "", ICON_NONE); uiItemR(sub, ptr, "name", 0, "", ICON_NONE);
} }
else { else {
uiItemL(row, IFACE_(sensor_name(sens->type)), ICON_NONE); uiItemL(sub, IFACE_(sensor_name(sens->type)), ICON_NONE);
uiItemL(row, sens->name, ICON_NONE); uiItemL(sub, sens->name, ICON_NONE);
} }
sub = uiLayoutRow(row, false); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, ((RNA_boolean_get(logic_ptr, "show_sensors_active_states") && uiLayoutSetActive(sub, (((RNA_boolean_get(logic_ptr, "show_sensors_active_states") &&
RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin"))); RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")) &&
RNA_boolean_get(ptr, "active")));
uiItemR(sub, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE); uiItemR(sub, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")==0) { if (RNA_boolean_get(ptr, "show_expanded")==0) {
sub = uiLayoutRow(row, true); sub = uiLayoutRow(row, true);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemEnumO(sub, "LOGIC_OT_sensor_move", "", ICON_TRIA_UP, "direction", 1); // up uiItemEnumO(sub, "LOGIC_OT_sensor_move", "", ICON_TRIA_UP, "direction", 1); // up
uiItemEnumO(sub, "LOGIC_OT_sensor_move", "", ICON_TRIA_DOWN, "direction", 2); // down uiItemEnumO(sub, "LOGIC_OT_sensor_move", "", ICON_TRIA_DOWN, "direction", 2); // down
} }
uiItemO(row, "", ICON_X, "LOGIC_OT_sensor_remove"); sub = uiLayoutRow(row, false);
uiItemR(sub, ptr, "active", 0, "", ICON_NONE);
sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemO(sub, "", ICON_X, "LOGIC_OT_sensor_remove");
} }
static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr) static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
@ -974,6 +983,7 @@ static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
uiLayout *box, *split, *sub, *row; uiLayout *box, *split, *sub, *row;
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
uiLayoutSetActive(box, RNA_boolean_get(ptr, "active"));
split = uiLayoutSplit(box, 0.45f, false); split = uiLayoutSplit(box, 0.45f, false);
row = uiLayoutRow(split, true); row = uiLayoutRow(split, true);
@ -1241,6 +1251,7 @@ static void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C)
draw_sensor_internal_header(layout, ptr); draw_sensor_internal_header(layout, ptr);
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
uiLayoutSetActive(box, RNA_boolean_get(ptr, "active"));
switch (RNA_enum_get(ptr, "type")) { switch (RNA_enum_get(ptr, "type")) {
@ -1300,27 +1311,38 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
row = uiLayoutRow(box, false); row = uiLayoutRow(box, false);
uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemR(sub, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")) { if (RNA_boolean_get(ptr, "show_expanded")) {
uiItemR(row, ptr, "type", 0, "", ICON_NONE); uiItemR(sub, ptr, "type", 0, "", ICON_NONE);
uiItemR(row, ptr, "name", 0, "", ICON_NONE); uiItemR(sub, ptr, "name", 0, "", ICON_NONE);
/* XXX provisory for Blender 2.50Beta */ /* XXX provisory for Blender 2.50Beta */
uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, IFACE_("Set controller state index (from 1 to 30)")); uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, IFACE_("Set controller state index (from 1 to 30)"));
} }
else { else {
uiItemL(row, IFACE_(controller_name(cont->type)), ICON_NONE); uiItemL(sub, IFACE_(controller_name(cont->type)), ICON_NONE);
uiItemL(row, cont->name, ICON_NONE); uiItemL(sub, cont->name, ICON_NONE);
uiItemL(row, state, ICON_NONE); uiItemL(sub, state, ICON_NONE);
} }
uiItemR(row, ptr, "use_priority", 0, "", ICON_NONE); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemR(sub, ptr, "use_priority", 0, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")==0) { if (RNA_boolean_get(ptr, "show_expanded")==0) {
sub = uiLayoutRow(row, true); sub = uiLayoutRow(row, true);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemEnumO(sub, "LOGIC_OT_controller_move", "", ICON_TRIA_UP, "direction", 1); // up uiItemEnumO(sub, "LOGIC_OT_controller_move", "", ICON_TRIA_UP, "direction", 1); // up
uiItemEnumO(sub, "LOGIC_OT_controller_move", "", ICON_TRIA_DOWN, "direction", 2); // down uiItemEnumO(sub, "LOGIC_OT_controller_move", "", ICON_TRIA_DOWN, "direction", 2); // down
} }
uiItemO(row, "", ICON_X, "LOGIC_OT_controller_remove");
sub = uiLayoutRow(row, false);
uiItemR(sub, ptr, "active", 0, "", ICON_NONE);
sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemO(sub, "", ICON_X, "LOGIC_OT_controller_remove");
} }
static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr) static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr)
@ -1357,6 +1379,7 @@ static void draw_brick_controller(uiLayout *layout, PointerRNA *ptr)
return; return;
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
uiLayoutSetActive(box, RNA_boolean_get(ptr, "active"));
draw_controller_state(box, ptr); draw_controller_state(box, ptr);
@ -1390,28 +1413,38 @@ static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
row = uiLayoutRow(box, false); row = uiLayoutRow(box, false);
uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemR(sub, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")) { if (RNA_boolean_get(ptr, "show_expanded")) {
uiItemR(row, ptr, "type", 0, "", ICON_NONE); uiItemR(sub, ptr, "type", 0, "", ICON_NONE);
uiItemR(row, ptr, "name", 0, "", ICON_NONE); uiItemR(sub, ptr, "name", 0, "", ICON_NONE);
} }
else { else {
uiItemL(row, IFACE_(actuator_name(act->type)), ICON_NONE); uiItemL(sub, IFACE_(actuator_name(act->type)), ICON_NONE);
uiItemL(row, act->name, ICON_NONE); uiItemL(sub, act->name, ICON_NONE);
} }
sub = uiLayoutRow(row, false); sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, ((RNA_boolean_get(logic_ptr, "show_actuators_active_states") && uiLayoutSetActive(sub, (((RNA_boolean_get(logic_ptr, "show_actuators_active_states") &&
RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin"))); RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")) &&
RNA_boolean_get(ptr, "active")));
uiItemR(sub, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE); uiItemR(sub, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE);
if (RNA_boolean_get(ptr, "show_expanded")==0) { if (RNA_boolean_get(ptr, "show_expanded")==0) {
sub = uiLayoutRow(row, true); sub = uiLayoutRow(row, true);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemEnumO(sub, "LOGIC_OT_actuator_move", "", ICON_TRIA_UP, "direction", 1); // up uiItemEnumO(sub, "LOGIC_OT_actuator_move", "", ICON_TRIA_UP, "direction", 1); // up
uiItemEnumO(sub, "LOGIC_OT_actuator_move", "", ICON_TRIA_DOWN, "direction", 2); // down uiItemEnumO(sub, "LOGIC_OT_actuator_move", "", ICON_TRIA_DOWN, "direction", 2); // down
} }
uiItemO(row, "", ICON_X, "LOGIC_OT_actuator_remove");
sub = uiLayoutRow(row, false);
uiItemR(sub, ptr, "active", 0, "", ICON_NONE);
sub = uiLayoutRow(row, false);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "active"));
uiItemO(sub, "", ICON_X, "LOGIC_OT_actuator_remove");
} }
static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr) static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr)
@ -2160,6 +2193,7 @@ static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
return; return;
box = uiLayoutBox(layout); box = uiLayoutBox(layout);
uiLayoutSetActive(box, RNA_boolean_get(ptr, "active"));
switch (RNA_enum_get(ptr, "type")) { switch (RNA_enum_get(ptr, "type")) {
case ACT_ACTION: case ACT_ACTION:
@ -2361,8 +2395,12 @@ void logic_buttons(bContext *C, ARegion *ar)
/* put inlink button to the left */ /* put inlink button to the left */
col = uiLayoutColumn(split, false); col = uiLayoutColumn(split, false);
uiLayoutSetActive(col, RNA_boolean_get(&ptr, "active"));
uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT); uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT);
uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, cont, LINK_CONTROLLER, 0, 0, 0, ""); but = uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, cont, LINK_CONTROLLER, 0, 0, 0, "");
if (!RNA_boolean_get(&ptr, "active")) {
uiButSetFlag(but, UI_BUT_SCA_LINK_GREY);
}
//col = uiLayoutColumn(split, true); //col = uiLayoutColumn(split, true);
/* nested split for middle and right columns */ /* nested split for middle and right columns */
@ -2378,12 +2416,17 @@ void logic_buttons(bContext *C, ARegion *ar)
/* draw the brick contents */ /* draw the brick contents */
draw_brick_controller(col, &ptr); draw_brick_controller(col, &ptr);
/* put link button to the right */ /* put link button to the right */
col = uiLayoutColumn(subsplit, false); col = uiLayoutColumn(subsplit, false);
uiLayoutSetActive(col, RNA_boolean_get(&ptr, "active"));
uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT); uiLayoutSetAlignment(col, UI_LAYOUT_ALIGN_LEFT);
but = uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); but = uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
if (!RNA_boolean_get(&ptr, "active")) {
uiButSetFlag(but, UI_BUT_SCA_LINK_GREY);
}
uiSetButLink(but, NULL, (void ***)&(cont->links), &cont->totlinks, LINK_CONTROLLER, LINK_ACTUATOR); uiSetButLink(but, NULL, (void ***)&(cont->links), &cont->totlinks, LINK_CONTROLLER, LINK_ACTUATOR);
} }
} }
uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */ uiBlockLayoutResolve(block, NULL, &yco); /* stores final height in yco */
@ -2433,7 +2476,7 @@ void logic_buttons(bContext *C, ARegion *ar)
) )
{ // gotta check if the current state is visible or not { // gotta check if the current state is visible or not
uiLayout *split, *col; uiLayout *split, *col;
/* make as visible, for move operator */ /* make as visible, for move operator */
sens->flag |= SENS_VISIBLE; sens->flag |= SENS_VISIBLE;
@ -2449,9 +2492,14 @@ void logic_buttons(bContext *C, ARegion *ar)
/* put link button to the right */ /* put link button to the right */
col = uiLayoutColumn(split, false); col = uiLayoutColumn(split, false);
/* use old-school uiButtons for links for now */ uiLayoutSetActive(col, RNA_boolean_get(&ptr, "active"));
but = uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); but = uiDefIconBut(block, LINK, 0, ICON_LINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
uiSetButLink(but, NULL, (void ***)&(sens->links), &sens->totlinks, LINK_SENSOR, LINK_CONTROLLER); if (!RNA_boolean_get(&ptr, "active")) {
uiButSetFlag(but, UI_BUT_SCA_LINK_GREY);
}
/* use old-school uiButtons for links for now */
uiSetButLink(but, NULL, (void ***)&sens->links, &sens->totlinks, LINK_SENSOR, LINK_CONTROLLER);
} }
} }
} }
@ -2513,7 +2561,11 @@ void logic_buttons(bContext *C, ARegion *ar)
/* put inlink button to the left */ /* put inlink button to the left */
col = uiLayoutColumn(split, false); col = uiLayoutColumn(split, false);
uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, act, LINK_ACTUATOR, 0, 0, 0, ""); uiLayoutSetActive(col, RNA_boolean_get(&ptr, "active"));
but = uiDefIconBut(block, INLINK, 0, ICON_INLINK, 0, 0, UI_UNIT_X, UI_UNIT_Y, act, LINK_ACTUATOR, 0, 0, 0, "");
if (!RNA_boolean_get(&ptr, "active")) {
uiButSetFlag(but, UI_BUT_SCA_LINK_GREY);
}
col = uiLayoutColumn(split, true); col = uiLayoutColumn(split, true);
uiLayoutSetContextPointer(col, "actuator", &ptr); uiLayoutSetContextPointer(col, "actuator", &ptr);

View File

@ -264,7 +264,7 @@ typedef struct bActuator {
* For ipo's and props: to find out which object the actuator * For ipo's and props: to find out which object the actuator
* belongs to */ * belongs to */
struct Object *ob; struct Object *ob;
} bActuator; } bActuator;
/* objectactuator->flag */ /* objectactuator->flag */
@ -322,6 +322,7 @@ typedef struct bActuator {
#define ACT_LINKED 8 #define ACT_LINKED 8
#define ACT_VISIBLE 16 #define ACT_VISIBLE 16
#define ACT_PIN 32 #define ACT_PIN 32
#define ACT_DEACTIVATE 64
/* link codes */ /* link codes */
#define LINK_SENSOR 0 #define LINK_SENSOR 0

View File

@ -83,6 +83,7 @@ typedef struct bController {
#define CONT_NEW 4 #define CONT_NEW 4
#define CONT_MASK 8 #define CONT_MASK 8
#define CONT_PRIO 16 #define CONT_PRIO 16
#define CONT_DEACTIVATE 32
/* pyctrl->flag */ /* pyctrl->flag */
#define CONT_PY_DEBUG 1 #define CONT_PY_DEBUG 1

View File

@ -257,6 +257,7 @@ typedef struct bJoystickSensor {
#define SENS_NOT 8 #define SENS_NOT 8
#define SENS_VISIBLE 16 #define SENS_VISIBLE 16
#define SENS_PIN 32 #define SENS_PIN 32
#define SENS_DEACTIVATE 64
/* sensor->pulse */ /* sensor->pulse */
#define SENS_PULSE_CONT 0 #define SENS_PULSE_CONT 0

View File

@ -573,6 +573,11 @@ static void rna_def_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Expanded", "Set actuator expanded in the user interface"); RNA_def_property_ui_text(prop, "Expanded", "Set actuator expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ACT_DEACTIVATE);
RNA_def_property_ui_text(prop, "Active", "Set the active state of the actuator");
RNA_def_property_update(prop, NC_LOGIC, NULL);
RNA_api_actuator(srna); RNA_api_actuator(srna);
} }

View File

@ -228,6 +228,11 @@ void RNA_def_controller(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
RNA_def_property_update(prop, NC_LOGIC, NULL); RNA_def_property_update(prop, NC_LOGIC, NULL);
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONT_DEACTIVATE);
RNA_def_property_ui_text(prop, "Active", "Set the active state of the controller");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop = RNA_def_property(srna, "use_priority", PROP_BOOLEAN, PROP_NONE); prop = RNA_def_property(srna, "use_priority", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_PRIO); RNA_def_property_boolean_sdna(prop, NULL, "flag", CONT_PRIO);
RNA_def_property_ui_text(prop, "Priority", RNA_def_property_ui_text(prop, "Priority",

View File

@ -296,6 +296,11 @@ static void rna_def_sensor(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1); RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
RNA_def_property_update(prop, NC_LOGIC, NULL); RNA_def_property_update(prop, NC_LOGIC, NULL);
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SENS_DEACTIVATE);
RNA_def_property_ui_text(prop, "Active", "Set active state of the sensor");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE); prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_SHOW); RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_SHOW);
RNA_def_property_ui_text(prop, "Expanded", "Set sensor expanded in the user interface"); RNA_def_property_ui_text(prop, "Expanded", "Set sensor expanded in the user interface");

View File

@ -1106,7 +1106,7 @@ void BL_ConvertActuators(const char* maggiename,
; /* generate some error */ ; /* generate some error */
} }
if (baseact) if (baseact && !(bact->flag & ACT_DEACTIVATE))
{ {
baseact->SetExecutePriority(executePriority++); baseact->SetExecutePriority(executePriority++);
uniquename += "#ACT#"; uniquename += "#ACT#";

View File

@ -197,7 +197,7 @@ void BL_ConvertControllers(
} }
} }
if (gamecontroller) if (gamecontroller && !(bcontr->flag & CONT_DEACTIVATE))
{ {
LinkControllerToActuators(gamecontroller,bcontr,logicmgr,converter); LinkControllerToActuators(gamecontroller,bcontr,logicmgr,converter);
gamecontroller->SetExecutePriority(executePriority++); gamecontroller->SetExecutePriority(executePriority++);

View File

@ -49,6 +49,7 @@
#include "DNA_object_types.h" #include "DNA_object_types.h"
#include "DNA_material_types.h" #include "DNA_material_types.h"
#include "DNA_sensor_types.h" #include "DNA_sensor_types.h"
#include "DNA_controller_types.h"
#include "DNA_actuator_types.h" /* for SENS_ALL_KEYS ? this define is #include "DNA_actuator_types.h" /* for SENS_ALL_KEYS ? this define is
* probably misplaced */ * probably misplaced */
/* end of blender include block */ /* end of blender include block */
@ -575,7 +576,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
} }
} }
if (gamesensor) if (gamesensor && !(sens->flag & SENS_DEACTIVATE))
{ {
gamesensor->SetExecutePriority(executePriority++); gamesensor->SetExecutePriority(executePriority++);
STR_String uniquename = sens->name; STR_String uniquename = sens->name;
@ -606,16 +607,19 @@ void BL_ConvertSensors(struct Object* blenderobject,
{ {
bController* linkedcont = (bController*) sens->links[i]; bController* linkedcont = (bController*) sens->links[i];
if (linkedcont) { if (linkedcont) {
SCA_IController* gamecont = converter->FindGameController(linkedcont); // If the controller is deactived doesn't register it
if (!(linkedcont->flag & CONT_DEACTIVATE)) {
SCA_IController* gamecont = converter->FindGameController(linkedcont);
if (gamecont) { if (gamecont) {
logicmgr->RegisterToSensor(gamecont,gamesensor); logicmgr->RegisterToSensor(gamecont,gamesensor);
} }
else { else {
printf("Warning, sensor \"%s\" could not find its controller " printf("Warning, sensor \"%s\" could not find its controller "
"(link %d of %d) from object \"%s\"\n" "(link %d of %d) from object \"%s\"\n"
"\tthere has been an error converting the blender controller for the game engine," "\tthere has been an error converting the blender controller for the game engine,"
"logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2); "logic may be incorrect\n", sens->name, i+1, sens->totlinks, blenderobject->id.name+2);
}
} }
} }
else { else {