1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-20 Robert Osfield
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
14#ifndef OSGSHADOW_SHADOWSETTINGS
15#define OSGSHADOW_SHADOWSETTINGS 1
18#include <osg/CullSettings>
19#include <osgShadow/Export>
23/** ShadowSettings provides the parameters that the ShadowTechnique should use as a guide for setting up shadowing.*/
24class OSGSHADOW_EXPORT ShadowSettings : public osg::Object
28 ShadowSettings(const ShadowSettings& ss, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
30 META_Object(osgShadow, ShadowSettings);
32 void setReceivesShadowTraversalMask(unsigned int mask) { _receivesShadowTraversalMask = mask; }
33 unsigned int getReceivesShadowTraversalMask() const { return _receivesShadowTraversalMask; }
35 void setCastsShadowTraversalMask(unsigned int mask) { _castsShadowTraversalMask = mask; }
36 unsigned int getCastsShadowTraversalMask() const { return _castsShadowTraversalMask; }
38 void setComputeNearFarModeOverride(osg::CullSettings::ComputeNearFarMode cnfn) { _computeNearFearModeOverride = cnfn; }
39 osg::CullSettings::ComputeNearFarMode getComputeNearFarModeOverride() const { return _computeNearFearModeOverride; }
42 /** Set the LightNum of the light in the scene to assign a shadow for.
43 * Default value is -1, which signifies that shadow technique should automatically select an active light
44 * to assign a shadow, typically this will be the first active light found. */
45 void setLightNum(int lightNum) { _lightNum = lightNum; }
46 int getLightNum() const { return _lightNum; }
48 void setBaseShadowTextureUnit(unsigned int unit) { _baseShadowTextureUnit = unit; }
49 unsigned int getBaseShadowTextureUnit() const { return _baseShadowTextureUnit; }
51 /** Set whether to use osg::StateAttribute::OVERRIDE for the shadow map texture.
52 * Enabling override will force the shadow map texture to override any texture set on the shadow maps texture unit.*/
53 void setUseOverrideForShadowMapTexture(bool useOverride) { _useShadowMapTextureOverride = useOverride; }
55 /** Get whether to use osg::StateAttribute::OVERRIDE for the shadow map texture. */
56 bool getUseOverrideForShadowMapTexture() const { return _useShadowMapTextureOverride; }
59 /** Set the size of the shadow map textures.*/
60 void setTextureSize(const osg::Vec2s& textureSize) { _textureSize = textureSize; }
62 /** Get the size of the shadow map textures.*/
63 const osg::Vec2s& getTextureSize() const { return _textureSize; }
65 void setMinimumShadowMapNearFarRatio(double ratio) { _minimumShadowMapNearFarRatio = ratio; }
66 double getMinimumShadowMapNearFarRatio() const { return _minimumShadowMapNearFarRatio; }
68 void setMaximumShadowMapDistance(double distance) { _maximumShadowMapDistance = distance; }
69 double getMaximumShadowMapDistance() const { return _maximumShadowMapDistance; }
72 enum ShadowMapProjectionHint
74 ORTHOGRAPHIC_SHADOW_MAP,
75 PERSPECTIVE_SHADOW_MAP
78 void setShadowMapProjectionHint(ShadowMapProjectionHint hint) { _shadowMapProjectionHint = hint; }
79 ShadowMapProjectionHint getShadowMapProjectionHint() const { return _shadowMapProjectionHint; }
81 /** Set the cut off angle, in degrees, between the light direction and the view direction
82 * that determines whether perspective shadow mapping is appropriate, or thar orthographic shadow
83 * map should be used instead. Default is 2 degrees so that for any angle greater than 2 degrees
84 * perspective shadow map will be used, and any angle less than 2 degrees orthographic shadow map
85 * will be used. Note, if ShadowMapProjectionHint is set to ORTHOGRAPHIC_SHADOW_MAP then an
86 * orthographic shadow map will always be used.*/
87 void setPerspectiveShadowMapCutOffAngle(double angle) { _perspectiveShadowMapCutOffAngle = angle; }
88 double getPerspectiveShadowMapCutOffAngle() const { return _perspectiveShadowMapCutOffAngle; }
91 void setNumShadowMapsPerLight(unsigned int numShadowMaps) { _numShadowMapsPerLight = numShadowMaps; }
92 unsigned int getNumShadowMapsPerLight() const { return _numShadowMapsPerLight; }
94 enum MultipleShadowMapHint
100 void setMultipleShadowMapHint(MultipleShadowMapHint hint) { _multipleShadowMapHint = hint; }
101 MultipleShadowMapHint getMultipleShadowMapHint() const { return _multipleShadowMapHint; }
107 PROVIDE_FRAGMENT_SHADER,
108 PROVIDE_VERTEX_AND_FRAGMENT_SHADER
111 void setShaderHint(ShaderHint shaderHint) { _shaderHint = shaderHint; }
112 ShaderHint getShaderHint() const { return _shaderHint; }
114 void setDebugDraw(bool debugDraw) { _debugDraw = debugDraw; }
115 bool getDebugDraw() const { return _debugDraw; }
119 virtual ~ShadowSettings();
122 unsigned int _receivesShadowTraversalMask;
123 unsigned int _castsShadowTraversalMask;
125 osg::CullSettings::ComputeNearFarMode _computeNearFearModeOverride;
128 unsigned int _baseShadowTextureUnit;
129 bool _useShadowMapTextureOverride;
130 osg::Vec2s _textureSize;
132 double _minimumShadowMapNearFarRatio;
133 double _maximumShadowMapDistance;
134 ShadowMapProjectionHint _shadowMapProjectionHint;
135 double _perspectiveShadowMapCutOffAngle;
137 unsigned int _numShadowMapsPerLight;
138 MultipleShadowMapHint _multipleShadowMapHint;
140 ShaderHint _shaderHint;