Merge branch 'blender-v2.93-release'
authorHans Goudey <h.goudey@me.com>
Fri, 28 May 2021 16:09:08 +0000 (12:09 -0400)
committerHans Goudey <h.goudey@me.com>
Fri, 28 May 2021 16:09:08 +0000 (12:09 -0400)
1  2 
source/blender/editors/space_node/drawnode.c
source/blender/makesrna/intern/rna_nodetree.c

index 6b4366b2966ab93fa464940fe2cc8631ae3156f2,510fcd5e887d08c1cc1c1c3ea79360eaef4c21a9..f11f1c010190b1ddcd77a0f7e3784dfbf845e326
@@@ -456,9 -456,7 +456,9 @@@ static void node_draw_frame(const bCont
    }
  
    /* label */
 -  node_draw_frame_label(ntree, node, snode->runtime->aspect);
 +  if (node->label[0] != '\0') {
 +    node_draw_frame_label(ntree, node, snode->runtime->aspect);
 +  }
  
    UI_block_end(C, node->block);
    UI_block_draw(C, node->block);
@@@ -2753,11 -2751,10 +2753,10 @@@ static void node_composit_buts_denoise(
  #else
    /* Always supported through Accelerate framework BNNS on macOS. */
  #  ifndef __APPLE__
-   if (!BLI_cpu_support_sse41())
- #  endif
-   {
+   if (!BLI_cpu_support_sse41()) {
      uiItemL(layout, IFACE_("Disabled, CPU with SSE4.1 is required"), ICON_ERROR);
    }
+ #  endif
  #endif
  
    uiItemR(layout, ptr, "use_hdr", DEFAULT_FLAGS, NULL, ICON_NONE);
@@@ -3334,14 -3331,12 +3333,14 @@@ static const float std_node_socket_colo
      {0.39, 0.78, 0.39, 1.0}, /* SOCK_SHADER */
      {0.80, 0.65, 0.84, 1.0}, /* SOCK_BOOLEAN */
      {0.0, 0.0, 0.0, 1.0},    /*__SOCK_MESH (deprecated) */
 -    {0.25, 0.75, 0.26, 1.0}, /* SOCK_INT */
 +    {0.35, 0.55, 0.36, 1.0}, /* SOCK_INT */
      {0.44, 0.70, 1.00, 1.0}, /* SOCK_STRING */
      {0.93, 0.62, 0.36, 1.0}, /* SOCK_OBJECT */
 -    {0.89, 0.76, 0.43, 1.0}, /* SOCK_IMAGE */
 +    {0.39, 0.22, 0.39, 1.0}, /* SOCK_IMAGE */
      {0.00, 0.84, 0.64, 1.0}, /* SOCK_GEOMETRY */
      {0.96, 0.96, 0.96, 1.0}, /* SOCK_COLLECTION */
 +    {0.62, 0.31, 0.64, 1.0}, /* SOCK_TEXTURE */
 +    {0.92, 0.46, 0.51, 1.0}, /* SOCK_MATERIAL */
  };
  
  /* common color callbacks for standard types */
@@@ -3482,14 -3477,6 +3481,14 @@@ static void std_node_socket_draw
        uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, text, 0);
        break;
      }
 +    case SOCK_TEXTURE: {
 +      uiTemplateID(layout, C, ptr, "default_value", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
 +      break;
 +    }
 +    case SOCK_MATERIAL: {
 +      uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, text, 0);
 +      break;
 +    }
      default:
        node_socket_button_label(C, layout, ptr, node_ptr, text);
        break;
