diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-04-11 09:57:30 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-04-11 09:57:30 +0400 |
commit | 8dbe14b70b427ff449e1f4a7bb4cff989100f629 (patch) | |
tree | 3b3269edd4aa45acf07bf3fdb75ffcac9f2bb3ab /source/gameengine/Ketsji | |
parent | e9d4518c3aae5850ec6c3ae925411c903daee431 (diff) |
applied Charlies patch, reverted some GLSL shader stuff, improved penetration depth estimate.
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/BL_Material.h | 3 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_Shader.cpp | 116 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_Shader.h | 28 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BlenderMaterial.cpp | 36 |
4 files changed, 81 insertions, 102 deletions
diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h index 27d59257cbd..dbf482e2db3 100644 --- a/source/gameengine/Ketsji/BL_Material.h +++ b/source/gameengine/Ketsji/BL_Material.h @@ -120,7 +120,8 @@ enum BL_flag TEXALPHA=8, // use alpha combiner functions TEXNEG=16, // negate blending HASIPO=32, - USENEGALPHA=64 + USENEGALPHA=64, + ALPHA_TEST=128 }; // BL_Material::ras_mode diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp index 5598224c1ea..4a664589871 100644 --- a/source/gameengine/Ketsji/BL_Shader.cpp +++ b/source/gameengine/Ketsji/BL_Shader.cpp @@ -28,19 +28,7 @@ //using namespace bgl; #define spit(x) std::cout << x << std::endl; -/* ---- - testing for a faster solution! - ... just compile out - The idea is to install a shader in other - areas if code, find the shader via the scene and, - install it with ... - - shader->ApplyShader() - ... - shader->UnloadShader() -*/ #define SORT_UNIFORMS 1 - #define UNIFORM_MAX_LEN sizeof(float)*16 BL_Uniform::BL_Uniform(int data_size) @@ -143,15 +131,16 @@ BL_Shader::BL_Shader(PyTypeObject *T) mPass(1), mOk(0), mUse(0), + mAttr(0), vertProg(""), fragProg(""), mError(0), mDirty(true) { // if !RAS_EXT_support._ARB_shader_objects this class will not be used - for (int i=0; i<MAXTEX; i++) { - mSampler[i] = BL_Sampler(); - } + //for (int i=0; i<MAXTEX; i++) { + // mSampler[i] = BL_Sampler(); + //} } using namespace bgl; @@ -159,12 +148,12 @@ using namespace bgl; BL_Shader::~BL_Shader() { #ifdef GL_ARB_shader_objects - for (int i=0; i<MAXTEX; i++){ - if(mSampler[i].mOwn) { - if(mSampler[i].mTexture) - mSampler[i].mTexture->DeleteTex(); - } - } + //for (int i=0; i<MAXTEX; i++){ + // if(mSampler[i].mOwn) { + // if(mSampler[i].mTexture) + // mSampler[i].mTexture->DeleteTex(); + // } + //} ClearUniforms(); if( mShader ) { @@ -214,15 +203,6 @@ BL_Uniform *BL_Shader::FindUniform(const int location) void BL_Shader::SetUniformfv(int location, int type, float *param,int size, bool transpose) { #ifdef SORT_UNIFORMS -#ifdef WIN32 -#ifndef NDEBUG - MT_assert(type > BL_Uniform::UNI_NONE && type < BL_Uniform::UNI_MAX); - MT_assert(location); - MT_assert(param); - //MT_assert(size > 0 && size <= UNIFORM_MAX_LEN); -#endif -#endif //WIN32 - BL_Uniform *uni= FindUniform(location); if(uni) { memcpy(uni->getData(), param, size); @@ -242,16 +222,6 @@ void BL_Shader::SetUniformfv(int location, int type, float *param,int size, bool void BL_Shader::SetUniformiv(int location, int type, int *param,int size, bool transpose) { #ifdef SORT_UNIFORMS -#ifdef WIN32 -#ifndef NDEBUG - //MT_assert(type > BL_Uniform::UNI_NONE && type < BL_Uniform::UNI_MAX); - MT_assert(location); - MT_assert(param); - //MT_assert(size > 0 && size <= UNIFORM_MAX_LEN); -#endif -#endif //WIN32 - - BL_Uniform *uni= FindUniform(location); if(uni) { memcpy(uni->getData(), param, size); @@ -438,12 +408,12 @@ unsigned int BL_Shader::GetProg() { return mShader; } - -const BL_Sampler* BL_Shader::GetSampler(int i) -{ - MT_assert(i<=MAXTEX); - return &mSampler[i]; -} +// +//const BL_Sampler* BL_Shader::GetSampler(int i) +//{ +// MT_assert(i<=MAXTEX); +// return &mSampler[i]; +//} void BL_Shader::SetSampler(int loc, int unit) { @@ -457,14 +427,14 @@ void BL_Shader::SetSampler(int loc, int unit) } #endif } - -void BL_Shader::InitializeSampler(int unit, BL_Texture* texture) -{ - MT_assert(unit<=MAXTEX); - mSampler[unit].mTexture = texture; - mSampler[unit].mLoc =-1; - mSampler[unit].mOwn = 0; -} +// +//void BL_Shader::InitializeSampler(int unit, BL_Texture* texture) +//{ +// MT_assert(unit<=MAXTEX); +// mSampler[unit].mTexture = texture; +// mSampler[unit].mLoc =-1; +// mSampler[unit].mOwn = 0; +//} void BL_Shader::SetProg(bool enable) { @@ -504,7 +474,7 @@ void BL_Shader::Update( const KX_MeshSlot & ms, RAS_IRasterizer* rasty ) for(it = mPreDef.begin(); it!= mPreDef.end(); it++) { BL_DefUniform *uni = (*it); - if(!uni->mLoc) continue; + if(uni->mLoc == -1) continue; switch (uni->mType) { @@ -826,8 +796,7 @@ PyMethodDef BL_Shader::Methods[] = KX_PYMETHODTABLE( BL_Shader, setUniform2i ), KX_PYMETHODTABLE( BL_Shader, setUniform3i ), KX_PYMETHODTABLE( BL_Shader, setUniform4i ), -// TODO: GL_ARB_vertex/fragment_program support -// KX_PYMETHODTABLE( BL_Shader, setAttrib ), + KX_PYMETHODTABLE( BL_Shader, setAttrib ), KX_PYMETHODTABLE( BL_Shader, setUniformfv ), KX_PYMETHODTABLE( BL_Shader, setUniformiv ), @@ -967,10 +936,18 @@ KX_PYMETHODDEF_DOC( BL_Shader, setSampler, "setSampler(name, index)" ) { int loc = GetUniformLocation(uniform); if(loc != -1) { - if(index <= MAXTEX) - mSampler[index].mLoc = loc; - else + if(index >= MAXTEX && index < 0) spit("Invalid texture sample index: " << index); + +#ifdef SORT_UNIFORMS + SetUniformiv(loc, BL_Uniform::UNI_INT, &index, (sizeof(int)) ); +#else + SetUniform(loc, index); +#endif + //if(index <= MAXTEX) + // mSampler[index].mLoc = loc; + //else + // spit("Invalid texture sample index: " << index); } Py_Return; } @@ -1418,7 +1395,24 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformMatrix3, KX_PYMETHODDEF_DOC( BL_Shader, setAttrib, "setAttrib(enum)" ) { - Py_Return; +#ifdef GL_ARB_shader_objects + if(mError) { + Py_INCREF(Py_None); + return Py_None; + } + int attr=0; + if(PyArg_ParseTuple(args, "i", &attr )) { + if(mShader==0) { + PyErr_Format(PyExc_ValueError, "invalid shader object"); + return NULL; + } + mAttr=SHD_TANGENT; + bgl::blUseProgramObjectARB(mShader); + bgl::blBindAttribLocationARB(mShader, mAttr, "Tangent"); + Py_Return; + } + return NULL; +#endif } diff --git a/source/gameengine/Ketsji/BL_Shader.h b/source/gameengine/Ketsji/BL_Shader.h index 550f4750a33..8f303454087 100644 --- a/source/gameengine/Ketsji/BL_Shader.h +++ b/source/gameengine/Ketsji/BL_Shader.h @@ -21,14 +21,10 @@ class BL_Sampler { public: BL_Sampler(): - mLoc(-1), - mTexture(0), - mOwn(0) + mLoc(-1) { } int mLoc; // Sampler location - BL_Texture* mTexture; // Texture data - bool mOwn; // True if we own it }; /** @@ -104,7 +100,8 @@ private: int mPass; // 1.. unused bool mOk; // Valid and ok bool mUse; // ... - BL_Sampler mSampler[MAXTEX]; // Number of samplers +//BL_Sampler mSampler[MAXTEX]; // Number of samplers + int mAttr; // Tangent attribute char* vertProg; // Vertex program string char* fragProg; // Fragment program string bool mError; // ... @@ -166,12 +163,13 @@ public: int getNumPass() {return mPass;} bool GetError() {return mError;} // --- - const BL_Sampler* GetSampler(int i); + //const BL_Sampler* GetSampler(int i); void SetSampler(int loc, int unit); const bool Ok()const; unsigned int GetProg(); void SetProg(bool enable); + int GetAttribute(){return mAttr;}; // -- // Apply methods : sets colected uniforms @@ -181,8 +179,8 @@ public: // Update predefined uniforms each render call void Update(const class KX_MeshSlot & ms, class RAS_IRasterizer* rasty); - // Set sampler units (copied) - void InitializeSampler(int unit, BL_Texture* texture ); + //// Set sampler units (copied) + //void InitializeSampler(int unit, BL_Texture* texture ); void SetUniformfv(int location,int type, float *param, int size,bool transpose=false); @@ -206,15 +204,16 @@ public: // Python interface virtual PyObject* _getattr(const STR_String& attr); + // ----------------------------------- KX_PYMETHOD_DOC( BL_Shader, setSource ); KX_PYMETHOD_DOC( BL_Shader, delSource ); KX_PYMETHOD_DOC( BL_Shader, getVertexProg ); KX_PYMETHOD_DOC( BL_Shader, getFragmentProg ); KX_PYMETHOD_DOC( BL_Shader, setNumberOfPasses ); - - // ----------------------------------- KX_PYMETHOD_DOC( BL_Shader, isValid); KX_PYMETHOD_DOC( BL_Shader, validate); + + // ----------------------------------- KX_PYMETHOD_DOC( BL_Shader, setUniform4f ); KX_PYMETHOD_DOC( BL_Shader, setUniform3f ); KX_PYMETHOD_DOC( BL_Shader, setUniform2f ); @@ -223,19 +222,12 @@ public: KX_PYMETHOD_DOC( BL_Shader, setUniform3i ); KX_PYMETHOD_DOC( BL_Shader, setUniform2i ); KX_PYMETHOD_DOC( BL_Shader, setUniform1i ); - KX_PYMETHOD_DOC( BL_Shader, setUniformfv ); KX_PYMETHOD_DOC( BL_Shader, setUniformiv ); - KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix4 ); KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix3 ); - KX_PYMETHOD_DOC( BL_Shader, setUniformDef ); - KX_PYMETHOD_DOC( BL_Shader, setAttrib ); - - // These come from within the material buttons - // sampler2d/samplerCube work KX_PYMETHOD_DOC( BL_Shader, setSampler); }; diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index f61cab58392..af1a8ddb568 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -82,14 +82,13 @@ KX_BlenderMaterial::KX_BlenderMaterial( mPass(0) { - ///RAS_EXT_support._ARB_multitexture == true if were here - // -------------------------------- // RAS_IPolyMaterial variables... m_flag |=RAS_BLENDERMAT; m_flag |=(mMaterial->IdMode>=ONETEX)?RAS_MULTITEX:0; m_flag |=(mMaterial->ras_mode & USE_LIGHT)!=0?RAS_MULTILIGHT:0; - + m_flag |=(mMaterial->ras_mode &ALPHA_TEST)!=0?RAS_FORCEALPHA:0; + // figure max int enabled = mMaterial->num_enabled; int max = BL_Texture::GetMaxUnits(); @@ -197,17 +196,15 @@ void KX_BlenderMaterial::setShaderData( bool enable, RAS_IRasterizer *ras) // for each enabled unit for(i=0; i<mMaterial->num_enabled; i++) { - const BL_Sampler *samp = mShader->GetSampler(i); - BL_Texture *tex = samp->mTexture; - if( samp->mLoc == -1 || !tex || !tex->Ok() ) - continue; - tex->ActivateTexture(); - mShader->SetSampler(samp->mLoc, i); + if(!mTextures[i].Ok()) continue; + mTextures[i].ActivateTexture(); + mTextures[0].SetMapping(mMaterial->mapping[i].mapping); } + if(!mUserDefBlend) { setDefaultBlending(); - }else - { + } + else { // tested to be valid enums glEnable(GL_BLEND); glBlendFunc(mBlendFunc[0], mBlendFunc[1]); @@ -418,18 +415,19 @@ void KX_BlenderMaterial::ActivatGLMaterials( RAS_IRasterizer* rasty )const mMaterial->matcolor[0]*mMaterial->emit, mMaterial->matcolor[1]*mMaterial->emit, mMaterial->matcolor[2]*mMaterial->emit, - 1.0 - ); + 1.0 ); + rasty->SetAmbient(mMaterial->amb); if (mMaterial->material) rasty->SetPolygonOffset(-mMaterial->material->zoffs, 0.0); } + void KX_BlenderMaterial::ActivateTexGen(RAS_IRasterizer *ras) const { - //if(mShader && RAS_EXT_support._ARB_shader_objects) - // if(mShader->GetAttribute() == BL_Shader::SHD_TANGENT) - // ras->SetAttrib(RAS_IRasterizer::RAS_TEXTANGENT); + if(mShader && RAS_EXT_support._ARB_shader_objects) + if(mShader->GetAttribute() == BL_Shader::SHD_TANGENT) + ras->SetAttrib(RAS_IRasterizer::RAS_TEXTANGENT); for(int i=0; i<mMaterial->num_enabled; i++) { int mode = mMaterial->mapping[i].mapping; @@ -651,12 +649,6 @@ KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()") if(!mShader && !mModified) { mShader = new BL_Shader(); - for(int i= 0; i<mMaterial->num_enabled; i++) { - if(mMaterial->mapping[i].mapping & USEENV ) - mShader->InitializeSampler(i, &mTextures[i]); - else - mShader->InitializeSampler(i, &mTextures[i]); - } mModified = true; } |