[Bf-blender-cvs] [ed2e8f5] strand_gpu: Enum property for selecting among the available hair shader models.

Lukas Tönne noreply at git.blender.org
Sat Jul 9 14:42:35 CEST 2016


Commit: ed2e8f59a727504bd2d592cb5b61f194527fb057
Author: Lukas Tönne
Date:   Sat Jul 9 14:41:04 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rBed2e8f59a727504bd2d592cb5b61f194527fb057

Enum property for selecting among the available hair shader models.

Available choices are the "classic" particle shading (bogus, but useful
for comparison), Kajiya, and Marschner. The Marschner model is not yet
implemented.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_strands.h
M	source/blender/blenkernel/intern/strands.c
M	source/blender/editors/space_view3d/drawstrands.c
M	source/blender/gpu/GPU_strands.h
M	source/blender/gpu/intern/gpu_strands.c
M	source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 679e5b1..66d1918 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -892,6 +892,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.prop(md, "show_strands", text="Control Strands")
         col.prop(md, "show_fibers", text="Fibers")
         col.prop(md, "subdivisions")
+        
+        col.separator()
+
+        col.label("Shader Model:")
+        col.prop(md, "shader_model", text="")
 
     def SUBSURF(self, layout, ob, md):
         layout.row().prop(md, "subdivision_type", expand=True)
diff --git a/source/blender/blenkernel/BKE_strands.h b/source/blender/blenkernel/BKE_strands.h
index 680c576..eec1a6d 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -96,4 +96,8 @@ struct StrandData *BKE_strand_data_interpolate(struct StrandInfo *strands, unsig
 void BKE_strand_data_free(struct StrandData *data);
 #endif
 
+/* ------------------------------------------------------------------------- */
+
+void BKE_strands_invalidate_shader(struct Strands *strands);
+
 #endif
diff --git a/source/blender/blenkernel/intern/strands.c b/source/blender/blenkernel/intern/strands.c
index 7682f77..8cc8c78 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -531,3 +531,14 @@ void BKE_strand_data_free(StrandData *data)
 	}
 }
 #endif
+
+
+/* ------------------------------------------------------------------------- */
+
+void BKE_strands_invalidate_shader(Strands *strands)
+{
+	if (strands->gpu_shader) {
+		GPU_strand_shader_free(strands->gpu_shader);
+		strands->gpu_shader = NULL;
+	}
+}
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index 3889308..6e6a00f 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -67,6 +67,18 @@
 
 #include "view3d_intern.h"  // own include
 
+static GPUStrands_ShaderModel get_shader_model(int smd_shader_model)
+{
+	switch (smd_shader_model) {
+		case MOD_STRANDS_SHADER_CLASSIC_BLENDER: return GPU_STRAND_SHADER_CLASSIC_BLENDER;
+		case MOD_STRANDS_SHADER_KAJIYA: return GPU_STRAND_SHADER_KAJIYA;
+		case MOD_STRANDS_SHADER_MARSCHNER: return GPU_STRAND_SHADER_MARSCHNER;
+	}
+	
+	BLI_assert(false && "Unhandled shader model enum value!");
+	return 0;
+}
+
 void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
                   Object *ob, StrandsModifierData *smd)
 {
@@ -84,7 +96,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	if (smd->gpu_buffer == NULL)
 		smd->gpu_buffer = GPU_strands_buffer_create(&params);
 	GPUDrawStrands *buffer = smd->gpu_buffer;
-	GPUStrandsShader *shader = GPU_strand_shader_get(strands);
+	GPUStrandsShader *shader = GPU_strand_shader_get(strands, get_shader_model(smd->shader_model));
 	
 	if (show_controls) {
 		GPU_strands_setup_edges(buffer, &params);
@@ -448,7 +460,7 @@ void draw_strands_edit(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	if (smd->gpu_buffer == NULL)
 		smd->gpu_buffer = GPU_strands_buffer_create(&params);
 	GPUDrawStrands *buffer = smd->gpu_buffer;
-	GPUStrandsShader *shader = GPU_strand_shader_get(smd->strands);
+	GPUStrandsShader *shader = GPU_strand_shader_get(smd->strands, get_shader_model(smd->shader_model));
 	
 	if (show_controls) {
 		GPU_strands_setup_edges(buffer, &params);
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index 3ffc30c..6a19d17 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -42,7 +42,13 @@ struct Strands;
 
 typedef struct GPUStrandsShader GPUStrandsShader;
 
-GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands);
+typedef enum GPUStrands_ShaderModel {
+	GPU_STRAND_SHADER_CLASSIC_BLENDER,
+	GPU_STRAND_SHADER_KAJIYA,
+	GPU_STRAND_SHADER_MARSCHNER,
+} GPUStrands_ShaderModel;
+
+GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands, GPUStrands_ShaderModel shader_model);
 
 void GPU_strand_shader_free(struct GPUStrandsShader *gpu_shader);
 
diff --git a/source/blender/gpu/intern/gpu_strands.c b/source/blender/gpu/intern/gpu_strands.c
index 3dff377..9e59351 100644
--- a/source/blender/gpu/intern/gpu_strands.c
+++ b/source/blender/gpu/intern/gpu_strands.c
@@ -119,7 +119,7 @@ static char *codegen_fragment(void)
 #endif
 }
 
-GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
+GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands, GPUStrands_ShaderModel shader_model)
 {
 	if (strands->gpu_shader != NULL)
 		return strands->gpu_shader;
@@ -133,12 +133,34 @@ GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands)
 	
 	int flags = GPU_SHADER_FLAGS_NONE;
 	
