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

Revision 9113, 6.1 kB (checked in by robert, 6 years ago)

From Csaba Halasz, adding missing export directives

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( const osg::Light *light,
118                const osg::Vec4 &worldLightPos,
119                const osg::Vec3 &worldLightDir,
120                const osg::Vec3 &worldLightUp
121                = osg::Vec3(0,1,0) );
122
123            virtual void frameShadowCastingCamera
124                ( const osg::Camera* cameraMain, osg::Camera* cameraShadow, int pass = 1 );
125
126            void cutScenePolytope( const osg::Matrix & matrix,
127                const osg::Matrix & inverse,
128                const osg::BoundingBox &bb =
129                osg::BoundingBox(-1,-1,-1,1,1,1) );
130
131            osg::BoundingBox computeScenePolytopeBounds
132                ( const osg::Matrix & m = *(osg::Matrix*)(NULL) );   
133
134            // Utility methods for adjusting projection matrices
135
136            // Modify projection matrix so that some output subrange
137            // is remapped to whole clip space (-1..1,-1..1,-1..1).
138            // Bit mask can be used to limit remaping to selected bounds only.
139            static void trimProjection
140                ( osg::Matrixd & projection, osg::BoundingBox subrange,
141                unsigned int trimMask = (1|2|4|8|16|32)
142                /*1=left|2=right|4=bottom|8=top|16=near|32=far*/);
143
144            static void clampProjection
145                ( osg::Matrixd & projection, float n = 0, float f = FLT_MAX );
146
147            static void extendProjection
148                ( osg::Matrixd & projection, osg::Viewport * viewport, const osg::Vec2& margin );
149        };
150
151        META_ViewDependentShadowTechniqueData( ThisClass, ThisClass::ViewData )
152};
153
154} // namespace osgShadow
155
156#endif
Note: See TracBrowser for help on using the browser.