[Bf-blender-cvs] [fe5b74c36cb] hair_guides hair_guides_grooming: Only pass export cache to lower level draw functions, do export on higher levels.

Lukas Tönne noreply at git.blender.org
Thu May 24 11:33:43 CEST 2018


Commit: fe5b74c36cb2ed7105143a20557e1ffea3f1fb5e
Author: Lukas Tönne
Date:   Thu May 24 10:24:10 2018 +0100
Branches: hair_guides hair_guides_grooming
https://developer.blender.org/rBfe5b74c36cb2ed7105143a20557e1ffea3f1fb5e

Only pass export cache to lower level draw functions, do export on higher levels.

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_hair.c
M	source/blender/draw/intern/draw_hair.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index e4c93d50fe2..734624329da 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -32,6 +32,7 @@
 #include "BLI_string_utils.h"
 
 #include "BKE_DerivedMesh.h"
+#include "BKE_hair.h"
 #include "BKE_particle.h"
 #include "BKE_paint.h"
 #include "BKE_pbvh.h"
@@ -1445,8 +1446,13 @@ static void material_hair(
 	float mat[4][4];
 	copy_m4_m4(mat, ob->obmat);
 	
+	HairExportCache *hair_export = BKE_hair_export_cache_new();
+	BKE_hair_export_cache_update(hair_export, hsys, subdiv, scalp, HAIR_EXPORT_ALL);
+	
 	const DRWHairFiberTextureBuffer *fiber_buffer = NULL;
-	struct Gwn_Batch *hair_geom = DRW_cache_hair_get_fibers(hsys, scalp, subdiv, &fiber_buffer);
+	struct Gwn_Batch *hair_geom = DRW_cache_hair_get_fibers(hsys, hair_export, &fiber_buffer);
+	
+	BKE_hair_export_cache_free(hair_export);
 	
 	if (!hsys->draw_texture_cache) {
 		hsys->draw_texture_cache = DRW_texture_create_2D(fiber_buffer->width, fiber_buffer->height,
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 3659ba49743..7e85d0ba547 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2985,25 +2985,20 @@ Gwn_Batch *DRW_cache_particles_get_prim(int type)
 
 /** \name Hair */
 
-Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
+Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, const struct HairExportCache *hair_export,
                                      const struct DRWHairFiberTextureBuffer **r_buffer)
 {
-	return DRW_hair_batch_cache_get_fibers(hsys, scalp, subdiv, r_buffer);
+	return DRW_hair_batch_cache_get_fibers(hsys, hair_export, r_buffer);
 }
 
-Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp)
+Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, const struct HairExportCache *hair_export)
 {
-	return DRW_hair_batch_cache_get_follicle_points(hsys, scalp);
+	return DRW_hair_batch_cache_get_follicle_points(hsys, hair_export);
 }
 
-Gwn_Batch *DRW_cache_hair_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv)
+Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, const struct HairExportCache *hair_export)
 {
-	return DRW_hair_batch_cache_get_guide_curve_points(hsys, scalp, subdiv);
-}
-
-Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv)
-{
-	return DRW_hair_batch_cache_get_guide_curve_edges(hsys, scalp, subdiv);
+	return DRW_hair_batch_cache_get_guide_curve_edges(hsys, hair_export);
 }
 
 /* 3D cursor */
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index dcec0bed151..025a5d06bf1 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -32,8 +32,8 @@ struct ModifierData;
 struct Object;
 struct PTCacheEdit;
 struct HairSystem;
+struct HairExportCache;
 struct DRWHairFiberTextureBuffer;
-struct DerivedMesh;
 
 void DRW_shape_cache_free(void);
 
@@ -177,11 +177,10 @@ struct Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct Object *object,
 struct Gwn_Batch *DRW_cache_particles_get_prim(int type);
 
 /* Hair */
-struct Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
+struct Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, const struct HairExportCache *hair_export,
                                             const struct DRWHairFiberTextureBuffer **r_buffer);
-struct Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp);
-struct Gwn_Batch *DRW_cache_hair_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
-struct Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
+struct Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, const struct HairExportCache *hair_export);
+struct Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, const struct HairExportCache *hair_export);
 
 /* Metaball */
 struct Gwn_Batch *DRW_cache_mball_surface_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 8566c78a7d8..e6eb3542792 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -36,8 +36,8 @@ struct ModifierData;
 struct ParticleSystem;
 struct PTCacheEdit;
 struct HairSystem;
+struct HairExportCache;
 struct DRWHairFiberTextureBuffer;
-struct DerivedMesh;
 
 struct Curve;
 struct Lattice;
