Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Vazquez <blendergit@gmail.com>2021-02-08 18:28:42 +0300
committerAntonio Vazquez <blendergit@gmail.com>2021-02-09 18:00:36 +0300
commit1352d81b174726639bbfb6f7aa32dbadf188a8dd (patch)
treeb7bc33114a93c86313b774d8fa05e1214c6844c3 /source/blender/blenkernel/intern/gpencil_geom.c
parent5213b18eb2d57153e0e394190af1624401fed74b (diff)
GPencil: Fill tool refactor and Multiframe in Draw mode
This commit is a refactor of the fill tool to solve several problems we had since the first version of the tool. Changes: * The filling speed has been improved for each step of the process with the optimization of each algorithm/function. * New `AutoFit` option to fill areas outside of the viewport. When enable, the total size of the frame is calculated to fit the filling area. * New support multiframe filling. Now it is possible to fill multiple similar frames in one go. * New `Stroke Extension` option to create temporary closing strokes. These strokes can be displayed and adjusted dynamically using wheel mouse or PageUp/Down keys. * Parameter `Resolution` now is named `Precision` and has been moved to topbar. * `Resolution` now has decimals and can be lower than 1 to allow quick filling in storyboarding workflows. Maximum value has been set as 5. * Parameter `Simplify` has been moved to Advanced panel. * Improved fill outline detection. In some cases, the outline penetrated the area to be filled with unexpected results. * Fixes some corner case bugs with infinite loops. As a result of this refactor, also these new functionalities has been added. * New support for multiframe in `Draw` mode. Any drawing in active frame is duplicated to all selected frame. * New multiframe display mode. Keyframes before or after of the active frame are displayed using onion colors. This can be disable using Onion overlay options.
Diffstat (limited to 'source/blender/blenkernel/intern/gpencil_geom.c')
-rw-r--r--source/blender/blenkernel/intern/gpencil_geom.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/gpencil_geom.c b/source/blender/blenkernel/intern/gpencil_geom.c
index 60ffa3c3e73..2ef85439a46 100644
--- a/source/blender/blenkernel/intern/gpencil_geom.c
+++ b/source/blender/blenkernel/intern/gpencil_geom.c
@@ -3228,6 +3228,45 @@ void BKE_gpencil_stroke_join(bGPDstroke *gps_a,
}
}
+/* Copy the stroke of the frame to all frames selected (except current). */
+void BKE_gpencil_stroke_copy_to_keyframes(
+ bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf, bGPDstroke *gps, const bool tail)
+{
+ GHash *frame_list = BLI_ghash_int_new_ex(__func__, 64);
+ BKE_gpencil_frame_selected_hash(gpd, frame_list);
+
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, frame_list) {
+ int cfra = POINTER_AS_INT(BLI_ghashIterator_getKey(&gh_iter));
+
+ if (gpf->framenum != cfra) {
+ bGPDframe *gpf_new = BKE_gpencil_layer_frame_find(gpl, cfra);
+ if (gpf_new == NULL) {
+ gpf_new = BKE_gpencil_frame_addnew(gpl, cfra);
+ }
+
+ if (gpf_new == NULL) {
+ continue;
+ }
+
+ bGPDstroke *gps_new = BKE_gpencil_stroke_duplicate(gps, true, true);
+ if (gps_new == NULL) {
+ continue;
+ }
+
+ if (tail) {
+ BLI_addhead(&gpf_new->strokes, gps_new);
+ }
+ else {
+ BLI_addtail(&gpf_new->strokes, gps_new);
+ }
+ }
+ }
+
+ /* Free hash table. */
+ BLI_ghash_free(frame_list, NULL, NULL);
+}
+
/* Stroke Uniform Subdivide ------------------------------------- */
typedef struct tSamplePoint {