summaryrefslogtreecommitdiff
path: root/c++
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-09-22 23:32:40 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-09-22 23:32:40 +0200
commit60dd654b13c364e2aac53f2cb76a368d388bf070 (patch)
treee53172f5eace017bac05fcf2cdc9e137a3e62fbd /c++
Added basic setup
Diffstat (limited to 'c++')
-rw-r--r--c++/SConscript37
-rw-r--r--c++/ico.hpp70
2 files changed, 107 insertions, 0 deletions
diff --git a/c++/SConscript b/c++/SConscript
new file mode 100644
index 0000000..beb41e5
--- /dev/null
+++ b/c++/SConscript
@@ -0,0 +1,37 @@
+#!/bin/false
+
+import os
+import os.path
+import glob
+
+
+Import('env')
+
+dir_path = Dir('.').abspath
+
+# Environment for base library
+core_env = env.Clone();
+
+core_env.sources = sorted(glob.glob(dir_path + "/*.cpp"))
+core_env.headers = sorted(glob.glob(dir_path + "/*.hpp"))
+
+env.sources += core_env.sources;
+env.headers += core_env.headers;
+
+## Shared lib
+objects_shared = []
+core_env.add_source_files(objects_shared, core_env.sources, shared=True);
+env.library_shared = core_env.SharedLibrary('#build/icosahedrical_destruction', [objects_shared]);
+
+# Set Alias
+env.Alias('library', [env.library_shared]);
+
+env.targets += ['library'];
+
+# Install
+env.Install('$prefix/lib/', [env.library_shared]);
+env.Install('$prefix/include/sims/icosahedrical_destruction', [core_env.headers]);
+
+# Test
+# Export('core_env');
+# SConscript('tests/SConscript');
diff --git a/c++/ico.hpp b/c++/ico.hpp
new file mode 100644
index 0000000..0ac1a91
--- /dev/null
+++ b/c++/ico.hpp
@@ -0,0 +1,70 @@
+#pragma once
+
+#include <array>
+#include <cstdint>
+
+namespace kel {
+namespace impl {
+struct ico_surface_helper {
+ /**
+ * On each triangle we assume a ccw order and we start on the top-left part of the
+ * triangle. The orientation of the triangle is determined by the horizontal line
+ * (on the 2D foldout of the icosahedron) which is the down direction.
+ */
+ static constexpr std::array<std::array<uint8_t,3u>, 20u> neighbour_map {
+ {1,4,5},//0
+ {2,0,6},//1
+ {3,1,7},//2
+ {4,2,8},//3
+ {0,3,9},//4
+ {14,10,0},//5
+ {10,11,1},//6
+ {11,12,2},//7
+ {12,13,3},//8
+ {13,14,4},//9
+ {6,5,15},//10
+ {7,6,16},//11
+ {8,7,17},//12
+ {9,8,18},//13
+ {5,9,19},//14
+ {19,16,10},//15
+ {15,17,11},//16
+ {16,18,12},//17
+ {17,19,13},//18
+ {18,15,14} //19
+ };
+};
+}
+
+template<uint64_t SubD>
+class ico_addr {
+private:
+ std::array<uint8_t, SubD+1u> vals_;
+public:
+ template<uint64_t Div = 1u>
+ ico_addr<Div> slice() const {
+ return {};
+ }
+};
+
+template<typename T, uint64_t D>
+class ico_triangle {
+private:
+ std::array<ico_triangle<T,D-1u>> subdivs_;
+public:
+};
+
+template<typename T>
+class ico_triangle<T,0u> final {
+private:
+ T val_;
+public:
+};
+
+template<typename T, uint64_t SubD>
+class icosahedron final {
+private:
+ std::array<ico_triangle<T,SubD>,20u> surfaces_;
+public:
+};
+}