[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