diff options
-rw-r--r-- | tests/CMakeLists.txt | 6 | ||||
-rw-r--r-- | tests/OffscreenContext.mm | 34 | ||||
-rw-r--r-- | tests/cgalpngtest.cc | 6 | ||||
-rw-r--r-- | tests/csgtestcore.cc | 33 | ||||
-rw-r--r-- | tests/fbo.cc | 87 | ||||
-rw-r--r-- | tests/fbo.h | 23 | ||||
-rw-r--r-- | tests/fboutils.cc | 61 | ||||
-rw-r--r-- | tests/fboutils.h | 10 | ||||
-rw-r--r-- | tests/system-gl.h | 8 |
9 files changed, 155 insertions, 113 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4ef7bf3..eb3e911 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -186,7 +186,7 @@ target_link_libraries(cgaltest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_ # # cgalpngtest # -add_executable(cgalpngtest cgalpngtest.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc +add_executable(cgalpngtest cgalpngtest.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc ../src/CGALRenderer.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc ../src/CSGTermEvaluator.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc @@ -199,7 +199,7 @@ target_link_libraries(cgalpngtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${ # opencsgtest # -add_executable(opencsgtest opencsgtest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc +add_executable(opencsgtest opencsgtest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc ../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc ../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc @@ -212,7 +212,7 @@ target_link_libraries(opencsgtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${ # throwntogethertest # -add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc +add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc ../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc ../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc diff --git a/tests/OffscreenContext.mm b/tests/OffscreenContext.mm index 90af712..eb2f777 100644 --- a/tests/OffscreenContext.mm +++ b/tests/OffscreenContext.mm @@ -1,16 +1,19 @@ #include "OffscreenContext.h" #include "imageutils.h" -#include "fboutils.h" +#include "fbo.h" #import <AppKit/AppKit.h> // for NSOpenGL... + +#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } } + struct OffscreenContext { NSOpenGLContext *openGLContext; NSAutoreleasePool *pool; int width; int height; - GLuint fbo; + fbo_t *fbo; }; @@ -42,15 +45,38 @@ OffscreenContext *create_offscreen_context(int w, int h) } [ctx->openGLContext makeCurrentContext]; + + glewInit(); +#ifdef DEBUG + cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n"; + cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n" + << "OpenGL version " << (const char *)glGetString(GL_VERSION) << "\n"; + cout << "Extensions: " << (const char *)glGetString(GL_EXTENSIONS) << "\n"; + + + if (GLEW_ARB_framebuffer_object) { + cout << "ARB_FBO supported\n"; + } + if (GLEW_EXT_framebuffer_object) { + cout << "EXT_FBO supported\n"; + } + if (GLEW_EXT_packed_depth_stencil) { + cout << "EXT_packed_depth_stencil\n"; + } +#endif - ctx->fbo = fbo_create(w, h); + ctx->fbo = fbo_new(); + if (!fbo_init(ctx->fbo, w, h)) { + return NULL; + } return ctx; } bool teardown_offscreen_context(OffscreenContext *ctx) { - fbo_unbind(); + fbo_unbind(ctx->fbo); + fbo_delete(ctx->fbo); /* * Cleanup diff --git a/tests/cgalpngtest.cc b/tests/cgalpngtest.cc index cae5c67..638c088 100644 --- a/tests/cgalpngtest.cc +++ b/tests/cgalpngtest.cc @@ -181,7 +181,11 @@ int main(int argc, char **argv) // match with csgtest ends csgInfo.glview = new OffscreenView(512,512); - //glewInit(); + GLenum err = glewInit(); + if (GLEW_OK != err) { + fprintf(stderr, "Unable to init GLEW: %s\n", glewGetErrorString(err)); + exit(1); + } #ifdef DEBUG cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n"; cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n" diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc index dd7830b..6ef05f3 100644 --- a/tests/csgtestcore.cc +++ b/tests/csgtestcore.cc @@ -1,7 +1,7 @@ // csg test core, used by throwntegether test and opencsg test #include "csgtestcore.h" -#include <GL/glew.h> +#include "system-gl.h" #include "openscad.h" #include "handle_dep.h" #include "builtin.h" @@ -51,9 +51,9 @@ public: CsgInfo::CsgInfo() { root_norm_term = NULL; root_chain = NULL; - highlight_terms = vector<CSGTerm*>(); + highlight_terms = std::vector<CSGTerm*>(); highlights_chain = NULL; - background_terms = vector<CSGTerm*>(); + background_terms = std::vector<CSGTerm*>(); background_chain = NULL; glview = NULL; } @@ -74,7 +74,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type) exit(1); } - const char *filename = argv[1]; + std::string filename(argv[1]); initialize_builtin_functions(); initialize_builtin_modules(); @@ -124,11 +124,11 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type) AbstractModule *root_module; ModuleInstantiation root_inst; - QFileInfo fileInfo(filename); + QFileInfo fileInfo(filename.c_str()); handle_dep(filename); - FILE *fp = fopen(filename, "rt"); + FILE *fp = fopen(filename.c_str(), "rt"); if (!fp) { - fprintf(stderr, "Can't open input file `%s'!\n", filename); + fprintf(stderr, "Can't open input file `%s'!\n", filename.c_str()); exit(1); } else { std::stringstream text; @@ -229,25 +229,6 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type) Vector3d camerapos = center - radius*1.8*cameradir; csgInfo.glview->setCamera(camerapos, center); - glewInit(); -#ifdef DEBUG - cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n"; - cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n" - << "OpenGL version " << (const char *)glGetString(GL_VERSION) << "\n"; - cout << "Extensions: " << (const char *)glGetString(GL_EXTENSIONS) << "\n"; - - - if (GLEW_ARB_framebuffer_object) { - cout << "ARB_FBO supported\n"; - } - if (GLEW_EXT_framebuffer_object) { - cout << "EXT_FBO supported\n"; - } - if (GLEW_EXT_packed_depth_stencil) { - cout << "EXT_packed_depth_stencil\n"; - } -#endif - OpenCSGRenderer opencsgRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain, csgInfo.glview->shaderinfo); ThrownTogetherRenderer thrownTogetherRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain); diff --git a/tests/fbo.cc b/tests/fbo.cc new file mode 100644 index 0000000..2c7abb4 --- /dev/null +++ b/tests/fbo.cc @@ -0,0 +1,87 @@ +#include "fbo.h" +#include <stdio.h> +#include <iostream> + +fbo_t *fbo_new() +{ + fbo_t *fbo = new fbo_t; + fbo->fbo_id = 0; + fbo->old_fbo_id = 0; + fbo->renderbuf_id = 0; + fbo->depthbuf_id = 0; + + return fbo; +} + +#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } } + +bool fbo_init(fbo_t *fbo, size_t width, size_t height) +{ + if (!glewIsSupported("GL_ARB_framebuffer_object")) { + fprintf(stderr, "Framebuffer extension not found\n"); + return false; + } + + // Generate and bind FBO + glGenFramebuffersEXT(1, &fbo->fbo_id); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->fbo_id); + REPORTGLERROR("binding framebuffer"); + + // Generate depth and render buffers + glGenRenderbuffersEXT(1, &fbo->depthbuf_id); + glGenRenderbuffersEXT(1, &fbo->renderbuf_id); + + // Create buffers with correct size + if (!fbo_resize(fbo, width, height)) return false; + + // Attach render and depth buffers + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + GL_RENDERBUFFER_EXT, fbo->renderbuf_id); + REPORTGLERROR("specifying color render buffer"); + + if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { + fprintf(stderr, "Problem with OpenGL framebuffer after specifying color render buffer.\n"); + return false; + } + + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, fbo->depthbuf_id); + REPORTGLERROR("specifying depth render buffer"); + + if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { + fprintf(stderr, "Problem with OpenGL framebuffer after specifying depth render buffer.\n"); + return false; + } + + return true; +} + +bool fbo_resize(fbo_t *fbo, size_t width, size_t height) +{ + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo->depthbuf_id); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height); + REPORTGLERROR("creating depth render buffer"); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo->renderbuf_id); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height); + REPORTGLERROR("creating color render buffer"); + + return true; +} + +void fbo_delete(fbo_t *fbo) +{ + delete fbo; +} + +GLuint fbo_bind(fbo_t *fbo) +{ + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&fbo->old_fbo_id); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->fbo_id); + return fbo->old_fbo_id; +} + +void fbo_unbind(fbo_t *fbo) +{ + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->old_fbo_id); +} diff --git a/tests/fbo.h b/tests/fbo.h new file mode 100644 index 0000000..1ee9007 --- /dev/null +++ b/tests/fbo.h @@ -0,0 +1,23 @@ +#ifndef FBO_H_ +#define FBO_H_ + +#include "system-gl.h" +#include <stddef.h> // size_t + +struct fbo_t +{ + GLuint fbo_id; + GLuint old_fbo_id; + + GLuint renderbuf_id; + GLuint depthbuf_id; +}; + +fbo_t *fbo_new(); +bool fbo_init(fbo_t *fbo, size_t width, size_t height); +bool fbo_resize(fbo_t *fbo, size_t width, size_t height); +void fbo_delete(fbo_t *fbo); +GLuint fbo_bind(fbo_t *fbo); +void fbo_unbind(fbo_t *fbo); + +#endif diff --git a/tests/fboutils.cc b/tests/fboutils.cc deleted file mode 100644 index d0430df..0000000 --- a/tests/fboutils.cc +++ /dev/null @@ -1,61 +0,0 @@ -#include "fboutils.h" -#include <iostream> - -GLuint fbo_create(GLsizei width, GLsizei height) -{ - // Test if framebuffer objects are supported - // FIXME: Use GLEW - const GLubyte* strExt = glGetString(GL_EXTENSIONS); - GLboolean fboSupported = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt); - if (!fboSupported) { - std::cerr << "Your system does not support framebuffer extension - unable to render scene\n"; - return 0; - } - - // Create an FBO - GLuint fbo = 0; - GLuint renderBuffer = 0; - GLuint depthBuffer = 0; - // Depth buffer to use for depth testing - optional if you're not using depth testing - glGenRenderbuffersEXT(1, &depthBuffer); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height); - REPORTGLERROR("creating depth render buffer"); - - // Render buffer to use for imaging - glGenRenderbuffersEXT(1, &renderBuffer); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height); - REPORTGLERROR("creating color render buffer"); - glGenFramebuffersEXT(1, &fbo); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); - REPORTGLERROR("binding framebuffer"); - - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - GL_RENDERBUFFER_EXT, renderBuffer); - REPORTGLERROR("specifying color render buffer"); - - if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { - std::cerr << "Problem with OpenGL framebuffer after specifying color render buffer.\n"; - return 0; - } - - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer); - REPORTGLERROR("specifying depth render buffer"); - - if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { - std::cerr << "Problem with OpenGL framebuffer after specifying depth render buffer.\n"; - return 0; - } - return fbo; -} - -void fbo_bind(GLuint fbo) -{ - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); -} - -void fbo_unbind() -{ - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); -} diff --git a/tests/fboutils.h b/tests/fboutils.h deleted file mode 100644 index 0e5c32e..0000000 --- a/tests/fboutils.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef FBOUTILS_H_ -#define FBOUTILS_H_ - -#include "system-gl.h" - -GLuint fbo_create(GLsizei width, GLsizei height); -void fbo_bind(GLuint fbo); -void fbo_unbind(); - -#endif diff --git a/tests/system-gl.h b/tests/system-gl.h index ddc2cf2..0f983cf 100644 --- a/tests/system-gl.h +++ b/tests/system-gl.h @@ -1,14 +1,6 @@ #ifndef SYSTEMGL_H_ #define SYSTEMGL_H_ -#ifdef __APPLE__ -#include <OpenGL/OpenGL.h> -#include <OpenGL/glu.h> // for gluCheckExtension -#else #include <GL/glew.h> -#include <GL/gl.h> -#endif - -#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } } #endif |