diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2010-06-16 12:29:40 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2010-06-16 12:29:40 +0400 |
commit | 6a70a6bee2803290c42821847597f43a0e084938 (patch) | |
tree | fa951c32753bc0805fc4aff0f4f28ab5db7e9fef /source/blender/makesrna/intern/rna_controller.c | |
parent | bc8e0c0f932f4d6ce2cd49029498c1965ee46a67 (diff) |
Logic UI: partial implementation of state per controller
Adding two rna properties: state and state_number
For scripting "state_number" (integer) makes more sense while "state" (boolean/array) may be needed for the UI.
So far the UI is only showing the state number (using Label). Still have to decide how is the better way to "change the state".
If we don't need "state" (as boolean) for the UI, we can have only the integer one and rename it to "state".
+ some cosmetic changes (renamed ob "states" to "visible states")
ps.: 2 goals == 2 commits... let's see if I can keep that ratio until the middle of July ...
Diffstat (limited to 'source/blender/makesrna/intern/rna_controller.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_controller.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c index dd174c668f2..9f4efe06a8d 100644 --- a/source/blender/makesrna/intern/rna_controller.c +++ b/source/blender/makesrna/intern/rna_controller.c @@ -28,7 +28,7 @@ #include "RNA_define.h" #include "rna_internal.h" - +#include "DNA_object_types.h" #include "DNA_controller_types.h" EnumPropertyItem controller_type_items[] ={ @@ -82,6 +82,60 @@ static void rna_Controller_type_set(struct PointerRNA *ptr, int value) } } +static int rna_Controller_state_number_get(struct PointerRNA *ptr) +{ + bController *cont= (bController *)ptr->data; + int bit; + + for (bit=0; bit<32; bit++) { + if (cont->state_mask & (1<<bit)) + return bit+1; + } + return 0; +} + +static int rna_Controller_state_number_set(struct PointerRNA *ptr, const int value) +{ + bController *cont= (bController *)ptr->data; + if (value < 1 || value > OB_MAX_STATES) + return; + + cont->state_mask = (1 << (value - 1)); +} + +static void rna_Controller_state_get(PointerRNA *ptr, int *values) +{ + bController *cont= (bController *)ptr->data; + int i; + + memset(values, 0, sizeof(int)*OB_MAX_STATES); + for(i=0; i<OB_MAX_STATES; i++) + values[i] = (cont->state_mask & (1<<i)); +} + +static void rna_Controller_state_set(PointerRNA *ptr, const int *values) +{ + bController *cont= (bController *)ptr->data; + int i, tot= 0; + + /* ensure we always have some state selected */ + for(i=0; i<OB_MAX_STATES; i++) + if(values[i]) + tot++; + + if(tot==0) + return; + + /* only works for one state at once */ + if(tot>1) + return; + + for(i=0; i<OB_MAX_STATES; i++) { + if(values[i]) cont->state_mask |= (1<<i); + else cont->state_mask &= ~(1<<i); + } +} + #else void RNA_def_controller(BlenderRNA *brna) @@ -124,6 +178,24 @@ void RNA_def_controller(BlenderRNA *brna) RNA_def_property_ui_icon(prop, ICON_BOOKMARKS, 1); RNA_def_property_update(prop, NC_LOGIC, NULL); + /* State */ + + // array of OB_MAX_STATES + prop= RNA_def_property(srna, "state", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_array(prop, OB_MAX_STATES); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "", "Set Controller state index (1 to 30)"); + RNA_def_property_boolean_funcs(prop, "rna_Controller_state_get", "rna_Controller_state_set"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + // number of the state + prop= RNA_def_property(srna, "state_number", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "state_mask"); + RNA_def_property_range(prop, 1, OB_MAX_STATES); + RNA_def_property_ui_text(prop, "", "Set Controller state index (1 to 30)"); + RNA_def_property_int_funcs(prop, "rna_Controller_state_number_get", "rna_Controller_state_number_set", NULL); + RNA_def_property_update(prop, NC_LOGIC, NULL); + /* Expression Controller */ srna= RNA_def_struct(brna, "ExpressionController", "Controller"); RNA_def_struct_sdna_from(srna, "bExpressionCont", "data"); |