blender/source/gameengine/Ketsji/KX_GameObject.h
Porteries Tristan 728d1ec504 BGE: Fix T46381 : last action frame not updated.
It fix T46381. Normally BL_Action::Update (manage action time, end, loop…) should be called the same number of times as BL_Action::UpdateIPO (update action position, scale ect… in the game object).
But the bug report shows that UpdateIPO is called one less time than Update. To fix it i revert the commit 362b25b38287cb75e4d22b30bdbc7f47e8eb3fdf and implement a mutex in BL_Action::Update.
Example file : {F245823}

Reviewers: lordloki, kupoman, campbellbarton, youle, moguri, sybren

Reviewed By: youle, moguri, sybren

Maniphest Tasks: T39928, T46381

Differential Revision: https://developer.blender.org/D1562
2015-10-19 16:03:40 +02:00

1143 lines
30 KiB
C++

/*
* ***** 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,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* 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.
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file KX_GameObject.h
* \ingroup ketsji
* \brief General KX game object.
*/
#ifndef __KX_GAMEOBJECT_H__
#define __KX_GAMEOBJECT_H__
#ifdef _MSC_VER
/* get rid of this stupid "warning 'this' used in initialiser list", generated by VC when including Solid/Sumo */
# pragma warning (disable:4355)
#endif
#include <stddef.h>
#include "EXP_ListValue.h"
#include "SCA_IObject.h"
#include "SG_Node.h"
#include "MT_Transform.h"
#include "MT_CmMatrix4x4.h"
#include "CTR_Map.h"
#include "CTR_HashedPtr.h"
#include "KX_Scene.h"
#include "KX_KetsjiEngine.h" /* for m_anim_framerate */
#include "DNA_constraint_types.h" /* for constraint replication */
#include "DNA_object_types.h"
#include "SCA_LogicManager.h" /* for ConvertPythonToGameObject to search object names */
//Forward declarations.
struct KX_ClientObjectInfo;
class KX_RayCast;
class RAS_MeshObject;
class PHY_IGraphicController;
class PHY_IPhysicsEnvironment;
class PHY_IPhysicsController;
class BL_ActionManager;
struct Object;
class KX_ObstacleSimulation;
struct bAction;
#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToGameObject(PyObject *value, KX_GameObject **object, bool py_none_ok, const char *error_prefix);
#endif
#ifdef USE_MATHUTILS
void KX_GameObject_Mathutils_Callback_Init(void);
#endif
/**
* KX_GameObject is the main class for dynamic objects.
*/
class KX_GameObject : public SCA_IObject
{
Py_Header
protected:
bool m_bDyna;
KX_ClientObjectInfo* m_pClient_info;
STR_String m_name;
STR_String m_text;
int m_layer;
std::vector<RAS_MeshObject*> m_meshes;
std::vector<RAS_MeshObject*> m_lodmeshes;
int m_currentLodLevel;
short m_previousLodLevel;
SG_QList m_meshSlots; // head of mesh slots of this
struct Object* m_pBlenderObject;
struct Object* m_pBlenderGroupObject;
bool m_bUseObjectColor;
bool m_bIsNegativeScaling;
MT_Vector4 m_objectColor;
// Bit fields for user control over physics collisions
unsigned short m_userCollisionGroup;
unsigned short m_userCollisionMask;
// visible = user setting
// culled = while rendering, depending on camera
bool m_bVisible;
bool m_bCulled;
bool m_bOccluder;
PHY_IPhysicsController* m_pPhysicsController;
PHY_IGraphicController* m_pGraphicController;
SG_Node* m_pSGNode;
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
std::vector<bRigidBodyJointConstraint*> m_constraints;
KX_ObstacleSimulation* m_pObstacleSimulation;
CListValue* m_pInstanceObjects;
KX_GameObject* m_pDupliGroupObject;
// The action manager is used to play/stop/update actions
BL_ActionManager* m_actionManager;
BL_ActionManager* GetActionManager();
bool m_bRecordAnimation;
public:
bool m_isDeformable;
/**
* KX_GameObject custom infos for ray cast, it contains property name,
* collision mask, xray flag and hited object.
* This structure is created during ray cast and passed as argument
* "data" to functions KX_GameObject::NeedRayCast and KX_GameObject::RayHit.
*/
struct RayCastData;
/**
* Helper function for modules that can't include KX_ClientObjectInfo.h
*/
static KX_GameObject* GetClientObject(KX_ClientObjectInfo* info);
#ifdef WITH_PYTHON
// Python attributes that wont convert into CValue
//
// there are 2 places attributes can be stored, in the CValue,
// where attributes are converted into BGE's CValue types
// these can be used with property actuators
//
// For the python API, For types that cannot be converted into CValues (lists, dicts, GameObjects)
// these will be put into "m_attr_dict", logic bricks cannot access them.
//
// rules for setting attributes.
//
// * there should NEVER be a CValue and a m_attr_dict attribute with matching names. get/sets make sure of this.
// * if CValue conversion fails, use a PyObject in "m_attr_dict"
// * when assigning a value, first see if it can be a CValue, if it can remove the "m_attr_dict" and set the CValue
//
PyObject* m_attr_dict;
PyObject* m_collisionCallbacks;
#endif
virtual void /* This function should be virtual - derived classed override it */
Relink(
CTR_Map<CTR_HashedPtr, void*> *map
);
/**
* Compute an OpenGl compatible 4x4 matrix. Has the
* side effect of storing the result internally. The
* memory for the matrix remains the property of this class.
*/
double *
GetOpenGLMatrix(
);
/**
* Return a pointer to a MT_CmMatrix4x4 storing the
* opengl transformation for this object. This is updated
* by a call to GetOpenGLMatrix(). This class owns the
* memory for the returned matrix.
*/
MT_CmMatrix4x4 *
GetOpenGLMatrixPtr(
) {
return &m_OpenGL_4x4Matrix;
};
/**
* Update the blender object obmat field from the object world position
* if blendobj is NULL, update the object pointed by m_pBlenderObject
* The user must take action to restore the matrix before leaving the GE.
* Used in Armature evaluation
*/
void
UpdateBlenderObjectMatrix(Object* blendobj=NULL);
/**
* Used for constraint replication for group instances.
* The list of constraints is filled during data conversion.
*/
void AddConstraint(bRigidBodyJointConstraint *cons);
std::vector<bRigidBodyJointConstraint*> GetConstraints();
void ClearConstraints();
/**
* Get a pointer to the game object that is the parent of
* this object. Or NULL if there is no parent. The returned
* object is part of a reference counting scheme. Calling
* this function ups the reference count on the returned
* object. It is the responsibility of the caller to decrement
* the reference count when you have finished with it.
*/
KX_GameObject*
GetParent(
);
/**
* Sets the parent of this object to a game object
*/
void SetParent(KX_Scene *scene, KX_GameObject *obj, bool addToCompound=true, bool ghost=true);
/**
* Removes the parent of this object to a game object
*/
void RemoveParent(KX_Scene *scene);
/*********************************
* group reference API
*********************************/
KX_GameObject*
GetDupliGroupObject(
);
CListValue*
GetInstanceObjects(
);
void
SetDupliGroupObject(KX_GameObject*
);
void
AddInstanceObjects(KX_GameObject*
);
void
RemoveDupliGroupObject(
);
void
RemoveInstanceObject(KX_GameObject*
);
/*********************************
* Animation API
*********************************/
/**
* Adds an action to the object's action manager
*/
bool PlayAction(const char* name,
float start,
float end,
short layer=0,
short priority=0,
float blendin=0.f,
short play_mode=0,
float layer_weight=0.f,
short ipo_flags=0,
float playback_speed=1.f,
short blend_mode=0);
/**
* Gets the current frame of an action
*/
float GetActionFrame(short layer);
/**
* Gets the name of the current action
*/
const char *GetActionName(short layer);
/**
* Sets the current frame of an action
*/
void SetActionFrame(short layer, float frame);
/**
* Gets the currently running action on the given layer
*/
bAction *GetCurrentAction(short layer);
/**
* Sets play mode of the action on the given layer
*/
void SetPlayMode(short layer, short mode);
/**
* Sets the start and end times of the action on the given layer
*/
void SetTimes(short layer, float start, float end);
/**
* Stop playing the action on the given layer
*/
void StopAction(short layer);
/**
* Remove playing tagged actions.
*/
void RemoveTaggedActions();
/**
* Check if an action has finished playing
*/
bool IsActionDone(short layer);
/**
* Kick the object's action manager
*/
void UpdateActionManager(float curtime);
/*********************************
* End Animation API
*********************************/
/**
* Construct a game object. This class also inherits the
* default constructors - use those with care!
*/
KX_GameObject(
void* sgReplicationInfo,
SG_Callbacks callbacks
);
virtual
~KX_GameObject(
);
/**
* \section Stuff which is here due to poor design.
* Inherited from CValue and needs an implementation.
* Do not expect these functions do to anything sensible.
*/
/**
* Inherited from CValue -- does nothing!
*/
CValue*
Calc(
VALUE_OPERATOR op,
CValue *val
);
/**
* Inherited from CValue -- does nothing!
*/
CValue*
CalcFinal(
VALUE_DATA_TYPE dtype,
VALUE_OPERATOR op,
CValue *val
);
/**
* Inherited from CValue -- does nothing!
*/
const
STR_String &
GetText(
);
/**
* Inherited from CValue -- does nothing!
*/
double
GetNumber(
);
/**
* \section Inherited from CValue. These are the useful
* part of the CValue interface that this class implements.
*/
/**
* Inherited from CValue -- returns the name of this object.
*/
STR_String&
GetName(
);
/**
* Inherited from CValue -- set the name of this object.
*/
void
SetName(
const char *name
);
/**
* Inherited from CValue -- return a new copy of this
* instance allocated on the heap. Ownership of the new
* object belongs with the caller.
*/
virtual CValue*
GetReplica(
);
/**
* Inherited from CValue -- Makes sure any internal
* data owned by this class is deep copied. Called internally
*/
virtual void
ProcessReplica();
/**
* Return the linear velocity of the game object.
*/
MT_Vector3
GetLinearVelocity(
bool local=false
);
/**
* Return the linear velocity of a given point in world coordinate
* but relative to center of object ([0,0,0]=center of object)
*/
MT_Vector3
GetVelocity(
const MT_Point3& position
);
/**
* Return the mass of the object
*/
MT_Scalar
GetMass();
/**
* Return the local inertia vector of the object
*/
MT_Vector3
GetLocalInertia();
/**
* Return the angular velocity of the game object.
*/
MT_Vector3
GetAngularVelocity(
bool local=false
);
/**
* Align the object to a given normal.
*/
void
AlignAxisToVect(
const MT_Vector3& vect,
int axis = 2,
float fac = 1.0
);
/**
* Quick'n'dirty obcolor ipo stuff
*/
void
SetObjectColor(
const MT_Vector4& rgbavec
);
const MT_Vector4&
GetObjectColor();
void
ResolveCombinedVelocities(
const MT_Vector3 & lin_vel,
const MT_Vector3 & ang_vel,
bool lin_vel_local,
bool ang_vel_local
);
/**
* \return a pointer to the physics controller owned by this class.
*/
PHY_IPhysicsController* GetPhysicsController();
void SetPhysicsController(PHY_IPhysicsController* physicscontroller,bool isDynamic)
{
m_bDyna = isDynamic;
m_pPhysicsController = physicscontroller;
}
virtual class RAS_Deformer* GetDeformer()
{
return 0;
}
virtual void SetDeformer(class RAS_Deformer* deformer)
{
}
/**
* \return a pointer to the graphic controller owner by this class
*/
PHY_IGraphicController* GetGraphicController()
{
return m_pGraphicController;
}
void SetGraphicController(PHY_IGraphicController* graphiccontroller)
{
m_pGraphicController = graphiccontroller;
}
/*
* @add/remove the graphic controller to the physic system
*/
void ActivateGraphicController(bool recurse);
/** Set the object's collison group
* \param filter The group bitfield
*/
void SetUserCollisionGroup(unsigned short filter);
/** Set the object's collison mask
* \param filter The mask bitfield
*/
void SetUserCollisionMask(unsigned short mask);
unsigned short GetUserCollisionGroup();
unsigned short GetUserCollisionMask();
/**
* Extra broadphase check for user controllable collisions
*/
bool CheckCollision(KX_GameObject *other);
/**
* \section Coordinate system manipulation functions
*/
void NodeSetLocalPosition(const MT_Point3& trans );
void NodeSetLocalOrientation(const MT_Matrix3x3& rot );
void NodeSetGlobalOrientation(const MT_Matrix3x3& rot );
void NodeSetLocalScale( const MT_Vector3& scale );
void NodeSetWorldScale( const MT_Vector3& scale );
void NodeSetRelativeScale( const MT_Vector3& scale );
// adapt local position so that world position is set to desired position
void NodeSetWorldPosition(const MT_Point3& trans);
void
NodeUpdateGS(
double time
);
const MT_Matrix3x3& NodeGetWorldOrientation( ) const;
const MT_Vector3& NodeGetWorldScaling( ) const;
const MT_Point3& NodeGetWorldPosition( ) const;
const MT_Matrix3x3& NodeGetLocalOrientation( ) const;
const MT_Vector3& NodeGetLocalScaling( ) const;
const MT_Point3& NodeGetLocalPosition( ) const;
/**
* \section scene graph node accessor functions.
*/
SG_Node* GetSGNode( )
{
return m_pSGNode;
}
const SG_Node* GetSGNode( ) const
{
return m_pSGNode;
}
/**
* \section blender object accessor functions.
*/
struct Object* GetBlenderObject( )
{
return m_pBlenderObject;
}
void SetBlenderObject(struct Object* obj)
{
m_pBlenderObject = obj;
}
struct Object* GetBlenderGroupObject( )
{
return m_pBlenderGroupObject;
}
void SetBlenderGroupObject(struct Object* obj)
{
m_pBlenderGroupObject = obj;
}
bool IsDupliGroup()
{
return (m_pBlenderObject &&
(m_pBlenderObject->transflag & OB_DUPLIGROUP) &&
m_pBlenderObject->dup_group != NULL) ? true : false;
}
/**
* Set the Scene graph node for this game object.
* warning - it is your responsibility to make sure
* all controllers look at this new node. You must
* also take care of the memory associated with the
* old node. This class takes ownership of the new
* node.
*/
void SetSGNode(SG_Node* node )
{
m_pSGNode = node;
}
//Is it a dynamic/physics object ?
bool IsDynamic() const
{
return m_bDyna;
}
bool IsDynamicsSuspended() const;
/**
* Should we record animation for this object?
*/
void SetRecordAnimation(bool recordAnimation)
{
m_bRecordAnimation = recordAnimation;
}
bool IsRecordAnimation() const
{
return m_bRecordAnimation;
}
/**
* Check if this object has a vertex parent relationship
*/
bool IsVertexParent( )
{
return (m_pSGNode && m_pSGNode->GetSGParent() && m_pSGNode->GetSGParent()->IsVertexParent());
}
/// \see KX_RayCast
bool RayHit(KX_ClientObjectInfo *client, KX_RayCast *result, RayCastData *rayData);
/// \see KX_RayCast
bool NeedRayCast(KX_ClientObjectInfo *client, RayCastData *rayData);
/**
* \section Physics accessors for this node.
*
* All these calls get passed directly to the physics controller
* owned by this object.
* This is real interface bloat. Why not just use the physics controller
* directly? I think this is because the python interface is in the wrong
* place.
*/
void
ApplyForce(
const MT_Vector3& force, bool local
);
void
ApplyTorque(
const MT_Vector3& torque,
bool local
);
void
ApplyRotation(
const MT_Vector3& drot,
bool local
);
void
ApplyMovement(
const MT_Vector3& dloc,
bool local
);
void
addLinearVelocity(
const MT_Vector3& lin_vel,
bool local
);
void
setLinearVelocity(
const MT_Vector3& lin_vel,
bool local
);
void
setAngularVelocity(
const MT_Vector3& ang_vel,
bool local
);
virtual float getLinearDamping() const;
virtual float getAngularDamping() const;
virtual void setLinearDamping(float damping);
virtual void setAngularDamping(float damping);
virtual void setDamping(float linear, float angular);
/**
* Update the physics object transform based upon the current SG_Node
* position.
*/
void
UpdateTransform(
);
static void UpdateTransformFunc(SG_IObject* node, void* gameobj, void* scene);
/**
* only used for sensor objects
*/
void SynchronizeTransform();
static void SynchronizeTransformFunc(SG_IObject* node, void* gameobj, void* scene);
/**
* Function to set IPO option at start of IPO
*/
void
InitIPO(
bool ipo_as_force,
bool ipo_add,
bool ipo_local
);
/**
* Odd function to update an ipo. ???
*/
void
UpdateIPO(
float curframetime,
bool recurse
);
/**
* Updates Material Ipo data
*/
void
UpdateMaterialData(
dword matname_hash,
MT_Vector4 rgba,
MT_Vector3 specrgb,
MT_Scalar hard,
MT_Scalar spec,
MT_Scalar ref,
MT_Scalar emit,
MT_Scalar alpha
);
/**
* \section Mesh accessor functions.
*/
/**
* Update buckets to indicate that there is a new
* user of this object's meshes.
*/
void
AddMeshUser(
);
/**
* Update buckets with data about the mesh after
* creating or duplicating the object, changing
* visibility, object color, .. .
*/
void
UpdateBuckets(
bool recursive
);
/**
* Clear the meshes associated with this class
* and remove from the bucketing system.
* Don't think this actually deletes any of the meshes.
*/
void
RemoveMeshes(
);
/**
* Add a mesh to the set of meshes associated with this
* node. Meshes added in this way are not deleted by this class.
* Make sure you call RemoveMeshes() before deleting the
* mesh though,
*/
void
AddMesh(
RAS_MeshObject* mesh
) {
m_meshes.push_back(mesh);
}
/**
* Add a level of detail mesh to the object. These should
* be added in order.
*/
void
AddLodMesh(
RAS_MeshObject* mesh
);
/**
* Updates the current lod level based on distance from camera.
*/
void
UpdateLod(
MT_Vector3 &cam_pos
);
/**
* Pick out a mesh associated with the integer 'num'.
*/
RAS_MeshObject*
GetMesh(
int num
) const {
return m_meshes[num];
}
/**
* Return the number of meshes currently associated with this
* game object.
*/
int
GetMeshCount(
) const {
return m_meshes.size();
}
/**
* Set the debug color of the meshes associated with this
* class. Does this still work?
*/
void
SetDebugColor(
unsigned int bgra
);
/**
* Reset the debug color of meshes associated with this class.
*/
void
ResetDebugColor(
);
/**
* Was this object marked visible? (only for the explicit
* visibility system).
*/
bool
GetVisible(
void
);
/**
* Set visibility flag of this object
*/
void
SetVisible(
bool b,
bool recursive
);
/**
* Was this object culled?
*/
inline bool
GetCulled(
void
) { return m_bCulled; }
/**
* Set culled flag of this object
*/
inline void
SetCulled(
bool c
) { m_bCulled = c; }
/**
* Is this object an occluder?
*/
inline bool
GetOccluder(
void
) { return m_bOccluder; }
/**
* Set occluder flag of this object
*/
void
SetOccluder(
bool v,
bool recursive
);
/**
* Change the layer of the object (when it is added in another layer
* than the original layer)
*/
virtual void
SetLayer(
int l
);
/**
* Get the object layer
*/
int
GetLayer(
void
);
/**
* Get the negative scaling state
*/
bool
IsNegativeScaling(
void
) { return m_bIsNegativeScaling; }
/**
* \section Logic bubbling methods.
*/
void RegisterCollisionCallbacks();
void UnregisterCollisionCallbacks();
void RunCollisionCallbacks(KX_GameObject *collider, const MT_Vector3 &point, const MT_Vector3 &normal);
/**
* Stop making progress
*/
void Suspend(void);
/**
* Resume making progress
*/
void Resume(void);
void RegisterObstacle(KX_ObstacleSimulation* obstacleSimulation)
{
m_pObstacleSimulation = obstacleSimulation;
}
void UnregisterObstacle()
{
m_pObstacleSimulation = NULL;
}
/**
* add debug object to the debuglist.
*/
void SetUseDebugProperties(bool debug, bool recursive);
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
CListValue* GetChildren();
CListValue* GetChildrenRecursive();
KX_Scene* GetScene();
#ifdef WITH_PYTHON
/**
* \section Python interface functions.
*/
virtual PyObject *py_repr(void)
{
return PyUnicode_From_STR_String(GetName());
}
KX_PYMETHOD_O(KX_GameObject,SetWorldPosition);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyForce);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyTorque);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyRotation);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyMovement);
KX_PYMETHOD_VARARGS(KX_GameObject,GetLinearVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,SetLinearVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,GetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,SetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,GetVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,SetDamping);
KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce);
KX_PYMETHOD_NOARGS(KX_GameObject,GetVisible);
KX_PYMETHOD_VARARGS(KX_GameObject,SetVisible);
KX_PYMETHOD_VARARGS(KX_GameObject,SetOcclusion);
KX_PYMETHOD_NOARGS(KX_GameObject,GetState);
KX_PYMETHOD_O(KX_GameObject,SetState);
KX_PYMETHOD_VARARGS(KX_GameObject,AlignAxisToVect);
KX_PYMETHOD_O(KX_GameObject,GetAxisVect);
KX_PYMETHOD_VARARGS(KX_GameObject,SuspendDynamics);
KX_PYMETHOD_NOARGS(KX_GameObject,RestoreDynamics);
KX_PYMETHOD_NOARGS(KX_GameObject,EnableRigidBody);
KX_PYMETHOD_NOARGS(KX_GameObject,DisableRigidBody);
KX_PYMETHOD_VARARGS(KX_GameObject,ApplyImpulse);
KX_PYMETHOD_O(KX_GameObject,SetCollisionMargin);
KX_PYMETHOD_NOARGS(KX_GameObject,GetParent);
KX_PYMETHOD_VARARGS(KX_GameObject,SetParent);
KX_PYMETHOD_NOARGS(KX_GameObject,RemoveParent);
KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren);
KX_PYMETHOD_NOARGS(KX_GameObject,GetChildrenRecursive);
KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
KX_PYMETHOD_VARARGS(KX_GameObject,ReplaceMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
KX_PYMETHOD_DOC(KX_GameObject,rayCastTo);
KX_PYMETHOD_DOC(KX_GameObject,rayCast);
KX_PYMETHOD_DOC_O(KX_GameObject,getDistanceTo);
KX_PYMETHOD_DOC_O(KX_GameObject,getVectTo);
KX_PYMETHOD_DOC_VARARGS(KX_GameObject, sendMessage);
KX_PYMETHOD_VARARGS(KX_GameObject, ReinstancePhysicsMesh);
KX_PYMETHOD_DOC(KX_GameObject, addDebugProperty);
KX_PYMETHOD_DOC(KX_GameObject, playAction);
KX_PYMETHOD_DOC(KX_GameObject, stopAction);
KX_PYMETHOD_DOC(KX_GameObject, getActionFrame);
KX_PYMETHOD_DOC(KX_GameObject, getActionName);
KX_PYMETHOD_DOC(KX_GameObject, setActionFrame);
KX_PYMETHOD_DOC(KX_GameObject, isPlayingAction);
/* Dict access */
KX_PYMETHOD_VARARGS(KX_GameObject,get);
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_group_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_group_members(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_scene(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_is_suspend_dynamics(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_lin_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_lin_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_lin_vel_max(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_lin_vel_max(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_ang_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_ang_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_ang_vel_max(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_ang_vel_max(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_record_animation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_record_animation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localInertia(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localInertia(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldTransform(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldLinearVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldLinearVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localLinearVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localLinearVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_worldAngularVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_worldAngularVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_localAngularVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_localAngularVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_timeOffset(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_timeOffset(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_meshes(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_children(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_children_recursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_attrDict(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_obcolor(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_obcolor(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_collisionCallbacks(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_collisionCallbacks(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_collisionGroup(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_collisionGroup(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_collisionMask(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_collisionMask(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_debug(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_debugRecursive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_linearDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_linearDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_angularDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_angularDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
/* Experimental! */
static PyObject* pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_controllers(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
/* getitem/setitem */
static PyMappingMethods Mapping;
static PySequenceMethods Sequence;
#endif
};
#endif /* __KX_GAMEOBJECT_H__ */