From 7d147032543f51c93123c484d0c2b2c7e191df26 Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 26 Jan 2013 07:10:36 +0100 Subject: [PATCH] commit files created during refactor --- src/CsgInfo.h | 42 ++++++++++++++++++++++ src/OffscreenContextAll.hpp | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/CsgInfo.h create mode 100644 src/OffscreenContextAll.hpp diff --git a/src/CsgInfo.h b/src/CsgInfo.h new file mode 100644 index 00000000..fa3e100d --- /dev/null +++ b/src/CsgInfo.h @@ -0,0 +1,42 @@ +#ifndef __CSGINFO_H__ +#define __CSGINFO_H__ + +#include "OffscreenView.h" + +class CsgInfo +{ +public: + CsgInfo() { glview = NULL; } + OffscreenView *glview; +}; + + +#ifdef ENABLE_OPENCSG + +#include +#include "OpenCSGRenderer.h" +#include "csgterm.h" +#include "csgtermnormalizer.h" + +class CsgInfo_OpenCSG : public CsgInfo +{ +public: + CsgInfo_OpenCSG() + { + root_chain = NULL; + highlights_chain = NULL; + background_chain = NULL; + glview = NULL; + } + shared_ptr root_norm_term; // Normalized CSG products + class CSGChain *root_chain; + std::vector > highlight_terms; + CSGChain *highlights_chain; + std::vector > background_terms; + CSGChain *background_chain; +}; + +#endif // ENABLE_OPENCSG + +#endif + diff --git a/src/OffscreenContextAll.hpp b/src/OffscreenContextAll.hpp new file mode 100644 index 00000000..8ee7ebec --- /dev/null +++ b/src/OffscreenContextAll.hpp @@ -0,0 +1,70 @@ +// Functions shared by OffscreenContext[platform].cc + +void bind_offscreen_context(OffscreenContext *ctx) +{ + if (ctx) fbo_bind(ctx->fbo); +} + +/* + Capture framebuffer from OpenGL and write it to the given filename as PNG. +*/ +bool save_framebuffer(OffscreenContext *ctx, const char *filename) +{ + std::ofstream fstream(filename); + if (!fstream.is_open()) { + std::cerr << "Can't open file " << filename << " for writing"; + return false; + } else { + save_framebuffer(ctx, fstream); + fstream.close(); + } + return true; +} + +/*! + Capture framebuffer from OpenGL and write it to the given ostream. + Called by save_framebuffer() from platform-specific code. +*/ +bool save_framebuffer_common(OffscreenContext *ctx, std::ostream &output) +{ + if (!ctx) return false; + int samplesPerPixel = 4; // R, G, B and A + vector pixels(ctx->width * ctx->height * samplesPerPixel); + glReadPixels(0, 0, ctx->width, ctx->height, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); + + // Flip it vertically - images read from OpenGL buffers are upside-down + int rowBytes = samplesPerPixel * ctx->width; + + unsigned char *flippedBuffer = (unsigned char *)malloc(rowBytes * ctx->height); + if (!flippedBuffer) { + std::cerr << "Unable to allocate flipped buffer for corrected image."; + return 1; + } + flip_image(&pixels[0], flippedBuffer, samplesPerPixel, ctx->width, ctx->height); + + bool writeok = write_png(output, flippedBuffer, ctx->width, ctx->height); + + free(flippedBuffer); + + return writeok; +} + +// Called by create_offscreen_context() from platform-specific code. +OffscreenContext *create_offscreen_context_common(OffscreenContext *ctx) +{ + if (!ctx) return NULL; + GLenum err = glewInit(); // must come after Context creation and before FBO c$ + if (GLEW_OK != err) { + cerr << "Unable to init GLEW: " << glewGetErrorString(err) << "\n"; + return NULL; + } + //cerr << glew_dump(0); + + ctx->fbo = fbo_new(); + if (!fbo_init(ctx->fbo, ctx->width, ctx->height)) { + return NULL; + } + + return ctx; +} +