From 25d4d645cdac83e84cf182b04bc47e3e468cae5a Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Mon, 17 Jun 2024 23:50:05 +0200 Subject: [PATCH] UI: Add Color Temperature unit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current temperature unit adjusts to Celsius or Fahrenheit based on unit system, but specifically for color temperatures the convention is to display them in Kelvin, and it'd be strange to e.g. see 11240°F when opening the white balance panel. Therefore, this adds a dedicated Color Temperature unit, and uses it for the two existing blackbody temperature inputs in shader nodes. Pull Request: https://projects.blender.org/blender/blender/pulls/123337 --- .../blenkernel/BKE_node_tree_interface.hh | 4 +++ source/blender/blenkernel/BKE_unit.hh | 3 +- source/blender/blenkernel/intern/node.cc | 6 ++++ source/blender/blenkernel/intern/unit.cc | 26 ++++++++++++++++ source/blender/makesrna/RNA_types.hh | 30 +++++++++++-------- source/blender/makesrna/intern/makesrna.cc | 4 +++ .../makesrna/intern/rna_node_socket.cc | 4 +++ .../intern/rna_node_tree_interface.cc | 1 + source/blender/makesrna/intern/rna_rna.cc | 4 ++- source/blender/nodes/intern/node_socket.cc | 1 + .../shader/nodes/node_shader_blackbody.cc | 6 +++- .../nodes/node_shader_volume_principled.cc | 6 +++- .../blender/python/intern/bpy_utils_units.cc | 1 + 13 files changed, 79 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/BKE_node_tree_interface.hh b/source/blender/blenkernel/BKE_node_tree_interface.hh index bcd7d4901f7..4f364237bf0 100644 --- a/source/blender/blenkernel/BKE_node_tree_interface.hh +++ b/source/blender/blenkernel/BKE_node_tree_interface.hh @@ -128,6 +128,10 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { "NodeTreeInterfaceSocketFloatWavelength", SOCK_FLOAT, PROP_WAVELENGTH}, + {"NodeSocketFloatColorTemperature", + "NodeTreeInterfaceSocketFloatColorTemperature", + SOCK_FLOAT, + PROP_COLOR_TEMPERATURE}, {"NodeSocketInt", "NodeTreeInterfaceSocketInt", SOCK_INT, PROP_NONE}, {"NodeSocketIntUnsigned", "NodeTreeInterfaceSocketIntUnsigned", SOCK_INT, PROP_UNSIGNED}, {"NodeSocketIntPercentage", "NodeTreeInterfaceSocketIntPercentage", SOCK_INT, PROP_PERCENTAGE}, diff --git a/source/blender/blenkernel/BKE_unit.hh b/source/blender/blenkernel/BKE_unit.hh index a489f370cac..6dc88cb025d 100644 --- a/source/blender/blenkernel/BKE_unit.hh +++ b/source/blender/blenkernel/BKE_unit.hh @@ -117,5 +117,6 @@ enum { B_UNIT_POWER = 11, B_UNIT_TEMPERATURE = 12, B_UNIT_WAVELENGTH = 13, - B_UNIT_TYPE_TOT = 14, + B_UNIT_COLOR_TEMPERATURE = 14, + B_UNIT_TYPE_TOT = 15, }; diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index a3681e047ff..de11e8195d9 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -541,6 +541,8 @@ static StringRef get_legacy_socket_subtype_idname(StringRef idname, const void * return "NodeSocketFloatDistance"; case PROP_WAVELENGTH: return "NodeSocketFloatWavelength"; + case PROP_COLOR_TEMPERATURE: + return "NodeSocketFloatColorTemperature"; } } if (idname == "NodeSocketInt") { @@ -2118,6 +2120,8 @@ const char *nodeStaticSocketType(const int type, const int subtype) return "NodeSocketFloatDistance"; case PROP_WAVELENGTH: return "NodeSocketFloatWavelength"; + case PROP_COLOR_TEMPERATURE: + return "NodeSocketFloatColorTemperature"; case PROP_NONE: default: return "NodeSocketFloat"; @@ -2205,6 +2209,8 @@ const char *nodeStaticSocketInterfaceTypeNew(const int type, const int subtype) return "NodeTreeInterfaceSocketFloatDistance"; case PROP_WAVELENGTH: return "NodeTreeInterfaceSocketFloatWavelength"; + case PROP_COLOR_TEMPERATURE: + return "NodeTreeInterfaceSocketFloatColorTemperature"; case PROP_NONE: default: return "NodeTreeInterfaceSocketFloat"; diff --git a/source/blender/blenkernel/intern/unit.cc b/source/blender/blenkernel/intern/unit.cc index b9a981ac570..6022aa622c5 100644 --- a/source/blender/blenkernel/intern/unit.cc +++ b/source/blender/blenkernel/intern/unit.cc @@ -1459,6 +1459,29 @@ static bUnitCollection buImperialTempCollection = { /*length*/ UNIT_COLLECTION_LENGTH(buImperialTempDef), }; +/* Color Temperature */ +static bUnitDef buColorTempDef[] = { + /* Base unit. */ + { + /*name*/ "kelvin", + /*name_plural*/ "kelvin", + /*name_short*/ "K", + /*name_alt*/ nullptr, + /*name_display*/ "Kelvin", + /*identifier*/ "KELVIN", + /*scalar*/ 1.0f, + /*bias*/ 0.0, + /*flag*/ B_UNIT_DEF_NONE, + }, + NULL_UNIT, +}; +static bUnitCollection buColorTempCollection = { + /*units*/ buColorTempDef, + /*base_unit*/ 0, + /*flag*/ 0, + /*length*/ UNIT_COLLECTION_LENGTH(buColorTempDef), +}; + #define UNIT_SYSTEM_TOT (((sizeof(bUnitSystems) / B_UNIT_TYPE_TOT) / sizeof(void *)) - 1) static const bUnitCollection *bUnitSystems[][B_UNIT_TYPE_TOT] = { /* Natural. */ @@ -1477,6 +1500,7 @@ static const bUnitCollection *bUnitSystems[][B_UNIT_TYPE_TOT] = { /*B_UNIT_POWER*/ nullptr, /*B_UNIT_TEMPERATURE*/ nullptr, /*B_UNIT_WAVELENGTH*/ nullptr, + /*B_UNIT_COLOR_TEMPERATURE*/ nullptr, }, /* Metric. */ { @@ -1494,6 +1518,7 @@ static const bUnitCollection *bUnitSystems[][B_UNIT_TYPE_TOT] = { /*B_UNIT_POWER*/ &buPowerCollection, /*B_UNIT_TEMPERATURE*/ &buMetricTempCollection, /*B_UNIT_WAVELENGTH*/ &buWavelengthLenCollection, + /*B_UNIT_COLOR_TEMPERATURE*/ &buColorTempCollection, }, /* Imperial. */ { @@ -1511,6 +1536,7 @@ static const bUnitCollection *bUnitSystems[][B_UNIT_TYPE_TOT] = { /*B_UNIT_POWER*/ &buPowerCollection, /*B_UNIT_TEMPERATURE*/ &buImperialTempCollection, /*B_UNIT_WAVELENGTH*/ &buWavelengthLenCollection, + /*B_UNIT_COLOR_TEMPERATURE*/ &buColorTempCollection, }, {nullptr}, }; diff --git a/source/blender/makesrna/RNA_types.hh b/source/blender/makesrna/RNA_types.hh index 1b60aaf87af..aa84ffbca2c 100644 --- a/source/blender/makesrna/RNA_types.hh +++ b/source/blender/makesrna/RNA_types.hh @@ -74,19 +74,20 @@ enum PropertyType { /* also update rna_property_subtype_unit when you change this */ enum PropertyUnit { PROP_UNIT_NONE = (0 << 16), - PROP_UNIT_LENGTH = (1 << 16), /* m */ - PROP_UNIT_AREA = (2 << 16), /* m^2 */ - PROP_UNIT_VOLUME = (3 << 16), /* m^3 */ - PROP_UNIT_MASS = (4 << 16), /* kg */ - PROP_UNIT_ROTATION = (5 << 16), /* radians */ - PROP_UNIT_TIME = (6 << 16), /* frame */ - PROP_UNIT_TIME_ABSOLUTE = (7 << 16), /* time in seconds (independent of scene) */ - PROP_UNIT_VELOCITY = (8 << 16), /* m/s */ - PROP_UNIT_ACCELERATION = (9 << 16), /* m/(s^2) */ - PROP_UNIT_CAMERA = (10 << 16), /* mm */ - PROP_UNIT_POWER = (11 << 16), /* W */ - PROP_UNIT_TEMPERATURE = (12 << 16), /* C */ - PROP_UNIT_WAVELENGTH = (13 << 16), /* `nm` (independent of scene). */ + PROP_UNIT_LENGTH = (1 << 16), /* m */ + PROP_UNIT_AREA = (2 << 16), /* m^2 */ + PROP_UNIT_VOLUME = (3 << 16), /* m^3 */ + PROP_UNIT_MASS = (4 << 16), /* kg */ + PROP_UNIT_ROTATION = (5 << 16), /* radians */ + PROP_UNIT_TIME = (6 << 16), /* frame */ + PROP_UNIT_TIME_ABSOLUTE = (7 << 16), /* time in seconds (independent of scene) */ + PROP_UNIT_VELOCITY = (8 << 16), /* m/s */ + PROP_UNIT_ACCELERATION = (9 << 16), /* m/(s^2) */ + PROP_UNIT_CAMERA = (10 << 16), /* mm */ + PROP_UNIT_POWER = (11 << 16), /* W */ + PROP_UNIT_TEMPERATURE = (12 << 16), /* C */ + PROP_UNIT_WAVELENGTH = (13 << 16), /* `nm` (independent of scene). */ + PROP_UNIT_COLOR_TEMPERATURE = (14 << 16), /* K */ }; ENUM_OPERATORS(PropertyUnit, PROP_UNIT_TEMPERATURE) @@ -186,6 +187,9 @@ enum PropertySubType { /* wavelength */ PROP_WAVELENGTH = 44 | PROP_UNIT_WAVELENGTH, + + /* wavelength */ + PROP_COLOR_TEMPERATURE = 45 | PROP_UNIT_COLOR_TEMPERATURE, }; /* Make sure enums are updated with these */ diff --git a/source/blender/makesrna/intern/makesrna.cc b/source/blender/makesrna/intern/makesrna.cc index 8c3baccf077..40c4939c1c7 100644 --- a/source/blender/makesrna/intern/makesrna.cc +++ b/source/blender/makesrna/intern/makesrna.cc @@ -3632,6 +3632,8 @@ static const char *rna_property_subtypename(PropertySubType type) return "PROP_TEMPERATURE"; case PROP_WAVELENGTH: return "PROP_WAVELENGTH"; + case PROP_COLOR_TEMPERATURE: + return "PROP_COLOR_TEMPERATURE"; default: { /* in case we don't have a type preset that includes the subtype */ if (RNA_SUBTYPE_UNIT(type)) { @@ -3673,6 +3675,8 @@ static const char *rna_property_subtype_unit(PropertySubType type) return "PROP_UNIT_TEMPERATURE"; case PROP_UNIT_WAVELENGTH: return "PROP_UNIT_WAVELENGTH"; + case PROP_UNIT_COLOR_TEMPERATURE: + return "PROP_UNIT_COLOR_TEMPERATURE"; default: return "PROP_UNIT_UNKNOWN"; } diff --git a/source/blender/makesrna/intern/rna_node_socket.cc b/source/blender/makesrna/intern/rna_node_socket.cc index 082faeedf27..03e1972309a 100644 --- a/source/blender/makesrna/intern/rna_node_socket.cc +++ b/source/blender/makesrna/intern/rna_node_socket.cc @@ -1591,6 +1591,10 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { "NodeTreeInterfaceSocketFloatWavelength", SOCK_FLOAT, PROP_WAVELENGTH}, + {"NodeSocketFloatColorTemperature", + "NodeTreeInterfaceSocketFloatColorTemperature", + SOCK_FLOAT, + PROP_COLOR_TEMPERATURE}, {"NodeSocketInt", "NodeTreeInterfaceSocketInt", SOCK_INT, PROP_NONE}, {"NodeSocketIntUnsigned", "NodeTreeInterfaceSocketIntUnsigned", SOCK_INT, PROP_UNSIGNED}, {"NodeSocketIntPercentage", "NodeTreeInterfaceSocketIntPercentage", SOCK_INT, PROP_PERCENTAGE}, diff --git a/source/blender/makesrna/intern/rna_node_tree_interface.cc b/source/blender/makesrna/intern/rna_node_tree_interface.cc index e57c3293cac..f42ca176178 100644 --- a/source/blender/makesrna/intern/rna_node_tree_interface.cc +++ b/source/blender/makesrna/intern/rna_node_tree_interface.cc @@ -718,6 +718,7 @@ static const EnumPropertyItem *rna_NodeTreeInterfaceSocketFloat_subtype_itemf( PROP_TIME_ABSOLUTE, PROP_DISTANCE, PROP_WAVELENGTH, + PROP_COLOR_TEMPERATURE, PROP_NONE}, r_free); } diff --git a/source/blender/makesrna/intern/rna_rna.cc b/source/blender/makesrna/intern/rna_rna.cc index 7433d762f3a..62879057e50 100644 --- a/source/blender/makesrna/intern/rna_rna.cc +++ b/source/blender/makesrna/intern/rna_rna.cc @@ -79,7 +79,8 @@ const EnumPropertyItem rna_enum_property_type_items[] = { {PROP_DISTANCE_CAMERA, "DISTANCE_CAMERA", 0, "Camera Distance", ""}, \ {PROP_POWER, "POWER", 0, "Power", ""}, \ {PROP_TEMPERATURE, "TEMPERATURE", 0, "Temperature", ""}, \ - {PROP_WAVELENGTH, "WAVELENGTH", 0, "Wavelength", ""} + {PROP_WAVELENGTH, "WAVELENGTH", 0, "Wavelength", ""}, \ + {PROP_COLOR_TEMPERATURE, "COLOR_TEMPERATURE", 0, "Color Temperature", ""} #define RNA_ENUM_PROPERTY_SUBTYPE_NUMBER_ARRAY_ITEMS \ {PROP_COLOR, "COLOR", 0, "Color", ""}, \ @@ -152,6 +153,7 @@ const EnumPropertyItem rna_enum_property_unit_items[] = { {PROP_UNIT_POWER, "POWER", 0, "Power", ""}, {PROP_UNIT_TEMPERATURE, "TEMPERATURE", 0, "Temperature", ""}, {PROP_UNIT_WAVELENGTH, "WAVELENGTH", 0, "Wavelength", ""}, + {PROP_UNIT_COLOR_TEMPERATURE, "COLOR_TEMPERATURE", 0, "Color Temperature", ""}, {0, nullptr, 0, nullptr, nullptr}, }; diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index 278b520950e..09639bce56e 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -1164,6 +1164,7 @@ void register_standard_node_socket_types() bke::nodeRegisterSocketType(make_socket_type_float(PROP_TIME_ABSOLUTE)); bke::nodeRegisterSocketType(make_socket_type_float(PROP_DISTANCE)); bke::nodeRegisterSocketType(make_socket_type_float(PROP_WAVELENGTH)); + bke::nodeRegisterSocketType(make_socket_type_float(PROP_COLOR_TEMPERATURE)); bke::nodeRegisterSocketType(make_socket_type_int(PROP_NONE)); bke::nodeRegisterSocketType(make_socket_type_int(PROP_UNSIGNED)); diff --git a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc index dd76cabfd0f..dc2418c5b80 100644 --- a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc +++ b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc @@ -14,7 +14,11 @@ namespace blender::nodes::node_shader_blackbody_cc { static void node_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input("Temperature").default_value(1500.0f).min(800.0f).max(12000.0f); + b.add_input("Temperature") + .default_value(1500.0f) + .min(800.0f) + .max(12000.0f) + .subtype(PROP_COLOR_TEMPERATURE); b.add_output("Color"); } diff --git a/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc b/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc index 7e4ddd26c90..a8361b3b7c6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc +++ b/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc @@ -38,7 +38,11 @@ static void node_declare(NodeDeclarationBuilder &b) #define SOCK_BLACKBODY_INTENSITY_ID 8 b.add_input("Blackbody Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f}); #define SOCK_BLACKBODY_TINT_ID 8 - b.add_input("Temperature").default_value(1000.0f).min(0.0f).max(6500.0f); + b.add_input("Temperature") + .default_value(1000.0f) + .min(0.0f) + .max(6500.0f) + .subtype(PROP_COLOR_TEMPERATURE); b.add_input("Temperature Attribute").default_value("temperature"); b.add_input("Weight").unavailable(); b.add_output("Volume").translation_context(BLT_I18NCONTEXT_ID_ID); diff --git a/source/blender/python/intern/bpy_utils_units.cc b/source/blender/python/intern/bpy_utils_units.cc index 2cabc1d116f..67763505075 100644 --- a/source/blender/python/intern/bpy_utils_units.cc +++ b/source/blender/python/intern/bpy_utils_units.cc @@ -53,6 +53,7 @@ static const char *bpyunits_ucategories_items[] = { "POWER", "TEMPERATURE", "WAVELENGTH", + "COLOR_TEMPERATURE", nullptr, };