Commit: d55ea7bf8115f7b14a384d69729a6cade94174e4
Author: Pablo Dobarro
Date:   Wed Mar 13 16:18:30 2019 +0100
Branches: sculpt-mode-features
https://developer.blender.org/rBd55ea7bf8115f7b14a384d69729a6cade94174e4

New sculpt brush cursor with normal radius

>From D3594

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

M       release/scripts/startup/bl_ui/space_view3d_toolbar.py
M       source/blender/blenkernel/BKE_paint.h
M       source/blender/blenkernel/BKE_pbvh.h
M       source/blender/blenkernel/intern/pbvh.c
M       source/blender/blenkernel/intern/pbvh_bmesh.c
M       source/blender/blenkernel/intern/pbvh_intern.h
M       source/blender/editors/sculpt_paint/paint_cursor.c
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/editors/sculpt_paint/sculpt.c
M       source/blender/editors/sculpt_paint/sculpt_intern.h
M       source/blender/makesdna/DNA_brush_types.h
M       source/blender/makesrna/intern/rna_brush.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py 
b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 22571080628..8ae36617c03 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -270,6 +270,11 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
             if not self.is_popover:
                 brush_basic_sculpt_settings(col, context, brush)
 
+            # normal_radius_factor
+            col.separator()
+            row = col.row()
+            row.prop(brush, "normal_radius_factor", slider=True)
+
             # topology_rake_factor
             if (capabilities.has_topology_rake and
                 context.sculpt_object.use_dynamic_topology_sculpting
diff --git a/source/blender/blenkernel/BKE_paint.h 
b/source/blender/blenkernel/BKE_paint.h
index cc445413f61..e297240157b 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -61,6 +61,7 @@ struct SubdivCCG;
 enum eOverlayFlags;
 
 #include "DNA_object_enums.h"
+#include "DNA_view3d_types.h"
 
 extern const char PAINT_CURSOR_SCULPT[3];
 extern const char PAINT_CURSOR_VERTEX_PAINT[3];
@@ -246,6 +247,13 @@ typedef struct SculptSession {
 
        struct StrokeCache *cache;
 
+       float cursor_radius;
+       float cursor_location[3];
+       float cursor_view_normal[3];
+       float cursor_normal[3];
+
+       RegionView3D *rv3d;
+
        union {
                struct {
                        struct SculptVertexPaintGeomMap gmap;
diff --git a/source/blender/blenkernel/BKE_pbvh.h 
b/source/blender/blenkernel/BKE_pbvh.h
index 87d1a6c6915..73803df30ef 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -99,7 +99,7 @@ void BKE_pbvh_raycast(
 bool BKE_pbvh_node_raycast(
         PBVH *bvh, PBVHNode *node, float (*origco)[3], bool use_origco,
         const float ray_start[3], const float ray_normal[3],
-        float *depth);
+        float *depth, float* normal, float *nearest_vertex_co);
 
 bool BKE_pbvh_bmesh_node_raycast_detail(
         PBVHNode *node,
diff --git a/source/blender/blenkernel/intern/pbvh.c 
b/source/blender/blenkernel/intern/pbvh.c
index 7dc772576c5..a8ce32d6d77 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1544,9 +1544,9 @@ bool ray_face_intersection_quad(
        float depth_test;
 
        if ((isect_ray_tri_epsilon_v3(
-                ray_start, ray_normal, t0, t1, t2, &depth_test, NULL, 0.1f) && 
(depth_test < *depth)) ||
+                ray_start, ray_normal, t0, t1, t2, &depth_test, NULL, 0.0f) && 
(depth_test < *depth)) ||
            (isect_ray_tri_epsilon_v3(
-                ray_start, ray_normal, t0, t2, t3, &depth_test, NULL, 0.1f) && 
(depth_test < *depth)))
+                ray_start, ray_normal, t0, t2, t3, &depth_test, NULL, 0.0f) && 
(depth_test < *depth)))
        {
                *depth = depth_test;
                return true;
@@ -1564,7 +1564,7 @@ bool ray_face_intersection_tri(
        float depth_test;
 
        if ((isect_ray_tri_epsilon_v3(
-                ray_start, ray_normal, t0, t1, t2, &depth_test, NULL, 0.1f) && 
(depth_test < *depth)))
+                ray_start, ray_normal, t0, t1, t2, &depth_test, NULL, 0.0f) && 
(depth_test < *depth)))
        {
                *depth = depth_test;
                return true;
@@ -1646,14 +1646,16 @@ static bool pbvh_faces_node_raycast(
         PBVH *bvh, const PBVHNode *node,
         float (*origco)[3],
         const float ray_start[3], const float ray_normal[3],
-        float *depth)
+        float *depth, float *normal, float *nearest_vertex_co)
 {
        const MVert *vert = bvh->verts;
        const MLoop *mloop = bvh->mloop;
        const int *faces = node->prim_indices;
        int i, totface = node->totprim;
        bool hit = false;
-
+       float min_depth = FLT_MAX;
+       float location[3] = {0.0f};
+       copy_v3_fl(nearest_vertex_co, 0.0f);
        for (i = 0; i < totface; ++i) {
                const MLoopTri *lt = &bvh->looptri[faces[i]];
                const int *face_verts = node->face_vert_indices[i];
@@ -1678,6 +1680,17 @@ static bool pbvh_faces_node_raycast(
                                vert[mloop[lt->tri[1]].v].co,
                                vert[mloop[lt->tri[2]].v].co,
                                depth);
+                       if (hit && *depth < min_depth) {
+                               min_depth = *depth;
+                               normal_tri_v3(normal, 
vert[mloop[lt->tri[0]].v].co, vert[mloop[lt->tri[1]].v].co, 
vert[mloop[lt->tri[2]].v].co);
+                               madd_v3_v3v3fl(location, ray_start, ray_normal, 
*depth);
+                               for (int j = 0; j < 3; j++) {
+                                       if (len_squared_v3v3(location, 
vert[mloop[lt->tri[j]].v].co) < len_squared_v3v3(location, nearest_vertex_co)) {
+                                               copy_v3_v3(nearest_vertex_co, 
vert[mloop[lt->tri[j]].v].co);
+                                       }
+                               }
+                       }
+
                }
        }
 
