diff --git a/library/phx/line_segments.hpp b/library/phx/line_segments.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..fed6e566f6c84d29c5ce9200479c7b3bacdf24fa
--- /dev/null
+++ b/library/phx/line_segments.hpp
@@ -0,0 +1,19 @@
+
+#ifndef LIBRARY_PHX_LINE_SEGMENTS_HPP_
+#define LIBRARY_PHX_LINE_SEGMENTS_HPP_
+
+#include <vector>
+#include <glm/glm.hpp>
+
+namespace phx {
+
+ struct line_segments
+ {
+ std::vector<glm::vec3> vertices;
+ std::vector<glm::u8vec4> colors;
+ std::vector<std::uint32_t> indices;
+ float radius = 1.0f;
+
+ };
+}
+#endif
\ No newline at end of file
diff --git a/library/phx/pli_loader.cpp b/library/phx/pli_loader.cpp
index 8ce4c4f86223bb735cbc175206fd1091da80ec23..c20e4a8640808296e530302c5961156549e4074c 100644
--- a/library/phx/pli_loader.cpp
+++ b/library/phx/pli_loader.cpp
@@ -18,8 +18,8 @@ SUPPRESS_WARNINGS_END
namespace phx {
- std::unique_ptr<phx::Resource> PLILoader::Load(
- const ResourceDeclaration& declaration) {
+ std::unique_ptr<phx::Resource> PLILoader::Load(const ResourceDeclaration& declaration)
+ {
//check for all important information
if (declaration.find("file_name") == declaration.end() ||
@@ -138,22 +138,25 @@ namespace phx {
glm::vec3(0)
);
- tbb::parallel_for (std::size_t(0), size_vec[2], std::size_t(1), [&](std::size_t x) {
- tbb::parallel_for (std::size_t(0), size_vec[3], std::size_t(1), [&](std::size_t y) {
- tbb::parallel_for (std::size_t(0), size_vec[0], std::size_t(1), [&](std::size_t z) {
-
- const size_t padded_coord =
- (x + zero_pad_) + (size_vec[2] + 2 * zero_pad_) *
- (y + zero_pad_ + (size_vec[3] + 2 * zero_pad_) * (z + zero_pad_));
-
- retardation_result[padded_coord] = retardation_data[z][x][y][0];
- transmittance_result[padded_coord] = transmittance_data[z][x][y][0];
- orientation_result[padded_coord] =
- glm::vec3(orientation_data[z][0][x][y],
- orientation_data[z][1][x][y],
- orientation_data[z][2][x][y]);
- });
- });
+ //collapse nested loops for (hopefully) better performance
+ tbb::parallel_for(tbb::blocked_range3d<int>(std::size_t(0), size_vec[2], std::size_t(0), size_vec[3], std::size_t(0), size_vec[0]), [&](const tbb::blocked_range3d<int> &r) {
+ for (int x = r.pages().begin(), x_end = r.pages().end(); x < x_end; x++) {
+ for (int y = r.rows().begin(), y_end = r.rows().end(); y < y_end; y++) {
+ for (int z = r.cols().begin(), z_end = r.cols().end(); z < z_end; z++) {
+
+ const size_t padded_coord =
+ (x + zero_pad_) + (size_vec[2] + 2 * zero_pad_) *
+ (y + zero_pad_ + (size_vec[3] + 2 * zero_pad_) * (z + zero_pad_));
+
+ retardation_result[padded_coord] = retardation_data[z][x][y][0];
+ transmittance_result[padded_coord] = transmittance_data[z][x][y][0];
+ orientation_result[padded_coord] =
+ glm::vec3(orientation_data[z][0][x][y],
+ orientation_data[z][1][x][y],
+ orientation_data[z][2][x][y]);
+ }
+ }
+ }
});
//free memory
@@ -166,6 +169,7 @@ namespace phx {
resource->SetRetardation(retardation_result);
resource->SetTransmittance(transmittance_result);
+ //free memory
orientation_result.resize(0);
transmittance_result.resize(0);
retardation_result.resize(0);
diff --git a/library/phx/pli_processor.cpp b/library/phx/pli_processor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..da9d19625436c3d3e851e591b0daa4ac801d8ae1
--- /dev/null
+++ b/library/phx/pli_processor.cpp
@@ -0,0 +1,71 @@
+
+#include "phx/pli_processor.hpp"
+#include "phx/pli_loader.hpp"
+#include "phx/pli_region.hpp"
+#include "phx/resource_declaration.hpp"
+#include "phx/resource_manager.hpp"
+#include "phx/line_segments.hpp"
+#include "phx/resource_utils.hpp"
+
+#include <string>
+
+namespace phx {
+
+ line_segments make_hedgehog(Resource* resource, const float length = 1.0f, const float radius = 1.0f)
+ {
+ auto pli_region = dynamic_cast<PLIRegion *>(resource);
+ auto size = pli_region->GetSize();
+
+ //create return value
+ line_segments segments;
+
+ segments.radius = radius;
+
+ for (auto z = 0; z < size[0]; z++)
+ {
+ for (auto x = 0; x < size[1]; x++)
+ {
+ for (auto y = 0; y < size[2]; y++)
+ {
+ const auto center = glm::vec3(x, y, z);
+ const auto direction = glm::normalize(glm::vec3(pli_region->GetOrientation[z][0][x][y], pli_region->GetOrientation[z][1][x][y], pli_region->GetOrientation[z][2][x][y]));
+
+ segments.vertices.push_back(center + length / 2.0f * direction);
+ segments.vertices.push_back(center - length / 2.0f * direction);
+ segments.colors.push_back(glm::u8vec4(glm::abs(direction) * 255.0f, 255));
+ segments.colors.push_back(glm::u8vec4(glm::abs(direction) * 255.0f, 255));
+ segments.indices.push_back(static_cast<std::uint32_t>(segments.vertices.size() - 2));
+ segments.indices.push_back(static_cast<std::uint32_t>(segments.vertices.size() - 1));
+ }
+ }
+ }
+ return segments;
+ }
+
+
+
+ void pli_prepare_data() {
+
+ //TODO: find out how ResourceDeclaration/ nlohmann-json works
+ //TODO: find out why Load doesn't work
+ std::string addr("O:/Documents/MSA0309_s0536-0695.h5");
+ ResourceDeclaration& declaration(
+ (ResourceDeclaration)addr, { { "from",{ { "X", 0.0f },{ "Y", 0.0f },{ "Z", 0.0f } } },
+ { "to",{ { "X", 360.0f },{ "Y", 560.0f },{ "Z", 25.0f } } },
+ { "stride",{ { "X", 3.0f },{ "Y", 3.0f },{ "Z", 3.0f } } } },
+ false);
+
+ auto pli_resource = PLILoader::Load(declaration);
+ /*
+ auto pli_resource = ResourceUtils::LoadResourceFromFile<phx::PLIRegion>(
+ R"(O:\Documents\MSA0309_s0536-0695.h5)",
+ { { "from",{ { "X", 0.0f },{ "Y", 0.0f },{ "Z", 0.0f } } },
+ { "to",{ { "X", 360.0f },{ "Y", 560.0f },{ "Z", 25.0f } } },
+ { "stride",{ { "X", 3.0f },{ "Y", 3.0f },{ "Z", 3.0f } } } });
+
+ auto resource = dynamic_cast<Resource *>(pli_resource);
+ auto mesh = make_hedgehog(pli_resource, 1.0f, 1.0f);
+ */
+
+ }
+}
\ No newline at end of file
diff --git a/library/phx/pli_processor.hpp b/library/phx/pli_processor.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..3ec26c3ed8ed1dc7f620eae87f6fdeb9ed5d5201
--- /dev/null
+++ b/library/phx/pli_processor.hpp
@@ -0,0 +1,18 @@
+
+#ifndef LIBRARY_PHX_PLI_PROCESSOR_HPP_
+#define LIBRARY_PHX_PLI_PROCESSOR_HPP_
+
+
+#include "phx/pli_processor.hpp"
+#include "phx/pli_region.hpp"
+#include "phx/resource_declaration.hpp"
+#include "phx/resource_manager.hpp"
+#include "phx/line_segments.hpp"
+
+
+namespace phx{
+ line_segments make_hedgehog(Resource* resource, const float length = 1.0f, const float radius = 1.0f);
+
+}
+
+#endif
\ No newline at end of file