2011-02-23 10:52:22 +00:00
/*
2008-11-30 14:40:00 +00:00
* $ Id $
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2008-11-30 14:40:00 +00:00
*
* Contributor ( s ) : Blender Foundation ( 2008 ) .
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
# include <stdlib.h>
2010-05-08 19:52:13 +00:00
# include "WM_types.h"
2008-11-30 14:40:00 +00:00
# include "RNA_define.h"
# include "rna_internal.h"
2010-06-16 08:29:40 +00:00
# include "DNA_object_types.h"
2008-11-30 14:40:00 +00:00
# include "DNA_controller_types.h"
2010-05-04 00:06:13 +00:00
EnumPropertyItem controller_type_items [ ] = {
2010-07-14 23:51:21 +00:00
{ 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 " } ,
2010-05-04 00:06:13 +00:00
{ CONT_EXPRESSION , " EXPRESSION " , 0 , " Expression " , " " } ,
{ CONT_PYTHON , " PYTHON " , 0 , " Python Script " , " " } ,
{ 0 , NULL , 0 , NULL , NULL } } ;
2008-11-30 14:40:00 +00:00
# ifdef RNA_RUNTIME
2008-12-02 23:45:11 +00:00
2010-05-04 00:06:13 +00:00
# include "BKE_sca.h"
2008-12-02 23:45:11 +00:00
static struct StructRNA * rna_Controller_refine ( struct PointerRNA * ptr )
2008-11-30 14:40:00 +00:00
{
bController * controller = ( bController * ) ptr - > data ;
2008-12-02 23:45:11 +00:00
switch ( controller - > type ) {
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_AND :
2008-12-02 23:45:11 +00:00
return & RNA_AndController ;
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_OR :
2008-12-02 23:45:11 +00:00
return & RNA_OrController ;
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_NAND :
2008-12-02 23:45:11 +00:00
return & RNA_NandController ;
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_NOR :
2008-12-02 23:45:11 +00:00
return & RNA_NorController ;
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_XOR :
2008-12-02 23:45:11 +00:00
return & RNA_XorController ;
2008-11-30 14:40:00 +00:00
case CONT_LOGIC_XNOR :
2008-12-02 23:45:11 +00:00
return & RNA_XnorController ;
2010-03-22 09:30:00 +00:00
case CONT_EXPRESSION :
2008-12-02 23:45:11 +00:00
return & RNA_ExpressionController ;
2008-11-30 14:40:00 +00:00
case CONT_PYTHON :
2008-12-02 23:45:11 +00:00
return & RNA_PythonController ;
default :
return & RNA_Controller ;
2008-11-30 14:40:00 +00:00
}
}
2008-12-02 23:45:11 +00:00
2010-05-06 19:12:08 +00:00
static void rna_Controller_type_set ( struct PointerRNA * ptr , int value )
2010-05-04 00:06:13 +00:00
{
bController * cont = ( bController * ) ptr - > data ;
2010-05-06 19:12:08 +00:00
if ( value ! = cont - > type )
{
cont - > type = value ;
init_controller ( cont ) ;
}
2010-05-04 00:06:13 +00:00
}
2010-06-16 08:29:40 +00:00
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 ;
}
2010-06-17 04:31:02 +00:00
static void rna_Controller_state_number_set ( struct PointerRNA * ptr , const int value )
2010-06-16 08:29:40 +00:00
{
bController * cont = ( bController * ) ptr - > data ;
if ( value < 1 | | value > OB_MAX_STATES )
return ;
cont - > state_mask = ( 1 < < ( value - 1 ) ) ;
}
2010-07-17 00:38:34 +00:00
#if 0 /* editable is set to false, comment for now. */
2010-06-16 08:29:40 +00:00
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 ) ;
}
}
2010-06-27 21:03:39 +00:00
# endif
2010-06-16 08:29:40 +00:00
2008-11-30 14:40:00 +00:00
# else
void RNA_def_controller ( BlenderRNA * brna )
{
StructRNA * srna ;
PropertyRNA * prop ;
2010-05-04 00:06:13 +00:00
static EnumPropertyItem python_controller_modes [ ] = {
{ CONT_PY_SCRIPT , " SCRIPT " , 0 , " Script " , " " } ,
{ CONT_PY_MODULE , " MODULE " , 0 , " Module " , " " } ,
2009-06-16 00:52:21 +00:00
{ 0 , NULL , 0 , NULL , NULL } } ;
2008-11-30 14:40:00 +00:00
2008-12-02 23:45:11 +00:00
/* Controller */
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " Controller " , NULL ) ;
2008-11-30 14:40:00 +00:00
RNA_def_struct_sdna ( srna , " bController " ) ;
2009-01-01 15:52:51 +00:00
RNA_def_struct_refine_func ( srna , " rna_Controller_refine " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Controller " , " Game engine logic brick to process events, connecting sensors to actuators " ) ;
2008-11-30 14:40:00 +00:00
2010-07-10 21:15:10 +00:00
RNA_api_controller ( srna ) ;
2008-12-02 23:45:11 +00:00
prop = RNA_def_property ( srna , " name " , PROP_STRING , PROP_NONE ) ;
RNA_def_property_ui_text ( prop , " Name " , " " ) ;
RNA_def_struct_name_property ( srna , prop ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2008-11-30 14:40:00 +00:00
prop = RNA_def_property ( srna , " type " , PROP_ENUM , PROP_NONE ) ;
2010-05-04 00:06:13 +00:00
RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-05-06 19:12:08 +00:00
RNA_def_property_enum_funcs ( prop , NULL , " rna_Controller_type_set " , NULL ) ;
2008-12-02 23:45:11 +00:00
RNA_def_property_enum_items ( prop , controller_type_items ) ;
RNA_def_property_ui_text ( prop , " Type " , " " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2008-11-30 14:40:00 +00:00
2010-08-17 16:27:10 +00:00
prop = RNA_def_property ( srna , " show_expanded " , PROP_BOOLEAN , PROP_NONE ) ;
2010-05-04 00:06:13 +00:00
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 ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2010-05-04 00:06:13 +00:00
2010-08-17 16:27:10 +00:00
prop = RNA_def_property ( srna , " use_priority " , PROP_BOOLEAN , PROP_NONE ) ;
2010-05-04 00:06:13 +00:00
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 ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2010-06-16 08:29:40 +00:00
/* State */
// array of OB_MAX_STATES
2010-08-17 16:27:10 +00:00
//prop= RNA_def_property(srna, "states", PROP_BOOLEAN, PROP_LAYER_MEMBER);
2010-07-13 11:06:19 +00:00
//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);
2010-06-16 08:29:40 +00:00
// number of the state
2010-08-17 16:27:10 +00:00
prop = RNA_def_property ( srna , " states " , PROP_INT , PROP_UNSIGNED ) ;
2010-06-16 08:29:40 +00:00
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 ) ;
2010-05-04 00:06:13 +00:00
2008-12-02 23:45:11 +00:00
/* Expression Controller */
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " ExpressionController " , " Controller " ) ;
2008-12-02 23:45:11 +00:00
RNA_def_struct_sdna_from ( srna , " bExpressionCont " , " data " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Expression Controller " , " Controller passing on events based on the evaluation of an expression " ) ;
2008-11-30 14:40:00 +00:00
prop = RNA_def_property ( srna , " expression " , PROP_STRING , PROP_NONE ) ;
RNA_def_property_string_sdna ( prop , NULL , " str " ) ;
2008-12-02 23:45:11 +00:00
RNA_def_property_ui_text ( prop , " Expression " , " " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2008-11-30 14:40:00 +00:00
2008-12-02 23:45:11 +00:00
/* Python Controller */
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " PythonController " , " Controller " ) ;
2008-12-02 23:45:11 +00:00
RNA_def_struct_sdna_from ( srna , " bPythonCont " , " data " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Python Controller " , " Controller executing a python script " ) ;
2008-11-30 14:40:00 +00:00
2010-05-04 00:06:13 +00:00
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) " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2010-05-04 00:06:13 +00:00
2008-11-30 14:40:00 +00:00
prop = RNA_def_property ( srna , " text " , PROP_POINTER , PROP_NONE ) ;
2010-02-05 23:50:33 +00:00
RNA_def_property_struct_type ( prop , " Text " ) ;
2009-05-28 23:23:47 +00:00
RNA_def_property_flag ( prop , PROP_EDITABLE ) ;
2010-02-10 21:15:44 +00:00
RNA_def_property_ui_text ( prop , " Text " , " Text datablock with the python script " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2008-12-02 23:45:11 +00:00
2010-02-05 23:50:33 +00:00
prop = RNA_def_property ( srna , " module " , PROP_STRING , PROP_NONE ) ;
RNA_def_property_ui_text ( prop , " Module " , " Module name and function to run e.g. \" someModule.main \" . Internal texts and external python files can be used " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2010-02-05 23:50:33 +00:00
2010-08-17 16:27:10 +00:00
prop = RNA_def_property ( srna , " use_debug " , PROP_BOOLEAN , PROP_NONE ) ;
2010-02-05 23:50:33 +00:00
RNA_def_property_boolean_sdna ( prop , NULL , " flag " , CONT_PY_DEBUG ) ;
2010-02-10 21:15:44 +00:00
RNA_def_property_ui_text ( prop , " D " , " Continuously reload the module from disk for editing external modules without restarting " ) ;
2010-05-08 19:52:13 +00:00
RNA_def_property_update ( prop , NC_LOGIC , NULL ) ;
2010-02-05 23:50:33 +00:00
2008-12-02 23:45:11 +00:00
/* Other Controllers */
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " AndController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " And Controller " , " Controller passing on events based on a logical AND operation " ) ;
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " OrController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Or Controller " , " Controller passing on events based on a logical OR operation " ) ;
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " NorController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Nor Controller " , " Controller passing on events based on a logical NOR operation " ) ;
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " NandController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Nand Controller " , " Controller passing on events based on a logical NAND operation " ) ;
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " XorController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Xor Controller " , " Controller passing on events based on a logical XOR operation " ) ;
2008-12-19 04:06:24 +00:00
srna = RNA_def_struct ( brna , " XnorController " , " Controller " ) ;
2010-02-10 21:15:44 +00:00
RNA_def_struct_ui_text ( srna , " Xnor Controller " , " Controller passing on events based on a logical XNOR operation " ) ;
2008-11-30 14:40:00 +00:00
}
# endif