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

Revision 2911, 4.8 KB checked in by mattausch, 16 years ago (diff)
RevLine 
[2767]1#include "Visualization.h"
2#include "glInterface.h"
3#include "Camera.h"
4#include "SceneEntity.h"
5#include "Bvh.h"
[2787]6#include "RenderState.h"
[2911]7#include "ShadowMapping.h"
[2787]8
[2767]9#include <stack>
10
11
12using namespace std;
13
14
[2776]15namespace CHCDemoEngine
[2767]16{
17
[2788]18
[2790]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
[2767]66/******************************************************/
[2806]67/*           Vizualization implementation             */
[2767]68/******************************************************/
69
70
71Visualization::Visualization(Bvh *bvh,
72                                                         Camera *camera,
73                                                         Camera *vizCamera,
74                                                         RenderState *renderState):
[2787]75mBvh(bvh),
76mCamera(camera),
77mVizCamera(vizCamera),
78mRenderState(renderState),
79mFrameId(0)
[2767]80{
81}
82
83
[2796]84Visualization::~Visualization()
85{
86}
87
88
[2767]89void Visualization::SetHierarchy(Bvh *bvh)
90{
91        mBvh = bvh;
92}
93
94
95void Visualization::SetRenderState(RenderState *state)
96{
97        mRenderState = state;
98}
99
100
[2787]101void Visualization::SetFrameId(int frameId)
102{
103        mFrameId = frameId;
104}
105
106
[2767]107void Visualization::Render()
108{
109        stack<BvhNode *> tStack;
110        tStack.push(mBvh->GetRoot());
111
[2787]112        glEnableClientState(GL_VERTEX_ARRAY);
113        glEnableClientState(GL_NORMAL_ARRAY);
114
[2767]115        while (!tStack.empty())
116        {
117                BvhNode *node = tStack.top();
118                tStack.pop();
119
[2771]120                if (!node->IsVirtualLeaf())
[2767]121                {
122                        BvhInterior *interior = static_cast<BvhInterior *>(node);
123
124                        tStack.push(interior->GetFront());
125                        tStack.push(interior->GetBack());
126                }
127                else
128                {
[2787]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                        }
[2767]140                }
141        }
[2787]142
143        glDisableClientState(GL_VERTEX_ARRAY);
144        glDisableClientState(GL_NORMAL_ARRAY);
[2767]145
146
[2806]147        mRenderState->Reset();
148
[2790]149        glPushAttrib(GL_CURRENT_BIT);
[2806]150        glDisable(GL_LIGHTING);
151        glDisable(GL_DEPTH_TEST);
[2790]152
[2911]153        //RenderFrustum();
[2891]154
[2911]155        ShadowMap::DrawPolys();
156
[2891]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
[2806]172        //RenderBoxForViz(mBvh->GetBox());
[2790]173       
174        glPopAttrib();
[2767]175}
176
177
178void Visualization::RenderFrustum()
179{
[2788]180        glColor3f(1.0f, 0.0f, 0.0f);
181
[2767]182        Vector3 ftl, ftr, fbl, fbr, ntl, ntr, nbl, nbr;
183        mCamera->ComputePoints(ftl, ftr, fbl, fbr, ntl, ntr, nbl, nbr);
184
[2889]185        //mCamera->SetF
[2767]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.