[Bf-blender-cvs] [3746906fa79] hair_object: Check follicle curve index validity when iterating, in case follicles are unbound.

Lukas Tönne noreply at git.blender.org
Sun Sep 9 11:09:06 CEST 2018


Commit: 3746906fa79fc6e066c6ea3c0917c30f4befe4d4
Author: Lukas Tönne
Date:   Sun Sep 9 10:08:32 2018 +0100
Branches: hair_object
https://developer.blender.org/rB3746906fa79fc6e066c6ea3c0917c30f4befe4d4

Check follicle curve index validity when iterating, in case follicles are unbound.

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

M	source/blender/blenkernel/intern/hair_draw.c
M	source/blender/draw/intern/draw_cache_impl_hair.c
M	source/blender/editors/space_view3d/view3d_iterators.c
M	source/blender/editors/transform/transform_conversions.c

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

diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index fe53af472cf..12a02c3399e 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -167,8 +167,11 @@ void BKE_hair_render_get_buffer_size(
 	const int subdiv_factor = 1 << subdiv;
 	for (int i = 0; i < cache->totfollicles; ++i)
 	{
-		const int numverts = cache->fiber_curves[cache->follicles[i].curve].numverts;
-		*r_totverts = (numverts - 1) * subdiv_factor + 1;
+		const HairFollicle *follicle = &cache->follicles[i];
+		if (follicle->curve != HAIR_CURVE_INDEX_NONE) {
+			const int numverts = cache->fiber_curves[follicle->curve].numverts;
+			*r_totverts = (numverts - 1) * subdiv_factor + 1;
+		}
 	}
 }
 
@@ -187,15 +190,18 @@ void BKE_hair_render_fill_buffers(
 	float *vert = r_vertco;
 	for (int i = 0; i < cache->totfollicles; ++i)
 	{
-		const HairFiberCurve *curve = &cache->fiber_curves[cache->follicles[i].curve];
-		const HairFiberVertex *verts = &cache->fiber_verts[curve->vertstart];
-		const int numverts = curve->numverts;
-		r_curvestart[i] = vertstart;
-		r_curvelen[i] = numverts;
-		
-		hair_curve_subdivide(curve, verts, subdiv, vertco_stride, vert);
-		
-		vertstart += numverts;
-		vert = POINTER_OFFSET(vert, vertco_stride * numverts);
+		const HairFollicle *follicle = &cache->follicles[i];
+		if (follicle->curve != HAIR_CURVE_INDEX_NONE) {
+			const HairFiberCurve *curve = &cache->fiber_curves[follicle->curve];
+			const HairFiberVertex *verts = &cache->fiber_verts[curve->vertstart];
+			const int numverts = curve->numverts;
+			r_curvestart[i] = vertstart;
+			r_curvelen[i] = numverts;
+
+			hair_curve_subdivide(curve, verts, subdiv, vertco_stride, vert);
+
+			vertstart += numverts;
+			vert = POINTER_OFFSET(vert, vertco_stride * numverts);
+		}
 	}
 }
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index a1cc07fbb1e..abd4bfc6933 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -644,6 +644,9 @@ static int hair_batch_cache_fill_segments(
 	int curr_point = 0;
 	for (int i = 0; i < pattern->num_follicles; ++i) {
 		const HairFollicle *follicle = &pattern->follicles[i];
+		if (follicle->curve == HAIR_CURVE_INDEX_NONE) {
+			continue;
+		}
 		const HairFiberCurve *curve = &curve_data->curves[follicle->curve];
 		if (curve->numverts < 2) {
 			continue;
diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c
index d672736b790..ba9a1ef557e 100644
--- a/source/blender/editors/space_view3d/view3d_iterators.c
+++ b/source/blender/editors/space_view3d/view3d_iterators.c
@@ -427,13 +427,15 @@ void hair_foreachScreenVert(
 	if (edit->pattern) {
 		for (int i = 0; i < edit->pattern->num_follicles; ++i) {
 			HairFollicle *follicle = &edit->pattern->follicles[i];
-			HairFiberCurve *curve = &edit->curve_data.curves[follicle->curve];
-			for (int j = 0; j < curve->numverts; ++j) {
-				HairFiberVertex *vert = &edit->curve_data.verts[curve->vertstart + j];
-				float screen_co[2];
-				if (ED_view3d_project_float_object(vc->ar, vert->co, screen_co, clip_flag) == V3D_PROJ_RET_OK)
-				{
-					func(userData, follicle, curve, vert, screen_co);
+			if (follicle->curve != HAIR_CURVE_INDEX_NONE) {
+				HairFiberCurve *curve = &edit->curve_data.curves[follicle->curve];
+				for (int j = 0; j < curve->numverts; ++j) {
+					HairFiberVertex *vert = &edit->curve_data.verts[curve->vertstart + j];
+					float screen_co[2];
+					if (ED_view3d_project_float_object(vc->ar, vert->co, screen_co, clip_flag) == V3D_PROJ_RET_OK)
+					{
+						func(userData, follicle, curve, vert, screen_co);
+					}
 				}
 			}
 		}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index cdfe9eac954..c027b258996 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -2004,14 +2004,15 @@ static int hair_trans_count_verts(EditHair *edit, bool is_prop_edit)
 	int count = 0, countsel = 0;
 	for (int i = 0; i < edit->pattern->num_follicles; ++i) {
 		HairFollicle *follicle = &edit->pattern->follicles[i];
-		HairFiberCurve *curve = &edit->curve_data.curves[follicle->curve];
-		for (int j = 0; j < curve->numverts; ++j)
-		{
-			HairFiberVertex *vertex = &edit->curve_data.verts[curve->vertstart + j];
-			++count;
-			if (vertex->flag & HAIR_VERTEX_SELECT)
-			{
-				++countsel;
+		if (follicle->curve != HAIR_CURVE_INDEX_NONE) {
+			HairFiberCurve *curve = &edit->curve_data.curves[follicle->curve];
+			for (int j = 0; j < curve->numverts; ++j) {
+				HairFiberVertex *vertex = &edit->curve_data.verts[curve->vertstart + j];
+				++count;
+				if (vertex->flag & HAIR_VERTEX_SELECT)
+				{
+					++countsel;
+				}
 			}
 		}
 	}
@@ -2043,6 +2044,9 @@ static void hair_transdata_init_verts(
 	TransData2D *td2d = tdata2d;
 	for (int i = 0; i < edit->pattern->num_follicles; ++i) {
 		HairFollicle *follicle = &edit->pattern->follicles[i];
+		if (follicle->curve == HAIR_CURVE_INDEX_NONE) {
+			continue;
+		}
 		HairFiberCurve *curve = &edit->curve_data.curves[follicle->curve];
 		for (int j = 0; j < curve->numverts; ++j)
 		{



More information about the Bf-blender-cvs mailing list