[Bf-blender-cvs] [c5ed943479] clay-engine: Clay Material work.

Clément Foucault noreply at git.blender.org
Mon Jan 23 18:37:27 CET 2017


Commit: c5ed9434791ec01a65756cd182e15f8744b7e6f3
Author: Clément Foucault
Date:   Mon Jan 23 18:36:30 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBc5ed9434791ec01a65756cd182e15f8744b7e6f3

Clay Material work.

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

M	source/blender/blenkernel/intern/material.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl
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/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 54945242fe..ad53d03f43 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -111,6 +111,11 @@ void BKE_material_free(Material *ma)
 
 	BKE_icon_id_delete((ID *)ma);
 	BKE_previewimg_free(&ma->preview);
+
+	if (ma->clay.runtime) {
+		MEM_freeN(ma->clay.runtime);
+		ma->clay.runtime = NULL;
+	}
 }
 
 void BKE_material_init(Material *ma)
@@ -206,6 +211,17 @@ void BKE_material_init(Material *ma)
 	ma->mode2 = MA_CASTSHADOW;
 	ma->shade_flag = MA_APPROX_OCCLUSION;
 	ma->preview = NULL;
+
+	/* New engines */
+	ma->clay.matcap_rot = 0.0f;
+	ma->clay.matcap_hue = 0.5f;
+	ma->clay.matcap_sat = 0.5f;
+	ma->clay.matcap_val = 0.5f;
+	ma->clay.ssao_distance = 0.2;
+	ma->clay.ssao_attenuation = 1.0f;
+	ma->clay.ssao_factor_cavity = 1.0f;
+	ma->clay.ssao_factor_edge = 1.0f;
+	ma->clay.runtime = NULL;
 }
 
 Material *BKE_material_add(Main *bmain, const char *name)
@@ -247,6 +263,7 @@ Material *BKE_material_copy(Main *bmain, Material *ma)
 	BKE_previewimg_id_copy(&man->id, &ma->id);
 
 	BLI_listbase_clear(&man->gpumaterial);
+	man->clay.runtime = NULL;
 
 	BKE_id_copy_ensure_local(bmain, &ma->id, &man->id);
 
@@ -279,6 +296,7 @@ Material *localize_material(Material *ma)
 		man->nodetree = ntreeLocalize(ma->nodetree);
 	
 	BLI_listbase_clear(&man->gpumaterial);
+	man->clay.runtime = NULL;
 	
 	return man;
 }
@@ -1698,6 +1716,7 @@ void copy_matcopybuf(Material *ma)
 	matcopybuf.nodetree = ntreeCopyTree_ex(ma->nodetree, G.main, false);
 	matcopybuf.preview = NULL;
 	BLI_listbase_clear(&matcopybuf.gpumaterial);
+	matcopybuf.clay.runtime = NULL;
 	matcopied = 1;
 }
 
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index efaea4f9c3..36a8219579 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -560,8 +560,10 @@ void BKE_scene_free(Scene *sce)
 	sce->collection = NULL;
 
 	/* Runtime Engine Data */
-	if (sce->claydata.defsettings.runtime)
+	if (sce->claydata.defsettings.runtime) {
 		MEM_freeN(sce->claydata.defsettings.runtime);
+		sce->claydata.defsettings.runtime = NULL;
+	}
 }
 
 void BKE_scene_init(Scene *sce)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index e98e72295c..d0c5a7ad77 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3983,6 +3983,8 @@ static void direct_link_material(FileData *fd, Material *ma)
 	
 	ma->preview = direct_link_preview_image(fd, ma->preview);
 	BLI_listbase_clear(&ma->gpumaterial);
+
+	ma->clay.runtime = NULL;
 }
 
 /* ************ READ PARTICLE SETTINGS ***************** */
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 64340ebcdb..b9fc22bc77 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -177,5 +177,20 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 				settings->ssao_samples = 32;
 			}
 		}
