source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/ShadowMapping.h @ 2932

Revision 2932, 2.7 KB checked in by mattausch, 16 years ago (diff)
Line 
1#ifndef _ShadowMap_H__
2#define _ShadowMap_H__
3
4#include "common.h"
5#include "glInterface.h"
6#include "AxisAlignedBox3.h"
7#include "Matrix4x4.h"
8
9#include <Cg/cg.h>
10#include <Cg/cgGL.h>
11
12
13
14namespace CHCDemoEngine
15{
16
17class FrameBufferObject;
18class RenderTraverser;
19class Vector3;
20class Camera;
21class Light;
22
23/** This class implements a the computation of single shadow map
24*/
25class ShadowMap
26{
27
28public:
29        /** Constructor taking the scene boundig box and the current camera.
30                The shadow map has resolution size * size.
31        */
32        ShadowMap(Light *light, int size, const AxisAlignedBox3 &sceneBox, Camera *cam);
33
34        ~ShadowMap();
35        /** Computes the shadow map
36        */
37        void ComputeShadowMap(RenderTraverser *traverser, const Matrix4x4 &projView);
38        /** Returns computed shadow color texture.
39        */
40        unsigned int GetShadowColorTexture() const;
41       
42        unsigned int GetDepthTexture() const;
43
44        /** Returns computed texture matrix. It must be applied on the
45                the world space positions.
46               
47                The texture     matrix can be directly applied if the world space position
48                is available (deferred shading), otherwise it must be multiplied with
49                the inverse model matrix.
50        */
51        void GetTextureMatrix(Matrix4x4 &m) const;
52        /** Return shadow size.
53        */
54        int GetSize() const { return mSize; }
55
56        Camera *GetShadowCamera() const { return mShadowCam; }
57
58        void RenderShadowView(RenderTraverser *renderer, const Matrix4x4 &projView);
59
60
61        static void DrawPolys();
62
63
64protected:
65
66
67        /** Calculates the intersection of the frustum with the box,
68                returns resultin polyhedron as array of polygons.
69        */
70        Polyhedron *CalcClippedFrustum(const AxisAlignedBox3 &box) const;
71       
72        bool CalcLightProjection(Matrix4x4 &lightProj);
73
74        Matrix4x4 CalcLispSMTransform(const Matrix4x4 &lightProjView,
75                                          const AxisAlignedBox3 &bounds,
76                                                                  const VertexArray &pts);
77
78        void IncludeLightVolume(const Polyhedron &polyhedron,
79                                    VertexArray &frustumPoints,
80                                                        const Vector3 lightDir,
81                                                        const AxisAlignedBox3 &sceneBox);
82
83        float ComputeN(const AxisAlignedBox3 &extremalPoints) const;
84
85        Vector3 GetNearCameraPointE(const VertexArray &pts) const;
86
87        Vector3 GetProjViewDir(const Matrix4x4 &lightSpace, const VertexArray &pts) const;
88
89        static void DrawPoly(Polyhedron *poly, const Vector3 &color);
90
91
92
93        //////////////
94
95        /// the scene bounding box
96        AxisAlignedBox3 mSceneBox;
97        /// fbo storing the shadow texture
98        FrameBufferObject *mFbo;
99        /// size of the shadow map
100        int mSize;
101
102        Camera *mShadowCam;
103        /// the texture matrix
104        Matrix4x4 mTextureMatrix;
105        /// the used light
106        Light *mLight;
107        /// the scene camera
108        Camera *mCamera;
109
110        Matrix4x4 mLightProjView;
111};
112
113} // namespace
114#endif // _ShadowMapping_H__
Note: See TracBrowser for help on using the repository browser.