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

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