Blender  V2.93
Classes | Macros | Typedefs | Functions | Variables
material.c File Reference
#include <math.h>
#include <stddef.h>
#include <string.h>
#include "CLG_log.h"
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_anim_types.h"
#include "DNA_collection_types.h"
#include "DNA_curve_types.h"
#include "DNA_customdata_types.h"
#include "DNA_defaults.h"
#include "DNA_gpencil_types.h"
#include "DNA_hair_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_pointcloud_types.h"
#include "DNA_scene_types.h"
#include "DNA_volume_types.h"
#include "BLI_array_utils.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BLT_translation.h"
#include "BKE_anim_data.h"
#include "BKE_brush.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_editmesh.h"
#include "BKE_font.h"
#include "BKE_gpencil.h"
#include "BKE_icons.h"
#include "BKE_idtype.h"
#include "BKE_image.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_scene.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
#include "GPU_material.h"
#include "NOD_shader.h"
#include "BLO_read_write.h"

Go to the source code of this file.

Classes

struct  FillTexPaintSlotsData
 
struct  FindTexPaintNodeData
 

Macros

#define DNA_DEPRECATED_ALLOW
 

Typedefs

typedef bool(* ForEachTexNodeCallback) (bNode *node, void *userdata)
 

Functions

static void material_init_data (ID *id)
 
static void material_copy_data (Main *bmain, ID *id_dst, const ID *id_src, const int flag)
 
static void material_free_data (ID *id)
 
static void material_foreach_id (ID *id, LibraryForeachIDData *data)
 
static void material_blend_write (BlendWriter *writer, ID *id, const void *id_address)
 
static void material_blend_read_data (BlendDataReader *reader, ID *id)
 
static void material_blend_read_lib (BlendLibReader *reader, ID *id)
 
static void material_blend_read_expand (BlendExpander *expander, ID *id)
 
void BKE_gpencil_material_attr_init (Material *ma)
 
MaterialBKE_material_add (Main *bmain, const char *name)
 
MaterialBKE_gpencil_material_add (Main *bmain, const char *name)
 
Material *** BKE_object_material_array_p (Object *ob)
 
short * BKE_object_material_len_p (Object *ob)
 
Material *** BKE_id_material_array_p (ID *id)
 
short * BKE_id_material_len_p (ID *id)
 
static void material_data_index_remove_id (ID *id, short index)
 
bool BKE_object_material_slot_used (ID *id, short actcol)
 
static void material_data_index_clear_id (ID *id)
 
void BKE_id_materials_copy (Main *bmain, ID *id_src, ID *id_dst)
 
void BKE_id_material_resize (Main *bmain, ID *id, short totcol, bool do_id_user)
 
void BKE_id_material_append (Main *bmain, ID *id, Material *ma)
 
MaterialBKE_id_material_pop (Main *bmain, ID *id, int index_i)
 
void BKE_id_material_clear (Main *bmain, ID *id)
 
Material ** BKE_object_material_get_p (Object *ob, short act)
 
MaterialBKE_object_material_get (Object *ob, short act)
 
MaterialBKE_gpencil_material (Object *ob, short act)
 
MaterialGPencilStyleBKE_gpencil_material_settings (Object *ob, short act)
 
void BKE_object_material_resize (Main *bmain, Object *ob, const short totcol, bool do_id_user)
 
void BKE_object_materials_test (Main *bmain, Object *ob, ID *id)
 
void BKE_objects_materials_test_all (Main *bmain, ID *id)
 
void BKE_id_material_assign (Main *bmain, ID *id, Material *ma, short act)
 
void BKE_object_material_assign (Main *bmain, Object *ob, Material *ma, short act, int assign_type)
 
void BKE_object_material_remap (Object *ob, const unsigned int *remap)
 
void BKE_object_material_remap_calc (Object *ob_dst, Object *ob_src, short *remap_src_to_dst)
 
void BKE_object_material_array_assign (Main *bmain, struct Object *ob, struct Material ***matar, int totcol, const bool to_object_only)
 
short BKE_object_material_slot_find_index (Object *ob, Material *ma)
 
bool BKE_object_material_slot_add (Main *bmain, Object *ob)
 
bool BKE_object_material_slot_remove (Main *bmain, Object *ob)
 
static bNodenodetree_uv_node_recursive (bNode *node)
 
static bool ntree_foreach_texnode_recursive (bNodeTree *nodetree, ForEachTexNodeCallback callback, void *userdata)
 
