diff --git a/src/asset.cpp b/src/asset.cpp index 3584bce..f977498 100644 --- a/src/asset.cpp +++ b/src/asset.cpp @@ -31,7 +31,7 @@ bool Asset::exist(std::string path) } else { - std::ifstream f(path); + std::ifstream f(path, std::ios::binary); return f.is_open(); } return false; // useless return for the stupid xcode diff --git a/src/brush.cpp b/src/brush.cpp index dcf5f24..23abf6e 100644 --- a/src/brush.cpp +++ b/src/brush.cpp @@ -2,6 +2,7 @@ #include "log.h" #include "brush.h" #include "asset.h" +#include "app.h" void BrushMesh::draw(const std::vector& samples, const glm::mat4& proj) { @@ -491,11 +492,17 @@ bool Brush::read(BinaryStreamReader& r) r >> d; d.value("m_name", m_name); d.value("m_brush_path", m_brush_path); + m_brush_path = str_replace(m_brush_path, "{data_path}", App::I.data_path); d.value("m_brush_thumb_path", m_brush_thumb_path); + m_brush_thumb_path = str_replace(m_brush_thumb_path, "{data_path}", App::I.data_path); d.value("m_dual_path", m_dual_path); + m_dual_path = str_replace(m_dual_path, "{data_path}", App::I.data_path); d.value("m_dual_thumb_path", m_dual_thumb_path); + m_dual_thumb_path = str_replace(m_dual_thumb_path, "{data_path}", App::I.data_path); d.value("m_pattern_path", m_pattern_path); + m_pattern_path = str_replace(m_pattern_path, "{data_path}", App::I.data_path); d.value("m_pattern_thumb_path", m_pattern_thumb_path); + m_pattern_thumb_path = str_replace(m_pattern_thumb_path, "{data_path}", App::I.data_path); d.value("m_tip_color", m_tip_color); d.value("m_tip_scale", m_tip_scale); @@ -576,12 +583,18 @@ void Brush::write(BinaryStreamWriter& w) const d.class_id = "brush"; d.name = L"Brush class"; d.props["m_name"] = std::make_shared(m_name); - d.props["m_brush_path"] = std::make_shared(m_brush_path); - d.props["m_brush_thumb_path"] = std::make_shared(m_brush_thumb_path); - d.props["m_dual_path"] = std::make_shared(m_dual_path); - d.props["m_dual_thumb_path"] = std::make_shared(m_dual_thumb_path); - d.props["m_pattern_path"] = std::make_shared(m_pattern_path); - d.props["m_pattern_thumb_path"] = std::make_shared(m_pattern_thumb_path); + d.props["m_brush_path"] = std::make_shared( + str_replace(m_brush_path, App::I.data_path, "{data_path}")); + d.props["m_brush_thumb_path"] = std::make_shared( + str_replace(m_brush_thumb_path, App::I.data_path, "{data_path}")); + d.props["m_dual_path"] = std::make_shared( + str_replace(m_dual_path, App::I.data_path, "{data_path}")); + d.props["m_dual_thumb_path"] = std::make_shared( + str_replace(m_dual_thumb_path, App::I.data_path, "{data_path}")); + d.props["m_pattern_path"] = std::make_shared( + str_replace(m_pattern_path, App::I.data_path, "{data_path}")); + d.props["m_pattern_thumb_path"] = std::make_shared( + str_replace(m_pattern_thumb_path, App::I.data_path, "{data_path}")); d.props["m_tip_color"] = std::make_shared(m_tip_color); d.props["m_tip_scale"] = std::make_shared(m_tip_scale); diff --git a/src/canvas.cpp b/src/canvas.cpp index 7cb6d15..fb72aab 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -900,7 +900,8 @@ void Canvas::stroke_start(glm::vec3 point, float pressure) m_current_stroke = std::make_unique(); m_current_stroke->m_camera.rot = m_cam_rot; m_current_stroke->m_camera.fov = m_cam_fov; - m_current_stroke->m_filter_points = false; + if (m_current_mode == kCanvasMode::Line) + m_current_stroke->m_filter_points = false; m_current_stroke->randomize_prng(); m_current_stroke->start(m_current_brush); m_current_stroke->add_point(point, pressure); diff --git a/src/node_panel_brush.cpp b/src/node_panel_brush.cpp index 090ae7e..4a55fe9 100644 --- a/src/node_panel_brush.cpp +++ b/src/node_panel_brush.cpp @@ -48,6 +48,8 @@ bool NodeButtonBrush::read(BinaryStreamReader& r) d.value("high_path", high_path); d.value("thumb_path", thumb_path); d.value("m_user_brush", m_user_brush); + high_path = str_replace(high_path, "{data_path}", App::I.data_path); + thumb_path = str_replace(thumb_path, "{data_path}", App::I.data_path); return true; } @@ -57,8 +59,10 @@ void NodeButtonBrush::write(BinaryStreamWriter& w) const d.class_id = "brush"; d.name = L"Brush class"; d.props["brush_name"] = std::make_shared(brush_name); - d.props["high_path"] = std::make_shared(high_path); - d.props["thumb_path"] = std::make_shared(thumb_path); + d.props["high_path"] = std::make_shared( + str_replace(high_path, App::I.data_path, "{data_path}")); + d.props["thumb_path"] = std::make_shared( + str_replace(thumb_path, App::I.data_path, "{data_path}")); d.props["m_user_brush"] = std::make_shared(m_user_brush); w << d; } @@ -544,7 +548,7 @@ bool NodePanelBrushPreset::restore() auto vmin = sr.ru16(); if (vmaj != 0 && vmin != 1) { - LOG("unrecognised version %d.$d", vmaj, vmin); + LOG("unrecognised version %d.%d", vmaj, vmin); return false; } diff --git a/src/util.cpp b/src/util.cpp index f9ccdb8..395f590 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -508,6 +508,22 @@ bool str_iequals(const std::string& a, const std::string& b) return true; } +std::string str_replace(const std::string& string, const std::string& search, const std::string& replace) +{ + std::string ret = string; + // Get the first occurrence + size_t pos = ret.find(search); + // Repeat till end is reached + while(pos != std::string::npos) + { + // Replace this occurrence of Sub String + ret.replace(pos, search.size(), replace); + // Get the next occurrence from the current position + pos = ret.find(search, pos + replace.size()); + } + return ret; +} + static const char* gl2str(GLenum err) { switch (err) @@ -611,4 +627,4 @@ void parallel_for(unsigned nb_elements, std::function functor, bool // Wait for the other thread to finish their task if (use_threads) std::for_each(my_threads.begin(), my_threads.end(), std::mem_fn(&std::thread::join)); -} \ No newline at end of file +} diff --git a/src/util.h b/src/util.h index 82c60b4..c25161e 100644 --- a/src/util.h +++ b/src/util.h @@ -74,6 +74,7 @@ std::string unescape(const std::string& s); std::wstring str2wstr(const std::string& str); std::string wstr2str(const std::wstring& wstr); bool str_iequals(const std::string& a, const std::string& b); +std::string str_replace(const std::string& string, const std::string& search, const std::string& replace); size_t curl_data_handler(void *contents, size_t size, size_t nmemb, void *userp); size_t curl_data_write(void *ptr, size_t size, size_t nmemb, FILE *stream); @@ -181,7 +182,7 @@ public: post_cv.wait(lock, [&]() { return unlocked | (q.size() < Max); }); if (q.size() >= Max) return; } - if (std::find(q.begin(), q.end(), pkt) == q.end()); + if (std::find(q.begin(), q.end(), pkt) == q.end()) top ? q.push_front(pkt) : q.push_back(pkt); get_cv.notify_one(); }