mirror of https://github.com/vitalif/openscad
87 lines
1.9 KiB
C++
87 lines
1.9 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include "memory.h"
|
|
#include "linalg.h"
|
|
|
|
class Geometry;
|
|
|
|
class CSGTerm
|
|
{
|
|
public:
|
|
enum type_e {
|
|
TYPE_PRIMITIVE,
|
|
TYPE_UNION,
|
|
TYPE_INTERSECTION,
|
|
TYPE_DIFFERENCE
|
|
};
|
|
|
|
enum Flag {
|
|
FLAG_NONE = 0x00,
|
|
FLAG_BACKGROUND = 0x01,
|
|
FLAG_HIGHLIGHT = 0x03
|
|
};
|
|
|
|
static shared_ptr<CSGTerm> createCSGTerm(type_e type, shared_ptr<CSGTerm> left, shared_ptr<CSGTerm> right);
|
|
static shared_ptr<CSGTerm> createCSGTerm(type_e type, CSGTerm *left, CSGTerm *right);
|
|
|
|
type_e type;
|
|
shared_ptr<const Geometry> geom;
|
|
std::string label;
|
|
shared_ptr<CSGTerm> left;
|
|
shared_ptr<CSGTerm> right;
|
|
BoundingBox bbox;
|
|
Flag flag;
|
|
|
|
CSGTerm(const shared_ptr<const Geometry> &geom, const Transform3d &matrix, const Color4f &color, const std::string &label);
|
|
~CSGTerm();
|
|
|
|
const BoundingBox &getBoundingBox() const { return this->bbox; }
|
|
|
|
std::string dump();
|
|
private:
|
|
CSGTerm(type_e type, shared_ptr<CSGTerm> left, shared_ptr<CSGTerm> right);
|
|
CSGTerm(type_e type, CSGTerm *left, CSGTerm *right);
|
|
|
|
void initBoundingBox();
|
|
|
|
Transform3d m;
|
|
Color4f color;
|
|
|
|
friend class CSGChain;
|
|
};
|
|
|
|
class CSGChainObject
|
|
{
|
|
public:
|
|
CSGChainObject(shared_ptr<const Geometry> geom,
|
|
const Transform3d &matrix,
|
|
const Color4f &color,
|
|
CSGTerm::type_e type,
|
|
const std::string &label,
|
|
CSGTerm::Flag flag = CSGTerm::FLAG_NONE)
|
|
: geom(geom), matrix(matrix), color(color), type(type), label(label), flag(flag) {}
|
|
|
|
shared_ptr<const Geometry> geom;
|
|
Transform3d matrix;
|
|
Color4f color;
|
|
CSGTerm::type_e type;
|
|
std::string label;
|
|
CSGTerm::Flag flag;
|
|
};
|
|
|
|
class CSGChain
|
|
{
|
|
public:
|
|
std::vector<CSGChainObject> objects;
|
|
|
|
CSGChain() {};
|
|
|
|
void import(shared_ptr<CSGTerm> term, CSGTerm::type_e type = CSGTerm::TYPE_UNION,
|
|
CSGTerm::Flag flag = CSGTerm::FLAG_NONE);
|
|
std::string dump(bool full = false);
|
|
|
|
BoundingBox getBoundingBox() const;
|
|
};
|