root/OpenSceneGraph/trunk/include/osgShadow/MinimalShadowMap @ 11176

Revision 11176, 6.4 kB (checked in by robert, 4 years ago)

From Wojcoech Lewandowski, "Attched are aimShadowCastingCamera() call changes, I have described in former post. Basically now MinimalShadowMap? overrides first variant and keeps second. So both variants of aimShadowCastingCamera are clearly defined in MinimalShadowMap::ViewData? scope. This way compilers have no problem and code looks less obscure. Changes made against the trunk."

Line 
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
22namespace osgShadow {
23
24class OSGSHADOW_EXPORT MinimalShadowMap : public StandardShadowMap
25{
26    public :
27        /** Convenient typedef used in definition of ViewData struct and methods */
28        typedef MinimalShadowMap  ThisClass;
29        /** Convenient typedef used in definition of ViewData struct and methods */
30        typedef StandardShadowMap BaseClass;
31
32        /** Classic OSG constructor */
33        MinimalShadowMap();
34
35        /** Classic OSG cloning constructor */
36        MinimalShadowMap(
37            const MinimalShadowMap& msm,
38            const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
39
40        /** Declaration of standard OSG object methods */
41        META_Object( ViewDependentShadow, MinimalShadowMap );
42
43        void setModellingSpaceToWorldTransform( const osg::Matrix & modellingSpaceToWorld )
44            { _modellingSpaceToWorld = modellingSpaceToWorld; }
45
46        const osg::Matrix & getModellingSpaceToWorldTransform( void )
47            { return _modellingSpaceToWorld; }
48
49        float getMaxFarPlane( )
50            { return _maxFarPlane; }
51
52        void setMaxFarPlane( float maxFarPlane )
53            { _maxFarPlane = maxFarPlane; }
54
55        float getMinLightMargin( )
56            { return _minLightMargin; }
57
58        void setMinLightMargin( float minLightMargin )
59            { _minLightMargin = minLightMargin; }
60
61        enum ShadowReceivingCoarseBoundAccuracy {
62            EMPTY_BOX,
63            BOUNDING_SPHERE,
64            BOUNDING_BOX,
65            DEFAULT_ACCURACY = BOUNDING_BOX
66        };
67
68        void  setShadowReceivingCoarseBoundAccuracy
69                ( ShadowReceivingCoarseBoundAccuracy accuracy )
70                    { _shadowReceivingCoarseBoundAccuracy = accuracy; }
71
72        ShadowReceivingCoarseBoundAccuracy
73                getShadowReceivingCoarseBoundAccuracy()           
74                    { return _shadowReceivingCoarseBoundAccuracy; }
75
76    protected:
77        /** Classic protected OSG destructor */
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
95        osg::Matrix                        _modellingSpaceToWorld;
96        float                              _maxFarPlane;
97        float                              _minLightMargin;
98        ShadowReceivingCoarseBoundAccuracy _shadowReceivingCoarseBoundAccuracy;
99
100        struct OSGSHADOW_EXPORT ViewData: public BaseClass::ViewData
101        {
102            osg::Matrix                      *_modellingSpaceToWorldPtr;
103            float                            *_maxFarPlanePtr;
104            float                            *_minLightMarginPtr;
105
106            ConvexPolyhedron                 _sceneReceivingShadowPolytope;
107            std::vector< osg::Vec3d >        _sceneReceivingShadowPolytopePoints;
108
109            osg::Matrixd                     _clampedProjection;
110
111            virtual void init( ThisClass * st, osgUtil::CullVisitor * cv );
112
113            virtual osg::BoundingBox computeShadowReceivingCoarseBounds( );
114
115            virtual void cullShadowReceivingScene( );
116
117            virtual void aimShadowCastingCamera(
118                const osg::BoundingSphere &bounds,
119                const osg::Light *light,
120                const osg::Vec4 &worldLightPos,
121                const osg::Vec3 &worldLightDir,
122                const osg::Vec3 &worldLightUp = osg::Vec3(0,1,0) );
123
124            virtual void aimShadowCastingCamera( const osg::Light *light,
125                const osg::Vec4 &worldLightPos,
126                const osg::Vec3 &worldLightDir,
127                const osg::Vec3 &worldLightUp
128                = osg::Vec3(0,1,0) );
129
130            virtual void frameShadowCastingCamera
131                ( const osg::Camera* cameraMain, osg::Camera* cameraShadow, int pass = 1 );
132
133            void cutScenePolytope( const osg::Matrix & matrix,
134                const osg::Matrix & inverse,
135                const osg::BoundingBox &bb =
136                osg::BoundingBox(-1,-1,-1,1,1,1) );
137
138            osg::BoundingBox computeScenePolytopeBounds
139                ( const osg::Matrix & m = *(osg::Matrix*)(NULL) );   
140
141            // Utility methods for adjusting projection matrices
142
143            // Modify projection matrix so that some output subrange
144            // is remapped to whole clip space (-1..1,-1..1,-1..1).
145            // Bit mask can be used to limit remaping to selected bounds only.
146            static void trimProjection
147                ( osg::Matrixd & projection, osg::BoundingBox subrange,
148                unsigned int trimMask = (1|2|4|8|16|32)
149                /*1=left|2=right|4=bottom|8=top|16=near|32=far*/);
150
151            static void clampProjection
152                ( osg::Matrixd & projection, float n = 0, float f = FLT_MAX );
153
154            static void extendProjection
155                ( osg::Matrixd & projection, osg::Viewport * viewport, const osg::Vec2& margin );
156        };
157
158        META_ViewDependentShadowTechniqueData( ThisClass, ThisClass::ViewData )
159};
160
161} // namespace osgShadow
162
163#endif
Note: See TracBrowser for help on using the browser.