From 5bda220695019e15496f249e62362cc4e9b10b8a Mon Sep 17 00:00:00 2001 From: Asuro Date: Tue, 11 Feb 2025 01:56:28 +0100 Subject: [PATCH] wip --- src/game/Global.cpp | 27 ++++++++++++ src/game/Global.h | 3 ++ src/game/Level.cpp | 50 +++++++++++++++++------ src/game/Level.h | 4 +- src/game/compiled-shaders/dx11/frag.bin | Bin 4234 -> 4678 bytes src/game/compiled-shaders/glsl/frag.bin | Bin 11782 -> 11881 bytes src/game/compiled-shaders/spirv/frag.bin | Bin 2798 -> 3010 bytes src/game/rendering/Rendering.cpp | 2 +- src/game/shaders/frag.sc | 27 +++++++----- 9 files changed, 87 insertions(+), 26 deletions(-) diff --git a/src/game/Global.cpp b/src/game/Global.cpp index cf03445..a4293eb 100644 --- a/src/game/Global.cpp +++ b/src/game/Global.cpp @@ -1,4 +1,6 @@ #include "Global.h" +#include "bx/constants.h" +#include "bx/math.h" #include namespace @@ -7,6 +9,31 @@ namespace Game::GameInstance* GameInst = nullptr; } +Quat Quat::FromEuler(float x, float y, float z) +{ + x *= bx::kPi / 180.0f; + y *= bx::kPi / 180.0f; + z *= bx::kPi / 180.0f; + + float cX = bx::cos(x); + float cY = bx::cos(y); + float cZ = bx::cos(z); + float sX = bx::sin(x); + float sY = bx::sin(y); + float sZ = bx::sin(z); + + return Quat{ + cX * cY * cZ - sX * sY * sZ, + sY * cX * cZ - sX * sZ * cY, + sX * sY * cZ + sZ * cX * cY, + sX * cY * cZ + sY * sZ * cX }; +} + +Quat Quat::FromEuler(Vec3 rot) +{ + return Quat::FromEuler(rot.X, rot.Y, rot.Z); +} + namespace Game { SharedData& GetShared() diff --git a/src/game/Global.h b/src/game/Global.h index a9a9f61..f6936a5 100644 --- a/src/game/Global.h +++ b/src/game/Global.h @@ -34,6 +34,9 @@ struct Quat float Y = 0.0f; float Z = 0.0f; float W = 1.0f; + + static Quat FromEuler(float x, float y, float z); + static Quat FromEuler(Vec3 rot); }; struct Mat4 diff --git a/src/game/Level.cpp b/src/game/Level.cpp index 56f1c4f..b551055 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -5,6 +5,23 @@ #include #include +namespace +{ + void CreateTransform(float* out, Vec3 pos, Quat rot = {}, Vec3 scale = {1.0f, 1.0f, 1.0f}) + { + if (out == nullptr) return; + float rMat[16]{0}; + float tMat[16]{0}; + float sMat[16]{0}; + bx::mtxFromQuaternion(rMat, bx::Quaternion{rot.X, rot.Y, rot.Z, rot.W}); + bx::mtxTranslate(tMat, pos.X, pos.Y, pos.Z); + bx::mtxScale(sMat, scale.X, scale.Y, scale.Z); + float buf[16]{0}; + bx::mtxMul(buf, rMat, sMat); + bx::mtxMul(out, buf, tMat); + } +} + namespace Game { void Level::Setup(GameData& data) @@ -25,6 +42,8 @@ namespace Game } } } + + Cube* floor = Cubes.New(); } } @@ -40,23 +59,28 @@ namespace Game void Cube::Update() { - double globalTime = GetInstance().Now; - double time = TestY <= 5 ? globalTime * 0.1f : 0.0f; - if (TestX == 4 && TestY == 4) + if (TestX >= 0 && TestY >= 0) { - bx::mtxTranslate(Transform.M, 0, 0, bx::lerp(-20.0f, -32.0f, bx::sin(globalTime* 0.5f) * 0.5 + 0.5)); + double globalTime = GetInstance().Now; + double time = TestY <= 5 ? globalTime * 1.0f : 0.0f; + if (TestX == 4 && TestY == 4) + { + bx::mtxTranslate(Transform.M, 0, 0, bx::lerp(-20.0f, -32.0f, bx::sin(globalTime* 0.5f) * 0.5 + 0.5)); + } + else + { + float scale = 1.0f + TestX * 0.4f; + CreateTransform(Transform.M, + Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX}, + Quat::FromEuler(time * 10.0f + TestX, time * 5.0f * TestY, 0.0f), + {scale, scale, scale} + ); + } } 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); + CreateTransform(Transform.M, {0.0f, -30.0f, 100.0f}, {}, {100.0f, 10.0f, 100.0f}); + // Nothing for now } } } diff --git a/src/game/Level.h b/src/game/Level.h index e6e9b8e..579ef6a 100644 --- a/src/game/Level.h +++ b/src/game/Level.h @@ -11,8 +11,8 @@ namespace Game struct Cube { - int32_t TestX = 0; - int32_t TestY = 0; + int32_t TestX = -1; + int32_t TestY = -1; Mat4 Transform; uint16_t MaterialIdx = 0; uint16_t ModelIdx = 0; diff --git a/src/game/compiled-shaders/dx11/frag.bin b/src/game/compiled-shaders/dx11/frag.bin index 5b62834ee21f39051faa66dc35913c77447637e1..ed2254864c40bcb281694c223541450283631053 100644 GIT binary patch delta 839 zcmeBDJf@=K7VN>jaJmO00~iOo>4-E5QP8O7^CvTQ66S&$7NS&*0;R3}Ufq+=UD#59-~y1GM9JI4}W*qxxRa)XM&XsAnsK;|-lECVq>G~?#ujPn^Mw=qdEHP~-XV|L*%#O5YYNH8-n zFhD|rVLt-{13OHNYw~+;<;i@!9E=Q;@AF7bHsJ|#^@fHX$jw|(ck)5?fUJgzfoKq4 z8%aIL4p4~lP3Gp4n;godIa!a1oypz=WH>VegYo41Jkp||Kmj=bq#0(2+2s3d;*<4w zb9h14D?zQ5n!KJ@*%M>|OayKL)IrFOl!EFqV_;wdnGcm~a0GcCWZC5RywZ#&li%}7 zg53h)ar4cmyPeYf2s=RzlbU>V!Z delta 468 zcmX@6(xs^57VN>jaJmO00~nMDFfh18I60pdaGk%3pI2u-VEMHZBwZpfQD-05 z41NZN00stzXUr47sMS|7Ft8di2!Qpv2?#JSF)%RHFfgzlf{L+;K*Y?D)j{Q8Vj#1( z@k7jjiGd7sLsADbZy6s%ogf1PyAy+e7Dyd~8&nWRTQD%N!yUySzyPwqZE~@o@?<$? zj?Gp~6^xtDF}rYZ3o!^VFf%YPFgh?y?qrmeRYLGV=I&=;U|@%dNlkX y`T00yjaJmO00~mzqZ4_9bVP9NWRHBiRSzHoasHvc@P?VUGSz4^1uV7@& zRg_v%T9l`doRgSapkb(IprETzlv-SxQ=+3_pl6_?V5n!Hx%s}vMaIb+wG1t76><|R zG>S`ebrg~_i;{CvHHu483k*ZcK&p*Q6|@wM1%&d+T-tJin4$*Sa+7_v z^}-dB5{pxVlM{1N6>Jqu^bD-I(sJ?>ON35w3N;aGD#2jaJmO00~mbP-6*g?Lq8?6xFonxL0>_mC^03ov{*q)0m9I<<|;}p zDJ{xVC`v6Z%_&i^Q83gq*!*7OA|s>r>sZg+0NJ**CD2p#GGtji=O3TSlEHP3@sRWBxLc}-!(XMCY$;nSQ(kL!S NOwP57xxEa{Mw7XBRk6v*} zik^w70Z0WO12c#M%keX?Gq5l)fN^eOW*$g_laYZzjFEvsfPon-&d$KVz|6qRz{*#g~?WEMR3|1M5#pPpgP`D@sgvNi0b;U|?`(U||5MlVe~2 z+YRD_>;dsX_6jpFF@U_F2)2y@%obx{W?*ArU{GLSU=U|uVc=k30P{g^2Jv~Je2_kE z1{ScK7056K1_v152F!1;hw<&fd-xb2Q*I{5~0GSuSz`y_!17Vn&46qspxS3^O zeuEuMelCRXAi==Gu!4aBY!1jxq6{ny&!FxH#fbvQ4~!81gY2?~@30|NsnU4qoW z+>iy8lV@OH0I7qSQvh`XNFEf1pmbCS@*fie14s_!29Q`WBLf3S9F(3xW`e{@kjw_Bn zkh(l*o~UPJU;xSGL-TDDBLf3S4Cc>fMg|6udXP9wO&e4V%v)4PR{fdM3rtalq!FDO64^zL9}U;v3D>)pl3zyK0Q*1HF)7nE;ddiOChFo497 z^&VhkU;v4O^uprr5F-NvC=5Ym7Y_pmIK3T#hL<)20|Q7Nl;%Kj1#&+qevdIi#6e;( zJ;#ysfaKBjoP_EDmAf!Kr;zl3!YfdQlzBnQ*`7OD=E|6yY9k;GtnKQJ;dfYgHIK=BOn|3^j!29TK`IanI|40S6g zAA;mNp!xYLBLf3S4&)b@nco;07(n8nG8Y!6KNulpGe{2R|DRAZLGb{RhlLN!oQt5m z$H2e3v9YC&=^y)005$YH{UBnH#V&cwg~QVWuU zg$V}}0|UrRkQ^*bxR@Yy7${6Y@~|-BVPaqa$${JtGn1EzfdM3r947qGx(O@?O`8Hx zGeKbjl81!}tcA^hz=@Fo4v8 zNy{RRpzkUT8Bl$jV9Kyo1W z!^~7+VqgG?BZrq7G`v7^ur#C&H4_wGAbIrgx`h;8ps)j}huLu#8eX7$3iGor69WUN z96=5*eIzlMUIQiu29R2i989kfR2_17nIMV5^qMj;Fo4v8Bt?G7}^R3oi?( z-$3C7l81$t6%zvkNDkzFn3>j03=AM~57xxEa{Mw7XBRk6v*} zik^w70Z0WO12c#M%keX?Gq5l)fN^eOW*$g_jgf&tn2~`&fPon-&d$KVz|6qRz{*#g~?WEMR3|1M5#pPpgP`D@sgvNi0b;U|?`(U;#OmL5_g| zY&VDxvIoQm*(=Pz!~pVwBG@(tFk6g)nSqUgfkAC0n7)v8N}y>@uZ<00RR9NDPEwdNROj92{W$ zVlbZp&Myb^8|)+)SQwTvFo4ZLcFPfnyn`qM3&UfmKR|J#z`(-5$_NPuklof$J}4Yv z@f5F83m>_-ysbhqO zu|E?7gBb%WINU+u3vxQht{)6c;JCMCU;+D&osj_?kLRI$2Sx@4kk|z%-wDbOU|JdgpDIv5!Ipkg39U}FAIF_8aZVgZZ{3?O~T>H?u+Aawx@?BMVTVuY9p zG6SRsq-F}#u24n>29P`m^DwZ1(@!`w>=hXp7(ni8g{qBWWMBZP2Vt043?l;rC>}w2 zU}ABM3=AM~kXSQRZ#*Ld14utej)#FAY)=Bz9t{Qt22lC~se!p62`VSgz`y`f2Qw!F z>IRTJC=5aABa@MV0Te$VIglGbV%dxg3?Ok(x&@gD63am{6C@7{$2>*`2ACX3KPXQX zGBPlL#6f8Yq#qb0#@}TLtjFEu>B$p4(dzFj~3?MO>U#b`x z7(nVl;xIL}P&F{K>!4=KGB7ZJK;p=H*FyDz@)At%dPW8Y zkT|m5jf@NoAaP{9o1uC^c@Cy`DRMfdS-R5bl8H*Y}JJ3?Q{2xg89w;JV@?BLf3S z929mdp=HG1~4;EGBPlL{0xc@m>YjEGBAMB53-+sA&J5C{$^xg0I3DZ z!Sw!xszdhkeD6RnU;wEF$-(q$L)9UNgD#R7Os^gj0|Q7cNDdYb`b-QAATvR7 zFm=XE3=AMQf-o!`OqduLKx#p9uy8PAVqgG?gZvB&2Xj!{0NRc~4u_kJ3=E*K0LjDZ tyxY)nL6w1l0VEGH2UbtFGBPlLiF2 diff --git a/src/game/rendering/Rendering.cpp b/src/game/rendering/Rendering.cpp index 46e13d7..2987aec 100644 --- a/src/game/rendering/Rendering.cpp +++ b/src/game/rendering/Rendering.cpp @@ -172,7 +172,7 @@ namespace Game bx::mtxLookAt(view, eye, at); float proj[16]; - bx::mtxProj(proj, 75.0f, float(shared.Window.WindowWidth) / float(shared.Window.WindowHeight), 0.1f, 100.0f, bgfx::getCaps()->homogeneousDepth); + bx::mtxProj(proj, 75.0f, float(shared.Window.WindowWidth) / float(shared.Window.WindowHeight), 0.1f, 1000.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 e6b6b39..2b6380f 100644 --- a/src/game/shaders/frag.sc +++ b/src/game/shaders/frag.sc @@ -6,9 +6,11 @@ $input v_uv0 float circle(vec2 uv, float radius) { float distSq = uv.x * uv.x + uv.y * uv.y; - float result = distSq / (radius * radius); - return result < 1.0; - // return clamp(1.0 - result, 0.0, 1.0); + // float result = distSq / (radius * radius); + float result = sqrt(distSq) / radius / 2; + // float result = sqrt(distSq) / radius; + // return result < 1.0; + return clamp(1.0 - result, 0.0, 1.0); } float circles(vec2 uv, float level, float subLevel) @@ -25,18 +27,23 @@ float circles(vec2 uv, float level, float subLevel) float step3 = clamp(step - 2, 0.0, 1.0); float sum = 0.0; - sum += circle(baseUv, lerp(0.5, 0.25, subLevel)); - sum += circle(step1Uv, 0.25 * step1); - sum += circle(step2Uv, 0.25 * step2); - sum += circle(step3Uv, 0.25 * step3); + // sum += circle(baseUv, lerp(0.5, 0.25, subLevel)); + // sum += circle(step1Uv, 0.25 * step1); + // sum += circle(step2Uv, 0.25 * step2); + // sum += circle(step3Uv, 0.25 * step3); + sum = circle(baseUv, lerp(0.5, 0.25, subLevel)); + sum = max(sum, circle(step1Uv, 0.25 * step1)); + sum = max(sum, circle(step2Uv, 0.25 * step2)); + sum = max(sum, circle(step3Uv, 0.25 * step3)); return min(sum, 1.0); } void main() { - float2 dx = ddx(v_uv0); - float2 dy = ddy(v_uv0); + float baseScale = 4.0; + float2 dx = ddx(v_uv0 * baseScale); + float2 dy = ddy(v_uv0 * baseScale); float2x2 mat = float2x2(dx, dy); float4 vectorized = float4(dx, dy); float qq = dot(vectorized, vectorized); @@ -47,7 +54,7 @@ void main() float spacing = freq.y * exp2(2.0); spacing *= 128.0; // TODO: check reference to see how to calculate this! - float spacingLog = log2(spacing); + float spacingLog = max(log2(spacing), 1.0); int patternScaleLevel = floor(spacingLog); float patternFractional = spacingLog - patternScaleLevel;