@@ -1688,12 +1701,14 @@ static bool pbvh_grids_node_raycast(
         PBVH *bvh, PBVHNode *node,
         float (*origco)[3],
         const float ray_start[3], const float ray_normal[3],
-        float *depth)
+        float *depth, float *normal, float *nearest_vertex_co)
 {
        const int totgrid = node->totprim;
        const int gridsize = bvh->gridkey.grid_size;
        bool hit = false;
-
+       float min_depth = FLT_MAX;
+       float location[3] = {0.0f};
+       copy_v3_fl(nearest_vertex_co, 0.0f);
        for (int i = 0; i < totgrid; ++i) {
                CCGElem *grid = bvh->grids[node->prim_indices[i]];
                BLI_bitmap *gh;
@@ -1728,6 +1743,21 @@ static bool pbvh_grids_node_raycast(
                                                CCG_grid_elem_co(&bvh->gridkey, 
grid, x + 1, y + 1),
                                                CCG_grid_elem_co(&bvh->gridkey, 
grid, x, y + 1),
                                                depth);
+
+                                       if (hit && *depth < min_depth) {
+                                               min_depth = *depth;
+                                               madd_v3_v3v3fl(location, 
ray_start, ray_normal, *depth);
+                                               normal_tri_v3(
+                                                           normal,
+                                                           
CCG_grid_elem_co(&bvh->gridkey, grid, x, y),
+                                                           
CCG_grid_elem_co(&bvh->gridkey, grid, x + 1, y),
+                                                           
CCG_grid_elem_co(&bvh->gridkey, grid, x + 1, y + 1));
+                                               for (int j = 0; j < 4; j++) {
+                                                       if 
(len_squared_v3v3(location, CCG_grid_elem_co(&bvh->gridkey, grid, x + (j & 1), 
y + ((j & 2) >> 1))) < len_squared_v3v3(location, nearest_vertex_co)) {
+                                                               
copy_v3_v3(nearest_vertex_co, CCG_grid_elem_co(&bvh->gridkey, grid, x + (j & 
1), y + ((j & 2) >> 1)));
+                                                       }
+                                               }
+                                       }
                                }
                        }
                }
