From ab326d3624bf13ae5af884c0a932e1a2f55e8aaf Mon Sep 17 00:00:00 2001 From: Asuro Date: Fri, 14 Feb 2025 02:44:40 +0100 Subject: [PATCH] general improvements --- src/game/Global.cpp | 1 - src/game/Level.cpp | 83 ++++++++++++++++++----- src/game/Level.h | 43 ++++++++++-- src/game/Mesh.cpp | 18 ++++- src/game/Mesh.h | 2 +- src/game/compiled-shaders/dx11/frag.bin | Bin 5439 -> 5969 bytes src/game/compiled-shaders/dx11/vert.bin | Bin 1072 -> 1410 bytes src/game/compiled-shaders/glsl/frag.bin | Bin 12532 -> 12887 bytes src/game/compiled-shaders/glsl/vert.bin | Bin 10541 -> 10648 bytes src/game/compiled-shaders/spirv/frag.bin | Bin 4059 -> 4561 bytes src/game/compiled-shaders/spirv/vert.bin | Bin 1724 -> 2162 bytes src/game/rendering/Rendering.cpp | 59 +++++++--------- src/game/rendering/Rendering.h | 11 ++- src/game/shaders/frag.sc | 40 +++++++---- src/game/shaders/varying.def.sc | 2 + src/game/shaders/vert.sc | 6 +- 16 files changed, 185 insertions(+), 80 deletions(-) diff --git a/src/game/Global.cpp b/src/game/Global.cpp index 9476d58..5db304d 100644 --- a/src/game/Global.cpp +++ b/src/game/Global.cpp @@ -1,6 +1,5 @@ #include "Global.h" #include "bx/bx.h" -#include "bx/float4x4_t.h" #include "bx/math.h" #include diff --git a/src/game/Level.cpp b/src/game/Level.cpp index a34e60e..e19d85b 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -1,8 +1,11 @@ #include "Global.h" +#include "Input.h" #include "Instance.h" #include "Level.h" #include "Log.h" +#include "bgfx/bgfx.h" #include +#include namespace { @@ -10,10 +13,34 @@ namespace namespace Game { + void EntityRenderData::Render(const Model* models, const Material* materials) + { + if (ModelHandle == UINT16_MAX || MaterialHandle == UINT16_MAX) return; + + Transform.UpdateMatrix(); + bgfx::setTransform(Transform.M.M); + + const Model& currentModel = models[ModelHandle]; + const Material& currentMaterial = materials[MaterialHandle]; + bgfx::setVertexBuffer(0, currentModel.VertexBuffer); + bgfx::setIndexBuffer(currentModel.IndexBuffer); + bgfx::setState(currentMaterial.State); + + float TimeValues[4]{0.0f}; + TimeValues[0] = GetInstance().Now; + bgfx::setUniform(currentMaterial.Uniforms[Material::UTime], TimeValues); + bgfx::setUniform(currentMaterial.Uniforms[Material::UDotColor], TestColor); + + bgfx::submit(0, currentMaterial.Shader); + } + void Level::Setup(GameData& data) { Log("Level setup"); - Cubes.Setup(data.EntityStorage); + void* storagePtr = data.EntityStorage; + bool needReset = false; + needReset |= Cubes.Setup(storagePtr, needReset); + needReset |= Tests.Setup(storagePtr, needReset); if (Cubes.Count == 0) { for (uint32_t yy = 0; yy < 11; ++yy) @@ -31,15 +58,29 @@ namespace Game Cube* floor = Cubes.New(); } + if (Tests.Count == 0) + { + Tests.New(); + } } void Level::Update() { + if (GetKey(ScanCode::R)) + { + Cubes.Count = 0; + Tests.Count = 0; + Setup(GetShared().Game); + } + Cubes.Update(); + Tests.Update(); } void Cube::Setup() { + EData.MaterialHandle = 0; + EData.ModelHandle = 0; } void Cube::Update() @@ -48,26 +89,32 @@ namespace Game { 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)); - // bx::mtxTranslate(Transform.M, 0, 0, bx::lerp(0.0f, -32.0f, bx::sin(globalTime* 0.5f) * 0.5 + 0.5)); - } - else - { - float scale = 1.0f + TestX * 0.4f; - Transform::CreateTransform( - Transform.M.M, - bx::Vec3{TestX * 10.0f - 40.0f, TestY * 10.0f - 40.0f, (float)TestX}, - bx::fromEuler( - {static_cast(time * 10.0f + TestX), static_cast(time * 5.0f * TestY), 0.0f}), - {scale, scale, scale}); - } + float scale = 1.0f + TestX * 0.4f; + EData.Transform.Position = bx::Vec3{TestX * 2.0f, TestY * 2.0f, 0.0f}; + EData.Transform.Scale = {scale, scale, scale}; } else { - Transform::CreateTransform( - Transform.M.M, {0.0f, -30.0f, 100.0f}, bx::Quaternion(0.0f, 0.0f, 0.0f, 1.0f), {100.0f, 10.0f, 100.0f}); + EData.Transform.Position = {0.0f, -1.0f, 0.0f}; + EData.Transform.Scale = {100.0f, 1.0f, 100.0f}; + EData.TestColor[0] = 0.3f; + EData.TestColor[1] = 0.4f; + EData.TestColor[2] = 0.8f; } } + + void TestEntity::Setup() + { + EData.MaterialHandle = 0; + EData.ModelHandle = 1; + + EData.Transform.Position = {0.0f, 0.0f, 10.0f}; + } + + void TestEntity::Update() + { + EData.TestColor[0] = 0.6f; + EData.TestColor[1] = 0.9f; + EData.TestColor[2] = 0.5f; + } } // namespace Game diff --git a/src/game/Level.h b/src/game/Level.h index b2495a2..b3a62a4 100644 --- a/src/game/Level.h +++ b/src/game/Level.h @@ -2,20 +2,35 @@ #include "../engine/Shared.h" #include "Global.h" #include "Log.h" +#include "rendering/Rendering.h" #include +#include namespace Game { + struct EntityRenderData + { + float TestColor[4]{1.0f, 1.0f, 1.0f, 1.0f}; + Transform Transform; + uint16_t MaterialHandle = UINT16_MAX; + uint16_t ModelHandle = UINT16_MAX; - typedef uint16_t CubeHandle; + void Render(const Model* models, const Material* materials); + }; struct Cube { int32_t TestX = -1; int32_t TestY = -1; - Transform Transform; - uint16_t MaterialIdx = 0; - uint16_t ModelIdx = 0; + EntityRenderData EData; + + void Setup(); + void Update(); + }; + + struct TestEntity + { + EntityRenderData EData; void Setup(); void Update(); @@ -29,15 +44,19 @@ namespace Game uint32_t EntitySize = 0; public: - uint64_t Setup(void* ptr) + // Returns true if size changed + bool Setup(void*& ptr, bool forceReset) { - if (EntitySize != sizeof(T)) + bool changed = false; + if (EntitySize != sizeof(T) || forceReset) { Count = 0; + changed = true; } EntitySize = sizeof(T); Data = reinterpret_cast(ptr); - return C * sizeof(T); + ptr = (uint8_t*)ptr + (C * EntitySize); + return changed; } T* New() @@ -76,12 +95,22 @@ namespace Game Data[i].Update(); } } + + void Render(const Model* models, const Material* materials) + { + for (int32_t i = 0; i < Count; ++i) + { + T* c = Get(i); + if (c) c->EData.Render(models, materials); + } + } }; class Level { public: EntityManager Cubes; + EntityManager Tests; public: void Setup(GameData& data); diff --git a/src/game/Mesh.cpp b/src/game/Mesh.cpp index a3aba65..56357ff 100644 --- a/src/game/Mesh.cpp +++ b/src/game/Mesh.cpp @@ -1,5 +1,6 @@ #include "Log.h" #include "Mesh.h" +#include "bx/bx.h" #define TINYGLTF_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION @@ -8,10 +9,11 @@ namespace Game { - void LoadMesh(Model& mesh) + void LoadMesh(Model& mesh, const char* path) { mesh.VertLayout.begin() .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) + .add(bgfx::Attrib::Normal, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) .end(); @@ -20,11 +22,15 @@ namespace Game tinygltf::TinyGLTF loader; std::string warn; std::string err; - bool loadSuccess = loader.LoadASCIIFromFile(&model, &err, &warn, "models/cube.gltf"); + bool loadSuccess = loader.LoadASCIIFromFile(&model, &err, &warn, path); if (!warn.empty()) Log("WARN: %s", warn.c_str()); if (!err.empty()) Log("ERR: %s", err.c_str()); - if (!loadSuccess) Log("Model load failed!"); + if (!loadSuccess) + { + Log("Model load failed!"); + return; + } tinygltf::Primitive primitive = model.meshes[0].primitives[0]; { @@ -37,12 +43,16 @@ namespace Game } { tinygltf::Accessor posAccessor = model.accessors.at(primitive.attributes.at("POSITION")); + tinygltf::Accessor normalAccessor = model.accessors.at(primitive.attributes.at("NORMAL")); tinygltf::Accessor uvAccessor = model.accessors.at(primitive.attributes.at("TEXCOORD_0")); tinygltf::BufferView posBufferView = model.bufferViews[posAccessor.bufferView]; + tinygltf::BufferView normalBufferView = model.bufferViews[normalAccessor.bufferView]; tinygltf::BufferView uvBufferView = model.bufferViews[uvAccessor.bufferView]; int posStride = posAccessor.ByteStride(posBufferView); + int normalStride = normalAccessor.ByteStride(normalBufferView); int uvStride = uvAccessor.ByteStride(uvBufferView); tinygltf::Buffer posBuffer = model.buffers[posBufferView.buffer]; + tinygltf::Buffer normalBuffer = model.buffers[normalBufferView.buffer]; tinygltf::Buffer uvBuffer = model.buffers[uvBufferView.buffer]; uint32_t vertexCount = posBufferView.byteLength / posStride; @@ -52,6 +62,8 @@ namespace Game { PosColorVertex& v = *reinterpret_cast(vbMem->data + i * sizeof(PosColorVertex)); bx::memCopy(&v.x, &posBuffer.data.at(posBufferView.byteOffset + i * posStride), posStride); + bx::memCopy( + &v.n_x, &normalBuffer.data.at(normalBufferView.byteOffset + i * normalStride), normalStride); v.abgr = 0; bx::memCopy(&v.uv_x, &uvBuffer.data.at(uvBufferView.byteOffset + i * uvStride), uvStride); } diff --git a/src/game/Mesh.h b/src/game/Mesh.h index a339b9d..a7272e8 100644 --- a/src/game/Mesh.h +++ b/src/game/Mesh.h @@ -4,5 +4,5 @@ namespace Game { - void LoadMesh(Model& mesh); + void LoadMesh(Model& mesh, const char* path); } diff --git a/src/game/compiled-shaders/dx11/frag.bin b/src/game/compiled-shaders/dx11/frag.bin index 627c20026d3a904433f2aa4c4867e24fdf69d8d9..8fb21c4ca60030ddce2b1debe005a17e5adfbf5a 100644 GIT binary patch delta 1472 zcmdn5by2V0E!czGPyA0l0|NsC69Zdmd`V_*st^MM10zU;fx9%mB(=E2IX@@ANQglI zDk>t*z~B<$9Hib3K`3=9nH>WQ~3 z9T~(J7y>}9V`X5->R@1uWME)%>r((3#{jZBNq~X5NI(G2HWCnE0ND)_XPNB5s44xy z(TstCRf$0WtdG$FL^ar3Ffed9O=6Ote40^aaz8)E*g$$gPI6-sXmA8+fM9kcac~rZ%m%3w zU|^_cZ-TlNCJ3Wl7#LV#a#m0^77Pq3u)&t}`e$h_HyeLu(K&8#|;xrJpoA=Wc67*B3slb&2G@I(^i4v=l27~x`o zgdm8`F!_g&yd;tgI1CZ`e+XGmzAt!&0{!`u_X|i&t{2V_a)SC&3rce_Og_k>6o@Vi zvAn?^6t39i7#NHh7}&APHQ1X>e!wEl2=lslJviln{OZ;ON$?=H00RRT$N&(#jS-R> znH(4x4u4%?2g21N>+C==1Bwe!3InNI#syJ_ECxy-AUSMe77PqrMGW;2O)!NZOSrBp z+rTi$5>O6$1PzohR!GWY>qIyfWDs1Q4r-eEzKT=L2@9+fXth`nMuR|96SmT#UR5$ T3P55_P%&7X+kpyB1_cHH!&k8= delta 945 zcmcbpw_mH?E!cy*E8)}^1_lNOMh3Rh_>#=rR3R`2BqSlqz~B<$hb!86$1uZ4kufrWvAfrEj8Ap>Lx)HIM< z5SO2UfuRJ%U|?XFI90&A3d#miAT>-33=GW73=AM~kUcPQkQ_TZ14D3Fe1LzjXNaf2 zAA_^MkADzDh--wizkiSm!(;(QOH&mQ28I9z1_n-628OH-2F6GR1{SwI1&}ceAoG$0 z7?_O&1Q0u0QPyBIaiJeUttbL!^wVZ;;d)SoUvn^94BftIYRKPAxJgIYLJh>su>s<_!t=2VJ2`vO_GAr zhLi1tU}l^Xww}CE=nREs{l832-=`);s zj~V7dJr>Ey+ALy|b=f%>jVJ4|NP@zukwv_o?Gw~LYz&at0hz?Wz`z9)cjH5(jk9OY z*n;q^nUZ!43=Q@cIMk)3rP(tuIM~mcITNgofq{YjlL9pApgw?@%f-N82g;fZ0t^84 C=7k#o diff --git a/src/game/compiled-shaders/dx11/vert.bin b/src/game/compiled-shaders/dx11/vert.bin index 7898a4043a133eea9685e01372d0a023325de15e..f71e19f647c9b1fcfe5a1216c8e6b809352f6349 100644 GIT binary patch literal 1410 zcmWFw_TXko)GKru)hWF9*^14AiP3`Bv%nHU%tK;m^E0VoEEgE2D$ zgR{Sne-MM8e~_=E4?}=|uxE&;zaK-0YlO4Ee~=5qYX4w&zal&cML(NdclBr``atmt%M+k92=W(94D2R8Nd5qcf${;!Z7{oFVjy!tVxX`CiNW%Y8`OR~P!Yqz O%D}|H$RNPrzyScPmw)8| delta 509 zcmZqT-oU{V7VN>zz`(%Jm2m3IL>|5R7t9O{E)h=7HX_@spYGU}{9Rr)jiuyEIU@rD z14xdUfq_AXfq`KT0|SEwBLjnHu)ALd0|Ns{oP&XZApm3;6obS-On!a_hAiG%IqVPF7>Gctg~0^%Fy z$<>UK;&6Lc2Ya|i>|g@1Gb;NUDF}cap31<$T%;fX4vh>3 z1}0Vp1_lcT298e*0wDVs*aQR^Kn`*1QvmZDkmNz)VWI*IjFXF*tQi?6uVK(dGwC{A!aqG^6TuKytf^nK=KGupzBpsR%t3|DH!M(7%FHhq-2(4q!uY?A;$|y30Q@t zsWl`figWYxOESQbreLd(R0N8cywu`iG<}H`l~qt3xtSHIDKHHNdWH&G3dn|ND;Vfm kDriC6YR#3N6Yo}(m=049N+=o#6Lb^|^$awvxoWu>0Fau_Z2$lO delta 287 zcmcbf@+DEgE!cy*E8)}^1~7PNuu)(>)8u1J#+!widDSEp^c9S(xr$OtN{jLoic*V9 zb4nC!6b$rCCM#%0F>7*FPgc|v+03CO&OEtHSAo%V@^oF#$-a8BJSC~cCH`q?#i=C< z+LPbt>M^HrFwiqn&{jYa(o!(cv#{n$ z%gIkHQAkQGP7O{@%t=+SRWLNzJWFpaBcsV=4+C#T!^u+&9*3pp#Jd$GraR~7fb+G_AR6xflR) CJ5!1P diff --git a/src/game/compiled-shaders/glsl/vert.bin b/src/game/compiled-shaders/glsl/vert.bin index 72079f3c8079cc0d8ae3b91caf3c1436aa4ac44d..53d0194a24816f332b83a5bea5936b81a0584755 100644 GIT binary patch delta 114 zcmZ1*G$WWlEZBpafq{X+PyA0l14HXZ{v0N@y!@iv#GJ_)OwnA%3T5#S?&fVwC2Dps yo`S6cL^!i5RYOBTLnAk_#8|U5J~uxlH7D92R#QPsK_d~WRZ~Gz)0(T6iva*62qT~X delta 37 tcmbOcyf%nGEZBpafq{XcE8)}^1_r5({5edMr!aYJ{>+rF#$3zA007vb3l;zX diff --git a/src/game/compiled-shaders/spirv/frag.bin b/src/game/compiled-shaders/spirv/frag.bin index 6f7c44f382be1c11363d18a88613135b6e599530..f8ee115aeeccbf812b6d942548e1badd24ed1c4e 100644 GIT binary patch literal 4561 zcmZ<@_Tcst|C7(az`(%7z*ZVxl9`(-#K^$F2oho7E{!iqEiQ4+&&e+mVibUiP7!2a zU}jQgXJBJw;AY@paAyW9W)Ngx0;}L=U<1?cKEXbE#U&|vCZ+};6?_a3g&?!}8Mqi& z7#P4fH!(90B>#|sfng#e1H)8C28J1o3=At785jf@n89k;85kIt8JHPZ85kJ8FfuT( zGO&QfVR~5^*ck3JFffGXWv1m9=s1^NL;uxK=?{fJs>_P ztmKg7LE#4CgX{sxgWLwCfSfr$a6P7xfcpvY%n5My9wU}IolP+(wS z5NBXv;9vlS6)4;xd|oIY6mKATAt)bYjwk~QgB?^a$b4-m-yXzaU|<08L1qVn`3?3k zeh8S4kWXV^VBos0Yy*=Ar%VP0dmRQ=29SMK3=9k)F%X8SnFKb&!2!mf3+6Mx`3u4P z20NJiSq27%!(Ugx`R5oI7^+3q+37H_f&F}*fq?;}1|$xmVft=@&H3Oc$G`%PPf&P( zumS@M!vk;zVgQRt=fW)IRo0csWp0|NudKOjCRy@9L*$xngGgW?1v58{K;A4nd=2dM|8KM)_J zegz{W9f8~fk_YiY=@FDRVR7rs%)kIjA0P}9bAgJ1;u|LB$_z;ZAa#t;H0#F9z+lF} z3Qp6Y^a%<&kl8;Nn80O*Ehr2b7#JooLdqBrALRCF(DDYv2l;g-wCr(YU<1d=Lq-O0 zJ_N-TC@q83f#T*7NSu*@fd^cgFfcrYh6l)hAh}isP>ICA@SG7M2TD6IGhcx8GB7Zp zoB5KFfdM23GxH79Og;t%29O-g%y*0o3?Mm>nE}u=`<@YE7bwkuvFM0Mdu7jteRVQWwC$&Hzda+)NA%ATvQ`fb@XW zz`~o4iGcwm55l0h0fmtOG(14%KFEEra1dr2T29P+YtOl705>rJo6C@7{M|CC!2AEt2G!C?w7#KihHb@R+CMaBVnHU&A z;-K^ZG7}`G4>c21r-9^QelviIgZu_k14>gcJw{MDP(A>u%VS_+0F|A_ObiSlxqJo| zaJn>OVqgG?!TfH{#J~Vj4-$u|v4X0BnQaX!I>`(6$9A?Sb41bNfan1_qECP}+l~+sjN03==_>F$1VfgOv4G zk;GtnuQ4$&fYgHIV0v#r)q%` z1_qEga+thiVqgHJIpi|&HIf)i?;9ot29R2i9L)dkpz4srJP;NDkzF zSa|V4+hia)Sa|V6^@G9-B#$0mhmpby6m}r>FgG59h8HNG!o*H6F))C{k;6-rnSlXR zwjhU>IFcAluLLs#14u1M4i;WgP<6=RC4(de(<{r&zyMMUl7oep95Vw0$V`wNEW8w; z{sn~>NFEkmO3VxlAUTlxVd13$4KI)!EWA{q`a$6Zl1C4((@5b33OkT`SlT-al~ZM4 zU;wEDm5+`LtPG$wzcUl0y$b3JfZD2{Hi!!o0|Q9hpMeA1CUj+DU;v4MFeofRVFD`3 zVC@nuW(Ee38c;t7*1ptdW?%q`!!W3B1J$AKObiSlIZ!(f<_1qJZt!AaU;v53+~Cc` zzyJ~hVPrSJ%=KYnU;wEB`4uMS%f!F{5(o8TKyd@I-;arb0ptdd9L)XzEcOR7F))C{ zVfF`s@;nq{vp<-LfdQljl>T7$hcYoRfW$%lCYV?_69WUt4WPag%uNwY3=AN(AURn2 zi(+D60EvU_f{8^##X#W?6N`b0f#L(!hKyxmU;ya{sRzk};@gga89deilKacR$Y22; IaZz9Z0HExS6aWAK literal 4059 zcmZ<@_TcVHIQ4~rfq{XMfvq&YBr`Wvh!MmA32otLU|?oaW@lhyWZ-7tV0g#`5@lcz zWME=oWME+6W?%!;?modjdc`FvdM2g@AQgNJ%peLZ$IrmYz{0=)#<_`^c_4|S3=9mh zj0_Bkj0_9~j0_9{49sA8b_NCpW(H;kRt5%!FN_QftPCt*ahN_<1~!Jn3=9mRd6{YX zMY&En`N`QJ^Vk?z!Qvn`#1A07%nTrVKw=Hr8fdy81_lNYA7r*Ogzo_3yD=~@oIP{KPK1Gp!5vAR zCqx}wpBI?lU=Pz5%D}+DbzRv8#*YQdGuZ1eurh$$nE{G-D2AzN0IP9;+uaA|H`u}C z_k#HzPC5*13?RQ9U|?VXxdVhja&pi(0)>kL0}I0u21vMp(up;c4@w81@BxL#F=$wV z(l5vk5dS#X4p11gFr0wu2Zakr9z@>-hldZ`P4^*uxW6BR^(#0^Ft9MZV_*RL6=WYw zKQG8Kh6cDFeHg*vYYUV2Wn^HOHB-_~hk+d&zkZAi3?MZi43YzdGfb^NBLhQPS{mH$ z0I=B(aDE`zteJ4Lf*2VXKzcyxKyo0nK;aYv&E=qY0fiHY4@#>b<3REWP>gAMlr~^u_n8zyOj1r8StDt8kdPnvsD4 zBnLBd9n?%d1_lO@9L&rOj0_AQIgptF&~&|#5n>l8U4!Hs8Cb#TeG?-C11Qadx>KxAoU;&6T8XC zzyQkUAU!a#+l&khAaRfwEH3UaGBAMjgXCcGc^7Jr2DEGgse!rSK2%Pgfq?;}4rb0% zs2f1?pfCib+h>dn44`}ik^{K`B=&-lfdM2ADtkd@g2Y}TnF*4Ih2v{R1_qd12Q*yX zF+%b%NDgEsC>?xcWMBY^gVF=YOpw@TsF|R;3?vWp8>k)!#R14~AT^*g2GjEmss~hd zgVg0QurPqi1_qEE zEG>cx6i|8v$%E20C_HpPg*6ic11OAoq3K$miGcwm4l2Vy_JY(IGBGfK#6jv{dX1ra zLF!<7O_>-NK;j@Vm|k-x1_qEgvR+H5UQn3`(`(JdzyK0Q)@#eezyK0Q)@u*d3o1Kd zdL5Y<7(n94dYzdV7(n76y|DOmWny3eg(0Z!g_Q^HNaX=Y9#$TJ+z*OhPbLNikT@j% zAZ3Ubk{*yex*i{>9#A<2v&R=n4@e%S2PW?imDhu|6F}_&kXvDH4`gCs0I30`Jy^Oe zW@2Cf#SL=)FGUiA=`CYoU;wEF$-(qiK-GcLC`_yhNerg9nu&n{q!uIxihEF))G#qH zfXoER!O~qF)cv6R3X+HAqXs4h29O-c{V+2dnHU&A;-I>32Lmg(t<}uLzyJ~lwZT?G z>!uba1_qEgDC|Mu1=AnK#J~UwA5h%E#3Gm&7(n94;nT&$zyL~r$l=q2BnH#l%f!F{ zQVWuUg+)J99dh_gL=uDPoy5ez08$H*gN4szCI$wOnIJh>_)J9#ACNpOe5NxoFo5Jh z?uVHZGnb3GFS14tY>>^3qnFo497!)_B3 z0|Q7LJ?xU9c7ehU6pkQuFtgL3VF${~FtH3K1_qEga@g%)VqgH3KgeOX3rP&7cQ+FQ z14u1M4i3v9;>cllf{B3vB#s<*Cz%)+K;r0OmkqTG6n3C+1gV3i$y}(MDgy%p zNF7KotbM}4#J~WON5-IX5mY~NLiK^lMUXmB9|6?1w_{)i_aQ;@e;F7VEWo{P0R{lN Cihe5q diff --git a/src/game/compiled-shaders/spirv/vert.bin b/src/game/compiled-shaders/spirv/vert.bin index 38113030dcd653a2331f6d4ff1a64c422f1bbe47..763d6206947aefd95eb9d1b59ecf68338963b37b 100644 GIT binary patch literal 2162 zcmWFw_TXkA8fWiiw8koyi892aUhfPgs8OS}H;BdtzUtW-34Dy>h0}F#b z0|Nsa0|SEt0|SFQ12Z`6m>3usJQ!HOY>+xoe0m^-H9G?Xg8*0!BK(y>3c+F!eW371 z)(7IF>jQ~_^>KjgW&y{IBGep^+dy%pgv1A>BRM2KD6T+!kU1drpm+lDLGB0fL1_)d z2c=LDAC&IE*#qoX7H~X(AV0=)y1LA|sD~GCw*$?7_(f~}p8Y&O755xzh36MOSz+0|Q7LghB2CxdUXcBLl?j zwK&XP$H2eJXa6JWzPY@fFA3*66#0I5(ka`dsl+Hov55xwgaZtGaWng5m R0F_28ptR1&Ai&_j0RUAP(un{7 literal 1724 zcmWFw_TXkHNESQ!`? zzA!Q{urjcKT?5n0%D~2;!@$50nwOcDUzF>Vlb@UoGLwyg6)X;7Lp{R4#=s611GyC{ z2JZ{tPHGR_aw$A=jY@Xf&Bmy1Gz6Tz97Fivm`S=59AhBuzM5ZOHwP6 z^Ye>R3>a7$xWMjrNX;uLstm}_%q#IPEh#81(M!*X4}fcBU}fM0`w>%J8QfM@1`co- zU{h0C2C|D296s3O%M0?0L4I*(U}4Z^U|?WlU|?_nhch!c444=g7(5tQz-*8@P<(hG zg&8{o1A_oq4I&(sK?=cQ5PhI-#)?pLKyCwtxe^i|ln&&O z_@FQc@j>Q*)PvFoh!1ipO{jSwEgeTXnca=8ziQ{z`~%*0Pz3V#s}qn5Fcb; z0#rTBJP;ogr!e^xs65O)AU-ILLGoq{tl&5Wg(WEbKw>`_n80O;Ei`UD!0Cp80mKKH z;R7v)Kzxv$0njojkO5TEFfddzFff4BfXsu5)j-8SeuRnDLd8Jg9KgU1j?+2@h<=cI zkUS_II5My@fa0K@fdQO1KxqYJHz+Transform.M.M); - - Model& currentModel = Models[c->ModelIdx]; - Material& currentMaterial = Materials[c->MaterialIdx]; - bgfx::setVertexBuffer(0, currentModel.VertexBuffer); - bgfx::setIndexBuffer(currentModel.IndexBuffer); - bgfx::setState(currentMaterial.State); - bgfx::setUniform(Materials[0].Uniforms[Material::UniformTimeIdx], TimeValues); - - // Submit primitive for rendering to view 0. - bgfx::submit(0, currentMaterial.Shader); - } - } + GetInstance().GameLevel.Cubes.Render(Models, Materials); + GetInstance().GameLevel.Tests.Render(Models, Materials); bgfx::dbgTextPrintf(1, 1, 0x0F, "Time: %.1f", GetInstance().Now); bgfx::dbgTextPrintf(1, 2, 0x0F, "Frame: %u", GetInstance().FrameCounter); @@ -249,4 +226,18 @@ namespace Game { bgfx::shutdown(); } + + Material Material::LoadFromShader(const char* vertPath, const char* fragPath) + { + bgfx::ShaderHandle vertexShader = loadShader("vert"); + bgfx::ShaderHandle fragmentShader = loadShader("frag"); + + Material mat; + mat.Shader = bgfx::createProgram(vertexShader, fragmentShader, true); + mat.State = 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LESS | + BGFX_STATE_CULL_CCW | BGFX_STATE_MSAA; + mat.Uniforms[Material::UTime] = bgfx::createUniform("u_time", bgfx::UniformType::Vec4); + mat.Uniforms[Material::UDotColor] = bgfx::createUniform("u_testColor", bgfx::UniformType::Vec4); + return mat; + } } // namespace Game diff --git a/src/game/rendering/Rendering.h b/src/game/rendering/Rendering.h index 9090fc1..faf3e48 100644 --- a/src/game/rendering/Rendering.h +++ b/src/game/rendering/Rendering.h @@ -11,6 +11,9 @@ namespace Game float x; float y; float z; + float n_x; + float n_y; + float n_z; uint32_t abgr; float uv_x; float uv_y; @@ -105,10 +108,16 @@ namespace Game struct Material { - static constexpr uint32_t UniformTimeIdx = 0; + enum UniformNames : uint32_t + { + UTime = 0, + UDotColor = 1, + }; + bgfx::ProgramHandle Shader; bgfx::UniformHandle Uniforms[8]; uint64_t State = 0; + static Material LoadFromShader(const char* vertPath, const char* fragPath); }; struct Camera diff --git a/src/game/shaders/frag.sc b/src/game/shaders/frag.sc index 0cf41bf..17823e8 100644 --- a/src/game/shaders/frag.sc +++ b/src/game/shaders/frag.sc @@ -1,24 +1,26 @@ $input v_color0 +$input v_normal $input v_uv0 $input v_wpos uniform vec4 u_time; +uniform vec4 u_testColor; #include "common.sh" float circle(vec2 uv, float radius) { float distSq = uv.x * uv.x + uv.y * uv.y; - // float result = distSq / (radius * radius); - float result = sqrt(distSq) / radius / 2; - // float result = sqrt(distSq) / radius; - return result < 0.4; + float result = sqrt(distSq) / radius; + // return result < 0.5; return clamp(1.0 - result, 0.0, 1.0); } -float calcBrightness(vec3 lightPos, vec3 vertPos) +float calcBrightness(vec3 lightPos, vec3 vertPos, vec3 normal) { - return clamp(1.0 - distance(lightPos, vertPos) * 0.01, 0.0, 1.0); + vec3 lightDir = normalize(lightPos - vertPos); + float diffuse = max(0.0, dot(lightDir, normal)); + return diffuse * clamp(1.0 - distance(lightPos, vertPos) * 0.01, 0.0, 1.0); } float circles(vec2 uv, float level, float subLevel, float brightness) @@ -43,15 +45,21 @@ float circles(vec2 uv, float level, float subLevel, float brightness) return min(sum, 1.0); } +vec3 desaturate(vec3 color) +{ + return vec3_splat(dot(color, vec3(0.33, 0.34, 0.33))); +} + void main() { - float testRadius = 50.0; + float testRadius = 30.0; float testSpeed = 1.0; vec3 testOffset = vec3(0.0, 0.0, 50.0); - float brightness = calcBrightness(testOffset + vec3(sin(u_time.x * testSpeed) * testRadius, 0.0, cos(u_time.x * testSpeed) * testRadius), v_wpos); - brightness = 0.2 + brightness * 0.8; + float3 lightPos = vec3(sin(u_time.x * testSpeed) * testRadius, 5.0, cos(u_time.x * testSpeed) * testRadius); + float brightness = calcBrightness(lightPos, v_wpos, v_normal); + // brightness = 0.1 + brightness * 0.9; - float baseScale = 10.0; + float baseScale = 2.0; float2 dx = ddx(v_uv0 * baseScale); float2 dy = ddy(v_uv0 * baseScale); float2x2 mat = float2x2(dx, dy); @@ -63,13 +71,19 @@ void main() float2 freq = sqrt(float2(qq + discriminant, qq - discriminant) / 2.0); float spacing = freq.y * exp2(2.0); - spacing = 4.0 / spacing; + spacing = 1.0 / spacing; spacing *= brightness; // TODO: check reference to see how to calculate this! - float spacingLog = max(log2(spacing), 1.0); + float spacingLog = max(log2(spacing), 0.0); int patternScaleLevel = floor(spacingLog); float patternFractional = spacingLog - patternScaleLevel; vec2 uv = v_uv0 * exp2(patternScaleLevel); float dither = circles(uv, patternScaleLevel, patternFractional, brightness); - gl_FragColor = lerp(dither, vec4(0.1, 0.1, 0.15, 1.0), vec4(0.9, 0.75, 0.3, 1.0)); + vec3 color = desaturate(u_testColor.xyz) * 0.01 + dither * u_testColor.xyz * 0.95; + vec3 smoothColor = brightness * u_testColor.xyz; + vec3 mixedColor = 0.1 * smoothColor + 0.9 * color; + gl_FragColor = vec4(mixedColor, 1.0); + // gl_FragColor = brightness; + // gl_FragColor = dither; + // gl_FragColor = u_testColor; } diff --git a/src/game/shaders/varying.def.sc b/src/game/shaders/varying.def.sc index 2cd00a9..cdd8009 100644 --- a/src/game/shaders/varying.def.sc +++ b/src/game/shaders/varying.def.sc @@ -1,7 +1,9 @@ vec4 v_color0 : COLOR0 = vec4(1.0, 1.0, 0.0, 1.0); +vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0); vec2 v_uv0 : TEXCOORD0 = vec2(0.0, 0.0); vec3 v_wpos : TEXCOORD1 = vec3(0.0, 0.0, 0.0); vec3 a_position : POSITION; +vec3 a_normal : NORMAL; vec4 a_color0 : COLOR0; vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/game/shaders/vert.sc b/src/game/shaders/vert.sc index 0a95563..746d180 100644 --- a/src/game/shaders/vert.sc +++ b/src/game/shaders/vert.sc @@ -1,5 +1,5 @@ -$input a_position, a_color0, a_texcoord0 -$output v_color0, v_uv0, v_wpos +$input a_position, a_normal, a_color0, a_texcoord0 +$output v_color0, v_normal, v_uv0, v_wpos #include "common.sh" @@ -9,4 +9,6 @@ void main() v_color0 = a_color0; v_uv0 = a_texcoord0; v_wpos = mul(u_model[0], vec4(a_position, 1.0)).xyz; + + v_normal = normalize(mul((mat3)u_model[0], a_normal)); }