Ignore:
Timestamp:
06/29/08 23:48:17 (16 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneQuery.cpp

    r2800 r2808  
    77#include <IL/il.h> 
    88#include <assert.h> 
     9#include "RenderTexture.h" 
     10 
     11 
     12using namespace std; 
     13 
     14int texWidth = 2048; 
     15int texHeight = 2048; 
     16 
     17/*static void cgErrorCallback() 
     18{ 
     19        CGerror lastError = cgGetError(); 
     20 
     21        if(lastError) 
     22        { 
     23                printf("%s\n\n", cgGetErrorString(lastError)); 
     24                printf("%s\n", cgGetLastListing(sCgContext)); 
     25                printf("Cg error, exiting...\n"); 
     26 
     27                exit(0); 
     28        } 
     29}*/ 
     30 
     31 
     32static void PrintGLerror(char *msg) 
     33{ 
     34        GLenum errCode; 
     35        const GLubyte *errStr; 
     36         
     37        if ((errCode = glGetError()) != GL_NO_ERROR)  
     38        { 
     39                errStr = gluErrorString(errCode); 
     40                fprintf(stderr,"OpenGL ERROR: %s: %s\n", errStr, msg); 
     41        } 
     42} 
    943 
    1044 
     
    2660{ 
    2761 
    28 using namespace std; 
    29  
    30  
    31 //const static int viewport[4] = {0, 0, 512, 512}; 
    32 const static int viewport[4] = {0, 0, 1024, 768}; 
    33 //const static int viewport[4] = {0, 0, 2048, 2048}; 
    34  
    35  
    36  
    37 SceneQuery::SceneQuery(const AxisAlignedBox3 &sceneBox, RenderTraverser *renderer):  
    38 mSceneBox(sceneBox), mDepth(NULL) 
    39 { 
    40         Prepare(renderer); 
    41 } 
    42  
    43  
    44 bool 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  
    70 void 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 /* 
     62 
     63void GrabDepthBuffer(float *data, RenderTexture *rt) 
     64{ 
     65        rt->BindDepth(); 
     66        rt->EnableTextureTarget(); 
     67 
     68        const int texFormat = GL_DEPTH_COMPONENT; 
     69        glGetTexImage(rt->GetTextureTarget(), 0, texFormat, GL_FLOAT, data); 
     70 
     71        rt->DisableTextureTarget(); 
     72} 
     73 
     74 
     75void ExportDepthBuffer(float *data) 
     76{ 
    11477        startil(); 
    11578 
    116         if (!ilTexImage(viewport[2], viewport[3], 1, 1, IL_LUMINANCE, IL_UNSIGNED_BYTE, mDepth)) 
     79        ILstring filename = ILstring("depth.tga"); 
     80        ilRegisterType(IL_FLOAT); 
     81 
     82        const int depth = 1; 
     83        const int bpp = 1; 
     84 
     85        if (!ilTexImage(texWidth, texHeight, depth, bpp, IL_LUMINANCE, IL_FLOAT, data)) 
    11786        { 
    11887                cerr << "IL error " << ilGetError() << endl; 
     
    12190        } 
    12291 
    123         ILstring writename = ILstring("out.tga"); 
    124  
    125         ilSetInteger(IL_TGA_RLE, 1); 
    126         if (!ilSaveImage(writename)) 
     92        if (!ilSaveImage(filename)) 
    12793        { 
    12894                cerr << "TGA write error " << ilGetError() << endl; 
     
    13096 
    13197        stopil(); 
    132 */ 
     98 
     99        cout << "exported depth buffer" << endl; 
     100} 
     101 
     102 
     103SceneQuery::SceneQuery(const AxisAlignedBox3 &sceneBox, RenderTraverser *renderer):  
     104mSceneBox(sceneBox), mDepth(NULL) 
     105{ 
     106        Prepare(renderer); 
     107} 
     108 
     109 
     110bool SceneQuery::CalcIntersection(Vector3 &pt) 
     111{ 
     112        const int px = (pt.x - mSceneBox.Min(0)) * (texWidth - 1) / mSceneBox.Size(0); 
     113        const int py = (pt.y - mSceneBox.Min(1)) * (texHeight - 1) / mSceneBox.Size(1); 
     114 
     115        float d = mDepth[px + py * texHeight]; 
     116 
     117        static float depth = d; 
     118 
     119        if (d > 0) 
     120        { 
     121                // temporal smoothing of depth values 
     122                const float x = 0.5f; 
     123                depth = d * x + depth * (1.0f - x); 
     124 
     125                const float offs = mSceneBox.Size(2) * 5e-2f; 
     126                pt.z =  mSceneBox.Max().z - mSceneBox.Size().z * depth + offs; 
     127 
     128                return true; 
     129        } 
     130 
     131        return false; 
     132} 
     133 
     134 
     135void SceneQuery::Prepare(RenderTraverser *renderer) 
     136{ 
     137        cout << "Preparing scene queries" << endl; 
     138 
     139        RenderTexture *depthTexture = new RenderTexture(texWidth, texHeight, true, true); 
     140 
     141#ifdef ATI 
     142        depthTexture->Initialize(true, true, false, false, false, 8, 8, 8, 8, RenderTexture::RT_COPY_TO_TEXTURE); 
     143#else 
     144        depthTexture->Initialize(true, true, false, false, false, 8, 8, 8, 8);//, RenderTexture::RT_COPY_TO_TEXTURE); 
     145#endif 
     146 
     147        PrintGLerror("Init"); 
     148 
     149 
     150        const float xlen = mSceneBox.Size().x * 0.5f; 
     151        const float ylen = mSceneBox.Size().y * 0.5f; 
     152         
     153        Camera *orthoCam = new Camera(xlen, ylen); 
     154        orthoCam->SetOrtho(true); 
     155 
     156        orthoCam->SetNear(0.0f); 
     157        orthoCam->Yaw(M_PI * 0.5f); 
     158 
     159        Vector3 pos = Vector3(mSceneBox.Center().x, mSceneBox.Center().y, mSceneBox.Max().z); 
     160        orthoCam->SetPosition(pos); 
     161 
     162        depthTexture->BeginCapture(); 
     163 
     164        glViewport(0, 0, texWidth, texHeight); 
     165 
     166        glClearColor(1, 1, 1, 1); 
     167        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     168 
     169        glFrontFace(GL_CCW); 
     170        glCullFace(GL_BACK); 
     171 
     172        glDisable(GL_CULL_FACE); 
     173        //glEnable(GL_CULL_FACE); 
     174 
     175        glShadeModel(GL_FLAT); 
     176        glEnable(GL_DEPTH_TEST); 
     177 
     178        glMatrixMode(GL_PROJECTION); 
     179        glLoadIdentity(); 
     180         
     181        glOrtho(-xlen, xlen, -ylen, ylen, 0.0f, mSceneBox.Size().z);  
     182         
     183        glMatrixMode(GL_MODELVIEW); 
     184         
     185        orthoCam->SetupCameraView(); 
     186 
     187        mDepth = new float[texHeight * texWidth]; 
     188 
     189        //renderer->SetCamera(orthoCam); 
     190        renderer->RenderScene(); 
     191 
     192        depthTexture->EndCapture(); 
     193 
     194        GrabDepthBuffer(mDepth, depthTexture); 
     195        //ExportDepthBuffer(mDepth); 
     196        //PrintGLerror("grab"); 
     197 
     198        DEL_PTR(depthTexture); 
    133199        DEL_PTR(orthoCam); 
    134200} 
    135201 
    136 } 
     202 
     203 
     204 
     205} 
Note: See TracChangeset for help on using the changeset viewer.