From 51f004f1718c1ec4b1efe111fae41bfba063fa51 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sat, 3 Aug 2024 16:09:01 -0400 Subject: [PATCH] core: Allow clicking on a non-interactive AVM2 child of a Loader --- core/src/display_object/loader_display.rs | 9 +++ .../Test.as | 60 +++++++++++++++ .../image.png | Bin 0 -> 539 bytes .../input.json | 72 ++++++++++++++++++ .../loadable.swf | Bin 0 -> 639 bytes .../output.txt | 5 ++ .../test.fla | Bin 0 -> 3892 bytes .../test.swf | Bin 0 -> 1085 bytes .../test.toml | 1 + 9 files changed, 147 insertions(+) create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/Test.as create mode 100644 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/image.png create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/input.json create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/loadable.swf create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/output.txt create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.fla create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.swf create mode 100755 tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.toml diff --git a/core/src/display_object/loader_display.rs b/core/src/display_object/loader_display.rs index a985c70e7..6ebe90d9e 100644 --- a/core/src/display_object/loader_display.rs +++ b/core/src/display_object/loader_display.rs @@ -215,6 +215,9 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> { return Avm2MousePick::Miss; } + let mut options = HitTestOptions::SKIP_INVISIBLE; + options.set(HitTestOptions::SKIP_MASK, self.maskee().is_none()); + // We have at most one child if let Some(child) = self.iter_render_list().next() { if let Some(int) = child.as_interactive() { @@ -240,6 +243,12 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> { return Avm2MousePick::Miss; } } + } else if child.hit_test_shape(context, point, options) { + if self.mouse_enabled() { + return Avm2MousePick::Hit((*self).into()); + } else { + return Avm2MousePick::PropagateToParent; + } } } Avm2MousePick::Miss diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/Test.as b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/Test.as new file mode 100755 index 000000000..5ac3412d5 --- /dev/null +++ b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/Test.as @@ -0,0 +1,60 @@ +package { + + import flash.display.MovieClip; + import flash.display.Shape; + import flash.geom.Rectangle; + import flash.net.URLRequest; + import flash.events.MouseEvent; + import flash.display.Loader; + import flash.display.Sprite; + + + public class Test extends MovieClip { + + + public function Test() { + var child = new Shape(); + child.graphics.beginFill(0xFF0000); + child.graphics.drawRect(0, 0, 100, 100); + child.graphics.endFill(); + this.addChild(child); + + this.stage.addEventListener(MouseEvent.CLICK, function (e) { + trace("Clicked at: " + e.stageX + " " + e.stageY + " on: " + e.target + " (" + e.target.name + ")"); + }); + + var loaderWrapper = new Sprite(); + loaderWrapper.name = "LoaderWrapper"; + + var firstLoader = new Loader(); + firstLoader.name = "firstLoader"; + firstLoader.load(new URLRequest("image.png")); + loaderWrapper.addChild(firstLoader); + + var secondLoader = new Loader(); + secondLoader.name = "secondLoader"; + secondLoader.load(new URLRequest("image.png")); + secondLoader.y = 150; + secondLoader.mouseEnabled = false; + loaderWrapper.addChild(secondLoader); + + var thirdLoader = new Loader(); + thirdLoader.name = "thirdLoader"; + thirdLoader.load(new URLRequest("image.png")); + thirdLoader.y = 300; + thirdLoader.mouseChildren = false; + loaderWrapper.addChild(thirdLoader); + + var fourthLoader = new Loader(); + fourthLoader.name = "fourthLoader"; + fourthLoader.load(new URLRequest("image.png")); + fourthLoader.y = 450; + fourthLoader.mouseEnabled = false; + fourthLoader.mouseChildren = false; + loaderWrapper.addChild(fourthLoader); + + this.addChild(loaderWrapper); + } + } + +} diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/image.png b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/image.png new file mode 100644 index 0000000000000000000000000000000000000000..c804628ce101e63c53e768c1c3477efd3cbcf423 GIT binary patch literal 539 zcmV+$0_6RPP)G|icpqr+h(~=(FEx^o zfV=K4>d0u(>t-EO0P<#O2o_kBOnZ?#%I zp2%o4l4i4+*lRQz((QK5y4UMTtyW7o*lM+ma|GGxbQ14Qr&9wszUO(KwA*d7?)Upr ztyUjTgg{fNlw>j)Lx?~Ng@TO7;|N$jpHI9q7!0IXESl#yF7bN=8up_g?B}|!42Q#L z>~gu>|X5lgZ>R5$1-^5@49ATmASR9d}9*Sp;=agXnC>=<+sCUO52VW)zN#X^?LWkSv0etyG#ta!iR z*`MEcFUK|jB?5H>*2f2$5!hE6>Im$s3v~qc6;(%Y6+wSd@Mh)M2B1Wsj==i(Kr;gS dO5?vd@&Wbc(ta`4j$Hr%002ovPDHLkV1kc-`X>MY literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/input.json b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/input.json new file mode 100755 index 000000000..69344776c --- /dev/null +++ b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/input.json @@ -0,0 +1,72 @@ +[ + { + "type": "MouseMove", + "pos": [19, 29] + }, + { + "type": "MouseDown", + "pos": [19, 29], + "btn": "Left" + }, + { + "type": "MouseUp", + "pos": [19, 29], + "btn": "Left" + }, + { + "type": "MouseMove", + "pos": [71, 26] + }, + { + "type": "MouseDown", + "pos": [71, 26], + "btn": "Left" + }, + { + "type": "MouseUp", + "pos": [71, 26], + "btn": "Left" + }, + { + "type": "MouseMove", + "pos": [19, 175] + }, + { + "type": "MouseDown", + "pos": [19, 175], + "btn": "Left" + }, + { + "type": "MouseUp", + "pos": [19, 175], + "btn": "Left" + }, + { + "type": "MouseMove", + "pos": [20, 324] + }, + { + "type": "MouseDown", + "pos": [20, 324], + "btn": "Left" + }, + { + "type": "MouseUp", + "pos": [20, 324], + "btn": "Left" + }, + { + "type": "MouseMove", + "pos": [25, 477] + }, + { + "type": "MouseDown", + "pos": [25, 477], + "btn": "Left" + }, + { + "type": "MouseUp", + "pos": [25, 477], + "btn": "Left" + } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/loadable.swf b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/loadable.swf new file mode 100755 index 0000000000000000000000000000000000000000..13a78ddc3920496c3f83a724aa80e9f3aad7c3cb GIT binary patch literal 639 zcmV-_0)YKPS5qrS0{{ScoK;faYtv8^KKCZgZQ5pQbqf_IRyHR1&}Kh`;U1iJQwECQ zaFkJP()5N#v!+YZy6q3}*MrXkA2t}9{sq1cd{7^JC@SKMh;P0KbAtFX;!V<`yCnDC zeBU|WcQ_}j5UT+6ZvkWx%x2;MP{h9PpH8<g0$++1u; zE#}8yZ!pPX5iIDmL33jO{=j4iG+)2Doo(;@X}%?;?30}r2!Zj=@X-K-%g>zOov9W+ zKkWNB)xJ}Fc>wT05D-gb3QPtt7?014wl=>TPjjEvH#b;56Zk*hbJh=~!}njm9E*L( z&44ea8O||nfkqoW82>Jbk8uaxv5Zat`X`9H>!83?xmtS zXqz@Xw|_1;m}67(^g4B<*{HlIG&A4usH5qg*`^U9AK{C3!_&+Lb%cecV|p|uBbm=~ zauQMmaRkQ*5(pv$i3BAGpCVWyxR2m|g40~oIvoC2fDjhhlra||d>6(D@hBKR5))iU zxf()=r2I3!pX?~?ornEY$KcOuv3-fLm?emXj>33>f+{E~QPjAiii(<0)TE+f_LSgM ZwCae(aV+iPaVaVSdYuc0{};BY*nH&6J}dwL literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/output.txt b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/output.txt new file mode 100755 index 000000000..9c6bcfa6e --- /dev/null +++ b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/output.txt @@ -0,0 +1,5 @@ +Clicked at: 19 29 on: [object Loader] (firstLoader) +Clicked at: 71 26 on: [object Stage] (null) +Clicked at: 19 175 on: [object Sprite] (LoaderWrapper) +Clicked at: 20 324 on: [object Loader] (thirdLoader) +Clicked at: 25 477 on: [object Sprite] (LoaderWrapper) diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.fla b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.fla new file mode 100755 index 0000000000000000000000000000000000000000..c6146d1fd84ef58910d4b07af73301db99e399fa GIT binary patch literal 3892 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 Dghd>K literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.toml b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.toml new file mode 100755 index 000000000..67f15e863 --- /dev/null +++ b/tests/tests/swfs/avm2/loader_noninteractive_try_click_root/test.toml @@ -0,0 +1 @@ +num_ticks = 1 \ No newline at end of file