static bool count_texture_nodes_cb (bNode *UNUSED(node), void *userdata)
 
static int count_texture_nodes_recursive (bNodeTree *nodetree)
 
static bool fill_texpaint_slots_cb (bNode *node, void *userdata)
 
static void fill_texpaint_slots_recursive (bNodeTree *nodetree, bNode *active_node, Material *ma, int slot_len)
 
void BKE_texpaint_slot_refresh_cache (Scene *scene, Material *ma)
 
void BKE_texpaint_slots_refresh_object (Scene *scene, struct Object *ob)
 
static bool texpaint_slot_node_find_cb (bNode *node, void *userdata)
 
bNodeBKE_texpaint_slot_material_find_node (Material *ma, short texpaint_slot)
 
void ramp_blend (int type, float r_col[3], const float fac, const float col[3])
 
void BKE_material_copybuf_clear (void)
 
void BKE_material_copybuf_free (void)
 
void BKE_material_copybuf_copy (Main *bmain, Material *ma)
 
void BKE_material_copybuf_paste (Main *bmain, Material *ma)
 
void BKE_material_eval (struct Depsgraph *depsgraph, Material *material)
 
static void material_default_gpencil_init (Material *ma)
 
static void material_default_surface_init (Material *ma)
 
static void material_default_volume_init (Material *ma)
 
static void material_default_holdout_init (Material *ma)
 
MaterialBKE_material_default_empty (void)
 
MaterialBKE_material_default_holdout (void)
 
MaterialBKE_material_default_surface (void)
 
MaterialBKE_material_default_volume (void)
 
MaterialBKE_material_default_gpencil (void)
 
void BKE_material_defaults_free_gpu (void)
 
void BKE_materials_init (void)
 
void BKE_materials_exit (void)
 

Variables

static CLG_LogRef LOG = {"bke.material"}
 
IDTypeInfo IDType_ID_MA
 
static Material matcopybuf
 copy/paste buffer, if we had a proper py api that would be better More...
 
static short matcopied = 0
 
static Material default_material_empty
 
static Material default_material_holdout
 
static Material default_material_surface
 
static Material default_material_volume
 
static Material default_material_gpencil
 
static Materialdefault_materials []
 

Macro Definition Documentation

◆ DNA_DEPRECATED_ALLOW

#define DNA_DEPRECATED_ALLOW

Definition at line 33 of file material.c.

Typedef Documentation

◆ ForEachTexNodeCallback

typedef bool(* ForEachTexNodeCallback) (bNode *node, void *userdata)

Definition at line 1223 of file material.c.

Function Documentation

◆ BKE_gpencil_material()

Material* BKE_gpencil_material ( Object ob,
short  act 
)

◆ BKE_gpencil_material_add()

Material* BKE_gpencil_material_add ( Main bmain,
const char *  name 
)

◆ BKE_gpencil_material_attr_init()

void BKE_gpencil_material_attr_init ( Material ma)

◆ BKE_gpencil_material_settings()

MaterialGPencilStyle* BKE_gpencil_material_settings ( Object ob,
short  act 
)

◆ BKE_id_material_append()

void BKE_id_material_append ( Main bmain,
ID id,
Material ma 
)

◆ BKE_id_material_array_p()

Material*** BKE_id_material_array_p ( ID id)

◆ BKE_id_material_assign()

void BKE_id_material_assign ( Main bmain,
ID id,
Material ma,
short  act 
)

◆ BKE_id_material_clear()

void BKE_id_material_clear ( Main bmain,
ID id 
)

◆ BKE_id_material_len_p()

short* BKE_id_material_len_p ( ID id)

◆ BKE_id_material_pop()

Material* BKE_id_material_pop ( Main bmain,
ID id,
int  index_i 
)

◆ BKE_id_material_resize()

void BKE_id_material_resize ( Main bmain,
ID id,
short  totcol,
bool  do_id_user 
)

◆ BKE_id_materials_copy()

void BKE_id_materials_copy ( Main bmain,
ID id_src,
ID id_dst 
)

◆ BKE_material_add()

Material* BKE_material_add ( Main bmain,
const char *  name 
)

◆ BKE_material_copybuf_clear()

void BKE_material_copybuf_clear ( void  )

Definition at line 1655 of file material.c.

References matcopied, and matcopybuf.

Referenced by WM_init().

◆ BKE_material_copybuf_copy()

