ee298d70bafe4bc45fa171520d2f559278182357
[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 #include "BLI_blenlib.h"
53 #include "BLI_arithb.h"
54
55 #define __NLA_DEFNORMALS
56 //#undef __NLA_DEFNORMALS
57
58 BL_SkinDeformer::~BL_SkinDeformer()
59 {
60 };
61
62 /* XXX note, this __NLA_OLDDEFORM define seems to be obsolete */
63
64 bool BL_SkinDeformer::Apply(RAS_IPolyMaterial *mat)
65 {
66         size_t                  i, j, index;
67         vecVertexArray  array;
68 #ifdef __NLA_OLDDEFORM
69         vecMVertArray   mvarray;
70 #else
71         vecIndexArrays  mvarray;
72 #endif
73         vecMDVertArray  dvarray;
74         vecIndexArrays  diarray;
75
76         RAS_TexVert *tv;
77 #ifdef __NLA_OLDDEFORM
78         MVert   *mvert;
79         MDeformVert     *dvert;
80 #endif
81         MT_Point3 pt;
82 //      float co[3];
83
84         if (!m_armobj)
85                 return false;
86
87         Update();
88
89         array = m_pMeshObject->GetVertexCache(mat);
90 #ifdef __NLA_OLDDEFORM
91         dvarray = m_pMeshObject->GetDVertCache(mat);
92 #endif
93         mvarray = m_pMeshObject->GetMVertCache(mat);
94         diarray = m_pMeshObject->GetDIndexCache(mat);
95         
96
97         // For each array
98         for (i=0; i<array.size(); i++){
99                 //      For each vertex
100                 for (j=0; j<array[i]->size(); j++){
101
102                         tv = &((*array[i])[j]);
103                         
104                         index = ((*diarray[i])[j]);
105 #ifdef __NLA_OLDDEFORM
106                         pt = tv->xyz();
107                         mvert = ((*mvarray[i])[index]);
108                         dvert = ((*dvarray[i])[index]);
109 #endif
110                         
111                         //      Copy the untransformed data from the original mvert
112 #ifdef __NLA_OLDDEFORM
113                         co[0]=mvert->co[0];
114                         co[1]=mvert->co[1];
115                         co[2]=mvert->co[2];
116
117                         //      Do the deformation
118 /* XXX note, doesnt exist anymore */
119 //                      GB_calc_armature_deform(co, dvert);
120                         tv->SetXYZ(co);
121 #else
122                         //      Set the data
123                         tv->SetXYZ(m_transverts[((*mvarray[i])[index])]);
124 #ifdef __NLA_DEFNORMALS
125
126                         tv->SetNormal(m_transnors[((*mvarray[i])[index])]);
127 #endif
128 #endif
129                 }
130         }
131         
132         return true;
133 }
134
135 RAS_Deformer *BL_SkinDeformer::GetReplica()
136 {
137         BL_SkinDeformer *result;
138
139         result = new BL_SkinDeformer(*this);
140         result->ProcessReplica();
141         return result;
142 }
143
144 void BL_SkinDeformer::ProcessReplica()
145 {
146 }
147
148 void BL_SkinDeformer::Update(void)
149 {
150
151         /* See if the armature has been updated for this frame */
152         if (m_lastUpdate!=m_armobj->GetLastFrame()){    
153                 
154                 /* Do all of the posing necessary */
155                 m_armobj->ApplyPose();
156                 
157                 /* XXX note: where_is_pose() (from BKE_armature.h) calculates all matrices needed to start deforming */
158                 /* but it requires the blender object pointer... */
159 //              void where_is_pose (Object *ob);
160                 
161                 /* store verts locally */
162                 for (int v =0; v<m_bmesh->totvert; v++){
163                         float co[3];
164                         /* XXX note, dunno about this line */
165                         m_transverts[v]=MT_Point3(m_bmesh->mvert[v].co);
166                 }
167                 
168                 /* XXX note: now use this call instead */
169 //              void armature_deform_verts(Object *armOb, Object *target, float (*vertexCos)[3], int numVerts, int deformflag) 
170                 //              - armOb = armature object
171                 //              - target = Mesh
172                 //              - vertexCos[3] = array of numVerts float vectors (3 floats)
173                 //              - set deformflag to ARM_DEF_VGROUP
174                 //              example (after having filled the m_transverts array):
175                 //              armature_deform_verts(m_armobj, m_meshobj, m_transverts, m_bmesh->totvert, ARM_DEF_VGROUP);
176                 
177                 VerifyStorage();
178                         
179                 RecalcNormals();
180                 
181
182                 /* Update the current frame */
183                 m_lastUpdate=m_armobj->GetLastFrame();
184         }
185 }
186
187 /* XXX note: I propose to drop this function */
188
189 void BL_SkinDeformer::SetArmature(BL_ArmatureObject *armobj)
190 {
191 //      m_armobj = armobj;
192
193 //      for (bDeformGroup *dg=(bDeformGroup*)m_defbase->first; dg; dg=(bDeformGroup*)dg->next) {
194
195 /*              dg->data no longer exists needs update
196                         dg->data = (void*)get_named_bone(m_armobj->GetArmature(), dg->name); */
197 //      }
198                 
199 //              GB_validate_defgroups(m_bmesh, m_defbase);
200 }