+
+		if (!DNA_struct_elem_find(fd->filesdna, "Material", "MaterialSettingsClay", "clay")) {
+			for (Material *mat = main->mat.first; mat; mat = mat->id.next) {
+				MaterialSettingsClay *clay = &mat->clay;
+
+				clay->matcap_rot = 0.0f;
+				clay->matcap_hue = 0.5f;
+				clay->matcap_sat = 0.5f;
+				clay->matcap_val = 0.5f;
+				clay->ssao_distance = 0.2;
+				clay->ssao_attenuation = 1.0f;
+				clay->ssao_factor_cavity = 1.0f;
+				clay->ssao_factor_edge = 1.0f;
+			}
+		}
 	}
 }
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 14ef27fa55..459a413454 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -22,6 +22,7 @@
 #include "DRW_render.h"
 
 #include "BKE_icons.h"
+#include "BKE_main.h"
 
 #include "BLI_dynstr.h"
 #include "BLI_rand.h"
@@ -68,6 +69,7 @@ static struct CLAY_data {
 	/* Materials Parameter UBO */
 	struct GPUUniformBuffer *mat_ubo;
 	CLAY_UBO_Storage mat_storage;
+	short ubo_flag;
 
 	/* Matcap textures */
 	struct GPUTexture *matcap_array;
@@ -81,6 +83,10 @@ static struct CLAY_data {
 	struct GPUTexture *sampling_tx;
 } data = {NULL};
 
+/* CLAY_data.ubo_flag */
+#define CLAY_UBO_CLEAR     (1 << 0)
+#define CLAY_UBO_REFRESH   (1 << 1)
+
 /* keep it under MAX_BUFFERS */
 typedef struct CLAY_FramebufferList{
 	/* default */
@@ -306,7 +312,7 @@ static void CLAY_engine_init(void)
 	}
 }
 
-static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int matcap_id, float matcap_rot[2], float matcap_hsv[3], float ssao_params_var[4])
+static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
 {
 	const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
 
@@ -321,22 +327,7 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int matcap_id, float
 	DRW_shgroup_uniform_vec4(grp, "ssao_params", data.ssao_params, 1);
 	DRW_shgroup_uniform_vec3(grp, "matcaps_color", (float *)data.matcap_colors, 24);
 
-	mat->matcap_id = matcap_id;
-	copy_v3_v3(mat->matcap_hsv, matcap_hsv);
-	copy_v2_v2(mat->matcap_rot, matcap_rot);
-	copy_v4_v4(mat->ssao_params_var, ssao_params_var);
-
-	mat = &data.mat_storage.materials[1];
-	mat->matcap_id = matcap_id + 1;
-	copy_v3_v3(mat->matcap_hsv, matcap_hsv);
-	copy_v2_v2(mat->matcap_rot, matcap_rot);
-	copy_v4_v4(mat->ssao_params_var, ssao_params_var);
-
-	mat = &data.mat_storage.materials[2];
-	mat->matcap_id = matcap_id + 2;
-	copy_v3_v3(mat->matcap_hsv, matcap_hsv);
-	copy_v2_v2(mat->matcap_rot, matcap_rot);
-	copy_v4_v4(mat->ssao_params_var, ssao_params_var);
+	//DRW_shgroup_uniform_int(grp, "material_id", material_id, 1);
 
 #ifndef GTAO
 	DRW_shgroup_uniform_texture(grp, "ssao_jitter", data.jitter_tx, jitterloc);
@@ -346,36 +337,102 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int matcap_id, float
 	return grp;
 }
 
