OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::FlushVolCalculator Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/FlushVolCalc.hpp>

Public Member Functions

 FlushVolCalculator (int min, int max, int flush_dataset)
 ~FlushVolCalculator ()
int calc_flush_vol (unsigned char src_a, unsigned char src_r, unsigned char src_g, unsigned char src_b, unsigned char dst_a, unsigned char dst_r, unsigned char dst_g, unsigned char dst_b)
int calc_flush_vol_rgb (unsigned char src_r, unsigned char src_g, unsigned char src_b, unsigned char dst_r, unsigned char dst_g, unsigned char dst_b)
bool get_flush_vol_from_data (unsigned char src_r, unsigned char src_g, unsigned char src_b, unsigned char dst_r, unsigned char dst_g, unsigned char dst_b, float &flush)

Private Attributes

int m_min_flush_vol
int m_max_flush_vol
int m_flush_dataset

Detailed Description

Constructor & Destructor Documentation

◆ FlushVolCalculator()

Slic3r::FlushVolCalculator::FlushVolCalculator ( int min,
int max,
int flush_dataset )
46 :m_min_flush_vol(min), m_max_flush_vol(max), m_flush_dataset(flush_dataset)
47{
48}
int m_flush_dataset
Definition FlushVolCalc.hpp:35
int m_max_flush_vol
Definition FlushVolCalc.hpp:34
int m_min_flush_vol
Definition FlushVolCalc.hpp:33

References m_flush_dataset, m_max_flush_vol, and m_min_flush_vol.

◆ ~FlushVolCalculator()

Slic3r::FlushVolCalculator::~FlushVolCalculator ( )
inline
20 {
21 }

Member Function Documentation

◆ calc_flush_vol()

int Slic3r::FlushVolCalculator::calc_flush_vol ( unsigned char src_a,
unsigned char src_r,
unsigned char src_g,
unsigned char src_b,
unsigned char dst_a,
unsigned char dst_r,
unsigned char dst_g,
unsigned char dst_b )
106{
107 // BBS: Transparent materials are treated as white materials
108 if (src_a == 0) {
109 src_r = src_g = src_b = 255;
110 }
111 if (dst_a == 0) {
112 dst_r = dst_g = dst_b = 255;
113 }
114
115 float flush_volume;
116 if(m_flush_dataset != 0 && get_flush_vol_from_data(src_r, src_g, src_b, dst_r, dst_g, dst_b, flush_volume))
117 return std::min((int)flush_volume, m_max_flush_vol);
118
119
120 flush_volume = calc_flush_vol_rgb(src_r, src_g, src_b, dst_r, dst_g, dst_b);
121
122 constexpr float dark_color_thres = 180.f/255.f;
123 constexpr float light_color_thres = 75.f/255.f;
124 bool is_from_dark = get_luminance(src_r, src_g, src_b) > dark_color_thres;
125 bool is_to_light = get_luminance(dst_r, dst_g, dst_b) < light_color_thres;
126 if (m_flush_dataset != 0 && is_from_dark && is_to_light)
127 flush_volume *= 1.3;
128
129 flush_volume += m_min_flush_vol;
130 return std::min((int)flush_volume, m_max_flush_vol);
131}
bool get_flush_vol_from_data(unsigned char src_r, unsigned char src_g, unsigned char src_b, unsigned char dst_r, unsigned char dst_g, unsigned char dst_b, float &flush)
Definition FlushVolCalc.cpp:50
int calc_flush_vol_rgb(unsigned char src_r, unsigned char src_g, unsigned char src_b, unsigned char dst_r, unsigned char dst_g, unsigned char dst_b)
Definition FlushVolCalc.cpp:60
static float get_luminance(float r, float g, float b)
Definition FlushVolCalc.cpp:24

References calc_flush_vol_rgb(), get_flush_vol_from_data(), Slic3r::get_luminance(), m_flush_dataset, m_max_flush_vol, and m_min_flush_vol.

Referenced by Slic3r::GUI::Sidebar::auto_calc_flushing_volumes_internal(), WipingDialog::CalcFlushingVolume(), Slic3r::CLI::run(), and Slic3r::GUI::CalibUtils::set_for_auto_pa_model_and_config().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calc_flush_vol_rgb()

