source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/Visualization.cpp @ 2911

Revision 2911, 4.8 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include "Visualization.h"
2#include "glInterface.h"
3#include "Camera.h"
4#include "SceneEntity.h"
5#include "Bvh.h"
6#include "RenderState.h"
7#include "ShadowMapping.h"
8
9#include <stack>
10
11
12using namespace std;
13
14
15namespace CHCDemoEngine
16{
17
18
19static void RenderBoxForViz(const AxisAlignedBox3 &box)
20{
21        glBegin(GL_LINE_LOOP);
22        glVertex3d(box.Min().x, box.Max().y, box.Min().z);
23        glVertex3d(box.Max().x, box.Max().y, box.Min().z);
24        glVertex3d(box.Max().x, box.Min().y, box.Min().z);
25        glVertex3d(box.Min().x, box.Min().y, box.Min().z);
26        glEnd();
27
28        glBegin(GL_LINE_LOOP);
29        glVertex3d(box.Min().x, box.Min().y, box.Max().z);
30        glVertex3d(box.Max().x, box.Min().y, box.Max().z);
31        glVertex3d(box.Max().x, box.Max().y, box.Max().z);
32        glVertex3d(box.Min().x, box.Max().y, box.Max().z);
33        glEnd();
34
35        glBegin(GL_LINE_LOOP);
36        glVertex3d(box.Max().x, box.Min().y, box.Min().z);
37        glVertex3d(box.Max().x, box.Min().y, box.Max().z);
38        glVertex3d(box.Max().x, box.Max().y, box.Max().z);
39        glVertex3d(box.Max().x, box.Max().y, box.Min().z);
40        glEnd();
41
42        glBegin(GL_LINE_LOOP);
43        glVertex3d(box.Min().x, box.Min().y, box.Min().z);
44        glVertex3d(box.Min().x, box.Min().y, box.Max().z);
45        glVertex3d(box.Min().x, box.Max().y, box.Max().z);
46        glVertex3d(box.Min().x, box.Max().y, box.Min().z);
47        glEnd();
48
49        glBegin(GL_LINE_LOOP);
50        glVertex3d(box.Min().x, box.Min().y, box.Min().z);
51        glVertex3d(box.Max().x, box.Min().y, box.Min().z);
52        glVertex3d(box.Max().x, box.Min().y, box.Max().z);
53        glVertex3d(box.Min().x, box.Min().y, box.Max().z);
54        glEnd();
55
56        glBegin(GL_LINE_LOOP);
57        glVertex3d(box.Min().x, box.Max().y, box.Min().z);
58        glVertex3d(box.Max().x, box.Max().y, box.Min().z);
59        glVertex3d(box.Max().x, box.Max().y, box.Max().z);
60        glVertex3d(box.Min().x, box.Max().y, box.Max().z);
61
62        glEnd();
63}
64
65
66/******************************************************/
67/*           Vizualization implementation             */
68/******************************************************/
69
70
71Visualization::Visualization(Bvh *bvh,
72                                                         Camera *camera,
73                                                         Camera *vizCamera,
74                                                         RenderState *renderState):
75mBvh(bvh),
76mCamera(camera),
77mVizCamera(vizCamera),
78mRenderState(renderState),
79mFrameId(0)
80{
81}
82
83
84Visualization::~Visualization()
85{
86}
87
88
89void Visualization::SetHierarchy(Bvh *bvh)
90{
91        mBvh = bvh;
92}
93
94
95void Visualization::SetRenderState(RenderState *state)
96{
97        mRenderState = state;
98}
99
100
101void Visualization::SetFrameId(int frameId)
102{
103        mFrameId = frameId;
104}
105
106
107void Visualization::Render()
108{
109        stack<BvhNode *> tStack;
110        tStack.push(mBvh->GetRoot());
111
112        glEnableClientState(GL_VERTEX_ARRAY);
113        glEnableClientState(GL_NORMAL_ARRAY);
114
115        while (!tStack.empty())
116        {
117                BvhNode *node = tStack.top();
118                tStack.pop();
119
120                if (!node->IsVirtualLeaf())
121                {
122                        BvhInterior *interior = static_cast<BvhInterior *>(node);
123
124                        tStack.push(interior->GetFront());
125                        tStack.push(interior->GetBack());
126                }
127                else
128                {
129                        if (node->GetLastRenderedFrame() == mFrameId)
130                        {
131                                int geometrySize;
132                                SceneEntity **entities = mBvh->GetGeometry(node, geometrySize);
133
134                                for (int i = 0; i < geometrySize; ++ i)
135                                {
136                                        SceneEntity *ent = entities[i];
137                                        ent->Render(mRenderState);
138                                }               
139                        }
140                }
141        }
142
143        glDisableClientState(GL_VERTEX_ARRAY);
144        glDisableClientState(GL_NORMAL_ARRAY);
145
146
147        mRenderState->Reset();
148
149        glPushAttrib(GL_CURRENT_BIT);
150        glDisable(GL_LIGHTING);
151        glDisable(GL_DEPTH_TEST);
152
153        //RenderFrustum();
154
155        ShadowMap::DrawPolys();
156
157        Vector3 pos = mCamera->GetPosition();
158
159        // coordinates
160        glColor3f(0.0f, 1.0f, 0.0f);
161        glBegin(GL_LINES);
162        glVertex3d(pos.x, pos.y, pos.z);
163        glVertex3d(pos.x + 100, pos.y, pos.z);
164        glEnd();
165
166        glColor3f(0.0f, 0.0f, 1.0f);
167        glBegin(GL_LINES);
168        glVertex3d(pos.x, pos.y, pos.z);
169        glVertex3d(pos.x, pos.y + 100, pos.z);
170        glEnd();
171
172        //RenderBoxForViz(mBvh->GetBox());
173       
174        glPopAttrib();
175}
176
177
178void Visualization::RenderFrustum()
179{
180        glColor3f(1.0f, 0.0f, 0.0f);
181
182        Vector3 ftl, ftr, fbl, fbr, ntl, ntr, nbl, nbr;
183        mCamera->ComputePoints(ftl, ftr, fbl, fbr, ntl, ntr, nbl, nbr);
184
185        //mCamera->SetF
186        glLineWidth(2);
187
188        glBegin(GL_LINE_LOOP);
189        glVertex3d(fbl.x, fbl.y, fbl.z);
190        glVertex3d(ftl.x, ftl.y, ftl.z);
191        glVertex3d(ntl.x, ntl.y, ntl.z);
192        glVertex3d(nbl.x, nbl.y, nbl.z);
193        glEnd();
194
195        glBegin(GL_LINE_LOOP);
196        glVertex3d(fbr.x, fbr.y, fbr.z);
197        glVertex3d(ftr.x, ftr.y, ftr.z);
198        glVertex3d(ntr.x, ntr.y, ntr.z);
199        glVertex3d(nbr.x, nbr.y, nbr.z);
200        glEnd();
201
202        glBegin(GL_LINE_LOOP);
203        glVertex3d(fbr.x, fbr.y, fbr.z);
204        glVertex3d(fbl.x, fbl.y, fbl.z);
205        glVertex3d(nbl.x, nbl.y, nbl.z);
206        glVertex3d(nbr.x, nbr.y, nbr.z);
207        glEnd();
208
209        glBegin(GL_LINE_LOOP);
210        glVertex3d(ftr.x, ftr.y, ftr.z);
211        glVertex3d(ftl.x, ftl.y, ftl.z);
212        glVertex3d(ntl.x, ntl.y, ntl.z);
213        glVertex3d(ntr.x, ntr.y, ntr.z);
214        glEnd();
215}
216
217
218}
Note: See TracBrowser for help on using the repository browser.