[Bf-blender-cvs] [08b8b4465d5] hair_guides: Merge branch 'blender2.8' into hair_guides

Lukas Tönne noreply at git.blender.org
Sat Nov 25 12:17:22 CET 2017


Commit: 08b8b4465d55ca4f71cd392fa81a4ca858ed1d93
Author: Lukas Tönne
Date:   Sat Nov 25 11:17:08 2017 +0000
Branches: hair_guides
https://developer.blender.org/rB08b8b4465d55ca4f71cd392fa81a4ca858ed1d93

Merge branch 'blender2.8' into hair_guides

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



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

diff --cc source/blender/draw/engines/eevee/eevee_materials.c
index e32bcbc1710,77d57716852..57551703bc0
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@@ -39,8 -33,11 +34,13 @@@
  #include "BKE_paint.h"
  #include "BKE_pbvh.h"
  
+ #include "DNA_world_types.h"
+ #include "DNA_modifier_types.h"
+ #include "DNA_view3d_types.h"
++#include "DNA_hair_types.h"
+ 
  #include "GPU_material.h"
 +#include "GPU_texture.h"
  
  #include "eevee_engine.h"
  #include "eevee_lut.h"
@@@ -502,59 -487,48 +509,62 @@@ void EEVEE_update_util_texture(float of
  void EEVEE_materials_init(EEVEE_StorageList *stl)
  {
  	if (!e_data.frag_shader_lib) {
 -		char *frag_str = NULL;
 -
  		/* Shaders */
 -		DynStr *ds_frag = BLI_dynstr_new();
 -		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
 +		{
 +			DynStr *ds_frag = BLI_dynstr_new();
 +			BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
  		BLI_dynstr_append(ds_frag, datatoc_bsdf_sampling_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
  		BLI_dynstr_append(ds_frag, datatoc_raytrace_lib_glsl);
  		BLI_dynstr_append(ds_frag, datatoc_ssr_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
+ 		for (int i = 0; i < 7; ++i) {
+ 			/* Add one for each Closure */
  			BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+ 		}
  		BLI_dynstr_append(ds_frag, datatoc_volumetric_lib_glsl);
 -		e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
 -		BLI_dynstr_free(ds_frag);
 -
 -		ds_frag = BLI_dynstr_new();
 -		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
 +			e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
 +			BLI_dynstr_free(ds_frag);
 +		}
 +		
 +		{
 +			DynStr *ds_frag = BLI_dynstr_new();
 +			BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_ambient_occlusion_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
 +			BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
  		BLI_dynstr_append(ds_frag, datatoc_volumetric_lib_glsl);
 -		BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
 -		e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
 -		BLI_dynstr_free(ds_frag);
 +			BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
 +			e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
 +			BLI_dynstr_free(ds_frag);
 +		}
  
 -		ds_frag = BLI_dynstr_new();
 -		BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
 -		BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
 -		frag_str = BLI_dynstr_get_cstring(ds_frag);
 -		BLI_dynstr_free(ds_frag);
 +		char *hair_fiber_vert_str = NULL;
 +		{
 +			DynStr *ds_vert = BLI_dynstr_new();
 +			BLI_dynstr_append(ds_vert, datatoc_hair_lib_glsl);
 +			BLI_dynstr_append(ds_vert, datatoc_prepass_vert_glsl);
 +			hair_fiber_vert_str = BLI_dynstr_get_cstring(ds_vert);
 +			BLI_dynstr_free(ds_vert);
 +		}
 +
 +		char *frag_str = NULL;
 +		{
 +			DynStr *ds_frag = BLI_dynstr_new();
 +			BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
 +			BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
 +			frag_str = BLI_dynstr_get_cstring(ds_frag);
 +			BLI_dynstr_free(ds_frag);
 +		}
  
  		e_data.default_background = DRW_shader_create(
  		        datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl,
@@@ -818,8 -771,8 +830,8 @@@ struct GPUMaterial *EEVEE_material_hair
   * Create a default shading group inside the given pass.
   **/
  static struct DRWShadingGroup *EEVEE_default_shading_group_create(
-         EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, DRWPass *pass,
+         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWPass *pass,
 -        bool is_hair, bool is_flat_normal, bool use_blend, bool use_ssr, int shadow_method)
 +        bool is_hair, bool is_hair_fibers, bool is_flat_normal, bool use_blend, bool use_ssr, int shadow_method)
  {
  	static int ssr_id;
  	ssr_id = (use_ssr) ? 1 : -1;
@@@ -847,8 -799,8 +859,8 @@@
   * Create a default shading group inside the default pass without standard uniforms.
   **/
  static struct DRWShadingGroup *EEVEE_default_shading_group_get(
-         EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata,
+         EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata,
 -        bool is_hair, bool is_flat_normal, bool use_ssr, int shadow_method)
 +        bool is_hair, bool is_hair_fibers, bool is_flat_normal, bool use_ssr, int shadow_method)
  {
  	static int ssr_id;
  	ssr_id = (use_ssr) ? 1 : -1;
@@@ -1233,168 -1189,7 +1255,177 @@@ static void material_transparent
  	}
  }
  
- static void material_particle_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata,
-                                    Object *ob, ParticleSystem *psys, ModifierData *md)
++static void material_particle_hair(
++        EEVEE_Data *vedata,
++        EEVEE_ViewLayerData *sldata,
++        Object *ob,
++        ParticleSystem *psys,
++        ModifierData *md)
 +{
 +	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
 +	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
 +	const DRWContextState *draw_ctx = DRW_context_state_get();
 +	Scene *scene = draw_ctx->scene;
 +	GHash *material_hash = stl->g_data->hair_material_hash;
 +
 +	if (!psys_check_enabled(ob, psys, false)) {
 +		return;
 +	}
 +	
 +	ParticleSettings *part = psys->part;
 +	float mat[4][4];
 +	unit_m4(mat);
 +	
 +	bool use_hair = false;
 +	struct Gwn_Batch *hair_geom = NULL;
 +	{
 +		int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
 +		if (draw_as == PART_DRAW_PATH && (psys->pathcache || psys->childcache)) {
 +			use_hair = true;
 +			hair_geom = DRW_cache_particles_get_hair(psys, md);
 +		}
 +	}
 +	
 +	if (use_hair) {
 +		Material *ma = give_current_material(ob, part->omat);
 +		if (ma == NULL) {
 +			ma = &defmaterial;
 +		}
 +		
 +		DRW_shgroup_call_add(stl->g_data->depth_shgrp, hair_geom, mat);
 +		DRW_shgroup_call_add(stl->g_data->depth_shgrp_clip, hair_geom, mat);
 +		
 +		DRWShadingGroup *shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
 +		if (!shgrp) {
 +			float *color_p = &ma->r;
 +			float *metal_p = &ma->ray_mirror;
 +			float *spec_p = &ma->spec;
 +			float *rough_p = &ma->gloss_mir;
 +			
 +			if (ma->use_nodes && ma->nodetree) {
 +				struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, false, sldata->lamps->shadow_method);
 +				
 +				shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
 +				if (shgrp) {
 +					add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false);
 +					
 +					BLI_ghash_insert(material_hash, ma, shgrp);
 +				}
 +				else {
 +					/* Shader failed : pink color */
 +					static float col[3] = {1.0f, 0.0f, 1.0f};
 +					static float half = 0.5f;
 +					
 +					color_p = col;
 +					metal_p = spec_p = rough_p = ½
 +				}
 +			}
 +			
 +			/* Fallback to default shader */
 +			if (shgrp == NULL) {
 +				shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, false, stl->effects->use_ssr, sldata->lamps->shadow_method);
 +				DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1);
 +				DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1);
 +				DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1);
 +				DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1);
 +				
 +				BLI_ghash_insert(material_hash, ma, shgrp);
 +			}
 +		}
 +		
 +		if (shgrp) {
 +			DRW_shgroup_call_add(shgrp, hair_geom, mat);
 +		}
 +	}
 +}
 +
- static void material_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, Object *ob, HairSystem *hsys, DerivedMesh *scalp)
++static void material_hair(
++        EEVEE_Data *vedata,
++        EEVEE_ViewLayerData *sldata,
++        Object *ob,
++        HairSystem *hsys,
++        DerivedMesh *scalp)
 +{
 +	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
 +	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
 +	const DRWContextState *draw_ctx = DRW_context_state_get();
 +	Scene *scene = draw_ctx->scene;
 +	GHash *material_hash = stl->g_data->hair_material_hash;
 +	/* TODO */
 +	const int subdiv = 0;
 +	float mat[4][4];
 +	copy_m4_m4(mat, ob->obmat);
 +	
 +	const DRWHairFiberTextureBuffer *fiber_buffer = NULL;
 +	struct Gwn_Batch *hair_geom = DRW_cache_hair_get_fibers(hsys, scalp, subdiv, &fiber_buffer);
 +	
 +	if (!hsys->draw_texture_cache) {
 +		hsys->draw_texture_cache = DRW_texture_create_2D(fiber_buffer->width, fiber_buffer->height,
 +		                                                  DRW_TEX_RG_32, 0, fiber_buffer->data);
 +	}
 +	GPUTexture **fiber_texture = (GPUTexture **)(&hsys->draw_texture_cache);
 +
 +	// TODO
 +	Material *ma = NULL;/*give_current_material(ob, omat);*/
 +	if (ma == NULL) {
 +		ma = &defmaterial;
 +	}
 +	
 +	DRW_shgroup_call_add(stl->g_data->hair_fibers_depth_shgrp, hair_geom, mat);
 +	DRW_h

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list