]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
integrate GLView_FrameBufer
authordmv <dmv@opencascade.com>
Tue, 27 Jul 2010 15:23:14 +0000 (15:23 +0000)
committerdmv <dmv@opencascade.com>
Tue, 27 Jul 2010 15:23:14 +0000 (15:23 +0000)
src/GLViewer/GLViewer_FrameBuffer.cxx [new file with mode: 0755]
src/GLViewer/GLViewer_FrameBuffer.h [new file with mode: 0755]

diff --git a/src/GLViewer/GLViewer_FrameBuffer.cxx b/src/GLViewer/GLViewer_FrameBuffer.cxx
new file mode 100755 (executable)
index 0000000..51e7ee9
--- /dev/null
@@ -0,0 +1,196 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  File   : GLViewer_FrameBuffer.cxx
+//  Module : SALOME
+//
+#include "GLViewer_FrameBuffer.h"
+
+#include <cstring>
+
+#ifndef WNT
+# ifndef GLX_GLXEXT_LEGACY
+#  define GLX_GLXEXT_LEGACY
+# endif
+# include <GL/glx.h>
+# include <dlfcn.h>
+#else
+# include <wingdi.h>
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+
+#ifndef GL_FRAMEBUFFER_EXT
+#define GL_FRAMEBUFFER_EXT                0x8D40
+#endif
+
+#ifndef GL_RENDERBUFFER_EXT
+#define GL_RENDERBUFFER_EXT               0x8D41
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT0_EXT
+#define GL_COLOR_ATTACHMENT0_EXT          0x8CE0
+#endif
+
+#ifndef GL_DEPTH_ATTACHMENT_EXT
+#define GL_DEPTH_ATTACHMENT_EXT           0x8D00
+#endif
+
+#ifndef GL_FRAMEBUFFER_COMPLETE_EXT
+#define GL_FRAMEBUFFER_COMPLETE_EXT       0x8CD5
+#endif
+
+typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers);
+
+static PFNGLGENFRAMEBUFFERSEXTPROC vglGenFramebuffersEXT = NULL;
+static PFNGLBINDFRAMEBUFFEREXTPROC vglBindFramebufferEXT = NULL;
+static PFNGLFRAMEBUFFERTEXTURE2DEXTPROC vglFramebufferTexture2DEXT = NULL;
+static PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC vglCheckFramebufferStatusEXT = NULL;
+static PFNGLDELETEFRAMEBUFFERSEXTPROC vglDeleteFramebuffersEXT = NULL;
+static PFNGLGENRENDERBUFFERSEXTPROC vglGenRenderbuffersEXT = NULL;
+static PFNGLBINDRENDERBUFFEREXTPROC vglBindRenderbufferEXT = NULL;
+static PFNGLRENDERBUFFERSTORAGEEXTPROC vglRenderbufferStorageEXT = NULL;
+static PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC vglFramebufferRenderbufferEXT = NULL;
+static PFNGLDELETERENDERBUFFERSEXTPROC vglDeleteRenderbuffersEXT = NULL;
+
+#ifndef WNT
+#define GL_GetProcAddress( x ) glXGetProcAddressARB( (const GLubyte*)x )
+#else
+#define GL_GetProcAddress( x ) wglGetProcAddress( (const LPCSTR)x )
+#endif
+
+bool InitializeEXT()
+{
+  vglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)GL_GetProcAddress( "glGenFramebuffersEXT" );
+  vglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)GL_GetProcAddress( "glBindFramebufferEXT" );
+  vglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)GL_GetProcAddress( "glFramebufferTexture2DEXT" );
+  vglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)GL_GetProcAddress( "glCheckFramebufferStatusEXT" );
+  vglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)GL_GetProcAddress( "glDeleteFramebuffersEXT" );
+  vglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)GL_GetProcAddress( "glGenRenderbuffersEXT" );
+  vglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)GL_GetProcAddress( "glBindRenderbufferEXT" );
+  vglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)GL_GetProcAddress( "glRenderbufferStorageEXT" );
+  vglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)GL_GetProcAddress( "glFramebufferRenderbufferEXT" );
+  vglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)GL_GetProcAddress( "glDeleteRenderbuffersEXT" );
+
+  bool ok = vglGenFramebuffersEXT && vglBindFramebufferEXT && vglFramebufferTexture2DEXT &&
+            vglCheckFramebufferStatusEXT && vglDeleteFramebuffersEXT && vglGenRenderbuffersEXT &&
+            vglBindRenderbufferEXT && vglRenderbufferStorageEXT && vglFramebufferRenderbufferEXT &&
+            vglDeleteRenderbuffersEXT;
+
+  return ok;
+}
+
+GLViewer_FrameBuffer::GLViewer_FrameBuffer()
+  : textureId( 0 ),
+    fboId( 0 ),
+    rboId( 0 ),
+    myIsInitializeEXT ( false )
+{
+}
+
+GLViewer_FrameBuffer::~GLViewer_FrameBuffer()
+{
+  release();
+}
+
+bool GLViewer_FrameBuffer::init( const GLsizei& xSize, const GLsizei& ySize )
+{
+  myIsInitializeEXT = InitializeEXT();
+  char* ext = (char*)glGetString( GL_EXTENSIONS );
+  if( !myIsInitializeEXT || strstr( ext, "GL_EXT_framebuffer_object" ) == NULL )
+    return false;
+
+  // create a texture object
+  glEnable( GL_TEXTURE_2D );
+  glGenTextures( 1, &textureId );
+  glBindTexture( GL_TEXTURE_2D, textureId );
+  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, xSize, ySize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
+  glBindTexture( GL_TEXTURE_2D, 0 );
+
+  // create a renderbuffer object to store depth info
+  vglGenRenderbuffersEXT( 1, &rboId );
+  vglBindRenderbufferEXT( GL_RENDERBUFFER_EXT, rboId );
+  vglRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, xSize, ySize );
+  vglBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
+
+  // create a framebuffer object
+  vglGenFramebuffersEXT( 1, &fboId );
+  vglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fboId );
+
+  // attach the texture to FBO color attachment point
+  vglFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureId, 0 );
+
+  // attach the renderbuffer to depth attachment point
+  vglFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboId );
+
+  // check FBO status
+  GLenum status = vglCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
+
+  // Unbind FBO
+  vglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
+
+  return status == GL_FRAMEBUFFER_COMPLETE_EXT;
+}
+
+void GLViewer_FrameBuffer::release()
+{
+  if( !myIsInitializeEXT )
+    return;
+
+  glDeleteTextures( 1, &textureId );
+  textureId = 0;
+
+  vglDeleteFramebuffersEXT( 1, &fboId );
+  fboId = 0;
+
+  vglDeleteRenderbuffersEXT( 1, &rboId );
+  rboId = 0;
+}
+
+void GLViewer_FrameBuffer::bind()
+{
+  if( !myIsInitializeEXT )
+    return;
+
+  vglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fboId );
+}
+
+void GLViewer_FrameBuffer::unbind()
+{
+  if( !myIsInitializeEXT )
+    return;
+
+  vglBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
+}
diff --git a/src/GLViewer/GLViewer_FrameBuffer.h b/src/GLViewer/GLViewer_FrameBuffer.h
new file mode 100755 (executable)
index 0000000..83627d0
--- /dev/null
@@ -0,0 +1,53 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  File   : GLViewer_FrameBuffer.h
+//  Module : SALOME
+//
+#ifndef GLVIEWER_FRAMEBUFFER_H
+#define GLVIEWER_FRAMEBUFFER_H
+
+#include "GLViewer.h"
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/gl.h>
+
+class GLVIEWER_API GLViewer_FrameBuffer
+{
+public:
+  GLViewer_FrameBuffer();
+  ~GLViewer_FrameBuffer();
+
+  bool init( const GLsizei&, const GLsizei& );
+  void release();
+
+  void bind();
+  void unbind();
+
+private:
+  GLuint textureId;
+  GLuint fboId;
+  GLuint rboId;
+  bool   myIsInitializeEXT;
+};
+
+#endif