py api cleanup, replace use...
[blender.git] / source / gameengine / Ketsji / KX_PolyProxy.cpp
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 gameengine/Ketsji/KX_PolyProxy.cpp
29  *  \ingroup ketsji
30  */
31
32
33 #ifdef WITH_PYTHON
34
35 #include "KX_PolyProxy.h"
36 #include "KX_MeshProxy.h"
37 #include "RAS_MeshObject.h"
38 #include "KX_BlenderMaterial.h"
39 #include "KX_PolygonMaterial.h"
40
41 #include "KX_PyMath.h"
42
43 PyTypeObject KX_PolyProxy::Type = {
44         PyVarObject_HEAD_INIT(NULL, 0)
45         "KX_PolyProxy",
46         sizeof(PyObjectPlus_Proxy),
47         0,
48         py_base_dealloc,
49         0,
50         0,
51         0,
52         0,
53         py_base_repr,
54         0,0,0,0,0,0,0,0,0,
55         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
56         0,0,0,0,0,0,0,
57         Methods,
58         0,
59         0,
60         &CValue::Type,
61         0,0,0,0,0,0,
62         py_base_new
63 };
64
65 PyMethodDef KX_PolyProxy::Methods[] = {
66         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterialIndex),
67         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getNumVertex),
68         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,isVisible),
69         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,isCollider),
70         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterialName),
71         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getTextureName),
72         KX_PYMETHODTABLE(KX_PolyProxy,getVertexIndex),
73         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMesh),
74         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterial),
75         {NULL,NULL} //Sentinel
76 };
77
78 PyAttributeDef KX_PolyProxy::Attributes[] = {
79         KX_PYATTRIBUTE_RO_FUNCTION("material_name", KX_PolyProxy, pyattr_get_material_name),
80         KX_PYATTRIBUTE_RO_FUNCTION("texture_name", KX_PolyProxy, pyattr_get_texture_name),
81         KX_PYATTRIBUTE_RO_FUNCTION("material", KX_PolyProxy, pyattr_get_material),
82         KX_PYATTRIBUTE_RO_FUNCTION("material_id", KX_PolyProxy, pyattr_get_material_id),
83         KX_PYATTRIBUTE_RO_FUNCTION("v1", KX_PolyProxy, pyattr_get_v1),
84         KX_PYATTRIBUTE_RO_FUNCTION("v2", KX_PolyProxy, pyattr_get_v2),
85         KX_PYATTRIBUTE_RO_FUNCTION("v3", KX_PolyProxy, pyattr_get_v3),
86         KX_PYATTRIBUTE_RO_FUNCTION("v4", KX_PolyProxy, pyattr_get_v4),
87         KX_PYATTRIBUTE_RO_FUNCTION("visible", KX_PolyProxy, pyattr_get_visible),
88         KX_PYATTRIBUTE_RO_FUNCTION("collide", KX_PolyProxy, pyattr_get_collide),
89         { NULL }        //Sentinel
90 };
91
92 KX_PolyProxy::KX_PolyProxy(const RAS_MeshObject*mesh, RAS_Polygon* polygon)
93 :       m_polygon(polygon),
94         m_mesh((RAS_MeshObject*)mesh)
95 {
96 }
97
98 KX_PolyProxy::~KX_PolyProxy()
99 {
100 }
101
102
103 // stuff for cvalue related things
104 CValue*         KX_PolyProxy::Calc(VALUE_OPERATOR, CValue *) { return NULL;}
105 CValue*         KX_PolyProxy::CalcFinal(VALUE_DATA_TYPE, VALUE_OPERATOR, CValue *) { return NULL;}
106 STR_String      sPolyName="polygone";
107 const STR_String &      KX_PolyProxy::GetText() {return sPolyName;};
108 double          KX_PolyProxy::GetNumber() { return -1;}
109 STR_String&     KX_PolyProxy::GetName() { return sPolyName;}
110 void            KX_PolyProxy::SetName(const char *) { };
111 CValue*         KX_PolyProxy::GetReplica() { return NULL;}
112
113 // stuff for python integration
114
115 PyObject *KX_PolyProxy::pyattr_get_material_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
116 {
117         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
118         return self->PygetMaterialName();
119 }
120
121 PyObject *KX_PolyProxy::pyattr_get_texture_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
122 {
123         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
124         return self->PygetTextureName();
125 }
126
127 PyObject *KX_PolyProxy::pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
128 {
129         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
130         return self->PygetMaterial();
131 }
132
133 PyObject *KX_PolyProxy::pyattr_get_material_id(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
134 {
135         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
136         return self->PygetMaterialIndex();
137 }
138
139 PyObject *KX_PolyProxy::pyattr_get_v1(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
140 {
141         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
142
143         return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 0));
144 }
145
146 PyObject *KX_PolyProxy::pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
147 {
148         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
149
150         return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 1));
151 }
152
153 PyObject *KX_PolyProxy::pyattr_get_v3(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
154 {
155         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
156
157         return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 2));
158 }
159
160 PyObject *KX_PolyProxy::pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
161 {
162         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
163
164         if (3 < self->m_polygon->VertexCount())
165         {
166                 return PyLong_FromLong(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 3));
167         }
168         return PyLong_FromLong(0);
169 }
170
171 PyObject *KX_PolyProxy::pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
172 {
173         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
174         return self->PyisVisible();
175 }
176
177 PyObject *KX_PolyProxy::pyattr_get_collide(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
178 {
179         KX_PolyProxy* self = static_cast<KX_PolyProxy*>(self_v);
180         return self->PyisCollider();
181 }
182
183 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialIndex,
184 "getMaterialIndex() : return the material index of the polygon in the mesh\n")
185 {
186         RAS_MaterialBucket* polyBucket = m_polygon->GetMaterial();
187         unsigned int matid;
188         for (matid=0; matid<(unsigned int)m_mesh->NumMaterials(); matid++)
189         {
190                 RAS_MeshMaterial* meshMat = m_mesh->GetMeshMaterial(matid);
191                 if (meshMat->m_bucket == polyBucket)
192                         // found it
193                         break;
194         }
195         return PyLong_FromLong(matid);
196 }
197
198 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getNumVertex,
199 "getNumVertex() : returns the number of vertex of the polygon, 3 or 4\n")
200 {
201         return PyLong_FromLong(m_polygon->VertexCount());
202 }
203
204 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isVisible,
205 "isVisible() : returns whether the polygon is visible or not\n")
206 {
207         return PyLong_FromLong(m_polygon->IsVisible());
208 }
209
210 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isCollider,
211 "isCollider() : returns whether the polygon is receives collision or not\n")
212 {
213         return PyLong_FromLong(m_polygon->IsCollider());
214 }
215
216 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialName,
217 "getMaterialName() : returns the polygon material name, \"NoMaterial\" if no material\n")
218 {
219         return PyUnicode_From_STR_String(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
220 }
221
222 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getTextureName,
223 "getTexturelName() : returns the polygon texture name, \"NULL\" if no texture\n")
224 {
225         return PyUnicode_From_STR_String(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
226 }
227
228 KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex,
229 "getVertexIndex(vertex) : returns the mesh vertex index of a polygon vertex\n"
230 "vertex: index of the vertex in the polygon: 0->3\n"
231 "return value can be used to retrieve the vertex details through mesh proxy\n"
232 "Note: getVertexIndex(3) on a triangle polygon returns 0\n")
233 {
234         int index;
235         if (!PyArg_ParseTuple(args,"i:getVertexIndex",&index))
236         {
237                 return NULL;
238         }
239         if (index < 0 || index > 3)
240         {
241                 PyErr_SetString(PyExc_AttributeError, "poly.getVertexIndex(int): KX_PolyProxy, expected an index between 0-3");
242                 return NULL;
243         }
244         if (index < m_polygon->VertexCount())
245         {
246                 return PyLong_FromLong(m_polygon->GetVertexOffsetAbs(m_mesh, index));
247         }
248         return PyLong_FromLong(0);
249 }
250
251 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMesh,
252 "getMesh() : returns a mesh proxy\n")
253 {
254         KX_MeshProxy* meshproxy = new KX_MeshProxy((RAS_MeshObject*)m_mesh);
255         return meshproxy->NewProxy(true);
256 }
257
258 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterial,
259 "getMaterial() : returns a material\n")
260 {
261         RAS_IPolyMaterial *polymat = m_polygon->GetMaterial()->GetPolyMaterial();
262         if (polymat->GetFlag() & RAS_BLENDERMAT)
263         {
264                 KX_BlenderMaterial* mat = static_cast<KX_BlenderMaterial*>(polymat);
265                 return mat->GetProxy();
266         }
267         else
268         {
269                 KX_PolygonMaterial* mat = static_cast<KX_PolygonMaterial*>(polymat);
270                 return mat->GetProxy();
271         }
272 }
273
274 #endif // WITH_PYTHON