]> git.mxchange.org Git - simgear.git/commitdiff
Add a RenderTexture test program.
authorehofman <ehofman>
Thu, 27 Jan 2005 10:56:22 +0000 (10:56 +0000)
committerehofman <ehofman>
Thu, 27 Jan 2005 10:56:22 +0000 (10:56 +0000)
simgear/screen/TestRenderTexture.cpp [new file with mode: 0644]

diff --git a/simgear/screen/TestRenderTexture.cpp b/simgear/screen/TestRenderTexture.cpp
new file mode 100644 (file)
index 0000000..70d2115
--- /dev/null
@@ -0,0 +1,331 @@
+
+#include <simgear/compiler.h>
+
+#include SG_GL_H
+#include <GL/glut.h>
+#include <simgear/screen/RenderTexture.h>
+#include <simgear/screen/extensions.hxx>
+
+#include <assert.h>
+#include <stdio.h>
+
+void Reshape(int w, int h);
+
+GLuint      iTextureProgram     = 0;
+GLuint      iPassThroughProgram = 0;
+
+RenderTexture *rt = NULL;
+
+float       rectAngle         = 0;
+float       torusAngle        = 0;
+bool        bTorusMotion      = true;
+bool        bRectMotion       = true;
+bool        bShowDepthTexture = false;
+
+static const char *g_modeTestStrings[] = 
+{
+    "rgb tex2D",
+    "rgba tex2D depthTex2D",
+    "rgba=8 depthTexRECT ctt",
+    "rgba samples=4 tex2D ctt",
+    "rgba=8 tex2D mipmap",
+    "rgb=5,6,5 tex2D",
+    "rgba=16f texRECT",
+    "rgba=32f texRECT depthTexRECT",
+    "rgba=16f texRECT depthTexRECT ctt",
+    "r=32f texRECT depth ctt",
+    "rgb double tex2D",
+    "r=32f texRECT ctt aux=4"
+};
+
+static int g_numModeTestStrings = sizeof(g_modeTestStrings) / sizeof(char*);
+static int g_currentString      = 0;
+
+//---------------------------------------------------------------------------
+// Function            : PrintGLerror
+// Description     : 
+//---------------------------------------------------------------------------
+void PrintGLerror( char *msg )
+{
+    GLenum errCode;
+    const GLubyte *errStr;
+    
+    if ((errCode = glGetError()) != GL_NO_ERROR) 
+    {
+        errStr = gluErrorString(errCode);
+        fprintf(stderr,"OpenGL ERROR: %s: %s\n", errStr, msg);
+    }
+}
+
+//---------------------------------------------------------------------------
+// Function            : CreateRenderTexture
+// Description     : 
+//---------------------------------------------------------------------------
+RenderTexture* CreateRenderTexture(const char *initstr)
+{
+    printf("\nCreating with init string: \"%s\"\n", initstr);
+
+    int texWidth = 256, texHeight = 256;
+
+    // Test deprecated interface
+    //RenderTexture *rt2 = new RenderTexture(texWidth, texHeight);
+    //if (!rt2->Initialize(true,false,false,false,false,8,8,8,0))
+
+    RenderTexture *rt2 = new RenderTexture(); 
+    rt2->Reset(initstr);
+    if (!rt2->Initialize(texWidth, texHeight))
+    {
+        fprintf(stderr, "RenderTexture Initialization failed!\n");
+    }
+
+    // for shadow mapping we still have to bind it and set the correct 
+    // texture parameters using the SGI_shadow or ARB_shadow extension
+    // setup the rendering context for the RenderTexture
+    if (rt2->BeginCapture())
+    {
+        Reshape(texWidth, texHeight);
+        glMatrixMode(GL_MODELVIEW);
+        glLoadIdentity();
+        gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
+        glEnable(GL_LIGHTING);
+        glEnable(GL_LIGHT0);
+        glEnable(GL_COLOR_MATERIAL);
+        glEnable(GL_CULL_FACE);
+        glEnable(GL_DEPTH_TEST); 
+        glClearColor(0.2, 0.2, 0.2, 1);
+        rt2->EndCapture();
+    }
+
+    // enable linear filtering if available
+    if (rt2->IsTexture() || rt2->IsDepthTexture())
+    {
+        if (rt2->IsMipmapped())
+        {
+            // Enable trilinear filtering so we can see the mipmapping
+            if (rt2->IsTexture())
+            {
+                rt2->Bind();
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
+            }
+            
+            if (rt2->IsDepthTexture())
+            {
+                rt2->BindDepth();
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
+            }
+        }   
+        else if (!(rt2->IsRectangleTexture() || rt2->IsFloatTexture()))
+        {
+            if (rt2->IsTexture())
+            {
+                rt2->Bind();
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            }
+            
+            if (rt2->IsDepthTexture())
+            {
+                rt2->BindDepth();
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+                glTexParameteri(rt2->GetTextureTarget(),
+                                GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+            }
+        }
+    }
+
+    if (rt2->IsDepthTexture())
+    {
+        fprintf(stderr, 
+            "\nPress the spacebar to toggle color / depth textures.\n");
+        if (!rt2->IsTexture())
+            bShowDepthTexture = true;
+    }
+    else 
+    {
+        if (rt2->IsTexture())
+            bShowDepthTexture = false;
+    }
+
+    PrintGLerror("Create");
+    return rt2;
+}
+
+//---------------------------------------------------------------------------
+// Function            : DestroyRenderTexture
+// Description     : 
+//---------------------------------------------------------------------------
+void DestroyRenderTexture(RenderTexture *rt2)
+{
+    delete rt2;
+}
+
+//---------------------------------------------------------------------------
+// Function            : Keyboard
+// Description     : 
+//---------------------------------------------------------------------------
+void Keyboard(unsigned char key, int x, int y)
+{
+    switch(key)
+    {
+    case 27: 
+    case 'q':
+        exit(0);
+        break;
+    case ' ':
+        bShowDepthTexture = !bShowDepthTexture;
+        break;
+    case 13:
+        ++g_currentString%=g_numModeTestStrings;
+        DestroyRenderTexture(rt);
+        rt = CreateRenderTexture(g_modeTestStrings[g_currentString]);
+        break;
+    case 't':
+        bTorusMotion = !bTorusMotion;
+        break;
+    case 'r':
+        bRectMotion = !bRectMotion;
+        break;
+    default:
+        return;
+    }
+}
+
+//---------------------------------------------------------------------------
+// Function            : Idle
+// Description     : 
+//---------------------------------------------------------------------------
+void Idle()
+{
+    // make sure we don't try to display nonexistent textures
+    if (!rt->IsDepthTexture())
+        bShowDepthTexture = false; 
+    
+    if (bRectMotion) rectAngle += 1;
+    if (bTorusMotion) torusAngle += 1;
+    glutPostRedisplay();
+}
+
+//---------------------------------------------------------------------------
+// Function            : Reshape
+// Description     : 
+//---------------------------------------------------------------------------
+void Reshape(int w, int h)
+{
+    if (h == 0) h = 1;
+    
+    glViewport(0, 0, w, h);
+    
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    
+    gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1, 5.0);
+}
+
+//---------------------------------------------------------------------------
+// Function            : Display
+// Description     : 
+//---------------------------------------------------------------------------
+void _Display()
+{
+    if (rt->IsInitialized() && rt->BeginCapture())
+    {
+      if (rt->IsDoubleBuffered()) glDrawBuffer(GL_BACK);
+        glMatrixMode(GL_MODELVIEW);
+        glPushMatrix();
+        
+        glRotatef(torusAngle, 1, 0, 0);
+        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+        glColor3f(1,1,0);
+        
+        glutSolidTorus(0.25, 1, 32, 64);
+        
+        glPopMatrix();
+        PrintGLerror("RT Update");
+
+    rt->EndCapture();
+    }    
+
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    glColor3f(1, 1, 1);
+    glMatrixMode(GL_MODELVIEW);
+    glPushMatrix();
+    glRotatef(rectAngle / 10, 0, 1, 0);
+        
+    if(bShowDepthTexture && rt->IsDepthTexture())
+        rt->BindDepth();
+    else if (rt->IsTexture()) {
+        rt->Bind();
+    }
+
+    rt->EnableTextureTarget();
+
+    int maxS = rt->GetMaxS();
+    int maxT = rt->GetMaxT();  
+    
+    glBegin(GL_QUADS);
+    glTexCoord2f(0,       0); glVertex2f(-1, -1);
+    glTexCoord2f(maxS,    0); glVertex2f( 1, -1);
+    glTexCoord2f(maxS, maxT); glVertex2f( 1,  1);
+    glTexCoord2f(0,    maxT); glVertex2f(-1,  1);
+    glEnd();
+    
+    rt->DisableTextureTarget();
+          
+    glPopMatrix();
+    
+    PrintGLerror("display");
+    glutSwapBuffers();
+}
+
+
+
+
+//---------------------------------------------------------------------------
+// Function            : main
+// Description     : 
+//---------------------------------------------------------------------------
+int main()
+{
+    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+    glutInitWindowPosition(50, 50);
+    glutInitWindowSize(512, 512);
+    glutCreateWindow("TestRenderTexture");  
+    
+    glutDisplayFunc(_Display);
+    glutIdleFunc(Idle);
+    glutReshapeFunc(Reshape);
+    glutKeyboardFunc(Keyboard);
+    
+    Reshape(512, 512);
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
+    gluLookAt(0, 0, 2, 0, 0, 0, 0, 1, 0);
+    glDisable(GL_LIGHTING);
+    glEnable(GL_COLOR_MATERIAL);
+    glEnable(GL_DEPTH_TEST); 
+    glClearColor(0.4, 0.6, 0.8, 1);
+    
+
+    rt = CreateRenderTexture(g_modeTestStrings[g_currentString]);
+
+    printf("Press Enter to change RenderTexture parameters.\n"
+           "Press 'r' to toggle the rectangle's motion.\n"
+           "Press 't' to toggle the torus' motion.\n");
+    
+
+    glutMainLoop();
+    return 0;
+}