[Bf-blender-cvs] [78428043d60] hair_guides: Remove the guide_object pointer from HairSystem.

Lukas Tönne noreply at git.blender.org
Tue Nov 14 10:15:00 CET 2017


Commit: 78428043d60e945b984c2ed662c0ae9ff938c531
Author: Lukas Tönne
Date:   Tue Nov 14 09:12:24 2017 +0000
Branches: hair_guides
https://developer.blender.org/rB78428043d60e945b984c2ed662c0ae9ff938c531

Remove the guide_object pointer from HairSystem.

Scalp mesh now is passed explicitly to the hair API functions again.

The idea is that hair systems can be created in any object and use
another object as the scalp. Sharing the same hair pattern should be
implemented at a later time, pending a good design for assigning
follicles to specific hair systems.

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

M	source/blender/blenkernel/BKE_hair.h
M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/hair_draw.c
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/makesdna/DNA_hair_types.h
M	source/blender/modifiers/intern/MOD_hair.c

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

diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index 0fe0d138492..5ed15566673 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -40,9 +40,8 @@ struct HairFollicle;
 struct HairPattern;
 struct HairSystem;
 struct DerivedMesh;
-struct EvaluationContext;
 struct MeshSample;
-struct Scene;
+struct Object;
 
 /* Create a new hair system instance */
 struct HairSystem* BKE_hair_new(void);
@@ -58,13 +57,11 @@ void BKE_hair_set_guide_curve(struct HairSystem *hsys, int index, const struct M
 void BKE_hair_set_guide_vertex(struct HairSystem *hsys, int index, int flag, const float co[3]);
 void BKE_hair_guide_curves_end(struct HairSystem *hsys);
 
-struct DerivedMesh* BKE_hair_get_scalp(const struct HairSystem *hsys, struct Scene *scene, const struct EvaluationContext *eval_ctx);
-
 /* === Follicles === */
 
 void BKE_hair_generate_follicles(struct HairSystem* hsys, unsigned int seed);
 
-void BKE_hair_bind_follicles(struct HairSystem *hsys, struct Scene *scene);
+void BKE_hair_bind_follicles(struct HairSystem *hsys, struct DerivedMesh *scalp);
 
 /* === Draw Cache === */
 
@@ -75,9 +72,17 @@ void BKE_hair_batch_cache_dirty(struct HairSystem* hsys, int mode);
 void BKE_hair_batch_cache_free(struct HairSystem* hsys);
 
 int* BKE_hair_get_fiber_lengths(const struct HairSystem* hsys, int subdiv);
-void BKE_hair_get_texture_buffer_size(const struct HairSystem* hsys, int subdiv,
-                                              int *r_size, int *r_strand_map_start, int *r_strand_vertex_start, int *r_fiber_start);
-void BKE_hair_get_texture_buffer(const struct HairSystem* hsys, struct Scene *scene,
-                                 struct EvaluationContext *eval_ctx, int subdiv, void *texbuffer);
+void BKE_hair_get_texture_buffer_size(
+        const struct HairSystem* hsys,
+        int subdiv,
+        int *r_size,
+        int *r_strand_map_start,
+        int *r_strand_vertex_start,
+        int *r_fiber_start);
+void BKE_hair_get_texture_buffer(
+        const struct HairSystem* hsys,
+        struct DerivedMesh *scalp,
+        int subdiv,
+        void *texbuffer);
 
 #endif
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 522e7076ba4..ef45f4f3131 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -49,8 +49,6 @@
 #include "BKE_mesh_sample.h"
 #include "BKE_hair.h"
 
-#include "DEG_depsgraph.h"
-
 #include "BLT_translation.h"
 
 HairSystem* BKE_hair_new(void)
@@ -195,26 +193,6 @@ void BKE_hair_guide_curves_end(HairSystem *hsys)
 	}
 }
 
-DerivedMesh* BKE_hair_get_scalp(const HairSystem *hsys, struct Scene *scene, const struct EvaluationContext *eval_ctx)
-{
-	Object *ob = hsys->guide_object;
-	
-	if (ob)
-	{
-		if (eval_ctx)
-		{
-			CustomDataMask datamask = CD_MASK_BAREMESH;
-			return mesh_get_derived_final(eval_ctx, scene, ob, datamask);
-		}
-		else
-		{
-			return ob->derivedFinal;
-		}
-	}
-	
-	return NULL;
-}
-
 /* ================================= */
 
 BLI_INLINE void hair_fiber_verify_weights(HairFollicle *follicle)
@@ -301,17 +279,13 @@ static void hair_fiber_find_closest_strand(
 	hair_fiber_sort_weights(follicle);
 }
 
