Game engine: added Rasterizer.get/setMaterialMode to set texface,
multitexture or glsl materials. This does not affect existing scenes, only newly created ones.
This commit is contained in:
@@ -138,10 +138,12 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
|
||||
bool usemat = false, useglslmat = false;
|
||||
|
||||
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
||||
usemat = (SYS_GetCommandLineInt(syshandle, "blender_material", 0) != 0);
|
||||
usemat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
|
||||
|
||||
if(GPU_extensions_minimum_support())
|
||||
useglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 0) != 0);
|
||||
useglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
|
||||
else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
|
||||
usemat = false;
|
||||
|
||||
// create the canvas, rasterizer and rendertools
|
||||
RAS_ICanvas* canvas = new KX_BlenderCanvas(area);
|
||||
@@ -299,10 +301,10 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
|
||||
sceneconverter->addInitFromFrame=false;
|
||||
if (always_use_expand_framing)
|
||||
sceneconverter->SetAlwaysUseExpandFraming(true);
|
||||
|
||||
if(usemat)
|
||||
|
||||
if(usemat && (G.fileflags & G_FILE_GAME_MAT))
|
||||
sceneconverter->SetMaterials(true);
|
||||
if(useglslmat)
|
||||
if(useglslmat && (G.fileflags & G_FILE_GAME_MAT_GLSL))
|
||||
sceneconverter->SetGLSLMaterials(true);
|
||||
|
||||
KX_Scene* startscene = new KX_Scene(keyboarddevice,
|
||||
|
||||
@@ -524,17 +524,14 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
|
||||
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
|
||||
bool useLists = (SYS_GetCommandLineInt(syshandle, "displaylists", G.fileflags & G_FILE_DISPLAY_LISTS) != 0);
|
||||
|
||||
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1) {
|
||||
int gameflag =(G.fileflags & G_FILE_GAME_MAT);
|
||||
m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", gameflag) != 0);
|
||||
}
|
||||
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
||||
m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
|
||||
|
||||
if(GPU_extensions_minimum_support()) {
|
||||
int gameflag = (G.fileflags & G_FILE_GAME_MAT_GLSL);
|
||||
if(GPU_extensions_minimum_support())
|
||||
m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
|
||||
else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
|
||||
m_blendermat = false;
|
||||
|
||||
m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", gameflag) != 0);
|
||||
}
|
||||
|
||||
// create the canvas, rasterizer and rendertools
|
||||
m_canvas = new GPG_Canvas(window);
|
||||
if (!m_canvas)
|
||||
@@ -657,12 +654,12 @@ bool GPG_Application::startEngine(void)
|
||||
{
|
||||
STR_String startscenename = m_startSceneName.Ptr();
|
||||
m_ketsjiengine->SetSceneConverter(m_sceneconverter);
|
||||
|
||||
|
||||
// if (always_use_expand_framing)
|
||||
// sceneconverter->SetAlwaysUseExpandFraming(true);
|
||||
if(m_blendermat)
|
||||
if(m_blendermat && (G.fileflags & G_FILE_GAME_MAT))
|
||||
m_sceneconverter->SetMaterials(true);
|
||||
if(m_blenderglslmat)
|
||||
if(m_blenderglslmat && (G.fileflags & G_FILE_GAME_MAT_GLSL))
|
||||
m_sceneconverter->SetGLSLMaterials(true);
|
||||
|
||||
KX_Scene* startscene = new KX_Scene(m_keyboard,
|
||||
|
||||
@@ -303,7 +303,7 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
|
||||
|
||||
if((dp = opendir(cpath)) == NULL) {
|
||||
/* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
|
||||
fprintf(stderr, "Could not read directoty () failed, code %d (%s)\n", cpath, errno, strerror(errno));
|
||||
fprintf(stderr, "Could not read directoty (%s) failed, code %d (%s)\n", cpath, errno, strerror(errno));
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -696,7 +696,7 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
|
||||
PyObject*)
|
||||
{
|
||||
char *setting;
|
||||
int enable, flag;
|
||||
int enable, flag, fileflags;
|
||||
|
||||
if (!PyArg_ParseTuple(args,"si",&setting,&enable))
|
||||
return NULL;
|
||||
@@ -707,6 +707,8 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
|
||||
PyErr_SetString(PyExc_ValueError, "glsl setting is not known");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fileflags = G.fileflags;
|
||||
|
||||
if (enable)
|
||||
G.fileflags &= ~flag;
|
||||
@@ -714,17 +716,19 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
|
||||
G.fileflags |= flag;
|
||||
|
||||
/* display lists and GLSL materials need to be remade */
|
||||
if(gp_KetsjiEngine) {
|
||||
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
|
||||
KX_SceneList::iterator it;
|
||||
if(G.fileflags != fileflags) {
|
||||
if(gp_KetsjiEngine) {
|
||||
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
|
||||
KX_SceneList::iterator it;
|
||||
|
||||
for(it=scenes->begin(); it!=scenes->end(); it++)
|
||||
if((*it)->GetBucketManager())
|
||||
(*it)->GetBucketManager()->ReleaseDisplayLists();
|
||||
for(it=scenes->begin(); it!=scenes->end(); it++)
|
||||
if((*it)->GetBucketManager())
|
||||
(*it)->GetBucketManager()->ReleaseDisplayLists();
|
||||
}
|
||||
|
||||
GPU_materials_free();
|
||||
}
|
||||
|
||||
GPU_materials_free();
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
@@ -749,6 +753,50 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
|
||||
return PyInt_FromLong(enabled);
|
||||
}
|
||||
|
||||
#define KX_TEXFACE_MATERIAL 0
|
||||
#define KX_BLENDER_MULTITEX_MATERIAL 1
|
||||
#define KX_BLENDER_GLSL_MATERIAL 2
|
||||
|
||||
static PyObject* gPySetMaterialType(PyObject*,
|
||||
PyObject* args,
|
||||
PyObject*)
|
||||
{
|
||||
int flag, type;
|
||||
|
||||
if (!PyArg_ParseTuple(args,"i",&type))
|
||||
return NULL;
|
||||
|
||||
if(type == KX_BLENDER_GLSL_MATERIAL)
|
||||
flag = G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL;
|
||||
else if(type == KX_BLENDER_MULTITEX_MATERIAL)
|
||||
flag = G_FILE_GAME_MAT;
|
||||
else if(type == KX_TEXFACE_MATERIAL)
|
||||
flag = 0;
|
||||
else {
|
||||
PyErr_SetString(PyExc_ValueError, "material type is not known");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
G.fileflags &= ~(G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
|
||||
G.fileflags |= flag;
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject* gPyGetMaterialType(PyObject*)
|
||||
{
|
||||
int flag;
|
||||
|
||||
if(G.fileflags & (G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL))
|
||||
flag = KX_BLENDER_GLSL_MATERIAL;
|
||||
else if(G.fileflags & G_FILE_GAME_MAT)
|
||||
flag = KX_BLENDER_MULTITEX_MATERIAL;
|
||||
else
|
||||
flag = KX_TEXFACE_MATERIAL;
|
||||
|
||||
return PyInt_FromLong(flag);
|
||||
}
|
||||
|
||||
STR_String gPyGetWindowHeight__doc__="getWindowHeight doc";
|
||||
STR_String gPyGetWindowWidth__doc__="getWindowWidth doc";
|
||||
STR_String gPyEnableVisibility__doc__="enableVisibility doc";
|
||||
@@ -782,6 +830,10 @@ static struct PyMethodDef rasterizer_methods[] = {
|
||||
{"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_VARARGS, "get the eye separation for stereo mode"},
|
||||
{"setFocalLength", (PyCFunction) gPySetFocalLength, METH_VARARGS, "set the focal length for stereo mode"},
|
||||
{"getFocalLength", (PyCFunction) gPyGetFocalLength, METH_VARARGS, "get the focal length for stereo mode"},
|
||||
{"setMaterialMode",(PyCFunction) gPySetMaterialType,
|
||||
METH_VARARGS, "set the material mode to use for OpenGL rendering"},
|
||||
{"getMaterialMode",(PyCFunction) gPyGetMaterialType,
|
||||
METH_NOARGS, "get the material mode being used for OpenGL rendering"},
|
||||
{"setGLSLMaterialSetting",(PyCFunction) gPySetGLSLMaterialSetting,
|
||||
METH_VARARGS, "set the state of a GLSL material setting"},
|
||||
{"getGLSLMaterialSetting",(PyCFunction) gPyGetGLSLMaterialSetting,
|
||||
@@ -1111,6 +1163,11 @@ PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
|
||||
ErrorObject = PyString_FromString("Rasterizer.error");
|
||||
PyDict_SetItemString(d, "error", ErrorObject);
|
||||
|
||||
/* needed for get/setMaterialType */
|
||||
KX_MACRO_addTypesToDict(d, KX_TEXFACE_MATERIAL, KX_TEXFACE_MATERIAL);
|
||||
KX_MACRO_addTypesToDict(d, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL);
|
||||
KX_MACRO_addTypesToDict(d, KX_BLENDER_GLSL_MATERIAL, KX_BLENDER_GLSL_MATERIAL);
|
||||
|
||||
// XXXX Add constants here
|
||||
|
||||
// Check for errors
|
||||
|
||||
@@ -37,6 +37,10 @@ Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement M
|
||||
# Centre the mouse
|
||||
Rasterizer.setMousePosition(Rasterizer.getWindowWidth()/2, Rasterizer.getWindowHeight()/2)
|
||||
|
||||
@group Material Types: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
|
||||
@var KX_TEXFACE_MATERIAL: Materials as defined by the texture face settings.
|
||||
@var KX_BLENDER_MULTITEX_MATERIAL: Materials approximating blender materials with multitexturing.
|
||||
@var KX_BLENDER_BLENDER_MATERIAL: Materials approximating blender materials with GLSL.
|
||||
|
||||
"""
|
||||
|
||||
@@ -147,6 +151,21 @@ def getFocalLength():
|
||||
@rtype: float
|
||||
"""
|
||||
|
||||
def setMaterialMode(mode):
|
||||
"""
|
||||
Set the material mode to use for OpenGL rendering.
|
||||
|
||||
@type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
|
||||
@note: Changes will only affect newly created scenes.
|
||||
"""
|
||||
|
||||
def getMaterialMode(mode):
|
||||
"""
|
||||
Get the material mode to use for OpenGL rendering.
|
||||
|
||||
@rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
|
||||
"""
|
||||
|
||||
def setGLSLMaterialSetting(setting, enable):
|
||||
"""
|
||||
Enables or disables a GLSL material setting.
|
||||
|
||||
Reference in New Issue
Block a user