index 11f5ff0441abcef94900961c4bd74d183c0e3ac2,9ef94a0df2f1e67d52c356d3675316dc8882ff2d..b3ba111dc613ea1a884f916b08238a267d3d2a0f
  const EnumPropertyItem rna_enum_node_socket_in_out_items[] = {
      {SOCK_IN, "IN", 0, "Input", ""}, {SOCK_OUT, "OUT", 0, "Output", ""}, {0, NULL, 0, NULL, NULL}};
  
 +static const EnumPropertyItem node_socket_data_type_items[] = {
 +    {SOCK_FLOAT, "FLOAT", 0, "Float", ""},
 +    {SOCK_INT, "INT", 0, "Integer", ""},
 +    {SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
 +    {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
 +    {SOCK_STRING, "STRING", 0, "String", ""},
 +    {SOCK_RGBA, "RGBA", 0, "Color", ""},
 +    {SOCK_OBJECT, "OBJECT", 0, "Object", ""},
 +    {SOCK_IMAGE, "IMAGE", 0, "Image", ""},
 +    {SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
 +    {SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
 +    {SOCK_TEXTURE, "TEXTURE", 0, "Texture", ""},
 +    {SOCK_MATERIAL, "MATERIAL", 0, "Material", ""},
 +    {0, NULL, 0, NULL, NULL},
 +};
 +
  #ifndef RNA_RUNTIME
  static const EnumPropertyItem rna_enum_node_socket_display_shape_items[] = {
      {SOCK_DISPLAY_SHAPE_CIRCLE, "CIRCLE", 0, "Circle", ""},
@@@ -94,7 -78,7 +94,7 @@@
  static const EnumPropertyItem node_socket_type_items[] = {
      {SOCK_CUSTOM, "CUSTOM", 0, "Custom", ""},
      {SOCK_FLOAT, "VALUE", 0, "Value", ""},
 -    {SOCK_INT, "INT", 0, "Int", ""},
 +    {SOCK_INT, "INT", 0, "Integer", ""},
      {SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
      {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
      {SOCK_STRING, "STRING", 0, "String", ""},
      {SOCK_IMAGE, "IMAGE", 0, "Image", ""},
      {SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
      {SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
 +    {SOCK_TEXTURE, "TEXTURE", 0, "Texture", ""},
 +    {SOCK_MATERIAL, "MATERIAL", 0, "Material", ""},
      {0, NULL, 0, NULL, NULL},
  };
  
@@@ -975,32 -957,6 +975,32 @@@ static void rna_NodeTree_get_from_conte
    RNA_parameter_list_free(&list);
  }
  
 +static bool rna_NodeTree_valid_socket_type(eNodeSocketDatatype socket_type,
 +                                           bNodeTreeType *ntreetype)
 +{
 +  extern FunctionRNA rna_NodeTree_valid_socket_type_func;
 +
 +  PointerRNA ptr;
 +  ParameterList list;
 +  FunctionRNA *func;
 +  void *ret;
 +  bool valid;
 +
 +  RNA_pointer_create(NULL, ntreetype->rna_ext.srna, NULL, &ptr); /* dummy */
 +  func = &rna_NodeTree_valid_socket_type_func;
 +
 +  RNA_parameter_list_create(&list, &ptr, func);
 +  RNA_parameter_set_lookup(&list, "type", &socket_type);
 +  ntreetype->rna_ext.call(NULL, &ptr, func, &list);
 +
 +  RNA_parameter_get_lookup(&list, "valid", &ret);
 +  valid = *(bool *)ret;
 +
 +  RNA_parameter_list_free(&list);
 +
 +  return valid;
 +}
 +
  static void rna_NodeTree_unregister(Main *UNUSED(bmain), StructRNA *type)
  {
    bNodeTreeType *nt = RNA_struct_blender_type_get(type);
@@@ -1029,7 -985,7 +1029,7 @@@ static StructRNA *rna_NodeTree_register
    bNodeTreeType *nt, dummynt;
    bNodeTree dummyntree;
    PointerRNA dummyptr;
 -  int have_function[3];
 +  int have_function[4];
  
    /* setup dummy tree & tree type to store static properties in */
    memset(&dummynt, 0, sizeof(bNodeTreeType));
    nt->poll = (have_function[0]) ? rna_NodeTree_poll : NULL;
    nt->update = (have_function[1]) ? rna_NodeTree_update_reg : NULL;
    nt->get_from_context = (have_function[2]) ? rna_NodeTree_get_from_context : NULL;
 +  nt->valid_socket_type = (have_function[3]) ? rna_NodeTree_valid_socket_type : NULL;
  
    ntreeTypeAdd(nt);
  
@@@ -1959,29 -1914,6 +1959,29 @@@ static const EnumPropertyItem *itemf_fu
    return item_array;
  }
  
 +static bool switch_type_supported(const EnumPropertyItem *item)
 +{
 +  return ELEM(item->value,
 +              SOCK_FLOAT,
 +              SOCK_INT,
 +              SOCK_BOOLEAN,
 +              SOCK_VECTOR,
 +              SOCK_STRING,
 +              SOCK_RGBA,
 +              SOCK_GEOMETRY,
 +              SOCK_OBJECT,
 +              SOCK_COLLECTION);
 +}
 +
 +static const EnumPropertyItem *rna_GeometryNodeSwitch_type_itemf(bContext *UNUSED(C),
 +                                                                 PointerRNA *UNUSED(ptr),
 +                                                                 PropertyRNA *UNUSED(prop),
 +                                                                 bool *r_free)
 +{
 +  *r_free = true;
 +  return itemf_function_check(node_socket_data_type_items, switch_type_supported);
 +}
 +
  static bool attribute_clamp_type_supported(const EnumPropertyItem *item)
  {
    return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_INT32, CD_PROP_COLOR);
@@@ -2052,7 -1984,6 +2052,7 @@@ static void rna_GeometryNodeAttributeRa
  static bool attribute_convert_type_supported(const EnumPropertyItem *item)
  {
    return ELEM(item->value,
 +              CD_AUTO_FROM_NAME,
                CD_PROP_FLOAT,
                CD_PROP_FLOAT2,
                CD_PROP_FLOAT3,
@@@ -2064,8 -1995,7 +2064,8 @@@ static const EnumPropertyItem *rna_Geom
      bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
  {
    *r_free = true;
 -  return itemf_function_check(rna_enum_attribute_type_items, attribute_convert_type_supported);
 +  return itemf_function_check(rna_enum_attribute_type_with_auto_items,
 +                              attribute_convert_type_supported);
  }
  
  static bool attribute_fill_type_supported(const EnumPropertyItem *item)
@@@ -2187,17 -2117,6 +2187,17 @@@ static const EnumPropertyItem *rna_Geom
    return itemf_function_check(rna_enum_attribute_type_items, attribute_map_range_type_supported);
  }
  
 +static bool attribute_curve_map_type_supported(const EnumPropertyItem *item)
 +{
 +  return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR);
 +}
 +static const EnumPropertyItem *rna_GeometryNodeAttributeCurveMap_type_itemf(
 +    bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
 +{
 +  *r_free = true;
 +  return itemf_function_check(rna_enum_attribute_type_items, attribute_curve_map_type_supported);
 +}
 +
  static StructRNA *rna_ShaderNode_register(Main *bmain,
                                            ReportList *reports,
                                            void *data,
@@@ -3134,7 -3053,7 +3134,7 @@@ static void rna_NodeSocketStandard_draw
  }
  
  static void rna_NodeSocketStandard_draw_color(
 -    ID *id, bNodeSocket *sock, struct bContext *C, PointerRNA *nodeptr, float *r_color)
 +    ID *id, bNodeSocket *sock, struct bContext *C, PointerRNA *nodeptr, float r_color[4])
  {
    PointerRNA ptr;
    RNA_pointer_create(id, &RNA_NodeSocket, sock, &ptr);
@@@ -3154,7 -3073,7 +3154,7 @@@ static void rna_NodeSocketInterfaceStan
  static void rna_NodeSocketInterfaceStandard_draw_color(ID *id,
                                                         bNodeSocket *sock,
                                                         struct bContext *C,
 -                                                       float *r_color)
 +                                                       float r_color[4])
  {
    PointerRNA ptr;
    RNA_pointer_create(id, &RNA_NodeSocket, sock, &ptr);
@@@ -4456,13 -4375,6 +4456,13 @@@ void rna_ShaderNodePointDensity_density
    RE_point_density_minmax(depsgraph, pd, r_min, r_max);
  }
  
 +bool rna_NodeSocketMaterial_default_value_poll(PointerRNA *UNUSED(ptr), PointerRNA value)
 +{
 +  /* Do not show grease pencil materials for now. */
 +  Material *ma = (Material *)value.data;
 +  return ma->gp_style == NULL;
 +}
 +
  #else
  
  static const EnumPropertyItem prop_image_layer_items[] = {
@@@ -9042,9 -8954,9 +9042,9 @@@ static void def_geo_attribute_convert(S
    RNA_def_struct_sdna_from(srna, "NodeAttributeConvert", "storage");
  
    prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
 -  RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
 +  RNA_def_property_enum_items(prop, rna_enum_attribute_type_with_auto_items);
    RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeConvert_type_itemf");
 -  RNA_def_property_enum_default(prop, CD_PROP_FLOAT);
 +  RNA_def_property_enum_default(prop, CD_AUTO_FROM_NAME);
    RNA_def_property_ui_text(prop, "Data Type", "The data type to save the result attribute with");
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_GeometryNode_socket_update");
  
@@@ -9236,12 -9148,12 +9236,12 @@@ static void def_geo_attribute_attribute
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  
    prop = RNA_def_property(srna, "input_type_a", PROP_ENUM, PROP_NONE);
-   RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_any);
+   RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_no_boolean);
    RNA_def_property_ui_text(prop, "Input Type A", "");
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  
    prop = RNA_def_property(srna, "input_type_b", PROP_ENUM, PROP_NONE);
-   RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_any);
+   RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_no_boolean);
    RNA_def_property_ui_text(prop, "Input Type B", "");
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  }
@@@ -9285,85 -9197,6 +9285,85 @@@ static void def_geo_attribute_color_ram
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
  }
  
 +static void def_geo_attribute_curve_map(StructRNA *srna)
 +{
 +  PropertyRNA *prop;
 +
 +  RNA_def_struct_sdna_from(srna, "NodeAttributeCurveMap", "storage");
 +
 +  prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_sdna(prop, NULL, "data_type");
 +  RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
 +  RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeCurveMap_type_itemf");
 +  RNA_def_property_ui_text(prop, "Data Type", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +
 +  prop = RNA_def_property(srna, "curve_vec", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_struct_type(prop, "CurveMapping");
 +  RNA_def_property_ui_text(prop, "Mapping", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 +
 +  prop = RNA_def_property(srna, "curve_rgb", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_struct_type(prop, "CurveMapping");
 +  RNA_def_property_ui_text(prop, "Mapping", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 +}
 +
 +static void def_geo_attribute_vector_rotate(StructRNA *srna)
 +{
 +  static const EnumPropertyItem rotate_mode_items[] = {
 +      {GEO_NODE_VECTOR_ROTATE_TYPE_AXIS,
 +       "AXIS_ANGLE",
 +       0,
 +       "Axis Angle",
 +       "Rotate a point using axis angle"},
 +      {GEO_NODE_VECTOR_ROTATE_TYPE_AXIS_X, "X_AXIS", 0, "X Axis", "Rotate a point using X axis"},
 +      {GEO_NODE_VECTOR_ROTATE_TYPE_AXIS_Y, "Y_AXIS", 0, "Y Axis", "Rotate a point using Y axis"},
 +      {GEO_NODE_VECTOR_ROTATE_TYPE_AXIS_Z, "Z_AXIS", 0, "Z Axis", "Rotate a point using Z axis"},
 +      {GEO_NODE_VECTOR_ROTATE_TYPE_EULER_XYZ,
 +       "EULER_XYZ",
 +       0,
 +       "Euler",
 +       "Rotate a point using XYZ order"},
 +      {0, NULL, 0, NULL, NULL},
 +  };
 +
 +  PropertyRNA *prop;
 +
 +  RNA_def_struct_sdna_from(srna, "NodeAttributeVectorRotate", "storage");
 +
 +  prop = RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_sdna(prop, NULL, "mode");
 +  RNA_def_property_enum_items(prop, rotate_mode_items);
 +  RNA_def_property_ui_text(prop, "Mode", "Type of rotation");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
 +
 +  prop = RNA_def_property(srna, "input_type_vector", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector);
 +  RNA_def_property_ui_text(prop, "Input Type Vector", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +
 +  prop = RNA_def_property(srna, "input_type_center", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector);
 +  RNA_def_property_ui_text(prop, "Input Type Center", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +
 +  prop = RNA_def_property(srna, "input_type_axis", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector);
 +  RNA_def_property_ui_text(prop, "Input Type Axis", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +
 +  prop = RNA_def_property(srna, "input_type_angle", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
 +  RNA_def_property_ui_text(prop, "Input Type Angle", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +
 +  prop = RNA_def_property(srna, "input_type_rotation", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_vector);
 +  RNA_def_property_ui_text(prop, "Input Type Rotation", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +}
 +
  static void def_geo_point_rotate(StructRNA *srna)
  {
    static const EnumPropertyItem type_items[] = {
@@@ -9518,6 -9351,19 +9518,6 @@@ static void def_geo_point_translate(Str
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  }
  
 -static void def_geo_attribute_sample_texture(StructRNA *srna)
 -{
 -  PropertyRNA *prop;
 -
 -  prop = RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
 -  RNA_def_property_pointer_sdna(prop, NULL, "id");
 -  RNA_def_property_struct_type(prop, "Texture");
 -  RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
 -  RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
 -  RNA_def_property_ui_text(prop, "Texture", "Texture to sample values from");
 -  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update_relations");
 -}
 -
  static void def_geo_object_info(StructRNA *srna)
  {
    PropertyRNA *prop;
@@@ -9785,93 -9631,6 +9785,93 @@@ static void def_geo_mesh_line(StructRN
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  }
  
 +static void def_geo_switch(StructRNA *srna)
 +{
 +  PropertyRNA *prop;
 +
 +  RNA_def_struct_sdna_from(srna, "NodeSwitch", "storage");
 +  prop = RNA_def_property(srna, "input_type", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_sdna(prop, NULL, "input_type");
 +  RNA_def_property_enum_items(prop, node_socket_data_type_items);
 +  RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeSwitch_type_itemf");
 +  RNA_def_property_ui_text(prop, "Input Type", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +}
 +
 +static void def_geo_curve_resample(StructRNA *srna)
 +{
 +  PropertyRNA *prop;
 +
 +  static EnumPropertyItem mode_items[] = {
 +      {GEO_NODE_CURVE_SAMPLE_COUNT,
 +       "COUNT",
 +       0,
 +       "Count",
 +       "Sample the specified number of points along each spline"},
 +      {GEO_NODE_CURVE_SAMPLE_LENGTH,
 +       "LENGTH",
 +       0,
 +       "Length",
 +       "Calculate the number of samples by splitting each spline into segments with the specified "
 +       "length"},
 +      {0, NULL, 0, NULL, NULL},
 +  };
 +
 +  RNA_def_struct_sdna_from(srna, "NodeGeometryCurveResample", "storage");
 +
 +  prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, mode_items);
 +  RNA_def_property_ui_text(prop, "Mode", "How to specify the amount of samples");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 +}
 +
 +static void def_geo_attribute_transfer(StructRNA *srna)
 +{
 +  static EnumPropertyItem mapping_items[] = {
 +      {GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST_FACE_INTERPOLATED,
 +       "NEAREST_FACE_INTERPOLATED",
 +       0,
 +       "Nearest Face Interpolated",
 +       "Transfer the attribute from the nearest face on a surface (loose points and edges are "
 +       "ignored)"},
 +      {GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST,
 +       "NEAREST",
 +       0,
 +       "Nearest",
 +       "Transfer the element from the nearest element (using face and edge centers for the "
 +       "distance computation)"},
 +      {0, NULL, 0, NULL, NULL},
 +  };
 +
 +  PropertyRNA *prop;
 +
 +  RNA_def_struct_sdna_from(srna, "NodeGeometryAttributeTransfer", "storage");
 +
 +  prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, rna_enum_attribute_domain_with_auto_items);
 +  RNA_def_property_enum_default(prop, ATTR_DOMAIN_AUTO);
 +  RNA_def_property_ui_text(prop, "Domain", "The geometry domain to save the result attribute in");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 +
 +  prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
 +  RNA_def_property_enum_items(prop, mapping_items);
 +  RNA_def_property_ui_text(prop, "Mapping", "Mapping between geometries");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 +}
 +
 +static void def_geo_input_material(StructRNA *srna)
 +{
 +  PropertyRNA *prop;
 +
 +  prop = RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_pointer_sdna(prop, NULL, "id");
 +  RNA_def_property_struct_type(prop, "Material");
 +  RNA_def_property_flag(prop, PROP_EDITABLE);
 +  RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
 +  RNA_def_property_ui_text(prop, "Material", "");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 +}
 +
  /* -------------------------------------------------------------------------- */
  
  static void rna_def_shader_node(BlenderRNA *brna)
@@@ -10644,80 -10403,6 +10644,80 @@@ static void rna_def_node_socket_collect
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
  }
  
 +static void rna_def_node_socket_texture(BlenderRNA *brna,
 +                                        const char *identifier,
 +                                        const char *interface_idname)
 +{
 +  StructRNA *srna;
 +  PropertyRNA *prop;
 +
 +  srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
 +  RNA_def_struct_ui_text(srna, "Texture Node Socket", "Texture socket of a node");
 +  RNA_def_struct_sdna(srna, "bNodeSocket");
 +
 +  RNA_def_struct_sdna_from(srna, "bNodeSocketValueTexture", "default_value");
 +
 +  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_pointer_sdna(prop, NULL, "value");
 +  RNA_def_property_struct_type(prop, "Texture");
 +  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
 +  RNA_def_property_update(
 +      prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
 +  RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
 +
 +  /* socket interface */
 +  srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
 +  RNA_def_struct_ui_text(srna, "Texture Node Socket Interface", "Texture socket of a node");
 +  RNA_def_struct_sdna(srna, "bNodeSocket");
 +
 +  RNA_def_struct_sdna_from(srna, "bNodeSocketValueTexture", "default_value");
 +
 +  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_pointer_sdna(prop, NULL, "value");
 +  RNA_def_property_struct_type(prop, "Texture");
 +  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
 +}
 +
 +static void rna_def_node_socket_material(BlenderRNA *brna,
 +                                         const char *identifier,
 +                                         const char *interface_idname)
 +{
 +  StructRNA *srna;
 +  PropertyRNA *prop;
 +
 +  srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
 +  RNA_def_struct_ui_text(srna, "Material Node Socket", "Material socket of a node");
 +  RNA_def_struct_sdna(srna, "bNodeSocket");
 +
 +  RNA_def_struct_sdna_from(srna, "bNodeSocketValueMaterial", "default_value");
 +
 +  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_pointer_sdna(prop, NULL, "value");
 +  RNA_def_property_struct_type(prop, "Material");
 +  RNA_def_property_pointer_funcs(
 +      prop, NULL, NULL, NULL, "rna_NodeSocketMaterial_default_value_poll");
 +  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
 +  RNA_def_property_update(
 +      prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
 +  RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
 +
 +  /* socket interface */
 +  srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
 +  RNA_def_struct_ui_text(srna, "Material Node Socket Interface", "Material socket of a node");
 +  RNA_def_struct_sdna(srna, "bNodeSocket");
 +
 +  RNA_def_struct_sdna_from(srna, "bNodeSocketValueMaterial", "default_value");
 +
 +  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
 +  RNA_def_property_pointer_sdna(prop, NULL, "value");
 +  RNA_def_property_struct_type(prop, "Material");
 +  RNA_def_property_pointer_funcs(
 +      prop, NULL, NULL, NULL, "rna_NodeSocketMaterial_default_value_poll");
 +  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
 +  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
 +}
 +
  static void rna_def_node_socket_standard_types(BlenderRNA *brna)
  {
    /* XXX Workaround: Registered functions are not exposed in python by bpy,
    rna_def_node_socket_geometry(brna, "NodeSocketGeometry", "NodeSocketInterfaceGeometry");
  
    rna_def_node_socket_collection(brna, "NodeSocketCollection", "NodeSocketInterfaceCollection");
 +
 +  rna_def_node_socket_texture(brna, "NodeSocketTexture", "NodeSocketInterfaceTexture");
 +
 +  rna_def_node_socket_material(brna, "NodeSocketMaterial", "NodeSocketInterfaceMaterial");
  }
  
  static void rna_def_internal_node(BlenderRNA *brna)
@@@ -11650,14 -11331,6 +11650,14 @@@ static void rna_def_nodetree(BlenderRN
    parm = RNA_def_pointer(
        func, "result_3", "ID", "From ID", "Original ID data-block selected from the context");
    RNA_def_function_output(func, parm);
 +
 +  /* Check for support of a socket type. */
 +  func = RNA_def_function(srna, "valid_socket_type", NULL);
 +  RNA_def_function_ui_description(func, "Check if the socket type is valid for the node tree");
 +  RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_REGISTER_OPTIONAL);
 +  parm = RNA_def_enum(func, "type", node_socket_type_items, 0, "", "");
 +  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
 +  RNA_def_function_return(func, RNA_def_boolean(func, "valid", false, "", ""));
  }
  
  static void rna_def_composite_nodetree(BlenderRNA *brna)