From 62ca9bcd0a7ff6fe52e359521369fc8b063d082a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 6 Feb 2020 13:05:45 +0100 Subject: Cleanup: refactor default materials and shader nodes --- source/blender/blenkernel/intern/material.c | 156 ++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 33 deletions(-) (limited to 'source/blender/blenkernel/intern/material.c') diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 8159cc03414..84b3ea27025 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -70,25 +70,10 @@ #include "GPU_material.h" -/* used in UI and render */ -Material defmaterial; -Material defgpencil_material; +#include "NOD_shader.h" static CLG_LogRef LOG = {"bke.material"}; -/* called on startup, creator.c */ -void BKE_materials_init(void) -{ - BKE_material_init(&defmaterial); - BKE_material_gpencil_init(&defgpencil_material); -} - -/* Free the GPencil data of the default material, creator.c */ -void BKE_materials_exit(void) -{ - MEM_SAFE_FREE(defgpencil_material.gp_style); -} - /** Free (or release) any data used by this material (does not free the material itself). */ void BKE_material_free(Material *ma) { @@ -140,16 +125,6 @@ void BKE_material_init(Material *ma) MEMCPY_STRUCT_AFTER(ma, DNA_struct_default_get(Material), id); } -void BKE_material_gpencil_init(Material *ma) -{ - BKE_material_init(ma); - - /* grease pencil settings */ - strcpy(ma->id.name, "MADefault GPencil"); - BKE_gpencil_material_attr_init(ma); - add_v3_fl(&ma->gp_style->stroke_rgba[0], 0.6f); -} - Material *BKE_material_add(Main *bmain, const char *name) { Material *ma; @@ -594,15 +569,10 @@ Material *BKE_gpencil_material(Object *ob, short act) return ma; } else { - return &defgpencil_material; + return BKE_material_default_gpencil(); } } -struct Material *BKE_gpencil_material_default(void) -{ - return &defgpencil_material; -} - MaterialGPencilStyle *BKE_gpencil_material_settings(Object *ob, short act) { Material *ma = BKE_object_material_get(ob, act); @@ -614,7 +584,7 @@ MaterialGPencilStyle *BKE_gpencil_material_settings(Object *ob, short act) return ma->gp_style; } else { - return defgpencil_material.gp_style; + return BKE_material_default_gpencil()->gp_style; } } @@ -1610,3 +1580,123 @@ void BKE_material_eval(struct Depsgraph *depsgraph, Material *material) DEG_debug_print_eval(depsgraph, __func__, material->id.name, material); GPU_material_free(&material->gpumaterial); } + +/* Default Materials + * + * Used for rendering when objects have no materials assigned, and initializing + * default shader nodes. */ + +static Material default_material_empty; +static Material default_material_surface; +static Material default_material_volume; +static Material default_material_gpencil; + +static Material *default_materials[] = {&default_material_empty, + &default_material_surface, + &default_material_volume, + &default_material_gpencil, + NULL}; + +static void material_default_gpencil_init(Material *ma) +{ + strcpy(ma->id.name, "MADefault GPencil"); + BKE_gpencil_material_attr_init(ma); + add_v3_fl(&ma->gp_style->stroke_rgba[0], 0.6f); +} + +static void material_default_surface_init(Material *ma) +{ + bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); + ma->nodetree = ntree; + + bNode *principled = nodeAddStaticNode(NULL, ntree, SH_NODE_BSDF_PRINCIPLED); + bNodeSocket *base_color = nodeFindSocket(principled, SOCK_IN, "Base Color"); + copy_v3_v3(((bNodeSocketValueRGBA *)base_color->default_value)->value, &ma->r); + + bNode *output = nodeAddStaticNode(NULL, ntree, SH_NODE_OUTPUT_MATERIAL); + + nodeAddLink(ntree, + principled, + nodeFindSocket(principled, SOCK_OUT, "BSDF"), + output, + nodeFindSocket(output, SOCK_IN, "Surface")); + + principled->locx = 10.0f; + principled->locy = 300.0f; + output->locx = 300.0f; + output->locy = 300.0f; + + nodeSetActive(ntree, output); +} + +static void material_default_volume_init(Material *ma) +{ + bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); + ma->nodetree = ntree; + + bNode *principled = nodeAddStaticNode(NULL, ntree, SH_NODE_VOLUME_PRINCIPLED); + bNode *output = nodeAddStaticNode(NULL, ntree, SH_NODE_OUTPUT_MATERIAL); + + nodeAddLink(ntree, + principled, + nodeFindSocket(principled, SOCK_OUT, "Volume"), + output, + nodeFindSocket(output, SOCK_IN, "Volume")); + + principled->locx = 10.0f; + principled->locy = 300.0f; + output->locx = 300.0f; + output->locy = 300.0f; + + nodeSetActive(ntree, output); +} + +Material *BKE_material_default_empty(void) +{ + return &default_material_empty; +} + +Material *BKE_material_default_surface(void) +{ + return &default_material_surface; +} + +Material *BKE_material_default_volume(void) +{ + return &default_material_volume; +} + +Material *BKE_material_default_gpencil(void) +{ + return &default_material_gpencil; +} + +void BKE_material_defaults_free_gpu(void) +{ + for (int i = 0; default_materials[i]; i++) { + Material *ma = default_materials[i]; + if (ma->gpumaterial.first) { + GPU_material_free(&ma->gpumaterial); + } + } +} + +/* Module functions called on startup and exit. */ + +void BKE_materials_init(void) +{ + for (int i = 0; default_materials[i]; i++) { + BKE_material_init(default_materials[i]); + } + + material_default_surface_init(&default_material_surface); + material_default_volume_init(&default_material_volume); + material_default_gpencil_init(&default_material_gpencil); +} + +void BKE_materials_exit(void) +{ + for (int i = 0; default_materials[i]; i++) { + BKE_material_free(default_materials[i]); + } +} -- cgit v1.2.3