resolved conflict state with HEAD r14096
[blender.git] / source / gameengine / Converter / BL_SkinDeformer.cpp
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifdef WIN32
34 #pragma warning (disable : 4786)
35 #endif //WIN32
36
37 #include "BL_SkinDeformer.h"
38 #include "GEN_Map.h"
39 #include "STR_HashedString.h"
40 #include "RAS_IPolygonMaterial.h"
41 #include "BL_SkinMeshObject.h"
42
43 //#include "BL_ArmatureController.h"
44 #include "DNA_armature_types.h"
45 #include "DNA_action_types.h"
46 #include "DNA_mesh_types.h"
47 #include "DNA_meshdata_types.h"
48 #include "BKE_armature.h"
49 #include "BKE_action.h"
50 #include "MT_Point3.h"
51
52 extern "C"{
53         #include "BKE_lattice.h"
54 }
55  #include "BKE_utildefines.h"
56
57 #include "BLI_blenlib.h"
58 #include "BLI_arithb.h"
59
60 #define __NLA_DEFNORMALS
61 //#undef __NLA_DEFNORMALS
62
63 BL_SkinDeformer::~BL_SkinDeformer()
64 {
65         if(m_releaseobject && m_armobj)
66                 m_armobj->Release();
67 };
68
69 /* XXX note, this __NLA_OLDDEFORM define seems to be obsolete */
70
71 bool BL_SkinDeformer::Apply(RAS_IPolyMaterial *mat)
72 {
73         size_t                  i, j, index;
74         vecVertexArray  array;
75 #ifdef __NLA_OLDDEFORM
76         vecMVertArray   mvarray;
77 #else
78         vecIndexArrays  mvarray;
79 #endif
80         vecMDVertArray  dvarray;
81         vecIndexArrays  diarray;
82
83         RAS_TexVert *tv;
84 #ifdef __NLA_OLDDEFORM
85         MVert   *mvert;
86         MDeformVert     *dvert;
87 #endif
88         MT_Point3 pt;
89 //      float co[3];
90
91         if (!m_armobj)
92                 return false;
93
94         Update();
95
96         array = m_pMeshObject->GetVertexCache(mat);
97 #ifdef __NLA_OLDDEFORM
98         dvarray = m_pMeshObject->GetDVertCache(mat);
99 #endif
100         mvarray = m_pMeshObject->GetMVertCache(mat);
101         diarray = m_pMeshObject->GetDIndexCache(mat);
102         
103
104         // For each array
105         for (i=0; i<array.size(); i++){
106                 //      For each vertex
107                 for (j=0; j<array[i]->size(); j++){
108
109                         tv = &((*array[i])[j]);
110                         
111                         index = ((*diarray[i])[j]);
112 #ifdef __NLA_OLDDEFORM
113                         pt = tv->xyz();
114                         mvert = ((*mvarray[i])[index]);
115                         dvert = ((*dvarray[i])[index]);
116 #endif
117                         
118                         //      Copy the untransformed data from the original mvert
119 #ifdef __NLA_OLDDEFORM
120                         co[0]=mvert->co[0];
121                         co[1]=mvert->co[1];
122                         co[2]=mvert->co[2];
123
124                         //      Do the deformation
125 /* XXX note, doesnt exist anymore */
126 //                      GB_calc_armature_deform(co, dvert);
127                         tv->SetXYZ(co);
128 #else
129                         //      Set the data
130                         tv->SetXYZ(m_transverts[((*mvarray[i])[index])]);
131 #ifdef __NLA_DEFNORMALS
132
133                         tv->SetNormal(m_transnors[((*mvarray[i])[index])]);
134 #endif
135 #endif
136                 }
137         }
138         
139         return true;
140 }
141
142 RAS_Deformer *BL_SkinDeformer::GetReplica()
143 {
144         BL_SkinDeformer *result;
145
146         result = new BL_SkinDeformer(*this);
147         result->ProcessReplica();
148         return result;
149 }
150
151 void BL_SkinDeformer::ProcessReplica()
152 {
153 }
154
155 //void where_is_pose (Object *ob);
156 //void armature_deform_verts(Object *armOb, Object *target, float (*vertexCos)[3], int numVerts, int deformflag); 
157 void BL_SkinDeformer::Update(void)
158 {
159         /* See if the armature has been updated for this frame */
160         if (m_lastUpdate!=m_armobj->GetLastFrame()){    
161                 
162                 /* Do all of the posing necessary */
163                 m_armobj->ApplyPose();
164                 
165                 /* XXX note: where_is_pose() (from BKE_armature.h) calculates all matrices needed to start deforming */
166                 /* but it requires the blender object pointer... */
167
168                 Object* par_arma = m_armobj->GetArmatureObject();
169                 where_is_pose( par_arma ); 
170
171                 /* store verts locally */
172                 VerifyStorage();
173         
174                 /* duplicate */
175                 for (int v =0; v<m_bmesh->totvert; v++)
176                         VECCOPY(m_transverts[v], m_bmesh->mvert[v].co);
177
178                 armature_deform_verts( par_arma, m_objMesh, NULL, m_transverts, NULL, m_bmesh->totvert, ARM_DEF_VGROUP, NULL, NULL );
179                 RecalcNormals();
180
181                 /* Update the current frame */
182                 m_lastUpdate=m_armobj->GetLastFrame();
183         }
184 }
185
186 /* XXX note: I propose to drop this function */
187 void BL_SkinDeformer::SetArmature(BL_ArmatureObject *armobj)
188 {
189         // only used to set the object now
190         m_armobj = armobj;
191 }