From f637f0ec085f61f16502eaa532f7aa2856c7e2e91daee96deff9a9a4117a2647 Mon Sep 17 00:00:00 2001 From: Mexpert_PRO Date: Sun, 1 Mar 2026 20:53:06 +0100 Subject: [PATCH] made trees possible, but they still have issues with overlapping each other wrongly, i suspect the chunkborders, because it mostly happens in lines --- TSE | 2 +- TSE-RTS/Resources/tiles.png | Bin 3873 -> 4663 bytes TSE-RTS/Resources/trees.aseprite | Bin 0 -> 23463 bytes TSE-RTS/Resources/trees.png | Bin 0 -> 38592 bytes TSE-RTS/src/game.cpp | 109 ++++++++++++++++++--- TSE-RTS/src/game.hpp | 2 + TSE-RTS/src/main.cpp | 5 +- TSE-RTS/src/shaders/LastPassShader.cpp | 20 ++++ TSE-RTS/src/shaders/LastPassShader.hpp | 4 + TSE-RTS/src/shaders/LastPassShaderGLSL.hpp | 24 ++++- TSE-RTS/src/shaders/TileMapShader.cpp | 9 +- TSE-RTS/src/shaders/TileMapShader.hpp | 2 + TSE-RTS/src/shaders/TileMapShaderGLSL.hpp | 16 ++- 13 files changed, 171 insertions(+), 22 deletions(-) create mode 100644 TSE-RTS/Resources/trees.aseprite create mode 100644 TSE-RTS/Resources/trees.png diff --git a/TSE b/TSE index 769bbd4..f859288 160000 --- a/TSE +++ b/TSE @@ -1 +1 @@ -Subproject commit 769bbd426169ff79d55975524197abb9519a4774c04df0a8a92c4135f0e70eb4 +Subproject commit f8592886899fe936be29b1d0268ec86ea46e5ad6cae0dc4d1d4ba31299662c27 diff --git a/TSE-RTS/Resources/tiles.png b/TSE-RTS/Resources/tiles.png index a3a39b1da7010f7e5fefc5e4db1e1e707d4154ecb09c37a5cc4ac7cbba7c8f14..67455d4fcf28ab54759c0fec308650773707d0821e86b2ec105a172fc1da604a 100644 GIT binary patch literal 4663 zcmeHJ`8$+rAHQuG6Eg2B$uhE>6B0U-EvBTr3Ka&&U@Ym#k}Z*8W{@+J_3gA!p`yq> z#8}6e981=04Ozw#jwMFX42F3h{SD`r_qxt=UH9``*Zq9&&;7YR_xJn#-1n~7T1vp> z-~a##tN&Qo0U$`+8?b%QjCl8ZRp=uSW@l**N_!L*06?r+S)6r<%=|KbiF}QDr)jP1 zXjV$ro&V@|Uz4LXO_uLl7Qa`eC#Y(z>ubOWZE{x=5HUY;B5pak{pTbtX&4+K8=vEG znIa=7;%T8P93=kuaOV-#bL4<~$P1@8f*V2A0K_9D2 zn5=*nMwv^2zpPfT_C;`K9ZiL|CF!-yLvf(#kEo=3FQJuw%7(YN-L&TrzD(sUi)2N7 zZNa(VW%e^1K^X>aRR*87hNjBT1uwEY#m<5kB|UuXgO8S@pn4a0kBdGclPcP@ZX~3`0xXCSEiIJ=LgD>CrNQO`{}Osu$wMF zB6O2tZJ+>T+%qKJ2-^23^P|;%`dBxM-#Vz|X$Ng%n{97TfR3;=e6i~J7sYMHQPdjl zE$Z3w))FpcXMukJFdMvfinUvKJp&r%mi^WYyH* zdhb5>bGa;?!&wkRi2~ge`)vbMW((`*1ngHRx@-4giJ#fpn3~dl;PFfTZSBldC-)e= zMozy!A|hTR!EWR`JFj3=kZLLp0&>2P$yxjJRpA&0e0v2fS(8aT@HF&rKb!N&0$8Us7$v`Y=?w!vVY~y_CK-tUg?7yV{Jb zF2yaNEb-;&fE4D{W=6hRvHs6M< zB$(`ta>BRf5zWc+c{f8-6C++nQP72lnQ|-kCr%D1(AST)O!6CPC|pkpjWe?+$<}7t z%=$N_w%@c_ETi4UhY3^8<=j6XwDF}0k`R9VV(hU4tV0L{6B~In$Ll;L()SgYMb4PHzxKGg473H36vB_*9P&XVkx9CkmAaK=^ zDiz23rES8Qu*VwiO0tU6WdWCJYlh?#zD(qmOi1IcPJpCiL>ng1_DYsrKDOn$r|0Ea z_#}ksji?FRUG5W-V8XO4T|DVMTGFD z)ZZhZ%wpoH2K6`Do!GjQ^{3crX7!leoQNv1)yy#z^HGS^DAq3Gt21o z7S6aEqp)D-K%Gu^)Gk^cH}z77m7G!REhrooP`usx9 z$YPHh5vU>PlAei@_||5XaE^ScB$GQ!&>5XD9j2Rd8p_MWy7W_$%Xjtz@xXdn!g(J| zu@9yY&4`?x+D=6t6JykUnJUCkfASG<3J=6?Z4UOOW2)WyLpbw_W3SL)Qgo_F4{lT4!y1!y+q-j9PSK}R zNH^qTYwKi}jJdVlFMeAS1)0}ITdw%y+R|J{#^_$ckH_t_JeOE^^1o{U zAU{8>PmB@wHhUYk;><<6>10&Ws)Giy&W3Knp7LT`{|y6~4k@HFc9jSD7AAsSKnB=T1F+*DmRMtJWas*Wn>k z_wNn#m^C^zG0iQC*GBT8>s6-bMGlZ_*1yhIyPTE)!)L+}?5?3U$x&fDW>G&wAw&I7~_*~rB{%j?Px2ZPXQRWa^JVxP)f2Qnz^z*HW) zGv#2Mx5x{qrvGSFf3u%K#k8P%3*b$8=!S~3AFd*ZkWCugf=Mb8-yHz$RjKh6QUNaG zosUF5|03Z0kl#}Qd77p$34Ufu6gVs>h_y&*6+S&$Ls*I*HX__!F)H@}GBY|Ti+>5- z#g?v0Et>$StADsQ<@^TDxW@k|ia@;OCdokbT^i$eMqeLG+bo!Pxp6Qq<_D)wF2-_& z=9HSR>6H>qe+AQ7<&gCTz_jJ}*!)#k9rF zZb=~NUkkj~zJ1-`j}+qYiLcAtV|XiMgvKjY`#T0H3Aw=s;H!ts+iFB(Ec1QmHODs3H6t zjr^1{Lgzgq%S=_@#L#OiE1sAKucp%z)i)x(!Jc{{6O)zKtZRi;_Kg+?9~@^iCe7MvEtGlqH5wt2OkOomkXeX=Q_GCv zI(ydq;q(!G{3v(U6!Ojpm!PYOysuC;{H(w*o8$fzczGj_kUuBYP&CVx1;kgOXy4@! zZJX6}dH+o7=V3grSbJJ)8vrr>$#LavwZ)4Hi~{p6DD*{8$&3dST6D@Xcv(u%Y#)%l z=&e@VVVGVp2TN7-@=i+=fPARK@Gs+@*9%W+uL3h{6tnHS*OsC(K0g@Y%0j1ivcOct zRUy6tKI59x4DqpLe9VeNdZuD$Irk)IydNKq7Xkr!tp}UNMU^s2G|zWmv}4*gSizt9 z%tH!Z+A@yr+t?UI$}Hfbt^b%nRdC-5!hl*ynSkq1h;|DHw={>NrJ*#o&05ecc~Z}! zqLZPH6dK>ca0nBA@X}TwA|@sbYGr7>NQdH2hUw)`W<){p)4pl1#Sm?8y*8-a(eak8 zgEOwJ*HfWe*kD_u==9beFsrm&fb+HgzqWiop?DyOi>G)rV8$}H{0 ztKpK3+K!f1n%m5gDPjdRMV&J>CBVqHp@uF6lb7>6?EG;4fSupsy13xFzn|~@d_MPm zKc6pm$3;1!)}sIbj?p{GQ~>Nb@E5rfLe?lAzXSc)v8YjzpuXE{3IL~(XmZ3SdBT}z z;rs)M*!DT~FXuP9cepxJvMbP!WSsT*4PX3S+Ho*pX>$_)IvvlwRE>z)5Yhb1grfPH)_Xm zHjdVg6fO)a_-;jXl%%0x?$u18Q8zbOT|&pPlO-NpusfxxVy0f-`F;Q*mzQ?97C+?5 zPA()M?5s33V4@{XfKNsYYCFdi~X&a z7cTItl*ZSQAQoSI@F&Kxac3^6L_J_$9RVf}-LA;2)py1QAY!2NIy^1JbO#rYv~O4C zi^vQJdJj+AVmg|zN;*8+ykLw(gOHKs7sNfrF&RqQ*g*)|gDl6giFhQK$qCDhd)IWd zDKh)LQNay2Zo+Db5bEmSt@y7J93?5WXknIdY!^?{f1j`!VMlM4RlG=n2tGk}L$^pg zjk3drk91dPQ|=R*naJ({)6wN(jnY=HxpS-HIkkf@7>E!!v&DDtKmVlfTonO^knPpQ zX@?V$zEE{bWcJjk0GjybQ(jY1nlDfDO;73>T7+?oie!%x8qO7XfA0*P{wkM+LDBg= zgwOvuFHip1t+6_76-9Sy`bQCe3-gpG24hgOmP?2F8W1%(VT-#TTnc)JZ7^#^qWt6i z_v>bBlXdL;7h1sa_xd-}7pKBBVs^%?mMZk2oo0hqVQLogaIt#tfHT*}1n3H<`M17u z=f*;oB_RWCUV57VG!LMRLL)KG;i$<;q?ipwzf?t09&q^j0ieTw4sYEQUDHKRAvYaFQs8 z@U&3az=%-?@N5RliJn1wK|m8Jds^RF<_4254u*n?K74SKzVnikw3e4vzXyp52b0X( zfKm(r(9TOr#{AUDN8^VXwX*4 z?Mwb!LE)vIK9>4>bDuBBmB*~xG0fInlR4=*GXW*_kcXiG?ds`JQHwhU6V!InCtZtr zMy=Mz=vD$+)#;sy-@D_uCyd)|7Dk160}e)b&%v)X=ujp;Z;#Oq3d+Ey^ETx{@JM%R zJIfK)DZ5SP@5i!9)*GiIauRH4Z|p=w@1H{67PW@2+J6&n7?@vKynjxDX9C6kL;tiB zpkNBWn^Jqfb?+f~Z-X7{PCL+lV8W7eeklDLy)V#)Vj*3gx^a(eu@pfySO*L|S!nOB zPLf|OmYt}&XD(1I#6KK=ZO6$W=1t|N@cDTkJoovJ+k0FT-IYNn;ytt)74MPnAAVMRbc*8 zB1K4#oiGV`$w{Of9t?j1i_)u7oxUP>x;i{sk-Yr+nlqfTyE=39h9*+RwC(CXTa?U> ziyvoKlQObwbqpJ3S!vy>xk}3T-G;^dZ{#i~+q%0N3FWF?4@((PG>!`sH#HQhZQ+TV z1C+~=8JV`LBeqvz{-e;RVM}x&>Wk{)9$!XUArzb6dZ2#(`p>4xuP4%i^T(Gw%4K2Y zZD0N11n5MkUE%FxQMh2YaDsIv&7*sH*)>LO{ADb;*~@A={qocwN^8~Sg27)Gmh8b~ z9Szi+Um9>(J0S@v-PW;bZH?M8HOA)~O%q`*g;sfZ4EEs1x$2X1`?0b3A^6JBpvEpQ z?h*O;^2g){fB0K#_h0KzZZbCJxQ=%k-UT_OXfWke4kgm#^!K0(qLg`XYOv zWneuD*8?a+p=#7UStW=@93R(*c)YGkj`6I{6^OKm5Wv%W0Tw^-z&DDs0Xj#VGt zo#kS)%IRt%J9ad89w)JSN&1&9F6uKw$O!E|z@Z*rNv}QP>qDP6AZs=Z2O(m*FkTtu zYM;=cT+_JGGOySulLJ5sHJ~&Fx!Azsy@UD~>iJiW(u*uaNu^fs)3Ya4-(DL>->V*j zn&9l8`1I4JGf5YGeS7zTEEa-M zQaR@jcKDQC@Vj)xcb@`t6Pw;7haRi@ahucKa#m)3&u4vsT{5Sh#&KiLGs^tjzfPS+ zBfw>0%j!JVnqORHVsZ(QOPc0xXL=mt5!s=GE?AlT)woD(6j0uJ{;1fWNnkL z1(kKrFZeG83x>PqR)CsWrN3VRB~uu4C;(Pu`UVYr)I;P(x2;Qef}^KfsMI=u{yo!m zR1uN;u1wrNkb8;(W3JSh?VN;l6Vzn&od5sjb^YrXz#GOl3cOL^jRJqY0@pQGgr+m6 SXSg%*+P> diff --git a/TSE-RTS/Resources/trees.aseprite b/TSE-RTS/Resources/trees.aseprite new file mode 100644 index 0000000000000000000000000000000000000000000000000000000000000000..c5abac3498ec7403bb1da519fcbc55e1c86ebe4d6d8c318549b6136fa6def9fc GIT binary patch literal 23463 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 ^Owc=Hy_fY7UGx525k)Ly7 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 LtLu_yXRiGpN{Ai~ literal 0 HcmV?d00001 diff --git a/TSE-RTS/Resources/trees.png b/TSE-RTS/Resources/trees.png new file mode 100644 index 0000000000000000000000000000000000000000000000000000000000000000..a45dfb6f20404252f112549055eb0fe2407ef4827c95a734c03c2d10d8abfbbd GIT binary patch literal 38592 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 + s->AddLayer(&propsLayer); TileMap* maps[4]; + OrdererSpriteSet* props; Material* tileMapMaterial = new Material("tileSetMat", ShaderRegistry::GetShader("TileMapShader v2")); + tileMapMaterial->SetValue("spritePivot", Vector2(0,0)); + Texture* setTexture = new Texture("tiles.png"); + TileSet* set = new TileSet(setTexture, 10, 10); for (int i = 0; i < 4; i++) { Transformable* tileMap = new Transformable("tileMapL" + std::to_string(i)); tileMap->position += {0,0.5f * i,0}; gameLayer.AddTransformable(tileMap); - Texture* setTexture = new Texture("tiles.png"); - TileSet* set = new TileSet(setTexture, 10, 10); TileMap* map = new TileMap(); map->chunkSize = 12; map->set = set; @@ -42,19 +49,40 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd) maps[i] = map; } + + Material* objectsMaterial = new Material("objectsTileSetMat", ShaderRegistry::GetShader("Basic Ordered Sprite Set Shader")); + Texture* treeSetTexture = new Texture("trees.png"); + TileSet* treeSet = new TileSet(treeSetTexture, 6, 2); + Transformable* tileMap = new Transformable("propMap"); + propsLayer.AddTransformable(tileMap); + OrdererSpriteSet* map = new OrdererSpriteSet(); + map->chunkSize = 12; + map->set = treeSet; + //map->SpriteScale = Vector2(1,2); + + Renderable* rend = new Renderable(objectsMaterial); + + tileMap->AddBehaviourScript(map); + tileMap->AddBehaviourScript(rend); + + props = map; + + Random rnd = Random(12345u); - - const siv::PerlinNoise::seed_type seed = 123456u; - const siv::PerlinNoise perlin{ seed }; + const siv::PerlinNoise perlin{ rnd.nextUInt() }; + const siv::PerlinNoise perlin2{ rnd.nextUInt() }; for (int x = circleRadius * -4; x < circleRadius * 4; x++) { for (int y = circleRadius * -4; y < circleRadius * 4; y++) { float noise = (float)perlin.octave2D_01(x * 0.05f,y * 0.05f, 4); + float treeNoise = (float)perlin2.octave2D_01(x * 0.05f,y * 0.05f, 2); float noiseFallof = 1; + float treeNoiseFallof = 1; Vector2 realpos = maps[0]->TileMapToRealPos(Vector2(x,y)); + Vector2 realposprop = (maps[0]->TileMapToRealPos(Vector2(x,y)) + Vector2(0, 0.25f)) * Vector2(1,0.5f); realpos *= {1,1.5f}; float dist = realpos.Length(); if(dist <= circleRadius && dist >= circleFallof) @@ -62,24 +90,54 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd) float reldist = dist - circleFallof; noiseFallof = (reldist / (circleRadius - circleFallof) - 1) * -1; } + if(dist <= treeCircleRadius && dist >= treeCircleFallof) + { + float reldist = dist - treeCircleFallof; + treeNoiseFallof = (reldist / (treeCircleRadius - treeCircleFallof) - 1) * -1; + } + else if (dist > treeCircleRadius) + treeNoiseFallof = 0; noise *= noiseFallof; + treeNoise *= treeNoiseFallof; if(dist <= circleRadius && noise >= 0.2f) { + float treernd = rnd.nextFloat01(); + int treeid = 0; if(noise >= 0.8f) { - maps[3]->SetTile(Vector2(x, y), {0,9}, {2,9}); + if(treeNoise > 0.5f && treernd > 0.4f) + { + treeid = rnd.nextInt(0,5); + props->SetSprite(realposprop + Vector2(0, 0.75f), Vector2(treeid, 1), 4.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0)); + } + maps[3]->SetTile(Vector2(x, y), {0,9}, {1,9}); } else if(noise >= 0.6f) { - maps[2]->SetTile(Vector2(x, y), {0,9}, {2,9}); + if(treeNoise > 0.5f && treernd > 0.4f) + { + treeid = rnd.nextInt(0,5); + props->SetSprite(realposprop + Vector2(0, 0.5f), Vector2(treeid, 1), 3.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0)); + } + maps[2]->SetTile(Vector2(x, y), {0,9}, {1,9}); } else if(noise >= 0.4f) { - maps[1]->SetTile(Vector2(x, y), {0,9}, {2,9}); + if(treeNoise > 0.5f && treernd > 0.4f) + { + treeid = rnd.nextInt(0,5); + props->SetSprite(realposprop + Vector2(0, 0.25f), Vector2(treeid, 1), 2.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0)); + } + maps[1]->SetTile(Vector2(x, y), {0,9}, {1,9}); } else { - maps[0]->SetTile(Vector2(x, y), {0,9}, {2,9}); + if(treeNoise > 0.5f && treernd > 0.4f) + { + treeid = rnd.nextInt(0,5); + props->SetSprite(realposprop, Vector2(treeid, 1), 1.5f / 10.0f, Vector2(1,2), Vector2(treeid, 0)); + } + maps[0]->SetTile(Vector2(x, y), {0,9}, {1,9}); } } } @@ -88,12 +146,17 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd) //RenderingLayer s->AddLayer(&renderingLayer); + s->AddLayer(&characterLayer); + + Transformable* player = new Transformable("Player"); Transformable* lastPassCamera = new Transformable("lastPassCamera"); Camera* lpCam = new Camera(); lpCam->SetRenderTarget(wnd); lpCam->SetRenderScale(1); lpCam->layersNotToRender.push_back(gameLayer.GetID()); + lpCam->layersNotToRender.push_back(propsLayer.GetID()); + lpCam->layersNotToRender.push_back(characterLayer.GetID()); lastPassCamera->AddBehaviourScript(lpCam); CameraSizeChangeNotifyer* camNotifyer = new CameraSizeChangeNotifyer(); camNotifyer->lastSize = {0,0}; @@ -102,21 +165,39 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd) Vector2 canvasSize = wnd->GetSize() / 4.0f; - IRenderTexture* rt = IRenderTexture::factory->CreateTextureHeap(canvasSize, 2); + IRenderTexture* rt = IRenderTexture::factory->CreateTextureHeap(canvasSize, 3); Transformable* firstPassCamera = new Transformable("firstPassCamera"); Camera* fpCam = new Camera(); fpCam->SetRenderScale(256); fpCam->SetRenderTarget(rt); fpCam->layersNotToRender.push_back(renderingLayer.GetID()); + fpCam->layersNotToRender.push_back(propsLayer.GetID()); + fpCam->layersNotToRender.push_back(characterLayer.GetID()); firstPassCamera->AddBehaviourScript(fpCam); RenderTextureResizes* resizer = new RenderTextureResizes(); resizer->rt = rt; camNotifyer->Observe(resizer); firstPassCamera->AddBehaviourScript(resizer); + firstPassCamera->SetParent(player); + + IRenderTexture* rtProps = IRenderTexture::factory->CreateTextureHeap(canvasSize, 3); + Transformable* secondPassCamera = new Transformable("secondPassCamera"); + Camera* spCam = new Camera(); + spCam->SetRenderScale(256); + spCam->SetRenderTarget(rtProps); + spCam->layersNotToRender.push_back(renderingLayer.GetID()); + spCam->layersNotToRender.push_back(gameLayer.GetID()); + spCam->layersNotToRender.push_back(characterLayer.GetID()); + secondPassCamera->AddBehaviourScript(spCam); + RenderTextureResizes* resizerProps = new RenderTextureResizes(); + resizerProps->rt = rtProps; + camNotifyer->Observe(resizerProps); + secondPassCamera->AddBehaviourScript(resizerProps); + secondPassCamera->SetParent(player); //Render pipeline setup - gameLayer.AddTransformable(firstPassCamera); + characterLayer.AddTransformable(player); renderingLayer.AddTransformable(lastPassCamera); //final @@ -130,9 +211,13 @@ void game::setup(TSE::Scene* s, TSE::IWindow* wnd) Material* canvasMat = new Material("canvasMat", ShaderRegistry::GetShader("LastPassShader")); canvasMat->SetValue("threshold", 0.01f); - canvasMat->SetValue("darken", 0.45f); + canvasMat->SetValue("darken", 0.15f); canvasMat->SetValue("colorTextureID", rt->GetTextureId(0)); canvasMat->SetValue("heightTextureID", rt->GetTextureId(1)); + canvasMat->SetValue("depthTextureID", rt->GetTextureId(2)); + canvasMat->SetValue("colorTexture2ID", rtProps->GetTextureId(0)); + canvasMat->SetValue("heightTexture2ID", rtProps->GetTextureId(1)); + canvasMat->SetValue("depthTexture2ID", rtProps->GetTextureId(2)); Renderable* canvasRenderer = new Renderable(canvasMat); CanvasScaler* canvasScaler = new CanvasScaler(); diff --git a/TSE-RTS/src/game.hpp b/TSE-RTS/src/game.hpp index 013883f..afd8e0a 100644 --- a/TSE-RTS/src/game.hpp +++ b/TSE-RTS/src/game.hpp @@ -6,7 +6,9 @@ class game { public: inline static TSE::Layer gameLayer = TSE::Layer("gameLayer"); + inline static TSE::Layer propsLayer = TSE::Layer("propsLayer"); inline static TSE::Layer renderingLayer = TSE::Layer("renderingLayer"); + inline static TSE::Layer characterLayer = TSE::Layer("characterLayer"); static void setup(TSE::Scene* s, TSE::IWindow* wnd); }; \ No newline at end of file diff --git a/TSE-RTS/src/main.cpp b/TSE-RTS/src/main.cpp index fb4cfb3..2e3af2b 100644 --- a/TSE-RTS/src/main.cpp +++ b/TSE-RTS/src/main.cpp @@ -18,7 +18,7 @@ #include "shaders/TileMapShader.hpp" #include "shaders/LastPassShader.hpp" -//#define USE_EDITOR +#define USE_EDITOR using namespace TSE; using namespace TSE::GLFW; @@ -32,7 +32,7 @@ EditorSubsystem* editor; void SetupWindow() { - Color backColor(0.0571f, 0.0819f, 0.1043f); + Color backColor(0.0f, 0.0f, 0.0f, 0.0f); #ifdef USE_EDITOR wnd = new WindowGlfw(PROJECT_NAME, 800, 600, new OpenGLRenderingBackend(backColor, false, 8, true), WindowType::Maximized); editor = new EditorSubsystem(); @@ -50,6 +50,7 @@ void SetupWindow() #ifdef USE_EDITOR ((Camera*)Transformable::Find(".EditorCamera")->GetBehaviourScript(CAMERA))->layersNotToRender.push_back(game::renderingLayer.GetID()); + ((Camera*)Transformable::Find(".EditorCamera")->GetBehaviourScript(CAMERA))->SetRenderScale(128); currentScene->AddLayer(&editor->editorLayer); editor->hv.SetScene(currentScene); #endif diff --git a/TSE-RTS/src/shaders/LastPassShader.cpp b/TSE-RTS/src/shaders/LastPassShader.cpp index c7f5520..b476c0e 100644 --- a/TSE-RTS/src/shaders/LastPassShader.cpp +++ b/TSE-RTS/src/shaders/LastPassShader.cpp @@ -36,6 +36,10 @@ void LastPassShader::Init(float width, float height) instance->Enable(); instance->SetUniform("colorTexture", 0); instance->SetUniform("heightTexture", 1); + instance->SetUniform("depthTexture", 2); + instance->SetUniform("colorTexture2", 3); + instance->SetUniform("heightTexture2", 4); + instance->SetUniform("depthTexture2", 5); instance->Disable(); } @@ -64,6 +68,14 @@ void LastPassShader::OnFlush() glBindTexture(GL_TEXTURE_2D, ColorTextureID); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, HeightTextureID); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, DepthTextureID); + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, ColorTexture2ID); + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, HeightTexture2ID); + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, DepthTexture2ID); SetUniform("uThreshold", Threshold); SetUniform("uDarken", Darken); } @@ -79,10 +91,18 @@ void LastPassShader::OnSubmit(const TSE::Transformable &t, float *&target, TSE:: if (!r) return; if(!r->GetMaterial()->HasValue("colorTextureID")) return; if(!r->GetMaterial()->HasValue("heightTextureID")) return; + if(!r->GetMaterial()->HasValue("depthTextureID")) return; + if(!r->GetMaterial()->HasValue("colorTexture2ID")) return; + if(!r->GetMaterial()->HasValue("heightTexture2ID")) return; + if(!r->GetMaterial()->HasValue("depthTexture2ID")) return; if(!r->GetMaterial()->HasValue("threshold")) return; if(!r->GetMaterial()->HasValue("darken")) return; ColorTextureID = r->GetMaterial()->GetValue("colorTextureID"); + ColorTexture2ID = r->GetMaterial()->GetValue("colorTexture2ID"); HeightTextureID = r->GetMaterial()->GetValue("heightTextureID"); + HeightTexture2ID = r->GetMaterial()->GetValue("heightTexture2ID"); + DepthTextureID = r->GetMaterial()->GetValue("depthTextureID"); + DepthTexture2ID = r->GetMaterial()->GetValue("depthTexture2ID"); Threshold = r->GetMaterial()->GetValue("threshold"); Darken = r->GetMaterial()->GetValue("darken"); diff --git a/TSE-RTS/src/shaders/LastPassShader.hpp b/TSE-RTS/src/shaders/LastPassShader.hpp index 2748c5f..7c47795 100644 --- a/TSE-RTS/src/shaders/LastPassShader.hpp +++ b/TSE-RTS/src/shaders/LastPassShader.hpp @@ -10,7 +10,11 @@ class LastPassShader : public TSE::GLFW::Shader private: static LastPassShader* instance; GLuint ColorTextureID; + GLuint ColorTexture2ID; GLuint HeightTextureID; + GLuint HeightTexture2ID; + GLuint DepthTextureID; + GLuint DepthTexture2ID; float Threshold; float Darken; diff --git a/TSE-RTS/src/shaders/LastPassShaderGLSL.hpp b/TSE-RTS/src/shaders/LastPassShaderGLSL.hpp index bfb3ff8..08ae666 100644 --- a/TSE-RTS/src/shaders/LastPassShaderGLSL.hpp +++ b/TSE-RTS/src/shaders/LastPassShaderGLSL.hpp @@ -28,6 +28,10 @@ inline const char* fragLastPass = R"( uniform sampler2D colorTexture; uniform sampler2D heightTexture; + uniform sampler2D depthTexture; + uniform sampler2D colorTexture2; + uniform sampler2D heightTexture2; + uniform sampler2D depthTexture2; uniform float uThreshold; uniform float uDarken; @@ -76,8 +80,7 @@ inline const char* fragLastPass = R"( } void main() - { - + { ivec2 size = textureSize(heightTexture, 0); ivec2 p = clamp(ivec2(fs_in.uv_out * vec2(size)), ivec2(0), size - ivec2(1)); @@ -87,8 +90,21 @@ inline const char* fragLastPass = R"( float maskH = step(uThreshold, changeInHeight); float maskN = step(uThreshold, changeInNormal); float mask = max(maskH, maskN); - - vec3 col = texelFetch(colorTexture, p, 0).rgb; + + float d1 = texelFetch(depthTexture, p, 0).r; + float d2 = texelFetch(depthTexture2, p, 0).r; + float h1 = texelFetch(heightTexture, p, 0).a; + float h2 = texelFetch(heightTexture2, p, 0).a; + + vec3 col1 = texelFetch(colorTexture, p, 0).rgb; + vec3 col2 = texelFetch(colorTexture2, p, 0).rgb; + + vec3 col = col1; + + if(d2 < d1 && d2 != 0 || h1 < h2 && h2 != 0 && d2 >= d1) + { + col = col2; + } col *= mix(1.0, 1.0 - uDarken, mask); color = vec4(col, 1.0); diff --git a/TSE-RTS/src/shaders/TileMapShader.cpp b/TSE-RTS/src/shaders/TileMapShader.cpp index 40086f0..067c6e8 100644 --- a/TSE-RTS/src/shaders/TileMapShader.cpp +++ b/TSE-RTS/src/shaders/TileMapShader.cpp @@ -151,6 +151,7 @@ void TileMapShader::OnDrawCall(int indexCount) SetUniform("spriteCount", &SpriteCount); SetUniform("spriteScale", &SpriteScale); SetUniform("layerHeight", LayerHeight); + SetUniform("spritePivot", &SpritePivot); GLint prevElementBuffer = 0; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &prevElementBuffer); @@ -183,12 +184,16 @@ void TileMapShader::OnSubmit(const Transformable &t, float *&target, Transformat auto* tm = dynamic_cast(t.GetBehaviourScript(TILE_MAP)); if (!tm) return; - LayerHeight = t.position.y / 1.5f; + LayerHeight = (1 + t.position.y / 0.5f) / 10.0f; + + if(!r->GetMaterial()->HasValue("spritePivot")) return; + SpritePivot = r->GetMaterial()->GetValue("spritePivot"); auto tileSet = tm->GetTileSet(); TextureID = tileSet->GetTextueID(); SpriteCount = tileSet->GetCount(); SpriteScale = tm->SpriteScale; + auto nextLine = tm->GetNextLineOffset(); const std::vector orderedChunks = *tm->GetChunkPositionsInOrder(); @@ -206,7 +211,7 @@ void TileMapShader::OnSubmit(const Transformable &t, float *&target, Transformat for (int i = 0; i < spriteCount; i++) { - Matrix4x4 mat = Matrix4x4::ToTranslationMatrix((chunkPos - chunk->nextLine * chunkPos.y) + spritePositions[i]) * Matrix4x4::ToRotationMatrix(Quaternion()) * Matrix4x4::ToScaleMatrix({1,1,1}); + Matrix4x4 mat = Matrix4x4::ToTranslationMatrix((chunkPos * Vector2(nextLine.x, nextLine.y * 0.5f) + Vector2(-nextLine.x * chunkPos.y, nextLine.y * 0.5f * chunkPos.x)) + spritePositions[i]) * Matrix4x4::ToRotationMatrix(Quaternion()) * Matrix4x4::ToScaleMatrix({1,1,1}); stack.Push(mat); Vector3 pos = stack.Top() * Vector3(0,0,0); diff --git a/TSE-RTS/src/shaders/TileMapShader.hpp b/TSE-RTS/src/shaders/TileMapShader.hpp index 789589e..ddb2b7e 100644 --- a/TSE-RTS/src/shaders/TileMapShader.hpp +++ b/TSE-RTS/src/shaders/TileMapShader.hpp @@ -24,6 +24,8 @@ private: TSE::Vector2 SpriteCount; TSE::Vector2 SpriteScale; float LayerHeight; + int isObjectsLayer; + TSE::Vector2 SpritePivot; public: static TileMapShader* Instance(); diff --git a/TSE-RTS/src/shaders/TileMapShaderGLSL.hpp b/TSE-RTS/src/shaders/TileMapShaderGLSL.hpp index 99eea45..ce6e587 100644 --- a/TSE-RTS/src/shaders/TileMapShaderGLSL.hpp +++ b/TSE-RTS/src/shaders/TileMapShaderGLSL.hpp @@ -13,10 +13,12 @@ inline const char* vertTile2 = R"( uniform mat4 camMatrix; uniform vec2 spriteCount; uniform vec2 spriteScale; + uniform vec2 spritePivot; out vec2 vUV; flat out int vSpriteId; flat out int vNormalId; + flat out float vTileNdcY; void main() { @@ -26,11 +28,18 @@ inline const char* vertTile2 = R"( vec3 worldPos = (iTilePos * tileSize) + (local * tileSize); - gl_Position = prMatrix * camMatrix * vec4(worldPos.x, worldPos.y, worldPos.z, 1.0); + vec4 clip = prMatrix * camMatrix * vec4(worldPos, 1.0); + gl_Position = clip; vUV = baseUV; vSpriteId = int(iSpriteId + 0.5); vNormalId = int(iNormalId + 0.5); + + vec3 localbottom = vec3(spritePivot.x, spritePivot.y, 0); + vec3 worldPosBottom = (iTilePos * tileSize) + (localbottom * tileSize); + vec4 clipbottom = prMatrix * camMatrix * vec4(worldPosBottom, 1.0); + float ndcY = clipbottom.y / clipbottom.w; + vTileNdcY = ndcY * 0.5 + 0.5; } )"; @@ -40,6 +49,7 @@ inline const char* fragTile2 = R"( in vec2 vUV; flat in int vSpriteId; flat in int vNormalId; + flat in float vTileNdcY; uniform sampler2D atlas; uniform vec2 spriteCount; @@ -47,9 +57,13 @@ inline const char* fragTile2 = R"( layout(location = 0) out vec4 FragColor; layout(location = 1) out vec4 FragHeight; + layout(location = 2) out vec4 FragDepth; void main() { + float t = (vTileNdcY + 1.0) * 0.5 *0.8; + FragDepth = vec4(t, 0, 0, 1.0); + vec2 tileUVSize = 1.0 / spriteCount; int cols = int(spriteCount.x);