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:
authorJulian Eisel <julian@blender.org>2021-07-08 15:17:47 +0300
committerJulian Eisel <julian@blender.org>2021-07-08 15:20:14 +0300
commit80d0b682905a8fb3aca6297d1205f46391b9b125 (patch)
tree17e5126547782f713710697b7d4f3249b6a8455d
parent5d54f389496c45eed4b90746a2850d7ee6b36788 (diff)
GPencil: Support camera "Frame Selected" and object previews
Using the "Camera Fit Frame to Selected" operator didn't work for Grease Pencil objects. The same issue caused grease pencil preview thumbnails to be useless (e.g. when using "Mark Asset" on a Grease Pencil object). Reason was that there was no logic to handle grease pencil data and its strokes for the object display-point iterators used for the "Frame Selected" logic. Addresses T89656. Reviewed by: Antonio Vazquez, Campbell Barton Differential Revision: https://developer.blender.org/D11833
-rw-r--r--source/blender/blenkernel/intern/object.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 2a37aebd8f0..37c3d9017cd 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -4143,6 +4143,30 @@ bool BKE_object_minmax_dupli(Depsgraph *depsgraph,
return ok;
}
+struct GPencilStrokePointIterData {
+ const float (*obmat)[4];
+
+ void (*point_func_cb)(const float co[3], void *user_data);
+ void *user_data;
+};
+
+static void foreach_display_point_gpencil_stroke_fn(bGPDlayer *UNUSED(layer),
+ bGPDframe *UNUSED(frame),
+ bGPDstroke *stroke,
+ void *thunk)
+{
+ struct GPencilStrokePointIterData *iter_data = thunk;
+ {
+ bGPDspoint *pt;
+ int i;
+ for (i = 0, pt = stroke->points; i < stroke->totpoints; i++, pt++) {
+ float co[3];
+ mul_v3_m4v3(co, iter_data->obmat, &pt->x);
+ iter_data->point_func_cb(co, iter_data->user_data);
+ }
+ }
+}
+
void BKE_object_foreach_display_point(Object *ob,
const float obmat[4][4],
void (*func_cb)(const float[3], void *),
@@ -4160,6 +4184,13 @@ void BKE_object_foreach_display_point(Object *ob,
func_cb(co, user_data);
}
}
+ else if (ob->type == OB_GPENCIL) {
+ struct GPencilStrokePointIterData iter_data = {
+ .obmat = obmat, .point_func_cb = func_cb, .user_data = user_data};
+
+ BKE_gpencil_visible_stroke_iter(
+ ob->data, NULL, foreach_display_point_gpencil_stroke_fn, &iter_data);
+ }
else if (ob->runtime.curve_cache && ob->runtime.curve_cache->disp.first) {
DispList *dl;