mirror of https://github.com/vitalif/openscad
Clifford Wolf:
Added CsgChain structure Added first OpenCSG demo code git-svn-id: http://svn.clifford.at/openscad/trunk@19 b57f626f-c46c-0410-a088-ec61d464b74cstl_dim
parent
bea704f141
commit
4f7d83c00f
42
csgterm.cc
42
csgterm.cc
|
@ -164,3 +164,45 @@ QString CSGTerm::dump()
|
||||||
return QString("(%1 - %2)").arg(left->dump(), right->dump());
|
return QString("(%1 - %2)").arg(left->dump(), right->dump());
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CSGChain::CSGChain()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSGChain::add(PolySet *polyset, CSGTerm::type_e type, QString label)
|
||||||
|
{
|
||||||
|
polysets.append(polyset);
|
||||||
|
types.append(type);
|
||||||
|
labels.append(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSGChain::import(CSGTerm *term, CSGTerm::type_e type)
|
||||||
|
{
|
||||||
|
if (term->type == CSGTerm::PRIMITIVE) {
|
||||||
|
add(term->polyset, type, term->label);
|
||||||
|
} else {
|
||||||
|
import(term->left, type);
|
||||||
|
import(term->right, term->type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CSGChain::dump()
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
for (int i = 0; i < types.size(); i++)
|
||||||
|
{
|
||||||
|
if (types[i] == CSGTerm::UNION) {
|
||||||
|
if (i != 0)
|
||||||
|
text += "\n";
|
||||||
|
text += "+";
|
||||||
|
}
|
||||||
|
if (types[i] == CSGTerm::DIFFERENCE)
|
||||||
|
text += " -";
|
||||||
|
if (types[i] == CSGTerm::INTERSECTION)
|
||||||
|
text += " *";
|
||||||
|
text += labels[i];
|
||||||
|
}
|
||||||
|
text += "\n";
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
19
glview.cc
19
glview.cc
|
@ -47,6 +47,19 @@ void GLView::initializeGL()
|
||||||
glDepthRange(-FAR_FAR_AWAY, +FAR_FAR_AWAY);
|
glDepthRange(-FAR_FAR_AWAY, +FAR_FAR_AWAY);
|
||||||
|
|
||||||
glClearColor(1.0, 1.0, 0.9, 0.0);
|
glClearColor(1.0, 1.0, 0.9, 0.0);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
|
||||||
|
GLfloat light_position[] = {1.0, 1.0, -1.0, 0.0};
|
||||||
|
|
||||||
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
|
||||||
|
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
|
||||||
|
glEnable(GL_LIGHT0);
|
||||||
|
|
||||||
|
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
|
||||||
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLView::resizeGL(int w, int h)
|
void GLView::resizeGL(int w, int h)
|
||||||
|
@ -56,7 +69,7 @@ void GLView::resizeGL(int w, int h)
|
||||||
|
|
||||||
void GLView::paintGL()
|
void GLView::paintGL()
|
||||||
{
|
{
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
@ -68,7 +81,10 @@ void GLView::paintGL()
|
||||||
glRotated(object_rot_y, 1.0, 0.0, 0.0);
|
glRotated(object_rot_y, 1.0, 0.0, 0.0);
|
||||||
glRotated(object_rot_z, 0.0, 0.0, 1.0);
|
glRotated(object_rot_z, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
glLineWidth(1);
|
||||||
glColor3d(0.0, 0.0, 1.0);
|
glColor3d(0.0, 0.0, 1.0);
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
glVertex3d(0, 0, 0); glVertex3d(10, 0, 0);
|
glVertex3d(0, 0, 0); glVertex3d(10, 0, 0);
|
||||||
|
@ -77,6 +93,7 @@ void GLView::paintGL()
|
||||||
glEnd();
|
glEnd();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
glLineWidth(5);
|
||||||
glColor3d(1.0, 0.0, 0.0);
|
glColor3d(1.0, 0.0, 0.0);
|
||||||
|
|
||||||
if (renderfunc)
|
if (renderfunc)
|
||||||
|
|
155
mainwin.cc
155
mainwin.cc
|
@ -37,6 +37,7 @@ MainWindow::MainWindow(const char *filename)
|
||||||
root_node = NULL;
|
root_node = NULL;
|
||||||
root_raw_term = NULL;
|
root_raw_term = NULL;
|
||||||
root_norm_term = NULL;
|
root_norm_term = NULL;
|
||||||
|
root_chain = NULL;
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
root_N = NULL;
|
root_N = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -82,8 +83,8 @@ MainWindow::MainWindow(const char *filename)
|
||||||
actViewModeCGALSurface->setCheckable(true);
|
actViewModeCGALSurface->setCheckable(true);
|
||||||
actViewModeCGALGrid->setCheckable(true);
|
actViewModeCGALGrid->setCheckable(true);
|
||||||
#endif
|
#endif
|
||||||
actViewModeTrownTogether = menu->addAction("Thrown Together", this, SLOT(viewModeTrownTogether()));
|
actViewModeThrownTogether = menu->addAction("Thrown Together", this, SLOT(viewModeThrownTogether()));
|
||||||
actViewModeTrownTogether->setCheckable(true);
|
actViewModeThrownTogether->setCheckable(true);
|
||||||
|
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
menu->addAction("Top");
|
menu->addAction("Top");
|
||||||
|
@ -137,7 +138,7 @@ MainWindow::MainWindow(const char *filename)
|
||||||
#ifdef ENABLE_OPENCSG
|
#ifdef ENABLE_OPENCSG
|
||||||
viewModeOpenCSG();
|
viewModeOpenCSG();
|
||||||
#else
|
#else
|
||||||
viewModeTrownTogether();
|
viewModeThrownTogether();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setCentralWidget(s1);
|
setCentralWidget(s1);
|
||||||
|
@ -267,6 +268,11 @@ void MainWindow::actionCompile()
|
||||||
root_norm_term = NULL;
|
root_norm_term = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (root_chain) {
|
||||||
|
delete root_chain;
|
||||||
|
root_chain = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
root_norm_term = root_raw_term->link();
|
root_norm_term = root_raw_term->link();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -282,6 +288,9 @@ void MainWindow::actionCompile()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root_chain = new CSGChain();
|
||||||
|
root_chain->import(root_norm_term);
|
||||||
|
|
||||||
console->append("Compilation finished.");
|
console->append("Compilation finished.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,23 +305,6 @@ static void report_func(const class AbstractNode*, void *vp, int mark)
|
||||||
m->console->append(msg);
|
m->console->append(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <CGAL/Nef_3/OGL_helper.h>
|
|
||||||
|
|
||||||
static void renderGLviaCGAL(void *vp)
|
|
||||||
{
|
|
||||||
MainWindow *m = (MainWindow*)vp;
|
|
||||||
if (m->root_N) {
|
|
||||||
CGAL::OGL::Polyhedron P;
|
|
||||||
CGAL::OGL::Nef3_Converter<CGAL_Nef_polyhedron>::convert_to_OGLPolyhedron(*m->root_N, &P);
|
|
||||||
P.init();
|
|
||||||
if (m->actViewModeCGALSurface->isChecked())
|
|
||||||
P.set_style(CGAL::OGL::SNC_BOUNDARY);
|
|
||||||
if (m->actViewModeCGALGrid->isChecked())
|
|
||||||
P.set_style(CGAL::OGL::SNC_SKELETON);
|
|
||||||
P.draw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::actionRenderCGAL()
|
void MainWindow::actionRenderCGAL()
|
||||||
{
|
{
|
||||||
actionCompile();
|
actionCompile();
|
||||||
|
@ -356,7 +348,7 @@ void MainWindow::actionDisplayCSGTree()
|
||||||
{
|
{
|
||||||
QTextEdit *e = new QTextEdit(NULL);
|
QTextEdit *e = new QTextEdit(NULL);
|
||||||
e->setTabStopWidth(30);
|
e->setTabStopWidth(30);
|
||||||
e->setWindowTitle("CSG Dump");
|
e->setWindowTitle("CSG Tree Dump");
|
||||||
if (root_node) {
|
if (root_node) {
|
||||||
e->setPlainText(root_node->dump(""));
|
e->setPlainText(root_node->dump(""));
|
||||||
} else {
|
} else {
|
||||||
|
@ -370,8 +362,8 @@ void MainWindow::actionDisplayCSGProducts()
|
||||||
{
|
{
|
||||||
QTextEdit *e = new QTextEdit(NULL);
|
QTextEdit *e = new QTextEdit(NULL);
|
||||||
e->setTabStopWidth(30);
|
e->setTabStopWidth(30);
|
||||||
e->setWindowTitle("CSG Dump");
|
e->setWindowTitle("CSG Products Dump");
|
||||||
e->setPlainText(QString("\nCSG before normalization:\n%1\n\n\nCSG after normalization:\n%2\n").arg(root_raw_term ? root_raw_term->dump() : "N/A", root_norm_term ? root_norm_term->dump() : "N/A"));
|
e->setPlainText(QString("\nCSG before normalization:\n%1\n\n\nCSG after normalization:\n%2\n\n\nCSG rendering chain:\n%3\n").arg(root_raw_term ? root_raw_term->dump() : "N/A", root_norm_term ? root_norm_term->dump() : "N/A", root_chain ? root_chain->dump() : "N/A"));
|
||||||
e->show();
|
e->show();
|
||||||
e->resize(600, 400);
|
e->resize(600, 400);
|
||||||
}
|
}
|
||||||
|
@ -395,17 +387,79 @@ void MainWindow::viewModeActionsUncheck()
|
||||||
actViewModeCGALSurface->setChecked(false);
|
actViewModeCGALSurface->setChecked(false);
|
||||||
actViewModeCGALGrid->setChecked(false);
|
actViewModeCGALGrid->setChecked(false);
|
||||||
#endif
|
#endif
|
||||||
actViewModeTrownTogether->setChecked(false);
|
actViewModeThrownTogether->setChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_OPENCSG
|
#ifdef ENABLE_OPENCSG
|
||||||
|
|
||||||
|
#include <GL/glut.h>
|
||||||
|
|
||||||
|
class DLPrim : public OpenCSG::Primitive
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DLPrim(unsigned int displayListId, OpenCSG::Operation operation, unsigned int convexity) :
|
||||||
|
OpenCSG::Primitive(operation, convexity), id(displayListId) { }
|
||||||
|
virtual void render() { glCallList(id); }
|
||||||
|
unsigned int id;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void renderGLviaOpenCSG(void *vp)
|
||||||
|
{
|
||||||
|
MainWindow *m = (MainWindow*)vp;
|
||||||
|
static int glew_initialized = 0;
|
||||||
|
if (!glew_initialized) {
|
||||||
|
glew_initialized = 1;
|
||||||
|
glewInit();
|
||||||
|
}
|
||||||
|
if (m->root_chain) {
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
/* FIXME */
|
||||||
|
for (int i = 0; i < m->root_chain->polysets.size(); i++) {
|
||||||
|
if (m->root_chain->types[i] == CSGTerm::DIFFERENCE) {
|
||||||
|
m->root_chain->polysets[i]->render_surface(PolySet::COLOR_CUTOUT);
|
||||||
|
m->root_chain->polysets[i]->render_edges(PolySet::COLOR_CUTOUT);
|
||||||
|
} else {
|
||||||
|
m->root_chain->polysets[i]->render_surface(PolySet::COLOR_MATERIAL);
|
||||||
|
m->root_chain->polysets[i]->render_edges(PolySet::COLOR_MATERIAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GLuint id1 = glGenLists(1);
|
||||||
|
glNewList(id1, GL_COMPILE);
|
||||||
|
glutSolidCube(1.8);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
GLuint id2 = glGenLists(1);
|
||||||
|
glNewList(id2, GL_COMPILE);
|
||||||
|
glutSolidSphere(1.2, 20, 20);
|
||||||
|
glEndList();
|
||||||
|
|
||||||
|
DLPrim* box = new DLPrim(id1, OpenCSG::Intersection, 1);
|
||||||
|
DLPrim* sphere = new DLPrim(id2, OpenCSG::Subtraction, 1);
|
||||||
|
std::vector<OpenCSG::Primitive*> primitives;
|
||||||
|
|
||||||
|
primitives.push_back(box);
|
||||||
|
primitives.push_back(sphere);
|
||||||
|
|
||||||
|
OpenCSG::render(primitives, OpenCSG::Goldfeather, OpenCSG::NoDepthComplexitySampling);
|
||||||
|
|
||||||
|
glDepthFunc(GL_EQUAL);
|
||||||
|
glColor3f(1.0, 0, 0);
|
||||||
|
for (unsigned int i = 0; i < primitives.size(); i++) {
|
||||||
|
primitives[i]->render();
|
||||||
|
glDeleteLists(((DLPrim*)primitives[i])->id, 1);
|
||||||
|
delete primitives[i];
|
||||||
|
}
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::viewModeOpenCSG()
|
void MainWindow::viewModeOpenCSG()
|
||||||
{
|
{
|
||||||
/* FIXME */
|
|
||||||
viewModeActionsUncheck();
|
viewModeActionsUncheck();
|
||||||
actViewModeOpenCSG->setChecked(true);
|
actViewModeOpenCSG->setChecked(true);
|
||||||
screen->renderfunc = NULL;
|
screen->renderfunc = renderGLviaOpenCSG;
|
||||||
|
screen->renderfunc_vp = this;
|
||||||
screen->updateGL();
|
screen->updateGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,6 +467,23 @@ void MainWindow::viewModeOpenCSG()
|
||||||
|
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
|
|
||||||
|
#include <CGAL/Nef_3/OGL_helper.h>
|
||||||
|
|
||||||
|
static void renderGLviaCGAL(void *vp)
|
||||||
|
{
|
||||||
|
MainWindow *m = (MainWindow*)vp;
|
||||||
|
if (m->root_N) {
|
||||||
|
CGAL::OGL::Polyhedron P;
|
||||||
|
CGAL::OGL::Nef3_Converter<CGAL_Nef_polyhedron>::convert_to_OGLPolyhedron(*m->root_N, &P);
|
||||||
|
P.init();
|
||||||
|
if (m->actViewModeCGALSurface->isChecked())
|
||||||
|
P.set_style(CGAL::OGL::SNC_BOUNDARY);
|
||||||
|
if (m->actViewModeCGALGrid->isChecked())
|
||||||
|
P.set_style(CGAL::OGL::SNC_SKELETON);
|
||||||
|
P.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::viewModeCGALSurface()
|
void MainWindow::viewModeCGALSurface()
|
||||||
{
|
{
|
||||||
viewModeActionsUncheck();
|
viewModeActionsUncheck();
|
||||||
|
@ -433,28 +504,28 @@ void MainWindow::viewModeCGALGrid()
|
||||||
|
|
||||||
#endif /* ENABLE_CGAL */
|
#endif /* ENABLE_CGAL */
|
||||||
|
|
||||||
static void renderGLTrownTogether_worker(CSGTerm *t)
|
static void renderGLThrownTogether(void *vp)
|
||||||
{
|
|
||||||
if (t->left)
|
|
||||||
renderGLTrownTogether_worker(t->left);
|
|
||||||
if (t->right)
|
|
||||||
renderGLTrownTogether_worker(t->right);
|
|
||||||
if (t->polyset)
|
|
||||||
t->polyset->render_opengl();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void renderGLTrownTogether(void *vp)
|
|
||||||
{
|
{
|
||||||
MainWindow *m = (MainWindow*)vp;
|
MainWindow *m = (MainWindow*)vp;
|
||||||
if (m->root_raw_term)
|
if (m->root_chain) {
|
||||||
renderGLTrownTogether_worker(m->root_raw_term);
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
for (int i = 0; i < m->root_chain->polysets.size(); i++) {
|
||||||
|
if (m->root_chain->types[i] == CSGTerm::DIFFERENCE) {
|
||||||
|
m->root_chain->polysets[i]->render_surface(PolySet::COLOR_CUTOUT);
|
||||||
|
m->root_chain->polysets[i]->render_edges(PolySet::COLOR_CUTOUT);
|
||||||
|
} else {
|
||||||
|
m->root_chain->polysets[i]->render_surface(PolySet::COLOR_MATERIAL);
|
||||||
|
m->root_chain->polysets[i]->render_edges(PolySet::COLOR_MATERIAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::viewModeTrownTogether()
|
void MainWindow::viewModeThrownTogether()
|
||||||
{
|
{
|
||||||
viewModeActionsUncheck();
|
viewModeActionsUncheck();
|
||||||
actViewModeTrownTogether->setChecked(true);
|
actViewModeThrownTogether->setChecked(true);
|
||||||
screen->renderfunc = renderGLTrownTogether;
|
screen->renderfunc = renderGLThrownTogether;
|
||||||
screen->renderfunc_vp = this;
|
screen->renderfunc_vp = this;
|
||||||
screen->updateGL();
|
screen->updateGL();
|
||||||
}
|
}
|
||||||
|
|
46
openscad.h
46
openscad.h
|
@ -31,6 +31,11 @@ static inline uint qHash(double v) {
|
||||||
return x.u[0] ^ x.u[1];
|
return x.u[0] ^ x.u[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_OPENCSG
|
||||||
|
// this must be included before the GL headers
|
||||||
|
# include <GL/glew.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
@ -59,8 +64,9 @@ class ModuleInstanciation;
|
||||||
class Module;
|
class Module;
|
||||||
|
|
||||||
class Context;
|
class Context;
|
||||||
class CSGTerm;
|
|
||||||
class PolySet;
|
class PolySet;
|
||||||
|
class CSGTerm;
|
||||||
|
class CSGChain;
|
||||||
class AbstractNode;
|
class AbstractNode;
|
||||||
class AbstractPolyNode;
|
class AbstractPolyNode;
|
||||||
|
|
||||||
|
@ -274,6 +280,10 @@ typedef CGAL_Nef_polyhedron::Point_3 CGAL_Point;
|
||||||
|
|
||||||
#endif /* ENABLE_CGAL */
|
#endif /* ENABLE_CGAL */
|
||||||
|
|
||||||
|
#ifdef ENABLE_OPENCSG
|
||||||
|
# include <opencsg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
class PolySet
|
class PolySet
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -291,14 +301,20 @@ public:
|
||||||
void append_vertex(double x, double y, double z);
|
void append_vertex(double x, double y, double z);
|
||||||
void insert_vertex(double x, double y, double z);
|
void insert_vertex(double x, double y, double z);
|
||||||
|
|
||||||
void render_opengl() const;
|
enum colormode_e {
|
||||||
|
COLOR_NONE,
|
||||||
|
COLOR_MATERIAL,
|
||||||
|
COLOR_CUTOUT
|
||||||
|
};
|
||||||
|
|
||||||
|
void render_surface(colormode_e colormode) const;
|
||||||
|
void render_edges(colormode_e colormode) const;
|
||||||
|
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ENABLE_OPENCSG
|
|
||||||
class CSGTerm
|
class CSGTerm
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -327,7 +343,20 @@ public:
|
||||||
void unlink();
|
void unlink();
|
||||||
QString dump();
|
QString dump();
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
class CSGChain
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QVector<PolySet*> polysets;
|
||||||
|
QVector<CSGTerm::type_e> types;
|
||||||
|
QVector<QString> labels;
|
||||||
|
|
||||||
|
CSGChain();
|
||||||
|
|
||||||
|
void add(PolySet *polyset, CSGTerm::type_e type, QString label);
|
||||||
|
void import(CSGTerm *term, CSGTerm::type_e type = CSGTerm::UNION);
|
||||||
|
QString dump();
|
||||||
|
};
|
||||||
|
|
||||||
class AbstractNode
|
class AbstractNode
|
||||||
{
|
{
|
||||||
|
@ -346,9 +375,7 @@ public:
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_OPENCSG
|
|
||||||
virtual CSGTerm *render_csg_term(double m[16]) const;
|
virtual CSGTerm *render_csg_term(double m[16]) const;
|
||||||
#endif
|
|
||||||
virtual QString dump(QString indent) const;
|
virtual QString dump(QString indent) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -363,9 +390,7 @@ public:
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_OPENCSG
|
|
||||||
virtual CSGTerm *render_csg_term(double m[16]) const;
|
virtual CSGTerm *render_csg_term(double m[16]) const;
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int progress_report_count;
|
extern int progress_report_count;
|
||||||
|
@ -428,6 +453,7 @@ public:
|
||||||
AbstractNode *root_node;
|
AbstractNode *root_node;
|
||||||
CSGTerm *root_raw_term;
|
CSGTerm *root_raw_term;
|
||||||
CSGTerm *root_norm_term;
|
CSGTerm *root_norm_term;
|
||||||
|
CSGChain *root_chain;
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
CGAL_Nef_polyhedron *root_N;
|
CGAL_Nef_polyhedron *root_N;
|
||||||
#endif
|
#endif
|
||||||
|
@ -460,7 +486,7 @@ public:
|
||||||
QAction *actViewModeCGALSurface;
|
QAction *actViewModeCGALSurface;
|
||||||
QAction *actViewModeCGALGrid;
|
QAction *actViewModeCGALGrid;
|
||||||
#endif
|
#endif
|
||||||
QAction *actViewModeTrownTogether;
|
QAction *actViewModeThrownTogether;
|
||||||
void viewModeActionsUncheck();
|
void viewModeActionsUncheck();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
@ -471,7 +497,7 @@ private slots:
|
||||||
void viewModeCGALSurface();
|
void viewModeCGALSurface();
|
||||||
void viewModeCGALGrid();
|
void viewModeCGALGrid();
|
||||||
#endif
|
#endif
|
||||||
void viewModeTrownTogether();
|
void viewModeThrownTogether();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern AbstractModule *parse(const char *text, int debug);
|
extern AbstractModule *parse(const char *text, int debug);
|
||||||
|
|
|
@ -6,7 +6,7 @@ DEFINES += "ENABLE_CGAL=1"
|
||||||
LIBS += -lCGAL -lmpfr
|
LIBS += -lCGAL -lmpfr
|
||||||
|
|
||||||
DEFINES += "ENABLE_OPENCSG=1"
|
DEFINES += "ENABLE_OPENCSG=1"
|
||||||
LIBS += -lopencsg -lGLEW
|
LIBS += -lopencsg -lGLEW -lglut
|
||||||
|
|
||||||
LEXSOURCES += lexer.l
|
LEXSOURCES += lexer.l
|
||||||
YACCSOURCES += parser.y
|
YACCSOURCES += parser.y
|
||||||
|
|
23
polyset.cc
23
polyset.cc
|
@ -41,8 +41,12 @@ void PolySet::insert_vertex(double x, double y, double z)
|
||||||
polygons.last().insert(0, Point(x, y, z));
|
polygons.last().insert(0, Point(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolySet::render_opengl() const
|
void PolySet::render_surface(colormode_e colormode) const
|
||||||
{
|
{
|
||||||
|
if (colormode == COLOR_MATERIAL)
|
||||||
|
glColor3ub(249, 215, 44);
|
||||||
|
if (colormode == COLOR_CUTOUT)
|
||||||
|
glColor3ub(157, 203, 81);
|
||||||
for (int i = 0; i < polygons.size(); i++) {
|
for (int i = 0; i < polygons.size(); i++) {
|
||||||
const Polygon *poly = &polygons[i];
|
const Polygon *poly = &polygons[i];
|
||||||
glBegin(GL_POLYGON);
|
glBegin(GL_POLYGON);
|
||||||
|
@ -54,6 +58,23 @@ void PolySet::render_opengl() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PolySet::render_edges(colormode_e colormode) const
|
||||||
|
{
|
||||||
|
if (colormode == COLOR_MATERIAL)
|
||||||
|
glColor3ub(255, 236, 94);
|
||||||
|
if (colormode == COLOR_CUTOUT)
|
||||||
|
glColor3ub(171, 216, 86);
|
||||||
|
for (int i = 0; i < polygons.size(); i++) {
|
||||||
|
const Polygon *poly = &polygons[i];
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for (int j = 0; j < poly->size(); j++) {
|
||||||
|
const Point *p = &poly->at(j);
|
||||||
|
glVertex3d(p->x, p->y, p->z);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
|
|
||||||
class CGAL_Build_PolySet : public CGAL::Modifier_base<CGAL_HDS>
|
class CGAL_Build_PolySet : public CGAL::Modifier_base<CGAL_HDS>
|
||||||
|
|
Loading…
Reference in New Issue