From 849404f78abab1cc7136c004c799c73012a092db Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 3 Sep 2025 06:00:45 +1000 Subject: [PATCH] test panels/animations, fix colorspace in shader --- assets/gui.frag.spv | Bin 5408 -> 5664 bytes src/editor/editor.d | 107 ++++++++++++++++++++++++++++++++++++-- src/editor/ui.d | 2 + src/editor/widgets.d | 25 +++++++-- src/shaders/gui.frag.glsl | 2 +- 5 files changed, 129 insertions(+), 7 deletions(-) diff --git a/assets/gui.frag.spv b/assets/gui.frag.spv index 7e9ac869fb0b31d5de7f11d3cfbbb15691485762..8da6167e938f635834479cb65b578df2ed23e778 100644 GIT binary patch literal 5664 zcmZve`FEUU6~~`;X3{Otow8_6TC1&KrBYfr6=-OhP>pm+1ze}o%p@I}%*2^VS=@?P zMMbPui@TLd5mBsA0Tl{bcZ&<^PyQh;=jieCdFOqSw{v`RzUSWW_ul6|`!mVSUOgui zW`zaeqVTuS{uYPXVHWO!(3RN1q2ZzR%~pB+#%r%Okbs}{n6()ehxS-qEGBsmvj z8>Mn}swwXZ%i(+LLyWl8pofi=MbCw0*pd2p(q;vIx!P=D;DumLvp(9YRhm?3Yj430 zG)iOrrB-PNE8Rt&njdxQ3<)itXztC_p_v@lx!i0OoktgcwsRNN;(WT;6?NB1Jv*-$ zD-av0H)@qeF-~#1UKg?KnB(}|>qe>Ctdt$k+@z1WX#4ApGId%9sv`$y=9x>*&p^L( zo)a+BHH(v_a=BU?Ln4+BJFzosmJjcQPnH^`i8TJ64qoiw`!3*x!04vzPQP|x~M~2ZGdknudVHSnO6?0e+i!V zwg;@Bu6I>#tOxErRTJ`gsc%j%>U^xec@gGVYjGOOV{N+xYaR7o_|nu@Uk>lZ_5i;t zQ@*NAr}-NAtTb-F>oRfqwczFR-CJ!h-;~4;-*go{+wW#zPK5E5yzstz#^YS0wMG`s z;|4UxV4E!|_uQyCkDIVPDR&(5t-w0A@57oakK-J`=S#+I{x0Ai#P+-K-LuH|;Ky|x z#q4@jRGoj{jeHUgVyO z{tP$1GsBJh+nUYyw>8U)8E*T19lYGZ{awwrZ)CXb{SA$A`H>Fp?_-QRzM~!dSO-6z z;nwrFF}9cc+Zg#0{1YAgWCuUh!Tl}Ewm;j!&!xPNUFgHV8Te*w1vjt=>c zk;m9}eD~}K?adtoY6IZ@RJ$eBy>s1+#=IS17FY|`0dr!_x8i4Oz74LHtvLi&&(?f9 zJX_P8U5vr`-wN#0oEtfLo+~xyJ&fI(==|S}bsV;NN2*7D8{Brz%lPfU9Q9b|UHGn_ z?__NEZv3{MOU|o2=D!!;{M{htzYo8y=Yr>1?wCEx_8Ir8l;|P&rrOqZ-4EJ&F6>MB z_1q+5BVZx$&RExa`+&8*SH@$V3VwDEM&Yi%ddwNaw_SHy{{X)0zX7{ZO;+JnX$dZ54>~`ar7pu}gjU z9|UoH*}M;>u?MK-etsC(Rz24L2)^~#fLQ-9zIv>GAAYQ#&HE_2u~`3p{KG&!-rJAi zyT`V(e{-Ct@1n7|ejiWt3(w{!(A49&9>BL=C7{1)` z9mm>doX?l=9ka2AvGRC7zl^^S90k^}tvTjCh&3MTd=)=?KfeYa0O~R4>-e^d_wyV0 z?%f99ow1EM*7tYDcx?Mkd^Ka|?-sz1Z)9$H5cn z-F+g}Jm22k?_>SEyT-l;)V#a;)_D^9LvT9fPho!q&Vbvf`waG3V2*m+uOH*Pzs~{d zcusx-)NiNVV(d?WZPlHZ<5zReaU5D}zKDGZSn~y7O>6uNyaa52Hs#l+^?wdu4%Cf5 zk5!9pe}S(S`7iMugLlK)zXIl{o708;H7J9J(wyJmo2MRgev9w^#hl;ao2TwL&SBMJ zzc1sf89R@a|A$j^9q|7*`}K_a%?F#wn~PnL@w+qrMX5gzdogf77h&W7cPsGS5Bt|% z3Tz+wW%$;P_xEyqbJV*Tjcu*~p6fg?9^1YO-~MCUSL2(jZjN(V2^?2^(_fQn>i02U z>-PZL8gpG7a}V$=IIq<}&9fZqzBbik&g;^gHJO~(T;@-|utzUEbgCo$Z^uc3xJT zlP$_F%KnSTRwqHw
Y3JQ{l&ZBuQ)8vcR=v>~MPH~syl>y| zo}H!2gk*#RwPzwwi>loDW-p+Uq7*Q&M`mV zW2;y`Uv*V)%S8$*Mxd0w_9=~)r)NVwGsn8|cHILyQ&Y%}x{DWqi-?Q`lKv%uc~OwFgRZ#@rY0ZoR?E+a*GssTK#@ zd7nlf;a+xX+dJcB??Zq0evgzVCdX^7y|r?y<|%iaSIM32S~*vq%|^RZZgjjbo^dsw$yW1TzX45NjCa*<%>Er&Hq0D0 z;I9JSmtkVAYf0BHbbVt!=DM~uT{g?FhR@U%y6ZHaa^pVMpTnm8Tu0hZKAYdyoxk^X z7qzh#@82#~5!}1AtVdf5_qmuar}b-Cmv>$NGQ5850JxmK*2|3zz`d7hLcSpP%~^xG z5UX!qz?@6TU4b0{KG)`aCtUbzZ34h1s}q9pMwwMyB7QJ z!a5h%5b+P-`#yso#CK0Gp=$+e-8Zn-xDVzzuWy2l8_#TeHxczGb4@)Ex!*!-{C)F< z+^6AcDWcCa=&mt^bNDuzbNBtaw{q`^+LfG;=dsR9o<70t@%=ntu070`d2;_h@L9p`zKpd;?Aa^$juZS0zK^|L!y0psbxu`s?W^R{ln=ZRR96hIKy9>7OV?thv^$ z2c8AF=fvN};Km0NZhUVK_xCXJjr)5T+BZG(zw4r^6l*UChTV5H^lG6E$q2x<3^x< zD{sj6A&=Ni_-euojpTJ-6YfJ#T}nr9HR9 z)zhB0!_%JT>}L+HZwGKpb6kh#NX>Qc!tMsHdl)zmYu*RcgTEi&I@e`<4=_hP`s~BE z&rT3^`|;HscP~~R`3LaL9|Dm-g0F7A=U1-p*>%i#S9juD>o?U}_w_EIZoX$*eiJvx z*xg_$a1QphpE>4wkBmp3596or;3IJNUp;a@if`TGy#L4W-G6_Ve5cl!6X)RL_`Wam z9Mij|rtdv77HccxyS9TM#yfmQvHn4iQLN9u*$ZPepyoG4Klc1EzP;0T zU5Bg3`1j^H2eC2!efa8erpEErM4So#54V>w*ENP!v+n|I6R52O(RVV}xAT^~gP#B~ zzcjCv$4=18_t^&4sz?70zWrB&=s$(89{s2Bqko!rKf1B#{{X(V>Tz!$#P=Ov103HR z*V(`ti~ai~zGI|k^HXs3nAfNAt&4BRXYkEYkDSlqr#VOA=BYdG5$sW5{ygmGfa?$b z5dIbr@8|RQ=BPVY@BSBnb4~B;7jxY)j^oQC|4aDh4}lox%lPW%pTNrXAI3UntmjdD z=WOf|tUT`LWBA@r$FqmE=9qg7Ydrcqj=vtn-hBn%`>7r|U&XgB?&sI=eRpv`tue>` zC$Yw(_Urg+#!6WEzqm(npR~rFz&@G#Php?V{ZrUyfc;irp99Z=m)LXf?svd*!1L|h z{T|lGyKC&bK+U_WZ=dI}KLDq5{sQ(T@FKXAzAs~c1k6#7_w{3Z-`6X^KJ&0Y0qS>A zcOCYpz*=?J<^0uLbIe0)&)2X&1NJ-v>}ijm19j_P&3VLr0apwDOMJ)h{aO1fV2-*u z{n%fFd%$CP&TsI|Q;(eA;`@Fg=Xdz#sXLFeShX1U5BO@v&SB;M;Z$q^{y*lpOM%Zq za3gv1v5OLaapGT;`+nP&0N>X#Z2Z5r9N+zReC=C+^}#R3w|CsnOYqH6U(9T*xfIL+ z1zBdhLG|u-2IS;+)ld*RJcWKy4+6zN>OQ zat7e$tOk*@27ds=xASUz*Rc**Z#-ge!#8#fFmEl0b*kAr*6{W`ZjSY?;T<4)n{ST$ n=N>qovD<-pu3P<`z;TVooZp4-ez~XSTno%o|1a-W?pgUCyWJF2 diff --git a/src/editor/editor.d b/src/editor/editor.d index b651eb4..fe02df6 100644 --- a/src/editor/editor.d +++ b/src/editor/editor.d @@ -188,11 +188,21 @@ Cycle(Editor* ed, Inputs* inputs) */ u32 count = 0; + static bool init = false; + static Timer timer; static u32 box_count = 1; + + if (!init) + { + timer = CreateTimer(); + init = true; + } + + u32 prev_box_count = box_count; + f32 delta = DeltaTime(&timer); for(auto ev = inputs.list.first; ev != null; ev = ev.next) { count += 1; - Logf("%s", ev.value.key); switch(ev.value.key) { case KBI.One: box_count = 1; break; @@ -208,13 +218,104 @@ Cycle(Editor* ed, Inputs* inputs) } } + static UIPanel* panel = null; + if (panel == null) + { + panel = Alloc!(UIPanel); + + panel.split_axis = A2D.X; + panel.percent = 1.0; + panel.first = panel.last = Alloc!(UIPanel); + + panel.first.percent = 1.0; + + UIPanel* child = panel.first; + foreach(i; 0 .. 8) + { + UIPanel* p = Alloc!(UIPanel); + + child.next = p; + panel.last = p; + child = p; + } + } + char[128] buf = 0; f32 x_pct = 1.0/box_count; + + if (box_count > prev_box_count) + { + u32 added = box_count - prev_box_count; + f32 insert_size = 0.0; + UIPanel* child = panel.first; + foreach(i; 0 .. prev_box_count) + { + child.anim.start = child.percent; + child.anim.end = x_pct; + child.anim.time_start = 0.2; + child.anim.time_remaining = 0.2; + + child = child.next; + } + + foreach(i; 0 .. box_count-prev_box_count) + { + child.anim.start = insert_size; + child.anim.end = x_pct; + child.anim.time_start = 0.2; + child.anim.time_remaining = 0.2; + child.percent = insert_size; + + child = child.next; + } + } + else if (box_count < prev_box_count) + { + UIPanel* child = panel.first; + foreach(i; 0 .. box_count) + { + child.anim.start = child.percent; + child.anim.end = x_pct; + child.anim.time_start = 0.2; + child.anim.time_remaining = 0.2; + + child = child.next; + } + } + else + { + UIPanel* child = panel.first; + foreach(i; 0 .. box_count) + { + if (child.anim.time_remaining == 0.0) break; + + f32 r = child.anim.time_remaining; + + r -= delta; + if (r < 0.0) + { + r = 0.0; + } + + f32 t = Remap(r, 0.0, child.anim.time_start, 1.0, 0.0); + child.percent = Mix(child.anim.start, child.anim.end, t); + + child.anim.time_remaining = r; + if (r == 0.0) + { + child.anim.start = child.anim.end = child.anim.time_start = 0.0; + } + + child = child.next; + } + } + + UIPanel* child = panel.first; foreach(i; 0 .. box_count) { buf.sformat("##%s", i); - Logf("%r %s %s %f", buf, i, box_count, x_pct); - WindowItem(cast(u8[])buf, x_pct, 1.0, Vec4(Vec3(x_pct * i), 1.0)); + DrawPanel(cast(u8[])buf, Vec4(Vec3(x_pct * i), 1.0), child); + child = child.next; } BeginFrame(&ed.rd); diff --git a/src/editor/ui.d b/src/editor/ui.d index 65dbb5e..db89413 100644 --- a/src/editor/ui.d +++ b/src/editor/ui.d @@ -164,6 +164,8 @@ struct UIItem Rect rect; f32 text_scale; Axis2D layout_axis; + f32 hot_t; + f32 active_t; } struct UIKey diff --git a/src/editor/widgets.d b/src/editor/widgets.d index 17397fa..e5ea738 100644 --- a/src/editor/widgets.d +++ b/src/editor/widgets.d @@ -2,9 +2,25 @@ import dlib; import ui; -struct Window +struct WidgetAnimation { - + f32 start; + f32 end; + f32 time_start; + f32 time_remaining; +} + +struct UIPanel +{ + Axis2D split_axis; + f32 percent; + + UIPanel* first; + UIPanel* last; + UIPanel* next; + u32 count; + + WidgetAnimation anim; } UIItem* @@ -25,10 +41,13 @@ RootItem() } UIItem* -WindowItem(u8[] str, f32 x_pct, f32 y_pct, Vec4 col) +DrawPanel(u8[] str, Vec4 col, UIPanel* panel) { UIKey key = MakeKey(str); + f32 x_pct = panel.split_axis == A2D.X ? panel.percent : 1.0; + f32 y_pct = panel.split_axis == A2D.Y ? panel.percent : 1.0; + SetProp!(CtxP.AxisX)(UISize(SK.PercentOfParent, x_pct)); SetProp!(CtxP.AxisY)(UISize(SK.PercentOfParent, y_pct)); SetProp!(CtxP.BGColor)(col); diff --git a/src/shaders/gui.frag.glsl b/src/shaders/gui.frag.glsl index 0154884..20399b1 100644 --- a/src/shaders/gui.frag.glsl +++ b/src/shaders/gui.frag.glsl @@ -78,7 +78,7 @@ void main() //tex_color = pow(tex_color, gamma); } - vec4 color = FD.color; + vec4 color = ToLinear(FD.color); vec4 out_color = color * tex_color * sdf_factor * border_factor; FragColor = out_color;