Commit: 25b6802aca4aa14f490547545221bed693711048
Author: Antonioya
Date:   Fri Mar 15 08:43:39 2019 +0100
Branches: greasepencil-object
https://developer.blender.org/rB25b6802aca4aa14f490547545221bed693711048

GPencil: Drawing locked to 3D cursor (wip)

Now it's possible to draw strokes attached to a plane locked to 3D cursor.

Still pending the lock in Sculpt mode.

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

M       source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/editors/gpencil/gpencil_edit.c
M       source/blender/editors/gpencil/gpencil_fill.c
M       source/blender/editors/gpencil/gpencil_paint.c
M       source/blender/editors/gpencil/gpencil_primitive.c
M       source/blender/editors/gpencil/gpencil_utils.c
M       source/blender/editors/include/ED_gpencil.h
M       source/blender/makesdna/DNA_scene_types.h
M       source/blender/makesrna/intern/rna_sculpt_paint.c

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c 
b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 70e679d4e72..e555375e593 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -270,7 +270,7 @@ GPUBatch *DRW_gpencil_get_buffer_stroke_geom(bGPdata *gpd, 
short thickness)
 
        for (int i = 0; i < totpoints; i++, tpt++) {
                ED_gpencil_tpoint_to_point(ar, origin, tpt, &pt);
-               ED_gp_project_point_to_plane(ob, rv3d, origin, 
ts->gp_sculpt.lock_axis - 1, &pt);
+               ED_gp_project_point_to_plane(scene, ob, rv3d, origin, 
ts->gp_sculpt.lock_axis - 1, &pt);
 
                /* first point for adjacency (not drawn) */
                if (i == 0) {
@@ -361,7 +361,7 @@ GPUBatch *DRW_gpencil_get_buffer_point_geom(bGPdata *gpd, 
short thickness)
 
        for (int i = 0; i < totpoints; i++, tpt++) {
                ED_gpencil_tpoint_to_point(ar, origin, tpt, &pt);
-               ED_gp_project_point_to_plane(ob, rv3d, origin, 
ts->gp_sculpt.lock_axis - 1, &pt);
+               ED_gp_project_point_to_plane(scene, ob, rv3d, origin, 
ts->gp_sculpt.lock_axis - 1, &pt);
 
                /* set point */
                gpencil_set_stroke_point(
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index d3afe4e3cc4..04e78feb07f 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -634,14 +634,30 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
                        e_data.batch_grid = DRW_gpencil_get_grid(ob);
 
                        /* define grid orientation */
-                       if (ts->gp_sculpt.lock_axis != GP_LOCKAXIS_VIEW) {
-                               copy_m4_m4(stl->storage->grid_matrix, 
ob->obmat);
-                       }
-                       else {
-                               /* align always to view */
-                               invert_m4_m4(stl->storage->grid_matrix, 
draw_ctx->rv3d->viewmat);
-                               /* copy ob location */
-                               copy_v3_v3(stl->storage->grid_matrix[3], 
ob->obmat[3]);
+                       switch (ts->gp_sculpt.lock_axis) {
+                               case GP_LOCKAXIS_VIEW:
+                               {
+                                       /* align always to view */
+                                       invert_m4_m4(stl->storage->grid_matrix, 
draw_ctx->rv3d->viewmat);
+                                       /* copy ob location */
+                                       
copy_v3_v3(stl->storage->grid_matrix[3], ob->obmat[3]);
+                                       break;
+                               }
+                               case GP_LOCKAXIS_CURSOR:
+                               {
+                                       const View3DCursor *cursor = 
&scene->cursor;
+                                       float scale[3] = { 1.0f, 1.0f, 1.0f };
+                                       
loc_eul_size_to_mat4(stl->storage->grid_matrix,
+                                                                               
cursor->location,
+                                                                               
cursor->rotation_euler,
+                                                                               
scale);
+                                       break;
+                               }
+                               default:
+                               {
+                                       copy_m4_m4(stl->storage->grid_matrix, 
ob->obmat);
+                                       break;
+                               }
                        }
 
                        DRW_shgroup_call_add(
diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 088282c0f02..a6feb6477a3 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -3360,7 +3360,7 @@ static int gp_strokes_reproject_exec(bContext *C, 
wmOperator *op)
                                                }
                                        }
 
-                                       ED_gp_project_point_to_plane(ob, rv3d, 
origin,
+                                       ED_gp_project_point_to_plane(scene, ob, 
rv3d, origin,
                                                axis, &pt2);
 
                                        copy_v3_v3(&pt->x, &pt2.x);
diff --git a/source/blender/editors/gpencil/gpencil_fill.c 
b/source/blender/editors/gpencil/gpencil_fill.c
index fad30561ea4..0d0ab46028c 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -1100,7 +1100,7 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
                        tgpf->scene, tgpf->ob, tgpf->gpl,
                        ts->gpencil_v3d_align, origin);
                ED_gp_project_stroke_to_plane(
-                       tgpf->ob, tgpf->rv3d, gps, origin,
+                       tgpf->scene, tgpf->ob, tgpf->rv3d, gps, origin,
                        tgpf->lock_axis - 1);
        }
 
diff --git a/source/blender/editors/gpencil/gpencil_paint.c 
b/source/blender/editors/gpencil/gpencil_paint.c
index 50a7d9d8703..e5c81d12d4e 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -398,7 +398,9 @@ static void gp_reproject_toplane(tGPsdata *p, bGPDstroke 
*gps)
 
        /* get drawing origin */
        gp_get_3d_reference(p, origin);
-       ED_gp_project_stroke_to_plane(obact, rv3d, gps, origin, p->lock_axis - 
1);
+       ED_gp_project_stroke_to_plane(
+               p->scene, obact, rv3d, gps,
+               origin, p->lock_axis - 1);
 }
 
 /* convert screen-coordinates to buffer-coordinates */
@@ -752,11 +754,11 @@ static short gp_stroke_addpoint(
                        gp_get_3d_reference(p, origin);
                        /* reproject current */
                        ED_gpencil_tpoint_to_point(p->ar, origin, pt, &spt);
-                       ED_gp_project_point_to_plane(obact, rv3d, origin, 
p->lock_axis - 1, &spt);
+                       ED_gp_project_point_to_plane(p->scene, obact, rv3d, 
origin, p->lock_axis - 1, &spt);
 
                        /* reproject previous */
                        ED_gpencil_tpoint_to_point(p->ar, origin, ptb, &spt2);
-                       ED_gp_project_point_to_plane(obact, rv3d, origin, 
p->lock_axis - 1, &spt2);
+                       ED_gp_project_point_to_plane(p->scene, obact, rv3d, 
origin, p->lock_axis - 1, &spt2);
                        p->totpixlen += len_v3v3(&spt.x, &spt2.x) / pixsize;
                        pt->uv_fac = p->totpixlen;
                        if ((gp_style) && (gp_style->sima)) {
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c 
b/source/blender/editors/gpencil/gpencil_primitive.c
index 3a2347d9177..e57b66839ef 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -928,11 +928,13 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
                                ts->gpencil_v3d_align, origin);
                        /* reproject current */
                        ED_gpencil_tpoint_to_point(tgpi->ar, origin, tpt, &spt);
-                       ED_gp_project_point_to_plane(tgpi->ob, tgpi->rv3d, 
origin, tgpi->lock_axis - 1, &spt);
+                       ED_gp_project_point_to_plane(tgpi->scene, tgpi->ob, 
tgpi->rv3d,
+                                                                               
origin, tgpi->lock_axis - 1, &spt);
 
                        /* reproject previous */
                        ED_gpencil_tpoint_to_point(tgpi->ar, origin, tptb, 
&spt2);
-                       ED_gp_project_point_to_plane(tgpi->ob, tgpi->rv3d, 
origin, tgpi->lock_axis - 1, &spt2);
+                       ED_gp_project_point_to_plane(tgpi->scene, tgpi->ob, 
tgpi->rv3d,
+                                                                               
origin, tgpi->lock_axis - 1, &spt2);
                        tgpi->totpixlen += len_v3v3(&spt.x, &spt2.x) / pixsize;
                        tpt->uv_fac = tgpi->totpixlen;
                        if ((gp_style) && (gp_style->sima)) {
@@ -990,7 +992,8 @@ static void gp_primitive_update_strokes(bContext *C, 
tGPDprimitive *tgpi)
                ED_gp_get_drawing_reference(tgpi->scene, tgpi->ob, tgpi->gpl,
                        ts->gpencil_v3d_align, origin);
                ED_gp_project_stroke_to_plane(
-                       tgpi->ob, tgpi->rv3d, gps, origin, 
ts->gp_sculpt.lock_axis - 1);
+                       tgpi->scene, tgpi->ob, tgpi->rv3d, gps,
+                       origin, ts->gp_sculpt.lock_axis - 1);
        }
 
        /* if parented change position relative to parent object */
diff --git a/source/blender/editors/gpencil/gpencil_utils.c 
b/source/blender/editors/gpencil/gpencil_utils.c
index 5f703808d53..f7187e544c8 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -876,9 +876,11 @@ void ED_gp_get_drawing_reference(
         char align_flag, float r_vec[3])
 {
        const float *fp = scene->cursor.location;
+       ToolSettings *ts = scene->toolsettings;
+       const int axis = ts->gp_sculpt.lock_axis;
 
        /* if using a gpencil object at cursor mode, can use the location of 
the object */
-       if (align_flag & GP_PROJECT_VIEWSPACE) {
+       if ((align_flag & GP_PROJECT_VIEWSPACE) && (axis != 
GP_LOCKAXIS_CURSOR)) {
                if (ob && (ob->type == OB_GPENCIL)) {
                        /* fallback (no strokes) - use cursor or object 
location */
                        if (align_flag & GP_PROJECT_CURSOR) {
@@ -936,7 +938,9 @@ void ED_gpencil_project_stroke_to_view(bContext *C, 
bGPDlayer *gpl, bGPDstroke *
  * Reproject all points of the stroke to a plane locked to axis to avoid 
stroke offset
  */
 void ED_gp_project_stroke_to_plane(
-        const Object *ob, const RegionView3D *rv3d, bGPDstroke *gps, const 
float origin[3], const int axis)
+               const Scene *scene, const Object *ob,
+               const RegionView3D *rv3d, bGPDstroke *gps,
+               const float origin[3], const int axis)
 {
        float plane_normal[3];
        float vn[3];
@@ -952,13 +956,24 @@ void ED_gp_project_stroke_to_plane(
                 */
                ED_view3d_global_to_vector(rv3d, origin, plane_normal);
        }
-       else {
+       else if (axis < 3) {
                plane_normal[axis] = 1.0f;
                /* if object, apply object rotation */
                if (ob && (ob->type == OB_GPENCIL)) {
                        mul_mat3_m4_v3(ob->obmat, plane_normal);
                }
        }
+       else {
+               const View3DCursor *cursor = &scene->cursor;
+               float scale[3] = { 1.0f, 1.0f, 1.0f };
+               plane_normal[2] = 1.0f;
+               float mat[4][4];
+               loc_eul_size_to_mat4(mat,
+                       cursor->location,
+                       cursor->rotation_euler,
+                       scale);
+               mul_mat3_m4_v3(mat, plane_normal);
+       }
 
        /* Reproject the points in the plane */
        for (int i = 0; i < gps->totpoints; i++) {
@@ -983,7 +998,9 @@ void ED_gp_project_stroke_to_plane(
  * \param[in, out] pt : Point to affect
  */
 void ED_gp_project_point_to_plane(
-        const Object *ob, const RegionView3D *rv3d, const float origin[3], 
const int axis, bGPDspoint *pt)
+               const Scene *scene, const Object *ob,
+               const RegionView3D *rv3d, const float origin[3],
+               const int axis, bGPDspoint *pt)
 {
        float plane_normal[3];
        float vn[3];
@@ -999,14 +1016,24 @@ void ED_gp_project_point_to_plane(
                 */
                ED_view3d_global_to_vector(rv3d, origin, plane_normal);
        }
-       else {
+       else if (axis < 3) {
                plane_normal[axis] = 1.0f;
                /* if object, apply object rotation */
                if (ob && (ob->type == OB_GPENCIL)) {
                        mul_mat3_m4_v3(ob->obmat, plane_normal);
                }
        }
-
+       else {
+               const View3DCursor *cursor = &scene->cursor;
+               float scale[3] = { 1.0f, 1.0f, 1.0f };
+               plane_normal[2] = 1.0f;
+               float mat[4][4];
+               loc_eul_size_to_mat4(mat,
+                       cursor->location,
+                       cursor->rotation_euler,
+                       scale);
+               mul_mat3_m4_v3(mat, plane_normal);
+       }
 
        /* Reproject the points in the plane */
        /* get a vector from the point with the current view direction of the 
viewport */
diff --git a/source/blender/editors/include/ED_gpencil.h 
b/source/blender/editors/include/ED_gpencil.h
index e331032bd6e..fdbb8556891 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -225,9 +225,11 @@ void ED_gpencil_add_defaults(struct bContext *C, struct 
Object *

@@ 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