doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / gameengine / Ketsji / KX_PolyProxy.cpp
1 /*
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #ifdef WITH_PYTHON
30
31 #include "KX_PolyProxy.h"
32 #include "KX_MeshProxy.h"
33 #include "RAS_MeshObject.h"
34 #include "KX_BlenderMaterial.h"
35 #include "KX_PolygonMaterial.h"
36
37 #include "KX_PyMath.h"
38
39 PyTypeObject KX_PolyProxy::Type = {
40         PyVarObject_HEAD_INIT(NULL, 0)
41         "KX_PolyProxy",
42         sizeof(PyObjectPlus_Proxy),
43         0,
44         py_base_dealloc,
45         0,
46         0,
47         0,
48         0,
49         py_base_repr,
50         0,0,0,0,0,0,0,0,0,
51         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
52         0,0,0,0,0,0,0,
53         Methods,
54         0,
55         0,
56         &CValue::Type,
57         0,0,0,0,0,0,
58         py_base_new
59 };
60
61 PyMethodDef KX_PolyProxy::Methods[] = {
62         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterialIndex),
63         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getNumVertex),
64         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,isVisible),
65         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,isCollider),
66         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterialName),
67         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getTextureName),
68         KX_PYMETHODTABLE(KX_PolyProxy,getVertexIndex),
69         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMesh),
70         KX_PYMETHODTABLE_NOARGS(KX_PolyProxy,getMaterial),
71         {NULL,NULL} //Sentinel
72 };
73
74 PyAttributeDef KX_PolyProxy::Attributes[] = {
75         KX_PYATTRIBUTE_RO_FUNCTION("material_name", KX_PolyProxy, pyattr_get_material_name),
76         KX_PYATTRIBUTE_RO_FUNCTION("texture_name", KX_PolyProxy, pyattr_get_texture_name),
77         KX_PYATTRIBUTE_RO_FUNCTION("material", KX_PolyProxy, pyattr_get_material),
78         KX_PYATTRIBUTE_RO_FUNCTION("material_id", KX_PolyProxy, pyattr_get_material_id),
79         KX_PYATTRIBUTE_RO_FUNCTION("v1", KX_PolyProxy, pyattr_get_v1),
80         KX_PYATTRIBUTE_RO_FUNCTION("v2", KX_PolyProxy, pyattr_get_v2),
81         KX_PYATTRIBUTE_RO_FUNCTION("v3", KX_PolyProxy, pyattr_get_v3),
82         KX_PYATTRIBUTE_RO_FUNCTION("v4", KX_PolyProxy, pyattr_get_v4),
83         KX_PYATTRIBUTE_RO_FUNCTION("visible", KX_PolyProxy, pyattr_get_visible),
84         KX_PYATTRIBUTE_RO_FUNCTION("collide", KX_PolyProxy, pyattr_get_collide),
85         { NULL }        //Sentinel
86 };
87
88 KX_PolyProxy::KX_PolyProxy(const RAS_MeshObject*mesh, RAS_Polygon* polygon)
89 :       m_polygon(polygon),
90         m_mesh((RAS_MeshObject*)mesh)
91 {
92 }
93
94 KX_PolyProxy::~KX_PolyProxy()
95 {
96 }
97
98
99 // stuff for cvalue related things
100 CValue*         KX_PolyProxy::Calc(VALUE_OPERATOR, CValue *) { return NULL;}
101 CValue*         KX_PolyProxy::CalcFinal(VALUE_DATA_TYPE, VALUE_OPERATOR, CValue *) { return NULL;}      
102 STR_String      sPolyName="polygone";
103 const STR_String &      KX_PolyProxy::GetText() {return sPolyName;};
104 double          KX_PolyProxy::GetNumber() { return -1;}
105 STR_String&     KX_PolyProxy::GetName() { return sPolyName;}
106 void            KX_PolyProxy::SetName(const char *) { };
107 CValue*         KX_PolyProxy::GetReplica() { return NULL;}
108
109 // stuff for python integration
110
111 PyObject* KX_PolyProxy::pyattr_get_material_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
112 {
113         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
114         return self->PygetMaterialName();
115 }
116
117 PyObject* KX_PolyProxy::pyattr_get_texture_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
118 {
119         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
120         return self->PygetTextureName();
121 }
122
123 PyObject* KX_PolyProxy::pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
124 {
125         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
126         return self->PygetMaterial();
127 }
128
129 PyObject* KX_PolyProxy::pyattr_get_material_id(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
130 {
131         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
132         return self->PygetMaterialIndex();
133 }
134
135 PyObject* KX_PolyProxy::pyattr_get_v1(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
136 {
137         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
138
139         return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 0));
140 }
141
142 PyObject* KX_PolyProxy::pyattr_get_v2(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
143 {
144         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
145
146         return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 1));
147 }
148
149 PyObject* KX_PolyProxy::pyattr_get_v3(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
150 {
151         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
152
153         return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 2));
154 }
155
156 PyObject* KX_PolyProxy::pyattr_get_v4(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
157 {
158         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
159
160         if (3 < self->m_polygon->VertexCount())
161         {
162                 return PyLong_FromSsize_t(self->m_polygon->GetVertexOffsetAbs(self->m_mesh, 3));
163         }
164         return PyLong_FromSsize_t(0);
165 }
166
167 PyObject* KX_PolyProxy::pyattr_get_visible(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
168 {
169         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
170         return self->PyisVisible();
171 }
172
173 PyObject* KX_PolyProxy::pyattr_get_collide(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
174 {
175         KX_PolyProxy* self= static_cast<KX_PolyProxy*>(self_v);
176         return self->PyisCollider();
177 }
178
179 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialIndex,
180 "getMaterialIndex() : return the material index of the polygon in the mesh\n")
181 {
182         RAS_MaterialBucket* polyBucket = m_polygon->GetMaterial();
183         unsigned int matid;
184         for (matid=0; matid<(unsigned int)m_mesh->NumMaterials(); matid++)
185         {
186                 RAS_MeshMaterial* meshMat = m_mesh->GetMeshMaterial(matid);
187                 if (meshMat->m_bucket == polyBucket)
188                         // found it
189                         break;
190         }
191         return PyLong_FromSsize_t(matid);
192 }
193
194 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getNumVertex,
195 "getNumVertex() : returns the number of vertex of the polygon, 3 or 4\n")
196 {
197         return PyLong_FromSsize_t(m_polygon->VertexCount());
198 }
199
200 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isVisible,
201 "isVisible() : returns whether the polygon is visible or not\n")
202 {
203         return PyLong_FromSsize_t(m_polygon->IsVisible());
204 }
205
206 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isCollider,
207 "isCollider() : returns whether the polygon is receives collision or not\n")
208 {
209         return PyLong_FromSsize_t(m_polygon->IsCollider());
210 }
211
212 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialName,
213 "getMaterialName() : returns the polygon material name, \"NoMaterial\" if no material\n")
214 {
215         return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
216 }
217
218 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getTextureName,
219 "getTexturelName() : returns the polygon texture name, \"NULL\" if no texture\n")
220 {
221         return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
222 }
223
224 KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex,
225 "getVertexIndex(vertex) : returns the mesh vertex index of a polygon vertex\n"
226 "vertex: index of the vertex in the polygon: 0->3\n"
227 "return value can be used to retrieve the vertex details through mesh proxy\n"
228 "Note: getVertexIndex(3) on a triangle polygon returns 0\n")
229 {
230         int index;
231         if (!PyArg_ParseTuple(args,"i:getVertexIndex",&index))
232         {
233                 return NULL;
234         }
235         if (index < 0 || index > 3)
236         {
237                 PyErr_SetString(PyExc_AttributeError, "poly.getVertexIndex(int): KX_PolyProxy, expected an index between 0-3");
238                 return NULL;
239         }
240         if (index < m_polygon->VertexCount())
241         {
242                 return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, index));
243         }
244         return PyLong_FromSsize_t(0);
245 }
246
247 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMesh,
248 "getMesh() : returns a mesh proxy\n")
249 {
250         KX_MeshProxy* meshproxy = new KX_MeshProxy((RAS_MeshObject*)m_mesh);
251         return meshproxy->NewProxy(true);
252 }
253
254 KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterial,
255 "getMaterial() : returns a material\n")
256 {
257         RAS_IPolyMaterial *polymat = m_polygon->GetMaterial()->GetPolyMaterial();
258         if(polymat->GetFlag() & RAS_BLENDERMAT)
259         {
260                 KX_BlenderMaterial* mat = static_cast<KX_BlenderMaterial*>(polymat);
261                 return mat->GetProxy();
262         }
263         else
264         {
265                 KX_PolygonMaterial* mat = static_cast<KX_PolygonMaterial*>(polymat);
266                 return mat->GetProxy();
267         }
268 }
269
270 #endif // WITH_PYTHON