Merging r50192 through r50223 from trunk into soc-2011-tomato
[blender.git] / source / gameengine / Converter / BL_ArmatureObject.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file BL_ArmatureObject.h
29  *  \ingroup bgeconv
30  */
31
32 #ifndef __BL_ARMATUREOBJECT_H__
33 #define __BL_ARMATUREOBJECT_H__
34
35 #include "KX_GameObject.h"
36 #include "BL_ArmatureConstraint.h"
37 #include "BL_ArmatureChannel.h"
38
39 #include "SG_IObject.h"
40 #include <vector>
41 #include <algorithm>
42
43 struct bArmature;
44 struct Bone;
45 struct bConstraint;
46 class BL_ActionActuator;
47 class BL_ArmatureActuator;
48 class MT_Matrix4x4;
49 struct Object;
50 class KX_BlenderSceneConverter;
51
52 class BL_ArmatureObject : public KX_GameObject  
53 {
54         Py_Header
55 public:
56
57         double GetLastFrame ();
58         short GetActivePriority();
59         virtual void ProcessReplica();
60         virtual void ReParentLogic();
61         virtual void Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map);
62         virtual bool UnlinkObject(SCA_IObject* clientobj);
63
64         class BL_ActionActuator * GetActiveAction();
65         
66         BL_ArmatureObject(
67                 void* sgReplicationInfo,
68                 SG_Callbacks callbacks,
69                 Object *armature,
70                 Scene *scene,
71                 int vert_deform_type
72         );
73         virtual ~BL_ArmatureObject();
74
75         virtual CValue* GetReplica();
76         void GetMRDPose(struct bPose **pose);
77         void GetPose(struct bPose **pose);
78         void SetPose (struct bPose *pose);
79         struct bPose *GetOrigPose() {return m_pose;} // never edit this, only for accessing names
80
81         void ApplyPose();
82         void RestorePose();
83
84         bool SetActiveAction(class BL_ActionActuator *act, short priority, double curtime);
85         
86         struct bArmature *GetArmature() { return m_armature; }
87         const struct bArmature * GetArmature() const { return m_armature; }
88         const struct Scene * GetScene() const { return m_scene; }
89         
90         Object* GetArmatureObject() {return m_objArma;}
91
92         int GetVertDeformType() {return m_vert_deform_type;}
93
94         // for constraint python API
95         void LoadConstraints(KX_BlenderSceneConverter* converter);
96         size_t GetConstraintNumber() const { return m_constraintNumber; }
97         BL_ArmatureConstraint* GetConstraint(const char* posechannel, const char* constraint);
98         BL_ArmatureConstraint* GetConstraint(const char* posechannelconstraint);
99         BL_ArmatureConstraint* GetConstraint(int index);
100         // for pose channel python API
101         void LoadChannels();
102         size_t GetChannelNumber() const { return m_channelNumber; }
103         BL_ArmatureChannel* GetChannel(bPoseChannel* channel);
104         BL_ArmatureChannel* GetChannel(const char* channel);
105         BL_ArmatureChannel* GetChannel(int index);
106
107         /// Retrieve the pose matrix for the specified bone.
108         /// Returns true on success.
109         bool GetBoneMatrix(Bone* bone, MT_Matrix4x4& matrix);
110         
111         /// Returns the bone length.  The end of the bone is in the local y direction.
112         float GetBoneLength(Bone* bone) const;
113
114         virtual int GetGameObjectType() { return OBJ_ARMATURE; }
115
116 #ifdef WITH_PYTHON
117
118         // PYTHON
119         static PyObject* pyattr_get_constraints(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
120         static PyObject* pyattr_get_channels(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
121         KX_PYMETHOD_DOC_NOARGS(BL_ArmatureObject, update);
122
123 #endif // WITH_PYTHON
124
125 protected:
126         /* list element: BL_ArmatureConstraint. Use SG_DListHead to have automatic list replication */
127         SG_DListHead<BL_ArmatureConstraint>      m_controlledConstraints;
128         /* list element: BL_ArmatureChannel. Use SG_DList to avoid list replication */
129         SG_DList                        m_poseChannels;
130         Object                          *m_objArma;
131         struct bArmature        *m_armature;
132         struct bPose            *m_pose;
133         struct bPose            *m_armpose;
134         struct bPose            *m_framePose;
135         struct Scene            *m_scene; // need for BKE_pose_where_is 
136         double  m_lastframe;
137         double  m_timestep;             // delta since last pose evaluation.
138         class BL_ActionActuator *m_activeAct;
139         short   m_activePriority;
140         int             m_vert_deform_type;
141         size_t  m_constraintNumber;
142         size_t  m_channelNumber;
143         // store the original armature object matrix
144         float m_obmat[4][4];
145
146         double                  m_lastapplyframe;
147 };
148
149 /* Pose function specific to the game engine */
150 void game_blend_poses(struct bPose *dst, struct bPose *src, float srcweight/*, short mode*/); /* was blend_poses */
151 //void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
152 void game_copy_pose(struct bPose **dst, struct bPose *src, int copy_con);
153 void game_free_pose(struct bPose *pose);
154
155
156 #endif
157