Commit 2f8299d3 authored by hybrid's avatar hybrid

Fixed OpenGL shader materials to always add a material renderer in order to...

Fixed OpenGL shader materials to always add a material renderer in order to avoid mismatched predefined material renderers. Moreover, this is also the behavior if no shader support is available.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1336 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 35cb5664
...@@ -18,9 +18,9 @@ namespace video ...@@ -18,9 +18,9 @@ namespace video
{ {
// Irrlicht Engine OpenGL render path normal map vertex shader // Irrlicht Engine OpenGL render path normal map vertex shader
// I guess it could be optimized a lot, because I wrote it in D3D ASM and // I guess it could be optimized a lot, because I wrote it in D3D ASM and
// transferred it 1:1 to OpenGL // transferred it 1:1 to OpenGL
const char OPENGL_NORMAL_MAP_VSH[] = const char OPENGL_NORMAL_MAP_VSH[] =
"!!ARBvp1.0\n"\ "!!ARBvp1.0\n"\
"#input\n"\ "#input\n"\
"# 0-3: transposed world matrix;\n"\ "# 0-3: transposed world matrix;\n"\
...@@ -132,9 +132,9 @@ const char OPENGL_NORMAL_MAP_VSH[] = ...@@ -132,9 +132,9 @@ const char OPENGL_NORMAL_MAP_VSH[] =
"END\n"; "END\n";
// Irrlicht Engine OpenGL render path normal map pixel shader // Irrlicht Engine OpenGL render path normal map pixel shader
// I guess it could be optimized a bit, because I wrote it in D3D ASM and // I guess it could be optimized a bit, because I wrote it in D3D ASM and
// transfered it 1:1 to OpenGL // transfered it 1:1 to OpenGL
const char OPENGL_NORMAL_MAP_PSH[] = const char OPENGL_NORMAL_MAP_PSH[] =
"!!ARBfp1.0\n"\ "!!ARBfp1.0\n"\
"\n"\ "\n"\
"#Input\n"\ "#Input\n"\
...@@ -173,16 +173,16 @@ const char OPENGL_NORMAL_MAP_PSH[] = ...@@ -173,16 +173,16 @@ const char OPENGL_NORMAL_MAP_PSH[] =
"END\n"; "END\n";
//! Constructor //! Constructor
COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver, COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver,
s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial) s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial)
: COpenGLShaderMaterialRenderer(driver, 0, baseMaterial), CompiledShaders(true) : COpenGLShaderMaterialRenderer(driver, 0, baseMaterial), CompiledShaders(true)
{ {
// set this as callback. We could have done this in // set this as callback. We could have done this in
// the initialization list, but some compilers don't like it. // the initialization list, but some compilers don't like it.
CallBack = this; CallBack = this;
// basicly, this thing simply compiles these hardcoded shaders if the // basically, this thing simply compiles the hardcoded shaders if the
// hardware is able to do them, otherwise it maps to the base material // hardware is able to do them, otherwise it maps to the base material
if (!driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1) || if (!driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1) ||
...@@ -200,7 +200,7 @@ COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver, ...@@ -200,7 +200,7 @@ COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver,
if (renderer) if (renderer)
{ {
// use the already compiled shaders // use the already compiled shaders
video::COpenGLNormalMapRenderer* nmr = reinterpret_cast<video::COpenGLNormalMapRenderer*>(renderer); video::COpenGLNormalMapRenderer* nmr = reinterpret_cast<video::COpenGLNormalMapRenderer*>(renderer);
CompiledShaders = false; CompiledShaders = false;
...@@ -213,7 +213,11 @@ COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver, ...@@ -213,7 +213,11 @@ COpenGLNormalMapRenderer::COpenGLNormalMapRenderer(video::COpenGLDriver* driver,
{ {
// compile shaders on our own // compile shaders on our own
init(outMaterialTypeNr, OPENGL_NORMAL_MAP_VSH, OPENGL_NORMAL_MAP_PSH, EVT_TANGENTS); init(outMaterialTypeNr, OPENGL_NORMAL_MAP_VSH, OPENGL_NORMAL_MAP_PSH, EVT_TANGENTS);
} }
// fallback if compilation has failed
if (-1==outMaterialTypeNr)
outMaterialTypeNr = driver->addMaterialRenderer(this);
} }
...@@ -225,14 +229,14 @@ COpenGLNormalMapRenderer::~COpenGLNormalMapRenderer() ...@@ -225,14 +229,14 @@ COpenGLNormalMapRenderer::~COpenGLNormalMapRenderer()
if (!CompiledShaders) if (!CompiledShaders)
{ {
// prevent this from deleting shaders we did not create // prevent this from deleting shaders we did not create
VertexShader = 0; VertexShader = 0;
PixelShader = 0; PixelShader = 0;
} }
} }
//! Returns the render capability of the material. //! Returns the render capability of the material.
s32 COpenGLNormalMapRenderer::getRenderCapability() const s32 COpenGLNormalMapRenderer::getRenderCapability() const
{ {
if (Driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1) && if (Driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1) &&
...@@ -264,10 +268,10 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service ...@@ -264,10 +268,10 @@ void COpenGLNormalMapRenderer::OnSetConstants(IMaterialRendererServices* service
// and set them as constants // and set them as constants
u32 cnt = driver->getDynamicLightCount(); u32 cnt = driver->getDynamicLightCount();
for (u32 i=0; i<2; ++i) for (u32 i=0; i<2; ++i)
{ {
video::SLight light; video::SLight light;
if (i<cnt) if (i<cnt)
light = driver->getDynamicLight(i); light = driver->getDynamicLight(i);
......
...@@ -248,6 +248,10 @@ COpenGLParallaxMapRenderer::COpenGLParallaxMapRenderer(video::COpenGLDriver* dri ...@@ -248,6 +248,10 @@ COpenGLParallaxMapRenderer::COpenGLParallaxMapRenderer(video::COpenGLDriver* dri
// compile shaders on our own // compile shaders on our own
init(outMaterialTypeNr, OPENGL_PARALLAX_MAP_VSH, OPENGL_PARALLAX_MAP_PSH, EVT_TANGENTS); init(outMaterialTypeNr, OPENGL_PARALLAX_MAP_VSH, OPENGL_PARALLAX_MAP_PSH, EVT_TANGENTS);
} }
// fallback if compilation has failed
if (-1==outMaterialTypeNr)
outMaterialTypeNr = driver->addMaterialRenderer(this);
} }
......
...@@ -38,8 +38,8 @@ COpenGLShaderMaterialRenderer::COpenGLShaderMaterialRenderer(video::COpenGLDrive ...@@ -38,8 +38,8 @@ COpenGLShaderMaterialRenderer::COpenGLShaderMaterialRenderer(video::COpenGLDrive
//! constructor only for use by derived classes who want to //! constructor only for use by derived classes who want to
//! create a fall back material for example. //! create a fall back material for example.
COpenGLShaderMaterialRenderer::COpenGLShaderMaterialRenderer(COpenGLDriver* driver, COpenGLShaderMaterialRenderer::COpenGLShaderMaterialRenderer(COpenGLDriver* driver,
IShaderConstantSetCallBack* callback, IShaderConstantSetCallBack* callback,
IMaterialRenderer* baseMaterial, s32 userData) IMaterialRenderer* baseMaterial, s32 userData)
: Driver(driver), CallBack(callback), BaseMaterial(baseMaterial), : Driver(driver), CallBack(callback), BaseMaterial(baseMaterial),
VertexShader(0), PixelShader(0), UserData(userData) VertexShader(0), PixelShader(0), UserData(userData)
{ {
...@@ -64,9 +64,10 @@ COpenGLShaderMaterialRenderer::~COpenGLShaderMaterialRenderer() ...@@ -64,9 +64,10 @@ COpenGLShaderMaterialRenderer::~COpenGLShaderMaterialRenderer()
Driver->extGlDeletePrograms(1, &PixelShader); Driver->extGlDeletePrograms(1, &PixelShader);
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->drop (); BaseMaterial->drop();
} }
void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* vertexShaderProgram, void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* vertexShaderProgram,
const c8* pixelShaderProgram, E_VERTEX_TYPE type) const c8* pixelShaderProgram, E_VERTEX_TYPE type)
{ {
...@@ -84,6 +85,7 @@ void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* verte ...@@ -84,6 +85,7 @@ void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* verte
outMaterialTypeNr = Driver->addMaterialRenderer(this); outMaterialTypeNr = Driver->addMaterialRenderer(this);
} }
bool COpenGLShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) bool COpenGLShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
{ {
// call callback to set shader constants // call callback to set shader constants
...@@ -148,12 +150,14 @@ void COpenGLShaderMaterialRenderer::OnUnsetMaterial() ...@@ -148,12 +150,14 @@ void COpenGLShaderMaterialRenderer::OnUnsetMaterial()
BaseMaterial->OnUnsetMaterial(); BaseMaterial->OnUnsetMaterial();
} }
//! Returns if the material is transparent. //! Returns if the material is transparent.
bool COpenGLShaderMaterialRenderer::isTransparent() const bool COpenGLShaderMaterialRenderer::isTransparent() const
{ {
return BaseMaterial ? BaseMaterial->isTransparent() : false; return BaseMaterial ? BaseMaterial->isTransparent() : false;
} }
bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh) bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh)
{ {
if (!pxsh) if (!pxsh)
...@@ -194,6 +198,7 @@ bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh) ...@@ -194,6 +198,7 @@ bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh)
return true; return true;
} }
bool COpenGLShaderMaterialRenderer::createVertexShader(const char* vtxsh) bool COpenGLShaderMaterialRenderer::createVertexShader(const char* vtxsh)
{ {
if (!vtxsh) if (!vtxsh)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment