2011-02-23 10:52:22 +00:00
/*
2008-04-16 22:40:48 +00:00
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
2002-10-12 11:37:38 +00:00
*
* 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
2008-04-16 22:40:48 +00:00
* of the License , or ( at your option ) any later version .
2002-10-12 11:37:38 +00:00
*
* 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 .
2002-10-12 11:37:38 +00:00
*
* The Original Code is Copyright ( C ) 2001 - 2002 by NaN Holding BV .
* All rights reserved .
*
* The Original Code is : all of this file .
*
* Contributor ( s ) : none yet .
*
2008-04-16 22:40:48 +00:00
* * * * * * END GPL LICENSE BLOCK * * * * *
2002-10-12 11:37:38 +00:00
*/
2011-02-25 13:30:41 +00:00
/** \file gameengine/Converter/KX_ConvertProperties.cpp
* \ ingroup bgeconv
*/
2002-10-12 11:37:38 +00:00
# include "KX_ConvertProperties.h"
# include "DNA_object_types.h"
# include "DNA_property_types.h"
/* end of blender include block */
2009-09-06 13:20:05 +00:00
2002-10-12 11:37:38 +00:00
# include "Value.h"
# include "VectorValue.h"
# include "BoolValue.h"
# include "StringValue.h"
# include "FloatValue.h"
# include "KX_GameObject.h"
# include "IntValue.h"
# include "SCA_TimeEventManager.h"
# include "SCA_IScene.h"
2012-01-04 21:40:00 +00:00
# include "KX_FontObject.h"
# include "DNA_curve_types.h"
2009-09-06 13:20:05 +00:00
/* This little block needed for linking to Blender... */
# ifdef WIN32
# include "BLI_winstuff.h"
# endif
2002-10-12 11:37:38 +00:00
2012-01-05 06:34:14 +00:00
extern " C " {
# include "BKE_property.h"
}
2012-01-04 21:40:00 +00:00
/* prototype */
void BL_ConvertTextProperty ( Object * object , KX_FontObject * fontobj , SCA_TimeEventManager * timemgr , SCA_IScene * scene , bool isInActiveLayer ) ;
2002-10-12 11:37:38 +00:00
void BL_ConvertProperties ( Object * object , KX_GameObject * gameobj , SCA_TimeEventManager * timemgr , SCA_IScene * scene , bool isInActiveLayer )
{
bProperty * prop = ( bProperty * ) object - > prop . first ;
2012-09-16 04:58:18 +00:00
CValue * propval ;
2002-10-12 11:37:38 +00:00
bool show_debug_info ;
2012-10-21 07:58:38 +00:00
while ( prop ) {
2002-10-12 11:37:38 +00:00
propval = NULL ;
show_debug_info = bool ( prop - > flag & PROP_DEBUG ) ;
2012-10-21 07:58:38 +00:00
switch ( prop - > type ) {
2008-12-24 21:23:07 +00:00
case GPROP_BOOL :
{
propval = new CBoolValue ( ( bool ) ( prop - > data ! = 0 ) ) ;
gameobj - > SetProperty ( prop - > name , propval ) ;
//promp->poin= &prop->data;
break ;
}
case GPROP_INT :
{
propval = new CIntValue ( ( int ) prop - > data ) ;
gameobj - > SetProperty ( prop - > name , propval ) ;
break ;
}
case GPROP_FLOAT :
{
//prop->poin= &prop->data;
float floatprop = * ( ( float * ) & prop - > data ) ;
propval = new CFloatValue ( floatprop ) ;
gameobj - > SetProperty ( prop - > name , propval ) ;
}
2002-10-12 11:37:38 +00:00
break ;
2008-12-24 21:23:07 +00:00
case GPROP_STRING :
2002-10-12 11:37:38 +00:00
{
2008-12-24 21:23:07 +00:00
//prop->poin= callocN(MAX_PROPSTRING, "property string");
propval = new CStringValue ( ( char * ) prop - > poin , " " ) ;
gameobj - > SetProperty ( prop - > name , propval ) ;
break ;
2002-10-12 11:37:38 +00:00
}
2008-12-24 21:23:07 +00:00
case GPROP_TIME :
{
float floatprop = * ( ( float * ) & prop - > data ) ;
2002-10-12 11:37:38 +00:00
2008-12-24 21:23:07 +00:00
CValue * timeval = new CFloatValue ( floatprop ) ;
// set a subproperty called 'timer' so that
// we can register the replica of this property
// at the time a game object is replicated (AddObjectActuator triggers this)
CValue * bval = new CBoolValue ( true ) ;
timeval - > SetProperty ( " timer " , bval ) ;
bval - > Release ( ) ;
if ( isInActiveLayer )
{
timemgr - > AddTimeProperty ( timeval ) ;
}
propval = timeval ;
gameobj - > SetProperty ( prop - > name , timeval ) ;
}
default :
{
// todo make an assert etc.
}
2002-10-12 11:37:38 +00:00
}
if ( propval )
{
2013-07-09 20:06:36 +00:00
if ( show_debug_info & & isInActiveLayer )
2002-10-12 11:37:38 +00:00
{
scene - > AddDebugProperty ( gameobj , STR_String ( prop - > name ) ) ;
}
2008-03-01 19:46:50 +00:00
// done with propval, release it
propval - > Release ( ) ;
2002-10-12 11:37:38 +00:00
}
2009-06-08 20:08:19 +00:00
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2012-03-18 07:38:51 +00:00
/* Warn if we double up on attributes, this isn't quite right since it wont find inherited attributes however there arnt many */
2012-03-24 07:52:14 +00:00
for ( PyAttributeDef * attrdef = KX_GameObject : : Attributes ; attrdef - > m_name ; attrdef + + ) {
if ( strcmp ( prop - > name , attrdef - > m_name ) = = 0 ) {
2009-06-08 20:08:19 +00:00
printf ( " Warning! user defined property name \" %s \" is also a python attribute for object \" %s \" \n \t Use ob[ \" %s \" ] syntax to avoid conflict \n " , prop - > name , object - > id . name + 2 , prop - > name ) ;
break ;
}
}
2012-03-24 07:52:14 +00:00
for ( PyMethodDef * methdef = KX_GameObject : : Methods ; methdef - > ml_name ; methdef + + ) {
if ( strcmp ( prop - > name , methdef - > ml_name ) = = 0 ) {
2009-06-08 20:08:19 +00:00
printf ( " Warning! user defined property name \" %s \" is also a python method for object \" %s \" \n \t Use ob[ \" %s \" ] syntax to avoid conflict \n " , prop - > name , object - > id . name + 2 , prop - > name ) ;
break ;
}
}
/* end warning check */
2010-10-31 04:11:39 +00:00
# endif // WITH_PYTHON
2002-10-12 11:37:38 +00:00
prop = prop - > next ;
}
2008-09-25 16:19:07 +00:00
// check if state needs to be debugged
2013-07-09 20:06:36 +00:00
if ( object - > scaflag & OB_DEBUGSTATE & & isInActiveLayer )
2008-09-25 16:19:07 +00:00
{
// reserve name for object state
scene - > AddDebugProperty ( gameobj , STR_String ( " __state__ " ) ) ;
}
2012-01-04 21:40:00 +00:00
/* Font Objects need to 'copy' the Font Object data body to ["Text"] */
if ( object - > type = = OB_FONT )
{
BL_ConvertTextProperty ( object , ( KX_FontObject * ) gameobj , timemgr , scene , isInActiveLayer ) ;
}
2002-10-12 11:37:38 +00:00
}
2012-01-04 21:40:00 +00:00
void BL_ConvertTextProperty ( Object * object , KX_FontObject * fontobj , SCA_TimeEventManager * timemgr , SCA_IScene * scene , bool isInActiveLayer )
{
CValue * tprop = fontobj - > GetProperty ( " Text " ) ;
2012-03-24 07:52:14 +00:00
if ( ! tprop ) return ;
2012-09-18 04:35:30 +00:00
bProperty * prop = BKE_bproperty_object_get ( object , " Text " ) ;
2012-03-24 07:52:14 +00:00
if ( ! prop ) return ;
2012-01-04 21:40:00 +00:00
Curve * curve = static_cast < Curve * > ( object - > data ) ;
STR_String str = curve - > str ;
2012-01-05 06:34:14 +00:00
CValue * propval = NULL ;
2012-01-04 21:40:00 +00:00
2012-10-21 07:58:38 +00:00
switch ( prop - > type ) {
2012-01-05 06:34:14 +00:00
case GPROP_BOOL :
{
int value = atoi ( str ) ;
propval = new CBoolValue ( ( bool ) ( value ! = 0 ) ) ;
tprop - > SetValue ( propval ) ;
break ;
2012-01-04 21:40:00 +00:00
}
2012-01-05 06:34:14 +00:00
case GPROP_INT :
{
int value = atoi ( str ) ;
propval = new CIntValue ( value ) ;
tprop - > SetValue ( propval ) ;
break ;
}
case GPROP_FLOAT :
{
2012-04-09 01:16:19 +00:00
float floatprop = ( float ) atof ( str ) ;
2012-01-05 06:34:14 +00:00
propval = new CFloatValue ( floatprop ) ;
tprop - > SetValue ( propval ) ;
break ;
}
case GPROP_STRING :
{
propval = new CStringValue ( str , " " ) ;
tprop - > SetValue ( propval ) ;
break ;
}
case GPROP_TIME :
{
2012-04-09 01:16:19 +00:00
float floatprop = ( float ) atof ( str ) ;
2012-01-05 06:34:14 +00:00
CValue * timeval = new CFloatValue ( floatprop ) ;
// set a subproperty called 'timer' so that
// we can register the replica of this property
// at the time a game object is replicated (AddObjectActuator triggers this)
CValue * bval = new CBoolValue ( true ) ;
timeval - > SetProperty ( " timer " , bval ) ;
bval - > Release ( ) ;
if ( isInActiveLayer )
2012-01-04 21:40:00 +00:00
{
2012-01-05 06:34:14 +00:00
timemgr - > AddTimeProperty ( timeval ) ;
2012-01-04 21:40:00 +00:00
}
2012-01-05 06:34:14 +00:00
propval = timeval ;
tprop - > SetValue ( timeval ) ;
2012-01-04 21:40:00 +00:00
}
2012-01-05 06:34:14 +00:00
default :
{
// todo make an assert etc.
}
}
2012-01-04 21:40:00 +00:00
2012-01-05 06:34:14 +00:00
if ( propval ) {
propval - > Release ( ) ;
2012-01-04 21:40:00 +00:00
}
}