[Bf-blender-cvs] [4c567c578ab] soc-2017-sculpting_improvements: Fixing flooding bug, partial fix. Found BB related flood cause. Realloc fix.
Sebastian Witt
noreply at git.blender.org
Tue Aug 15 12:53:18 CEST 2017
Commit: 4c567c578ab14596f640aea050645383bf21c056
Author: Sebastian Witt
Date: Tue Aug 15 12:52:00 2017 +0200
Branches: soc-2017-sculpting_improvements
https://developer.blender.org/rB4c567c578ab14596f640aea050645383bf21c056
Fixing flooding bug, partial fix. Found BB related flood cause. Realloc fix.
===================================================================
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/space_view3d/view3d_draw.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 9b2e3600616..d922a8ab244 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -132,6 +132,8 @@
* Important for example if two shapes with the same thickness intersect. */
#define SIL_FILLET_BLUR_MAX 0.3f
#define SIL_FILLET_BLUR_MIN 0.001f
+#define SIL_FILLET_INTERSECTION_EPSILON 0.00001f
+#define USE_WATERTIGHT
#define DEBUG_DRAW
#ifdef DEBUG_DRAW
@@ -7152,7 +7154,7 @@ static IntersectionData *add_isect_chunk(SilhouetteData *sil)
} else {
if (sil->num_isect_data >= sil->isect_chunk_tot) {
sil->isect_chunk_tot += 10;
- sil->isect_chunk = MEM_reallocN(sizeof(IntersectionData) * sil->isect_chunk_tot, "isect data");
+ sil->isect_chunk = MEM_reallocN(sil->isect_chunk, sizeof(IntersectionData) * sil->isect_chunk_tot);
}
}
sil->num_isect_data ++;
@@ -7220,6 +7222,11 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
GHash *edge_hash = BLI_ghash_int_new("edges within intersection");
float *int_points = NULL;
bool e_flip_orientation;
+#ifdef USE_WATERTIGHT
+ float dir[3];
+ float e_length;
+ struct IsectRayPrecalc isect_precalc;
+#endif
IntersectionData *i_data;
BLI_array_declare(int_points);
@@ -7237,15 +7244,48 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
for (int e = 0; e < data->totedge; e++) {
copy_v3_v3(p1, me->mvert[me->medge[e_start + e].v1].co);
copy_v3_v3(p2, me->mvert[me->medge[e_start + e].v2].co);
+#ifdef USE_WATERTIGHT
+ sub_v3_v3v3(dir, p2, p1);
+ isect_ray_tri_watertight_v3_precalc(&isect_precalc, dir);
+ e_length = len_v3(dir);
+#endif
+
for (int tri_i = 0; tri_i < tri_node_bind_tot; tri_i ++) {
lt = ltris[sil->inter_tris[tri_node_bind + tri_i]];
- /* TODO: Negative epsilon for better results. Still produces holes. */
+
+#ifdef USE_WATERTIGHT
+ if (isect_ray_tri_watertight_v3(
+ p1, &isect_precalc,
+ me->mvert[me->mloop[lt.tri[0]].v].co, me->mvert[me->mloop[lt.tri[1]].v].co, me->mvert[me->mloop[lt.tri[2]].v].co,
+ &t_lambda, NULL))
+ {
+ /* TODO: Epsilon needed? */
+ if (t_lambda >= 0.0f && t_lambda <= 1.0f) {
+ e_flip_orientation = shared_dir_normal(p1, p2, me->mvert[me->mloop[lt.tri[0]].v].co, me->mvert[me->mloop[lt.tri[1]].v].co, me->mvert[me->mloop[lt.tri[2]].v].co);
+ /*TODO: Bad practise? Pointer is negative if edge orientation needs to be flipped to target inwards. */
+ BLI_ghash_insert(edge_hash, SET_INT_IN_POINTER(e_start + e), SET_INT_IN_POINTER(e_flip_orientation ? (BLI_array_count(int_points) + 1) : -(BLI_array_count(int_points) + 1)));
+ BLI_array_grow_items(int_points, 3);
+ interp_v3_v3v3(&int_points[BLI_array_count(int_points) - 3], p1, p2, t_lambda);
+#ifdef DEBUG_DRAW
+ if(t_lambda > 0.999999f || t_lambda < 0.000001f) {
+ bl_debug_color_set(0xff3333);
+ } else {
+ bl_debug_color_set(0x0000ff);
+ }
+ bl_debug_draw_point(&int_points[BLI_array_count(int_points) - 3], 0.05f);
+ bl_debug_color_set(0x000000);
+ bl_debug_draw_edge_add(p1, p2);
+ bl_debug_color_set(0x000000);
+#endif
+ break;
+ }
+ }
+#else
if (isect_line_segment_tri_epsilon_v3(p1, p2,
me->mvert[me->mloop[lt.tri[0]].v].co, me->mvert[me->mloop[lt.tri[1]].v].co, me->mvert[me->mloop[lt.tri[2]].v].co,
- &t_lambda, NULL, -0.00001f))
+ &t_lambda, NULL, SIL_FILLET_INTERSECTION_EPSILON))
{
e_flip_orientation = shared_dir_normal(p1, p2, me->mvert[me->mloop[lt.tri[0]].v].co, me->mvert[me->mloop[lt.tri[1]].v].co, me->mvert[me->mloop[lt.tri[2]].v].co);
- /*TODO: Bad practise? Pointer is negative if edge orientation needs to be flipped to target inwards. */
BLI_ghash_insert(edge_hash, SET_INT_IN_POINTER(e_start + e), SET_INT_IN_POINTER(e_flip_orientation ? (BLI_array_count(int_points) + 1) : -(BLI_array_count(int_points) + 1)));
BLI_array_grow_items(int_points, 3);
interp_v3_v3v3(&int_points[BLI_array_count(int_points) - 3], p1, p2, t_lambda);
@@ -7262,6 +7302,7 @@ static void do_calc_sil_intersect_task_cb_ex(void *userdata, void *UNUSED(userda
#endif
break;
}
+#endif
}
}
}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 8f74ee80d8e..5061b20abd9 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -4064,8 +4064,8 @@ void view3d_main_region_draw(const bContext *C, ARegion *ar)
#ifdef DEBUG_DRAW
/* debug drawing */
-#define _DEBUG_DRAW_QUAD_TOT 4096
-#define _DEBUG_DRAW_EDGE_TOT 4096
+#define _DEBUG_DRAW_QUAD_TOT 16000
+#define _DEBUG_DRAW_EDGE_TOT 16000
static float _bl_debug_draw_quads[_DEBUG_DRAW_QUAD_TOT][4][3];
static int _bl_debug_draw_quads_tot = 0;
static float _bl_debug_draw_edges[_DEBUG_DRAW_QUAD_TOT][2][3];
More information about the Bf-blender-cvs
mailing list