void BKE_material_copybuf_copy ( Main bmain,
Material ma 
)

◆ BKE_material_copybuf_free()

void BKE_material_copybuf_free ( void  )

◆ BKE_material_copybuf_paste()

void BKE_material_copybuf_paste ( Main bmain,
Material ma 
)

◆ BKE_material_default_empty()

Material* BKE_material_default_empty ( void  )

Definition at line 1819 of file material.c.

References default_material_empty.

Referenced by workbench_object_material_get().

◆ BKE_material_default_gpencil()

Material* BKE_material_default_gpencil ( void  )

◆ BKE_material_default_holdout()

Material* BKE_material_default_holdout ( void  )

Definition at line 1824 of file material.c.

References default_material_holdout.

Referenced by eevee_object_material_get().

◆ BKE_material_default_surface()

Material* BKE_material_default_surface ( void  )

◆ BKE_material_default_volume()

Material* BKE_material_default_volume ( void  )

◆ BKE_material_defaults_free_gpu()

void BKE_material_defaults_free_gpu ( void  )

Definition at line 1844 of file material.c.

◆ BKE_material_eval()

void BKE_material_eval ( struct Depsgraph depsgraph,
Material material 
)

◆ BKE_materials_exit()

void BKE_materials_exit ( void  )

Definition at line 1868 of file material.c.

References default_materials, and material_free_data().

Referenced by WM_exit_ex().

◆ BKE_materials_init()

void BKE_materials_init ( void  )

◆ BKE_object_material_array_assign()

void BKE_object_material_array_assign ( Main bmain,
struct Object ob,
struct Material ***  matar,
int  totcol,
const bool  to_object_only 
)

◆ BKE_object_material_array_p()

Material*** BKE_object_material_array_p ( Object ob)

◆ BKE_object_material_assign()

void BKE_object_material_assign ( Main bmain,
Object ob,
Material ma,
short  act,
int  assign_type 
)

◆ BKE_object_material_get()

Material* BKE_object_material_get ( Object ob,
short  act 
)

Definition at line 697 of file material.c.

References BKE_object_material_get_p(), and NULL.

Referenced by InstanceWriter::add_material_bindings(), animdata_filter_ds_materials(), bake_object_check(), bc_has_animations(), BKE_gpencil_convert_mesh(), BKE_gpencil_material(), BKE_gpencil_material_find_index_by_name_prefix(), BKE_gpencil_material_settings(), BKE_gpencil_object_material_ensure_by_name(), BKE_gpencil_object_material_ensure_from_active_input_material(), BKE_gpencil_object_material_ensure_from_brush(), BKE_gpencil_object_material_from_brush_get(), BKE_gpencil_object_material_index_get(), BKE_gpencil_object_material_index_get_by_name(), BKE_object_material_remap_calc(), BKE_texpaint_slots_refresh_object(), buttons_context_path_material(), GeometryExporter::create_mesh_primitive_list(), ED_gpencil_material_enum_itemf(), ED_mesh_join_objects_exec(), ED_object_assign_active_image(), ED_object_get_active_image(), ED_object_texture_paint_mode_enter_ex(), ED_paint_proj_mesh_data_check(), EEVEE_cryptomatte_cache_populate(), eevee_object_material_get(), EEVEE_volumes_cache_object_add(), AnimationExporter::export_curve_animation(), eyedropper_add_material(), BCAnimationCurve::get_animation_name(), get_default_texture_layer_name_for_object(), get_or_create_current_material(), gpencil_check_same_material_color(), gpencil_fill_invoke(), gpencil_layer_duplicate_object_exec(), gpencil_material_find_index_by_name(), gpencil_material_lock_unsused_exec(), gpencil_modifier_masking_panel_draw(), gpencil_strokes_copy_exec(), imapaint_face_image(), imapaint_pick_uv(), Freestyle::BlenderFileLoader::insertShapeNode(), join_mesh_single(), lineart_geometry_object_load(), make_links_data_exec(), material_slot_assign_exec(), material_slot_de_select(), mesh_new_from_mball_object(), object_frame_has_keyframe(), object_select_all_by_material(), object_select_linked_exec(), ForEachMaterialFunctor< Functor >::operator()(), overlay_gpencil_draw_stroke_color_name(), OVERLAY_particle_cache_populate(), proj_paint_add_slot(), proj_paint_state_mesh_eval_init(), psys_get_particle_on_path(), psys_thread_context_init(), shader_get_from_context(), single_mat_users(), AnimationImporter::translate_Animations(), workbench_object_material_get(), and workbench_volume_material_color().

