summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-06-30 16:02:43 +0200
committerCarlos Garnacho <carlosg@gnome.org>2021-08-27 13:58:25 +0200
commitec4db510bac705e3eac2f12ecff698760bc0d987 (patch)
tree85ea087c5c0c1db16c2e10801eab9a2e5a86efed
parent6d02102c4f4cde8b13b310226f7f8bde8ab3b612 (diff)
downloadmutter-ec4db510bac705e3eac2f12ecff698760bc0d987.tar.gz
clutter: Also log overlap regions in ClutterPickContext/Stack
These may be used for optimizations once we find the pick actor, so picking can be avoided in areas we know didn't cross into other actors. Nothing makes use of it yet though, just log these so far.
-rw-r--r--clutter/clutter/clutter-actor.c5
-rw-r--r--clutter/clutter/clutter-pick-context.c14
-rw-r--r--clutter/clutter/clutter-pick-context.h3
-rw-r--r--clutter/clutter/clutter-pick-stack-private.h2
-rw-r--r--clutter/clutter/clutter-pick-stack.c20
5 files changed, 42 insertions, 2 deletions
diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c
index b8814009f..e7c84be10 100644
--- a/clutter/clutter/clutter-actor.c
+++ b/clutter/clutter/clutter-actor.c
@@ -3961,7 +3961,10 @@ clutter_actor_pick (ClutterActor *actor,
clutter_paint_volume_to_box (&priv->last_paint_volume, &box);
if (!clutter_pick_context_intersects_box (pick_context, &box))
- goto out;
+ {
+ clutter_pick_context_log_overlap (pick_context, actor);
+ goto out;
+ }
}
if (priv->enable_model_view_transform)
diff --git a/clutter/clutter/clutter-pick-context.c b/clutter/clutter/clutter-pick-context.c
index 2f054d318..28e095bfa 100644
--- a/clutter/clutter/clutter-pick-context.c
+++ b/clutter/clutter/clutter-pick-context.c
@@ -119,6 +119,20 @@ clutter_pick_context_log_pick (ClutterPickContext *pick_context,
}
/**
+ * clutter_pick_context_log_overlap:
+ * @pick_context: a #ClutterPickContext
+ * @actor: a #ClutterActor
+ *
+ * Logs an overlapping actor into the pick stack.
+ */
+void
+clutter_pick_context_log_overlap (ClutterPickContext *pick_context,
+ ClutterActor *actor)
+{
+ clutter_pick_stack_log_overlap (pick_context->pick_stack, actor);
+}
+
+/**
* clutter_pick_context_push_clip:
* @pick_context: a #ClutterPickContext
* @box: a #ClutterActorBox
diff --git a/clutter/clutter/clutter-pick-context.h b/clutter/clutter/clutter-pick-context.h
index 5792be6b5..730db1a0a 100644
--- a/clutter/clutter/clutter-pick-context.h
+++ b/clutter/clutter/clutter-pick-context.h
@@ -50,6 +50,9 @@ CLUTTER_EXPORT
void clutter_pick_context_log_pick (ClutterPickContext *pick_context,
const ClutterActorBox *box,
ClutterActor *actor);
+CLUTTER_EXPORT
+void clutter_pick_context_log_overlap (ClutterPickContext *pick_context,
+ ClutterActor *actor);
CLUTTER_EXPORT
void clutter_pick_context_push_clip (ClutterPickContext *pick_context,
diff --git a/clutter/clutter/clutter-pick-stack-private.h b/clutter/clutter/clutter-pick-stack-private.h
index 0523fcafe..93181c333 100644
--- a/clutter/clutter/clutter-pick-stack-private.h
+++ b/clutter/clutter/clutter-pick-stack-private.h
@@ -42,6 +42,8 @@ void clutter_pick_stack_seal (ClutterPickStack *pick_stack);
void clutter_pick_stack_log_pick (ClutterPickStack *pick_stack,
const ClutterActorBox *box,
ClutterActor *actor);
+void clutter_pick_stack_log_overlap (ClutterPickStack *pick_stack,
+ ClutterActor *actor);
void clutter_pick_stack_push_clip (ClutterPickStack *pick_stack,
const ClutterActorBox *box);
diff --git a/clutter/clutter/clutter-pick-stack.c b/clutter/clutter/clutter-pick-stack.c
index 87d3a3ca8..c5bc87ccc 100644
--- a/clutter/clutter/clutter-pick-stack.c
+++ b/clutter/clutter/clutter-pick-stack.c
@@ -32,6 +32,7 @@ typedef struct
Record base;
ClutterActor *actor;
int clip_index;
+ gboolean is_overlap;
} PickRecord;
typedef struct
@@ -342,6 +343,7 @@ clutter_pick_stack_log_pick (ClutterPickStack *pick_stack,
g_assert (!pick_stack->sealed);
+ rec.is_overlap = FALSE;
rec.actor = actor;
rec.clip_index = pick_stack->current_clip_stack_top;
rec.base.rect = *box;
@@ -353,6 +355,21 @@ clutter_pick_stack_log_pick (ClutterPickStack *pick_stack,
}
void
+clutter_pick_stack_log_overlap (ClutterPickStack *pick_stack,
+ ClutterActor *actor)
+{
+ PickRecord rec = { 0 };
+
+ g_assert (!pick_stack->sealed);
+
+ rec.is_overlap = TRUE;
+ rec.actor = actor;
+ rec.clip_index = pick_stack->current_clip_stack_top;
+
+ g_array_append_val (pick_stack->vertices_stack, rec);
+}
+
+void
clutter_pick_stack_push_clip (ClutterPickStack *pick_stack,
const ClutterActorBox *box)
{
@@ -428,7 +445,8 @@ clutter_pick_stack_search_actor (ClutterPickStack *pick_stack,
PickRecord *rec =
&g_array_index (pick_stack->vertices_stack, PickRecord, i);
- if (rec->actor && ray_intersects_record (pick_stack, rec, point, ray))
+ if (!rec->is_overlap && rec->actor &&
+ ray_intersects_record (pick_stack, rec, point, ray))
return rec->actor;
}