[Bf-blender-cvs] [0ac09ed0dae] hair_guides: Merge branch 'blender2.8' into hair_guides

Lukas Tönne noreply at git.blender.org
Sun May 13 11:20:22 CEST 2018


Commit: 0ac09ed0dae7e57c7eb559905c6b296a7259d067
Author: Lukas Tönne
Date:   Sun May 13 10:20:05 2018 +0100
Branches: hair_guides
https://developer.blender.org/rB0ac09ed0dae7e57c7eb559905c6b296a7259d067

Merge branch 'blender2.8' into hair_guides

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



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

diff --cc source/blender/blenkernel/CMakeLists.txt
index 2f261a6c95d,d5ce6f2f94d..257aec55bf3
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -146,7 -144,7 +147,8 @@@ set(SR
  	intern/mesh_mapping.c
  	intern/mesh_merge.c
  	intern/mesh_remap.c
+ 	intern/mesh_runtime.c
 +	intern/mesh_sample.c
  	intern/mesh_tangent.c
  	intern/mesh_validate.c
  	intern/modifier.c
diff --cc source/blender/draw/engines/eevee/eevee_materials.c
index c2d860eb624,304baff6672..e35f601f1f2
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@@ -1340,178 -1290,6 +1340,179 @@@ static void material_transparent
  	}
  }
  
 +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);
- 		}
++	int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
++	if (draw_as != PART_DRAW_PATH || (psys->pathcache == NULL && psys->childcache == NULL)) {
++		return;
 +	}
- 	
- 	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) {
++	struct Gwn_Batch *hair_geom = DRW_cache_particles_get_hair(psys, md);
++	DRWShadingGroup *shgrp = NULL;
++	Material *ma = give_current_material(ob, part->omat);
++
++	if (ma == NULL) {
++		ma = &defmaterial;
++	}
++
++	float *color_p = &ma->r;
++	float *metal_p = &ma->ray_mirror;
++	float *spec_p = &ma->spec;
++	float *rough_p = &ma->gloss_mir;
++
++	DRW_shgroup_call_add(stl->g_data->depth_shgrp, hair_geom, NULL);
++	DRW_shgroup_call_add(stl->g_data->depth_shgrp_clip, hair_geom, NULL);
++
++	shgrp = BLI_ghash_lookup(material_hash, (const void *)ma);
++
++	if (shgrp) {
++		DRW_shgroup_call_add(shgrp, hair_geom, NULL);
++	}
++	else {
++		if (ma->use_nodes && ma->nodetree) {
++			static float half = 0.5f;
++			static float error_col[3] = {1.0f, 0.0f, 1.0f};
++			static float compile_col[3] = {0.5f, 0.5f, 0.5f};
++			struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, sldata->lamps->shadow_method, false);
++
++			switch (GPU_material_status(gpumat)) {
++				case GPU_MAT_SUCCESS:
++				{
++					shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
 +					add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, false);
- 					
- 					BLI_ghash_insert(material_hash, ma, shgrp);
++					break;
 +				}
- 				else {
- 					/* Shader failed : pink color */
- 					static float col[3] = {1.0f, 0.0f, 1.0f};
- 					static float half = 0.5f;
- 					
- 					color_p = col;
++				case GPU_MAT_QUEUED:
++				{
++					sldata->probes->all_materials_updated = false;
++					color_p = compile_col;
 +					metal_p = spec_p = rough_p = ½
++					break;
 +				}
- 			}
- 			
- 			/* Fallback to default shader */
- 			if (shgrp == NULL) {
- 				bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
- 				shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, false, 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);
++				case GPU_MAT_FAILED:
++				default:
++					color_p = error_col;
++					metal_p = spec_p = rough_p = ½
++					break;
 +			}
 +		}
- 		
- 		if (shgrp) {
- 			DRW_shgroup_call_add(shgrp, hair_geom, mat);
++
++		/* Fallback to default shader */
++		if (shgrp == NULL) {
++			bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
++			shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, false, 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);
 +		}
++
++		DRW_shgroup_call_add(shgrp, hair_geom, NULL);
++		BLI_ghash_insert(material_hash, ma, shgrp);
 +	}
 +}
 +
 +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,
 +		                                                 GPU_RG32F, 0, fiber_buffer->data);
 +	}
 +	GPUTexture **fiber_texture = (GPUTexture **)(&hsys->draw_texture_cache);
 +
 +	Material *ma = give_current_material(ob, hsys->material_index);
 +	if (ma == NULL) {
 +		ma = &defmaterial;
 +	}
 +	
 +	DRW_shgroup_call_add(stl->g_data->hair_fibers_depth_shgrp, hair_geom, mat);
 +	DRW_hair_shader_uniforms(stl->g_data->hair_fibers_depth_shgrp, scene,
 +	                         fiber_texture, fiber_buffer);
 +	
 +	DRW_shgroup_call_add(stl->g_data->hair_fibers_depth_shgrp_clip, hair_geom, mat);
 +	DRW_hair_shader_uniforms(stl->g_data->hair_fibers_depth_shgrp_clip, scene,
 +	                         fiber_texture, fiber_buffer);
 +	
 +	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, sldata->lamps->shadow_method, true);
 +			
 +			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) {
 +			bool use_ssr = ((stl->effects->enabled_effects & EFFECT_SSR) != 0);
 +			shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, true, false, 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);
 +		
 +		DRW_hair_shader_uniforms(shgrp, scene,
 +		                         fiber_texture, fiber_buffer);
 +	}
 +}
 +
  void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, bool *cast_shadow)
  {
  	EEVEE_PassList *psl = vedata->psl;
@@@ -1694,15 -1472,84 +1695,15 @@@
  	}
  
  	if (ob->type == OB_MESH) {
- 		if (ob != draw_ctx->object_edit) {
+ 		if (DRW_check_particles_visible_within_active_context(ob)) {
 -			material_hash = stl->g_data->hair_material_hash;
  			for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
 -				if (md->type != eModifierType_ParticleSystem) {
 -					continue;
 -				}
 -				ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
 -				if (!psys_check_enabled(ob, psys, false)) {
 -					continue;
 -				}
 -				ParticleSettings *part = psys->part;
 -				int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
 -				if (draw_as != PART_DRAW_PATH || (psys->pathcache == NULL && psys->childcache == NULL)) {
 -					continue;
 -				}
 -				struct Gwn_Batch *hair_geom = DRW_cache_particles_get_hair(psys, md);
 -				DRWShadingGroup *shgrp = NULL;
 -				Material *ma = give_current_material(ob, part->omat);
 -
 -				if (ma == NULL) {
 -					ma = &defmaterial;
 -				}
 -
 -				float *color_p = &ma->r;
 -				float *metal_p = &ma->ray_mirror;
 -				float *spec_p = &ma->spec;
 -				float *rough_p = &ma->gloss_mir;
 -


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list