From 475c58397595255ab0bf66d2287a4fbae3e27320 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 29 Jan 2004 11:16:49 +0000 Subject: [PATCH] From Pavel Moloshtan, add support to osg::Texture files for GL_ARB_shadow_ambinet support --- AUTHORS.txt | 8 ++++++-- include/osg/Texture | 14 ++++++++++++-- src/osg/Texture.cpp | 22 +++++++++++++++++++--- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 4ebf1d18a..46df7ea2a 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -11,7 +11,7 @@ Robert Osfield - 2nd iteration of shadow occlusion culling. - documentation?! - visual studio workspace files/unix makefiles. - - project adim & lead. + - project admin & lead. Don Burns - Open Producer @@ -124,7 +124,11 @@ Ruben Lopez - Inventor ascii/VRML 1.0 loader. Pavel Moloshtan - - Support for LWO2 format in the LightWave loader. + - First version of LightWave LWO2 format in lwo plugin. + - Support of GL_ARB_occlusion_query in osg::Drawable. + - Support of GL_ARB_shadow in osg::Texture, osgdepthtexture example. + - Support of GL_ARB_shadow_ambient in osg::Texture. + - Improvement to the ive plugin. Daniel Sjölie - Support for multitextured flt files. diff --git a/include/osg/Texture b/include/osg/Texture index 6c63b9138..4373767ac 100644 --- a/include/osg/Texture +++ b/include/osg/Texture @@ -82,6 +82,9 @@ #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #endif +#ifndef TEXTURE_COMPARE_FAIL_VALUE_ARB +#define TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif namespace osg { @@ -91,7 +94,6 @@ class SG_EXPORT Texture : public osg::StateAttribute public : - Texture(); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ @@ -266,7 +268,10 @@ class SG_EXPORT Texture : public osg::StateAttribute void setShadowTextureMode(ShadowTextureMode mode) { _shadow_texture_mode = mode; } ShadowTextureMode getShadowTextureMode() { return _shadow_texture_mode; } - + // set value of TEXTURE_COMPARE_FAIL_VALUE_ARB texture parameter + // http://oss.sgi.com/projects/ogl-sample/registry/ARB/shadow_ambient.txt + void setShadowAmbient(float shadow_ambient) { _shadow_ambient = shadow_ambient; } + float getShadowAmbient() { return _shadow_ambient; } /** Texture is pure virtual base class, apply must be overriden. */ virtual void apply(State& state) const = 0; @@ -315,6 +320,9 @@ class SG_EXPORT Texture : public osg::StateAttribute void setShadowSupported(bool flag) { _isShadowSupported = flag; } bool isShadowSupported() const { return _isShadowSupported; } + void setShadowAmbientSupported(bool flag) { _isShadowAmbientSupported = flag; } + bool isShadowAmbientSupported() const { return _isShadowAmbientSupported; } + void setMaxTextureSize(GLint maxsize) { _maxTextureSize=maxsize; } GLint maxTextureSize() const { return _maxTextureSize; } @@ -342,6 +350,7 @@ class SG_EXPORT Texture : public osg::StateAttribute bool _isTextureBorderClampSupported; bool _isGenerateMipMapSupported; bool _isShadowSupported; + bool _isShadowAmbientSupported; GLint _maxTextureSize; @@ -415,6 +424,7 @@ class SG_EXPORT Texture : public osg::StateAttribute bool _use_shadow_comparison; ShadowCompareFunc _shadow_compare_func; ShadowTextureMode _shadow_texture_mode; + float _shadow_ambient; public: diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index 6d512c389..fcc2d813d 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -178,7 +178,8 @@ Texture::Texture(): _internalFormat(0), _use_shadow_comparison(false), _shadow_compare_func(LEQUAL), - _shadow_texture_mode(LUMINANCE) + _shadow_texture_mode(LUMINANCE), + _shadow_ambient(0) { } @@ -198,7 +199,8 @@ Texture::Texture(const Texture& text,const CopyOp& copyop): _internalFormat(text._internalFormat), _use_shadow_comparison(text._use_shadow_comparison), _shadow_compare_func(text._shadow_compare_func), - _shadow_texture_mode(text._shadow_texture_mode) + _shadow_texture_mode(text._shadow_texture_mode), + _shadow_ambient(text._shadow_ambient) { } @@ -224,6 +226,7 @@ int Texture::compareTexture(const Texture& rhs) const COMPARE_StateAttribute_Parameter(_use_shadow_comparison) COMPARE_StateAttribute_Parameter(_shadow_compare_func) COMPARE_StateAttribute_Parameter(_shadow_texture_mode) + COMPARE_StateAttribute_Parameter(_shadow_ambient) return 0; } @@ -494,6 +497,13 @@ void Texture::applyTexParameters(GLenum target, State& state) const glTexParameteri(target, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC_ARB, _shadow_compare_func); glTexParameteri(target, GL_DEPTH_TEXTURE_MODE_ARB, _shadow_texture_mode); + + // if ambient value is 0 - it is default behaviour of GL_ARB_shadow + // no need for GL_ARB_shadow_ambient in this case + if (extensions->isShadowAmbientSupported() && _shadow_ambient > 0) + { + glTexParameterf(target, TEXTURE_COMPARE_FAIL_VALUE_ARB, _shadow_ambient); + } } else { @@ -1038,6 +1048,9 @@ Texture::Extensions::Extensions(const Extensions& rhs): _maxTextureSize = rhs._maxTextureSize; _glCompressedTexImage2D = rhs._glCompressedTexImage2D; + + _isShadowSupported = rhs._isShadowSupported; + _isShadowAmbientSupported = rhs._isShadowAmbientSupported; } void Texture::Extensions::lowestCommonDenominator(const Extensions& rhs) @@ -1059,6 +1072,9 @@ void Texture::Extensions::lowestCommonDenominator(const Extensions& rhs) if (!rhs._glCompressedTexImage2D) _glCompressedTexImage2D = 0; if (!rhs._glCompressedTexSubImage2D) _glCompressedTexSubImage2D = 0; if (!rhs._glGetCompressedTexImage) _glGetCompressedTexImage = 0; + + if (!rhs._isShadowSupported) _isShadowSupported = 0; + if (!rhs._isShadowAmbientSupported) _isShadowAmbientSupported = 0; } void Texture::Extensions::setupGLExtenions() @@ -1076,7 +1092,7 @@ void Texture::Extensions::setupGLExtenions() _isGenerateMipMapSupported = (strncmp((const char*)glGetString(GL_VERSION),"1.4",3)>=0) || isGLExtensionSupported("GL_SGIS_generate_mipmap"); _isShadowSupported = isGLExtensionSupported("GL_ARB_shadow"); - + _isShadowAmbientSupported = isGLExtensionSupported("GL_ARB_shadow_ambient"); glGetIntegerv(GL_MAX_TEXTURE_SIZE,&_maxTextureSize);