◆ BKE_object_material_get_p()

Material** BKE_object_material_get_p ( Object ob,
short  act 
)

◆ BKE_object_material_len_p()

short* BKE_object_material_len_p ( Object ob)

◆ BKE_object_material_remap()

void BKE_object_material_remap ( Object ob,
const unsigned int *  remap 
)

◆ BKE_object_material_remap_calc()

void BKE_object_material_remap_calc ( Object ob_dst,
Object ob_src,
short *  remap_src_to_dst 
)

Calculate a material remapping from ob_src to ob_dst.

Parameters
remap_src_to_dstAn array the size of ob_src->totcol where index values are filled in which map to ob_dst materials.

Definition at line 983 of file material.c.

References BKE_object_material_get(), BLI_ghash_free(), BLI_ghash_lookup_p(), BLI_ghash_ptr_new_ex(), BLI_ghash_reinsert(), NULL, POINTER_AS_INT, POINTER_FROM_INT, and Object::totcol.

Referenced by BMD_mesh_intersection().

◆ BKE_object_material_resize()

void BKE_object_material_resize ( Main bmain,
Object ob,
const short  totcol,
bool  do_id_user 
)

◆ BKE_object_material_slot_add()

bool BKE_object_material_slot_add ( Main bmain,
Object ob 
)

◆ BKE_object_material_slot_find_index()

short BKE_object_material_slot_find_index ( Object ob,
Material ma 
)

◆ BKE_object_material_slot_remove()

bool BKE_object_material_slot_remove ( Main bmain,
Object ob 
)

◆ BKE_object_material_slot_used()

bool BKE_object_material_slot_used ( ID id,
short  actcol 
)

◆ BKE_object_materials_test()

void BKE_object_materials_test ( Main bmain,
Object ob,
ID id 
)

◆ BKE_objects_materials_test_all()

void BKE_objects_materials_test_all ( Main bmain,
ID id 
)

◆ BKE_texpaint_slot_material_find_node()

bNode* BKE_texpaint_slot_material_find_node ( Material ma,
short  texpaint_slot 
)

◆ BKE_texpaint_slot_refresh_cache()

void BKE_texpaint_slot_refresh_cache ( Scene scene,
Material ma 
)

◆ BKE_texpaint_slots_refresh_object()

void BKE_texpaint_slots_refresh_object ( Scene scene,
struct Object ob 
)

◆ count_texture_nodes_cb()

static bool count_texture_nodes_cb ( bNode UNUSEDnode,
void *  userdata 
)
static

Definition at line 1245 of file material.c.

Referenced by count_texture_nodes_recursive().

◆ count_texture_nodes_recursive()

static int count_texture_nodes_recursive ( bNodeTree nodetree)
static

◆ fill_texpaint_slots_cb()

static bool fill_texpaint_slots_cb ( bNode node,
void *  userdata 
)
static

◆ fill_texpaint_slots_recursive()

static void fill_texpaint_slots_recursive ( bNodeTree nodetree,
bNode active_node,
Material ma,
int  slot_len 
)
static

◆ material_blend_read_data()

static void material_blend_read_data ( BlendDataReader reader,
ID id 
)
static

◆ material_blend_read_expand()

static void material_blend_read_expand ( BlendExpander expander,
ID id 
)
static

◆ material_blend_read_lib()

static void material_blend_read_lib ( BlendLibReader reader,
ID id 
)
static

◆ material_blend_write()

static void material_blend_write ( BlendWriter writer,
ID id,
const void *  id_address 
)
static

◆ material_copy_data()

static void material_copy_data ( Main bmain,
ID id_dst,
const ID id_src,
const int  flag 
)
static

◆ material_data_index_clear_id()

static void material_data_index_clear_id ( ID id)
static

◆ material_data_index_remove_id()

static void material_data_index_remove_id ( ID id,
short  index 
)
static

◆ material_default_gpencil_init()

static void material_default_gpencil_init ( Material ma)
static

◆ material_default_holdout_init()

static void material_default_holdout_init ( Material ma)
static

◆ material_default_surface_init()

static void material_default_surface_init ( Material ma)
static

◆ material_default_volume_init()

static void material_default_volume_init ( Material ma)
static

◆ material_foreach_id()

static void material_foreach_id ( ID id,
LibraryForeachIDData data 
)
static