-static void CLAY_update_materials_runtime(MaterialSettingsClay *settings)
+static void CLAY_update_material_runtime(MaterialSettingsClay *settings)
 {
 	MaterialDataClayRuntime *runtime_data;
 
 	if (!settings->runtime) {
 		settings->runtime = MEM_mallocN(sizeof(MaterialDataClayRuntime), "MaterialDataClayRuntime");
+		settings->runtime->flag = CLAY_OUTDATED;
+		data.ubo_flag |= CLAY_UBO_CLEAR;
 	}
 
 	runtime_data = settings->runtime;
 
-	/* Update default material */
-	runtime_data->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
-	runtime_data->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
+	if (runtime_data->flag & CLAY_OUTDATED) {
 
-	runtime_data->matcap_hsv[0] = settings->matcap_hue + 0.5f;
-	runtime_data->matcap_hsv[1] = settings->matcap_sat * 2.0f;
-	runtime_data->matcap_hsv[2] = settings->matcap_val * 2.0f;
+		/* Update default material */
+		runtime_data->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
+		runtime_data->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
 
-	runtime_data->ssao_params_var[0] = settings->ssao_distance;
-	runtime_data->ssao_params_var[1] = settings->ssao_factor_cavity;
-	runtime_data->ssao_params_var[2] = settings->ssao_factor_edge;
-	runtime_data->ssao_params_var[3] = settings->ssao_attenuation;
+		runtime_data->matcap_hsv[0] = settings->matcap_hue + 0.5f;
+		runtime_data->matcap_hsv[1] = settings->matcap_sat * 2.0f;
+		runtime_data->matcap_hsv[2] = settings->matcap_val * 2.0f;
 
-	if (settings->matcap_icon < ICON_MATCAP_01 ||
-	    settings->matcap_icon > ICON_MATCAP_24)
-	{
-		settings->matcap_icon = ICON_MATCAP_01;
+		runtime_data->ssao_params_var[0] = settings->ssao_distance;
+		runtime_data->ssao_params_var[1] = settings->ssao_factor_cavity;
+		runtime_data->ssao_params_var[2] = settings->ssao_factor_edge;
+		runtime_data->ssao_params_var[3] = settings->ssao_attenuation;
+
+		if (settings->matcap_icon < ICON_MATCAP_01 ||
+		    settings->matcap_icon > ICON_MATCAP_24)
+		{
+			settings->matcap_icon = ICON_MATCAP_01;
+		}
+
+		runtime_data->matcap_id = matcap_to_index(settings->matcap_icon);
+
+		if ((runtime_data->type != settings->type)) {
+			data.ubo_flag |= CLAY_UBO_CLEAR;
+		}
+
+		runtime_data->type = settings->type;
+
+		data.ubo_flag |= CLAY_UBO_REFRESH;
+		runtime_data->flag &= ~CLAY_OUTDATED;
 	}
+}
+
+static void update_ubo_storage(MaterialDataClayRuntime *runtime_data, unsigned int current_id)
+{
+	CLAY_UBO_Material *ubo = &data.mat_storage.materials[current_id];
+
+	ubo->matcap_id = runtime_data->matcap_id;
+	copy_v3_v3(ubo->matcap_hsv, runtime_data->matcap_hsv);
+	copy_v2_v2(ubo->matcap_rot, runtime_data->matcap_rot);
+	copy_v4_v4(ubo->ssao_params_var, runtime_data->ssao_params_var);
 
-	runtime_data->matcap_id = matcap_to_index(settings->matcap_icon);
+	runtime_data->material_id = current_id;
+}
+
+static void CLAY_update_material_ubo(const struct bContext *C)
+{
+	Main *bmain = CTX_data_main(C);
+
+	/* Update Default materials */
+	for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
+		EngineDataClay *ed = &sce->claydata;
+		CLAY_update_material_runtime((MaterialSettingsClay *)&ed->defsettings);
+	}
+
+	/* Update Scene Materials */
+	for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) {
+		CLAY_update_material_runtime(&mat->clay);
+	}
+
+	if (data.ubo_flag & CLAY_UBO_REFRESH) {
+		MaterialDataClayRuntime *runtime_data;
+		int current_id = 0;
+
+		/* Default materials */
+		for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) {
+			EngineDataClay *ed = &sce->claydata;
+			runtime_data = ed->defsettings.runtime;
+			update_ubo_storage(runtime_data, current_id);
+			current_id++;
+		}
+
+		/* TODO only add materials linked to geometry */
+		for (Material *mat = bmain->mat.first; mat; mat = mat->id.next) {
+			runtime_data = mat->clay.runtime;
+			update_ubo_storage(runtime_data, current_id);
+			current_id++;
+		}
+
+		DRW_uniformbuffer_update(data.mat_ubo, &data.mat_storage);
+	}
+
+	data.ubo_flag = 0;
 }
 
 static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
@@ -398,13 +455,10 @@ static void CLAY_create_cache(CL

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list