OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MinimalShadowMap.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
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.
7  *
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.
12  *
13  * ViewDependentShadow codes Copyright (C) 2008 Wojciech Lewandowski
14  * Thanks to to my company http://www.ai.com.pl for allowing me free this work.
15 */
16 
17 #ifndef OSGSHADOW_MINIMALSHADOWMAP
18 #define OSGSHADOW_MINIMALSHADOWMAP 1
19 
20 #include <osgShadow/StandardShadowMap>
21 
22 namespace osgShadow {
23 
25 {
26  public :
31 
34 
37  const MinimalShadowMap& msm,
39 
42 
43  void setModellingSpaceToWorldTransform( const osg::Matrix & modellingSpaceToWorld )
44  { _modellingSpaceToWorld = modellingSpaceToWorld; }
45 
47  { return _modellingSpaceToWorld; }
48 
49  float getMaxFarPlane( ) const
50  { return _maxFarPlane; }
51 
52  void setMaxFarPlane( float maxFarPlane )
53  { _maxFarPlane = maxFarPlane; }
54 
55  float getMinLightMargin( ) const
56  { return _minLightMargin; }
57 
58  void setMinLightMargin( float minLightMargin )
59  { _minLightMargin = minLightMargin; }
60 
65  DEFAULT_ACCURACY = BOUNDING_BOX
66  };
67 
68  void setShadowReceivingCoarseBoundAccuracy
70  { _shadowReceivingCoarseBoundAccuracy = accuracy; }
71 
72  ShadowReceivingCoarseBoundAccuracy
74  { return _shadowReceivingCoarseBoundAccuracy; }
75 
76  protected:
78  virtual ~MinimalShadowMap(void);
79 
80  protected:
81  // Matrix modellingSpaceToWorld and its inverse
82  // are used to define Modelling Space where shadowed scene drawables
83  // have minimal (smallest possible extent) bounding boxes.
84 
85  // Computing visible shadow range in this space
86  // allows for optimal use of ShadowMap resolution.
87 
88  // By default it is set to identity ie computations are in world space.
89  // But it should be set to ElipsoidModel::localToWorld
90  // when scene objects are put on earth ellipsoid surface.
91 
92  // Other scenarios are also possible for example when models are
93  // built in XZY space which would require identity matrix with swapped colums
94 
96  float _maxFarPlane;
99 
101  {
106 
108  std::vector< osg::Vec3d > _sceneReceivingShadowPolytopePoints;
109 
111 
112  virtual void init( ThisClass * st, osgUtil::CullVisitor * cv );
113 
114  virtual osg::BoundingBox computeShadowReceivingCoarseBounds( );
115 
116  virtual void cullShadowReceivingScene( );
117 
118  virtual void aimShadowCastingCamera(
119  const osg::BoundingSphere &bounds,
120  const osg::Light *light,
121  const osg::Vec4 &worldLightPos,
122  const osg::Vec3 &worldLightDir,
123  const osg::Vec3 &worldLightUp = osg::Vec3(0,1,0) );
124 
125  virtual void aimShadowCastingCamera( const osg::Light *light,
126  const osg::Vec4 &worldLightPos,
127  const osg::Vec3 &worldLightDir,
128  const osg::Vec3 &worldLightUp
129  = osg::Vec3(0,1,0) );
130 
131  virtual void frameShadowCastingCamera
132  ( const osg::Camera* cameraMain, osg::Camera* cameraShadow, int pass = 1 );
133 
134  void cutScenePolytope( const osg::Matrix & matrix,
135  const osg::Matrix & inverse,
136  const osg::BoundingBox &bb =
137  osg::BoundingBox(-1,-1,-1,1,1,1) );
138 
139  osg::BoundingBox computeScenePolytopeBounds();
140  osg::BoundingBox computeScenePolytopeBounds(const osg::Matrix& m);
141 
142  // Utility methods for adjusting projection matrices
143 
144  // Modify projection matrix so that some output subrange
145  // is remapped to whole clip space (-1..1,-1..1,-1..1).
146  // Bit mask can be used to limit remaping to selected bounds only.
147  static void trimProjection
148  ( osg::Matrixd & projection, osg::BoundingBox subrange,
149  unsigned int trimMask = (1|2|4|8|16|32)
150  /*1=left|2=right|4=bottom|8=top|16=near|32=far*/);
151 
152  static void clampProjection
153  ( osg::Matrixd & projection, float n = 0, float f = FLT_MAX );
154 
155  static void extendProjection
156  ( osg::Matrixd & projection, osg::Viewport * viewport, const osg::Vec2& margin );
157  };
158 
160 };
161 
162 } // namespace osgShadow
163 
164 #endif
void setMinLightMargin(float minLightMargin)
void setModellingSpaceToWorldTransform(const osg::Matrix &modellingSpaceToWorld)
#define META_ViewDependentShadowTechniqueData(ShadowTechnique, TechniqueData)
#define OSGSHADOW_EXPORT
Definition: Export.h:39
#define META_Object(library, name)
Definition: Object.h:42
void setMaxFarPlane(float maxFarPlane)
ShadowReceivingCoarseBoundAccuracy getShadowReceivingCoarseBoundAccuracy() const
const osg::Matrix & getModellingSpaceToWorldTransform(void) const
ShadowReceivingCoarseBoundAccuracy _shadowReceivingCoarseBoundAccuracy
std::vector< osg::Vec3d > _sceneReceivingShadowPolytopePoints