◆ material_free_data()

static void material_free_data ( ID id)
static

◆ material_init_data()

static void material_init_data ( ID id)
static

◆ nodetree_uv_node_recursive()

static bNode* nodetree_uv_node_recursive ( bNode node)
static

◆ ntree_foreach_texnode_recursive()

static bool ntree_foreach_texnode_recursive ( bNodeTree nodetree,
ForEachTexNodeCallback  callback,
void *  userdata 
)
static

◆ ramp_blend()

void ramp_blend ( int  type,
float  r_col[3],
const float  fac,
const float  col[3] 
)

◆ texpaint_slot_node_find_cb()

static bool texpaint_slot_node_find_cb ( bNode node,
void *  userdata 
)
static

Variable Documentation

◆ default_material_empty

Material default_material_empty
static

Definition at line 1727 of file material.c.

Referenced by BKE_material_default_empty().

◆ default_material_gpencil

Material default_material_gpencil
static

Definition at line 1731 of file material.c.

Referenced by BKE_material_default_gpencil(), and BKE_materials_init().

◆ default_material_holdout

Material default_material_holdout
static

Definition at line 1728 of file material.c.

Referenced by BKE_material_default_holdout(), and BKE_materials_init().

◆ default_material_surface

Material default_material_surface
static

Definition at line 1729 of file material.c.

Referenced by BKE_material_default_surface(), and BKE_materials_init().

◆ default_material_volume

Material default_material_volume
static

Definition at line 1730 of file material.c.

Referenced by BKE_material_default_volume(), and BKE_materials_init().

◆ default_materials

Material* default_materials[]
static
Initial value:
static Material default_material_gpencil
Definition: material.c:1731
static Material default_material_surface
Definition: material.c:1729
static Material default_material_empty
Definition: material.c:1727
static Material default_material_holdout
Definition: material.c:1728
static Material default_material_volume
Definition: material.c:1730

Definition at line 1733 of file material.c.

Referenced by BKE_material_defaults_free_gpu(), BKE_materials_exit(), and BKE_materials_init().

◆ IDType_ID_MA

IDTypeInfo IDType_ID_MA
Initial value:
= {
.id_code = ID_MA,
.id_filter = FILTER_ID_MA,
.main_listbase_index = INDEX_ID_MA,
.struct_size = sizeof(Material),
.name = "Material",
.name_plural = "materials",
.translation_context = BLT_I18NCONTEXT_ID_MATERIAL,
.flags = 0,
.copy_data = material_copy_data,
.free_data = material_free_data,
.make_local = NULL,
.foreach_id = material_foreach_id,
.foreach_cache = NULL,
.owner_get = NULL,
.blend_write = material_blend_write,
.blend_read_data = material_blend_read_data,
.blend_read_lib = material_blend_read_lib,
.blend_read_expand = material_blend_read_expand,
.blend_read_undo_preserve = NULL,
.lib_override_apply_post = NULL,
}
#define BLT_I18NCONTEXT_ID_MATERIAL
#define FILTER_ID_MA
Definition: DNA_ID.h:716
@ INDEX_ID_MA
Definition: DNA_ID.h:813
@ ID_MA
Definition: DNA_ID_enums.h:63
struct Material Material
static void init_data(ModifierData *md)
static void material_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: material.c:225
static void material_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: material.c:162
static void material_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: material.c:178
static void material_free_data(ID *id)
Definition: material.c:140
static void material_blend_read_expand(BlendExpander *expander, ID *id)
Definition: material.c:242
static void material_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
Definition: material.c:98
static void material_blend_read_data(BlendDataReader *reader, ID *id)
Definition: material.c:209
static void material_init_data(ID *id)
Definition: material.c:89

Definition at line 254 of file material.c.

◆ LOG

CLG_LogRef LOG = {"bke.material"}
static

Definition at line 87 of file material.c.

Referenced by BKE_object_material_get_p(), and BKE_object_material_slot_remove().

◆ matcopied

short matcopied = 0
static

◆ matcopybuf

Material matcopybuf
static

copy/paste buffer, if we had a proper py api that would be better

Note
matcopybuf.nodetree does NOT use ID's
Todo:
matcopybuf.nodetree's node->id's are NOT validated, this will crash!

Definition at line 1652 of file material.c.

Referenced by BKE_material_copybuf_clear(), BKE_material_copybuf_copy(), BKE_material_copybuf_free(), and BKE_material_copybuf_paste().