Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ColorPicker: Add an intensity slider in raw mode for HDR #103583

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/classes/ColorPicker.xml
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@
<theme_item name="color_hue" data_type="icon" type="Texture2D">
Custom texture for the hue selection slider on the right.
</theme_item>
<theme_item name="color_script" data_type="icon" type="Texture2D">
The icon for the button that switches color text to hexadecimal.
</theme_item>
<theme_item name="expanded_arrow" data_type="icon" type="Texture2D">
The icon for color preset drop down menu when expanded.
</theme_item>
Expand Down
1 change: 1 addition & 0 deletions editor/themes/editor_theme_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1769,6 +1769,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_icon("bar_arrow", "ColorPicker", p_theme->get_icon(SNAME("ColorPickerBarArrow"), EditorStringName(EditorIcons)));
p_theme->set_icon("picker_cursor", "ColorPicker", p_theme->get_icon(SNAME("PickerCursor"), EditorStringName(EditorIcons)));
p_theme->set_icon("picker_cursor_bg", "ColorPicker", p_theme->get_icon(SNAME("PickerCursorBg"), EditorStringName(EditorIcons)));
p_theme->set_icon("color_script", "ColorPicker", p_theme->get_icon(SNAME("Script"), EditorStringName(EditorIcons)));

// ColorPickerButton.
p_theme->set_icon("bg", "ColorPickerButton", p_theme->get_icon(SNAME("GuiMiniCheckerboard"), EditorStringName(EditorIcons)));
Expand Down
55 changes: 30 additions & 25 deletions scene/gui/color_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,6 @@ String ColorModeRGB::get_slider_label(int idx) const {
return labels[idx];
}

float ColorModeRGB::get_slider_max(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider max value.");
Color color = color_picker->get_pick_color();
return next_power_of_2(MAX(255, color.components[idx] * 255.0)) - 1;
}

float ColorModeRGB::get_slider_value(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider value.");
return color_picker->get_pick_color().components[idx] * 255;
Expand Down Expand Up @@ -210,26 +204,41 @@ void ColorModeHSV::slider_draw(int p_which) {
}

String ColorModeRAW::get_slider_label(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 3, String(), "Couldn't get slider label.");
ERR_FAIL_INDEX_V_MSG(idx, 4, String(), "Couldn't get slider label.");
return labels[idx];
}

float ColorModeRAW::get_slider_max(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider max value.");
ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider max value.");
return slider_max[idx];
}

float ColorModeRAW::get_slider_min(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider min value.");
return idx == 3 ? intensity_min : 0;
}

float ColorModeRAW::get_slider_value(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider value.");
return color_picker->get_pick_color().components[idx];
ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider value.");
Color color = color_picker->get_pick_color();
float multiplier = MAX(1, MAX(MAX(color.r, color.g), color.b));
if (idx == 3) {
return Math::log2(multiplier);
} else if (idx == 4) {
return color.a;
} else {
return color.components[idx] / multiplier;
}
}

Color ColorModeRAW::get_color() const {
Vector<float> values = color_picker->get_active_slider_values();
Color color;
for (int i = 0; i < 4; i++) {
color.components[i] = values[i];
float multiplier = Math::pow(2, values[3]);
for (int i = 0; i < 3; i++) {
color.components[i] = values[i] * multiplier;
}
color.a = values[4];
return color;
}

Expand All @@ -252,7 +261,15 @@ void ColorModeRAW::slider_draw(int p_which) {
left_color.a = 0;
right_color = color;
right_color.a = 1;

} else if (p_which != 3) {
left_color = Color(
p_which == 0 ? 0 : color.r,
p_which == 1 ? 0 : color.g,
p_which == 2 ? 0 : color.b);
right_color = Color(
p_which == 0 ? 1 : color.r,
p_which == 1 ? 1 : color.g,
p_which == 2 ? 1 : color.b);
col.set(0, left_color);
col.set(1, right_color);
col.set(2, right_color);
Expand All @@ -266,18 +283,6 @@ void ColorModeRAW::slider_draw(int p_which) {
}
}

bool ColorModeRAW::apply_theme() const {
for (int i = 0; i < ColorPicker::SLIDER_COUNT; i++) {
HSlider *slider = color_picker->get_slider(i);
slider->remove_theme_icon_override("grabber");
slider->remove_theme_icon_override("grabber_highlight");
slider->remove_theme_style_override("slider");
slider->remove_theme_constant_override("grabber_offset");
}

return true;
}

void ColorModeOKHSL::_value_changed() {
Vector<float> values = color_picker->get_active_slider_values();

Expand Down
16 changes: 11 additions & 5 deletions scene/gui/color_mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@ class ColorMode {
virtual float get_spinbox_arrow_step() const { return get_slider_step(); }
virtual String get_slider_label(int idx) const = 0;
virtual float get_slider_max(int idx) const = 0;
virtual float get_slider_min(int idx) const { return 0; }
virtual bool get_allow_greater() const { return false; }
virtual float get_slider_value(int idx) const = 0;

virtual Color get_color() const = 0;

virtual void _value_changed() {}

virtual void slider_draw(int p_which) = 0;
virtual bool apply_theme() const { return false; }

virtual ColorPicker::PickerShapeType get_shape_override() const { return ColorPicker::SHAPE_MAX; }

ColorMode(ColorPicker *p_color_picker);
Expand Down Expand Up @@ -92,7 +94,8 @@ class ColorModeRGB : public ColorMode {

virtual float get_slider_step() const override { return 1; }
virtual String get_slider_label(int idx) const override;
virtual float get_slider_max(int idx) const override;
virtual float get_slider_max(int idx) const override { return 255; }
virtual bool get_allow_greater() const override { return true; }
virtual float get_slider_value(int idx) const override;

virtual Color get_color() const override;
Expand All @@ -105,21 +108,24 @@ class ColorModeRGB : public ColorMode {

class ColorModeRAW : public ColorMode {
public:
String labels[3] = { "R", "G", "B" };
float slider_max[4] = { 100, 100, 100, 1 };
String labels[4] = { "R", "G", "B", "I" };
float slider_max[5] = { 1, 1, 1, 4, 1 };
float intensity_min = -4;

virtual String get_name() const override { return "RAW"; }

virtual int get_slider_count() const override { return 4; }
virtual float get_slider_step() const override { return 0.001; }
virtual float get_spinbox_arrow_step() const override { return 0.01; }
virtual String get_slider_label(int idx) const override;
virtual float get_slider_max(int idx) const override;
virtual float get_slider_min(int idx) const override;
virtual bool get_allow_greater() const override { return true; }
virtual float get_slider_value(int idx) const override;

virtual Color get_color() const override;

virtual void slider_draw(int p_which) override;
virtual bool apply_theme() const override;

ColorModeRAW(ColorPicker *p_color_picker) :
ColorMode(p_color_picker) {}
Expand Down
Loading
Loading