2012-03-22 01:36:20 +08:00
|
|
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
2008-10-06 16:53:54 +08:00
|
|
|
*
|
2012-03-22 01:36:20 +08:00
|
|
|
* This library is open source and may be redistributed and/or modified under
|
|
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
2008-10-06 16:53:54 +08:00
|
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
|
|
* included with this distribution, and on the openscenegraph.org website.
|
2012-03-22 01:36:20 +08:00
|
|
|
*
|
2008-10-06 16:53:54 +08:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2012-03-22 01:36:20 +08:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2008-10-06 16:53:54 +08:00
|
|
|
* OpenSceneGraph Public License for more details.
|
|
|
|
*
|
|
|
|
* ViewDependentShadow codes Copyright (C) 2008 Wojciech Lewandowski
|
|
|
|
* Thanks to to my company http://www.ai.com.pl for allowing me free this work.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef OSGSHADOW_STANDARDSHADOWMAP
|
|
|
|
#define OSGSHADOW_STANDARDSHADOWMAP 1
|
|
|
|
|
|
|
|
#include <osgShadow/DebugShadowMap>
|
|
|
|
|
|
|
|
namespace osgShadow {
|
|
|
|
|
|
|
|
class OSGSHADOW_EXPORT StandardShadowMap : public DebugShadowMap
|
|
|
|
{
|
|
|
|
public :
|
|
|
|
/** Convenient typedef used in definition of ViewData struct and methods */
|
|
|
|
typedef StandardShadowMap ThisClass;
|
|
|
|
/** Convenient typedef used in definition of ViewData struct and methods */
|
2012-03-22 01:36:20 +08:00
|
|
|
typedef DebugShadowMap BaseClass;
|
2008-10-06 16:53:54 +08:00
|
|
|
|
|
|
|
/** Classic OSG constructor */
|
|
|
|
StandardShadowMap();
|
|
|
|
|
|
|
|
/** Classic OSG cloning constructor */
|
2012-03-22 01:36:20 +08:00
|
|
|
StandardShadowMap(const StandardShadowMap& ssm,
|
2008-10-06 16:53:54 +08:00
|
|
|
const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
|
|
|
|
|
|
|
|
/** Declaration of standard OSG object methods */
|
2011-02-24 00:45:44 +08:00
|
|
|
META_Object( osgShadow, StandardShadowMap );
|
2008-10-06 16:53:54 +08:00
|
|
|
|
|
|
|
void setBaseTextureUnit( unsigned int unit )
|
|
|
|
{ _baseTextureUnit = unit; dirty(); }
|
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
unsigned int getBaseTextureUnit( void ) const
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _baseTextureUnit; }
|
|
|
|
|
|
|
|
void setShadowTextureUnit( unsigned int unit )
|
|
|
|
{ _shadowTextureUnit = unit; dirty(); }
|
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
unsigned int getShadowTextureUnit( void ) const
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _shadowTextureUnit; }
|
|
|
|
|
|
|
|
// Texture Indices are changed by search and replace on shader source
|
|
|
|
// Carefully order these calls when changing both base and shadow indices
|
2012-03-22 01:36:20 +08:00
|
|
|
// In worst case when intend to swap indices
|
|
|
|
// one will have to call these methods more than once
|
|
|
|
// with one extra pass to change index to unused value to avoid
|
2008-10-06 16:53:54 +08:00
|
|
|
// unwanted superfluous replace:
|
|
|
|
//
|
|
|
|
// Example: Imagine we want to swap base(0) and shadow(1) indices:
|
|
|
|
// We have to do an extra step to make sure both do not end up as 1
|
2012-03-22 01:36:20 +08:00
|
|
|
//
|
2008-10-06 16:53:54 +08:00
|
|
|
// // initialy change base to something else than 1
|
2012-03-22 01:36:20 +08:00
|
|
|
// setBaseTextureCoordIndex( 100 );
|
2008-10-06 16:53:54 +08:00
|
|
|
// // now search and replace all gl_TexCord[1] to gl_TexCord[0]
|
|
|
|
// setShadowTextureCoordIndex( 0 );
|
|
|
|
// // finally change base from 100 to 0
|
2012-03-22 01:36:20 +08:00
|
|
|
// setBaseTextureCoordIndex( 1 );
|
2008-10-06 16:53:54 +08:00
|
|
|
|
|
|
|
void setBaseTextureCoordIndex( unsigned int index )
|
|
|
|
{ updateTextureCoordIndices( _baseTextureCoordIndex, index );
|
2012-03-22 01:36:20 +08:00
|
|
|
_baseTextureCoordIndex = index; }
|
2008-10-06 16:53:54 +08:00
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
unsigned int getBaseTextureCoordIndex( void ) const
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _baseTextureCoordIndex; }
|
|
|
|
|
|
|
|
// Texture Indices are changed by search and replace on shader source
|
|
|
|
// Look at the comment above setBaseTextureCoordIndex
|
|
|
|
|
|
|
|
void setShadowTextureCoordIndex( unsigned int index )
|
|
|
|
{ updateTextureCoordIndices( _shadowTextureCoordIndex, index );
|
|
|
|
_shadowTextureCoordIndex = index; }
|
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
unsigned int getShadowTextureCoordIndex( void ) const
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _shadowTextureCoordIndex; }
|
|
|
|
|
|
|
|
void setTextureSize( const osg::Vec2s& textureSize )
|
|
|
|
{ _textureSize = textureSize; dirty(); }
|
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
const osg::Vec2s& getTextureSize() const
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _textureSize; }
|
|
|
|
|
|
|
|
void setLight( osg::Light* light )
|
|
|
|
{ _light = light; }
|
|
|
|
|
|
|
|
osg::Light* getLight( void )
|
|
|
|
{ return _light.get(); }
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2010-04-20 18:29:04 +08:00
|
|
|
const osg::Light* getLight( void ) const
|
|
|
|
{ return _light.get(); }
|
2008-10-06 16:53:54 +08:00
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
osg::Shader * getShadowVertexShader()
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _shadowVertexShader.get(); }
|
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
osg::Shader * getShadowFragmentShader()
|
2008-10-06 16:53:54 +08:00
|
|
|
{ return _shadowFragmentShader.get(); }
|
|
|
|
|
|
|
|
osg::Shader * getMainVertexShader( )
|
|
|
|
{ return _mainVertexShader.get(); }
|
|
|
|
|
|
|
|
osg::Shader * getMainFragmentShader( )
|
|
|
|
{ return _mainFragmentShader.get(); }
|
|
|
|
|
|
|
|
void setShadowVertexShader( osg::Shader * shader )
|
|
|
|
{ _shadowVertexShader = shader; }
|
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
void setShadowFragmentShader( osg::Shader * shader )
|
2008-10-06 16:53:54 +08:00
|
|
|
{ _shadowFragmentShader = shader; }
|
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
void setMainVertexShader( osg::Shader * shader )
|
2008-10-06 16:53:54 +08:00
|
|
|
{ _mainVertexShader = shader; }
|
|
|
|
|
|
|
|
void setMainFragmentShader( osg::Shader * shader )
|
|
|
|
{ _mainFragmentShader = shader; }
|
|
|
|
|
2016-02-05 01:52:44 +08:00
|
|
|
|
|
|
|
/** Resize any per context GLObject buffers to specified size. */
|
|
|
|
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
|
|
|
|
|
|
|
/** If State is non-zero, this function releases any associated OpenGL objects for
|
|
|
|
* the specified graphics context. Otherwise, releases OpenGL objects
|
|
|
|
* for all graphics contexts. */
|
|
|
|
virtual void releaseGLObjects(osg::State* = 0) const;
|
|
|
|
|
|
|
|
protected:
|
2008-10-06 16:53:54 +08:00
|
|
|
/** Classic protected OSG destructor */
|
|
|
|
virtual ~StandardShadowMap(void);
|
|
|
|
|
|
|
|
virtual void updateTextureCoordIndices
|
|
|
|
( unsigned int baseTexCoordIndex, unsigned int shadowTexCoordIndex );
|
|
|
|
|
|
|
|
virtual void searchAndReplaceShaderSource
|
|
|
|
( osg::Shader*, std::string fromString, std::string toString );
|
|
|
|
|
|
|
|
osg::ref_ptr< osg::Shader > _mainVertexShader;
|
|
|
|
osg::ref_ptr< osg::Shader > _mainFragmentShader;
|
|
|
|
osg::ref_ptr< osg::Shader > _shadowVertexShader;
|
|
|
|
osg::ref_ptr< osg::Shader > _shadowFragmentShader;
|
|
|
|
|
|
|
|
osg::ref_ptr< osg::Light > _light;
|
|
|
|
float _polygonOffsetFactor;
|
|
|
|
float _polygonOffsetUnits;
|
2008-10-06 22:15:27 +08:00
|
|
|
osg::Vec2s _textureSize;
|
2008-10-06 16:53:54 +08:00
|
|
|
unsigned int _baseTextureUnit;
|
|
|
|
unsigned int _shadowTextureUnit;
|
|
|
|
unsigned int _baseTextureCoordIndex;
|
|
|
|
unsigned int _shadowTextureCoordIndex;
|
|
|
|
|
2008-11-06 22:04:26 +08:00
|
|
|
struct OSGSHADOW_EXPORT ViewData: public BaseClass::ViewData
|
2008-10-06 16:53:54 +08:00
|
|
|
{
|
|
|
|
osg::ref_ptr< osg::Light > * _lightPtr;
|
|
|
|
unsigned int * _baseTextureUnitPtr;
|
|
|
|
unsigned int * _shadowTextureUnitPtr;
|
|
|
|
|
|
|
|
// ShadowMap texture is defined by base DebugShadowMap
|
|
|
|
// osg::ref_ptr<osg::Texture2D> _texture;
|
|
|
|
|
|
|
|
// ShadowMap camera is defined by base DebugShadowMap
|
|
|
|
// osg::ref_ptr<osg::Camera> _camera;
|
|
|
|
|
|
|
|
osg::ref_ptr<osg::TexGen> _texgen;
|
|
|
|
osg::ref_ptr<osg::StateSet> _stateset;
|
|
|
|
|
|
|
|
virtual void init( ThisClass * st, osgUtil::CullVisitor * cv );
|
|
|
|
|
|
|
|
virtual void cull( );
|
|
|
|
|
2012-03-22 01:36:20 +08:00
|
|
|
virtual void aimShadowCastingCamera(
|
2008-10-06 16:53:54 +08:00
|
|
|
const osg::BoundingSphere &bounds,
|
|
|
|
const osg::Light *light,
|
|
|
|
const osg::Vec4 &worldLightPos,
|
2012-03-22 01:36:20 +08:00
|
|
|
const osg::Vec3 &worldLightDir,
|
2008-10-06 16:53:54 +08:00
|
|
|
const osg::Vec3 &worldLightUp = osg::Vec3(0,1,0) );
|
|
|
|
|
|
|
|
virtual void cullShadowReceivingScene( );
|
|
|
|
|
|
|
|
virtual void cullShadowCastingScene( );
|
|
|
|
|
|
|
|
virtual void addShadowReceivingTexGen( );
|
|
|
|
|
|
|
|
virtual const osg::Light* selectLight( osg::Vec4 &viewLightPos,
|
|
|
|
osg::Vec3 &viewLightDir );
|
|
|
|
|
|
|
|
virtual void aimShadowCastingCamera( const osg::Light *light,
|
|
|
|
const osg::Vec4 &worldLightPos,
|
2012-03-22 01:36:20 +08:00
|
|
|
const osg::Vec3 &worldLightDir,
|
2008-10-06 16:53:54 +08:00
|
|
|
const osg::Vec3 &worldLightUp
|
|
|
|
= osg::Vec3(0,1,0) );
|
2016-02-05 01:52:44 +08:00
|
|
|
|
|
|
|
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
|
|
|
virtual void releaseGLObjects(osg::State* = 0) const;
|
2008-10-06 16:53:54 +08:00
|
|
|
};
|
2012-03-22 01:36:20 +08:00
|
|
|
|
2008-10-08 20:29:43 +08:00
|
|
|
friend struct ViewData;
|
2008-10-06 16:53:54 +08:00
|
|
|
|
|
|
|
META_ViewDependentShadowTechniqueData( ThisClass, ThisClass::ViewData )
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace osgShadow
|
|
|
|
|
|
|
|
#endif
|