@@ -1742,7 +1772,7 @@ static bool pbvh_grids_node_raycast(
 bool BKE_pbvh_node_raycast(
         PBVH *bvh, PBVHNode *node, float (*origco)[3], bool use_origco,
         const float ray_start[3], const float ray_normal[3],
-        float *depth)
+        float *depth, float *normal, float *nearest_vertex_co)
 {
        bool hit = false;
 
@@ -1753,16 +1783,16 @@ bool BKE_pbvh_node_raycast(
                case PBVH_FACES:
                        hit |= pbvh_faces_node_raycast(
                                bvh, node, origco,
-                               ray_start, ray_normal, depth);
+                               ray_start, ray_normal, depth, normal, 
nearest_vertex_co);
                        break;
                case PBVH_GRIDS:
                        hit |= pbvh_grids_node_raycast(
                                bvh, node, origco,
-                               ray_start, ray_normal, depth);
+                               ray_start, ray_normal, depth, normal, 
nearest_vertex_co);
                        break;
                case PBVH_BMESH:
                        hit = pbvh_bmesh_node_raycast(
-                               node, ray_start, ray_normal, depth, use_origco);
+                               node, ray_start, ray_normal, depth, use_origco, 
normal, nearest_vertex_co);
                        break;
        }
 
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c 
b/source/blender/blenkernel/intern/pbvh_bmesh.c
index cd97fcf432e..8ae0e6cb78c 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -1503,10 +1503,12 @@ static bool pbvh_bmesh_collapse_short_edges(
 bool pbvh_bmesh_node_raycast(
         PBVHNode *node, const float ray_start[3],
         const float ray_normal[3], float *depth,
-        bool use_original)
+        bool use_original, float *normal, float *nearest_vertex_co)
 {
        bool hit = false;
 
+       float min_depth = FLT_MAX;
+       float location[3] = {0.0f};
        if (use_original && node->bm_tot_ortri) {
                for (int i = 0; i < node->bm_tot_ortri; i++) {
                        const int *t = node->bm_ortri[i];
@@ -1535,6 +1537,16 @@ bool pbvh_bmesh_node_raycast(
                                        v_tri[1]->co,
                                        v_tri[2]->co,
                                        depth);
+                               if (hit && *depth < min_depth) {
+                                       min_depth = *depth;
+                                       normal_tri_v3(normal, v_tri[0]->co, 
v_tri[1]->co, v_tri[2]->co);
+                                       madd_v3_v3v3fl(location, ray_start, 
ray_normal, *depth);
+                                       for (int j = 0; j < 3; j++) {
+                                               if (len_squared_v3v3(location, 
v_tri[j]->co) < len_squared_v3v3(location, nearest_vertex_co)) {
+                                                       
copy_v3_v3(nearest_vertex_co, v_tri[j]->co);
+                                               }
+                                       }
+                               }
                        }
                }
        }
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h 
b/source/blender/blenkernel/intern/pbvh_intern.h
index b9610179630..6959aee4f3e 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -196,7 +196,7 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int 
totnode, int flag);
 bool pbvh_bmesh_node_raycast(
         PBVHNode *node, const float ray_start[3],
         const float ray_normal[3], float *dist,
-        bool use_original);
+        bool use_original, float *normal, float *nearest_vertex_co);
 bool pbvh_bmesh_node_nearest_to_ray(
         PBVHNode *node, const float ray_start[3],
         const float ray_normal[3], float *depth, float *dist_sq,
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c 
b/source/blender/editors/sculpt_paint/paint_cursor.c
index 863afcf70aa..b39cac8ff05 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -47,11 +47,14 @@
 #include "BKE_colortools.h"
 
 #include "WM_api.h"
+#include "wm_cursors.h"
 
 #include "IMB_imbuf_types.h"
 
 #include "ED_view3d.h"
 
+#include "DEG_depsgraph.h"
+
 #include "GPU_draw.h"
 #include "GPU_immediate.h"
 #include "GPU_immediate_util.h"
@@ -585,7 +588,7 @@ static bool sculpt_get_brush_geometry(
 
 /* Draw an overlay that shows what effect the brush's texture will
  * have on brush strength */
-static void paint_draw_tex_overlay(
+static bool paint_draw_tex_overlay(
         UnifiedPaintSettings *ups, Brush *brush,
         ViewContext *vc, int x, int y, float zoom, bool col, bool primary)
 {
@@ -603,7 +606,7 @@ static void paint_draw_tex_overlay(
            (valid &&
            ELEM(mtex->brush_map_mode, MTEX_MAP_MODE_VIEW, MT

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to