From d3758892987d76749fdf1211ed27ff77f39b5b3b Mon Sep 17 00:00:00 2001 From: Charlie Jolly Date: Tue, 23 Mar 2021 09:21:56 +0000 Subject: Nodes: Add Refract and Faceforward functions to Vector Maths nodes Cycles, Eevee, OSL, Geo, Attribute Based on outdated refract patch D6619 by @cubic_sloth `refract` and `faceforward` are standard functions in GLSL, OSL and Godot shader languages. Adding these functions provides Blender shader artists access to these standard functions. Reviewed By: brecht Differential Revision: https://developer.blender.org/D10622 --- source/blender/makesrna/intern/rna_nodetree.c | 49 +++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'source/blender/makesrna') diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 7fa67ad351f..3aba3e51217 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -224,6 +224,18 @@ const EnumPropertyItem rna_enum_node_vec_math_items[] = { 0, "Reflect", "Reflect A around the normal B. B doesn't need to be normalized"}, + {NODE_VECTOR_MATH_REFRACT, + "REFRACT", + 0, + "Refract", + "For a given incident vector A, surface normal B and ratio of indices of refraction, Ior, " + "refract returns the refraction vector, R"}, + {NODE_VECTOR_MATH_FACEFORWARD, + "FACEFORWARD", + 0, + "Faceforward", + "Orients a vector A to point away from a surface B as defined by its normal C. " + "Returns (dot(B, C) < 0) ? A : -A"}, {NODE_VECTOR_MATH_DOT_PRODUCT, "DOT_PRODUCT", 0, "Dot Product", "A dot B"}, {0, "", ICON_NONE, NULL, NULL}, {NODE_VECTOR_MATH_DISTANCE, "DISTANCE", 0, "Distance", "Distance between A and B"}, @@ -1961,7 +1973,7 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeFill_type_itemf(bContext /** * This bit of ugly code makes sure the float / attribute option shows up instead of - * vector / attribute if the node uses an operation that uses a float for input B. + * vector / attribute if the node uses an operation that uses a float for input B or C. */ static const EnumPropertyItem *rna_GeometryNodeAttributeVectorMath_input_type_b_itemf( bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) @@ -1994,6 +2006,37 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeVectorMath_input_type_b_ return item_array; } +static const EnumPropertyItem *rna_GeometryNodeAttributeVectorMath_input_type_c_itemf( + bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) +{ + bNode *node = ptr->data; + NodeAttributeVectorMath *node_storage = (NodeAttributeVectorMath *)node->storage; + + EnumPropertyItem *item_array = NULL; + int items_len = 0; + for (const EnumPropertyItem *item = rna_node_geometry_attribute_input_type_items_any; + item->identifier != NULL; + item++) { + if (item->value == GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE) { + RNA_enum_item_add(&item_array, &items_len, item); + } + else if (item->value == GEO_NODE_ATTRIBUTE_INPUT_FLOAT) { + if (node_storage->operation == NODE_VECTOR_MATH_REFRACT) { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + else if (item->value == GEO_NODE_ATTRIBUTE_INPUT_VECTOR) { + if (node_storage->operation != NODE_VECTOR_MATH_REFRACT) { + RNA_enum_item_add(&item_array, &items_len, item); + } + } + } + RNA_enum_item_end(&item_array, &items_len); + + *r_free = true; + return item_array; +} + static void rna_GeometryNodeAttributeVectorMath_operation_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -8901,7 +8944,9 @@ static void def_geo_attribute_vector_math(StructRNA *srna) prop = RNA_def_property(srna, "input_type_c", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "input_type_c"); - RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector); + RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_any); + RNA_def_property_enum_funcs( + prop, NULL, NULL, "rna_GeometryNodeAttributeVectorMath_input_type_c_itemf"); RNA_def_property_ui_text(prop, "Input Type C", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } -- cgit v1.2.3