mirror of https://github.com/vitalif/openscad
Green refactoring, but uncertain if we should keep it
parent
e6bfee021b
commit
acd08b6f1a
|
@ -233,6 +233,8 @@ HEADERS += src/typedefs.h \
|
||||||
src/rendernode.h \
|
src/rendernode.h \
|
||||||
src/openscad.h \
|
src/openscad.h \
|
||||||
src/handle_dep.h \
|
src/handle_dep.h \
|
||||||
|
src/Geometry.h \
|
||||||
|
src/Polygon2d.h \
|
||||||
src/polyset.h \
|
src/polyset.h \
|
||||||
src/printutils.h \
|
src/printutils.h \
|
||||||
src/fileutils.h \
|
src/fileutils.h \
|
||||||
|
@ -245,7 +247,7 @@ HEADERS += src/typedefs.h \
|
||||||
src/nodecache.h \
|
src/nodecache.h \
|
||||||
src/nodedumper.h \
|
src/nodedumper.h \
|
||||||
src/ModuleCache.h \
|
src/ModuleCache.h \
|
||||||
src/PolySetCache.h \
|
src/GeometryCache.h \
|
||||||
src/PolySetEvaluator.h \
|
src/PolySetEvaluator.h \
|
||||||
src/CSGTermEvaluator.h \
|
src/CSGTermEvaluator.h \
|
||||||
src/Tree.h \
|
src/Tree.h \
|
||||||
|
@ -286,6 +288,8 @@ SOURCES += src/version_check.cc \
|
||||||
src/evalcontext.cc \
|
src/evalcontext.cc \
|
||||||
src/csgterm.cc \
|
src/csgterm.cc \
|
||||||
src/csgtermnormalizer.cc \
|
src/csgtermnormalizer.cc \
|
||||||
|
src/Geometry.cc \
|
||||||
|
src/Polygon2d.cc \
|
||||||
src/polyset.cc \
|
src/polyset.cc \
|
||||||
src/csgops.cc \
|
src/csgops.cc \
|
||||||
src/transform.cc \
|
src/transform.cc \
|
||||||
|
@ -312,7 +316,7 @@ SOURCES += src/version_check.cc \
|
||||||
src/traverser.cc \
|
src/traverser.cc \
|
||||||
src/PolySetEvaluator.cc \
|
src/PolySetEvaluator.cc \
|
||||||
src/ModuleCache.cc \
|
src/ModuleCache.cc \
|
||||||
src/PolySetCache.cc \
|
src/GeometryCache.cc \
|
||||||
src/Tree.cc \
|
src/Tree.cc \
|
||||||
\
|
\
|
||||||
src/rendersettings.cc \
|
src/rendersettings.cc \
|
||||||
|
|
|
@ -353,12 +353,14 @@ Response CGALEvaluator::visit(State &state, const AbstractPolyNode &node)
|
||||||
CGAL_Nef_polyhedron N;
|
CGAL_Nef_polyhedron N;
|
||||||
if (!isCached(node)) {
|
if (!isCached(node)) {
|
||||||
// Apply polyset operation
|
// Apply polyset operation
|
||||||
shared_ptr<PolySet> ps = this->psevaluator.getPolySet(node, false);
|
shared_ptr<Geometry> geom = this->psevaluator.getGeometry(node, false);
|
||||||
|
shared_ptr<PolySet> ps = dynamic_pointer_cast<PolySet>(geom);
|
||||||
if (ps) {
|
if (ps) {
|
||||||
N = evaluateCGALMesh(*ps);
|
N = evaluateCGALMesh(*ps);
|
||||||
// print_messages_pop();
|
// print_messages_pop();
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
}
|
}
|
||||||
|
// else FIXME: Support other Geometry instances
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
N = CGALCache::instance()->get(this->tree.getIdString(node));
|
N = CGALCache::instance()->get(this->tree.getIdString(node));
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "cgaladvnode.h"
|
#include "cgaladvnode.h"
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
|
#include "polyset.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -111,8 +112,12 @@ Response CSGTermEvaluator::visit(State &state, const AbstractPolyNode &node)
|
||||||
if (state.isPrefix()) {
|
if (state.isPrefix()) {
|
||||||
shared_ptr<CSGTerm> t1;
|
shared_ptr<CSGTerm> t1;
|
||||||
if (this->psevaluator) {
|
if (this->psevaluator) {
|
||||||
shared_ptr<PolySet> ps = this->psevaluator->getPolySet(node, true);
|
shared_ptr<Geometry> geom = this->psevaluator->getGeometry(node, true);
|
||||||
if (ps) {
|
if (geom) {
|
||||||
|
shared_ptr<PolySet> ps = dynamic_pointer_cast<PolySet>(geom);
|
||||||
|
if (!ps) {
|
||||||
|
// FIXME: Convert geom to polyset. Refacting may resume here
|
||||||
|
}
|
||||||
t1 = evaluate_csg_term_from_ps(state, this->highlights, this->background,
|
t1 = evaluate_csg_term_from_ps(state, this->highlights, this->background,
|
||||||
ps, node.modinst, node);
|
ps, node.modinst, node);
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
|
@ -178,7 +183,8 @@ Response CSGTermEvaluator::visit(State &state, const RenderNode &node)
|
||||||
shared_ptr<CSGTerm> t1;
|
shared_ptr<CSGTerm> t1;
|
||||||
shared_ptr<PolySet> ps;
|
shared_ptr<PolySet> ps;
|
||||||
if (this->psevaluator) {
|
if (this->psevaluator) {
|
||||||
ps = this->psevaluator->getPolySet(node, true);
|
shared_ptr<Geometry> geom = this->psevaluator->getGeometry(node, true);
|
||||||
|
ps = dynamic_pointer_cast<PolySet>(geom);
|
||||||
node.progress_report();
|
node.progress_report();
|
||||||
}
|
}
|
||||||
if (ps) {
|
if (ps) {
|
||||||
|
@ -198,7 +204,8 @@ Response CSGTermEvaluator::visit(State &state, const CgaladvNode &node)
|
||||||
// FIXME: Calling evaluator directly since we're not a PolyNode. Generalize this.
|
// FIXME: Calling evaluator directly since we're not a PolyNode. Generalize this.
|
||||||
shared_ptr<PolySet> ps;
|
shared_ptr<PolySet> ps;
|
||||||
if (this->psevaluator) {
|
if (this->psevaluator) {
|
||||||
ps = this->psevaluator->getPolySet(node, true);
|
shared_ptr<Geometry> geom = this->psevaluator->getGeometry(node, true);
|
||||||
|
ps = dynamic_pointer_cast<PolySet>(geom);
|
||||||
}
|
}
|
||||||
if (ps) {
|
if (ps) {
|
||||||
t1 = evaluate_csg_term_from_ps(state, this->highlights, this->background,
|
t1 = evaluate_csg_term_from_ps(state, this->highlights, this->background,
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
#include "Geometry.h"
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef GEOMETRY_H_
|
||||||
|
#define GEOMETRY_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string>
|
||||||
|
#include "linalg.h"
|
||||||
|
|
||||||
|
class Geometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual size_t memsize() const = 0;
|
||||||
|
virtual BoundingBox getBoundingBox() const = 0;
|
||||||
|
virtual std::string dump() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "GeometryCache.h"
|
||||||
|
#include "printutils.h"
|
||||||
|
#include "geometry.h"
|
||||||
|
|
||||||
|
GeometryCache *GeometryCache::inst = NULL;
|
||||||
|
|
||||||
|
void GeometryCache::insert(const std::string &id, const shared_ptr<Geometry> &ps)
|
||||||
|
{
|
||||||
|
this->cache.insert(id, new cache_entry(ps), ps ? ps->memsize() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t GeometryCache::maxSize() const
|
||||||
|
{
|
||||||
|
return this->cache.maxCost();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeometryCache::setMaxSize(size_t limit)
|
||||||
|
{
|
||||||
|
this->cache.setMaxCost(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeometryCache::print()
|
||||||
|
{
|
||||||
|
PRINTB("Geometrys in cache: %d", this->cache.size());
|
||||||
|
PRINTB("Geometry cache size in bytes: %d", this->cache.totalCost());
|
||||||
|
}
|
||||||
|
|
||||||
|
GeometryCache::cache_entry::cache_entry(const shared_ptr<Geometry> &ps) : ps(ps)
|
||||||
|
{
|
||||||
|
if (print_messages_stack.size() > 0) this->msg = print_messages_stack.back();
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef GEOMETRYCACHE_H_
|
||||||
|
#define GEOMETRYCACHE_H_
|
||||||
|
|
||||||
|
#include "cache.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "Geometry.h"
|
||||||
|
|
||||||
|
class GeometryCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GeometryCache(size_t memorylimit = 100*1024*1024) : cache(memorylimit) {}
|
||||||
|
|
||||||
|
static GeometryCache *instance() { if (!inst) inst = new GeometryCache; return inst; }
|
||||||
|
|
||||||
|
bool contains(const std::string &id) const { return this->cache.contains(id); }
|
||||||
|
shared_ptr<class Geometry> get(const std::string &id) const { return this->cache[id]->ps; }
|
||||||
|
void insert(const std::string &id, const shared_ptr<Geometry> &ps);
|
||||||
|
size_t maxSize() const;
|
||||||
|
void setMaxSize(size_t limit);
|
||||||
|
void clear() { cache.clear(); }
|
||||||
|
void print();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static GeometryCache *inst;
|
||||||
|
|
||||||
|
struct cache_entry {
|
||||||
|
shared_ptr<class Geometry> ps;
|
||||||
|
std::string msg;
|
||||||
|
cache_entry(const shared_ptr<Geometry> &ps);
|
||||||
|
~cache_entry() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
Cache<std::string, cache_entry> cache;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -14,6 +14,7 @@
|
||||||
#include "dxftess.h"
|
#include "dxftess.h"
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
|
#include "polyset.h"
|
||||||
|
|
||||||
#include "svg.h"
|
#include "svg.h"
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
|
@ -25,7 +26,7 @@ PolySetCGALEvaluator::PolySetCGALEvaluator(CGALEvaluator &cgalevaluator)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
Geometry *PolySetCGALEvaluator::evaluateGeometry(const ProjectionNode &node)
|
||||||
{
|
{
|
||||||
//openscad_loglevel = 6;
|
//openscad_loglevel = 6;
|
||||||
logstream log(5);
|
logstream log(5);
|
||||||
|
@ -286,14 +287,14 @@ static void add_slice(PolySet *ps, const DxfData &dxf, DxfData::Path &path,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::evaluatePolySet(const LinearExtrudeNode &node)
|
Geometry *PolySetCGALEvaluator::evaluateGeometry(const LinearExtrudeNode &node)
|
||||||
{
|
{
|
||||||
DxfData *dxf;
|
DxfData *dxf;
|
||||||
|
|
||||||
if (node.filename.empty())
|
if (node.filename.empty())
|
||||||
{
|
{
|
||||||
// Before extruding, union all (2D) children nodes
|
// Before extruding, union all (2D) children nodes
|
||||||
// to a single DxfData, then tesselate this into a PolySet
|
// to a single DxfData, then tesselate this into a Geometry
|
||||||
CGAL_Nef_polyhedron sum;
|
CGAL_Nef_polyhedron sum;
|
||||||
BOOST_FOREACH (AbstractNode * v, node.getChildren()) {
|
BOOST_FOREACH (AbstractNode * v, node.getChildren()) {
|
||||||
if (v->modinst->isBackground()) continue;
|
if (v->modinst->isBackground()) continue;
|
||||||
|
@ -315,12 +316,12 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const LinearExtrudeNode &node)
|
||||||
dxf = new DxfData(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale_x);
|
dxf = new DxfData(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale_x);
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *ps = extrudeDxfData(node, *dxf);
|
Geometry *geom = extrudeDxfData(node, *dxf);
|
||||||
delete dxf;
|
delete dxf;
|
||||||
return ps;
|
return geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::extrudeDxfData(const LinearExtrudeNode &node, DxfData &dxf)
|
Geometry *PolySetCGALEvaluator::extrudeDxfData(const LinearExtrudeNode &node, DxfData &dxf)
|
||||||
{
|
{
|
||||||
PolySet *ps = new PolySet();
|
PolySet *ps = new PolySet();
|
||||||
ps->convexity = node.convexity;
|
ps->convexity = node.convexity;
|
||||||
|
@ -386,7 +387,7 @@ PolySet *PolySetCGALEvaluator::extrudeDxfData(const LinearExtrudeNode &node, Dxf
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::evaluatePolySet(const RotateExtrudeNode &node)
|
Geometry *PolySetCGALEvaluator::evaluateGeometry(const RotateExtrudeNode &node)
|
||||||
{
|
{
|
||||||
DxfData *dxf;
|
DxfData *dxf;
|
||||||
|
|
||||||
|
@ -415,12 +416,12 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const RotateExtrudeNode &node)
|
||||||
dxf = new DxfData(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale);
|
dxf = new DxfData(node.fn, node.fs, node.fa, node.filename, node.layername, node.origin_x, node.origin_y, node.scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *ps = rotateDxfData(node, *dxf);
|
Geometry *geom = rotateDxfData(node, *dxf);
|
||||||
delete dxf;
|
delete dxf;
|
||||||
return ps;
|
return geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::evaluatePolySet(const CgaladvNode &node)
|
Geometry *PolySetCGALEvaluator::evaluateGeometry(const CgaladvNode &node)
|
||||||
{
|
{
|
||||||
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(node);
|
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(node);
|
||||||
PolySet *ps = NULL;
|
PolySet *ps = NULL;
|
||||||
|
@ -432,7 +433,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const CgaladvNode &node)
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::evaluatePolySet(const RenderNode &node)
|
Geometry *PolySetCGALEvaluator::evaluateGeometry(const RenderNode &node)
|
||||||
{
|
{
|
||||||
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(node);
|
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(node);
|
||||||
PolySet *ps = NULL;
|
PolySet *ps = NULL;
|
||||||
|
@ -448,7 +449,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const RenderNode &node)
|
||||||
return ps;
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PolySetCGALEvaluator::rotateDxfData(const RotateExtrudeNode &node, DxfData &dxf)
|
Geometry *PolySetCGALEvaluator::rotateDxfData(const RotateExtrudeNode &node, DxfData &dxf)
|
||||||
{
|
{
|
||||||
PolySet *ps = new PolySet();
|
PolySet *ps = new PolySet();
|
||||||
ps->convexity = node.convexity;
|
ps->convexity = node.convexity;
|
||||||
|
|
|
@ -4,23 +4,23 @@
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
This is a PolySet evaluator which uses the CGALEvaluator to support building
|
This is a Geometry evaluator which uses the CGALEvaluator to support building
|
||||||
polysets.
|
geometrys.
|
||||||
*/
|
*/
|
||||||
class PolySetCGALEvaluator : public PolySetEvaluator
|
class PolySetCGALEvaluator : public PolySetEvaluator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PolySetCGALEvaluator(class CGALEvaluator &cgalevaluator);
|
PolySetCGALEvaluator(class CGALEvaluator &cgalevaluator);
|
||||||
virtual ~PolySetCGALEvaluator() { }
|
virtual ~PolySetCGALEvaluator() { }
|
||||||
virtual PolySet *evaluatePolySet(const ProjectionNode &node);
|
virtual Geometry *evaluateGeometry(const ProjectionNode &node);
|
||||||
virtual PolySet *evaluatePolySet(const LinearExtrudeNode &node);
|
virtual Geometry *evaluateGeometry(const LinearExtrudeNode &node);
|
||||||
virtual PolySet *evaluatePolySet(const RotateExtrudeNode &node);
|
virtual Geometry *evaluateGeometry(const RotateExtrudeNode &node);
|
||||||
virtual PolySet *evaluatePolySet(const CgaladvNode &node);
|
virtual Geometry *evaluateGeometry(const CgaladvNode &node);
|
||||||
virtual PolySet *evaluatePolySet(const RenderNode &node);
|
virtual Geometry *evaluateGeometry(const RenderNode &node);
|
||||||
bool debug;
|
bool debug;
|
||||||
protected:
|
protected:
|
||||||
PolySet *extrudeDxfData(const LinearExtrudeNode &node, class DxfData &dxf);
|
Geometry *extrudeDxfData(const LinearExtrudeNode &node, class DxfData &dxf);
|
||||||
PolySet *rotateDxfData(const RotateExtrudeNode &node, class DxfData &dxf);
|
Geometry *rotateDxfData(const RotateExtrudeNode &node, class DxfData &dxf);
|
||||||
|
|
||||||
CGALEvaluator &cgalevaluator;
|
CGALEvaluator &cgalevaluator;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#include "PolySetCache.h"
|
|
||||||
#include "printutils.h"
|
|
||||||
#include "polyset.h"
|
|
||||||
|
|
||||||
PolySetCache *PolySetCache::inst = NULL;
|
|
||||||
|
|
||||||
void PolySetCache::insert(const std::string &id, const shared_ptr<PolySet> &ps)
|
|
||||||
{
|
|
||||||
this->cache.insert(id, new cache_entry(ps), ps ? ps->memsize() : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t PolySetCache::maxSize() const
|
|
||||||
{
|
|
||||||
return this->cache.maxCost();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PolySetCache::setMaxSize(size_t limit)
|
|
||||||
{
|
|
||||||
this->cache.setMaxCost(limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PolySetCache::print()
|
|
||||||
{
|
|
||||||
PRINTB("PolySets in cache: %d", this->cache.size());
|
|
||||||
PRINTB("PolySet cache size in bytes: %d", this->cache.totalCost());
|
|
||||||
}
|
|
||||||
|
|
||||||
PolySetCache::cache_entry::cache_entry(const shared_ptr<PolySet> &ps) : ps(ps)
|
|
||||||
{
|
|
||||||
if (print_messages_stack.size() > 0) this->msg = print_messages_stack.back();
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
#ifndef POLYSETCACHE_H_
|
|
||||||
#define POLYSETCACHE_H_
|
|
||||||
|
|
||||||
#include "cache.h"
|
|
||||||
#include "memory.h"
|
|
||||||
|
|
||||||
class PolySetCache
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PolySetCache(size_t memorylimit = 100*1024*1024) : cache(memorylimit) {}
|
|
||||||
|
|
||||||
static PolySetCache *instance() { if (!inst) inst = new PolySetCache; return inst; }
|
|
||||||
|
|
||||||
bool contains(const std::string &id) const { return this->cache.contains(id); }
|
|
||||||
shared_ptr<class PolySet> get(const std::string &id) const { return this->cache[id]->ps; }
|
|
||||||
void insert(const std::string &id, const shared_ptr<PolySet> &ps);
|
|
||||||
size_t maxSize() const;
|
|
||||||
void setMaxSize(size_t limit);
|
|
||||||
void clear() { cache.clear(); }
|
|
||||||
void print();
|
|
||||||
|
|
||||||
private:
|
|
||||||
static PolySetCache *inst;
|
|
||||||
|
|
||||||
struct cache_entry {
|
|
||||||
shared_ptr<class PolySet> ps;
|
|
||||||
std::string msg;
|
|
||||||
cache_entry(const shared_ptr<PolySet> &ps);
|
|
||||||
~cache_entry() { }
|
|
||||||
};
|
|
||||||
|
|
||||||
Cache<std::string, cache_entry> cache;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,35 +1,35 @@
|
||||||
#include "PolySetCache.h"
|
#include "GeometryCache.h"
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
#include "polyset.h"
|
#include "polyset.h"
|
||||||
#include "Tree.h"
|
#include "Tree.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
The task of PolySetEvaluator is to create, keep track of and cache PolySet instances.
|
The task of PolySetEvaluator is to create, keep track of and cache Geometry instances.
|
||||||
|
|
||||||
All instances of PolySet which are not strictly temporary should be
|
All instances of Geometry which are not strictly temporary should be
|
||||||
requested through this class.
|
requested through this class.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Factory method returning a PolySet from the given node. If the
|
Factory method returning a Geometry from the given node. If the
|
||||||
node is already cached, the cached PolySet will be returned
|
node is already cached, the cached Geometry will be returned
|
||||||
otherwise a new PolySet will be created from the node. If cache is
|
otherwise a new Geometry will be created from the node. If cache is
|
||||||
true, the newly created PolySet will be cached.
|
true, the newly created Geometry will be cached.
|
||||||
*/
|
*/
|
||||||
shared_ptr<PolySet> PolySetEvaluator::getPolySet(const AbstractNode &node, bool cache)
|
shared_ptr<Geometry> PolySetEvaluator::getGeometry(const AbstractNode &node, bool cache)
|
||||||
{
|
{
|
||||||
std::string cacheid = this->tree.getIdString(node);
|
std::string cacheid = this->tree.getIdString(node);
|
||||||
|
|
||||||
if (PolySetCache::instance()->contains(cacheid)) {
|
if (GeometryCache::instance()->contains(cacheid)) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// For cache debugging
|
// For cache debugging
|
||||||
PRINTB("PolySetCache hit: %s", cacheid.substr(0, 40));
|
PRINTB("GeometryCache hit: %s", cacheid.substr(0, 40));
|
||||||
#endif
|
#endif
|
||||||
return PolySetCache::instance()->get(cacheid);
|
return GeometryCache::instance()->get(cacheid);
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<PolySet> ps(node.evaluate_polyset(this));
|
shared_ptr<Geometry> geom(node.evaluate_geometry(this));
|
||||||
if (cache) PolySetCache::instance()->insert(cacheid, ps);
|
if (cache) GeometryCache::instance()->insert(cacheid, geom);
|
||||||
return ps;
|
return geom;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,13 +11,13 @@ public:
|
||||||
|
|
||||||
const Tree &getTree() const { return this->tree; }
|
const Tree &getTree() const { return this->tree; }
|
||||||
|
|
||||||
virtual shared_ptr<class PolySet> getPolySet(const class AbstractNode &, bool cache);
|
virtual shared_ptr<class Geometry> getGeometry(const class AbstractNode &, bool cache);
|
||||||
|
|
||||||
virtual PolySet *evaluatePolySet(const class ProjectionNode &) { return NULL; }
|
virtual Geometry *evaluateGeometry(const class ProjectionNode &) { return NULL; }
|
||||||
virtual PolySet *evaluatePolySet(const class LinearExtrudeNode &) { return NULL; }
|
virtual Geometry *evaluateGeometry(const class LinearExtrudeNode &) { return NULL; }
|
||||||
virtual PolySet *evaluatePolySet(const class RotateExtrudeNode &) { return NULL; }
|
virtual Geometry *evaluateGeometry(const class RotateExtrudeNode &) { return NULL; }
|
||||||
virtual PolySet *evaluatePolySet(const class CgaladvNode &) { return NULL; }
|
virtual Geometry *evaluateGeometry(const class CgaladvNode &) { return NULL; }
|
||||||
virtual PolySet *evaluatePolySet(const class RenderNode &) { return NULL; }
|
virtual Geometry *evaluateGeometry(const class RenderNode &) { return NULL; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Tree &tree;
|
const Tree &tree;
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#include "Polygon2d.h"
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
size_t Polygon2d::memsize() const
|
||||||
|
{
|
||||||
|
size_t mem = 0;
|
||||||
|
BOOST_FOREACH(const Outline2d &o, this->outlines) {
|
||||||
|
mem += o.size() * sizeof(Vector2d) + sizeof(Outline2d);
|
||||||
|
}
|
||||||
|
mem += sizeof(Polygon2d);
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
BoundingBox Polygon2d::getBoundingBox() const
|
||||||
|
{
|
||||||
|
BoundingBox bbox;
|
||||||
|
BOOST_FOREACH(const Outline2d &o, this->outlines) {
|
||||||
|
BOOST_FOREACH(const Vector2d &v, o) {
|
||||||
|
bbox.extend(Vector3d(v[0], v[1], 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Polygon2d::dump() const
|
||||||
|
{
|
||||||
|
std::stringstream out;
|
||||||
|
out << "Polygon2d:";
|
||||||
|
//FIXME: Implement
|
||||||
|
/*
|
||||||
|
<< "\n convexity:" << this->convexity
|
||||||
|
<< "\n num polygons: " << polygons.size()
|
||||||
|
<< "\n num borders: " << borders.size()
|
||||||
|
<< "\n polygons data:";
|
||||||
|
for (size_t i = 0; i < polygons.size(); i++) {
|
||||||
|
out << "\n polygon begin:";
|
||||||
|
const Polygon *poly = &polygons[i];
|
||||||
|
for (size_t j = 0; j < poly->size(); j++) {
|
||||||
|
Vector3d v = poly->at(j);
|
||||||
|
out << "\n vertex:" << v.transpose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << "\n borders data:";
|
||||||
|
for (size_t i = 0; i < borders.size(); i++) {
|
||||||
|
out << "\n border polygon begin:";
|
||||||
|
const Polygon *poly = &borders[i];
|
||||||
|
for (size_t j = 0; j < poly->size(); j++) {
|
||||||
|
Vector3d v = poly->at(j);
|
||||||
|
out << "\n vertex:" << v.transpose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << "\nPolySet end";
|
||||||
|
*/
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// PolySet *Polygon2d::tessellate()
|
||||||
|
// {
|
||||||
|
// return NULL;
|
||||||
|
// }
|
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef POLYGON2D_H_
|
||||||
|
#define POLYGON2D_H_
|
||||||
|
|
||||||
|
#include "Geometry.h"
|
||||||
|
#include "linalg.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
typedef std::vector<Vector2d> Outline2d;
|
||||||
|
|
||||||
|
class Polygon2d : public Geometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual size_t memsize() const;
|
||||||
|
virtual BoundingBox getBoundingBox() const;
|
||||||
|
virtual std::string dump() const;
|
||||||
|
|
||||||
|
void addOutline(const Outline2d &outline);
|
||||||
|
// class PolySet *tessellate();
|
||||||
|
private:
|
||||||
|
std::vector<Outline2d> outlines;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -31,7 +31,7 @@
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QStatusBar>
|
#include <QStatusBar>
|
||||||
#include "PolySetCache.h"
|
#include "GeometryCache.h"
|
||||||
#include "AutoUpdater.h"
|
#include "AutoUpdater.h"
|
||||||
#include "feature.h"
|
#include "feature.h"
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
|
@ -84,7 +84,7 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
|
||||||
this->defaultmap["3dview/colorscheme"] = this->colorSchemeChooser->currentItem()->text();
|
this->defaultmap["3dview/colorscheme"] = this->colorSchemeChooser->currentItem()->text();
|
||||||
this->defaultmap["advanced/opencsg_show_warning"] = true;
|
this->defaultmap["advanced/opencsg_show_warning"] = true;
|
||||||
this->defaultmap["advanced/enable_opencsg_opengl1x"] = true;
|
this->defaultmap["advanced/enable_opencsg_opengl1x"] = true;
|
||||||
this->defaultmap["advanced/polysetCacheSize"] = uint(PolySetCache::instance()->maxSize());
|
this->defaultmap["advanced/polysetCacheSize"] = uint(GeometryCache::instance()->maxSize());
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
this->defaultmap["advanced/cgalCacheSize"] = uint(CGALCache::instance()->maxSize());
|
this->defaultmap["advanced/cgalCacheSize"] = uint(CGALCache::instance()->maxSize());
|
||||||
#endif
|
#endif
|
||||||
|
@ -348,7 +348,7 @@ void Preferences::on_polysetCacheSizeEdit_textChanged(const QString &text)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
settings.setValue("advanced/polysetCacheSize", text);
|
settings.setValue("advanced/polysetCacheSize", text);
|
||||||
PolySetCache::instance()->setMaxSize(text.toULong());
|
GeometryCache::instance()->setMaxSize(text.toULong());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Preferences::on_opencsgLimitEdit_textChanged(const QString &text)
|
void Preferences::on_opencsgLimitEdit_textChanged(const QString &text)
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "evalcontext.h"
|
#include "evalcontext.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
|
#include "polyset.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <boost/assign/std/vector.hpp>
|
#include <boost/assign/std/vector.hpp>
|
||||||
|
@ -116,9 +117,9 @@ AbstractNode *CgaladvModule::instantiate(const Context *ctx, const ModuleInstant
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *CgaladvNode::evaluate_polyset(PolySetEvaluator *ps) const
|
Geometry *CgaladvNode::evaluate_geometry(PolySetEvaluator *ps) const
|
||||||
{
|
{
|
||||||
return ps->evaluatePolySet(*this);
|
return ps->evaluateGeometry(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CgaladvNode::name() const
|
std::string CgaladvNode::name() const
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
}
|
}
|
||||||
virtual std::string toString() const;
|
virtual std::string toString() const;
|
||||||
virtual std::string name() const;
|
virtual std::string name() const;
|
||||||
PolySet *evaluate_polyset(class PolySetEvaluator *ps) const;
|
Geometry *evaluate_geometry(class PolySetEvaluator *ps) const;
|
||||||
|
|
||||||
Value path;
|
Value path;
|
||||||
std::string subdiv_type;
|
std::string subdiv_type;
|
||||||
|
|
|
@ -182,7 +182,7 @@ void read_stl_facet( std::ifstream &f, stl_facet &facet )
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
|
Geometry *ImportNode::evaluate_geometry(class PolySetEvaluator *) const
|
||||||
{
|
{
|
||||||
PolySet *p = NULL;
|
PolySet *p = NULL;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
int convexity;
|
int convexity;
|
||||||
double fn, fs, fa;
|
double fn, fs, fa;
|
||||||
double origin_x, origin_y, scale;
|
double origin_x, origin_y, scale;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
|
virtual Geometry *evaluate_geometry(class PolySetEvaluator *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -127,7 +127,7 @@ AbstractNode *LinearExtrudeModule::instantiate(const Context *ctx, const ModuleI
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PolySet *LinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
|
class Geometry *LinearExtrudeNode::evaluate_geometry(PolySetEvaluator *evaluator) const
|
||||||
{
|
{
|
||||||
if (!evaluator) {
|
if (!evaluator) {
|
||||||
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
||||||
|
@ -136,7 +136,7 @@ class PolySet *LinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator)
|
||||||
|
|
||||||
print_messages_push();
|
print_messages_push();
|
||||||
|
|
||||||
PolySet *ps = evaluator->evaluatePolySet(*this);
|
Geometry *ps = evaluator->evaluateGeometry(*this);
|
||||||
|
|
||||||
print_messages_pop();
|
print_messages_pop();
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
bool center, has_twist;
|
bool center, has_twist;
|
||||||
Filename filename;
|
Filename filename;
|
||||||
std::string layername;
|
std::string layername;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
|
virtual Geometry *evaluate_geometry(class PolySetEvaluator *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PolySetCache.h"
|
#include "GeometryCache.h"
|
||||||
#include "ModuleCache.h"
|
#include "ModuleCache.h"
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "parsersettings.h"
|
#include "parsersettings.h"
|
||||||
|
@ -81,7 +81,6 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/version.hpp>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
|
@ -436,7 +435,7 @@ MainWindow::loadDesignSettings()
|
||||||
designActionAutoReload->setChecked(true);
|
designActionAutoReload->setChecked(true);
|
||||||
}
|
}
|
||||||
uint polySetCacheSize = Preferences::inst()->getValue("advanced/polysetCacheSize").toUInt();
|
uint polySetCacheSize = Preferences::inst()->getValue("advanced/polysetCacheSize").toUInt();
|
||||||
PolySetCache::instance()->setMaxSize(polySetCacheSize);
|
GeometryCache::instance()->setMaxSize(polySetCacheSize);
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
uint cgalCacheSize = Preferences::inst()->getValue("advanced/cgalCacheSize").toUInt();
|
uint cgalCacheSize = Preferences::inst()->getValue("advanced/cgalCacheSize").toUInt();
|
||||||
CGALCache::instance()->setMaxSize(cgalCacheSize);
|
CGALCache::instance()->setMaxSize(cgalCacheSize);
|
||||||
|
@ -803,7 +802,7 @@ void MainWindow::compileCSG(bool procevents)
|
||||||
if (!root_raw_term) {
|
if (!root_raw_term) {
|
||||||
PRINT("ERROR: CSG generation failed! (no top level object found)");
|
PRINT("ERROR: CSG generation failed! (no top level object found)");
|
||||||
}
|
}
|
||||||
PolySetCache::instance()->print();
|
GeometryCache::instance()->print();
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
CGALCache::instance()->print();
|
CGALCache::instance()->print();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1312,7 +1311,7 @@ void MainWindow::actionRenderCGALDone(CGAL_Nef_polyhedron *root_N)
|
||||||
progress_report_fin();
|
progress_report_fin();
|
||||||
|
|
||||||
if (root_N) {
|
if (root_N) {
|
||||||
PolySetCache::instance()->print();
|
GeometryCache::instance()->print();
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
CGALCache::instance()->print();
|
CGALCache::instance()->print();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1582,7 +1581,7 @@ void MainWindow::actionExportImage()
|
||||||
|
|
||||||
void MainWindow::actionFlushCaches()
|
void MainWindow::actionFlushCaches()
|
||||||
{
|
{
|
||||||
PolySetCache::instance()->clear();
|
GeometryCache::instance()->clear();
|
||||||
#ifdef ENABLE_CGAL
|
#ifdef ENABLE_CGAL
|
||||||
CGALCache::instance()->clear();
|
CGALCache::instance()->clear();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
using boost::shared_ptr;
|
using boost::shared_ptr;
|
||||||
|
using boost::dynamic_pointer_cast;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -35,10 +35,10 @@ public:
|
||||||
overloaded to provide specialization for e.g. CSG nodes, primitive nodes etc.
|
overloaded to provide specialization for e.g. CSG nodes, primitive nodes etc.
|
||||||
Used for human-readable output. */
|
Used for human-readable output. */
|
||||||
virtual std::string name() const;
|
virtual std::string name() const;
|
||||||
/*! Should return a PolySet of the given geometry. Returns NULL if smth. goes wrong.
|
/*! Should return a Geometry instance describing the node. Returns NULL if smth.
|
||||||
This is only called by PolySetEvaluator, to make sure polysets are inserted into
|
goes wrong. This is only called by PolySetEvaluator, to make sure polysets
|
||||||
the cache*/
|
are inserted into the cache*/
|
||||||
virtual class PolySet *evaluate_polyset(class PolySetEvaluator *) const { return NULL; }
|
virtual class Geometry *evaluate_geometry(class PolySetEvaluator *) const { return NULL; }
|
||||||
|
|
||||||
const std::vector<AbstractNode*> &getChildren() const {
|
const std::vector<AbstractNode*> &getChildren() const {
|
||||||
return this->children;
|
return this->children;
|
||||||
|
|
|
@ -35,9 +35,12 @@
|
||||||
FIXME: It's a bit messy and is a prime target for refactoring.
|
FIXME: It's a bit messy and is a prime target for refactoring.
|
||||||
|
|
||||||
1) Store 2D and 3D polygon meshes from all origins
|
1) Store 2D and 3D polygon meshes from all origins
|
||||||
2) Store 2D outlines, used for rendering edges
|
2) Store 2D outlines, used for rendering edges (2D only)
|
||||||
3) Rendering of polygons and edges
|
3) Rendering of polygons and edges
|
||||||
|
|
||||||
|
|
||||||
|
PolySet must only contain convex polygons
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
PolySet::PolySet() : grid(GRID_FINE), is2d(false), convexity(1)
|
PolySet::PolySet() : grid(GRID_FINE), is2d(false), convexity(1)
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
#ifndef POLYSET_H_
|
#ifndef POLYSET_H_
|
||||||
#define POLYSET_H_
|
#define POLYSET_H_
|
||||||
|
|
||||||
|
#include "Geometry.h"
|
||||||
#include "system-gl.h"
|
#include "system-gl.h"
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
#include "linalg.h"
|
#include "linalg.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class PolySet
|
class PolySet : public Geometry
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::vector<Vector3d> Polygon;
|
typedef std::vector<Vector3d> Polygon;
|
||||||
|
@ -21,12 +22,15 @@ public:
|
||||||
PolySet();
|
PolySet();
|
||||||
~PolySet();
|
~PolySet();
|
||||||
|
|
||||||
|
virtual size_t memsize() const;
|
||||||
|
virtual BoundingBox getBoundingBox() const;
|
||||||
|
virtual std::string dump() const;
|
||||||
|
|
||||||
bool empty() const { return polygons.size() == 0; }
|
bool empty() const { return polygons.size() == 0; }
|
||||||
void append_poly();
|
void append_poly();
|
||||||
void append_vertex(double x, double y, double z = 0.0);
|
void append_vertex(double x, double y, double z = 0.0);
|
||||||
void insert_vertex(double x, double y, double z = 0.0);
|
void insert_vertex(double x, double y, double z = 0.0);
|
||||||
size_t memsize() const;
|
size_t memsize() const;
|
||||||
|
|
||||||
BoundingBox getBoundingBox() const;
|
BoundingBox getBoundingBox() const;
|
||||||
|
|
||||||
#define CSGMODE_DIFFERENCE_FLAG 0x10
|
#define CSGMODE_DIFFERENCE_FLAG 0x10
|
||||||
|
@ -42,7 +46,6 @@ public:
|
||||||
|
|
||||||
void render_surface(csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo = NULL) const;
|
void render_surface(csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo = NULL) const;
|
||||||
void render_edges(csgmode_e csgmode) const;
|
void render_edges(csgmode_e csgmode) const;
|
||||||
std::string dump() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "polyset.h"
|
#include "polyset.h"
|
||||||
#include "evalcontext.h"
|
#include "evalcontext.h"
|
||||||
|
#include "Polygon2d.h"
|
||||||
#include "dxfdata.h"
|
#include "dxfdata.h"
|
||||||
#include "dxftess.h"
|
#include "dxftess.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/assign/std/vector.hpp>
|
#include <boost/assign/std/vector.hpp>
|
||||||
using namespace boost::assign; // bring 'operator+=()' into scope
|
using namespace boost::assign; // bring 'operator+=()' into scope
|
||||||
|
|
||||||
|
@ -105,7 +107,7 @@ public:
|
||||||
primitive_type_e type;
|
primitive_type_e type;
|
||||||
int convexity;
|
int convexity;
|
||||||
Value points, paths, faces;
|
Value points, paths, faces;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
|
virtual Geometry *evaluate_geometry(class PolySetEvaluator *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -188,8 +190,8 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
|
||||||
node->fa = F_MINIMUM;
|
node->fa = F_MINIMUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (this->type) {
|
||||||
if (type == CUBE) {
|
case CUBE: {
|
||||||
Value size = c.lookup_variable("size");
|
Value size = c.lookup_variable("size");
|
||||||
Value center = c.lookup_variable("center");
|
Value center = c.lookup_variable("center");
|
||||||
size.getDouble(node->x);
|
size.getDouble(node->x);
|
||||||
|
@ -199,16 +201,16 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
|
||||||
if (center.type() == Value::BOOL) {
|
if (center.type() == Value::BOOL) {
|
||||||
node->center = center.toBool();
|
node->center = center.toBool();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case SPHERE: {
|
||||||
if (type == SPHERE) {
|
|
||||||
const Value r = lookup_radius(c, "d", "r");
|
const Value r = lookup_radius(c, "d", "r");
|
||||||
if (r.type() == Value::NUMBER) {
|
if (r.type() == Value::NUMBER) {
|
||||||
node->r1 = r.toDouble();
|
node->r1 = r.toDouble();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case CYLINDER: {
|
||||||
if (type == CYLINDER) {
|
|
||||||
const Value h = c.lookup_variable("h");
|
const Value h = c.lookup_variable("h");
|
||||||
if (h.type() == Value::NUMBER) {
|
if (h.type() == Value::NUMBER) {
|
||||||
node->h = h.toDouble();
|
node->h = h.toDouble();
|
||||||
|
@ -232,21 +234,20 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
|
||||||
if (center.type() == Value::BOOL) {
|
if (center.type() == Value::BOOL) {
|
||||||
node->center = center.toBool();
|
node->center = center.toBool();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case POLYHEDRON: {
|
||||||
if (type == POLYHEDRON) {
|
|
||||||
node->points = c.lookup_variable("points");
|
node->points = c.lookup_variable("points");
|
||||||
node->faces = c.lookup_variable("faces");
|
node->faces = c.lookup_variable("faces");
|
||||||
if (node->faces.type() == Value::UNDEFINED) {
|
if (node->faces.type() == Value::UNDEFINED) {
|
||||||
// backwards compatable
|
// backwards compatible
|
||||||
node->faces = c.lookup_variable("triangles");
|
node->faces = c.lookup_variable("triangles");
|
||||||
if (node->faces.type() != Value::UNDEFINED) {
|
if (node->faces.type() != Value::UNDEFINED) {
|
||||||
PRINT("DEPRECATED: polyhedron(triangles=[]) will be removed in future releases. Use polyhedron(faces=[]) instead.");
|
PRINT("DEPRECATED: polyhedron(triangles=[]) will be removed in future releases. Use polyhedron(faces=[]) instead.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case SQUARE: {
|
||||||
if (type == SQUARE) {
|
|
||||||
Value size = c.lookup_variable("size");
|
Value size = c.lookup_variable("size");
|
||||||
Value center = c.lookup_variable("center");
|
Value center = c.lookup_variable("center");
|
||||||
size.getDouble(node->x);
|
size.getDouble(node->x);
|
||||||
|
@ -255,18 +256,20 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
|
||||||
if (center.type() == Value::BOOL) {
|
if (center.type() == Value::BOOL) {
|
||||||
node->center = center.toBool();
|
node->center = center.toBool();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case CIRCLE: {
|
||||||
if (type == CIRCLE) {
|
|
||||||
const Value r = lookup_radius(c, "d", "r");
|
const Value r = lookup_radius(c, "d", "r");
|
||||||
if (r.type() == Value::NUMBER) {
|
if (r.type() == Value::NUMBER) {
|
||||||
node->r1 = r.toDouble();
|
node->r1 = r.toDouble();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case POLYGON: {
|
||||||
if (type == POLYGON) {
|
|
||||||
node->points = c.lookup_variable("points");
|
node->points = c.lookup_variable("points");
|
||||||
node->paths = c.lookup_variable("paths");
|
node->paths = c.lookup_variable("paths");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
node->convexity = c.lookup_variable("convexity", true).toDouble();
|
node->convexity = c.lookup_variable("convexity", true).toDouble();
|
||||||
|
@ -289,12 +292,14 @@ static void generate_circle(point2d *circle, double r, int fragments)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *PrimitiveNode::evaluate_polyset(class PolySetEvaluator *) const
|
Geometry *PrimitiveNode::evaluate_geometry(class PolySetEvaluator *) const
|
||||||
{
|
{
|
||||||
PolySet *p = new PolySet();
|
Geometry *g = NULL;
|
||||||
|
|
||||||
if (this->type == CUBE && this->x > 0 && this->y > 0 && this->z > 0)
|
if (this->type == CUBE && this->x > 0 && this->y > 0 && this->z > 0)
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
double x1, x2, y1, y2, z1, z2;
|
double x1, x2, y1, y2, z1, z2;
|
||||||
if (this->center) {
|
if (this->center) {
|
||||||
x1 = -this->x/2;
|
x1 = -this->x/2;
|
||||||
|
@ -349,6 +354,8 @@ PolySet *PrimitiveNode::evaluate_polyset(class PolySetEvaluator *) const
|
||||||
|
|
||||||
if (this->type == SPHERE && this->r1 > 0)
|
if (this->type == SPHERE && this->r1 > 0)
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
struct ring_s {
|
struct ring_s {
|
||||||
point2d *points;
|
point2d *points;
|
||||||
double z;
|
double z;
|
||||||
|
@ -417,6 +424,8 @@ sphere_next_r2:
|
||||||
if (this->type == CYLINDER &&
|
if (this->type == CYLINDER &&
|
||||||
this->h > 0 && this->r1 >=0 && this->r2 >= 0 && (this->r1 > 0 || this->r2 > 0))
|
this->h > 0 && this->r1 >=0 && this->r2 >= 0 && (this->r1 > 0 || this->r2 > 0))
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
int fragments = Calc::get_fragments_from_r(fmax(this->r1, this->r2), this->fn, this->fs, this->fa);
|
int fragments = Calc::get_fragments_from_r(fmax(this->r1, this->r2), this->fn, this->fs, this->fa);
|
||||||
|
|
||||||
double z1, z2;
|
double z1, z2;
|
||||||
|
@ -476,6 +485,8 @@ sphere_next_r2:
|
||||||
|
|
||||||
if (this->type == POLYHEDRON)
|
if (this->type == POLYHEDRON)
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
p->convexity = this->convexity;
|
p->convexity = this->convexity;
|
||||||
for (size_t i=0; i<this->faces.toVector().size(); i++)
|
for (size_t i=0; i<this->faces.toVector().size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -493,6 +504,30 @@ sphere_next_r2:
|
||||||
|
|
||||||
if (this->type == SQUARE && x > 0 && y > 0)
|
if (this->type == SQUARE && x > 0 && y > 0)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Polygon2d *p = new Polygon2d();
|
||||||
|
g = p;
|
||||||
|
double x1, x2, y1, y2;
|
||||||
|
if (this->center) {
|
||||||
|
x1 = -this->x/2;
|
||||||
|
x2 = +this->x/2;
|
||||||
|
y1 = -this->y/2;
|
||||||
|
y2 = +this->y/2;
|
||||||
|
} else {
|
||||||
|
x1 = y1 = 0;
|
||||||
|
x2 = this->x;
|
||||||
|
y2 = this->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Outline2d o(4);
|
||||||
|
o.push_back(Vector2d(x1, y1));
|
||||||
|
o.push_back(Vector2d(x2, y1));
|
||||||
|
o.push_back(Vector2d(x2, y2));
|
||||||
|
o.push_back(Vector2d(x1, y2));
|
||||||
|
*/
|
||||||
|
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
double x1, x2, y1, y2;
|
double x1, x2, y1, y2;
|
||||||
if (this->center) {
|
if (this->center) {
|
||||||
x1 = -this->x/2;
|
x1 = -this->x/2;
|
||||||
|
@ -515,6 +550,8 @@ sphere_next_r2:
|
||||||
|
|
||||||
if (this->type == CIRCLE)
|
if (this->type == CIRCLE)
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
int fragments = Calc::get_fragments_from_r(this->r1, this->fn, this->fs, this->fa);
|
int fragments = Calc::get_fragments_from_r(this->r1, this->fn, this->fs, this->fa);
|
||||||
|
|
||||||
p->is2d = true;
|
p->is2d = true;
|
||||||
|
@ -528,6 +565,8 @@ sphere_next_r2:
|
||||||
|
|
||||||
if (this->type == POLYGON)
|
if (this->type == POLYGON)
|
||||||
{
|
{
|
||||||
|
PolySet *p = new PolySet();
|
||||||
|
g = p;
|
||||||
DxfData dd;
|
DxfData dd;
|
||||||
|
|
||||||
for (size_t i=0; i<this->points.toVector().size(); i++) {
|
for (size_t i=0; i<this->points.toVector().size(); i++) {
|
||||||
|
@ -580,9 +619,54 @@ sphere_next_r2:
|
||||||
p->convexity = convexity;
|
p->convexity = convexity;
|
||||||
dxf_tesselate(p, dd, 0, Vector2d(1,1), true, false, 0);
|
dxf_tesselate(p, dd, 0, Vector2d(1,1), true, false, 0);
|
||||||
dxf_border_to_ps(p, dd);
|
dxf_border_to_ps(p, dd);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Polygon2D *p = new Polygon2D();
|
||||||
|
g = p;
|
||||||
|
// Collect vertices
|
||||||
|
std::vector<Vector2d> vertices;
|
||||||
|
for (size_t i=0; i<this->points.toVector().size(); i++) {
|
||||||
|
double x,y;
|
||||||
|
if (!this->points.toVector()[i].getVec2(x, y)) {
|
||||||
|
PRINTB("ERROR: Unable to convert point at index %d to a vec2 of numbers", i);
|
||||||
|
delete p;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
vertices.push_back(Vector2d(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
Polygon2d polygon;
|
||||||
|
|
||||||
|
// If no indices, assume one single polygon
|
||||||
|
if (this->paths.toVector().size() == 0) {
|
||||||
|
assert(vertices.size() >= 3); // FIXME: Fail gracefully
|
||||||
|
Outline2d outline;
|
||||||
|
BOOST_FOREACH(const Vector2d &p, vertices) outline.push_back(p);
|
||||||
|
polygon.addOutline(outline);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
BOOST_FOREACH(const Value &val, this->paths.toVector()) {
|
||||||
|
Outline2d outline;
|
||||||
|
BOOST_FOREACH(const Value &idxval, val.toVector()) {
|
||||||
|
unsigned int idx = idxval.toDouble();
|
||||||
|
if (idx < vertices.size()) outline.push_back(vertices[idx]);
|
||||||
|
}
|
||||||
|
polygon.addOutline(outline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScadPolygon::tessellate(polygons);
|
||||||
|
ScadPolygon::createPolyset(*p, polygons);
|
||||||
|
p->is2d = true;
|
||||||
|
p->convexity = convexity;
|
||||||
|
// dxf_tesselate(p, dd, 0, true, false, 0);
|
||||||
|
// dxf_border_to_ps(p, dd);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
// FIXME: IF the above failed, create an empty polyset as that's required later on
|
||||||
|
if (!g) g = new PolySet();
|
||||||
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string PrimitiveNode::toString() const
|
std::string PrimitiveNode::toString() const
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "visitor.h"
|
#include "visitor.h"
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
|
#include "polyset.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -68,7 +69,7 @@ AbstractNode *ProjectionModule::instantiate(const Context *ctx, const ModuleInst
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *ProjectionNode::evaluate_polyset(PolySetEvaluator *evaluator) const
|
Geometry *ProjectionNode::evaluate_geometry(PolySetEvaluator *evaluator) const
|
||||||
{
|
{
|
||||||
if (!evaluator) {
|
if (!evaluator) {
|
||||||
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
||||||
|
@ -77,7 +78,7 @@ PolySet *ProjectionNode::evaluate_polyset(PolySetEvaluator *evaluator) const
|
||||||
|
|
||||||
print_messages_push();
|
print_messages_push();
|
||||||
|
|
||||||
PolySet *ps = evaluator->evaluatePolySet(*this);
|
Geometry *ps = evaluator->evaluateGeometry(*this);
|
||||||
|
|
||||||
print_messages_pop();
|
print_messages_pop();
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
|
|
||||||
int convexity;
|
int convexity;
|
||||||
bool cut_mode;
|
bool cut_mode;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *evaluator) const;
|
virtual class Geometry *evaluate_geometry(class PolySetEvaluator *evaluator) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "evalcontext.h"
|
#include "evalcontext.h"
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "PolySetEvaluator.h"
|
#include "PolySetEvaluator.h"
|
||||||
|
#include "polyset.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <boost/assign/std/vector.hpp>
|
#include <boost/assign/std/vector.hpp>
|
||||||
|
@ -61,9 +62,9 @@ AbstractNode *RenderModule::instantiate(const Context *ctx, const ModuleInstanti
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PolySet *RenderNode::evaluate_polyset(PolySetEvaluator *ps) const
|
class Geometry *RenderNode::evaluate_geometry(PolySetEvaluator *ps) const
|
||||||
{
|
{
|
||||||
return ps->evaluatePolySet(*this);
|
return ps->evaluateGeometry(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string RenderNode::toString() const
|
std::string RenderNode::toString() const
|
||||||
|
|
|
@ -14,7 +14,7 @@ public:
|
||||||
}
|
}
|
||||||
virtual std::string toString() const;
|
virtual std::string toString() const;
|
||||||
virtual std::string name() const { return "render"; }
|
virtual std::string name() const { return "render"; }
|
||||||
PolySet *evaluate_polyset(class PolySetEvaluator *ps) const;
|
Geometry *evaluate_geometry(class PolySetEvaluator *ps) const;
|
||||||
|
|
||||||
int convexity;
|
int convexity;
|
||||||
};
|
};
|
||||||
|
|
|
@ -92,7 +92,7 @@ AbstractNode *RotateExtrudeModule::instantiate(const Context *ctx, const ModuleI
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *RotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
|
Geometry *RotateExtrudeNode::evaluate_geometry(PolySetEvaluator *evaluator) const
|
||||||
{
|
{
|
||||||
if (!evaluator) {
|
if (!evaluator) {
|
||||||
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
PRINTB("WARNING: No suitable PolySetEvaluator found for %s module!", this->name());
|
||||||
|
@ -101,7 +101,7 @@ PolySet *RotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
|
||||||
|
|
||||||
print_messages_push();
|
print_messages_push();
|
||||||
|
|
||||||
PolySet *ps = evaluator->evaluatePolySet(*this);
|
Geometry *ps = evaluator->evaluateGeometry(*this);
|
||||||
|
|
||||||
print_messages_pop();
|
print_messages_pop();
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
double origin_x, origin_y, scale;
|
double origin_x, origin_y, scale;
|
||||||
Filename filename;
|
Filename filename;
|
||||||
std::string layername;
|
std::string layername;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
|
virtual Geometry *evaluate_geometry(class PolySetEvaluator *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,7 +67,7 @@ public:
|
||||||
Filename filename;
|
Filename filename;
|
||||||
bool center;
|
bool center;
|
||||||
int convexity;
|
int convexity;
|
||||||
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
|
virtual Geometry *evaluate_geometry(class PolySetEvaluator *) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
AbstractNode *SurfaceModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
|
AbstractNode *SurfaceModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
|
||||||
|
@ -98,7 +98,7 @@ AbstractNode *SurfaceModule::instantiate(const Context *ctx, const ModuleInstant
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolySet *SurfaceNode::evaluate_polyset(class PolySetEvaluator *) const
|
Geometry *SurfaceNode::evaluate_geometry(class PolySetEvaluator *) const
|
||||||
{
|
{
|
||||||
handle_dep(filename);
|
handle_dep(filename);
|
||||||
std::ifstream stream(filename.c_str());
|
std::ifstream stream(filename.c_str());
|
||||||
|
|
|
@ -521,6 +521,8 @@ set(CORE_SOURCES
|
||||||
../src/feature.cc
|
../src/feature.cc
|
||||||
../src/csgterm.cc
|
../src/csgterm.cc
|
||||||
../src/csgtermnormalizer.cc
|
../src/csgtermnormalizer.cc
|
||||||
|
../src/Geometry.cc
|
||||||
|
../src/Polygon2d.cc
|
||||||
../src/polyset.cc
|
../src/polyset.cc
|
||||||
../src/csgops.cc
|
../src/csgops.cc
|
||||||
../src/transform.cc
|
../src/transform.cc
|
||||||
|
@ -565,7 +567,7 @@ set(COMMON_SOURCES
|
||||||
../src/nodedumper.cc
|
../src/nodedumper.cc
|
||||||
../src/traverser.cc
|
../src/traverser.cc
|
||||||
../src/PolySetEvaluator.cc
|
../src/PolySetEvaluator.cc
|
||||||
../src/PolySetCache.cc
|
../src/GeometryCache.cc
|
||||||
../src/Tree.cc
|
../src/Tree.cc
|
||||||
../src/lodepng.cpp)
|
../src/lodepng.cpp)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue