[Bf-blender-cvs] [62ca9bcd0a7] master: Cleanup: refactor default materials and shader nodes

Brecht Van Lommel noreply at git.blender.org
Thu Feb 6 13:38:42 CET 2020


Commit: 62ca9bcd0a7ff6fe52e359521369fc8b063d082a
Author: Brecht Van Lommel
Date:   Thu Feb 6 13:05:45 2020 +0100
Branches: master
https://developer.blender.org/rB62ca9bcd0a7ff6fe52e359521369fc8b063d082a

Cleanup: refactor default materials and shader nodes

===================================================================

M	source/blender/blenkernel/BKE_material.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/blenkernel/intern/material.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/editors/gpencil/drawgpencil.c
M	source/blender/editors/space_node/node_edit.c
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_material.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 0fd08dc3246..4bec0b1983e 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -35,10 +35,13 @@ struct Object;
 struct Scene;
 struct bNode;
 
-/* materials */
+/* Module */
 
 void BKE_materials_init(void);
 void BKE_materials_exit(void);
+
+/* Materials */
+
 void BKE_material_free(struct Material *ma);
 void BKE_object_materials_test(struct Main *bmain, struct Object *ob, struct ID *id);
 void BKE_objects_materials_test_all(struct Main *bmain, struct ID *id);
@@ -47,7 +50,6 @@ void BKE_material_resize_object(struct Main *bmain,
                                 const short totcol,
                                 bool do_id_user);
 void BKE_material_init(struct Material *ma);
-void BKE_material_gpencil_init(struct Material *ma);
 void BKE_material_remap_object(struct Object *ob, const unsigned int *remap);
 void BKE_material_remap_object_calc(struct Object *ob_dst,
                                     struct Object *ob_src,
@@ -97,7 +99,6 @@ bool BKE_object_material_slot_remove(struct Main *bmain, struct Object *ob);
 bool BKE_object_material_slot_used(struct ID *id, short actcol);
 
 struct Material *BKE_gpencil_material(struct Object *ob, short act);
-struct Material *BKE_gpencil_material_default(void);
 struct MaterialGPencilStyle *BKE_gpencil_material_settings(struct Object *ob, short act);
 
 void BKE_texpaint_slot_refresh_cache(struct Scene *scene, struct Material *ma);
@@ -122,15 +123,21 @@ void BKE_material_copybuf_free(void);
 void BKE_material_copybuf_copy(struct Main *bmain, struct Material *ma);
 void BKE_material_copybuf_paste(struct Main *bmain, struct Material *ma);
 
+/* Default Materials */
+
+struct Material *BKE_material_default_empty(void);
+struct Material *BKE_material_default_surface(void);
+struct Material *BKE_material_default_volume(void);
+struct Material *BKE_material_default_gpencil(void);
+
+void BKE_material_defaults_free_gpu(void);
+
 /* Dependency graph evaluation. */
 
 struct Depsgraph;
 
 void BKE_material_eval(struct Depsgraph *depsgraph, struct Material *material);
 
-extern struct Material defmaterial;
-extern struct Material defgpencil_material;
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index e7242ca11a4..db137d26005 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1233,7 +1233,7 @@ Material *BKE_gpencil_object_material_ensure_from_active_input_material(Object *
     return ma;
   }
 
-  return &defgpencil_material;
+  return BKE_material_default_gpencil();
 }
 
 /* Get active color, and add all default settings if we don't find anything */
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]);
+  }
+}
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 6da7621c6c7..c114ca57f05 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1430,12 +1430,12 @@ static void material_transparent(Material *ma,
   DRW_shgroup_state_enable(*shgrp, cur_state);
 }
 
-/* Return correct material or &defmaterial if slot is empty. */
+/* Return correct material or empty default material if slot is empty. */
 BLI_INLINE Material *eevee_object_material_get(Object *ob, int slot)
 {
   Material *ma = BKE_object_material_get(ob, slot + 1);
   if (ma == NULL) {
-    ma = &defmaterial;
+    ma = BKE_material_default_empty();
   }
   return ma;
 }
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 3fb2e1135e8..9fef1e4948b 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -430,7 +430,7 @@ static void gp_draw_stroke_fill(bGPdata *gpd,
   BLI_assert(gps->totpoints >= 3);
   const bool use_mat = (gpd->mat != NULL);
 
-  Material *ma = (use_mat) ? gpd->mat[gps->mat_nr] : BKE_gpencil_material_default();
+  Material *ma = (use_mat) ? gpd->mat[gps->mat_nr] : BKE_material_default_gpencil();
   MaterialGPencilStyle *gp_style = (ma) ? ma->gp_style : NULL;
 
   /* Calculate triangles cache for filling area (must be done only after changes) */
@@ -884,7 +884,7 @@ static void gp_draw_strokes(tGPDdraw *tgpw)
       continue;
     }
     /* check if the color is visible */
-    Material *ma = (use_mat) ? tgpw->gpd->mat[gps->mat_nr] : BKE_gpencil_material_default();
+    Ma

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list