[Bf-blender-cvs] [2b1cb59a96a] hair_object: Remove hair data arrays for verts/curves/follicles and use customdata instead.

Lukas Tönne noreply at git.blender.org
Sun Nov 25 12:05:06 CET 2018


Commit: 2b1cb59a96ab523d59a831b01151a4e8092e7053
Author: Lukas Tönne
Date:   Sun Nov 25 11:03:44 2018 +0000
Branches: hair_object
https://developer.blender.org/rB2b1cb59a96ab523d59a831b01151a4e8092e7053

Remove hair data arrays for verts/curves/follicles and use customdata instead.

This disables a bunch of topology-changing functions which will need to be replaced/removed.

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

M	source/blender/blenkernel/BKE_hair.h
M	source/blender/blenkernel/BKE_hair_iterators.h
M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/draw/intern/draw_cache_impl_hair.c
M	source/blender/editors/hair/edithair_test.c
M	source/blender/makesdna/DNA_hair_types.h
M	source/blender/makesrna/intern/rna_hair.c

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

diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index bbdeefc3cf4..c167c025b16 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -78,6 +78,11 @@ void BKE_hair_curve_data_init(struct HairCurveData *data);
 void BKE_hair_curve_data_free(struct HairCurveData *data);
 void BKE_hair_curve_data_copy(struct HairCurveData *dst_data, const struct HairCurveData *src_data, int flag);
 
+/* Base data layers */
+struct HairFiberVertex* BKE_hair_get_verts(const struct HairCurveData *data);
+struct HairFiberCurve* BKE_hair_get_curves(const struct HairCurveData *data);
+struct HairFollicle* BKE_hair_get_follicles(const struct HairCurveData *data);
+
 /* === Scalp object === */
 
 /* Find the mesh used as the scalp surface */
@@ -91,6 +96,7 @@ struct Object* BKE_hair_get_scalp_object(
         const struct Object *ob,
         const struct HairSystem *hsys);
 
+#if 0
 /* === Fiber curves === */
 
 /* Allocate buffers for defining fiber curves
@@ -129,11 +135,12 @@ void BKE_hair_set_fiber_curves(struct HairSystem *hsys, struct HairCurveData *cu
 /* Remove all fiber curves.
  */
 void BKE_hair_clear_fiber_curves(struct HairSystem *hsys);
+#endif
 
 /* === Follicles === */
 
 /* Calculate surface area of a scalp mesh */
-float BKE_hair_calc_surface_area(const struct Mesh *scalp);
+float BKE_hair7_calc_surface_area(const struct Mesh *scalp);
 
 /* Calculate a density value based on surface area and sample count */
 float BKE_hair_calc_density_from_count(float area, int count);
@@ -145,6 +152,7 @@ float BKE_hair_calc_density_from_min_distance(float min_distance);
 /* Calculate a minimum distance based on density */
 float BKE_hair_calc_min_distance_from_density(float density);
 
