mirror of https://github.com/vitalif/openscad
commit files created during refactor
parent
af4333a669
commit
7d14703254
|
@ -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 <opencsg.h>
|
||||
#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<CSGTerm> root_norm_term; // Normalized CSG products
|
||||
class CSGChain *root_chain;
|
||||
std::vector<shared_ptr<CSGTerm> > highlight_terms;
|
||||
CSGChain *highlights_chain;
|
||||
std::vector<shared_ptr<CSGTerm> > background_terms;
|
||||
CSGChain *background_chain;
|
||||
};
|
||||
|
||||
#endif // ENABLE_OPENCSG
|
||||
|
||||
#endif
|
||||
|
|
@ -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<GLubyte> 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue