[Bf-blender-cvs] [624f3c2] clay-engine: (Clay) Added Render settings: - Default clay settings inside Scene RNA - Material clay settings RNA is here and will be used once we can render multiple meshes

Clément Foucault noreply at git.blender.org
Thu Jan 5 11:30:24 CET 2017


Commit: 624f3c254f2b70fd78bbf7b562a7c6b156db78b8
Author: Clément Foucault
Date:   Thu Jan 5 10:48:22 2017 +0100
Branches: clay-engine
https://developer.blender.org/rB624f3c254f2b70fd78bbf7b562a7c6b156db78b8

(Clay) Added Render settings:
- Default clay settings inside Scene RNA
- Material clay settings RNA is here and will be used once we can render multiple meshes

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

M	release/scripts/startup/bl_ui/properties_material.py
M	release/scripts/startup/bl_ui/properties_render.py
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesdna/DNA_material_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_material.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index d916007..408db68 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -106,7 +106,7 @@ class MaterialButtonsPanel:
 class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel):
     bl_label = ""
     bl_options = {'HIDE_HEADER'}
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
 
     @classmethod
     def poll(cls, context):
@@ -1052,5 +1052,14 @@ class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, Panel):
     _context_path = "material"
     _property_type = bpy.types.Material
 
+
+class MATERIAL_PT_clay_settings(MaterialButtonsPanel, Panel):
+    bl_label = "Matcap"
+    COMPAT_ENGINES = {'BLENDER_CLAY'}
+
+    def draw(self, context):
+        settings = context.material.clay_settings
+        self.layout.template_icon_view(settings, "matcap_icon")
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 850606e..3a9c431 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -584,5 +584,14 @@ class RENDER_PT_bake(RenderButtonsPanel, Panel):
             sub.prop(rd, "bake_user_scale", text="User Scale")
 
 
+class RENDER_PT_clay(RenderButtonsPanel, Panel):
+    bl_label = "Default Clay"
+    COMPAT_ENGINES = {'BLENDER_CLAY'}
+
+    def draw(self, context):
+        settings = context.scene.clay_settings
+        self.layout.template_icon_view(settings, "matcap_icon")
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index d35b887..cfc2916 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -50,6 +50,7 @@ static struct CLAY_data {
 
 	/* Matcap textures */
 	struct GPUTexture *matcap_array;
+	int matcap_id;
 
 	/* Ssao */
 	float dfdyfac[2];
@@ -91,26 +92,85 @@ static void add_icon_to_rect(PreviewImage *prv, float *final_rect, int layer)
 	                           false, prv->w[0], prv->h[0], prv->w[0], prv->w[0]);
 }
 
+static void load_matcaps(PreviewImage *prv[24], int nbr)
+{
+	int w = prv[0]->w[0];
+	int h = prv[0]->h[0];
+	float *final_rect = MEM_callocN(sizeof(float) * 4 * w * h * nbr, "Clay Matcap array rect");
+
+	for (int i = 0; i < nbr; ++i) {
+		add_icon_to_rect(prv[i], final_rect, i);
+		BKE_previewimg_free(&prv[i]);
+	}
+
+	data.matcap_array = DRW_texture_create_2D_array(w, h, nbr, final_rect);
+
+	MEM_freeN(final_rect);
+}
+
+static int matcap_to_index(int matcap)
+{
+	if (matcap == ICON_MATCAP_02) return 1;
+	else if (matcap == ICON_MATCAP_03) return 2;
+	else if (matcap == ICON_MATCAP_04) return 3;
+	else if (matcap == ICON_MATCAP_05) return 4;
+	else if (matcap == ICON_MATCAP_06) return 5;
+	else if (matcap == ICON_MATCAP_07) return 6;
+	else if (matcap == ICON_MATCAP_08) return 7;
+	else if (matcap == ICON_MATCAP_09) return 8;
+	else if (matcap == ICON_MATCAP_10) return 9;
+	else if (matcap == ICON_MATCAP_11) return 10;
+	else if (matcap == ICON_MATCAP_12) return 11;
+	else if (matcap == ICON_MATCAP_13) return 12;
+	else if (matcap == ICON_MATCAP_14) return 13;
+	else if (matcap == ICON_MATCAP_15) return 14;
+	else if (matcap == ICON_MATCAP_16) return 15;
+	else if (matcap == ICON_MATCAP_17) return 16;
+	else if (matcap == ICON_MATCAP_18) return 17;
+	else if (matcap == ICON_MATCAP_19) return 18;
+	else if (matcap == ICON_MATCAP_20) return 19;
+	else if (matcap == ICON_MATCAP_21) return 20;
+	else if (matcap == ICON_MATCAP_22) return 21;
+	else if (matcap == ICON_MATCAP_23) return 22;
+	else if (matcap == ICON_MATCAP_24) return 23;
+	return 0;
+}
+
 static void clay_init_engine(void)
 {
 	DRWBatch *batch;
 
 	/* Create Texture Array */
 	{
-		PreviewImage *prv[2];
-		int layers = 2; /* For now only use the 24 internal matcaps */
-
-		prv[0] = UI_icon_to_preview(ICON_MATCAP_02);
-		float *final_rect = MEM_callocN(sizeof(float) * 4 * prv[0]->w[0] * prv[0]->h[0] * layers, "Clay Matcap array rect");
-		add_icon_to_rect(prv[0], final_rect, 0);
-
-		prv[1] = UI_icon_to_preview(ICON_MATCAP_03);
-		add_icon_to_rect(prv[1], final_rect, 1);
-
-		data.matcap_array = DRW_texture_create_2D_array(prv[1]->w[0], prv[1]->h[0], layers, final_rect);
-		MEM_freeN(final_rect);
-		BKE_previewimg_free(&prv[0]);
-		BKE_previewimg_free(&prv[1]);
+		PreviewImage *prv[24]; /* For now use all of the 24 internal matcaps */
+
+		/* TODO only load used matcaps */
+		prv[0]  = UI_icon_to_preview(ICON_MATCAP_01);
+		prv[1]  = UI_icon_to_preview(ICON_MATCAP_02);
+		prv[2]  = UI_icon_to_preview(ICON_MATCAP_03);
+		prv[3]  = UI_icon_to_preview(ICON_MATCAP_04);
+		prv[4]  = UI_icon_to_preview(ICON_MATCAP_05);
+		prv[5]  = UI_icon_to_preview(ICON_MATCAP_06);
+		prv[6]  = UI_icon_to_preview(ICON_MATCAP_07);
+		prv[7]  = UI_icon_to_preview(ICON_MATCAP_08);
+		prv[8]  = UI_icon_to_preview(ICON_MATCAP_09);
+		prv[9]  = UI_icon_to_preview(ICON_MATCAP_10);
+		prv[10] = UI_icon_to_preview(ICON_MATCAP_11);
+		prv[11] = UI_icon_to_preview(ICON_MATCAP_12);
+		prv[12] = UI_icon_to_preview(ICON_MATCAP_13);
+		prv[13] = UI_icon_to_preview(ICON_MATCAP_14);
+		prv[14] = UI_icon_to_preview(ICON_MATCAP_15);
+		prv[15] = UI_icon_to_preview(ICON_MATCAP_16);
+		prv[16] = UI_icon_to_preview(ICON_MATCAP_17);
+		prv[17] = UI_icon_to_preview(ICON_MATCAP_18);
+		prv[18] = UI_icon_to_preview(ICON_MATCAP_19);
+		prv[19] = UI_icon_to_preview(ICON_MATCAP_20);
+		prv[20] = UI_icon_to_preview(ICON_MATCAP_21);
+		prv[21] = UI_icon_to_preview(ICON_MATCAP_22);
+		prv[22] = UI_icon_to_preview(ICON_MATCAP_23);
+		prv[23] = UI_icon_to_preview(ICON_MATCAP_24);
+
+		load_matcaps(prv, 24);
 	}
 
 	/* Depth prepass */
@@ -130,6 +190,7 @@ static void clay_init_engine(void)
 	/* Shading pass */
 	{
 		int bindloc = 0;
+		data.matcap_id = 5;
 
 		data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, NULL);
 		data.clay_itf = DRW_interface_create(data.clay_sh);
@@ -137,6 +198,7 @@ static void clay_init_engine(void)
 		DRW_interface_uniform_ivec2(data.clay_sh, data.clay_itf, "screenres", DRW_viewport_size_get(), 1);
 		DRW_interface_uniform_buffer(data.clay_sh, data.clay_itf, "depthtex", SCENE_DEPTH, bindloc++);
 		DRW_interface_uniform_texture(data.clay_sh, data.clay_itf, "matcaps", data.matcap_array, bindloc++);
+		DRW_interface_uniform_int(data.clay_sh, data.clay_itf, "matcap_index", &data.matcap_id, 1);
 
 		/* SSAO */
 		DRW_interface_uniform_mat4(data.clay_sh, data.clay_itf, "WinMatrix", data.winmat);
@@ -241,6 +303,17 @@ static void clay_view_draw(RenderEngine *UNUSED(engine), const struct bContext *
 	if (!data.clay_sh)
 		clay_init_engine();
 
+	/* Settings */
+	EngineDataClay *engine_data = &CTX_data_scene(context)->claydata;
+
+	if (engine_data->matcap_icon < ICON_MATCAP_01 ||
+	    engine_data->matcap_icon > ICON_MATCAP_24)
+	{
+		engine_data->matcap_icon = ICON_MATCAP_01;
+	}
+
+	data.matcap_id = matcap_to_index(engine_data->matcap_icon);
+
 	/* TODO : tag to refresh by the deps graph */
 	/* ideally only refresh when objects are added/removed */
 	/* or render properties / materials change */
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index 7e684e6..ad65db52 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -3,6 +3,7 @@ uniform ivec2 screenres;
 uniform sampler2D depthtex;
 uniform sampler2DArray matcaps;
 uniform mat4 WinMatrix;
+uniform int matcap_index;
 
 /* store the view space vectors for the corners of the view frustum here.
  * It helps to quickly reconstruct view space vectors by using uv coordinates,
@@ -51,6 +52,6 @@ void main() {
 	vec3 position = get_view_space_from_depth(uvs, viewvecs[0].xyz, viewvecs[1].xyz, depth);
 	vec3 normal = calculate_view_space_normal(position);
 	// vec4 col = texture(matcaps, vec3(uvs, step(0.5, uvs.x)));
-	vec4 col = texture(matcaps, vec3(abs(normal.xy * .5 + 0.5), step(0.5, uvs.x)));
+	vec4 col = texture(matcaps, vec3(abs(normal.xy * .5 + 0.5), float(matcap_index)));
 	fragColor = col;
 }
\ No newline at end of file
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 407ba44..49a65cc 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -38,6 +38,7 @@
 
 #include "BLT_translation.h"
 
+#include "DNA_material_types.h"
 #include "DNA_scene_types.h"
 
 #include "MEM_guardedalloc.h"
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 4fdf61b..78c0497 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -237,7 +237,7 @@ void DRW_interface_uniform_mat4(struct GPUShader *shader, DRWInterface *interfac
 
 void DRW_get_dfdy_factors(float dfdyfac[2])
 {
-	GPU_get_dfdy_factors(dfdyfac);	
+	GPU_get_dfdy_factors(dfdyfac);
 }
 
 /* ****************************************** DRAW ******************************************/
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 0c500e3..e078eb8 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -90,6 +90,11 @@ typedef struct TexPaintSlot {
 	int pad;
 } TexPaintSlot;
 
+typedef struct EngineSettingsClay {
+	short matcap_icon; /* Icon ID */
+	short pad;
+} EngineSettingsClay;
+
 typedef struct Material {
 	ID id;
 	struct AnimData *adt;	/* animation data (must be immediately after id for utilities to use it) */ 
@@ -203,6 +208,10 @@ typedef struct Material {
 
 	struct TexPaintSlot *texpaintslot; /* cached slot for painting. Make sure to recalculate before use
 	                               

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list