From dbaefeb337335cea270b216ceb1b3f8e7c1264fa Mon Sep 17 00:00:00 2001 From: Michael Verdi Date: Thu, 31 Jul 2025 18:26:49 -0500 Subject: [PATCH] Implement 2D video controls for non-VR devices - Add complete 2D control panel with HTML structure and CSS styling - Implement JavaScript functionality for all control buttons: - Fullscreen toggle for immersive 16:9 video experience - Play/pause with dynamic icon switching - Back/forward 15-second skip controls - Mute/unmute toggle - Click-to-seek progress bar with real-time updates - Add auto-hide behavior (5-second timeout) with mouse/touch activation - Integrate with existing 2D mode - shows only when VR not supported - Include all button PNG assets (normal and hover states) - Responsive design for mobile devices - Professional styling matching design specifications --- back-hover.png | Bin 0 -> 4714 bytes back.png | Bin 0 -> 1642 bytes forward-hover.png | Bin 0 -> 4695 bytes forward.png | Bin 0 -> 1638 bytes fullscreen-hover.png | Bin 0 -> 3626 bytes fullscreen.png | Bin 0 -> 796 bytes index.html | 23 ++++- mute-hover.png | Bin 0 -> 4431 bytes mute.png | Bin 0 -> 1540 bytes pause-hover.png | Bin 0 -> 3246 bytes pause.png | Bin 0 -> 666 bytes play2-hover.png | Bin 0 -> 3830 bytes play2.png | Bin 0 -> 1167 bytes unmute-hover.png | Bin 0 -> 3918 bytes unmute.png | Bin 0 -> 1014 bytes vr180-player.css | 211 +++++++++++++++++++++++++++++++++++++++++++ vr180-player.js | 206 ++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 back-hover.png create mode 100644 back.png create mode 100644 forward-hover.png create mode 100644 forward.png create mode 100644 fullscreen-hover.png create mode 100644 fullscreen.png create mode 100644 mute-hover.png create mode 100644 mute.png create mode 100644 pause-hover.png create mode 100644 pause.png create mode 100644 play2-hover.png create mode 100644 play2.png create mode 100644 unmute-hover.png create mode 100644 unmute.png diff --git a/back-hover.png b/back-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b1bc87929d0d1469afe5fdbcb3f61d0748b71889 GIT binary patch literal 4714 zcmV-w5|!@~0drDELIAGL9O(c600d`2O+f$vv5yPG#ZWG)z#JB&d$zl zEKCTu8Y0fLS>)GR;@3Qb$1L#0W5Vz{>FMbiG7O_d z?1=Y}B~e!wMCS=UPMZ>)jTEtnR|{jThEXCG@g`=B2ZOU^6|)f{7V)M+osT1&(U_o; zQECw*+i>~v<-;uAK@!rU&cDy`G7SJrE8>0o_8s8S_L!~NhOFV=>r7eva_K}oG&I!9 z{_U_>hg?|VW4!1Vqf{au9v(i#r!f-p28~D07d0xELc}N$bL2fC(YLJ>HYyih#QXQ} zA6Q*ooe=L^4B(Z!ySoogOiV0MK`69{**+ZR(g(0yc)W4EWkEViB-$(+SN3|i zAo3|?KrSLiF9cmLB}*roy*!pxi8^x;!w;>jteoYCRT6Bc#zMZxLjE_UNamgx6FEr) zEc~An&O38zWGZ3|Y=q>4g*ZIi zYT7N;NX#|@W#uXfLOf2iVk=S;v6K57BSDByPb=Aq)I{t|u@{7-j5_0~*rX!jp`oEc zk~JcP7Qq_Rlz>!3+|kjITH;!;7p%3HBpSCYVkZh$Nf1(iZE5V3TT3Z6XE28sm6V#0 z7CqayZ@;v#u%Nv;drOfRJ93glVIgJW+S69;#2^Vm`cxg8szqWEix(EMBu+F=EMmz> z2pLn=%~T{3u|#1Z4|Ma!i9}qfR0c>8GDbIV99zWBjEx!zLJqLj_C`G?_A*xc_U$_% z^XB}y&pu=sD&w=wbV~JP> zbk~7cpMLsjdg`gCw1uk!ZU`LU?Afz71Z_K<3EM*f`LcHK+ApY)mLAoC!TmBSMhqmAQ8TM zb#;}#`|dlk4c1;4i+I-ebEJt4R^qkSUTb<%_|ch}nPvoh;e{7sSqHrBBVwupk<&d$ z!}q%V_S>81yYIf69(w4Z=4-}z4g7o`e)wTCyI~VSmO@*^!^6YBk>M?u$B!Ss@fgt< zBGUoFy>Q_IojZ3fv9KUyL|Ta2o09VbH^#f~zH3z$gM;YH)6>&4-s@V~2~Ol<%zd%-#*Bv8W{|P z^T;EQXgwEVgWdS-v(Hi&5D#FQ?*h0%@EDOf2nZe?esOWpmH{7jF8zo1qE^|NP4$yx zIALN@z$(CtBKl>W^1^F<^2sOk`s=TU-Y6;}>sSy2=;1;3x(UfzBDSGQr%J?O%+Ag> zqi>!-zz}lS>#7Wj4RCg*=Dijv;-qTihj#!JJ%WIT$IoXv>-VM0bh#ydbY4L?^9DPkM^uc&1+C_Q(*{CT zygftAO1NbJKR0sKNU!+;A>;EV;vL+DdScV7bPBxnV)S3Oc1P7j??;>_{j$Lp_a=7` z<%wmb%Mf5gyh2ev+7I`Pj<~2PO_JtE?p zfe_FV`T6Icry`29g#};i=Ye4&K&V)C$lLIa z>*!1in=l$Aa?@7|vP#53-Zzi8TL=}YIUMfS^+sL@4h`>qooP|kH@{*EFmz3dx_V%h zod}9ZSvBTF5o8_kbD}}tOVrI46p4TS`DZejFcH_uFjQ5`3;y^fq@jW$wdu=TS?7s= z{q0`aW#HcSz>S~9P=w7IF|Fk6B~Zj%Vugr}6LP!yZv7%Igo?#j)NE_KLtuhu z&;l)CA`WU3MHSD)>;y;Rx_TUCCm>>@dMH$?%Zu8+E33((NR9bT-o(wLa|1=Kz!?

9aAImrcImb>T#5vsFQ)9-~jLG1p>}` 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 Z{s&~`oz0KZ_!0mB002ovPDHLkV1lEH!Jq&D literal 0 HcmV?d00001 diff --git a/forward.png b/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..682682e32d31ef3b4c17844ca148c7580b81c3e7 GIT binary patch literal 1638 zcmbVM_g4}M6b8ecD;lOE`dpEtp@~Wl&@9DVxpS`~L@@Q?c$zzVo}Th@3uZYG%T#cY zVyUU6SwU$_#Z_ohm^o52@zKA~J?FdM`R+O2y+7P@z8qI)I|Vs4IRF5lfU&oA6Ejl` zhK!WBqehS%g^?SXEaIJ-gP;1O@;cuv?R^J*NfK@#OPiH%=g8(63MYRwI(2xzwQd1=jebv@ z`AoRBG*;+I=J@>B_Fp9U$uL|37RU826VQS7F338lBMgjc5k15M<3<(AXg-3TnUhsd51(^S!x%0iWypy84i$*Um7?pKd z7^u1E1U^=rwsKNGTOq$(`OQC8+rW|Mi9&$ZJrG2bzdu&d_95%#rA2I`LX1t~%gctz zF*wj{O3Cg`tpHG<=s5NHVazxg0&k43X}`FIl}#mTZ+qN%a&`BHd(>AiAD-TfXE5~h zVBGrHlnwV2d}xG@-VXD_V>5<`_<5MWL;UVk2s&;dD++h2gxqc0-ZDOs!=`pL#b@;L zOTnC7Yo59#ZNO)*8Q`KY<(-3dJMgZdU>y3T>-xC~wY`K2Nyh5hK>E$$LGzWdq_aWZ z5v)9(VFrAd8RiWVxcgeMLpcqw)ZMM29IvH|=V@Sp{u48r)Ogmhceya=R^ID~6>dP= zdgpUCf%&zimzRh$B)K1>o(UvAe@G0kiW$zij=rL&f-E&Z{u3J&R;@YL=HL%N+Ecji z!(UbZ(IFXKmuWtS(YPW-hGRhDGt#G!sFU3Kq+Mj};`ugK7N`+)xgX}`?;{)j(Dvl-Dv4hnn6|S|*?oT2qwe7%ShDy9`Olwo^0{C3hNHh6voM+;CS{YO(FDpOLwAl>(?&pJpzq zvhL&n`VBZpRl}}UNavq}#=FvmE(yLe%hg2NY5u4mD+{2XJ6M)&P)ODs6uj6^P|67} zGj5%Gf`Gvz6%!rXS2q8;i#l4a<>Ys2W17?Ej;c1E@o~^gJ4avOcmyg!&`G`2;~yG4 zBviG>gfr84Qa$IutAft@sCWu8Aa;~qUXfp>WzV}@6cBoMSb6-+#OP4e?BaaA8gYnq zfwf3^a5dG0hwO7^bYE;nXZC!iDpjXcKe&$^T>_;~DI(JC;C*65kS{ordz?i}E@ zUU5V8USFxiDJi%x+0;Ifg^vYe*BJw;nr^Qo)JTewATKm|J+-4v^Eb0r bY^(hujVL#D!0cJW{aS)K?QGj<6P)osg~;F1 literal 0 HcmV?d00001 diff --git a/fullscreen-hover.png b/fullscreen-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..582407b80e8820f074a0a940c47849c08dc56d9f GIT binary patch literal 3626 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 literal 0 HcmV?d00001 diff --git a/fullscreen.png b/fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ce1265bd668c6d03b0d4363dc011807f07ac42 GIT binary patch literal 796 zcmeAS@N?(olHy`uVBq!ia0vp^8-aKO2OE%dDD6)GQk(@Ik;M!QI^H16xYTyqN}wQP zage(c!@6@aFM%AEbVpxDpw52oKZ&di3``q6T^vIy7~kG~7rRf)a|- zQ~Uzl5}04Gyk#qC-X`3_`-1Hp+Xc>$pOftGs9w0Faa`T@{N3_9KifN(UQgHFxP}90 zHX*RUdg+wSQQ=$nU7wX@JLP)h^{8W$d*cE5;uyCL*%v2d=9o89ND$@}(Z zREb(Hedio=*G+nMRQbhg{Ta!TueBfjzaUzkQD!^jlLJY$f|* z%3IDqZ(9}go44nRUvdsJZ20u&L4m03i@)=JTzK&GdD6xm-HcZr&v{?V&+9P#Vq>85 zAMImB;lZ6K zc86Ji*ktp5*R{%$v^u{XInxjQ{dDMKdHI{WGp$!{*{G*JOEPfYxf2%4G*2Xo?+{yd zsUpqgroHmxh`hzZ$~mck{gc(}Ny!Q3Z(o(&^G6Q|Z2Xmf Z8JV9;)Ohkb0uwI-gQu&X%Q~loCIAA=Ri*#{ literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 8e60042..de00596 100644 --- a/index.html +++ b/index.html @@ -31,8 +31,29 @@ +

+
+

Title

+
+

00:00:00

+
+
+
+

00:00:00

+
+
+
+ + + +
+
diff --git a/mute-hover.png b/mute-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..480d6dd2ce5ddde578a03b85aaaea29c2949c989 GIT binary patch literal 4431 zcmV-V5wPxwP)@~0drDELIAGL9O(c600d`2O+f$vv5yPbLM-b$^P53@jLIl z=Q}?`BnW~a2!bF8*UBpXhWtHQuU~O65U*dV;s=?c28}y!)UU@?+Zg zXUC2mZT~TU_BwBE{(0@8p`q2exw#ezp@@hLfM9RjxKU@Z9ilrTtx>o*lcoisZ*Fd0 z93CESjgF4CPMtcnN?ZHu#qsg+W|>7TBKBb6 z)>#m*^7b0#Q?#K#(0t&X9~l{GmMwymTExC^Iny>+1QX;AZT>#zI9D%~LC~cW@#N%W zjsL)K+-b*ztE0u=^-~sfbAEolO%75T5qqwC(#yD|gb&(9-j-O*O>zjQMeJ1-j+e-F zjX-|p2(`4Zu&_uD;G~E}yvCp|JzI1!J0)TfZ)^%JW@kh^H8pjdPmwbs-hpWIcH+#L zGv}y46kfz=u(5bQ;kz{w62WT#&K9MbQCJZpI;^d&eZr@~1_`#9VOO4|oKr{BVy|p=5_d_+3#ee6 zqMVRx5hFfu_B~5ddB`28V2q88oyfxw(A_OSS`xpr>P=D&Fr>ZRE^OO>qir6cm z!GWtJxI`^YA!jCH5wP>5Cge;+j125Wh$;y#Q{#+0!9xBoStJt?a}`1|aCvyfc4IGf z5l>A`ea<&8kx(YARxMH$F?!-i2J)1Z`qNK8-CkZ^zD5a?+SmyUWaplp+>Cq@GGTRi zc=)-bS0zeC#NMhqS4j|v+T-Kn`;r{}W_v_XQfo%(?T2QG3$uT2ADEfae^azB$G=t(3WTZt3sk@LEg1tARN zf$4qt_fW+g3x2%-7un>h+juj8ZjTMPIF$;L$(}Petx=WH# zOcE8bSB zT)0YtkUYk2JdlWohK3H4AlSj!jbm3QqoCpe*gVDL{(|Ni^w<(FS32SEd`p?fjXZ0AO!F;S^hz91np(12T8TcgJx ze_Z+c?%lh)umAkBTXS^TJV#enR+dz+MRMYuJ9iE=7fMKmZ@>MPzW(}a?dx!3*YYvi zVY)~WNyOYkCs86NeDlpW^!@kWD_=t{=CdZbhAvV>suN39LJyn|m4kx^4|YX_)BdGP zm%6UW|M_HtufF<<9)0vtrR$>fhW)|scLlFKwrx>L<8Ei^X4doUv(M5SZ@i(b3_#2u zfBdnv&IkzjgAYDX{%#yR@4x@PwSy=N_ z4h}>M-TpoQ{PW}zfBp5>wsu(*5zD~$9{dglRp&zxoZ9cZ?>@2xA_KagRlM@bD^4}? zxLvkQhejgyW-^P2JrEyo3P)Yml!qUFm~0YOt$>hSfz5PValuH$oP|ZeWELN?0#2-} zR``ugN2mr%ZAR4zR3*4&NM*+F){Wx6Ndf2gYrkQm){u=c!c8SuWMf@+E*f4gUi2Ru zIWgyuy;NdM;{%*9tXnt^5H6fQIBHE-2|-y;1+u#1#Uw1iN?dUTtnJ5?;lujr)B?j7A*` znOq~PaD8yPo|~Jq>b^nXtcW&2AX0n}ReXR@RZ$4v*#!|(&%_K9CpKPADDT7-t`Fh^ z2Hm7R79q@yQ8`hG7%@a8VmPr2a5~ufA|`d>!Z+;vDg(qDhcx4Z4je!#5$i;WGleQr z;4!j(nr9MA?DFq~HtaBygB$=I1#txom&>C15aimmYsxc#A1Q+1y*i;j@W2C9bT}cH zIq~S|XpI9j6&ZhAZ4@Bft5>hm<;$0IGmOy}rAn|6r7BYV^2;yU_dAe_w+uGc;weP} z-LNL)QMf^{e>zdBz;{v|z^b27KqfGT0%MCqMZCGWSuJ{bZES2z`&u4^3y~r2AQr$K zQHjtEpx4C%ohaeNDqI;L=X(3$@-LvoQ?)(?_;t0Y(>Y+Qt{{;P9VU8K;xKdh}#6#R}j zapDXKn;WOAIOyVp&bgz$zley4GbU^S6u}G;u~2wK#2KTj@w&9&iETv08G^d7s>}v{ z_~8fT^SV-+t|lDy{Y4~H#N7HbzP_#y9i4#T!ax1=6A9r|DwQ^FLq*Izb|T^o2wQ|u zH)Tp!Ki1WQU5YFH;)ICUBC0xZzqQqLRSR7`SQjUBqAwz$VaZlF(Ct=SPLZsVVR1Aq$e#8~=Y2Py-8b--T+Ds4f- zbxl|1(TP~Mzq(#L2WEA2;jZ?sK0`%3JUraKb?X)t8Qom7AbAjUKlbh0r+i-5>lby1 zX2DqX*C`Gaai`NMyc7F^)Kvmh1O=UkD|YIpA%UoI!VwX-{X3xzyZQNfys_{?#`02e z=g2`gAAR&u}U{#o%=`2D2K|pgWUb z0;!6yogtFWXgJ|BHfyf_{;1Fm;|x0(U2$R-v3VxmxpSxUBJRZ( zG*-Lp7a1UQte$Ce_HbBLMK{qkEJ`>s@Mm>yZf;ALeMQVJ)20%FKepcx48xBXX;&|F zQ~R+$y0tcR&RsOnPV0T#SHxT+g>9G0jeCJBqfXo}GT5qK=*Cy*TsSO0JF*%kxT_&x zdbxv(RATVQH;osjD-M~02=LiwpKbkae{DFO3+v*CD_Iz@9-F<7O_#AMtrPqB@dA#U zc65Lnn^YBaE)2r1b5}HaD-+$vCLg+a^X54cx|qg`Aht)1g}E@!Bo58wXn8%!TNsJh z%f)RHx|qg`UTpW0saBHramj^)jXDtJ+Ro=m*uu1W0c<;A*!7zob77?pjYV9kR3uU; z=oc>_Ae&AI@rG3-TykN+)t_eYIpg(-*VoruBO@b-6|%@+0Jt4m{}7XZSy~7Pb=mK} z`_5V(#_#DDBV2M}juK6O4DnshQv{}_rY@BA>Y{lBS2_(Vsi73-5?qydiyL)|+n%Qg zbUK|S5^@1@aM+apu(^5#rm1=|l8C)ho6LaD7zjA5CXAf!Qj7qI62a1%Pb3ke)P^5M zLS}?D0RuPnk-SuqXj46oWl`_O!V3<6RO`2SP<`*u8sqw@w@!<>neJ z;P&a$r%!~whhic%V<8Q6wc)$oLowkaWR?WMB5>i+(b2xc9b$_Z4Lm8g36@cIGY1)H zrFd~;!6v5q8c4+A#)2*SmDPF~_?jK!#)1u^=xSgQiyI3Tm^F1_kjT}O#EpfdKt+Pf zYKu`mlZc4LjfJFuAx3dwkl1zX_?N#$GNwWp0Jw0!jtv!wiP$@OWK4w+8_x(Mljs#i zH#Rm-;bjFA`O5Q5lgHPOc*pq_#_@Dd=M-4@8AC?-+hS$K>^2z z*V%;!UUAim6Z@PwbLNzEf(ROB2g$*`SQRlqtdM*x^a5jJgPWm*ur6YBf^<5a*GUj) zD+edqUb2>nd%1Gu%Ks!E3(P9#;Db@eM)V^U5rdVLmCGz-OiZnlP)aJ5%0F4amnmUV z6ER>RH(AIJ@!e#v&LR|n+0&;_&yxkLXW}3m8ynLk7qTfEvq?7Of@E^h=0>A2F)}i8 zfy9x^fK>s5%&t6s^yty*?c2Ap085nwS6N~KH^?%Xi5Q5GohB6lgG@yXM95B(nt(y- z4Z9$y8UFqE-}^`!d#*5>rhq}JB{m(cR%?CFo<0BOI^tve@G%mKiuFdEip=9gkRwNq z%<#=g5{kwN4EUl9$b}R4;&q5f&t7prSMoo&BjXFoh}?-7ctXDBO>vToKjsu~p_7A2 zj0qlu%o}z(_|$Zc|C64RVVt>TX>4q4U($nl;*h&ctYUI<5`*iHlaL3nK+bGd`Bz0Q z<3x}vSFZf$z<~qT=}tGb#EXnzBWZCx|Mi81g%iPuxW^<|1`) z{X&ipZ_UlkwJB#5B2EP1UcLs4`K0vn*~g!Wk<@%R8x&H+0NvG{PG^Si9wxyC$iAOu z(RmS-!iw1E*s)`^&CSiT;>yW^iJYGMwy6LVUc^2UF$TvI?`)oLv?1OG={zDuV zF`MJB#53q}Qd!}gh=G@v8zSa#iY{IsCq>+g#Ek6}H8$vQUc^40m=Bludem6t5ncI9 zu87yCG$Qu#OLP3kJX8jEhU@b8JU>1@zG!lZ*&uq5^hndyadNw{r^%3#FRsB_dXU$iX*o>3WV`y2bkj(Kb0MG+m7f zCWwd)n4X@VxN+k~o$fgFUf!ydo?AnlZEpnGHI4|a(b3UXnME5!L_7eKlasYdr82>e z-5nyzLVJ+z2%LJ{yQ=y4s<(CPwfufm4_5j1I&Tmyrv0>v()B9{f*=TjAP7Qs{2x{= VJtOvnkT(DT002ovPDHLkV1j=AF*pDK literal 0 HcmV?d00001 diff --git a/mute.png b/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd5db014e7595f18d2069d9c09d1c10204e5d57 GIT binary patch literal 1540 zcmbVM`9Bj37#|n2`Dt+J52gO(w!IfpIF zoJ)9(oNc4XUavHApR;%Vg`UsndA`r}eV)(f`Qf>L#mQDiN>K^`0La+e*|-R>UZ8an zVgh?1IvXhf$tXL|+W>&>}@PvUN@T+7hmo`BL4o1FpzQVSD*2HSJEKR^pem0WLxu zsYkKm{f3TTbwS4J?CCJEAcoYrY&ZlM{FXOVclLnrb#jcL6mIK7+v0**-A zKXpOL3z$5W=@(_;^`nL%u9p(YGxBrr{Cka3$5zeQ^7u4w+j@TMk2&V~5R$MV4on>x zN#KP~Y^P5nQnkE_fQ%>ld8!dG9<;Z~&{7eirmM4%OMjo;A{_U`4^Bsq*?H+&K zgso3GPGKl@pu-b(uDs=b`$C?Os{hpZ8s=iy?+GmoR2|+u&40eP*vP7J`hGBdljiH= zv#-P32`B9Vyw9Lhl(-ZZmw^#DS+T4Wwj?@1rYe&;p zaWmB93{w-aXG-rqLL`Fd*EUr;rq+bsK~dO2YvsW`yq;Bc%#YZ#h2ez!0K)v4{(E#ZaBpR8c82qP zLxUwX9>Fm3Mp02y;2u^wGn%jxlIQ09tc7hM=V0p(^z!v##CfbWW{f+qD^QVGc6NwK zp6bA)%wjX{p9uo?Y|?gq_&y%9{-t2p2{TM+$t`U#ViI}8)!*|<)VsSHR7aE4iQ*so z!Wmvm&dyoOAbP3v*Zy&XNpLx@p_~W4cNDn%ZulTiT~dQScWidXQw~@rVlT0h+Bvz> zw~Y=U@dHWjDqIV*j5v=LM623yox`dr%%+k?y!ucuHfytwj9~p(qW;-_zz9Ke>O7nv*clj9I__T>9OT7AjUJpRdF%8HR7~{->{p10NKV{g+JmYu7nL zu)n(15Qzb#c|>cI$DPNaYJn3Y@_~#8p6DI(p^_uIqg|Ah5JFh;2%2y2W#jlgjfzfz z_Qs>DyQqZ$p3-T4ohhSQ6v5@HdXvkOB~l8^2MS2@pFcFKL>W@fR?i4mG0JV-g(8|tO5j8>A5!vmE-Rdm_PLi4@t5~ XVvSG7)@8tsnunqNMJJmYD`eXLNjk|a literal 0 HcmV?d00001 diff --git a/pause-hover.png b/pause-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..1197a2fef3815024a69c694541c2977b1e0b6043 GIT binary patch literal 3246 zcmV;f3{mrmP)@~0drDELIAGL9O(c600d`2O+f$vv5yP8dkqA=A4-H);)FMmAR6IEiMw3r%J6epgr5zHIZy zym~s%&%fnIp1)r{5{c~3&(G%wnnH*zkiZrSg*0!bIB@4UWGQM8PLJdy=%rF=t-HHB z7mLMmb8~b11Sb&UIwmJ4lN^{dSHepi*fjYYSgR!1S^oLf;_-Mk%%Mhz6%KBi1MxFI zZjzp%ZAt>ozj!Ztdwa8CYe7OC;!1G2r_FE(64W{J{P%gzef3Hh0v);#kB^T_Un>=N zy2FCoNRI!mzjL6o3kwT*>Oi3hv8uWcRF4}<{7bvcj};DcmO4mBhggj&+zV0FwM6=7 zZlP9|mX?;O19W7F5njt=Tzb~@Fn3gl5#F{L9p;V+@!h+3@9|sY48rS3o*(xY7Z;zC zL5vTv9I$bCf8)&*fh*Jj;H)X58ODZKT8D#!gWvdVFhkLrB+q&Xu)jMl+dvJmOA z&Q;l{5X+hduDnmfJk}c^ZL6{|A)c6+xG4cf^$nDkRayHGt6{STvPqx|8Nrw%O=ulr zX&<=veMT60(2k5?^!4@K*I@~$wjq|Gvr?(_4DEx~v}i9Pq#-r>u!;a{Pu?k4rQlG2 zqNEuJduHgJmHnTaN$CJb8~ZtT;|)_37JafnH_CbK0zS%ySuwDyM0w6UqY;|y7LDC z5ar|X_<1*1zjc$xs+Ln4hyStZ>eZ_>G&Dp50|O_Y*W#H*+TGoy_4Rey*w`Q^{N7(c zk_QI|l84LW63;6!w-Ku*o=!A2Hb%E@-Kra;M)vmh=;6bMCm(g+p9Wkz-O1AfJ9QwJ zA;a9baf5E(zD+$nJ+@va0laweBE5e7nm&B^VEJ`^?@try(b3U0KG4gPL!PZCmNtS6 zTv91-<=3xYr*=uOrlzJWS5&|ErxR{7pUT7+Ipj%*dfu z`n^BRNPqm49P%W@>cq|@8Aht21i}q+fYz!y`n^9L$(8x#Om=d>^$@F5Rg9d_kWjfr z0`>j(-;+-J)0m^S!u1eKpF@Unt14Cu4i1t|`_tITCCR8wu7+5RMkEQqCOJ>9-4jk- z3$dxA5ugusbyM413$fe}g8-aK@w>V0<0)4{ENdfhiB)jP1G@)#u7tR&tIODfIna)r z`EIKkI}R~d;SAwgY2dDVcB--C5OWnqFAQ$8RgE2mSXJR90l3d{HFgx@NF?$r0eHi5 zHEuh^>Nc}!0`QKdYTR~+Il!pG;5AFtxUCSY8^B};z`NY?hnmO_kC z3DC*Mj~~C8udozi9v?nO0Gi-De$yGC5`&4pDXJ|)JT*0iei*b;J5ts%#GgNZP7;7# z5^BWkM9UDPl>i-8kC?R#F%IfLQ_0GPl}e2D5}+NPx%*mNt&C3Kzz%fuU1g(bh~-QU z0?-h52-YfbEEYo*23>tEu%6wF5x`@K${LEMAug3lNdnMRu~=*!Vm<;yPYl}P;osIF zCY+808siBMOCbi(memj^2|!boi8xeZFdjk-#zTm~cnC2V4!h(Duf(+WJZgs6pb|A!{qn*k|%Mf$oa|ECn9y!Zbwp)gn`{K6*pqWS{ z^0l~HX(v#LK|35`>pgK#PY*&2y4jzfpSNC#3xz_S05np2oYpeL%gf7Bwo#2iCp*=j zSiRlB8Ubj6^O&vv-0GruRASIZ^~l7@=T=^HbaeEb0Q8VkGs$0B3bE>o^8^sEdXsN< z?(O`700LGohn7PejYiQ@K;Yu>c((RA%ONfni&Dn17zhHxtwgr6hPayL5KCW-#Xt}w z&fiMC=WShgqFgSo5I}IU^`5j9Vl~u;mI8bytwin6T7|6;tCk{506uHfN(kGRvEpy` zI|2AF+vpE$hnP!xme5jwkGOCyH) zLW~1E@C)Z`w$<0PeSKmp-yFaRslu^XtmSftwnHo>9@Q8;R(G1YmZK}hqZ)&ktmey6 zh*6EfE3JmrsyV)A2dXi6!A`CmhZxluJTPmu3JX{6o`h-)Zjlj*NF=gs=QXZ`7}Xfu zA_dV-6&9}D$BuV?hp?ss98j}!%Vd*lAy&UVSW^LQQ-#nrSMMk)YbxZoi2!U;Luy%S zgR3D{Ybx6MZPLNJckjqedwYAN)BbcNh0n?0fa~{mmfxo1<6|S+irw8^a!a95pf_*c zkWTy4RXYcB)jYXD`O(qQjEQZ9gutyJ?Ck8c{2IUarz6!yERzGCgxKV^;^oVid|8WF*a-NivAM#Y?yb2M6V{NtRzHuaQ96?REX$pC)FXJbAKA zF6bhUO-@cG`9N=#A4xJye}6v>4Gq!Q*cc5A4Ac#nR6+^S`uaL;Y;2Gde(x_RGP}zG zzDzFhJj7yrd_2WJ_#XtJr~2T_PDUeYdD>1?Y;SM>m;2*CdGi`UnC){Pe9_GS3tvJk zxIcbn;(;ExCmN0Z!U29oF7qwKLJsse$baF@6hYX?f!qRlz>{&}W)2SzrwKQ*37gr) z#l;!&h%X0rwKADZqPMqql~9qxz|#PWKte1`9(n`IRye>J@>pOY76@`j^CiF{&=3m* zxg+@&VB!0LT`d_i{PgM5dBVY7r>yuAr_mPn>h~h3;sv^ zjrhX}gt$Vc zt@(e%uL!esl`HW$y_{4~IxfUQmUouRD$rwQXpm zqeEOx^~_S4(-cl}kw=-zU+I+aR)i+R6{^*czWGuZsWS`PjoRXVM4 zmCo_cw#GkOmRp5vr?v`KAjB5PC`X}CNYj@JeU83dZ`rSEE#Z`*up9?=hbwI^7K`P= z9NJn4u>*3++GsSI;EH{+M3jT}1E~v&S5@z1gO~5CM`eklj2`Us$G7~D(8_5)Ia8*7 g0RR9103bO31BX#$B3>{uCjbBd07*qoM6N<$g7Q!fX8-^I literal 0 HcmV?d00001 diff --git a/pause.png b/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..5c98f69c47fd6078ec106ce8737d0012dc6f6c7e GIT binary patch literal 666 zcmeAS@N?(olHy`uVBq!ia0vp^8-aKO2OE%dDD6)GQk(@Ik;M!QI^H16xYTyqN}wQP zage(c!@6@aFM%AEbVpxDpw52oKZ&di3{3i-E{-7;jBl@B^py@2alPoSwSZ;1180el z6{qS_W(`GI3)u;LYRN|@I&eAOP|p5Vq5HD#=B1xEtEL?XnuZ-%%v$!cY+wFo+q2(| z{@yMSSRHC(s+argIo-W5OoB+hwxsTzB<0#n)Ld}9r9kH_D)q=1xoy85}Sb4q9e E06p^%@~0drDELIAGL9O(c600d`2O+f$vv5yPBGss%sI%X^A~?In!2Hf>E-EI{!SEI9D&YAhdH5kB^T_ zu9b>AX_>gasPWHwhJ~)q&CS)xLY$FURo&An<2nid(a!U+z%p0KBCM8JbrnuJRCRqJ z`I#fs!uj*(=g9)Blo;~*M*7mzrps)V#E>^MM$2rC#K(^xKglnVQ;;_jbv{m=J9q99 z8HDi?%YcpL{hCip1Y$uA0H;mqW*956M2GeD^{@G5utFdyrno9kljayHF``4N$U>w; zI#*?*B$hP|TzN0J-0RH{ZL6{|5+6Hu?1%`A>YFKAR%PuaR&BG>a!NoKq=PX-nxM7B z5+6AGULb12~zum?B^ba!p}n-@bjnUB7<)8fAbs63YPYx#yny7oS!Ln8;xknONjSN*OIA zRvn0|d|D=8GUY5p&Rk;YKx}MmEb-}H0ya>7@x>R5Eb?VaiA*I{Ei|dXMFKWaN>k*_ zB!#_RB(ZlV)TJs$OlU|I?w5fFAu;6Rk3VkZX%LAE^6E_? ziCtpO!57F7#>U1dD)NW$>8GF4n{U2JAT+Hl$tWbT#tGGpI6{W->Z`A|B0(HTMc=b$ z58b_c7x5w-rTzQ&FY>f>odObDC6;akIevlXfddCx@j|LI2#(s_G%&GAEce48&=UBI zFTOy$2uF!u%>$38Vu=&7HiF;GkzshVaY=x95t^4@dF7R}*REY_`2B=fDlzv=jTy|P z3F1X4@A=s1C@ zaU_XV6)qC+g~W?bKKTUk!XLh?aU_Xzx!h3#fk3?Qjqhq4T4HsZ*)oApNW72(@uDxj zs&QzESzuJ*h)6X?yy%OsY8*;pbpx0Rfyju!A~NDdPu?2zgisP=b}n8dQXpRRq%>#~ z@30b=3B(TKMRx`j&A<}Nt+)tnwZ!n^g|y?qLs;TczX4ugiFtBkU`7GakVqjDBN8t_ z3mM>5dVMgE#QcjL#egn7Bwk2Q8S$cj@eCyK&Ye4rS@3QPh!+o$aagZN5lCX5p+l6& z054v+zDBuMqzEK2x)Ry)#v5-q9WQ!C3f~f|UL9_Zm@y)-tWkC`Ui69-z9q&qvp$H( zuEqSt?tILb#Og|BNUR}VypZb!U4V<}UvjZ8iJQ$P1lAZ4 z`NI!CbR}LCJ9DuwiP4oX1Bn;18AqUfFYsl-?>VG&-uFnxD>p1FHeT>W$>FtD=>OLn(^ z+&k$jv0TYPz*;0;NGs07c)aC&ZEAiIW zR*`@+m=-S@jmBV!c?5_|>=<6WFkvSmZvPIJm~c6glXz<{bcZKAd`S!(Mf%CQPgVPs zxJbZRbRXz>6LF}-peLrZ-5@dOi45-KUVOR(i9ui1*49XOATj8P2n>mV(cHRqi%g)e z#60?2CEzTzT8(rjpU>Cj?VuSuNbD#}OG~Z81O~+kNbDf@@872@SFVsL4E6h<#0jp( z1l&O)#KOXY5d%7=F8}E(G2(<mwPmw=qFC-J@*I(Vo7}1221Qe6Yt!)vxYXCx!4jPI#`{Zo%LUddE{Cj9v&uO z9x`zu9SGZyaa#NP1D9g*U$K;JL<)nDmYKB9Y!p~=v;7@EnOH`Gi)=r(v@!roEOZQ}>|{H8qp`2w#^csa#wq zpdI(_-J{Px|J)UU|1zi({Kg5%A(#0JoFt$PuEd9S#KX?Vd`q0q=P&W>9VFHOi4U@H zUH5C?l3-+Hq}utIZ;2a?MvZeZ76WCB#0PHlTit!=1t)>3w}!YK-U}#GX!G8 ziw|-@;O(%$b@l4slTZ?4fEOQLd@yO}oit(3rUyMIY@BF)aUS5634{jmp+8cE3x&d^ zLC*`l$+nbuRO4_UKKQ2VG;=4RE3trT92|)cGI=4B7@$9XqJ$9Xb_b}&!T9N?pIZ4B z0uN?TTdkc)m00~_sKx`3$RODlgE#;9t-?a&8_%E`_ebJ`OdUhuKur6s!b0RqET9^9 z$FN=3wLm%&5+#CsPAsS?58+X> zbMq9C*lxzC{(8=k!$^EU_aQt|2q^@yRboNbR6O?BV@FNd&-m`$yA&6u-LyqFR7m*Mxv%I`qf8m7}9_MfBWzrlG@R?_xq20T8 zQy65!lCQq{idI%u2!tn>%bf~ag-gDLszA_I`k_ri1#OulK0PN*0$PZ3B& zVv}NpRO2AK=pa7CN7NYM5qq5QkXW&A-#)q7N0~H7vawtaR4SEZhnb$wLwtxAjuCHj z6^^`@N#b{uIez^3Rg-4(MC7rtG1{|dPb(|0udmauzy8{4pSiMWUrJ1$J9lo1Vjyve zPnzV;wIgmWkWBapT4c=i}e_ z^e_RJS>+sjAn4kNL8KzFaQ*uAYo-kJKr-a>`S)4iYZNo7Ni49)RTla0e2SacxW_c- z;5kZw#4~Xx8yg#wgd5qoMr@skZe()P=1Qe9Iy^jll~9pgAW?yZ%i3KI{O?8PA?$o3yvY1D$g~)U~llj1|7yQz6iGN9lOu5X-K^AuH+VyY^Zrr%>pZ)vy-=T-o)QA@uA+L(u&wu^=`SSyJ zZ%-2=Bo>yJmuoEYW&R~TPFQo1I&%L)jt}q8&d%0JGmMB6o$xGQg=IdCS-#})uEdD4 zFGSK9Q;FL_RZa!TzW*E<8TsIwZ@&43G{(qE+|ImsUhe8`2Is`}Q+0F0N| z0}&%SO5SOmqeC~Wk=R3~t@(e1F*|eWfVUG*)a|6Q!a9isS>D-fHYs;VWq?# zlarI9jYi`LV#an%jSao9TH@bkk|*(dA?`FwtqD|Ty%D2w(tdMG%xRqtYtPhVAsx5QDp2dn({ s4j&?|T=r8lW$G6I000000FWL31CqG57L;8GR{#J207*qoM6N<$f;!$T3jhEB literal 0 HcmV?d00001 diff --git a/play2.png b/play2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad8a8f2fde40780e68b56cc85bc3e4508bffa9a GIT binary patch literal 1167 zcmZuwYfMuI6mCI5K`6D=I#Fvo9&;i^5D>X5(A)|Lx5#603@C-EjAWE{z_8}>kYx52 z#Hu)KftInrm`m2mB=R(h)IFf1AafleYA-_R)CydrR1kLg?@7M%<@<8ZcYYn&abC2W z%T5;pf#4P!1190zhU3O2C%i`%$ptuV7R96%5D0#8>mas#QhOaYi3Lf~9D-(OmjxFa za-yIpd{gealC=?+Ua??Q${FIT2~(nH^p4+6CzRAk=dP_++(jGDxnIS5+y1>Nf+V7q zkRCM?X*@U4cPiBRgH)$;!?DFZHXtY*9&CO3a^*wS5E)N@e^F17;no-3qYGwR;r!E@ z!bgSH(XP+^w&&eVX*p8{nQx6-laD}m|85R2Jg`5yJ@m0NJz$&t^aSHsQJGVG-+mum zNT^EEr`RJjmHcu9%T9^7->bU6T35Jg(YyY3>0XcZ{G01RtcyZx=-hCv<*|#s69jsF zRNqO&0F&K7n!YbamTuH$@pm;KB(1EJpT5DFflhY83Yu@<_aK};I1`a9tms3Qmg)jn zPTuI;bBQ>Y|1v>0IndE2Y4at^wKDce46OzMH%XF$mhXk;9%Ma<)QygU^!dOu+sFyY zYO1~J^58QrQ+=ySntAb1-%SuGffTefS?3lxb}wik!9$$NR?s50iY0Y3jfs4xHL_TV z-&^%Xe^t^L=*~kUhAPIBrbI8Yu_@MkT7z+PMSo)1-x&BvC)<8obhD1e)Fe}a)+tR* zdw9pj(Y*<;F6B2IZ2r$eq}gCTdJRM=kGUT%pcs-pHyWgn z5Vd#3nKKR$bC~LDauU{5U8$g8!$-MTR!x0pX>sBh{I3_H6Jw!<<8lWpxMtE6M zKrx#A-{#P***;+UwN$+nng(~D4yK26$p(w*LG`41F#Q%luRObG^U%uzr|g&R^nQef ziljd1{BygAZ5uCEg(YssOq-eh{gZI#rcwbfzR^DG5IWbM!Cjl>c>;qF07=-rtf?vQ zFDP>h?WV;ES=hk?686$URd~J!Z>6c$Ykr?-y70dW@>1NR8+1qT@oe|1A8XyPOoGlO{h;Gsd0d zZPB`6rk@_``UB}l18j)&!e8*SrEX35tHq9iHC1_AGacnte|7JFdMWBx@wz$2@SqVcjct{!c1c+lSdGOkzyEV_R}iq~P_uWa S$@~0drDELIAGL9O(c600d`2O+f$vv5yPv!( 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 literal 0 HcmV?d00001 diff --git a/vr180-player.css b/vr180-player.css index 518c7c5..39dffe4 100644 --- a/vr180-player.css +++ b/vr180-player.css @@ -51,3 +51,214 @@ height: 100px; } } + +/* 2D Video Controls Panel */ +#panel { + position: absolute; + bottom: 10%; + left: 50%; + transform: translateX(-50%); + max-width: 1000px; + padding: 20px; + border-radius: 30px; + background: rgba(0, 0, 0, 0.70); + color: #fff; + font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + z-index: 100; + opacity: 0; + visibility: hidden; + transition: opacity 0.3s ease, visibility 0.3s ease; + pointer-events: none; +} + +#panel.visible { + opacity: 1; + visibility: visible; + pointer-events: auto; +} + +#panel img { + width: 100%; + height: auto; +} + +#status { + margin: 0 12px 12px 12px; +} + +#video-title { + text-align: center; + margin: 0 0 16px 0; + font-size: 1rem; + font-weight: 500; +} + +#current-time, +#total-time { + margin: 0; + font-size: 0.875rem; + font-variant-numeric: tabular-nums; +} + +#progress { + display: grid; + grid-template-columns: min-content 1fr min-content; + grid-gap: 8px; + align-items: center; +} + +#bar { + width: 100%; + height: 4px; + border-radius: 2px; + background: #666; + cursor: pointer; + position: relative; +} + +#played { + border-radius: 2px; + background: #fff; + height: 4px; + width: 0%; + transition: width 0.1s ease; +} + +#controls { + display: grid; + grid-template-areas: "full lflex nav rflex mute"; + grid-template-columns: 44px 1fr 156px 1fr 44px; + height: 44px; +} + +#panel button { + all: unset; + cursor: pointer; + border-radius: 4px; + transition: opacity 0.15s ease-in-out; +} + +#panel button:hover { + opacity: 0.8; +} + +#fullscreen { + grid-area: full; + width: 44px; + height: 44px; + background-image: url(fullscreen.png); + background-size: 44px 44px; + background-repeat: no-repeat; + background-position: center; + transition: background-image 0.15s ease-in-out; +} + +#fullscreen:hover { + background-image: url(fullscreen-hover.png); +} + +#mute { + grid-area: mute; + width: 44px; + height: 44px; + background-image: url(mute.png); + background-size: 44px 44px; + background-repeat: no-repeat; + background-position: center; + transition: background-image 0.15s ease-in-out; +} + +#mute:hover { + background-image: url(mute-hover.png); +} + +#nav { + grid-area: nav; + display: grid; + grid-template-columns: 44px 44px 44px; + grid-gap: 12px; + height: 44px; +} + +#back { + width: 44px; + height: 44px; + background-image: url(back.png); + background-size: 44px 44px; + background-repeat: no-repeat; + background-position: center; + transition: background-image 0.15s ease-in-out; +} + +#back:hover { + background-image: url(back-hover.png); +} + +#play2 { + width: 44px; + height: 44px; + background-image: url(play2.png); + background-size: 44px 44px; + background-repeat: no-repeat; + background-position: center; + transition: background-image 0.15s ease-in-out; +} + +#play2:hover { + background-image: url(play2-hover.png); +} + +#play2.paused { + background-image: url(play2.png); +} + +#play2.paused:hover { + background-image: url(play2-hover.png); +} + +#play2.playing { + background-image: url(pause2.png); +} + +#play2.playing:hover { + background-image: url(pause2-hover.png); +} + +#forward { + width: 44px; + height: 44px; + background-image: url(forward.png); + background-size: 44px 44px; + background-repeat: no-repeat; + background-position: center; + transition: background-image 0.15s ease-in-out; +} + +#forward:hover { + background-image: url(forward-hover.png); +} + +/* Responsive adjustments for 2D controls */ +@media (max-width: 600px) { + #panel { + max-width: 90%; + padding: 16px; + } + + #controls { + grid-template-columns: 36px 1fr 132px 1fr 36px; + height: 36px; + } + + #fullscreen, #mute, #back, #play2, #forward { + width: 36px; + height: 36px; + background-size: 36px 36px; + } + + #nav { + grid-template-columns: 36px 36px 36px; + grid-gap: 8px; + height: 36px; + } +} diff --git a/vr180-player.js b/vr180-player.js index 329fb27..7628bb9 100644 --- a/vr180-player.js +++ b/vr180-player.js @@ -8,6 +8,13 @@ const tempMatrix = new THREE.Matrix4(); let videoElement, playBtn; let frameCounter = 0; +// 2D Control Panel Elements +let controlPanel, videoTitle, currentTimeDisplay, totalTimeDisplay, progressBar, playedBar; +let fullscreenBtn, backBtn, play2Btn, forwardBtn, muteBtn; +let controlPanelTimeout; +let isControlPanelVisible = false; +const CONTROL_PANEL_HIDE_DELAY = 5000; // 5 seconds + let isXrLoopActive = false; let is2DMode = false; let vrControlPanel; @@ -547,6 +554,7 @@ function init() { updateSeekBarAppearance(); updateVRPlayPauseButtonIcon(); updateVRVolumeButtonIcon(); + update2DControlPanel(); }; video.oncanplaythrough = () => { if (playBtn && video.readyState >= video.HAVE_FUTURE_DATA) { @@ -557,13 +565,16 @@ function init() { video.ontimeupdate = () => { if (isFinite(video.duration)) { updateSeekBarAppearance(); + update2DControlPanel(); } }; video.onplaying = () => { updateVRPlayPauseButtonIcon(); + update2DPlayPauseButton(); }; video.onpause = () => { updateVRPlayPauseButtonIcon(); + update2DPlayPauseButton(); }; video.onerror = (e) => { const videoError = video.error; @@ -573,7 +584,11 @@ function init() { }; video.addEventListener('ended', onVideoEnded); video.addEventListener('volumechange', updateVRVolumeButtonIcon); + video.addEventListener('volumechange', update2DMuteButton); } + + // Initialize 2D control panel + init2DControlPanel(); } catch (e) { console.error("INIT_ERROR (Phase 3 - Event Listeners):", e); } @@ -845,6 +860,191 @@ function render2D() { requestAnimationFrame(render2D); } +// 2D Control Panel Functions +function init2DControlPanel() { + // Get references to 2D control elements + controlPanel = document.getElementById('panel'); + videoTitle = document.getElementById('video-title'); + currentTimeDisplay = document.getElementById('current-time'); + totalTimeDisplay = document.getElementById('total-time'); + progressBar = document.getElementById('bar'); + playedBar = document.getElementById('played'); + fullscreenBtn = document.getElementById('fullscreen'); + backBtn = document.getElementById('back'); + play2Btn = document.getElementById('play2'); + forwardBtn = document.getElementById('forward'); + muteBtn = document.getElementById('mute'); + + if (!controlPanel) { + console.error("2D Control panel not found"); + return; + } + + // Set initial video title + if (videoTitle && video) { + const title = video.getAttribute('title') || + video.querySelector('source')?.src.split('/').pop()?.split('.')[0].replace(/-/g, ' ') || + "Demo Video"; + videoTitle.textContent = title; + } + + // Add event listeners for 2D controls + if (fullscreenBtn) { + fullscreenBtn.addEventListener('click', toggle2DFullscreen); + } + + if (backBtn) { + backBtn.addEventListener('click', () => { + if (video) { + video.currentTime = Math.max(0, video.currentTime - 15); + } + show2DControlPanel(); + }); + } + + if (play2Btn) { + play2Btn.addEventListener('click', () => { + togglePlayPause(); + show2DControlPanel(); + }); + } + + if (forwardBtn) { + forwardBtn.addEventListener('click', () => { + if (video && isFinite(video.duration)) { + video.currentTime = Math.min(video.duration, video.currentTime + 15); + } + show2DControlPanel(); + }); + } + + if (muteBtn) { + muteBtn.addEventListener('click', () => { + if (video) { + video.muted = !video.muted; + } + show2DControlPanel(); + }); + } + + if (progressBar) { + progressBar.addEventListener('click', (e) => { + if (video && isFinite(video.duration)) { + const rect = progressBar.getBoundingClientRect(); + const clickX = e.clientX - rect.left; + const progress = clickX / rect.width; + video.currentTime = progress * video.duration; + } + show2DControlPanel(); + }); + } + + // Add mouse movement listener for 2D mode + document.addEventListener('mousemove', on2DMouseMove); + document.addEventListener('touchstart', on2DTouchStart); +} + +function show2DControlPanel() { + if (!is2DMode || !controlPanel) return; + + clearTimeout(controlPanelTimeout); + controlPanel.classList.add('visible'); + isControlPanelVisible = true; + + controlPanelTimeout = setTimeout(hide2DControlPanel, CONTROL_PANEL_HIDE_DELAY); +} + +function hide2DControlPanel() { + if (!controlPanel) return; + + clearTimeout(controlPanelTimeout); + controlPanel.classList.remove('visible'); + isControlPanelVisible = false; +} + +function on2DMouseMove() { + if (is2DMode) { + show2DControlPanel(); + } +} + +function on2DTouchStart() { + if (is2DMode) { + show2DControlPanel(); + } +} + +function update2DControlPanel() { + if (!is2DMode || !video) return; + + // Update time displays + if (currentTimeDisplay) { + currentTimeDisplay.textContent = formatTime(video.currentTime); + } + + if (totalTimeDisplay && isFinite(video.duration)) { + totalTimeDisplay.textContent = formatTime(video.duration); + } + + // Update progress bar + if (playedBar && isFinite(video.duration) && video.duration > 0) { + const progress = (video.currentTime / video.duration) * 100; + playedBar.style.width = `${progress}%`; + } +} + +function update2DPlayPauseButton() { + if (!is2DMode || !play2Btn || !video) return; + + if (video.paused || video.ended) { + play2Btn.classList.remove('playing'); + play2Btn.classList.add('paused'); + } else { + play2Btn.classList.remove('paused'); + play2Btn.classList.add('playing'); + } +} + +function update2DMuteButton() { + if (!is2DMode || !muteBtn || !video) return; + + // The CSS will handle the visual state based on the muted property + // We could add classes here if needed for different mute states +} + +function toggle2DFullscreen() { + if (!document.fullscreenElement) { + // Enter fullscreen + const container = document.getElementById('vr-container'); + if (container && container.requestFullscreen) { + container.requestFullscreen().catch(err => { + console.error('Error attempting to enable fullscreen:', err); + }); + } + } else { + // Exit fullscreen + if (document.exitFullscreen) { + document.exitFullscreen().catch(err => { + console.error('Error attempting to exit fullscreen:', err); + }); + } + } +} + +function formatTime(seconds) { + if (!isFinite(seconds)) return '00:00:00'; + + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + const secs = Math.floor(seconds % 60); + + if (hours > 0) { + return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } else { + return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } +} + function hidePlayButton() { if (playBtn) { playBtn.classList.add('hidden'); @@ -895,6 +1095,9 @@ function resetToOriginalState() { is2DMode = false; remove2DEventListeners(); + // Hide 2D control panel + hide2DControlPanel(); + // Reset camera rotation cameraRotation = { yaw: 0, pitch: 0 }; cameraVelocity = { yaw: 0, pitch: 0 }; @@ -1050,6 +1253,9 @@ function start2DMode() { // Add event listeners for 2D controls add2DEventListeners(); + // Show 2D control panel + show2DControlPanel(); + // Start 2D render loop render2D(); }