Initial revision
[blender.git] / source / gameengine / Converter / BL_SkinMeshObject.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  * Deformer that supports armature skinning
32  */
33
34 #ifdef WIN32
35 #pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
36 #endif //WIN32
37 #include "RAS_IPolygonMaterial.h"
38 #include "BL_SkinMeshObject.h"
39 #include "BL_DeformableGameObject.h"
40 #include "DNA_mesh_types.h"
41 #include "KX_GameObject.h"
42 #include "RAS_BucketManager.h"
43
44 void BL_SkinMeshObject::AddPolygon(RAS_Polygon* poly)
45 {
46         /* We're overriding this so that we can eventually associate faces with verts somehow */
47
48         //      For vertIndex in poly:
49         //              find the appropriate normal
50
51         RAS_MeshObject::AddPolygon(poly);
52 }
53
54 #ifdef __NLA_OLDDEFORM
55 int BL_SkinMeshObject::FindOrAddDeform(int vtxarray, struct MVert *mv, struct MDeformVert *dv, RAS_IPolyMaterial* mat)
56 #else
57 int BL_SkinMeshObject::FindOrAddDeform(int vtxarray, int mv, struct MDeformVert *dv, RAS_IPolyMaterial* mat)
58 #endif
59 {
60         BL_SkinArrayOptimizer* ao = (BL_SkinArrayOptimizer*)GetArrayOptimizer(mat);//*(m_matVertexArrays[*mat]);
61         int numvert = ao->m_MvertArrayCache1[vtxarray]->size();
62         
63         /* Check to see if this has already been pushed */
64         for (int i=0; i<ao->m_MvertArrayCache1[vtxarray]->size(); i++){
65                 if (mv == (*ao->m_MvertArrayCache1[vtxarray])[i])
66                         return i;
67         }
68
69         ao->m_MvertArrayCache1[vtxarray]->push_back(mv);
70         ao->m_DvertArrayCache1[vtxarray]->push_back(dv);
71         
72         return numvert;
73 };
74
75 int     BL_SkinMeshObject::FindVertexArray(int numverts,RAS_IPolyMaterial* polymat)
76 {
77         int array=-1;
78         
79         BL_SkinArrayOptimizer* ao = (BL_SkinArrayOptimizer*)GetArrayOptimizer(polymat);
80
81
82         for (int i=0;i<ao->m_VertexArrayCache1.size();i++)
83         {
84                 if ( (ao->m_TriangleArrayCount[i] + (numverts-2)) < BUCKET_MAX_TRIANGLES) 
85                 {
86                          if((ao->m_VertexArrayCache1[i]->size()+numverts < BUCKET_MAX_INDICES))
87                                 {
88                                         array = i;
89                                         ao->m_TriangleArrayCount[array]+=numverts-2;
90                                         break;
91                                 }
92                 }
93         }
94         
95
96         if (array == -1)
97         {
98                 array = ao->m_VertexArrayCache1.size();
99                 
100                 vector<RAS_TexVert>* va = new vector<RAS_TexVert>;
101                 ao->m_VertexArrayCache1.push_back(va);
102                 
103                 KX_IndexArray *ia = new KX_IndexArray();
104                 ao->m_IndexArrayCache1.push_back(ia);
105
106 #ifdef __NLA_OLDDEFORM
107                 BL_MVertArray *bva = new BL_MVertArray();
108 #else
109                 KX_IndexArray *bva = new KX_IndexArray();
110 #endif
111                 ao->m_MvertArrayCache1.push_back(bva);
112
113                 BL_DeformVertArray *dva = new BL_DeformVertArray();
114                 ao->m_DvertArrayCache1.push_back(dva);
115
116                 KX_IndexArray *da = new KX_IndexArray();
117                 ao->m_DIndexArrayCache1.push_back(da);
118
119                 ao->m_TriangleArrayCount.push_back(numverts-2);
120
121         }
122
123                 
124         return array;
125 }
126
127
128 //void BL_SkinMeshObject::Bucketize(double* oglmatrix,void* clientobj,bool useObjectColor,const MT_Vector4& rgbavec,RAS_BucketManager* bucketmgr)
129 void BL_SkinMeshObject::Bucketize(double* oglmatrix,void* clientobj,bool useObjectColor,const MT_Vector4& rgbavec)
130 {
131
132         KX_MeshSlot ms;
133         ms.m_clientObj = clientobj;
134         ms.m_mesh = this;
135         ms.m_OpenGLMatrix = oglmatrix;
136         ms.m_bObjectColor = useObjectColor;
137         ms.m_RGBAcolor = rgbavec;
138         ms.m_pDeformer = ((BL_DeformableGameObject*)clientobj)->m_pDeformer;
139         
140         for (BucketMaterialSet::iterator it = m_materials.begin();it!=m_materials.end();it++)
141         {
142
143                 RAS_MaterialBucket* materialbucket = (*it);
144
145                 KX_ArrayOptimizer* oa = GetArrayOptimizer(materialbucket->GetPolyMaterial());
146                 materialbucket->SetMeshSlot(ms);
147         }
148
149 }
150
151
152