UI: Add Color Temperature unit

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
This commit is contained in:
Lukas Stockner
2024-06-17 23:50:05 +02:00
committed by Lukas Stockner
parent 0a38a8d56a
commit 25d4d645cd
13 changed files with 79 additions and 17 deletions

View File

@@ -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},

View File

@@ -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,
};

View File

@@ -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";

View File

@@ -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},
};

View File

@@ -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 */

View File

@@ -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";
}

View File

@@ -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},

View File

@@ -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);
}

View File

@@ -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},
};

View File

@@ -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));

View File

@@ -14,7 +14,11 @@ namespace blender::nodes::node_shader_blackbody_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Float>("Temperature").default_value(1500.0f).min(800.0f).max(12000.0f);
b.add_input<decl::Float>("Temperature")
.default_value(1500.0f)
.min(800.0f)
.max(12000.0f)
.subtype(PROP_COLOR_TEMPERATURE);
b.add_output<decl::Color>("Color");
}

View File

@@ -38,7 +38,11 @@ static void node_declare(NodeDeclarationBuilder &b)
#define SOCK_BLACKBODY_INTENSITY_ID 8
b.add_input<decl::Color>("Blackbody Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f});
#define SOCK_BLACKBODY_TINT_ID 8
b.add_input<decl::Float>("Temperature").default_value(1000.0f).min(0.0f).max(6500.0f);
b.add_input<decl::Float>("Temperature")
.default_value(1000.0f)
.min(0.0f)
.max(6500.0f)
.subtype(PROP_COLOR_TEMPERATURE);
b.add_input<decl::String>("Temperature Attribute").default_value("temperature");
b.add_input<decl::Float>("Weight").unavailable();
b.add_output<decl::Shader>("Volume").translation_context(BLT_I18NCONTEXT_ID_ID);

View File

@@ -53,6 +53,7 @@ static const char *bpyunits_ucategories_items[] = {
"POWER",
"TEMPERATURE",
"WAVELENGTH",
"COLOR_TEMPERATURE",
nullptr,
};