@@ -137,10 +137,9 @@ struct Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(struct Object
 struct Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(struct Object *object, struct ParticleSystem *psys, struct PTCacheEdit *edit);
 
 /* Hair */
-struct Gwn_Batch *DRW_hair_batch_cache_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
+struct Gwn_Batch *DRW_hair_batch_cache_get_fibers(struct HairSystem *hsys, const struct HairExportCache *hair_export,
                                                   const struct DRWHairFiberTextureBuffer **r_buffer);
-struct Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp);
-struct Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
-struct Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
+struct Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(struct HairSystem *hsys, const struct HairExportCache *hair_export);
+struct Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_edges(struct HairSystem *hsys, const struct HairExportCache *hair_export);
 
 #endif /* __DRAW_CACHE_IMPL_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index 531f8bf40b1..58ac4d8b4f4 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -298,17 +298,13 @@ static void hair_batch_cache_ensure_fiber_texbuffer(const HairExportCache *hair_
 
 Gwn_Batch *DRW_hair_batch_cache_get_fibers(
         HairSystem *hsys,
-        struct DerivedMesh *scalp,
-        int subdiv,
+        const HairExportCache *hair_export,
         const DRWHairFiberTextureBuffer **r_buffer)
 {
 	HairBatchCache *cache = hair_batch_cache_get(hsys);
 
 	TIMEIT_START(DRW_hair_batch_cache_get_fibers);
 
-	HairExportCache *hair_export = BKE_hair_export_cache_new();
-	BKE_hair_export_cache_update(hair_export, hsys, subdiv, scalp, HAIR_EXPORT_ALL);
-
 	if (cache->fibers == NULL) {
 		TIMEIT_BENCH(hair_batch_cache_ensure_fibers(hair_export, cache),
 		             hair_batch_cache_ensure_fibers);
@@ -324,23 +320,20 @@ Gwn_Batch *DRW_hair_batch_cache_get_fibers(
 		*r_buffer = &cache->texbuffer;
 	}
 
-	BKE_hair_export_cache_free(hair_export);
-
 	TIMEIT_END(DRW_hair_batch_cache_get_fibers);
 
 	return cache->fibers;
 }
 
 static void hair_batch_cache_ensure_follicles(
-        HairSystem *hsys,
-        struct DerivedMesh *scalp,
+        const HairExportCache *hair_export,
         eHairDrawFollicleMode mode,
         HairBatchCache *cache)
 {
 	GWN_VERTBUF_DISCARD_SAFE(cache->follicle_verts);
 	GWN_INDEXBUF_DISCARD_SAFE(cache->follicle_edges);
 	
-	const HairPattern *pattern = hsys->pattern;
+	const unsigned int point_count = hair_export->totfibercurves;
 	
 	static Gwn_VertFormat format = { 0 };
 	static unsigned pos_id;
@@ -352,49 +345,88 @@ static void hair_batch_cache_ensure_follicles(
 	
 	cache->follicle_verts = GWN_vertbuf_create_with_format(&format);
 	
-	GWN_vertbuf_data_alloc(cache->follicle_verts, pattern->num_follicles);
+	GWN_vertbuf_data_alloc(cache->follicle_verts, point_count);
 	
-	HairFollicle *follicle = pattern->follicles;
-	for (int i = 0; i < pattern->num_follicles; ++i, ++follicle) {
-		float co[3], nor[3], tang[3];
-		BKE_mesh_sample_eval_DM(scalp, &follicle->mesh_sample, co, nor, tang);
-		
-		GWN_vertbuf_attr_set(cache->follicle_verts, pos_id, (unsigned int)i, co);
+	float (*root_co)[3] = hair_export->fiber_root_position;
+	for (int i = 0; i < hair_export->totfibercurves; ++i, ++root_co) {
+		GWN_vertbuf_attr_set(cache->follicle_verts, pos_id, (unsigned int)i, *root_co);
 	}
 	
 	UNUSED_VARS(mode);
 }
 
-Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(
-        HairSystem *hsys,
-        struct DerivedMesh *scalp)
+Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(HairSystem *hsys, const HairExportCache *hair_export)
 {
 	HairBatchCache *cache = hair_batch_cache_get(hsys);
 
 	if (cache->follicles == NULL) {
-		hair_batch_cache_ensure_follicles(hsys, scalp, HAIR_DRAW_FOLLICLE_POINTS, cache);
+		hair_batch_cache_ensure_follicles(hair_export, HAIR_DRAW_FOLLICLE_POINTS, cache);
 		
 		cache->follicles = GWN_batch_create(GWN_PRIM_POINTS, cache->follicle_verts, NULL);
 	}
 
 	return cache->follicles;
-	
 }
 
-Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_points(
-        HairSystem *hsys,
-        struct DerivedMesh *scalp,
-        int subdiv)
+static void hair_batch_cache_ensure_guide_curves(
+        const HairExportCache *hair_export,
+        eHairDrawGuideMode mode,
+        HairBatchCache *cache)
 {
-	UNUSED_VARS(hsys, scalp, subdiv);
-	return NULL;
+	GWN_VERTBUF_DISCARD_SAFE(cache->guide_curve_verts);
+	GWN_INDEXBUF_DISCARD_SAFE(cache->guide_curve_edges);
+	
+	const unsigned int point_count = hair_export->totguideverts;
+	const unsigned int elems_count = hair_export->totguideverts - hair_export->totguidecurves;
+	
+	static Gwn_VertFormat format = { 0 };
+	static unsigned pos_id;
+	
+	/* initialize vertex format */
+	if (format.attrib_ct == 0) {
+		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+	}
+	
+	cache

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list