From cbe21bfd78d6ccc5862f87d2dbb888dbffce9eaa Mon Sep 17 00:00:00 2001 From: Asuro Date: Mon, 10 Feb 2025 17:57:21 +0100 Subject: [PATCH] fun with dots --- src/game/Level.cpp | 31 +++++++------ src/game/compiled-shaders/dx11/frag.bin | Bin 454 -> 4446 bytes src/game/compiled-shaders/glsl/frag.bin | Bin 10608 -> 11704 bytes src/game/compiled-shaders/spirv/frag.bin | Bin 626 -> 3058 bytes src/game/rendering/Rendering.cpp | 4 +- src/game/shaders/frag.sc | 55 ++++++++++++++++++++--- 6 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/game/Level.cpp b/src/game/Level.cpp index 3416fcd..4acc0a2 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -13,14 +13,6 @@ namespace Game Cubes.Setup(data.EntityStorage); if (Cubes.Count == 0) { - uint64_t state = 0 - | BGFX_STATE_WRITE_RGB - | BGFX_STATE_WRITE_A - | BGFX_STATE_WRITE_Z - | BGFX_STATE_DEPTH_TEST_LESS - | BGFX_STATE_CULL_CW - | BGFX_STATE_MSAA; - for (uint32_t yy = 0; yy < 11; ++yy) { for (uint32_t xx = 0; xx < 11; ++xx) @@ -48,10 +40,23 @@ namespace Game void Cube::Update() { - double time = GetInstance().Now; - bx::mtxRotateXY(Transform.M, time + TestX * 0.1f, time * 2 + TestY * .37f); - Transform.M[12] = -15.0f + float(TestX) * 3.0f; - Transform.M[13] = -15.0f + float(TestY) * 3.0f; - Transform.M[14] = 0.0f; + double globalTime = GetInstance().Now; + double time = TestY <= 5 ? globalTime * 0.1f : 0.0f; + if (TestX == 4 && TestY == 4) + { + bx::mtxTranslate(Transform.M, 0, 0, bx::lerp(2.0f, -30.0f, bx::sin(globalTime* 0.5f) * 0.5 + 0.5)); + } + else + { + float rot[16]{0}; + bx::mtxRotateXY(rot, time + TestX * 0.1f, time * 2 + TestY * .37f); + float scale[16]{0}; + bx::mtxScale(scale, 1.0f + TestX * 0.4f); + float pos[16]{0}; + bx::mtxTranslate(pos, TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, TestX); + float buf[16]{0}; + bx::mtxMul(buf, scale, rot); + bx::mtxMul(Transform.M, buf, pos); + } } } diff --git a/src/game/compiled-shaders/dx11/frag.bin b/src/game/compiled-shaders/dx11/frag.bin index 3f373153bb29858046e8d4a69d6f9b931bedd993..940235e55bb4d9451b8bc3ab4731faeae6f66f83 100644 GIT binary patch literal 4446 zcmZ<@_TXMP-Gh+<3_JuG7+fNpoVQ9m7il^rd%3GV)ua2yWk!%RNRF9-fkB6Xfnfmy z1H%;t1_sYycfTA41_qEg2Ll5`0N4};29SD?7>LWyz`zg#Vn8uS93&4CPlAepD3CZ4 z$Sh_ChTyRH0RLdm5Kn(U24{aC{~(4C*9d2S{~#BJ)&9Zmejqo1%mCS`0MZP_ATvNr zklDdu@ga^u?yeyWt5*kmxJKj%K-?$I!oZN#!N8a#z`$%IAiw~!GnIjX`ICYGNGn4I z0|OJtoGJzeRwD+8m>X1G4Fdz~A*dLe2t=q44%v;6> zQ76d2!0rTk3|1_o~i z2392VKn`Fa#SWN%_;B0dfXxnUeuTIQyZ<3_49@yk-0R4|zzPdznE#}a#9-l|&A`A4 zi+h+D$geOlEgbO*^CQe`Z01NJnGI79@*_O`aY51_a=M1gLDM0~T$n$Q+=mfAAal{x zLBq$Mfq{V?pIj0&O@y&R+_Q`uLR&B}aDmc3C{Im;$}vIGqdfyd1IS!>+5ov5q>haR zk`F*^S!mt?u|atTL_gz#@=VDSfH!{QIb2KgC8gUkWZFu#M?P&1+N$8dmw zf#Cow{y_3Dy-;-^dqEg%H_SX({DIU%)FI*yl-5A;2a*HD2gt3UaDc@Thz7~wia&Jq zNM^y)49E%d`$2&XvI|7R)QB=LFe1AJVh@8o$ekc{$aw-3 zN3d{)#t}4b9QHFXfG`6*j$nBP7U!e+gnx&vO{vq9=VXnq0pGVB=`7J%z@P@aIL2UvbVr~~Cb23Xn1 z1}ht%aiP}zF#YK136xi1dZ1>4>kLT!&(Hv>JJ9t))qyQ$V1U>SOP`>+1Jyj#x&u_l zfZ_&}#?k%G#t7+Cfa(r(Ic(}dZ6l~zT4|$IWRE5>JId_AFLe-(+6@VNFOo{DwkpUU~;(hfx-i% z21JAM1TKA`JOPt~nFa9!r0zhHL+QgHiG!TT0Mi3q zI-`wMYSClN%F+28lI6#UQpe*xNBMfE>mE0Ogw-#Q*>R diff --git a/src/game/compiled-shaders/glsl/frag.bin b/src/game/compiled-shaders/glsl/frag.bin index df3a911cd3596a93f7447af36cb30b8f9db80509..4aef9d4d0845c8e14dea1067c7ba1430cee76e6a 100644 GIT binary patch delta 1379 zcmewmv?E%;E!cy5;dBp11~6EvyHOxqqdqMsKe0riC^03ov{;j?nhU~G(6Uu9(6g}S zf=H)i7MBDUD%dKNmg!X}XhA4#5LF4`Rl-yjr52awlqlFLK(*LGjaJZtGOW3ZQcFsU z@)Qj93>0(~>LD7exoV+SC1(~T=cE>El%*ycDU_D!C_r40lUkOV1LG8zCi#H)AoqgR z<)@_;r>xel3AQwlnIdt zE(EE}O{~x`&@<3cC@j<}EL6}{Fwry6Dk{<{D#EHs!M0wZxUi^11I;9uVk3pLqEwJm z!HOUr)+j7g&<5p8xYZ!r6m(I9G!^v0sTCTS3dIG9$(ecSpztV4Ez|>L_tc64BMqZ^ zJy3|lq_u1n42>-G4A8XsxN& z1(qsG%?ZdaRaTONw diff --git a/src/game/compiled-shaders/spirv/frag.bin b/src/game/compiled-shaders/spirv/frag.bin index 25a5547e92d629f99039da6bc49234241cfc0d71..8246dee449973de3563e5ea9aafb492bfa89efa8 100644 GIT binary patch literal 3058 zcmZ<@_TXMP-Gh+<4DN657xxEa{Mw7XBRk6v*} zik^w70Z0WO12c#M%keX?Gq5l)fN^eOW*$g_gOPzjl#zi!fPon-&d$KVz|6qRz{*#g~?WEMR3|1M5#pPpgP`D@sgvNi0b;U|?`(U||5MlVe~2 z+YRD_>;dsX_6jpFF@U_F2)2y@%obx{W?*ArU{GLSU=RoCXJ7#HL2d@|d7*reK5YgT zu$&qL1H;)fKK3FEOboUR3=A-Fdypkad0p>Hn`C(vwgB?sh4$Nn8fbk2! zdL*YhzyNY12*bp}m>3v9{sLi`yTd__VqkEA zsfl1>U;u>$2*bo8nHU&A{s&>0zGx-}2JY+1b}%(DObiU5FaTkgSS%9*11KCom=PLx zaZC&hW(=(0_yolpC>TKQ{=vWmPE)oFEMWI@GBSYE$9X8&wW%08#@I4`cwPItGRSs2Io&m{=fG3>20yu^>hU29Q2vb-_?Ekh%Z{c5qmSFha}( znE}!RQZof=S2!aB14tf(c^KHhX)h8QkBSTo3?TQlLe<7FGBAMDgD^}ij*)=@lqNuW zU}6c33=AM~kXSQRZz3ZD14utej)#FAY)=x@9t{Qt22i>Nse!p61u7@cz`y`f2Qw!N z>IRTJC=5YqEgNJX69WTC4&(-qSS}+214tZ{c0gu=#PX2L1j)m~v4D|*0VW6156Y{> zj0_AQaZow~=?96GLiL04I!GQSUJexprE8FyJZRpiU}Rtb$>l@ybTuOb14sbD4o1#WMBZ936g__38>BiiG#|YmC$_ll@U@G zfyyjU`Um+1r2ji3q$~r;|72i-hZQIsze4j)JQF0(fa)`ldQdpR?Aiehe^9)G!v7e^ z6VUJn$?XK?Sw;p1Q22w`AbUY^xd$5lpfV8_{`(ji7(n94;lH1efdM3r9R3Fx85ls~ z$l?E=k%0jujvW4sOb9Vp7&0+2Fo4v8zlfW(o*pO1-w0VIwd{sPdt1SAhL^C%+&11QWva-cW?g()cfKr}2) z5||)rK=A}p4+>kD{U@Mt0;*>~adHjhF=(8C1{x=zItdmh z=NK6nK;p=8a-NZa0VIwbCl?tR7(n94aU#LQzyK0QjuR;)F<7`tGchoL)Pm$-;V%nS z2XZ=0Odd%LrdNT9fdQlzBnR>bC`~IeF))D41j)g|M2(4o0VIwbC+bWL3?OmzIMIa0 z2}mAh=2b=p22hxTaxisvObiSlH-a!Mob8zy7(i-4aCs7!<*_F@V`(49pB{3=9kk3=9n73@i*B3=CjC$ju-=ACwQ$ zr_I0umXiS)#=yV;Bx;5Fg}rP)M3Fu!7wRaudi%kk}6fCUAJ!GO#d!%(P-)0Q)_V0Ten649N@(3?MO( z`W+0cV0Wc3K*T}rg{ez}ssp(LrY@ahomogeneousDepth); + bx::mtxProj(proj, 75.0f, float(shared.Window.WindowWidth) / float(shared.Window.WindowHeight), 0.1f, 100.0f, bgfx::getCaps()->homogeneousDepth); bgfx::setViewTransform(0, view, proj); // Set view 0 default viewport. diff --git a/src/game/shaders/frag.sc b/src/game/shaders/frag.sc index 6599465..2b3dfe3 100644 --- a/src/game/shaders/frag.sc +++ b/src/game/shaders/frag.sc @@ -3,16 +3,57 @@ $input v_uv0 #include "common.sh" -float circle(vec2 uv, vec2 center, float size) +float circle(vec2 uv, float radius) { - vec2 relPos = uv - center; - float distSq = relPos.x * relPos.x + relPos.y * relPos.y; - return sqrt(distSq) <= size ? 1.0 : 0.0; + radius *= 0.8; + float distSq = uv.x * uv.x + uv.y * uv.y; + float result = distSq > radius * radius; + return 1.0 - result; +} + +float circles(vec2 uv, float level, float subLevel) +{ + vec2 offsetUv = uv + (0.5 + level * 0.5); + vec2 bigUv = (offsetUv % 1.0) - 0.5; + float base = 0.0; + if (subLevel > 0.25) + { + vec2 smallUv = (((offsetUv + 0.25) % 2.0) * 2.0) - 0.5; + base += circle(smallUv, 0.5); + } + if (subLevel > 0.5) + { + vec2 smallUv = (((offsetUv - 0.75) % 2.0) * 2.0) - 0.5; + base += circle(smallUv, 0.5); + } + if (subLevel > 0.75) + { + vec2 smallUv = (((offsetUv + 1.25) % 2.0) * 2.0) - 0.5; + base += circle(smallUv, 0.5); + } + base += circle(bigUv, lerp(0.25, 0.5, 1.0 - subLevel)); + + return base; } void main() { - // gl_FragColor = circle(v_uv0, vec2(0.5, 0.5), 1.0); - float color = v_uv0.x < 0.5 && v_uv0.y < 0.5; - gl_FragColor = vec4(color, color, color, 1.0); + float2 dx = ddx(v_uv0); + float2 dy = ddy(v_uv0); + float2x2 mat = float2x2(dx, dy); + float4 vectorized = float4(dx, dy); + float qq = dot(vectorized, vectorized); + float rr = determinant(mat); + float discriminantSqr = max(0.0, qq*qq - 4.0*rr*rr); + float discriminant = sqrt(discriminantSqr); + float2 freq = sqrt(float2(qq + discriminant, qq - discriminant) / 2.0); + + float spacing = freq.y * exp2(2.0); + spacing *= 128.0; // TODO: check reference to see how to calculate this! + float spacingLog = log2(spacing); + int patternScaleLevel = floor(spacingLog); + float patternFractional = spacingLog - patternScaleLevel; + + vec2 uv = v_uv0 * exp2(patternScaleLevel); + gl_FragColor = circles(uv, patternScaleLevel, patternFractional); }