+#if 0
 /* Distribute hair follicles on a scalp mesh */
 void BKE_hair_generate_follicles(
         struct HairSystem* hsys,
@@ -161,6 +169,7 @@ void BKE_hair_generate_follicles_ex(
         unsigned int seed,
         int count,
         const float *loop_weights);
+#endif
 
 /* === Draw Settings === */
 
diff --git a/source/blender/blenkernel/BKE_hair_iterators.h b/source/blender/blenkernel/BKE_hair_iterators.h
index 8f67b4a0b0b..769102ca920 100644
--- a/source/blender/blenkernel/BKE_hair_iterators.h
+++ b/source/blender/blenkernel/BKE_hair_iterators.h
@@ -89,8 +89,8 @@ typedef struct HairIterator
 
 BLI_INLINE HairFiberCurve* BKE_hair_iter__curves_init(HairIterator *iter, const HairCurveData *curve_data)
 {
-	iter->data.curves.last = curve_data->curves + curve_data->totcurves;
-	iter->data.curves.curve = curve_data->curves;
+	iter->data.curves.last = BKE_hair_get_curves(curve_data) + curve_data->totcurves;
+	iter->data.curves.curve = BKE_hair_get_curves(curve_data);
 	return iter->data.curves.curve;
 }
 
@@ -109,8 +109,8 @@ BLI_INLINE HairFiberCurve* BKE_hair_iter__curves_next(HairIterator *iter)
 
 BLI_INLINE HairFiberVertex* BKE_hair_iter__verts_init(HairIterator *iter, const HairCurveData *curve_data)
 {
-	iter->data.verts.last = curve_data->verts + curve_data->totverts;
-	iter->data.verts.vertex = curve_data->verts;
+	iter->data.verts.last = BKE_hair_get_verts(curve_data) + curve_data->totverts;
+	iter->data.verts.vertex = BKE_hair_get_verts(curve_data);
 	return iter->data.verts.vertex;
 }
 
@@ -129,8 +129,8 @@ BLI_INLINE HairFiberVertex* BKE_hair_iter__verts_next(HairIterator *iter)
 
 BLI_INLINE HairFollicle* BKE_hair_iter__follicles_init(HairIterator *iter, const HairCurveData *curve_data)
 {
-	iter->data.follicles.last = curve_data->follicles + curve_data->totfollicles;
-	iter->data.follicles.follicle = curve_data->follicles;
+	iter->data.follicles.last = BKE_hair_get_follicles(curve_data) + curve_data->totfollicles;
+	iter->data.follicles.follicle = BKE_hair_get_follicles(curve_data);
 	return iter->data.follicles.follicle;
 }
 
@@ -151,10 +151,10 @@ BLI_INLINE HairFollicle* BKE_hair_iter__follicle_curves_init(HairIterator *iter,
 {
 	HairIter__follicle_curves *intern = &iter->data.follicle_curves;
 
-	intern->last = curve_data->follicles + curve_data->totfollicles;
-	intern->curves_array = curve_data->curves;
+	intern->last = BKE_hair_get_follicles(curve_data) + curve_data->totfollicles;
+	intern->curves_array = BKE_hair_get_curves(curve_data);
 
-	intern->follicle = curve_data->follicles;
+	intern->follicle = BKE_hair_get_follicles(curve_data);
 	while (intern->follicle != intern->last) {
 		if (intern->follicle->curve != HAIR_CURVE_INDEX_NONE) {
 			intern->curve = &intern->curves_array[intern->follicle->curve];
@@ -193,8 +193,8 @@ BLI_INLINE HairFiberVertex* BKE_hair_iter__curve_verts_init(HairIterator *iter,
 {
 	HairIter__curve_verts *intern = &iter->data.curve_verts;
 
-	intern->last = &curve_data->verts[curve->vertstart + curve->numverts];
-	intern->vertex = &curve_data->verts[curve->vertstart];
+	intern->last = &BKE_hair_get_verts(curve_data)[curve->vertstart + curve->numverts];
+	intern->vertex = &BKE_hair_get_verts(curve_data)[curve->vertstart];
 	return intern->vertex;
 }
 
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index d1b5cefddc3..7f1ed9309d3 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -94,9 +94,6 @@ void BKE_hair_curve_data_init(HairCurveData *data)
 /* Does not free the data pointer itself! */
 void BKE_hair_curve_data_free(HairCurveData *data)
 {
-	MEM_SAFE_FREE(data->curves);
-	MEM_SAFE_FREE(data->verts);
-	MEM_SAFE_FREE(data->follicles);
 	CustomData_free(&data->vdata, data->totverts);
 	CustomData_free(&data->cdata, data->totcurves);
 	CustomData_free(&data->fdata, data->totfollicles);
@@ -104,16 +101,6 @@ void BKE_hair_curve_data_free(HairCurveData *data)
 
 void BKE_hair_curve_data_copy(HairCurveData *dst_data, const HairCurveData *src_data, int flag)
 {
-	if (src_data->curves) {
-		dst_data->curves = MEM_dupallocN(src_data->curves);
-	}
-	if (src_data->verts) {
-		dst_data->verts = MEM_dupallocN(src_data->verts);
-	}
-	if (src_data->follicles) {
-		dst_data->follicles = MEM_dupallocN(src_data->follicles);
-	}
-
 	dst_data->totcurves = src_data->totcurves;
 	dst_data->totverts = src_data->totverts;
 	dst_data->totfollicles = src_data->totfollicles;
@@ -182,6 +169,21 @@ HairSystem *BKE_hair_copy(Main *bmain, const HairSystem *hsys)
 	return hsys_copy;
 }
 
+HairFiberVertex* BKE_hair_get_verts(const HairCurveData *data)
+{
+	return CustomData_get_layer(&data->vdata, CD_HAIRVERT);
+}
+
+HairFiberCurve* BKE_hair_get_curves(const HairCurveData *data)
+{
+	return CustomData_get_layer(&data->cdata, CD_HAIRCURVE);
+}
+
+HairFollicle* BKE_hair_get_follicles(const HairCurveData *data)
+{
+	return CustomData_get_layer(&data->fdata, CD_HAIRFOLLICLE);
+}
+
 /* Custom data layer functions; those assume that totXXX are set correctly. */
 static void hair_ensure_cdlayers_primary(HairCurveData *data)
 {
@@ -291,7 +293,7 @@ bool BKE_hair_minmax(HairSystem *hsys, float min[3], float max[3])
 		return false;
 	}
 
-	HairFiberVertex *vert = hsys->curve_data.verts;
+	const HairFiberVertex *vert = BKE_hair_get_verts(&hsys->curve_data);
 	for (int i = 0; i < hsys->curve_data.totverts; ++i) {
 		minmax_v3v3_v3(min, max, vert->co);
 	}
@@ -409,6 +411,7 @@ float BKE_hair_calc_min_distance_from_density(float density)
 	return density > 0.0f ? sqrt(max_factor / density) : 0.0f;
 }
 
+#if 0
 /* Distribute hair follicles on a scalp mesh */
 void BKE_hair_generate_follicles(
         HairSystem* hsys,
@@ -458,9 +461,11 @@ void BKE_hair_generate_follicles_ex(
 	
 	BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
 }
+#endif
 
 /* ================================= */
 
+#if 0
 void BKE_hair_fiber_curves_begin(HairSystem *hsys, int totcurves)
 {
 	if (totcurves != hsys->curve_data.totcurves)
@@ -565,6 +570,7 @@ void BKE_hair_clear_fiber_curves(HairSystem *hsys)
 
 	BKE_hair_batch_cache_dirty(hsys, BKE_HAIR_BATCH_DIRTY_ALL);
 }
+#endif
 
 /* === Depsgraph evaluation === */
 
@@ -611,7 +617,7 @@ void BKE_hair_ensure_follicle_space(const Mesh *scalp, HairCurveData *curve_data
 	float (*co)[3] = orco;
 	float (*nor)[3] = normals;
 	float (*tang)[3] = tangents;
-	HairFollicle *follicle = curve_data->follicles;
+	const HairFollicle *follicle = BKE_hair_get_follicles(curve_data);
 	for (int i = 0; i < num_follicles; ++i) {
 		BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, co, nor, tang);
 
@@ -846,24 +852,25 @@ int BKE_hair_export_cache_update(HairExportCache *cache, const HairSystem *hsys,
 		cache->fiber_tangents = MEM_reallocN_id(cache->fiber_tangents, sizeof(float[3]) * totverts, "hair export tangents");
 		cache->fiber_normals = MEM_reallocN_id(cache->fiber_normals, sizeof(float[3]) * totverts, "hair export normals");
 		
+		const HairFiberVertex *verts_orig = BKE_hair_get_verts(&hsys->curve_data);
 		HairFiberCurve *curve_orig;
 		HairIterator iter;
 		int i;
 		BKE_HAIR_ITER_CURVES_INDEX(curve_orig, &iter, &hsys->curve_data, i) {
-			const HairFiberVertex *verts_orig = &hsys->curve_data.verts[curve_orig->vertstart];
+			const HairFiberVertex *curve_verts_orig = &verts_orig[curve_orig->vertstart];
 			const HairFiberCurve *curve = &cache->fiber_curves[i];
 			HairFiberVertex *verts = &cache->fiber_verts[curve->vertstart];
 			float (*tangents)[3] = &cache->fiber_tangents[curve->vertstart];
 			float (*normals)[3] = &cache->fiber_normals[curve->vertstart];
 			
-			hair_curve_subdivide(curve_orig, verts_orig, subdiv, verts);
+			hair_curve_subdivide(curve_orig, curve_verts_orig, subdiv, verts);
 			
 			hair_curve_calc_vectors(verts, curve->numverts, tangents, normals);
 		}
 	}
 
 	if (data & HAIR_EXPORT_FOLLICLE_BINDING) {
-		cache->follicles = hsys->curve_data.follicles;
+		cache->follicles = BKE_hair_get_follicles(&hsys->curve_data);
 		cache->totfollicles = hsys->curve_data.totfollicles;
 	}
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 9aa42401c5c..da9d9449558 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -8426,9 +8426,6 @@ static void direct_link_hair(FileData *fd, HairSystem* hsys)
 	hsys->adt= newdataadr(fd, hsys->adt);
 	direct_link_animdata(fd, h

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list