source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneQuery.cpp @ 2800

Revision 2800, 3.0 KB checked in by mattausch, 16 years ago (diff)

friendly culling debug version with timers, no materials

Line 
1#include "SceneQuery.h"
2#include "glInterface.h"
3#include "Vector3.h"
4#include "Camera.h"
5#include "SceneQuery.h"
6#include "RenderTraverser.h"
7#include <IL/il.h>
8#include <assert.h>
9
10
11void startil()
12{
13        ilInit();
14        assert(ilGetError() == IL_NO_ERROR);
15}
16
17
18void stopil()
19{
20        ilShutDown();
21        assert(ilGetError() == IL_NO_ERROR);
22}
23
24
25namespace CHCDemoEngine
26{
27
28using namespace std;
29
30
31//const static int viewport[4] = {0, 0, 512, 512};
32const static int viewport[4] = {0, 0, 1024, 768};
33//const static int viewport[4] = {0, 0, 2048, 2048};
34
35
36
37SceneQuery::SceneQuery(const AxisAlignedBox3 &sceneBox, RenderTraverser *renderer):
38mSceneBox(sceneBox), mDepth(NULL)
39{
40        Prepare(renderer);
41}
42
43
44bool SceneQuery::CalcIntersection(Vector3 &pt)
45{
46        int px = (pt.x - mSceneBox.Min(0)) * (viewport[2] - 1) / mSceneBox.Size(0);
47        int py = (pt.y - mSceneBox.Min(1)) * (viewport[3] - 1) / mSceneBox.Size(1);
48
49        unsigned char d = mDepth[px + py * viewport[2]];
50
51        const float offs = mSceneBox.Size(2) * 1e-1f;
52
53        static float depth = (float)d;
54
55        if (d > 0)
56        {
57                const float x = 0.1f;
58                depth = depth * x + d * (1.0f - x);
59                pt.z =  mSceneBox.Max().z - mSceneBox.Size().z * depth / 255.0f + offs;
60                //cout << "new depth " << pt.z << " (" << d << ")" << endl;
61
62                return true;
63        }
64        //cout << "invalid depth: " << d << endl;
65
66        return false;
67}
68
69
70void SceneQuery::Prepare(RenderTraverser *renderer)
71{
72        cout << "Preparing scene queries" << endl;
73
74        const float xlen = mSceneBox.Size().x * 0.5f;
75        const float ylen = mSceneBox.Size().y * 0.5f;
76       
77        Camera *orthoCam = new Camera(xlen, ylen);
78        orthoCam->SetOrtho(true);
79
80        orthoCam->SetNear(0.0f);
81        orthoCam->Yaw(M_PI * 0.5f);
82
83        Vector3 pos = Vector3(mSceneBox.Center().x, mSceneBox.Center().y, mSceneBox.Max().z);
84        orthoCam->SetPosition(pos);
85
86        //glPixelStorei(GL_PACK_ROW_LENGTH, viewport[2]);
87        glPixelStorei(GL_PACK_ALIGNMENT, 1);
88        glReadBuffer(GL_BACK);
89
90        // hack: should create offscreen buffer for this
91        glViewport(0, 0, viewport[2], viewport[3]);
92
93        glMatrixMode(GL_PROJECTION);
94        glLoadIdentity();
95       
96        glOrtho(-xlen, xlen, -ylen, ylen, 0.0f, mSceneBox.Size().z);
97       
98        glMatrixMode(GL_MODELVIEW);
99       
100        orthoCam->SetupCameraView();
101
102        glClear(GL_DEPTH_BUFFER_BIT);
103
104        mDepth = new unsigned char[viewport[2] * viewport[3]];
105        //mDepth = new float[viewport[2] * viewport[3]];
106
107        //renderer->SetCamera(orthoCam);
108
109        renderer->RenderScene();
110
111        glReadPixels(0, 0, viewport[2], viewport[3], GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, mDepth);
112        //glReadPixels(0, 0, viewport[2], viewport[3], GL_DEPTH_COMPONENT, GL_FLOAT, mDepth);
113/*
114        startil();
115
116        if (!ilTexImage(viewport[2], viewport[3], 1, 1, IL_LUMINANCE, IL_UNSIGNED_BYTE, mDepth))
117        {
118                cerr << "IL error " << ilGetError() << endl;
119                stopil();
120                return;
121        }
122
123        ILstring writename = ILstring("out.tga");
124
125        ilSetInteger(IL_TGA_RLE, 1);
126        if (!ilSaveImage(writename))
127        {
128                cerr << "TGA write error " << ilGetError() << endl;
129        }
130
131        stopil();
132*/
133        DEL_PTR(orthoCam);
134}
135
136}
Note: See TracBrowser for help on using the repository browser.