Ignore:
Timestamp:
01/08/07 02:18:50 (17 years ago)
Author:
mattausch
Message:

worked on hw global lines

Location:
GTP/trunk/Lib/Vis/Preprocessing/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/src/GlobalLinesRenderer.cpp

    r1951 r1953  
    55#include "Preprocessor.h" 
    66#include "GlRenderer.h" 
     7// the devil library 
     8#include <IL/il.h> 
     9#include <IL/ilu.h> 
     10#include <IL/ilut.h> 
    711 
    812#include <Cg/cg.h> 
     
    2529static int texWidth = 256; 
    2630static int texHeight = 256; 
    27 static Vector3 scaleFactor = Vector3(2000.0f, 2000.0f, 2000.0f); 
    28 static Vector3 translFactor = Vector3(1000.0f, 1000.0f, 1000.0f); 
     31 
     32 
     33static void InitDevIl() 
     34{ 
     35        ilInit(); 
     36        ILuint ImageName; 
     37        ilGenImages(1, &ImageName); 
     38        ilBindImage(ImageName); 
     39        ilEnable(IL_FILE_OVERWRITE); 
     40 
     41        //  ilRegisterFormat(IL_RGBA); 
     42        //  ilRegisterType(IL_FLOAT); 
     43 
     44        //  ilEnable(IL_ORIGIN_SET); 
     45        //  ilOriginFunc(IL_ORIGIN_UPPER_LEFT); 
     46} 
     47 
    2948 
    3049static void cgErrorCallback() 
     
    6988} 
    7089 
     90 
     91void SetFrustum(int sizeX, int sizeY, float nearPlane, float farPlane) 
     92{ 
     93        glMatrixMode(GL_PROJECTION); 
     94        glLoadIdentity(); 
     95 
     96        glOrtho(-sizeX / 2, sizeX / 2,  
     97                        -sizeY / 2, sizeY / 2,  
     98                        nearPlane, farPlane); 
     99 
     100        /*glOrtho(0, sizeX,  
     101                    0, sizeY ,  
     102                        nearPlane, farPlane);*/ 
     103} 
    71104 
    72105void Display() 
     
    98131                cout << "max depth: " << globalLinesRenderer->mMaxDepth << endl; 
    99132                return; 
     133        case '3': 
     134                //globalLinesRenderer->ApplyDepthPeeling(Beam(), 0); 
     135                globalLinesRenderer->GrabDepthBuffer(globalLinesRenderer->mNewDepthBuffer, globalLinesRenderer->mNewTexture); 
    100136        default: 
    101137                return; 
    102138        } 
    103139} 
     140 
    104141 
    105142/*GlobalLinesRenderer::GlobalLinesRenderer(RenderTexture *buffer1,  
     
    107144                                                                                 Preprocessor *preprocessor, 
    108145                                                                                 GlRenderer *renderer) 
    109 : mNewBuffer(buffer1), mOldBuffer(buffer2), mPreprocessor(preprocessor), mMaxDepth(100), 
     146: mNewTexture(buffer1), mOldTexture(buffer2), mPreprocessor(preprocessor), mMaxDepth(100), 
    110147mRenderer(renderer) 
    111148{ 
    112149} 
    113150*/ 
     151 
     152 
    114153GlobalLinesRenderer::GlobalLinesRenderer(Preprocessor *preprocessor,  
    115154                                                                                 GlRenderer *renderer):  
    116 mNewBuffer(NULL),  
    117 mOldBuffer(NULL),  
     155mNewTexture(NULL),  
     156mOldTexture(NULL),  
    118157mMaxDepth(0),  
    119158mRenderer(renderer),  
     
    152191        glPushMatrix(); 
    153192        {  
    154                 glLoadIdentity(); 
    155                 //translFactor = Vector3(-1, -1, -1); 
    156                  
    157                 glScalef(scaleFactor.x, scaleFactor.y, scaleFactor.z); 
    158                 glTranslatef(translFactor.x, translFactor.y, translFactor.z); 
    159  
    160                 //cout << "scale: " << scaleFactor << endl; 
    161                 //cout << "transl: " << translFactor << endl; 
    162  
     193                //glLoadIdentity(); 
     194                         
    163195                //mRenderer->mUseFalseColors = true; 
    164196                ObjectContainer::const_iterator oit, oit_end = mPreprocessor->mObjects.end(); 
     
    177209void GlobalLinesRenderer::SwitchRenderTextures() 
    178210{ 
    179         RenderTexture *buffer = mOldBuffer; 
    180         mOldBuffer = mNewBuffer; 
    181         mNewBuffer = buffer; 
     211        RenderTexture *buffer = mOldTexture; 
     212        mOldTexture = mNewTexture; 
     213        mNewTexture = buffer; 
    182214} 
    183215 
     
    185217void GlobalLinesRenderer::InitGl() 
    186218{ 
     219        InitDevIl(); 
     220 
    187221        glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); 
    188222        glutInitWindowPosition(50, 50); 
     
    209243        AxisAlignedBox3 bbox = globalLinesRenderer->mPreprocessor->mKdTree->GetBox(); 
    210244         
    211         Vector3 center = bbox.Center(); 
    212         translFactor = -center; 
    213         //translFactor.z = 0; 
    214         //translFactor = Vector3(-1500, -1500, -1500); 
    215         float diag = 2.0f / Magnitude(bbox.Diagonal()); 
    216         scaleFactor = Vector3(diag, diag, diag); 
    217   
    218         Vector3 midPoint = Vector3(0, 0, 0); 
    219         Vector3 viewPoint = Vector3(0, 0, 500); 
    220  
     245        Vector3 midPoint = bbox.Center(); 
     246         
     247        const float sceneSize = Magnitude(bbox.Diagonal()); 
     248        Vector3 viewPoint = midPoint + Vector3(0.5 * sceneSize, 0, 0); 
     249         
    221250        cout << "mid point: " << midPoint << endl; 
    222251        cout << "view point: " << viewPoint << endl; 
     
    232261        glEnable(GL_CULL_FACE); 
    233262        glDisable(GL_LIGHTING); 
    234         //glEnable(GL_COLOR_MATERIAL); 
    235263        glDisable(GL_COLOR_MATERIAL); 
    236264        glEnable(GL_DEPTH_TEST);  
     
    241269        // Note that RT_COPY_TO_TEXTURE is required for depth textures on ATI hardware 
    242270         
    243         mNewBuffer = new RenderTexture(texWidth, texHeight, true, true); 
    244         //mNewBuffer->Initialize(true, true, false, true, true, 8, 8, 8, 8);//, RenderTexture::RT_COPY_TO_TEXTURE); 
    245         mNewBuffer->Initialize(true, true, false, true, true, 8, 8, 8, 8, RenderTexture::RT_COPY_TO_TEXTURE); 
    246          
    247         mOldBuffer = new RenderTexture(texWidth, texHeight, true, true); 
    248         //mOldBuffer ->Initialize(true, true, false, true, true, 8, 8, 8, 8);//, RenderTexture::RT_COPY_TO_TEXTURE); 
    249         mOldBuffer ->Initialize(true, true, false, true, true, 8, 8, 8, 8, RenderTexture::RT_COPY_TO_TEXTURE); 
     271        mNewTexture = new RenderTexture(texWidth, texHeight, true, true); 
     272        //mNewTexture->Initialize(true, true, false, true, true, 8, 8, 8, 8);//, RenderTexture::RT_COPY_TO_TEXTURE); 
     273        mNewTexture->Initialize(true, true, false, true, true, 8, 8, 8, 8, RenderTexture::RT_COPY_TO_TEXTURE); 
     274         
     275        mOldTexture = new RenderTexture(texWidth, texHeight, true, true); 
     276        //mOldTexture ->Initialize(true, true, false, true, true, 8, 8, 8, 8);//, RenderTexture::RT_COPY_TO_TEXTURE); 
     277        mOldTexture ->Initialize(true, true, false, true, true, 8, 8, 8, 8, RenderTexture::RT_COPY_TO_TEXTURE); 
    250278 
    251279        // Setup Cg 
     
    264292                cgCreateProgramFromFile(sCgContext,  
    265293                                                                CG_SOURCE, 
    266                                                                 mNewBuffer->IsRectangleTexture() ?  
     294                                                                mNewTexture->IsRectangleTexture() ?  
    267295                                                                "../src/depth_peelingRect.cg" : "../src/depth_peeling2d.cg",  
    268296                                                                GLEW_ARB_fragment_program ? CG_PROFILE_ARBFP1 : CG_PROFILE_FP30, 
     
    290318 
    291319    // setup the rendering context for the RenderTexture 
    292         mNewBuffer->BeginCapture(); 
    293         { 
    294                 Reshape(texWidth, texHeight); 
     320        mNewTexture->BeginCapture(); 
     321        { 
     322                //Reshape(texWidth, texHeight); 
     323                glViewport(0, 0, texWidth, texHeight); 
     324                SetFrustum(sceneSize, sceneSize, 1, sceneSize); 
     325 
    295326                glClearColor(0.1, 0.7, 0.2, 1); 
    296327                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     
    307338                                  midPoint.x, midPoint.y, midPoint.z,  
    308339                                  0, 1, 0); 
    309         } 
    310         mNewBuffer->EndCapture(); 
     340 
     341                //SetFrustum(sceneSize, sceneSize, 1, sceneSize); 
     342        } 
     343        mNewTexture->EndCapture(); 
    311344 
    312345        // setup the rendering context for the RenderTexture 
    313         mOldBuffer->BeginCapture(); 
    314         { 
    315                 Reshape(texWidth, texHeight); 
     346        mOldTexture->BeginCapture(); 
     347        { 
     348                glClearColor(0.1, 0.7, 0.2, 1); 
     349        
     350                //Reshape(texWidth, texHeight); 
     351                glViewport(0, 0, texWidth, texHeight); 
     352                SetFrustum(sceneSize, sceneSize, 1, sceneSize); 
     353 
    316354                glMatrixMode(GL_MODELVIEW); 
    317355                glLoadIdentity(); 
     
    327365                                  0, 1, 0); 
    328366 
    329                 glClearColor(0.6, 0.2, 0.2, 1); 
    330         } 
    331         mOldBuffer->EndCapture(); 
     367                //SetFrustum(sceneSize, sceneSize, 1, sceneSize); 
     368        } 
     369        mOldTexture->EndCapture(); 
    332370 
    333371        PrintGLerror("init"); 
     
    335373 
    336374 
    337 void GlobalLinesRenderer::ProcessDepthBuffer() 
    338 { 
     375Intersectable *GetObject(const int index) 
     376{ 
     377        return NULL; 
     378} 
     379 
     380 
     381void GlobalLinesRenderer::ProcessDepthBuffer(VssRayContainer &vssRays) 
     382{ 
     383        GrabDepthBuffer(mNewDepthBuffer, mNewTexture); 
     384        GrabDepthBuffer(mOldDepthBuffer, mOldTexture); 
     385 
     386        GrabItemBuffer(mNewItemBuffer, mNewTexture); 
     387        GrabItemBuffer(mOldItemBuffer, mOldTexture); 
     388 
     389        for (int y = 0; y < texHeight; ++ y) 
     390        { 
     391                for (int x = 0; x < texWidth; ++ x) 
     392                { 
     393                        const int index = x + texWidth * y; 
     394                        const float newDepth = mNewDepthBuffer[index]; 
     395                        const float oldDepth = mOldDepthBuffer[index]; 
     396 
     397                        float newDummy1 = mNear + (mFar - mNear) * newDepth; 
     398                        float oldDummy1 = mNear + (mFar - mNear) * oldDepth; 
     399 
     400                        float newDummy2 = x - texWidth / 2; 
     401                        float newDummy3 = y -  texHeight / 2; 
     402 
     403                        float oldDummy2 = newDummy2; 
     404                        float oldDummy3 = newDummy3; 
     405 
     406                        const Vector3 newPt = newDepth * mEyeVec + newDummy1 * mLeftVec + newDummy2 * mUpVec; 
     407                        const Vector3 oldPt = oldDepth * mEyeVec + oldDummy1 * mLeftVec + oldDummy2 * mUpVec; 
     408 
     409                        Intersectable *termObj1 = GetObject(mNewItemBuffer[index]); 
     410                        Intersectable *termObj2 = GetObject(mOldItemBuffer[index]); 
     411 
     412                        // create rays in both directions 
     413                        vssRays.push_back(new VssRay(oldPt, newPt, NULL, termObj1)); 
     414                        vssRays.push_back(new VssRay(newPt, oldPt, NULL, termObj2)); 
     415                } 
     416        } 
    339417} 
    340418 
     
    346424 
    347425 
     426void GlobalLinesRenderer::GrabDepthBuffer(float *data, RenderTexture *rt) 
     427{ 
     428        rt->BindDepth(); 
     429        rt->EnableTextureTarget(); 
     430        cout << "depth: " << mNewTexture->GetDepthBits() << endl; 
     431 
     432        const int texFormat = GL_DEPTH_COMPONENT; 
     433        glGetTexImage(mNewTexture->GetTextureTarget(), 0, texFormat, GL_FLOAT, data); 
     434 
     435        mNewTexture->DisableTextureTarget(); 
     436} 
     437 
     438 
     439void GlobalLinesRenderer::GrabItemBuffer(float *data, RenderTexture *rt) 
     440{ 
     441        rt->BindDepth(); 
     442        rt->EnableTextureTarget(); 
     443        cout << "depth: " << mNewTexture->GetDepthBits() << endl; 
     444 
     445        const int texFormat = GL_DEPTH_COMPONENT; 
     446        glGetTexImage(mNewTexture->GetTextureTarget(), 0, texFormat, GL_FLOAT, data); 
     447 
     448        mNewTexture->DisableTextureTarget(); 
     449} 
     450 
     451void GlobalLinesRenderer::ExportDepthBuffer() 
     452{ 
     453        mNewTexture->BindDepth(); 
     454        mNewTexture->EnableTextureTarget(); 
     455        cout << "depth: " << mNewTexture->GetDepthBits() << endl; 
     456 
     457        const bool components = 1;//mNewTexture->GetDepthBits() / 8; 
     458 
     459        float *data = new float[texWidth * texHeight * components]; 
     460        //const int texFormat = WGL_TEXTURE_DEPTH_COMPONENT_NV; 
     461        const int texFormat = GL_DEPTH_COMPONENT; 
     462        //const int texFormat = GL_RGBA; 
     463        glGetTexImage(mNewTexture->GetTextureTarget(), 0, texFormat, GL_FLOAT, data); 
     464 
     465        /*for (int i = texWidth * 123; i < texWidth * 124; ++ i) 
     466        { 
     467                cout << data[i] << " "; 
     468        } 
     469        cout << "Saving image " << texWidth << " " << texHeight << endl; 
     470*/ 
     471        string filename("depth.tga"); 
     472        ilRegisterType(IL_FLOAT); 
     473 
     474        const int depth = 1; 
     475        const int bpp = components; 
     476 
     477        ilTexImage(texWidth, texHeight, depth, bpp, IL_LUMINANCE, IL_FLOAT, data); 
     478        ilSaveImage((char *const)filename.c_str()); 
     479 
     480        cout << "finished" << endl; 
     481        delete data; 
     482        cout << "data deleted" << endl; 
     483        mNewTexture->DisableTextureTarget(); 
     484        PrintGLerror("grab texture"); 
     485} 
     486 
     487 
    348488void GlobalLinesRenderer::ApplyDepthPeeling(Beam &beam, const int samples) 
    349489{ 
    350         mNewBuffer->BeginCapture(); 
     490        mNewTexture->BeginCapture(); 
    351491        { 
    352492                //cgGLBindProgram(sCgPassThroughProgram); 
     
    354494                DrawGeometry(); 
    355495        } 
    356         mNewBuffer->EndCapture(); 
    357          
    358         //mNewBuffer->BindDepth(); 
    359         /*float *data = new float[texWidth * texHeight]; 
    360         //const int texFormat = WGL_TEXTURE_DEPTH_COMPONENT_NV; 
    361         const int texFormat = GL_LUMINANCE; 
    362         glGetTexImage(mNewBuffer->GetTextureTarget(), 0, texFormat, GL_FLOAT, data); 
    363          
    364         delete [] data; 
    365 */ 
     496        mNewTexture->EndCapture(); 
     497         
    366498        PrintGLerror("firstpass"); 
    367499 
    368         if (mNewBuffer->IsRectangleTexture()) cout << "rect" << endl; 
     500        if (mNewTexture->IsRectangleTexture()) cout << "rect" << endl; 
    369501 
    370502        for(int i = 0; i < mMaxDepth; ++ i)  
     
    373505                SwitchRenderTextures(); // switch pointer between rendertextures 
    374506 
    375                 mNewBuffer->BeginCapture(); 
     507                mNewTexture->BeginCapture(); 
    376508                { 
    377                         //if (mNewBuffer->IsDoubleBuffered())  
     509                        //if (mNewTexture->IsDoubleBuffered())  
    378510                        //      glDrawBuffer(GL_BACK); 
    379511 
     
    383515                //      cgGLBindProgram(sCgPassThroughProgram); 
    384516                        cgGLEnableProfile(sCgFragmentProfile); 
    385                         cgGLSetTextureParameter(sTextureParam, mOldBuffer->GetDepthTextureID()); 
     517                        cgGLSetTextureParameter(sTextureParam, mOldTexture->GetDepthTextureID()); 
    386518                        cgGLEnableTextureParameter(sTextureParam); 
    387519 
     
    394526                        cgGLDisableProfile(sCgFragmentProfile); 
    395527                } 
    396                 mNewBuffer->EndCapture(); 
     528                mNewTexture->EndCapture(); 
    397529        } 
    398530 
    399531        PrintGLerror("endpeeling"); 
    400532 
    401         //mNewBuffer->Bind(); 
    402         mNewBuffer->BindDepth(); 
    403         mNewBuffer->EnableTextureTarget(); 
     533        //mNewTexture->Bind(); 
     534        mNewTexture->BindDepth(); 
     535        mNewTexture->EnableTextureTarget(); 
    404536         
    405537        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    406538         
    407         if (mNewBuffer->IsRectangleTexture()) 
     539        if (mNewTexture->IsRectangleTexture()) 
    408540        { 
    409541                glBegin(GL_QUADS); 
    410542                glTexCoord2f(0, 0); glVertex3f(-1, -1, -0.5f); 
    411                 glTexCoord2f(mNewBuffer->GetWidth(), 0); glVertex3f( 1, -1, -0.5f); 
    412                 glTexCoord2f(mNewBuffer->GetWidth(), mNewBuffer->GetHeight()); glVertex3f( 1,  1, -0.5f); 
    413                 glTexCoord2f(0, mNewBuffer->GetHeight()); glVertex3f(-1, 1, -0.5f); 
     543                glTexCoord2f(mNewTexture->GetWidth(), 0); glVertex3f( 1, -1, -0.5f); 
     544                glTexCoord2f(mNewTexture->GetWidth(), mNewTexture->GetHeight()); glVertex3f( 1,  1, -0.5f); 
     545                glTexCoord2f(0, mNewTexture->GetHeight()); glVertex3f(-1, 1, -0.5f); 
    414546                glEnd(); 
    415547        } 
     
    424556        }   
    425557 
    426         mNewBuffer->DisableTextureTarget(); 
     558        mNewTexture->DisableTextureTarget(); 
    427559        PrintGLerror("displaytexture"); 
    428560} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/GlobalLinesRenderer.h

    r1949 r1953  
    44#include "common.h" 
    55#include "Containers.h" 
     6#include "Vector3.h" 
     7 
    68 
    79class RenderTexture; 
     
    4143 
    4244        void RenderObject(Intersectable *obj); 
    43 void DrawGeometry(); 
     45 
     46         
     47        /** Draws the geometry for one pass. 
     48        */ 
     49        void DrawGeometry(); 
    4450void Run(); 
    45 int mMaxDepth; 
     51void GrabDepthBuffer(float *data, RenderTexture *rt); 
     52void GrabItemBuffer(float *data, RenderTexture *rt); 
     53void ApplyDepthPeeling(Beam &beam, const int samples); 
     54void ExportDepthBuffer(); 
     55void ProcessDepthBuffer(VssRayContainer &vssRays); 
     56 
     57        int mMaxDepth; 
     58        Vector3 mEyeVec; 
     59        Vector3 mLeftVec; 
     60        Vector3 mUpVec; 
     61        float mFar; 
     62        float mNear; 
     63 
     64        float *mNewDepthBuffer; 
     65        float *mOldDepthBuffer; 
     66        float *mNewItemBuffer; 
     67        float *mOldItemBuffer; 
     68RenderTexture *mNewTexture; 
     69        RenderTexture *mOldTexture; 
    4670protected: 
    4771 
    4872        void ProcessDepthBuffer(); 
    49  
    50         /** Draws the geometry for one pass. 
    51         */ 
    52          
    53  
    54         void ApplyDepthPeeling(Beam &beam, const int samples); 
    5573 
    5674        void SwitchRenderTextures(); 
     
    5977                                                 const Beam &beam); 
    6078 
    61         RenderTexture *mNewBuffer; 
    62         RenderTexture *mOldBuffer; 
     79         
    6380 
    6481        Preprocessor *mPreprocessor; 
Note: See TracChangeset for help on using the changeset viewer.