Commit: 83854be46075b223f2c441beb5ddfdb30316a9d6 Author: Falk David Date: Tue Jul 28 21:06:34 2020 +0200 Branches: greasepencil-object https://developer.blender.org/rB83854be46075b223f2c441beb5ddfdb30316a9d6
GPencil: Add 2d stroke perimeter function =================================================================== M source/blender/blenkernel/BKE_gpencil_geom.h M source/blender/blenkernel/intern/gpencil_geom.c =================================================================== diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h index 610b113c5d0..87fa55c201d 100644 --- a/source/blender/blenkernel/BKE_gpencil_geom.h +++ b/source/blender/blenkernel/BKE_gpencil_geom.h @@ -142,6 +142,12 @@ struct bGPDstroke *BKE_gpencil_stroke_perimeter_from_view(struct RegionView3D *r struct bGPDstroke *gps, int subdivisions, float diff_mat[4][4]); +struct bGPDstroke *BKE_gpencil_stroke_perimeter_from_view_2d(struct ARegion *region, + const struct bGPdata *gpd, + const struct bGPDlayer *gpl, + struct bGPDstroke *gps, + int subdivisions, + float diff_mat[4][4]); #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c index 5afe05ed168..cb88fffac33 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.c +++ b/source/blender/blenkernel/intern/gpencil_geom.c @@ -54,6 +54,9 @@ #include "BKE_material.h" #include "BKE_object.h" +#include "UI_view2d.h" +#include "ED_view3d.h" + #include "DEG_depsgraph_query.h" /* GP Object - Boundbox Support */ @@ -3109,4 +3112,85 @@ bGPDstroke *BKE_gpencil_stroke_perimeter_from_view(struct RegionView3D *rv3d, return perimeter_stroke; } + +/** + * Calculates the perimeter of a stroke projected from the view and + * returns it as a flat 2D stroke. + * \param subdivisions: Number of subdivions for the start and end caps + * \return: bGPDstroke pointer to stroke perimeter + */ +bGPDstroke *BKE_gpencil_stroke_perimeter_from_view_2d(struct ARegion *region, + const bGPdata *gpd, + const bGPDlayer *gpl, + bGPDstroke *gps, + int subdivisions, + float diff_mat[4][4]) +{ + if (gps->totpoints == 0) { + return NULL; + } + RegionView3D *rv3d = (RegionView3D *)region->regiondata; + bGPDstroke *gps_cpy = BKE_gpencil_stroke_duplicate(gps, true); + BKE_gpencil_stroke_to_view_space(rv3d, gps_cpy, diff_mat); + + int num_perimeter_points = 0; + ListBase *perimeter_points = gpencil_stroke_perimeter_ex( + gpd, gpl, gps_cpy, subdivisions, &num_perimeter_points); + + if (num_perimeter_points == 0) { + return NULL; + } + + /* create new stroke */ + bGPDstroke *perimeter_stroke = BKE_gpencil_stroke_new(gps->mat_nr, num_perimeter_points, 1); + + tPerimeterPoint *curr = perimeter_points->first; + for (int i = 0; i < num_perimeter_points; i++) { + bGPDspoint *pt = &perimeter_stroke->points[i]; + + // float vec4[3]; + // copy_v4_v4(); + // const float scalar = (vec4[3] != 0.0f) ? (1.0f / vec4[3]) : 0.0f; + // const float fx = ((float)region->winx / 2.0f) * (1.0f + (vec4[0] * scalar)); + // const float fy = ((float)region->winy / 2.0f) * (1.0f + (vec4[1] * scalar)); + + copy_v3_v3(&pt->x, &curr->x); + + /* Set pressure to zero and strength to one */ + pt->pressure = 0.0f; + pt->strength = 1.0f; + + pt->flag |= GP_SPOINT_SELECT; + + curr = curr->next; + } + + BKE_gpencil_stroke_from_view_space(rv3d, perimeter_stroke, diff_mat); + for (int i = 0; i < num_perimeter_points; i++) { + bGPDspoint *pt = &perimeter_stroke->points[i]; + float parent_co[3]; + mul_v3_m4v3(parent_co, diff_mat, &pt->x); + float screen_co[2]; + // eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN); + eV3DProjTest test = (eV3DProjTest)(V3D_PROJ_RET_OK); + if (ED_view3d_project_float_global(region, parent_co, screen_co, test) == V3D_PROJ_RET_OK) { + if (!ELEM(V2D_IS_CLIPPED, screen_co[0], screen_co[1])) { + copy_v2_v2(&pt->x, screen_co); + pt->z = 0.0f; + } + } + } + + /* free temp data */ + BLI_freelistN(perimeter_points); + MEM_freeN(perimeter_points); + BKE_gpencil_free_stroke(gps_cpy); + + /* triangles cache needs to be recalculated */ + BKE_gpencil_stroke_geometry_update(perimeter_stroke); + + perimeter_stroke->flag |= GP_STROKE_SELECT | GP_STROKE_CYCLIC | GP_STROKE_2DSPACE; + + return perimeter_stroke; +} /** \} */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs