From e825724fd7de4b24ab637d62c259e26c1d18d0fa Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 26 Jan 2025 17:02:45 +0200 Subject: [PATCH] Add a builder for turning geometric shapes into meshes --- source/builders/shape.cpp | 48 +++++++++++++++++++++++++++++++++++++++ source/builders/shape.h | 29 +++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 source/builders/shape.cpp create mode 100644 source/builders/shape.h diff --git a/source/builders/shape.cpp b/source/builders/shape.cpp new file mode 100644 index 00000000..234f5b85 --- /dev/null +++ b/source/builders/shape.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include "box.h" +#include "cylinder.h" +#include "shape.h" +#include "sphere.h" + +using namespace std; + +namespace Msp { +namespace GL { + +ShapeBuilder::ShapeBuilder(const Geometry::Shape &s, unsigned d): + shape(s), + detail(d) +{ + if(detail<1) + detail = 1; +} + +void ShapeBuilder::build(PrimitiveBuilder &builder) const +{ + if(const auto *sphere = dynamic_cast *>(&shape)) + return make_builder(sphere->get_radius(), detail).build(builder); + else if(const auto *box = dynamic_cast *>(&shape)) + return make_builder(box->get_dimension(0), box->get_dimension(1), box->get_dimension(2)).build(builder); + else if(const auto *ext = dynamic_cast *>(&shape)) + { + if(const auto *circle = dynamic_cast *>(&ext->get_base())) + return make_builder(circle->get_radius(), ext->get_length(), detail*6).build(builder); + } + + throw invalid_operation("ShapeBuilder::build"); +} + +template +T ShapeBuilder::make_builder(Args &&... args) const +{ + T bld(forward(args)...); + bld.tangents(generate_tan); + bld.texture_fit(tex_fit); + return bld; +} + +} // namespace GL +} // namespace Msp diff --git a/source/builders/shape.h b/source/builders/shape.h new file mode 100644 index 00000000..f6807446 --- /dev/null +++ b/source/builders/shape.h @@ -0,0 +1,29 @@ +#ifndef MSP_GL_SHAPE_H_ +#define MSP_GL_SHAPE_H_ + +#include +#include "geometrybuilder.h" + +namespace Msp { +namespace GL { + +class MSPGL_API ShapeBuilder: public GeometryBuilder +{ +private: + const Geometry::Shape &shape; + unsigned detail = 1; + +public: + ShapeBuilder(const Geometry::Shape &, unsigned); + + using GeometryBuilder::build; + void build(PrimitiveBuilder &) const override; +private: + template + T make_builder(Args &&...) const; +}; + +} // namespace GL +} // namespace Msp + +#endif -- 2.45.2