3 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20 * All rights reserved.
22 * The Original Code is: all of this file.
24 * Contributor(s): none yet.
26 * ***** END GPL LICENSE BLOCK *****
32 #include "KX_PolygonMaterial.h"
35 #include "BKE_global.h"
36 #include "BKE_image.h"
38 #include "DNA_material_types.h"
39 #include "DNA_texture_types.h"
40 #include "DNA_image_types.h"
41 #include "DNA_meshdata_types.h"
43 #include "IMB_imbuf_types.h"
47 #include "MEM_guardedalloc.h"
49 #include "RAS_LightObject.h"
50 #include "RAS_MaterialBucket.h"
52 #include "KX_PyMath.h"
54 KX_PolygonMaterial::KX_PolygonMaterial()
66 void KX_PolygonMaterial::Initialize(
67 const STR_String &texname,
81 RAS_IPolyMaterial::Initialize(
99 KX_PolygonMaterial::~KX_PolygonMaterial()
103 Py_DECREF(m_pymaterial);
107 bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
112 PyObject *pyRasty = PyCObject_FromVoidPtr((void*)rasty, NULL); /* new reference */
113 PyObject *pyCachingInfo = PyCObject_FromVoidPtr((void*) &cachingInfo, NULL); /* new reference */
114 PyObject *ret = PyObject_CallMethod(m_pymaterial, "activate", "(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy);
117 bool value = PyLong_AsSsize_t(ret);
125 PySys_SetObject( (char *)"last_traceback", NULL);
133 DefaultActivate(rasty, cachingInfo);
146 void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
148 if (GetCachingInfo() != cachingInfo)
153 cachingInfo = GetCachingInfo();
155 if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
157 Image *ima = (Image*)m_tface->tpage;
158 GPU_update_image_time(ima, rasty->GetTime());
159 GPU_set_tpage(m_tface);
164 if(m_drawingmode & RAS_IRasterizer::KX_TWOSIDE)
165 rasty->SetCullFace(false);
167 rasty->SetCullFace(true);
169 if ((m_drawingmode & RAS_IRasterizer::KX_LINES) ||
170 (rasty->GetDrawingMode() <= RAS_IRasterizer::KX_WIREFRAME))
171 rasty->SetLines(true);
173 rasty->SetLines(false);
174 rasty->SetSpecularity(m_specular[0],m_specular[1],m_specular[2],m_specularity);
175 rasty->SetShinyness(m_shininess);
176 rasty->SetDiffuse(m_diffuse[0], m_diffuse[1],m_diffuse[2], 1.0);
178 rasty->SetPolygonOffset(-m_material->zoffs, 0.0);
181 //rasty->SetSpecularity(m_specular[0],m_specular[1],m_specular[2],m_specularity);
182 //rasty->SetShinyness(m_shininess);
183 //rasty->SetDiffuse(m_diffuse[0], m_diffuse[1],m_diffuse[2], 1.0);
185 // rasty->SetPolygonOffset(-m_material->zoffs, 0.0);
188 void KX_PolygonMaterial::GetMaterialRGBAColor(unsigned char *rgba) const
191 *rgba++ = (unsigned char) (m_material->r*255.0);
192 *rgba++ = (unsigned char) (m_material->g*255.0);
193 *rgba++ = (unsigned char) (m_material->b*255.0);
194 *rgba++ = (unsigned char) (m_material->alpha*255.0);
196 RAS_IPolyMaterial::GetMaterialRGBAColor(rgba);
200 //----------------------------------------------------------------------------
204 PyMethodDef KX_PolygonMaterial::Methods[] = {
205 KX_PYMETHODTABLE(KX_PolygonMaterial, setCustomMaterial),
206 KX_PYMETHODTABLE(KX_PolygonMaterial, updateTexture),
207 KX_PYMETHODTABLE(KX_PolygonMaterial, setTexture),
208 KX_PYMETHODTABLE(KX_PolygonMaterial, activate),
209 // KX_PYMETHODTABLE(KX_PolygonMaterial, setPerPixelLights),
211 {NULL,NULL} //Sentinel
214 PyAttributeDef KX_PolygonMaterial::Attributes[] = {
215 KX_PYATTRIBUTE_RO_FUNCTION("texture", KX_PolygonMaterial, pyattr_get_texture),
216 KX_PYATTRIBUTE_RO_FUNCTION("material", KX_PolygonMaterial, pyattr_get_material), /* should probably be .name ? */
218 KX_PYATTRIBUTE_INT_RW("tile", INT_MIN, INT_MAX, true, KX_PolygonMaterial, m_tile),
219 KX_PYATTRIBUTE_INT_RW("tilexrep", INT_MIN, INT_MAX, true, KX_PolygonMaterial, m_tilexrep),
220 KX_PYATTRIBUTE_INT_RW("tileyrep", INT_MIN, INT_MAX, true, KX_PolygonMaterial, m_tileyrep),
221 KX_PYATTRIBUTE_INT_RW("drawingmode", INT_MIN, INT_MAX, true, KX_PolygonMaterial, m_drawingmode),
222 //KX_PYATTRIBUTE_INT_RW("lightlayer", INT_MIN, INT_MAX, true, KX_PolygonMaterial, m_lightlayer),
224 KX_PYATTRIBUTE_BOOL_RW("transparent", KX_PolygonMaterial, m_alpha),
225 KX_PYATTRIBUTE_BOOL_RW("zsort", KX_PolygonMaterial, m_zsort),
227 KX_PYATTRIBUTE_FLOAT_RW("shininess", 0.0f, 1000.0f, KX_PolygonMaterial, m_shininess),
228 KX_PYATTRIBUTE_FLOAT_RW("specularity", 0.0f, 1000.0f, KX_PolygonMaterial, m_specularity),
230 KX_PYATTRIBUTE_RW_FUNCTION("diffuse", KX_PolygonMaterial, pyattr_get_texture, pyattr_set_diffuse),
231 KX_PYATTRIBUTE_RW_FUNCTION("specular",KX_PolygonMaterial, pyattr_get_specular, pyattr_set_specular),
233 KX_PYATTRIBUTE_RO_FUNCTION("tface", KX_PolygonMaterial, pyattr_get_tface), /* How the heck is this even useful??? - Campbell */
234 KX_PYATTRIBUTE_RO_FUNCTION("gl_texture", KX_PolygonMaterial, pyattr_get_gl_texture), /* could be called 'bindcode' */
236 /* triangle used to be an attribute, removed for 2.49, nobody should be using it */
240 PyTypeObject KX_PolygonMaterial::Type = {
241 PyVarObject_HEAD_INIT(NULL, 0)
242 "KX_PolygonMaterial",
243 sizeof(PyObjectPlus_Proxy),
252 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
262 KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setCustomMaterial, "setCustomMaterial(material)")
265 if (PyArg_ParseTuple(args, "O:setCustomMaterial", &material))
268 Py_DECREF(m_pymaterial);
270 m_pymaterial = material;
271 Py_INCREF(m_pymaterial);
278 KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rasty)")
280 PyObject *pyrasty, *pytface;
281 if (PyArg_ParseTuple(args, "O!O!:updateTexture", &PyCObject_Type, &pytface, &PyCObject_Type, &pyrasty))
283 MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
284 RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCObject_AsVoidPtr(pyrasty);
285 Image *ima = (Image*)tface->tpage;
286 GPU_update_image_time(ima, rasty->GetTime());
294 KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
297 if (PyArg_ParseTuple(args, "O!:setTexture", &PyCObject_Type, &pytface))
299 MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
300 GPU_set_tpage(tface);
307 KX_PYMETHODDEF_DOC(KX_PolygonMaterial, activate, "activate(rasty, cachingInfo)")
309 PyObject *pyrasty, *pyCachingInfo;
310 if (PyArg_ParseTuple(args, "O!O!:activate", &PyCObject_Type, &pyrasty, &PyCObject_Type, &pyCachingInfo))
312 RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCObject_AsVoidPtr(pyrasty));
313 TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCObject_AsVoidPtr(pyCachingInfo));
314 if (rasty && cachingInfo)
316 DefaultActivate(rasty, *cachingInfo);
324 PyObject* KX_PolygonMaterial::pyattr_get_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
326 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
327 return PyUnicode_FromString(self->m_texturename.ReadPtr());
330 PyObject* KX_PolygonMaterial::pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
332 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
333 return PyUnicode_FromString(self->m_materialname.ReadPtr());
336 /* this does not seem useful */
337 PyObject* KX_PolygonMaterial::pyattr_get_tface(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
339 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
340 return PyCObject_FromVoidPtr(self->m_tface, NULL);
343 PyObject* KX_PolygonMaterial::pyattr_get_gl_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
345 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
347 if (self->m_tface && self->m_tface->tpage)
348 bindcode= self->m_tface->tpage->bindcode;
350 return PyLong_FromSsize_t(bindcode);
354 PyObject* KX_PolygonMaterial::pyattr_get_diffuse(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
356 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
357 return PyObjectFrom(self->m_diffuse);
360 int KX_PolygonMaterial::pyattr_set_diffuse(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
362 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
365 if (!PyVecTo(value, vec))
366 return PY_SET_ATTR_FAIL;
368 self->m_diffuse= vec;
369 return PY_SET_ATTR_SUCCESS;
372 PyObject* KX_PolygonMaterial::pyattr_get_specular(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
374 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
375 return PyObjectFrom(self->m_specular);
378 int KX_PolygonMaterial::pyattr_set_specular(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
380 KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
383 if (!PyVecTo(value, vec))
384 return PY_SET_ATTR_FAIL;
386 self->m_specular= vec;
387 return PY_SET_ATTR_SUCCESS;