makeShapeCreator Returns a function that generates shapes for the core geometrization algorithm This is passed to the geometrization algorithm and called across many threads. So it's unsafe to change any state used by the script engine while we're busy adding shapes. It also captures "this", meaning the engine won't be destroyed until the shape creation code is finished using it.
97 auto self(shared_from_this());
98 auto f = [
self,
this, types, xMin, yMin, xMax, yMax]() {
99 std::shared_ptr<geometrize::Shape> s = geometrize::randomShapeOf(types);
101 switch(s->getType()) {
102 case geometrize::ShapeTypes::RECTANGLE: {
103 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Rectangle&
>(s)); };
104 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Rectangle&
>(s)); };
105 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Rectangle&
>(s), xMin, yMin, xMax, yMax); };
108 case geometrize::ShapeTypes::ROTATED_RECTANGLE: {
109 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::RotatedRectangle&
>(s)); };
110 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::RotatedRectangle&
>(s)); };
111 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::RotatedRectangle&
>(s), xMin, yMin, xMax, yMax); };
114 case geometrize::ShapeTypes::TRIANGLE: {
115 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Triangle&
>(s)); };
116 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Triangle&
>(s)); };
117 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Triangle&
>(s), xMin, yMin, xMax, yMax); };
120 case geometrize::ShapeTypes::ELLIPSE: {
121 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Ellipse&
>(s)); };
122 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Ellipse&
>(s)); };
123 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Ellipse&
>(s), xMin, yMin, xMax, yMax); };
126 case geometrize::ShapeTypes::ROTATED_ELLIPSE: {
127 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::RotatedEllipse&
>(s)); };
128 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::RotatedEllipse&
>(s)); };
129 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::RotatedEllipse&
>(s), xMin, yMin, xMax, yMax); };
132 case geometrize::ShapeTypes::CIRCLE: {
133 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Circle&
>(s)); };
134 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Circle&
>(s)); };
135 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Circle&
>(s), xMin, yMin, xMax, yMax); };
138 case geometrize::ShapeTypes::LINE: {
139 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Line&
>(s)); };
140 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Line&
>(s)); };
141 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Line&
>(s), xMin, yMin, xMax, yMax); };
144 case geometrize::ShapeTypes::QUADRATIC_BEZIER: {
145 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::QuadraticBezier&
>(s)); };
146 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::QuadraticBezier&
>(s)); };
147 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::QuadraticBezier&
>(s), xMin, yMin, xMax, yMax); };
150 case geometrize::ShapeTypes::POLYLINE: {
151 s->setup = [
this](geometrize::Shape& s) {
return setup(
static_cast<geometrize::Polyline&
>(s)); };
152 s->mutate = [
this](geometrize::Shape& s) {
mutate(
static_cast<geometrize::Polyline&
>(s)); };
153 s->rasterize = [xMin, yMin, xMax, yMax](
const geometrize::Shape& s) {
return geometrize::rasterize(
static_cast<const geometrize::Polyline&
>(s), xMin, yMin, xMax, yMax); };
157 assert(0 &&
"Bad shape type");