Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-01-18 09:04:11 +0300
committerErwin Coumans <blender@erwincoumans.com>2006-01-18 09:04:11 +0300
commit85c58bfa8a486d801420e9a2021018f3070d90ec (patch)
tree50390c5dc765bc113e96c35ec0ac1f88dfaca767 /source/gameengine/Ketsji/KX_BlenderMaterial.cpp
parent41007941537bd6269ff134db1bb8425fd4c8b079 (diff)
attempt to fix reported problems with glsl shader on OS X (and other platforms). instead of continuous printing errors, it should just print once, and delete the shaders.
also, disabled the asynchronous logicbrick update, it reportedly causes jitter.
Diffstat (limited to 'source/gameengine/Ketsji/KX_BlenderMaterial.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp70
1 files changed, 60 insertions, 10 deletions
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index ace68a823a8..429a9ea7a65 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -78,6 +78,7 @@ KX_BlenderMaterial::KX_BlenderMaterial(
mShader(0),
mScene(scene),
mUserDefBlend(0),
+ mModified(0),
mPass(0)
{
@@ -171,7 +172,7 @@ void KX_BlenderMaterial::OnConstruction()
void KX_BlenderMaterial::OnExit()
{
#ifdef GL_ARB_multitexture
-
+
#ifdef GL_ARB_shader_objects
if( RAS_EXT_support._ARB_shader_objects && mShader ) {
//note, the shader here is allocated, per unique material
@@ -919,15 +920,41 @@ int KX_BlenderMaterial::_setattr(const STR_String& attr, PyObject *pyvalue)
return PyObjectPlus::_setattr(attr, pyvalue);
}
+
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()")
{
- #ifdef GL_ARB_shader_objects
- if(!RAS_EXT_support._ARB_shader_objects) {
- PyErr_Format(PyExc_SystemError, "GLSL not supported");
- return NULL;
+#ifdef GL_ARB_fragment_shader
+ if( !RAS_EXT_support._ARB_fragment_shader) {
+ if(!mModified)
+ spit("Fragment shaders not supported");
+
+ mModified = true;
+ Py_Return;
+ }
+#endif
+
+#ifdef GL_ARB_vertex_shader
+ if( !RAS_EXT_support._ARB_vertex_shader) {
+ if(!mModified)
+ spit("Vertex shaders not supported");
+
+ mModified = true;
+ Py_Return;
+ }
+#endif
+
+#ifdef GL_ARB_shader_objects
+ if(!RAS_EXT_support._ARB_shader_objects) {
+ if(!mModified)
+ spit("GLSL not supported");
+ mModified = true;
+ Py_Return;
}
else {
- if(!mShader) {
+ // returns Py_None on error
+ // the calling script will need to check
+
+ if(!mShader && !mModified) {
mShader = new BL_Shader();
for(int i= 0; i<mMaterial->num_enabled; i++) {
if(mMaterial->mapping[i].mapping & USEENV )
@@ -935,13 +962,36 @@ KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()")
else
mShader->InitializeSampler(SAMP_2D, i, 0, mTextures[i]);
}
+ mModified = true;
+ }
+
+ if(mShader && !mShader->GetError()) {
+ Py_INCREF(mShader);
+ return mShader;
+ }else
+ {
+ // decref all references to the object
+ // then delete it!
+ // We will then go back to fixed functionality
+ // for this material
+ if(mShader) {
+ if(mShader->ob_refcnt > 1) {
+ Py_DECREF(mShader);
+ }
+ else {
+ delete mShader;
+ mShader=0;
+ }
+ }
}
- Py_INCREF(mShader);
- return mShader;
+ Py_Return;
}
- #else
+ PyErr_Format(PyExc_ValueError, "GLSL Error");
+ return NULL;
+
+#else
Py_Return;
- #endif//GL_ARB_shader_objects
+#endif//GL_ARB_shader_objects
}
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getMaterialIndex, "getMaterialIndex()")