int Slic3r::FlushVolCalculator::calc_flush_vol_rgb ( unsigned char src_r,
unsigned char src_g,
unsigned char src_b,
unsigned char dst_r,
unsigned char dst_g,
unsigned char dst_b )
62{
63 float flush_volume;
64 if(m_flush_dataset == 0 && get_flush_vol_from_data(src_r, src_g, src_b, dst_r, dst_g, dst_b, flush_volume))
65 return flush_volume;
66 float src_r_f, src_g_f, src_b_f, dst_r_f, dst_g_f, dst_b_f;
67 float from_hsv_h, from_hsv_s, from_hsv_v;
68 float to_hsv_h, to_hsv_s, to_hsv_v;
69
70 src_r_f = (float)src_r / 255.f;
71 src_g_f = (float)src_g / 255.f;
72 src_b_f = (float)src_b / 255.f;
73 dst_r_f = (float)dst_r / 255.f;
74 dst_g_f = (float)dst_g / 255.f;
75 dst_b_f = (float)dst_b / 255.f;
76
77 // Calculate color distance in HSV color space
78 RGB2HSV(src_r_f, src_g_f, src_b_f, &from_hsv_h, &from_hsv_s, &from_hsv_v);
79 RGB2HSV(dst_r_f, dst_g_f, dst_b_f, &to_hsv_h, &to_hsv_s, &to_hsv_v);
80 float hs_dist = DeltaHS_BBS(from_hsv_h, from_hsv_s, from_hsv_v, to_hsv_h, to_hsv_s, to_hsv_v);
81
82 // 1. Color difference is more obvious if the dest color has high luminance
83 // 2. Color difference is more obvious if the source color has low luminance
84 float from_lumi = get_luminance(src_r_f, src_g_f, src_b_f);
85 float to_lumi = get_luminance(dst_r_f, dst_g_f, dst_b_f);
86 float lumi_flush = 0.f;
87 if (to_lumi >= from_lumi) {
88 lumi_flush = std::pow(to_lumi - from_lumi, 0.7f) * 560.f;
89 }
90 else {
91 lumi_flush = (from_lumi - to_lumi) * 80.f;
92
93 float inter_hsv_v = 0.67 * to_hsv_v + 0.33 * from_hsv_v;
94 hs_dist = std::min(inter_hsv_v, hs_dist);
95 }
96 float hs_flush = 230.f * hs_dist;
97
98 flush_volume = calc_triangle_3rd_edge(hs_flush, lumi_flush, 120.f);
99 flush_volume = std::max(flush_volume, 60.f);
100
101 return flush_volume;
102}
void RGB2HSV(float r, float g, float b, float *h, float *s, float *v)
Definition ColorSpaceConvert.cpp:119
static float DeltaHS_BBS(float h1, float s1, float v1, float h2, float s2, float v2)
Definition FlushVolCalc.cpp:34
static float calc_triangle_3rd_edge(float edge_a, float edge_b, float degree_ab)
Definition FlushVolCalc.cpp:29

References Slic3r::calc_triangle_3rd_edge(), Slic3r::DeltaHS_BBS(), get_flush_vol_from_data(), Slic3r::get_luminance(), m_flush_dataset, and RGB2HSV().

Referenced by calc_flush_vol().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_flush_vol_from_data()

bool Slic3r::FlushVolCalculator::get_flush_vol_from_data ( unsigned char src_r,
unsigned char src_g,
unsigned char src_b,
unsigned char dst_r,
unsigned char dst_g,
unsigned char dst_b,
float & flush )
52{
53 GenericFlushPredictor pd(m_flush_dataset);
54 FlushPredict::RGBColor src(src_r, src_g, src_b);
55 FlushPredict::RGBColor dst(dst_r, dst_g, dst_b);
56
57 return pd.predict(src, dst, flush);
58}

References m_flush_dataset, and GenericFlushPredictor::predict().

Referenced by calc_flush_vol(), and calc_flush_vol_rgb().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_flush_dataset

int Slic3r::FlushVolCalculator::m_flush_dataset
private

◆ m_max_flush_vol

int Slic3r::FlushVolCalculator::m_max_flush_vol
private

◆ m_min_flush_vol

int Slic3r::FlushVolCalculator::m_min_flush_vol
private

The documentation for this class was generated from the following files: