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

Lukas Tönne noreply at git.blender.org
Sun Dec 10 11:24:15 CET 2017


Commit: e9a4bb925c2d670df7ebb59c22c18bc0826e756c
Author: Lukas Tönne
Date:   Sun Dec 10 10:24:03 2017 +0000
Branches: hair_guides
https://developer.blender.org/rBe9a4bb925c2d670df7ebb59c22c18bc0826e756c

Merge branch 'blender2.8' into hair_guides

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



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

diff --cc source/blender/draw/engines/eevee/eevee_materials.c
index 0fef4c3abc5,c25ab1e7859..e8e5d0bcac8
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@@ -1255,175 -1194,6 +1260,174 @@@ 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);
 +		}
 +	}
 +	
 +	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);
++					add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, 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_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);
 +
 +	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);
- 				
++				add_standard_uniforms(shgrp, sldata, vedata, NULL, NULL, false, 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, true, 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);
 +		
 +		DRW_hair_shader_uniforms(shgrp, scene,
 +		                         fiber_texture, fiber_buffer);
 +	}
 +}
 +
  void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob)
  {
  	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
diff --cc source/blender/editors/object/object_relations.c
index 4efb49e171c,95ccf56d409..c7cf2f3a68a
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@@ -1841,12 -1844,15 +1845,18 @@@ static void single_obdata_users(Main *b
  					case OB_SPEAKER:
  						ob->data = ID_NEW_SET(ob->data, BKE_speaker_copy(bmain, ob->data));
  						break;
 +					case OB_GROOM:
 +						ob->data = ID_NEW_SET(ob->data, BKE_groom_copy(bmain, ob->data));
 +						break;
+ 					case OB_LIGHTPROBE:
+ 						ob->data = ID_NEW_SET(ob->data, BKE_lightprobe_copy(bmain, ob->data));
+ 						break;
  					default:
- 						if (G.debug & G_DEBUG)
- 							printf("ERROR %s: can't copy %s\n", __func__, id->name);
+ 						printf("ERROR %s: can't copy %s\n", __func__, id->name);
+ 						BLI_assert(!"This should never happen.");
+ 
+ 						/* We need to end the FOREACH_OBJECT_FLAG iterator to prevent memory leak. */
+ 						BKE_scene_objects_iterator_end(&iter_macro);
  						return;
  				}



More information about the Bf-blender-cvs mailing list