Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine/Ketsji/KX_GameObject.h')
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h614
1 files changed, 614 insertions, 0 deletions
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
new file mode 100644
index 00000000000..c9c9ccafd0d
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -0,0 +1,614 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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/BL DUAL LICENSE BLOCK *****
+ * General KX game object.
+ */
+
+#ifndef __KX_GAMEOBJECT
+#define __KX_GAMEOBJECT
+
+
+#ifdef WIN32
+// get rid of this stupid "warning 'this' used in initialiser list", generated by VC when including Solid/Sumo
+#pragma warning (disable : 4355)
+#endif
+
+
+#include "ListValue.h"
+#include "SCA_IObject.h"
+#include "SG_Node.h"
+#include "MT_Transform.h"
+#include "MT_CmMatrix4x4.h"
+#include "GEN_Map.h"
+#include "GEN_HashedPtr.h"
+
+#define KX_FIXED_FRAME_PER_SEC 25.0f
+#define KX_FIXED_SEC_PER_FRAME (1.0f / KX_FIXED_FRAME_PER_SEC)
+#define KX_OB_DYNAMIC 1
+
+
+//Forward declarations.
+struct KX_ClientObjectInfo;
+class RAS_MeshObject;
+class KX_IPhysicsController;
+class SM_Object;
+
+class KX_GameObject : public SCA_IObject
+{
+ Py_Header;
+
+ bool m_bDyna;
+ KX_ClientObjectInfo* m_pClient_info;
+ STR_String m_name;
+ STR_String m_text;
+ std::vector<RAS_MeshObject*> m_meshes;
+
+ bool m_bSuspendDynamics;
+ bool m_bUseObjectColor;
+ MT_Vector4 m_objectColor;
+
+ // Is this object set to be visible? Only useful for the
+ // visibility subsystem right now.
+ bool m_bVisible;
+
+ KX_IPhysicsController* m_pPhysicsController1;
+ SG_Node* m_pSGNode;
+
+protected:
+ MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
+
+public:
+ virtual void /* This function should be virtual - derived classed override it */
+ Relink(
+ GEN_Map<GEN_HashedPtr, void*> *map
+ );
+
+ /**
+ * Compute an OpenGl compatable 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;
+ };
+
+ /**
+ * 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(
+ );
+
+
+ /**
+ * Construct a game object. This class also inherits the
+ * default constructors - use those with care!
+ */
+
+ KX_GameObject(
+ void* sgReplicationInfo,
+ SG_Callbacks callbacks,
+ PyTypeObject* T=&Type
+ );
+
+ virtual
+ ~KX_GameObject(
+ );
+
+ CValue*
+ AddRef() {
+ /* temporarily to find memleaks */ return CValue::AddRef();
+ }
+
+ /**
+ * @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!
+ */
+ float
+ 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(
+ STR_String name
+ );
+
+ /**
+ * Inherited from CValue -- does nothing.
+ */
+ void
+ ReplicaSetName(
+ STR_String name
+ );
+
+ /**
+ * Inherited from CValue -- return a new copy of this
+ * instance allocated on the heap. Ownership of the new
+ * object belongs with the caller.
+ */
+ CValue*
+ GetReplica(
+ );
+
+ /**
+ * Inherited from CValue -- Makes sure any internal
+ * data owned by this class is deep copied. Called internally
+ */
+ void
+ ProcessReplica(
+ KX_GameObject* replica
+ );
+
+ /**
+ * Return the linear velocity of the game object.
+ */
+ MT_Vector3
+ GetLinearVelocity(
+ );
+
+ /**
+ * Quick'n'dirty obcolor ipo stuff
+ */
+
+ void
+ SetObjectColor(
+ const MT_Vector4& rgbavec
+ );
+
+
+
+
+ /**
+ * @return a pointer to the physics controller owned by this class.
+ */
+
+ KX_IPhysicsController*
+ GetPhysicsController(
+ ) ;
+
+ void SetPhysicsController
+ (KX_IPhysicsController* physicscontroller)
+ { m_pPhysicsController1 = physicscontroller;};
+
+
+ /**
+ * @section Coordinate system manipulation functions
+ */
+
+ void
+ NodeSetLocalPosition(
+ const MT_Point3& trans
+ );
+
+ void
+ NodeSetLocalOrientation(
+ const MT_Matrix3x3& rot
+ );
+
+ void
+ NodeSetLocalScale(
+ const MT_Vector3& scale
+ );
+
+ void
+ NodeSetRelativeScale(
+ const MT_Vector3& scale
+ );
+
+ void
+ NodeUpdateGS(
+ double time,
+ bool bInitiator
+ );
+
+ const
+ MT_Matrix3x3&
+ NodeGetWorldOrientation(
+ ) const;
+
+ const
+ MT_Vector3&
+ NodeGetWorldScaling(
+ ) const;
+
+ const
+ MT_Point3&
+ NodeGetWorldPosition(
+ ) const;
+
+
+ /**
+ * @section scene graph node accessor functions.
+ */
+
+ SG_Node*
+ GetSGNode(
+ ) {
+ return m_pSGNode;
+ }
+
+ const
+ SG_Node*
+ GetSGNode(
+ ) const {
+ return m_pSGNode;
+ }
+
+ /**
+ * 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;
+ }
+
+ bool
+ IsDynamic(
+ ) const {
+ return m_bDyna;
+ }
+
+
+ /**
+ * @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
+ );
+
+ /**
+ * Update the physics object transform based upon the current SG_Node
+ * position.
+ */
+ void
+ UpdateTransform(
+ );
+
+ /**
+ * Only update the transform if it's a non-dynamic object
+ */
+ void
+ UpdateNonDynas(
+ );
+
+ /**
+ * Odd function to update an ipo. ???
+ */
+ void
+ UpdateIPO(
+ float curframetime,
+ bool resurse,
+ bool ipo_as_force,
+ bool force_ipo_local
+ );
+
+ /**
+ * @section Mesh accessor functions.
+ */
+
+ /**
+ * Run through the meshes associated with this
+ * object and bucketize them. See RAS_Mesh for
+ * more details on this function. Interesting to
+ * note that polygon bucketizing seems to happen on a per
+ * object basis. Which may explain why there is such
+ * a big performance gain when all static objects
+ * are joined into 1.
+ */
+ void
+ Bucketize(
+ );
+
+ /**
+ * 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);
+ }
+
+ /**
+ * 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(
+ );
+
+ /**
+ * Set the visibility of the meshes associated with this
+ * object.
+ */
+ void
+ MarkVisible(
+ bool visible
+ );
+
+ /**
+ * Set the visibility according to the visibility flag.
+ */
+ void
+ MarkVisible(
+ void
+ );
+
+
+ /**
+ * Was this object marked visible? (only for the ewxplicit
+ * visibility system).
+ */
+ bool
+ GetVisible(
+ void
+ );
+
+ /**
+ * Set visibility flag of this object
+ */
+ void
+ SetVisible(
+ bool b
+ );
+
+
+ /**
+ * @section Logic bubbling methods.
+ */
+
+ /**
+ * Stop making progress
+ */
+ void Suspend(void);
+
+ /**
+ * Resume making progress
+ */
+ void Resume(void);
+
+ /**
+ * @section Python interface functions.
+ */
+
+ virtual
+ PyObject*
+ _getattr(
+ char *attr
+ );
+
+ PyObject*
+ PySetPosition(
+ PyObject* self,
+ PyObject* args,
+ PyObject* kwds
+ );
+
+ static
+ PyObject*
+ sPySetPosition(
+ PyObject* self,
+ PyObject* args,
+ PyObject* kwds
+ );
+
+ KX_PYMETHOD(KX_GameObject,GetPosition);
+ KX_PYMETHOD(KX_GameObject,GetLinearVelocity);
+ KX_PYMETHOD(KX_GameObject,GetVelocity);
+ KX_PYMETHOD(KX_GameObject,GetMass);
+ KX_PYMETHOD(KX_GameObject,GetReactionForce);
+ KX_PYMETHOD(KX_GameObject,GetOrientation);
+ KX_PYMETHOD(KX_GameObject,SetOrientation);
+ KX_PYMETHOD(KX_GameObject,SetVisible);
+ KX_PYMETHOD(KX_GameObject,SuspendDynamics);
+ KX_PYMETHOD(KX_GameObject,RestoreDynamics);
+ KX_PYMETHOD(KX_GameObject,EnableRigidBody);
+ KX_PYMETHOD(KX_GameObject,DisableRigidBody);
+ KX_PYMETHOD(KX_GameObject,ApplyImpulse);
+ KX_PYMETHOD(KX_GameObject,GetMesh);
+ KX_PYMETHOD(KX_GameObject,GetParent);
+ KX_PYMETHOD(KX_GameObject,GetPhysicsId);
+
+private :
+
+ /**
+ * Random internal function to convert python function arguments
+ * to 2 vectors.
+ * @return true if conversion was possible.
+ */
+
+ bool
+ ConvertPythonVectorArgs(
+ PyObject* args,
+ MT_Vector3& pos,
+ MT_Vector3& pos2
+ );
+
+};
+
+
+#endif //__KX_GAMEOBJECT
+