-void BKE_hair_bind_follicles(HairSystem *hsys, struct Scene *scene)
+void BKE_hair_bind_follicles(HairSystem *hsys, DerivedMesh *scalp)
 {
 	HairPattern *pattern = hsys->pattern;
 	const int num_strands = hsys->totcurves;
 	if (num_strands == 0 || !pattern)
 		return;
 	
-	EvaluationContext eval_ctx = {0};
-	DEG_evaluation_context_init(&eval_ctx, DAG_EVAL_VIEWPORT);
-	DerivedMesh *scalp = BKE_hair_get_scalp(hsys, scene, &eval_ctx);
-	
 	float (*strandloc)[3] = MEM_mallocN(sizeof(float) * 3 * num_strands, "strand locations");
 	{
 		for (int i = 0; i < num_strands; ++i) {
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 135b5ec2330..502ada81c49 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -286,13 +286,10 @@ void BKE_hair_get_texture_buffer_size(
 
 void BKE_hair_get_texture_buffer(
         const HairSystem *hsys,
-        struct Scene *scene,
-        struct EvaluationContext *eval_ctx,
+        DerivedMesh *scalp,
         int subdiv,
         void *buffer)
 {
-	DerivedMesh *scalp = BKE_hair_get_scalp(hsys, scene, eval_ctx);
-	
 	int size, strand_map_start, strand_vertex_start, fiber_start;
 	BKE_hair_get_texture_buffer_size(hsys, subdiv, &size, &strand_map_start, &strand_vertex_start, &fiber_start);
 	
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 8db1e00bd4f..6efee5ab1a1 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1287,7 +1287,7 @@ static void material_particle_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *ved
 	}
 }
 
-static void material_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, Object *ob, HairSystem *hsys)
+static void material_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, Object *ob, HairSystem *hsys, DerivedMesh *scalp)
 {
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
 	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
@@ -1300,7 +1300,7 @@ static void material_hair(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata, Obje
 	copy_m4_m4(mat, ob->obmat);
 	
 	const DRWHairFiberTextureBuffer *fiber_buffer = NULL;
-	struct Gwn_Batch *hair_geom = DRW_cache_hair_get_fibers(hsys, subdiv, &fiber_buffer);
+	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,
@@ -1523,7 +1523,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
 				}
 				else if (md->type == eModifierType_Hair) {
 					HairModifierData *hmd = (HairModifierData *)md;
-					material_hair(sldata, vedata, ob, hmd->hair_system);
+					material_hair(sldata, vedata, ob, hmd->hair_system, ob->derivedFinal);
 				}
 			}
 		}
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 8feb90958d3..739050fbaf1 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2579,8 +2579,8 @@ Gwn_Batch *DRW_cache_particles_get_prim(int type)
 
 /** \name Hair */
 
-Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, int subdiv,
+Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                      const struct DRWHairFiberTextureBuffer **r_buffer)
 {
-	return DRW_hair_batch_cache_get_fibers(hsys, subdiv, r_buffer);
+	return DRW_hair_batch_cache_get_fibers(hsys, scalp, subdiv, r_buffer);
 }
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index a47f4e4d626..5bd75df168b 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -161,7 +161,7 @@ struct Gwn_Batch *DRW_cache_particles_get_dots(struct ParticleSystem *psys);
 struct Gwn_Batch *DRW_cache_particles_get_prim(int type);
 
 /* Hair */
-struct Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, int subdiv,
+struct Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                             const struct DRWHairFiberTextureBuffer **r_buffer);
 
 #endif /* __DRAW_CACHE_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 17ebc725d24..ec7b4f541f4 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -114,7 +114,7 @@ struct Gwn_Batch *DRW_particles_batch_cache_get_hair(struct ParticleSystem *psys
 struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct ParticleSystem *psys);
 
 /* Hair */
-struct Gwn_Batch *DRW_hair_batch_cache_get_fibers(struct HairSystem *hsys, int subdiv,
+struct Gwn_Batch *DRW_hair_batch_cache_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                                   const struct DRWHairFiberTextureBuffer **r_buffer);
 
 #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 913bc8ca478..bf218bc58a8 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -259,12 +259,8 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 	TIMEIT_END(hair_batch_cache_ensure_fibers);
 }
 
-static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, int subdiv, HairBatchCache *cache)
+static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, struct DerivedMesh *scalp, int subdiv, HairBatchCache *cache)
 {
-	const DRWContextState *draw_ctx = DRW_context_state_get();
-	EvaluationContext eval_ctx = {0};
-	DEG_evaluation_context_init(&eval_ctx, DAG_EVAL_VIEWPORT);
-
 	DRWHairFiberTextureBuffer *buffer = &cache->texbuffer;
 	static const int elemsize = 8;
 	const int width = GPU_max_texture_size();
@@ -282,7 +278,7 @@ static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, int subdiv, Hair
 	const int height = size / width;
 	
 	buffer->data = MEM_mallocN(b_size, "hair fiber texture buffer");
-	BKE_hair_get_texture_buffer(hsys, draw_ctx->scene, &eval_ctx, subdiv, buffer->data);
+	BKE_hair_get_texture_buffer(hsys, scalp, subdiv, buffer->data);
 	
 	buffer->width = width;
 	buffer->height = height;
@@ -291,7 +287,7 @@ static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, int subdiv, Hair
 	buffer->fiber_start = b_fiber_start / elemsize;
 }
 
-Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairSystem *hsys, int subdiv,
+Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                            const DRWHairFiberTextureBuffer **r_buffer)
 {
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list