-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathutils.cpp
More file actions
92 lines (77 loc) · 2.89 KB
/
Copy pathutils.cpp
File metadata and controls
92 lines (77 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "utils.hpp"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>
#ifdef __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#endif
#include "spdlog/sinks/basic_file_sink.h"
std::filesystem::path get_resource_path(const std::filesystem::path& fn) {
#ifdef ARBORGUI_RESOURCES_BASE
//if in appimage. Can only be known at runtime
if(const char *APPDIR = std::getenv("APPDIR"); nullptr != APPDIR){
return std::filesystem::path{ std::string(APPDIR) } / "usr/share/arbor-gui" / fn;
} else {
return ARBORGUI_RESOURCES_BASE / fn;
}
#else
CFURLRef appUrlRef = CFBundleCopyBundleURL( CFBundleGetMainBundle() );
CFStringRef macPath = CFURLCopyFileSystemPath( appUrlRef, kCFURLPOSIXPathStyle );
CFStringEncoding encodingMethod = CFStringGetSystemEncoding();
auto path = std::string(CFStringGetCStringPtr(macPath, encodingMethod));
CFRelease(appUrlRef);
CFRelease(macPath);
return std::filesystem::path{path} / "Contents/Resources" / fn;
#endif
}
void log_init() {
spdlog::set_level(spdlog::level::info);
}
ImVec4 to_imvec(const glm::vec4& v) { return {v.x, v.y, v.z, v.w}; }
ImVec4 to_imvec(const glm::vec3& v) { return {v.x, v.y, v.z, 1.0f}; }
glm::vec2 to_glmvec(const ImVec2& v) { return glm::vec2{v.x, v.y}; }
std::string slurp(const std::filesystem::path& fn) {
std::ifstream fd(fn);
if (!fd.good()) log_fatal("Could not find file {}", fn.c_str());
return {std::istreambuf_iterator<char>(fd), {}};
}
glm::vec4 hsv2rgb(const glm::vec4& hsv) {
glm::vec4 rgb{hsv.z, hsv.z, hsv.z, hsv.w};
if (hsv.y == 0.0f) return rgb;
float h = std::fmod(hsv.x, 1.0f) / (60.0f / 360.0f);
int i = (int)h;
float f = h - (float)i;
float p = hsv.z * (1.0f - hsv.y);
float q = hsv.z * (1.0f - hsv.y * f);
float t = hsv.z * (1.0f - hsv.y * (1.0f - f));
switch (i) {
case 0: rgb.x = hsv.z; rgb.y = t; rgb.z = p; break;
case 1: rgb.x = q; rgb.y = hsv.z; rgb.z = p; break;
case 2: rgb.x = p; rgb.y = hsv.z; rgb.z = t; break;
case 3: rgb.x = p; rgb.y = q; rgb.z = hsv.z; break;
case 4: rgb.x = t; rgb.y = p; rgb.z = hsv.z; break;
case 5: default: rgb.x = hsv.z; rgb.y = p; rgb.z = q; break;
}
return rgb;
}
glm::vec4 next_color() {
static size_t idx = 0;
static glm::vec4 cur{0.27, 0.5f, 0.95f, 1.0f};
static std::vector<glm::vec4> colours{
glm::vec4{166,206,227, 255.0f}/256.0f,
glm::vec4{31, 120,180, 255.0f}/256.0f,
glm::vec4{178,223,138, 255.0f}/256.0f,
glm::vec4{ 51,160, 44, 255.0f}/256.0f,
glm::vec4{251,154,153, 255.0f}/256.0f,
glm::vec4{227, 26, 28, 255.0f}/256.0f,
glm::vec4{253,191,111, 255.0f}/256.0f,
glm::vec4{255,127, 0, 255.0f}/256.0f,
glm::vec4{202,178,214, 255.0f}/256.0f,
glm::vec4{106, 61,154, 255.0f}/256.0f};
if (idx < colours.size()) {
return colours[idx++];
} else {
cur.x += 0.618033988749895;
if (cur.x >= 1.0f) cur.x -= 1.0f;
return hsv2rgb(cur);
}
}