[Bf-blender-cvs] [e3ae01d83a1] hair_object: Reenable the hair test operator using customdata.

Lukas Tönne noreply at git.blender.org
Sun Nov 25 14:21:22 CET 2018


Commit: e3ae01d83a1b8d958f18e59d5bdb63e4962bc76e
Author: Lukas Tönne
Date:   Sun Nov 25 13:20:58 2018 +0000
Branches: hair_object
https://developer.blender.org/rBe3ae01d83a1b8d958f18e59d5bdb63e4962bc76e

Reenable the hair test operator using customdata.

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

M	source/blender/editors/hair/edithair_test.c

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

diff --git a/source/blender/editors/hair/edithair_test.c b/source/blender/editors/hair/edithair_test.c
index 9083abd590c..89a52408de4 100644
--- a/source/blender/editors/hair/edithair_test.c
+++ b/source/blender/editors/hair/edithair_test.c
@@ -39,6 +39,7 @@
 #include "DNA_scene_types.h"
 
 #include "BKE_context.h"
+#include "BKE_customdata.h"
 #include "BKE_hair.h"
 #include "BKE_mesh_sample.h"
 
@@ -60,57 +61,6 @@
 
 #include "hair_intern.h"  /* own include */
 
-/* -------------------------------------------------------------------- */
-/** \name Add test hair
- * Test operator for quickly adding hair
- * \{ */
-
-// TODO this was based on directly creating vertex/curve buffers in hair data, now using CustomData layers */
-#if 0
-/* Distribute hair follicles on a scalp mesh.
- * Optional per-loop weights control follicle density on the scalp.
- */
-static void hair_generate_follicles_ex(
-        HairCurveData *curve_data,
-        struct Mesh *scalp,
-        unsigned int seed,
-        int count,
-        const float *loop_weights)
-{
-	// Limit max_count to theoretical limit based on area
-	float scalp_area = BKE_hair_calc_surface_area(scalp);
-	float density = BKE_hair_calc_density_from_count(scalp_area, count);
-	float min_distance = BKE_hair_calc_min_distance_from_density(density);
-
-	if (curve_data->follicles)
-	{
-		MEM_freeN(curve_data->follicles);
-	}
-	curve_data->follicles = MEM_callocN(sizeof(HairFollicle) * count, "hair follicles");
-
-	{
-		MeshSampleGenerator *gen = BKE_mesh_sample_gen_surface_poissondisk(seed, min_distance, count, loop_weights);
-
-		BKE_mesh_sample_generator_bind(gen, scalp);
-
-		static const bool use_threads = false;
-		curve_data->totfollicles = BKE_mesh_sample_generate_batch_ex(
-		            gen,
-		            &curve_data->follicles->mesh_sample,
-		            sizeof(HairFollicle),
-		            count,
-		            use_threads);
-
-		BKE_mesh_sample_free_generator(gen);
-	}
-
-	for (int i = 0; i < curve_data->totfollicles; ++i) {
-		HairFollicle *follicle = &curve_data->follicles[i];
-
-		follicle->curve = HAIR_CURVE_INDEX_NONE;
-	}
-}
-
 typedef struct HairCurveBuilder
 {
 	/* Maximum number of curves in the buffer */
@@ -169,18 +119,20 @@ static void BKE_hair_curve_builder_add_vertex(HairCurveBuilder *hcb, const float
 
 static void BKE_hair_curve_builder_apply(HairCurveBuilder *hcb, HairCurveData *curve_data)
 {
-	curve_data->totcurves = hcb->totcurves;
-	curve_data->totverts = hcb->totverts;
-	curve_data->curves = MEM_reallocN(hcb->curves, sizeof(*hcb->curves) * hcb->totcurves);
-	curve_data->verts = MEM_reallocN(hcb->verts, sizeof(*hcb->verts) * hcb->totverts);
-
+	/* Compute vertstart indices */
 	int vertstart = 0;
-	HairFiberCurve *curve = curve_data->curves;
+	HairFiberCurve *curve = hcb->curves;
 	for (int i = 0; i < hcb->totcurves; ++i, ++curve) {
 		curve->vertstart = vertstart;
 		vertstart += curve->numverts;
 	}
 
+	curve_data->totcurves = hcb->totcurves;
+	curve_data->totverts = hcb->totverts;
+	CustomData_add_layer(&curve_data->vdata, CD_HAIRVERT, CD_ASSIGN, hcb->verts, hcb->totverts);
+	CustomData_add_layer(&curve_data->cdata, CD_HAIRCURVE, CD_ASSIGN, hcb->curves, hcb->totcurves);
+
+	/* Data owned by HairCurveData now */
 	hcb->maxcurves = 0;
 	hcb->maxverts = 0;
 	hcb->curves = NULL;
@@ -199,6 +151,55 @@ static void BKE_hair_curve_builder_discard(HairCurveBuilder *hcb)
 	hcb->totverts = 0;
 }
 
+/* -------------------------------------------------------------------- */
+/** \name Add test hair
+ * Test operator for quickly adding hair
+ * \{ */
+
+/* Distribute hair follicles on a scalp mesh.
+ * Optional per-loop weights control follicle density on the scalp.
+ */
+static void hair_generate_follicles_ex(
+        HairCurveData *curve_data,
+        struct Mesh *scalp,
+        unsigned int seed,
+        int count,
+        const float *loop_weights)
+{
+	// Limit max_count to theoretical limit based on area
+	float scalp_area = BKE_hair_calc_surface_area(scalp);
+	float density = BKE_hair_calc_density_from_count(scalp_area, count);
+	float min_distance = BKE_hair_calc_min_distance_from_density(density);
+
+	HairFollicle *follicles = MEM_callocN(sizeof(HairFollicle) * count, "hair follicles");
+	int totfollicles = 0;
+
+	{
+		MeshSampleGenerator *gen = BKE_mesh_sample_gen_surface_poissondisk(seed, min_distance, count, loop_weights);
+
+		BKE_mesh_sample_generator_bind(gen, scalp);
+
+		static const bool use_threads = false;
+		totfollicles = BKE_mesh_sample_generate_batch_ex(
+		            gen,
+		            &follicles->mesh_sample,
+		            sizeof(HairFollicle),
+		            count,
+		            use_threads);
+
+		BKE_mesh_sample_free_generator(gen);
+	}
+
+	for (int i = 0; i < totfollicles; ++i) {
+		HairFollicle *follicle = &follicles[i];
+
+		follicle->curve = HAIR_CURVE_INDEX_NONE;
+	}
+
+	curve_data->totfollicles = totfollicles;
+	CustomData_add_layer(&curve_data->fdata, CD_HAIRFOLLICLE, CD_ASSIGN, follicles, totfollicles);
+}
+
 /* Generate a simple hair curve for each follicle */
 static void hair_generate_curves(
 	HairCurveData *curve_data,
@@ -213,8 +214,9 @@ static void hair_generate_curves(
 	HairCurveBuilder hcb;
 	BKE_hair_curve_builder_init(&hcb, totcurves, totverts);
 
+	HairFollicle *follicles = BKE_hair_get_follicles(curve_data);
 	for (int i = 0; i < curve_data->totfollicles; ++i) {
-		HairFollicle *follicle = &curve_data->follicles[i];
+		HairFollicle *follicle = &follicles[i];
 
 		BKE_hair_curve_builder_add_curve(&hcb, taper_length, taper_thickness);
 		for (int j = 0; j < numverts_per_curve; ++j)
@@ -227,13 +229,11 @@ static void hair_generate_curves(
 			BKE_hair_curve_builder_add_vertex(&hcb, co, 0);
 		}
 
-		// follicle->curve = i;
+		follicle->curve = i;
 	}
 
-	BKE_hair_curve_data_free(curve_data);
 	BKE_hair_curve_builder_apply(&hcb, curve_data);
 }
-#endif
 
 static int add_test_hair_exec(bContext *C, wmOperator *op)
 {
@@ -250,8 +250,9 @@ static int add_test_hair_exec(bContext *C, wmOperator *op)
 	const int seed = RNA_int_get(op->ptr, "seed");
 	const int count = RNA_int_get(op->ptr, "count");
 
-	// hair_generate_follicles_ex(&edit->curve_data, scalp, seed, count, NULL);
-	// hair_generate_curves(&edit->curve_data, scalp);
+	BKE_hair_curve_data_free(&edit->curve_data);
+	hair_generate_follicles_ex(&edit->curve_data, scalp, seed, count, NULL);
+	hair_generate_curves(&edit->curve_data, scalp);
 
 	BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
 	DEG_id_tag_update(obedit->data, DEG_TAG_SELECT_UPDATE);



More information about the Bf-blender-cvs mailing list