| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  |  * Assign, change, copy properties | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											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:32:11 +00:00
										 |  |  | /** \file gameengine/GameLogic/SCA_PropertyActuator.cpp
 | 
					
						
							|  |  |  |  *  \ingroup gamelogic | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 00:02:25 +00:00
										 |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | #include "SCA_PropertyActuator.h"
 | 
					
						
							|  |  |  | #include "InputParser.h"
 | 
					
						
							|  |  |  | #include "Operator2Expr.h"
 | 
					
						
							|  |  |  | #include "ConstExpr.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | /* Native functions                                                          */ | 
					
						
							|  |  |  | /* ------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-28 11:22:26 +00:00
										 |  |  | SCA_PropertyActuator::SCA_PropertyActuator(SCA_IObject* gameobj,SCA_IObject* sourceObj,const STR_String& propname,const STR_String& expr,int acttype) | 
					
						
							| 
									
										
										
										
											2009-09-24 21:22:24 +00:00
										 |  |  |    :	SCA_IActuator(gameobj, KX_ACT_PROPERTY), | 
					
						
							| 
									
										
										
										
											2004-03-22 22:02:18 +00:00
										 |  |  | 	m_type(acttype), | 
					
						
							|  |  |  | 	m_propname(propname), | 
					
						
							|  |  |  | 	m_exprtxt(expr), | 
					
						
							|  |  |  | 	m_sourceObj(sourceObj) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-03-22 14:47:42 +00:00
										 |  |  | 	// protect ourselves against someone else deleting the source object
 | 
					
						
							|  |  |  | 	// don't protect against ourselves: it would create a dead lock
 | 
					
						
							| 
									
										
										
										
											2008-07-19 07:45:19 +00:00
										 |  |  | 	if (m_sourceObj) | 
					
						
							|  |  |  | 		m_sourceObj->RegisterActuator(this); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SCA_PropertyActuator::~SCA_PropertyActuator() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-07-19 07:45:19 +00:00
										 |  |  | 	if (m_sourceObj) | 
					
						
							|  |  |  | 		m_sourceObj->UnregisterActuator(this); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-16 11:41:50 +00:00
										 |  |  | bool SCA_PropertyActuator::Update() | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	bool result = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool bNegativeEvent = IsNegativeEvent(); | 
					
						
							|  |  |  | 	RemoveAllEvents(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (bNegativeEvent) | 
					
						
							|  |  |  | 		return false; // do nothing on negative events
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue* propowner = GetParent(); | 
					
						
							|  |  |  | 	CParser parser; | 
					
						
							|  |  |  | 	parser.SetContext( propowner->AddRef()); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 	CExpression* userexpr= NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (m_type==KX_ACT_PROP_TOGGLE) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2012-03-18 07:38:51 +00:00
										 |  |  | 		/* don't use */ | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 		CValue* newval; | 
					
						
							|  |  |  | 		CValue* oldprop = propowner->GetProperty(m_propname); | 
					
						
							|  |  |  | 		if (oldprop) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			newval = new CBoolValue((oldprop->GetNumber()==0.0) ? true:false); | 
					
						
							|  |  |  | 			oldprop->SetValue(newval); | 
					
						
							|  |  |  | 		} else | 
					
						
							|  |  |  | 		{	/* as not been assigned, evaluate as false, so assign true */ | 
					
						
							|  |  |  | 			newval = new CBoolValue(true); | 
					
						
							|  |  |  | 			propowner->SetProperty(m_propname,newval); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		newval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else if ((userexpr = parser.ProcessText(m_exprtxt))) { | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		switch (m_type) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case KX_ACT_PROP_ASSIGN: | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				CValue* newval = userexpr->Calculate(); | 
					
						
							|  |  |  | 				CValue* oldprop = propowner->GetProperty(m_propname); | 
					
						
							|  |  |  | 				if (oldprop) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					oldprop->SetValue(newval); | 
					
						
							|  |  |  | 				} else | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					propowner->SetProperty(m_propname,newval); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 				newval->Release(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case KX_ACT_PROP_ADD: | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				CValue* oldprop = propowner->GetProperty(m_propname); | 
					
						
							|  |  |  | 				if (oldprop) | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2005-03-09 19:45:59 +00:00
										 |  |  | 					// int waarde = (int)oldprop->GetNumber();  /*unused*/
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 					CExpression* expr = new COperator2Expr(VALUE_ADD_OPERATOR,new CConstExpr(oldprop->AddRef()), | 
					
						
							|  |  |  | 															userexpr->AddRef()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					CValue* newprop = expr->Calculate(); | 
					
						
							|  |  |  | 					oldprop->SetValue(newprop); | 
					
						
							|  |  |  | 					newprop->Release(); | 
					
						
							|  |  |  | 					expr->Release(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case KX_ACT_PROP_COPY: | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				if (m_sourceObj) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					CValue* copyprop = m_sourceObj->GetProperty(m_exprtxt); | 
					
						
							|  |  |  | 					if (copyprop) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 						CValue *val = copyprop->GetReplica(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 						GetParent()->SetProperty( | 
					
						
							|  |  |  | 							 m_propname, | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 							 val); | 
					
						
							|  |  |  | 						val->Release(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 		/* case KX_ACT_PROP_TOGGLE: */ /* accounted for above, no need for userexpr */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		default: | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		userexpr->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SCA_PropertyActuator:: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | isValid( | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SCA_PropertyActuator::KX_ACT_PROP_MODE mode | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 05:03:24 +00:00
										 |  |  | ) { | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 	bool res = false; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	res = ((mode > KX_ACT_PROP_NODEF) && (mode < KX_ACT_PROP_MAX)); | 
					
						
							|  |  |  | 	return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue*  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SCA_PropertyActuator:: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 16:49:59 +00:00
										 |  |  | GetReplica() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SCA_PropertyActuator* replica = new SCA_PropertyActuator(*this); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	replica->ProcessReplica(); | 
					
						
							|  |  |  | 	return replica; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-14 22:45:28 +00:00
										 |  |  | void SCA_PropertyActuator::ProcessReplica() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// no need to check for self reference like in the constructor:
 | 
					
						
							|  |  |  | 	// the replica will always have a different parent
 | 
					
						
							|  |  |  | 	if (m_sourceObj) | 
					
						
							| 
									
										
										
										
											2008-07-19 07:45:19 +00:00
										 |  |  | 		m_sourceObj->RegisterActuator(this); | 
					
						
							| 
									
										
										
										
											2008-04-14 22:45:28 +00:00
										 |  |  | 	SCA_IActuator::ProcessReplica(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-19 07:45:19 +00:00
										 |  |  | bool SCA_PropertyActuator::UnlinkObject(SCA_IObject* clientobj) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (clientobj == m_sourceObj) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// this object is being deleted, we cannot continue to track it.
 | 
					
						
							|  |  |  | 		m_sourceObj = NULL; | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-06 20:18:42 +00:00
										 |  |  | void SCA_PropertyActuator::Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map) | 
					
						
							| 
									
										
										
										
											2008-07-19 07:45:19 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	void **h_obj = (*obj_map)[m_sourceObj]; | 
					
						
							|  |  |  | 	if (h_obj) { | 
					
						
							|  |  |  | 		if (m_sourceObj) | 
					
						
							|  |  |  | 			m_sourceObj->UnregisterActuator(this); | 
					
						
							|  |  |  | 		m_sourceObj = (SCA_IObject*)(*h_obj); | 
					
						
							|  |  |  | 		m_sourceObj->RegisterActuator(this); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-31 04:11:39 +00:00
										 |  |  | #ifdef WITH_PYTHON
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | /* Python functions                                                          */ | 
					
						
							|  |  |  | /* ------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Integration hooks ------------------------------------------------------- */ | 
					
						
							|  |  |  | PyTypeObject SCA_PropertyActuator::Type = { | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	PyVarObject_HEAD_INIT(NULL, 0) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	"SCA_PropertyActuator", | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 	sizeof(PyObjectPlus_Proxy), | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 	py_base_dealloc, | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 	py_base_repr, | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 	0,0,0,0,0,0,0,0,0, | 
					
						
							| 
									
										
										
										
											2009-06-28 11:22:26 +00:00
										 |  |  | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, | 
					
						
							|  |  |  | 	0,0,0,0,0,0,0, | 
					
						
							|  |  |  | 	Methods, | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 	&SCA_IActuator::Type, | 
					
						
							|  |  |  | 	0,0,0,0,0,0, | 
					
						
							|  |  |  | 	py_base_new | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyMethodDef SCA_PropertyActuator::Methods[] = { | 
					
						
							|  |  |  | 	{NULL,NULL} //Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-02 17:43:56 +00:00
										 |  |  | PyAttributeDef SCA_PropertyActuator::Attributes[] = { | 
					
						
							| 
									
										
										
										
											2012-01-16 05:27:11 +00:00
										 |  |  | 	KX_PYATTRIBUTE_STRING_RW_CHECK("propName",0,MAX_PROP_NAME,false,SCA_PropertyActuator,m_propname,CheckProperty), | 
					
						
							| 
									
										
										
										
											2009-01-02 17:43:56 +00:00
										 |  |  | 	KX_PYATTRIBUTE_STRING_RW("value",0,100,false,SCA_PropertyActuator,m_exprtxt), | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	KX_PYATTRIBUTE_INT_RW("mode", KX_ACT_PROP_NODEF+1, KX_ACT_PROP_MAX-1, false, SCA_PropertyActuator, m_type), /* ATTR_TODO add constents to game logic dict */ | 
					
						
							| 
									
										
										
										
											2009-01-02 17:43:56 +00:00
										 |  |  | 	{ NULL }	//Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 21:42:40 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | /* eof */ |