1#ifndef FLIPPY_HPP_STLSERIALIZER_HPP
2#define FLIPPY_HPP_STLSERIALIZER_HPP
16 uint16_t attr_byte_count{0};
21 uint32_t num_triangles{};
22 std::vector<rawSTLTriangle> stl_triangles;
25 [[maybe_unused]]
static void printSTLTriangle(
rawSTLTriangle const &triangle, std::optional<std::string>
const &name = std::nullopt) {
26 if (name) {std::cout << name.value() <<
'\n';}
27 std::cout << triangle.normal[0] <<
' ' << triangle.normal[1] <<
' ' << triangle.normal[2] <<
'\n';
28 std::cout << triangle.v1[0] <<
' ' << triangle.v1[1] <<
' ' << triangle.v1[2] <<
'\n';
29 std::cout << triangle.v2[0] <<
' ' << triangle.v2[1] <<
' ' << triangle.v2[2] <<
'\n';
30 std::cout << triangle.v3[0] <<
' ' << triangle.v3[1] <<
' ' << triangle.v3[2] <<
'\n';
31 std::cout <<
"------------------------------------------------------------------\n";
34 static inline rawSTLTriangle loadSTLTriangle(std::ifstream &inp) {
35 rawSTLTriangle triangle;
36 inp.read(
reinterpret_cast<char *
>(&triangle), 50 );
40 static inline rawSTLSolid loadSTLSolid(std::ifstream &inp) {
42 inp.read(
reinterpret_cast<char *
>(&solid.header),
sizeof(rawSTLSolid::header));
43 inp.read(
reinterpret_cast<char *
>(&solid.num_triangles),
sizeof(rawSTLSolid::num_triangles));
44 std::vector<rawSTLTriangle> triangles;
45 triangles.reserve(solid.num_triangles);
47 for (uint32_t i = 0; i < solid.num_triangles; ++i) {
48 triangles.push_back(loadSTLTriangle(inp));
50 solid.stl_triangles = std::move(triangles);
54 template<fp::
floating_po
int_number Real, fp::indexing_number Index>
59 bool operator==(
stlNode const &other)
const {
60 return pos == other.pos;
65 template<fp::
floating_po
int_number Real, fp::indexing_number Index>
72 return -1 * (n2.pos - n1.pos).cross(n3.pos - n1.pos).
normalize();
81 : normal_(normal_inp), n1_(n1_inp), n2_(n2_inp), n3_(n3_inp) {}
84 :
stlTriangle(n1_inp, n2_inp, n3_inp, make_normal(n1_inp, n2_inp, n3_inp)) {}
87 normal_({stl_triangle.normal[0], stl_triangle.normal[1], stl_triangle.normal[2]}),
88 n1_({.id=0, .pos={stl_triangle.v1[0], stl_triangle.v1[1], stl_triangle.v1[2]}}),
89 n2_({.id=0, .pos={stl_triangle.v2[0], stl_triangle.v2[1], stl_triangle.v2[2]}}),
90 n3_({.id=0, .pos={stl_triangle.v3[0], stl_triangle.v3[1], stl_triangle.v3[2]}})
93 [[nodiscard]]
vec3<float> const &normal()
const {
return normal_;}
97 rawSTLTriangle tr{.normal = {normal_.x, normal_.y, normal_.z}, .v1 = {n1_.pos.x, n1_.pos.y, n1_.pos.z}, .v2 = {n2_.pos.x, n2_.pos.y, n2_.pos.z}, .v3 = {n3_.pos.x, n3_.pos.y, n3_.pos.z}, .attr_byte_count=0};
101 std::pair<Index, Index> other_node_ids(Index loc_node_id){
102 switch (loc_node_id) {
103 case 0:
return {n2_.id, n3_.id};
104 case 1:
return {n1_.id, n3_.id};
105 case 2:
return {n1_.id, n2_.id};
106 default:std::cerr << loc_node_id <<
"is out of range for as stlTriangl index";
117 default:std::cerr << idx <<
"is out of range for as stlTriangl index";
123 template<fp::
floating_po
int_number Real, fp::indexing_number Index>
class stlSerializer {
124 static std::vector<stlTriangle<Real, Index>> solidTostlTriangls(
rawSTLSolid const &solid) {
125 std::vector<stlTriangle<Real, Index>> triangles;
126 triangles.reserve(solid.num_triangles);
127 for (
auto const &stl_triangle : solid.stl_triangles) {
128 triangles.emplace_back(stl_triangle);
136 static std::vector<stlTriangle<Real, Index>> read_STLSolid_into_triangle_vec(std::filesystem::path
const &input_file) {
137 std::ifstream inp(input_file, std::ios::in | std::ios::binary);
141 std::vector<stlTriangle<Real, Index>> triangles{solidTostlTriangls(solid)};
Definition stlSerializer.hpp:123
Definition stlSerializer.hpp:66
Internal implementation of a 3D vector.
Definition vec3.hpp:43
vec3< Real > const & normalize()
Normalize the vector in place. And return a reference to the new normalized vector.
Definition vec3.hpp:184
Definition custom_concepts.hpp:38
Definition stlSerializer.hpp:19
Definition stlSerializer.hpp:10
Definition stlSerializer.hpp:55
Header file containing the definition and implementation a 3 dimensional vector class,...