1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#include "export.h"
#include "printutils.h"
#include "OffscreenView.h"
#include "CsgInfo.h"
#include <stdio.h>
#include "polyset.h"
#include "rendersettings.h"
#ifdef ENABLE_CGAL
#include "CGALRenderer.h"
#include "CGAL_renderer.h"
#include "cgal.h"
void export_png_with_cgal(CGAL_Nef_polyhedron *root_N, Camera &cam, std::ostream &output)
{
OffscreenView *glview;
try {
glview = new OffscreenView( cam.pixel_width, cam.pixel_height );
} catch (int error) {
fprintf(stderr,"Can't create OpenGL OffscreenView. Code: %i.\n", error);
return;
}
CGALRenderer cgalRenderer(*root_N);
BoundingBox bbox;
if (cgalRenderer.polyhedron) {
CGAL::Bbox_3 cgalbbox = cgalRenderer.polyhedron->bbox();
bbox = BoundingBox(
Vector3d(cgalbbox.xmin(), cgalbbox.ymin(), cgalbbox.zmin()),
Vector3d(cgalbbox.xmax(), cgalbbox.ymax(), cgalbbox.zmax()) );
}
else if (cgalRenderer.polyset) {
bbox = cgalRenderer.polyset->getBoundingBox();
}
if (cam.type == Camera::NONE) {
cam.type = Camera::VECTOR;
cam.center = getBoundingCenter(bbox);
double radius = getBoundingRadius(bbox);
Vector3d cameradir(1, 1, -0.5);
cam.eye = cam.center - radius*2*cameradir;
}
//std::cerr << center << "\n";
//std::cerr << radius << "\n";
glview->setCamera( cam );
glview->setRenderer(&cgalRenderer);
glview->paintGL();
glview->save(output);
}
#ifdef ENABLE_OPENCSG
#include "OpenCSGRenderer.h"
#include <opencsg.h>
#endif
void export_png_with_opencsg(Tree &tree, Camera &cam, std::ostream &output)
{
#ifdef ENABLE_OPENCSG
CsgInfo csgInfo = CsgInfo();
if ( !csgInfo.compile_chains( tree ) ) {
fprintf(stderr,"Couldn't initialize OpenCSG chains\n");
return;
}
try {
csgInfo.glview = new OffscreenView( cam.pixel_width, cam.pixel_height );
} catch (int error) {
fprintf(stderr,"Can't create OpenGL OffscreenView. Code: %i.\n", error);
return;
}
OpenCSGRenderer opencsgRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain, csgInfo.glview->shaderinfo);
if (cam.type == Camera::NONE) {
cam.type = Camera::VECTOR;
double radius = 1.0;
if (csgInfo.root_chain) {
BoundingBox bbox = csgInfo.root_chain->getBoundingBox();
cam.center = (bbox.min() + bbox.max()) / 2;
radius = (bbox.max() - bbox.min()).norm() / 2;
}
Vector3d cameradir(1, 1, -0.5);
cam.eye = cam.center - radius*1.8*cameradir;
}
csgInfo.glview->setCamera( cam );
csgInfo.glview->setRenderer(&opencsgRenderer);
OpenCSG::setContext(0);
OpenCSG::setOption(OpenCSG::OffscreenSetting, OpenCSG::FrameBufferObject);
csgInfo.glview->paintGL();
csgInfo.glview->save(output);
#else
fprintf(stderr,"This openscad was built without OpenCSG support\n");
#endif
}
#include "ThrownTogetherRenderer.h"
void export_png_with_throwntogether(Tree &tree, Camera &cam, std::ostream &output)
{
CsgInfo csgInfo = CsgInfo();
if ( !csgInfo.compile_chains( tree ) ) {
fprintf(stderr,"Couldn't initialize OpenCSG chains\n");
return;
}
try {
csgInfo.glview = new OffscreenView( cam.pixel_width, cam.pixel_height );
} catch (int error) {
fprintf(stderr,"Can't create OpenGL OffscreenView. Code: %i.\n", error);
return;
}
ThrownTogetherRenderer thrownTogetherRenderer( csgInfo.root_chain,
csgInfo.highlights_chain, csgInfo.background_chain );
if (cam.type == Camera::NONE) {
cam.type = Camera::VECTOR;
double radius = 1.0;
if (csgInfo.root_chain) {
BoundingBox bbox = csgInfo.root_chain->getBoundingBox();
cam.center = (bbox.min() + bbox.max()) / 2;
radius = (bbox.max() - bbox.min()).norm() / 2;
}
Vector3d cameradir(1, 1, -0.5);
cam.eye = cam.center - radius*1.8*cameradir;
}
csgInfo.glview->setCamera( cam );
csgInfo.glview->setRenderer(&thrownTogetherRenderer);
csgInfo.glview->paintGL();
csgInfo.glview->save(output);
}
#endif // ENABLE_CGAL
|