forked from bartvdbraak/blender
Unified KX_BlenderPolyMaterial & GPC_PolygonMaterial into KX_PolygonMaterial.
Make game engine materials use Zoffs in Materials. Added Python material hooks.
This commit is contained in:
parent
5fcf39d2a5
commit
3b91ea4309
@ -35,7 +35,7 @@
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
KX_BlenderPolyMaterial::KX_BlenderPolyMaterial(const STR_String &texname,
|
||||
bool ba,
|
||||
const STR_String& matname,
|
||||
@ -65,7 +65,6 @@ KX_BlenderPolyMaterial::KX_BlenderPolyMaterial(const STR_String &texname,
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void KX_BlenderPolyMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
|
||||
{
|
||||
|
||||
@ -113,5 +112,6 @@ void KX_BlenderPolyMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cach
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
struct TFace;
|
||||
extern "C" int set_tpage(TFace* tface); /* Worst hack ever */
|
||||
|
||||
|
||||
#if 0
|
||||
class KX_BlenderPolyMaterial : public RAS_IPolyMaterial
|
||||
{
|
||||
/** Blender texture face structure. */
|
||||
@ -96,5 +96,7 @@ inline RAS_IPolyMaterial::TCachingInfo KX_BlenderPolyMaterial::GetCachingInfo(vo
|
||||
return GetTFace();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif // __KX_BLENDERPOLYMATERIAL
|
||||
|
||||
|
@ -57,6 +57,7 @@
|
||||
#include "KX_GameObject.h"
|
||||
|
||||
#include "KX_BlenderPolyMaterial.h"
|
||||
#include "KX_PolygonMaterial.h"
|
||||
#include "Value.h"
|
||||
|
||||
#include "KX_BlenderGL.h" // for text printing
|
||||
@ -258,7 +259,7 @@ void KX_BlenderRenderTools::RenderText(int mode,RAS_IPolyMaterial* polymat,float
|
||||
|
||||
STR_String mytext = ((CValue*)m_clientobject)->GetPropertyText("Text");
|
||||
|
||||
KX_BlenderPolyMaterial* blenderpoly = (KX_BlenderPolyMaterial*)polymat;
|
||||
KX_PolygonMaterial* blenderpoly = static_cast<KX_PolygonMaterial*>(polymat);
|
||||
struct TFace* tface = blenderpoly->GetTFace();
|
||||
|
||||
BL_RenderText( mode,mytext,mytext.Length(),tface,v1,v2,v3,v4);
|
||||
@ -435,11 +436,12 @@ RAS_IPolyMaterial* KX_BlenderRenderTools::CreateBlenderPolyMaterial(
|
||||
bool ba,const STR_String& matname,int tile,int tilexrep,int tileyrep,int mode,bool transparant,bool zsort, int lightlayer
|
||||
,bool bIsTriangle,void* clientobject,void* tface)
|
||||
{
|
||||
return new KX_BlenderPolyMaterial(
|
||||
assert(!"Deprecated");
|
||||
/* return new KX_BlenderPolyMaterial(
|
||||
|
||||
texname,
|
||||
ba,matname,tile,tilexrep,tileyrep,mode,transparant,zsort, lightlayer
|
||||
,bIsTriangle,clientobject,(struct TFace*)tface);
|
||||
,bIsTriangle,clientobject,(struct TFace*)tface);*/
|
||||
}
|
||||
|
||||
unsigned int KX_BlenderRenderTools::m_numgllights;
|
||||
|
@ -7,7 +7,6 @@ kx_blenderhook_env = library_env.Copy ()
|
||||
|
||||
source_files = ['KX_BlenderSystem.cpp',
|
||||
'KX_BlenderRenderTools.cpp',
|
||||
'KX_BlenderPolyMaterial.cpp',
|
||||
'KX_BlenderMouseDevice.cpp',
|
||||
'KX_BlenderKeyboardDevice.cpp',
|
||||
'KX_BlenderInputDevice.cpp',
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "KX_BlenderScalarInterpolator.h"
|
||||
|
||||
#include "RAS_IPolygonMaterial.h"
|
||||
#include "KX_PolygonMaterial.h"
|
||||
|
||||
// Expressions
|
||||
#include "ListValue.h"
|
||||
@ -235,7 +236,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
|
||||
|
||||
MFace* mface = static_cast<MFace*>(mesh->mface);
|
||||
TFace* tface = static_cast<TFace*>(mesh->tface);
|
||||
assert(mface);
|
||||
MT_assert(mface && "Mesh has no faces!");
|
||||
MCol* mmcol = mesh->mcol;
|
||||
|
||||
meshobj->m_xyz_index_to_vertex_index_mapping.resize(mesh->totvert);
|
||||
@ -383,7 +384,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
|
||||
bool istriangle = (mface->v4==0);
|
||||
bool zsort = ma?(ma->mode & MA_ZTRA) != 0:false;
|
||||
|
||||
RAS_IPolyMaterial* polymat = rendertools->CreateBlenderPolyMaterial(imastr, false, matnameptr,
|
||||
RAS_IPolyMaterial* polymat = new KX_PolygonMaterial(imastr, ma,
|
||||
tile, tilexrep, tileyrep,
|
||||
mode, transp, zsort, lightlayer, istriangle, blenderobj, tface);
|
||||
|
||||
@ -484,13 +485,13 @@ static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blender
|
||||
{
|
||||
PHY_MaterialProps *materialProps = new PHY_MaterialProps;
|
||||
|
||||
assert(materialProps);
|
||||
MT_assert(materialProps && "Create physics material properties failed");
|
||||
|
||||
Material* blendermat = give_current_material(blenderobject, 0);
|
||||
|
||||
if (blendermat)
|
||||
{
|
||||
assert(0.0f <= blendermat->reflect && blendermat->reflect <= 1.0f);
|
||||
MT_assert(0.0f <= blendermat->reflect && blendermat->reflect <= 1.0f);
|
||||
|
||||
materialProps->m_restitution = blendermat->reflect;
|
||||
materialProps->m_friction = blendermat->friction;
|
||||
@ -511,7 +512,7 @@ static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blendero
|
||||
{
|
||||
PHY_ShapeProps *shapeProps = new PHY_ShapeProps;
|
||||
|
||||
assert(shapeProps);
|
||||
MT_assert(shapeProps);
|
||||
|
||||
shapeProps->m_mass = blenderobject->mass;
|
||||
|
||||
@ -521,8 +522,8 @@ static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blendero
|
||||
// the sphere radius
|
||||
shapeProps->m_inertia = blenderobject->formfactor;
|
||||
|
||||
assert(0.0f <= blenderobject->damping && blenderobject->damping <= 1.0f);
|
||||
assert(0.0f <= blenderobject->rdamping && blenderobject->rdamping <= 1.0f);
|
||||
MT_assert(0.0f <= blenderobject->damping && blenderobject->damping <= 1.0f);
|
||||
MT_assert(0.0f <= blenderobject->rdamping && blenderobject->rdamping <= 1.0f);
|
||||
|
||||
shapeProps->m_lin_drag = 1.0 - blenderobject->damping;
|
||||
shapeProps->m_ang_drag = 1.0 - blenderobject->rdamping;
|
||||
|
@ -114,8 +114,9 @@ static void my_make_repbind(Image *ima)
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" int set_tpage(TFace *tface);
|
||||
|
||||
static int my_set_tpage(TFace *tface)
|
||||
int set_tpage(TFace *tface)
|
||||
{
|
||||
static TFace *lasttface= 0;
|
||||
Image *ima;
|
||||
@ -361,7 +362,7 @@ static int my_set_tpage(TFace *tface)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
GPC_PolygonMaterial::GPC_PolygonMaterial(const STR_String& texname, bool ba, const STR_String& matname,
|
||||
int tile, int tileXrep, int tileYrep, int mode, bool transparant, bool zsort,
|
||||
int lightlayer, bool bIsTriangle, void* clientobject, void* tpage) :
|
||||
@ -415,7 +416,7 @@ void GPC_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& caching
|
||||
rasty->SetDiffuse(m_diffuse[0], m_diffuse[1],m_diffuse[2], 1.0);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
void GPC_PolygonMaterial::SetMipMappingEnabled(bool enabled)
|
||||
{
|
||||
fDoMipMap = enabled ? 1 : 0;
|
||||
|
@ -35,6 +35,12 @@
|
||||
|
||||
#include "RAS_IPolygonMaterial.h"
|
||||
|
||||
namespace GPC_PolygonMaterial
|
||||
{
|
||||
void SetMipMappingEnabled(bool enabled = false);
|
||||
};
|
||||
|
||||
#if 0
|
||||
class GPC_PolygonMaterial : public RAS_IPolyMaterial
|
||||
{
|
||||
struct TFace* m_tface;
|
||||
@ -81,6 +87,6 @@ inline GPC_PolygonMaterial::TCachingInfo GPC_PolygonMaterial::GetCachingInfo(voi
|
||||
{
|
||||
return GetTFace();
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // __GPC_POLYGONMATERIAL_H
|
||||
|
||||
|
@ -34,6 +34,8 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning (disable : 4786)
|
||||
#include <windows.h>
|
||||
@ -59,6 +61,7 @@
|
||||
#include "KX_GameObject.h"
|
||||
|
||||
#include "GPC_PolygonMaterial.h"
|
||||
#include "KX_PolygonMaterial.h"
|
||||
#include "Value.h"
|
||||
|
||||
//#include "KX_BlenderGL.h" // for text printing
|
||||
@ -220,8 +223,15 @@ void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
|
||||
glPopMatrix();
|
||||
|
||||
// Restore OpenGL Settings
|
||||
fog ? ::glEnable(GL_FOG) : ::glDisable(GL_FOG);
|
||||
texture2D ? ::glEnable(GL_TEXTURE_2D) : ::glDisable(GL_TEXTURE_2D);
|
||||
if (fog)
|
||||
glEnable(GL_FOG);
|
||||
else
|
||||
glDisable(GL_FOG);
|
||||
|
||||
if (texture2D)
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
else
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -236,7 +246,7 @@ void GPC_RenderTools::RenderText(
|
||||
{
|
||||
STR_String mytext = ((CValue*)m_clientobject)->GetPropertyText("Text");
|
||||
|
||||
GPC_PolygonMaterial* blenderpoly = (GPC_PolygonMaterial*)polymat;
|
||||
KX_PolygonMaterial* blenderpoly = static_cast<KX_PolygonMaterial*>(polymat);
|
||||
struct TFace* tface = blenderpoly->GetTFace();
|
||||
|
||||
BL_RenderText(mode, mytext, mytext.Length(), tface, v1, v2, v3, v4);
|
||||
@ -324,8 +334,10 @@ RAS_IPolyMaterial* GPC_RenderTools::CreateBlenderPolyMaterial(
|
||||
bool ba,const STR_String& matname,int tile,int tilexrep,int tileyrep,int mode,bool transparant, bool zsort,
|
||||
int lightlayer,bool bIsTriangle,void* clientobject,void* tface)
|
||||
{
|
||||
return new GPC_PolygonMaterial(texname, ba,matname,tile,tilexrep,tileyrep,
|
||||
assert(!"Deprecated");
|
||||
/* return new GPC_PolygonMaterial(texname, ba,matname,tile,tilexrep,tileyrep,
|
||||
mode,transparant,zsort,lightlayer,bIsTriangle,clientobject,tface);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -39,6 +39,10 @@
|
||||
|
||||
#include "KX_VertexProxy.h"
|
||||
|
||||
#include "KX_PolygonMaterial.h"
|
||||
|
||||
#include "KX_PyMath.h"
|
||||
|
||||
PyTypeObject KX_MeshProxy::Type = {
|
||||
PyObject_HEAD_INIT(&PyType_Type)
|
||||
0,
|
||||
@ -79,6 +83,15 @@ PyMethodDef KX_MeshProxy::Methods[] = {
|
||||
PyObject*
|
||||
KX_MeshProxy::_getattr(const STR_String& attr)
|
||||
{
|
||||
if (attr == "materials")
|
||||
{
|
||||
PyObject *materials = PyList_New(0); /* new ref */
|
||||
RAS_MaterialBucket::Set::iterator mit = m_meshobj->GetFirstMaterial();
|
||||
for(; mit != m_meshobj->GetLastMaterial(); ++mit)
|
||||
PyList_Append(materials, static_cast<KX_PolygonMaterial*>((*mit)->GetPolyMaterial()));
|
||||
return materials;
|
||||
}
|
||||
|
||||
_getattr_up(SCA_IObject);
|
||||
}
|
||||
|
||||
|
332
source/gameengine/Ketsji/KX_PolygonMaterial.cpp
Normal file
332
source/gameengine/Ketsji/KX_PolygonMaterial.cpp
Normal file
@ -0,0 +1,332 @@
|
||||
/**
|
||||
* $Id$
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "KX_PolygonMaterial.h"
|
||||
|
||||
#include "BKE_mesh.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_image.h"
|
||||
|
||||
extern "C" {
|
||||
#include "BDR_drawmesh.h"
|
||||
}
|
||||
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_texture_types.h"
|
||||
#include "DNA_image_types.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
|
||||
#include "IMB_imbuf_types.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "RAS_LightObject.h"
|
||||
#include "RAS_MaterialBucket.h"
|
||||
|
||||
#include "KX_PyMath.h"
|
||||
|
||||
KX_PolygonMaterial::KX_PolygonMaterial(const STR_String &texname,
|
||||
Material *material,
|
||||
int tile,
|
||||
int tilexrep,
|
||||
int tileyrep,
|
||||
int mode,
|
||||
bool transparant,
|
||||
bool zsort,
|
||||
int lightlayer,
|
||||
bool bIsTriangle,
|
||||
void* clientobject,
|
||||
struct TFace* tface,
|
||||
PyTypeObject *T)
|
||||
: PyObjectPlus(T),
|
||||
RAS_IPolyMaterial(texname,
|
||||
material?STR_String(material->id.name):"",
|
||||
tile,
|
||||
tilexrep,
|
||||
tileyrep,
|
||||
mode,
|
||||
transparant,
|
||||
zsort,
|
||||
lightlayer,
|
||||
bIsTriangle,
|
||||
clientobject),
|
||||
m_tface(tface),
|
||||
m_material(material),
|
||||
m_pymaterial(0),
|
||||
m_pass(0)
|
||||
{
|
||||
}
|
||||
|
||||
KX_PolygonMaterial::~KX_PolygonMaterial()
|
||||
{
|
||||
if (m_pymaterial)
|
||||
{
|
||||
Py_DECREF(m_pymaterial);
|
||||
}
|
||||
}
|
||||
|
||||
bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
|
||||
{
|
||||
bool dopass = false;
|
||||
if (m_pymaterial)
|
||||
{
|
||||
PyObject *pyRasty = PyCObject_FromVoidPtr((void*)rasty, NULL); /* new reference */
|
||||
PyObject *pyCachingInfo = PyCObject_FromVoidPtr((void*) &cachingInfo, NULL); /* new reference */
|
||||
|
||||
PyObject *ret = PyObject_CallMethod(m_pymaterial, "activate", "(NNO)", pyRasty, pyCachingInfo, (PyObject*) this);
|
||||
if (ret)
|
||||
{
|
||||
bool value = PyInt_AsLong(ret);
|
||||
Py_DECREF(ret);
|
||||
dopass = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
PyErr_Print();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (m_pass++)
|
||||
{
|
||||
case 0:
|
||||
DefaultActivate(rasty, cachingInfo);
|
||||
dopass = true;
|
||||
break;
|
||||
default:
|
||||
m_pass = 0;
|
||||
dopass = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return dopass;
|
||||
}
|
||||
|
||||
void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
|
||||
{
|
||||
if (GetCachingInfo() != cachingInfo)
|
||||
{
|
||||
if (!cachingInfo)
|
||||
{
|
||||
set_tpage(NULL);
|
||||
}
|
||||
cachingInfo = GetCachingInfo();
|
||||
|
||||
if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
|
||||
{
|
||||
update_realtime_texture((struct TFace*) m_tface, rasty->GetTime());
|
||||
set_tpage(m_tface);
|
||||
rasty->EnableTextures(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
set_tpage(NULL);
|
||||
rasty->EnableTextures(false);
|
||||
}
|
||||
|
||||
if(m_drawingmode & RAS_IRasterizer::KX_TWOSIDE)
|
||||
{
|
||||
rasty->SetCullFace(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
rasty->SetCullFace(true);
|
||||
}
|
||||
|
||||
if (m_drawingmode & RAS_IRasterizer::KX_LINES) {
|
||||
rasty->SetLines(true);
|
||||
}
|
||||
else {
|
||||
rasty->SetLines(false);
|
||||
}
|
||||
}
|
||||
|
||||
rasty->SetSpecularity(m_specular[0],m_specular[1],m_specular[2],m_specularity);
|
||||
rasty->SetShinyness(m_shininess);
|
||||
rasty->SetDiffuse(m_diffuse[0], m_diffuse[1],m_diffuse[2], 1.0);
|
||||
if (m_material)
|
||||
rasty->SetPolygonOffset(-m_material->zoffs, 0.0);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//Python
|
||||
|
||||
|
||||
PyMethodDef KX_PolygonMaterial::Methods[] = {
|
||||
KX_PYMETHODTABLE(KX_PolygonMaterial, setCustomMaterial),
|
||||
KX_PYMETHODTABLE(KX_PolygonMaterial, updateTexture),
|
||||
KX_PYMETHODTABLE(KX_PolygonMaterial, setTexture),
|
||||
KX_PYMETHODTABLE(KX_PolygonMaterial, activate),
|
||||
// KX_PYMETHODTABLE(KX_PolygonMaterial, setPerPixelLights),
|
||||
|
||||
{NULL,NULL} //Sentinel
|
||||
};
|
||||
|
||||
|
||||
PyTypeObject KX_PolygonMaterial::Type = {
|
||||
PyObject_HEAD_INIT(&PyType_Type)
|
||||
0,
|
||||
"KX_PolygonMaterial",
|
||||
sizeof(KX_PolygonMaterial),
|
||||
0,
|
||||
PyDestructor,
|
||||
0,
|
||||
__getattr,
|
||||
__setattr,
|
||||
0, //&MyPyCompare,
|
||||
__repr,
|
||||
0 //&cvalue_as_number,
|
||||
};
|
||||
|
||||
PyParentObject KX_PolygonMaterial::Parents[] = {
|
||||
&PyObjectPlus::Type,
|
||||
&KX_PolygonMaterial::Type,
|
||||
NULL
|
||||
};
|
||||
|
||||
PyObject* KX_PolygonMaterial::_getattr(const STR_String& attr)
|
||||
{
|
||||
if (attr == "texture")
|
||||
return PyString_FromString(m_texturename.ReadPtr());
|
||||
if (attr == "material")
|
||||
return PyString_FromString(m_materialname.ReadPtr());
|
||||
|
||||
if (attr == "tface")
|
||||
return PyCObject_FromVoidPtr(m_tface, NULL);
|
||||
|
||||
if (attr == "gl_texture")
|
||||
{
|
||||
Image *ima = (Image*) m_tface->tpage;
|
||||
int bind = 0;
|
||||
if (ima)
|
||||
bind = ima->bindcode;
|
||||
|
||||
return PyInt_FromLong(bind);
|
||||
}
|
||||
|
||||
if (attr == "tile")
|
||||
return PyInt_FromLong(m_tile);
|
||||
if (attr == "tilexrep")
|
||||
return PyInt_FromLong(m_tilexrep);
|
||||
if (attr == "tileyrep")
|
||||
return PyInt_FromLong(m_tileyrep);
|
||||
|
||||
if (attr == "drawingmode")
|
||||
return PyInt_FromLong(m_drawingmode);
|
||||
if (attr == "transparent")
|
||||
return PyInt_FromLong(m_transparant);
|
||||
if (attr == "zsort")
|
||||
return PyInt_FromLong(m_zsort);
|
||||
if (attr == "lightlayer")
|
||||
return PyInt_FromLong(m_lightlayer);
|
||||
if (attr == "triangle")
|
||||
return PyInt_FromLong(m_bIsTriangle);
|
||||
|
||||
if (attr == "diffuse")
|
||||
return PyObjectFrom(m_diffuse);
|
||||
if (attr == "shininess")
|
||||
return PyFloat_FromDouble(m_shininess);
|
||||
if (attr == "specular")
|
||||
return PyObjectFrom(m_specular);
|
||||
if (attr == "specularity")
|
||||
return PyFloat_FromDouble(m_specularity);
|
||||
|
||||
_getattr_up(PyObjectPlus);
|
||||
}
|
||||
|
||||
int KX_PolygonMaterial::_setattr(const STR_String &attr, PyObject *pyvalue)
|
||||
{
|
||||
return PyObjectPlus::_setattr(attr, pyvalue);
|
||||
}
|
||||
|
||||
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setCustomMaterial, "setCustomMaterial(material)")
|
||||
{
|
||||
PyObject *material;
|
||||
if (PyArg_ParseTuple(args, "O", &material))
|
||||
{
|
||||
if (m_pymaterial)
|
||||
Py_DECREF(m_pymaterial);
|
||||
|
||||
m_pymaterial = material;
|
||||
Py_INCREF(m_pymaterial);
|
||||
Py_Return;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rasty)")
|
||||
{
|
||||
PyObject *pyrasty, *pytface;
|
||||
if (PyArg_ParseTuple(args, "O!O!", &PyCObject_Type, &pytface, &PyCObject_Type, &pyrasty))
|
||||
{
|
||||
TFace *tface = (TFace*) PyCObject_AsVoidPtr(pytface);
|
||||
RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCObject_AsVoidPtr(pyrasty);
|
||||
update_realtime_texture(tface, rasty->GetTime());
|
||||
Py_Return;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
|
||||
{
|
||||
PyObject *pytface;
|
||||
if (PyArg_ParseTuple(args, "O!", &PyCObject_Type, &pytface))
|
||||
{
|
||||
TFace *tface = (TFace*) PyCObject_AsVoidPtr(pytface);
|
||||
set_tpage(tface);
|
||||
Py_Return;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, activate, "activate(rasty, cachingInfo)")
|
||||
{
|
||||
PyObject *pyrasty, *pyCachingInfo;
|
||||
if (PyArg_ParseTuple(args, "O!O!", &PyCObject_Type, &pyrasty, &PyCObject_Type, &pyCachingInfo))
|
||||
{
|
||||
RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCObject_AsVoidPtr(pyrasty));
|
||||
TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCObject_AsVoidPtr(pyCachingInfo));
|
||||
if (rasty && cachingInfo)
|
||||
{
|
||||
DefaultActivate(rasty, *cachingInfo);
|
||||
Py_Return;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
120
source/gameengine/Ketsji/KX_PolygonMaterial.h
Normal file
120
source/gameengine/Ketsji/KX_PolygonMaterial.h
Normal file
@ -0,0 +1,120 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* The Original Code is: all of this file.
|
||||
*
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
#ifndef __KX_POLYGONMATERIAL_H__
|
||||
#define __KX_POLYGONMATERIAL_H__
|
||||
|
||||
#include "PyObjectPlus.h"
|
||||
|
||||
#include "RAS_MaterialBucket.h"
|
||||
#include "RAS_IRasterizer.h"
|
||||
|
||||
struct TFace;
|
||||
struct Material;
|
||||
struct MTex;
|
||||
|
||||
/**
|
||||
* Material class.
|
||||
*
|
||||
* This holds the shader, textures and python methods for setting the render state before
|
||||
* rendering.
|
||||
*/
|
||||
class KX_PolygonMaterial : public PyObjectPlus, public RAS_IPolyMaterial
|
||||
{
|
||||
Py_Header;
|
||||
private:
|
||||
/** Blender texture face structure. */
|
||||
TFace* m_tface;
|
||||
Material* m_material;
|
||||
|
||||
PyObject* m_pymaterial;
|
||||
|
||||
mutable int m_pass;
|
||||
public:
|
||||
|
||||
KX_PolygonMaterial(const STR_String &texname,
|
||||
Material* ma,
|
||||
int tile,
|
||||
int tilexrep,
|
||||
int tileyrep,
|
||||
int mode,
|
||||
bool transparant,
|
||||
bool zsort,
|
||||
int lightlayer,
|
||||
bool bIsTriangle,
|
||||
void* clientobject,
|
||||
struct TFace* tface,
|
||||
PyTypeObject *T = &Type);
|
||||
virtual ~KX_PolygonMaterial();
|
||||
|
||||
/**
|
||||
* Returns the caching information for this material,
|
||||
* This can be used to speed up the rasterizing process.
|
||||
* @return The caching information.
|
||||
*/
|
||||
virtual TCachingInfo GetCachingInfo(void) const
|
||||
{
|
||||
return (void*) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Activates the material in the (OpenGL) rasterizer.
|
||||
* On entry, the cachingInfo contains info about the last activated material.
|
||||
* On exit, the cachingInfo should contain updated info about this material.
|
||||
* @param rasty The rasterizer in which the material should be active.
|
||||
* @param cachingInfo The information about the material used to speed up rasterizing.
|
||||
*/
|
||||
void DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const;
|
||||
virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const;
|
||||
|
||||
/**
|
||||
* Returns the Blender texture face structure that is used for this material.
|
||||
* @return The material's texture face.
|
||||
*/
|
||||
TFace* GetTFace(void) const
|
||||
{
|
||||
return m_tface;
|
||||
}
|
||||
|
||||
|
||||
KX_PYMETHOD_DOC(KX_PolygonMaterial, updateTexture);
|
||||
KX_PYMETHOD_DOC(KX_PolygonMaterial, setTexture);
|
||||
KX_PYMETHOD_DOC(KX_PolygonMaterial, activate);
|
||||
|
||||
KX_PYMETHOD_DOC(KX_PolygonMaterial, setCustomMaterial);
|
||||
KX_PYMETHOD_DOC(KX_PolygonMaterial, loadProgram);
|
||||
|
||||
virtual PyObject* _getattr(const STR_String& attr);
|
||||
virtual int _setattr(const STR_String& attr, PyObject *pyvalue);
|
||||
};
|
||||
|
||||
#endif // __KX_POLYGONMATERIAL_H__
|
||||
|
@ -338,6 +338,7 @@ PyObject* KX_VertexProxy::PySetRGBA(PyObject*,
|
||||
m_vertex->SetRGBA(MT_Vector4(r, g, b, a));
|
||||
Py_Return;
|
||||
}
|
||||
PyErr_Clear();
|
||||
|
||||
int rgba;
|
||||
if (PyArg_ParseTuple(args,"i",&rgba))
|
||||
@ -345,7 +346,8 @@ PyObject* KX_VertexProxy::PySetRGBA(PyObject*,
|
||||
m_vertex->SetRGBA(rgba);
|
||||
Py_Return;
|
||||
}
|
||||
Py_Return;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -57,7 +57,7 @@ public:
|
||||
|
||||
// stuff for python integration
|
||||
virtual PyObject* _getattr(const STR_String& attr);
|
||||
virtual int KX_VertexProxy::_setattr(const STR_String& attr, PyObject *pyvalue);
|
||||
virtual int _setattr(const STR_String& attr, PyObject *pyvalue);
|
||||
|
||||
KX_PYMETHOD(KX_VertexProxy,GetXYZ);
|
||||
KX_PYMETHOD(KX_VertexProxy,SetXYZ);
|
||||
|
@ -31,6 +31,7 @@ source_files = ['KX_WorldIpoController.cpp',
|
||||
'KX_PythonInit.cpp',
|
||||
'KX_PyConstraintBinding.cpp',
|
||||
'KX_PositionInterpolator.cpp',
|
||||
'KX_PolygonMaterial.cpp',
|
||||
'KX_PhysicsObjectWrapper.cpp',
|
||||
'KX_OrientationInterpolator.cpp',
|
||||
'KX_ObjectActuator.cpp',
|
||||
|
136
source/gameengine/PyDoc/KX_PolygonMaterial.py
Normal file
136
source/gameengine/PyDoc/KX_PolygonMaterial.py
Normal file
@ -0,0 +1,136 @@
|
||||
# $Id$
|
||||
|
||||
class KX_PolygonMaterial:
|
||||
"""
|
||||
This is the interface to materials in Blender.
|
||||
|
||||
Materials define the render state to be applied to mesh objects.
|
||||
|
||||
@bug: All attributes are read only.
|
||||
|
||||
@ivar texture: Texture name
|
||||
@type texture: string
|
||||
|
||||
@ivar gl_texture: OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture)
|
||||
@type gl_texture: integer
|
||||
|
||||
@ivar material: Material name
|
||||
@type material: string
|
||||
|
||||
@ivar tface: Texture face properties
|
||||
@type tface: CObject
|
||||
|
||||
@ivar tile: Texture is tiling
|
||||
@type tile: boolean
|
||||
@ivar tilexrep: Number of tile repetitions in x direction.
|
||||
@type tilexrep: integer
|
||||
@ivar tileyrep: Number of tile repetitions in y direction.
|
||||
@type tileyrep: integer
|
||||
|
||||
@ivar drawingmode: Drawing mode for the material.
|
||||
- 2 (drawingmode & 4) Textured
|
||||
- 4 (drawingmode & 16) Light
|
||||
- 14 (drawingmode & 16384) 3d Polygon Text
|
||||
@type drawingmode: bitfield
|
||||
|
||||
@ivar transparent: This material is transparent. All meshes with this
|
||||
material will be rendered after non transparent meshes from back
|
||||
to front.
|
||||
@type transparent: boolean
|
||||
|
||||
@ivar zsort: Transparent polygons in meshes with this material will be sorted back to
|
||||
front before rendering.
|
||||
Non-Transparent polygons will be sorted front to back before rendering.
|
||||
@type zsort: boolean
|
||||
|
||||
@ivar lightlayer: Light layers this material affects.
|
||||
@type lightlayer: bitfield.
|
||||
|
||||
@ivar triangle: Mesh data with this material is triangles.
|
||||
@type triangle: boolean
|
||||
|
||||
@ivar diffuse: The diffuse colour of the material. black = [0.0, 0.0, 0.0, 1.0] white = [1.0, 1.0, 1.0, 1.0]
|
||||
@type diffuse: list [r, g, b, a]
|
||||
@ivar specular: The specular colour of the material. black = [0.0, 0.0, 0.0, 1.0] white = [1.0, 1.0, 1.0, 1.0]
|
||||
@type specular: list [r, g, b, a]
|
||||
@ivar shininess: The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0
|
||||
@type shininess: float
|
||||
@ivar specularity: The amount of specular of the material. 0.0 <= specularity <= 1.0
|
||||
@type specularity: float
|
||||
"""
|
||||
def updateTexture(tface, rasty):
|
||||
"""
|
||||
Updates a realtime animation.
|
||||
|
||||
@param tface: Texture face (eg mat.tface)
|
||||
@type tface: CObject
|
||||
@param rasty: Rasterizer
|
||||
@type rasty: CObject
|
||||
"""
|
||||
def setTexture(tface):
|
||||
"""
|
||||
Sets texture render state.
|
||||
|
||||
Example::
|
||||
mat.setTexture(mat.tface)
|
||||
|
||||
@param tface: Texture face
|
||||
@type tface: CObject
|
||||
"""
|
||||
def activate(rasty, cachingInfo):
|
||||
"""
|
||||
Sets material parameters for this object for rendering.
|
||||
|
||||
Material Parameters set:
|
||||
1. Texture
|
||||
2. Backface culling
|
||||
3. Line drawing
|
||||
4. Specular Colour
|
||||
5. Shininess
|
||||
6. Diffuse Colour
|
||||
7. Polygon Offset.
|
||||
|
||||
@param rasty: Rasterizer instance.
|
||||
@type rasty: CObject
|
||||
@param cachingInfo: Material cache instance.
|
||||
@type cachingInfo: CObject
|
||||
"""
|
||||
def setCustomMaterial(material):
|
||||
"""
|
||||
Sets the material state setup object.
|
||||
|
||||
Example::
|
||||
class PyMaterial:
|
||||
def __init__(self):
|
||||
self.pass_no = 0
|
||||
|
||||
def activate(self, rasty, cachingInfo, material):
|
||||
# Activate the material here.
|
||||
#
|
||||
# The activate method will be called until it returns False.
|
||||
# Every time the activate method returns True the mesh will
|
||||
# be rendered.
|
||||
#
|
||||
# rasty is a CObject for passing to material.updateTexture()
|
||||
# and material.activate()
|
||||
# cachingInfo is a CObject for passing to material.activate()
|
||||
# material is the KX_PolygonMaterial instance this material
|
||||
# was added to
|
||||
|
||||
# default material properties:
|
||||
if self.pass_no == 0:
|
||||
material.activate(rasty, cachingInfo)
|
||||
self.pass_no = 1
|
||||
# Return True to do this pass
|
||||
return True
|
||||
|
||||
self.pass_no = 0
|
||||
return False
|
||||
|
||||
# Create a new Python Material and pass it to the renderer.
|
||||
mat.setCustomMaterial(PyMaterial())
|
||||
|
||||
@param material: The material object.
|
||||
@type material: instance
|
||||
"""
|
||||
|
@ -7,6 +7,7 @@ This document lists what has been changed in the Game Engine Python API.
|
||||
|
||||
Blender CVS
|
||||
- Added L{KX_GameObject}.getDistanceTo() method. (thanks Charlie C)
|
||||
- Added L{KX_PolygonMaterial} module
|
||||
|
||||
Blender 2.36
|
||||
------------
|
||||
|
@ -112,11 +112,12 @@ void RAS_BucketManager::RenderAlphaBuckets(
|
||||
// it is needed for compatibility.
|
||||
rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_DISABLED);
|
||||
|
||||
int drawingmode;
|
||||
std::multiset< alphamesh, backtofront>::iterator msit = alphameshset.begin();
|
||||
for (; msit != alphameshset.end(); ++msit)
|
||||
{
|
||||
(*msit).m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(*msit).m_ms,
|
||||
(*msit).m_bucket->ActivateMaterial(cameratrans, rasty, rendertools));
|
||||
while ((*msit).m_bucket->ActivateMaterial(cameratrans, rasty, rendertools, drawingmode))
|
||||
(*msit).m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(*msit).m_ms, drawingmode);
|
||||
}
|
||||
|
||||
rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
|
||||
|
@ -36,7 +36,6 @@
|
||||
#endif
|
||||
|
||||
RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname,
|
||||
bool ba,
|
||||
const STR_String& matname,
|
||||
int tile,
|
||||
int tilexrep,
|
||||
|
@ -83,7 +83,6 @@ public:
|
||||
};
|
||||
|
||||
RAS_IPolyMaterial(const STR_String& texname,
|
||||
bool ba,
|
||||
const STR_String& matname,
|
||||
int tile,
|
||||
int tilexrep,
|
||||
@ -110,9 +109,12 @@ public:
|
||||
* @param rasty The rasterizer in which the material should be active.
|
||||
* @param cachingInfo The information about the material used to speed up rasterizing.
|
||||
*/
|
||||
virtual void Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const {}
|
||||
virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Equals(const RAS_IPolyMaterial& lhs) const;
|
||||
virtual bool Equals(const RAS_IPolyMaterial& lhs) const;
|
||||
bool Less(const RAS_IPolyMaterial& rhs) const;
|
||||
int GetLightLayer() const;
|
||||
bool IsTransparant() const;
|
||||
|
@ -116,7 +116,7 @@ public:
|
||||
* to be rendered with.
|
||||
* The material will be cached.
|
||||
*/
|
||||
virtual void SetMaterial(const RAS_IPolyMaterial& mat)=0;
|
||||
virtual bool SetMaterial(const RAS_IPolyMaterial& mat)=0;
|
||||
/**
|
||||
* Init initialises the renderer.
|
||||
*/
|
||||
@ -328,6 +328,10 @@ public:
|
||||
float difY,
|
||||
float difZ,
|
||||
float diffuse)=0;
|
||||
/**
|
||||
* Sets a polygon offset. z depth will be: z1 = mult*z0 + add
|
||||
*/
|
||||
virtual void SetPolygonOffset(float mult, float add) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
@ -169,12 +169,13 @@ RAS_MaterialBucket::T_MeshSlotList::iterator RAS_MaterialBucket::msEnd()
|
||||
return m_meshSlots.end();
|
||||
}
|
||||
|
||||
int RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
RAS_IRenderTools *rendertools)
|
||||
bool RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
RAS_IRenderTools *rendertools, int &drawmode)
|
||||
{
|
||||
rendertools->SetViewMat(cameratrans);
|
||||
|
||||
rasty->SetMaterial(*m_material);
|
||||
if (!rasty->SetMaterial(*m_material))
|
||||
return false;
|
||||
|
||||
bool dolights = m_material->GetDrawingMode()&16;
|
||||
|
||||
@ -187,8 +188,10 @@ int RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_IR
|
||||
bool bUseLights = rendertools->ProcessLighting(m_material->GetLightLayer());
|
||||
}
|
||||
|
||||
return (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ?
|
||||
drawmode = (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ?
|
||||
1: (m_material->UsesTriangles() ? 0 : 2));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
@ -272,11 +275,12 @@ void RAS_MaterialBucket::Render(const MT_Transform& cameratrans,
|
||||
rendertools->SetClientObject((*m_meshSlots.begin()).m_clientObj);
|
||||
}
|
||||
|
||||
int drawmode = ActivateMaterial(cameratrans, rasty, rendertools);
|
||||
int drawmode;
|
||||
|
||||
for (T_MeshSlotList::const_iterator it = m_meshSlots.begin();
|
||||
! (it == m_meshSlots.end()); ++it)
|
||||
{
|
||||
while (ActivateMaterial(cameratrans, rasty, rendertools, drawmode))
|
||||
RenderMeshSlot(cameratrans, rasty, rendertools, *it, drawmode);
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +56,10 @@ struct KX_VertexIndex {
|
||||
public:
|
||||
KX_VertexIndex(int size);
|
||||
void SetIndex(short loc,unsigned int index);
|
||||
|
||||
// The vertex array
|
||||
short m_vtxarray;
|
||||
// An index into the vertex array for up to 4 verticies
|
||||
unsigned short m_indexarray[4];
|
||||
short m_size;
|
||||
};
|
||||
@ -124,8 +127,8 @@ public:
|
||||
|
||||
void RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
RAS_IRenderTools* rendertools, const KX_MeshSlot &ms, int drawmode);
|
||||
int ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
RAS_IRenderTools *rendertools);
|
||||
bool ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
||||
RAS_IRenderTools *rendertools, int &drawmode);
|
||||
|
||||
unsigned int NumMeshSlots();
|
||||
T_MeshSlotList::iterator msBegin();
|
||||
|
@ -42,8 +42,10 @@
|
||||
#endif // WIN32
|
||||
#ifdef __APPLE__
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/glu.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
#include "RAS_Rect.h"
|
||||
@ -157,6 +159,10 @@ static void Myinit_gl_stuff(void)
|
||||
}
|
||||
|
||||
glPolygonStipple(patc);
|
||||
|
||||
glFrontFace(GL_CCW);
|
||||
glCullFace(GL_BACK);
|
||||
glEnable(GL_CULL_FACE);
|
||||
}
|
||||
|
||||
|
||||
@ -270,12 +276,9 @@ void RAS_OpenGLRasterizer::DisplayFog()
|
||||
|
||||
|
||||
|
||||
void RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
|
||||
bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
|
||||
{
|
||||
if (mat.GetCachingInfo() != m_materialCachingInfo)
|
||||
{
|
||||
mat.Activate(this, m_materialCachingInfo);
|
||||
}
|
||||
return mat.Activate(this, m_materialCachingInfo);
|
||||
}
|
||||
|
||||
|
||||
@ -1329,4 +1332,14 @@ double RAS_OpenGLRasterizer::GetTime()
|
||||
return m_time;
|
||||
}
|
||||
|
||||
|
||||
void RAS_OpenGLRasterizer::SetPolygonOffset(float mult, float add)
|
||||
{
|
||||
glPolygonOffset(mult, add);
|
||||
GLint mode = GL_POLYGON_OFFSET_FILL;
|
||||
if (m_drawingmode < KX_SHADED)
|
||||
mode = GL_POLYGON_OFFSET_LINE;
|
||||
if (mult != 0.0f || add != 0.0f)
|
||||
glEnable(mode);
|
||||
else
|
||||
glDisable(mode);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ public:
|
||||
};*/
|
||||
virtual void SetDepthMask(DepthMask depthmask);
|
||||
|
||||
virtual void SetMaterial(const RAS_IPolyMaterial& mat);
|
||||
virtual bool SetMaterial(const RAS_IPolyMaterial& mat);
|
||||
virtual bool Init();
|
||||
virtual void Exit();
|
||||
virtual bool BeginFrame(int drawingmode, double time);
|
||||
@ -224,6 +224,7 @@ public:
|
||||
float difZ,
|
||||
float diffuse
|
||||
);
|
||||
virtual void SetPolygonOffset(float mult, float add);
|
||||
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user