Browse Source

Merge branch 'master' of https://github.com/danielepanozzo/libigl

Former-commit-id: 86e59826a28ff3936d0d1f149afbf12a1de7b9cd
schuellc 10 years ago
parent
commit
9117a49048
2 changed files with 98 additions and 1 deletions
  1. 91 1
      include/igl/viewer/ViewerCore.cpp
  2. 7 0
      include/igl/viewer/ViewerCore.h

+ 91 - 1
include/igl/viewer/ViewerCore.cpp

@@ -138,6 +138,7 @@ namespace igl {
       SERIALIZE_MEMBER(show_vertid);
       SERIALIZE_MEMBER(show_faceid);
       SERIALIZE_MEMBER(show_texture);
+      SERIALIZE_MEMBER(depth_test);
 
       SERIALIZE_MEMBER(point_size);
       SERIALIZE_MEMBER(line_width);
@@ -216,7 +217,10 @@ IGL_INLINE void igl::ViewerCore::draw(ViewerData& data, OpenGL_state& opengl)
   using namespace std;
   using namespace Eigen;
 
-  glEnable(GL_DEPTH_TEST);
+  if (depth_test)
+    glEnable(GL_DEPTH_TEST);
+  else
+    glDisable(GL_DEPTH_TEST);
 
   /* Bind and potentially refresh mesh/line/point data */
   if (data.dirty)
@@ -388,6 +392,91 @@ IGL_INLINE void igl::ViewerCore::draw(ViewerData& data, OpenGL_state& opengl)
 
 }
 
+IGL_INLINE void igl::ViewerCore::draw_buffer(ViewerData& data,
+                            OpenGL_state& opengl,
+                            Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& R,
+                            Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& G,
+                            Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& B,
+                            Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& A)
+{
+  assert(R.rows() == G.rows() && G.rows() == B.rows() && B.rows() == A.rows());
+  assert(R.cols() == G.cols() && G.cols() == B.cols() && B.cols() == A.cols());
+  
+  int x = R.rows();
+  int y = R.cols();
+  
+  // Create frame buffer
+  GLuint frameBuffer;
+  glGenFramebuffers(1, &frameBuffer);
+  glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
+
+  // Create texture to hold color buffer
+  GLuint texColorBuffer;
+  glGenTextures(1, &texColorBuffer);
+  glBindTexture(GL_TEXTURE_2D, texColorBuffer);
+  
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+  
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  
+  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);
+  
+  // Create Renderbuffer Object to hold depth and stencil buffers
+  GLuint rboDepthStencil;
+  glGenRenderbuffers(1, &rboDepthStencil);
+  glBindRenderbuffer(GL_RENDERBUFFER, rboDepthStencil);
+  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, x, y);
+  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboDepthStencil);
+
+  assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
+
+  glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
+
+  // Clear the buffer
+  glClearColor(0.f, 0.f, 0.f, 0.f);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  // Save old viewport
+  Eigen::Vector4f viewport_ori = viewport;
+  viewport << 0,0,x,y;
+  
+  // Draw
+  draw(data,opengl);
+  
+  // Restore viewport
+  viewport = viewport_ori;
+  
+  // Copy back in the given Eigen matrices
+  GLubyte pixels[ x * y * 4 ];
+  glReadPixels
+  (
+   0, 0,
+   x, y,
+   GL_RGBA, GL_UNSIGNED_BYTE, pixels
+   );
+    
+  int count = 0;
+  for (unsigned i=0; i<x; ++i)
+  {
+    for (unsigned j=0; j<y; ++j)
+    {
+      R(i,j) = pixels[count*4+0];
+      G(i,j) = pixels[count*4+1];
+      B(i,j) = pixels[count*4+2];
+      A(i,j) = pixels[count*4+3];
+      ++count;
+    }
+  }
+  
+  // Clean up
+  glBindFramebuffer(GL_FRAMEBUFFER, 0);
+  glDeleteRenderbuffers(1, &rboDepthStencil);
+  glDeleteTextures(1, &texColorBuffer);
+  glDeleteFramebuffers(1, &frameBuffer);
+}
+
+
 IGL_INLINE igl::ViewerCore::ViewerCore()
 {
   // Default shininess
@@ -427,6 +516,7 @@ IGL_INLINE igl::ViewerCore::ViewerCore()
   show_vertid = false;
   show_faceid = false;
   show_texture = false;
+  depth_test = true;
 
   // Default point size / line width
   point_size = 15;

+ 7 - 0
include/igl/viewer/ViewerCore.h

@@ -57,6 +57,12 @@ public:
 
   // Draw everything
   IGL_INLINE void draw(ViewerData& data, OpenGL_state& opengl);
+  IGL_INLINE void draw_buffer(ViewerData& data,
+                              OpenGL_state& opengl,
+                              Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& R,
+                              Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& G,
+                              Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& B,
+                              Eigen::Matrix<char,Eigen::Dynamic,Eigen::Dynamic>& A);
 
   // ------------------- Properties
 
@@ -104,6 +110,7 @@ public:
   bool show_vertid;
   bool show_faceid;
   bool invert_normals;
+  bool depth_test;
 
   // Point size / line width
   float point_size;