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