+#define MAX_DEFINES 256
+	char defines[MAX_DEFINES];
+	char *defines_cur = defines;
+	*defines_cur = '\0';
+	
+	switch (shader_model) {
+		case GPU_STRAND_SHADER_CLASSIC_BLENDER:
+			defines_cur += BLI_snprintf(defines_cur, MAX_DEFINES - (defines_cur - defines),
+			                            "#define SHADING_CLASSIC_BLENDER\n");
+			break;
+		case GPU_STRAND_SHADER_KAJIYA:
+			defines_cur += BLI_snprintf(defines_cur, MAX_DEFINES - (defines_cur - defines),
+			                            "#define SHADING_KAJIYA\n");
+			break;
+		case GPU_STRAND_SHADER_MARSCHNER:
+			defines_cur += BLI_snprintf(defines_cur, MAX_DEFINES - (defines_cur - defines),
+			                            "#define SHADING_MARSCHNER\n");
+			break;
+	}
+	
+#undef MAX_DEFINES
+	
 	GPUShader *shader = GPU_shader_create_ex(
 	                        vertexcode,
 	                        fragmentcode,
 	                        geometrycode,
 	                        NULL,
-	                        NULL,
+	                        defines,
 	                        0,
 	                        0,
 	                        0,
diff --git a/source/blender/gpu/shaders/gpu_shader_strand_frag.glsl b/source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
index c568fca..25995f9 100644
--- a/source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
@@ -3,7 +3,7 @@
 /* Classic Blender particle hair with tangent as normal (just for comparison) */
 //#define SHADING_CLASSIC_BLENDER
 /* Kajiya-Kay model with a diffuse component and main specular highlights */
-#define SHADING_KAJIYA
+//#define SHADING_KAJIYA
 
 in vec3 fPosition;
 in vec3 fTangent;
@@ -22,8 +22,10 @@ void main()
 
 	/* view vector computation, depends on orthographics or perspective */
 	vec3 V = (gl_ProjectionMatrix[3][3] == 0.0) ? normalize(fPosition) : vec3(0.0, 0.0, -1.0);
+#ifdef SHADING_KAJIYA
 	float cosine_eye = dot(T, V);
 	float sine_eye = sqrt(1.0 - cosine_eye*cosine_eye);
+#endif
 
 	vec3 L_diffuse = vec3(0.0);
 	vec3 L_specular = vec3(0.0);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index fc373a8..6f78a75 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1553,6 +1553,9 @@ typedef struct StrandsModifierData {
 	int seed;
 	int subdiv;
 	
+	int shader_model;
+	int pad;
+	
 	struct Strands *strands;
 	
 	struct BMEditStrands *edit;			/* edit data (runtime) */
@@ -1566,4 +1569,10 @@ enum {
 	MOD_STRANDS_SHOW_FIBERS = (1 << 1),
 };
 
+enum {
+	MOD_STRANDS_SHADER_CLASSIC_BLENDER = 0,
+	MOD_STRANDS_SHADER_KAJIYA = 1,
+	MOD_STRANDS_SHADER_MARSCHNER = 2,
+};
+
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index aa7dc36..082ba74 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1152,6 +1152,15 @@ static void rna_StrandsModifier_num_fibers_set(PointerRNA *ptr, int value)
 	smd->num_fibers = value;
 }
 
+static void rna_StrandsModifier_shader_model_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	StrandsModifierData *smd = (StrandsModifierData *)ptr->data;
+	
+	BKE_strands_invalidate_shader(smd->strands);
+	
+	rna_Modifier_update(bmain, scene, ptr);
+}
+
 #else
 
 static PropertyRNA *rna_def_property_subdivision_common(StructRNA *srna, const char type[])
@@ -4678,6 +4687,13 @@ static void rna_def_modifier_strands(BlenderRNA *brna)
 	StructRNA *srna;
 	PropertyRNA *prop;
 
+	static EnumPropertyItem shader_model_items[] = {
+	    {MOD_STRANDS_SHADER_CLASSIC_BLENDER, "CLASSIC_BLENDER", 0, "Classic Blender", "Use fiber direction as normal (wrong, just for comparison)"},
+	    {MOD_STRANDS_SHADER_KAJIYA, "KAJIYA", 0, "Kajiya", "Main reflections on opaque fibers"},
+	    {MOD_STRANDS_SHADER_MARSCHNER, "MARSCHNER", 0, "Marschner", "Primary internal reflections on transparent colored fibers"},
+	    {0, NULL, 0, NULL, NULL}
+	};
+
 	srna = RNA_def_struct(brna, "StrandsModifier", "Modifier");
 	RNA_def_struct_ui_text(srna, "Strands Modifier", "Modifier modeling hair strands");
 	RNA_def_struct_sdna(srna, "StrandsModifierData");
@@ -4716,6 +4732,12 @@ static void rna_def_modifier_strands(BlenderRNA *brna)
 	RNA_def_property_boolean_default(prop, true);
 	RNA_def_property_ui_text(prop, "Show Fibers", "Show render fiber curves");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+	
+	prop = RNA_def_property(srna, "shader_model", PROP_ENUM, PROP_UNSIGNED);
+	RNA_def_property_enum_sdna(prop, NULL, "shader_model");
+	RNA_def_property_enum_items(prop, shader_model_items);
+	RNA_def_property_ui_text(prop, "Shader Model", "Model used for shading fibers in the viewport");
+	RNA_def_property_update(prop, 0, "rna_StrandsModifier_shader_model_update");
 }
 
 void RNA_def_modifier(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list