From 4a06032bea4167d487f83fc281509a7606a45248 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 11 Jan 2023 08:25:38 +0800 Subject: [PATCH] Shadows WIP --- Assets/Application.SHConfig | 2 +- Assets/Scenes/Scene2.shade | 25 ++++++++++++++- Assets/Shaders/DeferredComposite_CS.glsl | 29 ++++++++++-------- Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 6529 -> 6277 bytes Assets/Shaders/TestCube_FS.glsl | 5 ++- Assets/Shaders/TestCube_FS.shshaderb | Bin 2401 -> 2557 bytes Assets/Shaders/TestCube_VS.glsl | 5 ++- Assets/Shaders/TestCube_VS.shshaderb | Bin 3689 -> 3905 bytes .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 12 ++++++-- .../MiddleEnd/Lights/SHLightComponent.cpp | 5 +++ .../MiddleEnd/Lights/SHLightComponent.h | 1 + .../MiddleEnd/Lights/SHLightingSubSystem.cpp | 12 ++++++-- .../MiddleEnd/Lights/SHLightingSubSystem.h | 1 + 13 files changed, 76 insertions(+), 21 deletions(-) diff --git a/Assets/Application.SHConfig b/Assets/Application.SHConfig index 370665d2..10ba697b 100644 --- a/Assets/Application.SHConfig +++ b/Assets/Application.SHConfig @@ -1,4 +1,4 @@ Start in Fullscreen: false -Starting Scene ID: 86098106 +Starting Scene ID: 87285316 Window Size: {x: 1920, y: 1080} Window Title: SHADE Engine \ No newline at end of file diff --git a/Assets/Scenes/Scene2.shade b/Assets/Scenes/Scene2.shade index 2f38a933..c8aa9c6d 100644 --- a/Assets/Scenes/Scene2.shade +++ b/Assets/Scenes/Scene2.shade @@ -5,8 +5,9 @@ Components: Transform Component: Translate: {x: 0, y: 0.304069757, z: 1.73034382} - Rotate: {x: 0, y: 0, z: 0} + Rotate: {x: -1.48352981, y: 0, z: 0} Scale: {x: 1, y: 1, z: 1} + IsActive: true Camera Component: Position: {x: 0, y: 0.304069757, z: 1.73034382} Pitch: 0 @@ -17,6 +18,7 @@ Near: 0.00999999978 Far: 10000 Perspective: true + IsActive: true Scripts: ~ - EID: 1 Name: Raccoon @@ -27,9 +29,11 @@ Translate: {x: 0, y: 0, z: 0} Rotate: {x: 0, y: 0, z: 0} Scale: {x: 1, y: 1, z: 1} + IsActive: true Renderable Component: Mesh: 149697411 Material: 126974645 + IsActive: true Scripts: ~ - EID: 3 Name: Bag @@ -40,9 +44,11 @@ Translate: {x: 0.006237939, y: -0.000393368304, z: 0} Rotate: {x: -0, y: 2.79945588, z: 0} Scale: {x: 1.0000881, y: 1, z: 1.0000881} + IsActive: true Renderable Component: Mesh: 144838771 Material: 123745521 + IsActive: true Scripts: ~ - EID: 2 Name: DirectionalLight @@ -56,6 +62,7 @@ Color: {x: 1, y: 1, z: 1, w: 1} Layer: 4294967295 Strength: 0 + IsActive: true Scripts: ~ - EID: 4 Name: AmbientLight @@ -69,4 +76,20 @@ Color: {x: 1, y: 1, z: 1, w: 1} Layer: 4294967295 Strength: 0.600000024 + IsActive: true + Scripts: ~ +- EID: 5 + Name: Floor + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: 0.0810000002, z: 0} + Rotate: {x: -1.57079637, y: 0, z: 0} + Scale: {x: 50, y: 50, z: 50} + IsActive: true + Renderable Component: + Mesh: 141771688 + Material: 124370424 + IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 2402d4f8..576ce74b 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -47,6 +47,11 @@ layout(std430, set = 1, binding = 4) buffer AmbientLightData AmbientLightStruct aLightData[]; } AmbLightData; +// bool IsInShadow (sampler2D shadowMap, vec2 coords, float depth, mat4 lightVP) +// { +// // vec4 fragPosLightPOV = lightVP * +// } + void main() { // convenient variables @@ -68,6 +73,16 @@ void main() vec4 shadowMapColor = vec4 (1.0f); + for (int i = 0; i < lightCounts.ambientLights; ++i) + { + if ((lightLayer & AmbLightData.aLightData[i].cullingMask) != 0) + { + // Just do some add + //fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (0.5f); + fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (AmbLightData.aLightData[i].strength); + } + } + for (int i = 0; i < lightCounts.directionalLights; ++i) { if ((lightLayer & DirLightData.dLightData[i].cullingMask) != 0) @@ -81,32 +96,22 @@ void main() // Calculate the fragment color fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; + // If the shadow map is enabled (test the bit) if ((DirLightData.dLightData[i].shadowData & uint(1)) == 1) { // calculate shadow map here vec2 texCoord = vec2 (gl_GlobalInvocationID.xy) / vec2 (imageSize (targetImage)); - shadowMapColor = texture (shadowMaps[0], texCoord).xxxx; } } } - for (int i = 0; i < lightCounts.ambientLights; ++i) - { - if ((lightLayer & AmbLightData.aLightData[i].cullingMask) != 0) - { - // Just do some add - //fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (0.5f); - fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (AmbLightData.aLightData[i].strength); - } - } - float ssaoVal = imageLoad (ssaoBlurredImage, globalThread).r; fragColor *= ssaoVal; // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f)); - imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), shadowMapColor); + // imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), shadowMapColor); //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(ssaoVal.rrr, 1.0f)); } \ No newline at end of file diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index fc527efa0308db8d380e4a8cfabff95cb1ce335b..633fd1975d4df1e6788128068fcfc40efa3fb9f7 100644 GIT binary patch literal 6277 zcmZveiJR4B6~})wFvB3Ak|Lx?gS220nu&@8I50M1Gb};0H~wbkGIR5C?{x1S7NdfQ zvLsq)U#%=l4J}(S%51THwST4Ud3v5cpWl7Y@QcTn=gc|hd)D`T&-=UdA6b?aYfks7 zd0Ez#U6d`#{@#JI#aTBOYkQ`em3#t~KKqK^CTpWZg=t&; zKw~^_R~z+hgN3~}TMD199;(y^tNZrNw5V>}-0VttUK^`SG}L>ue)Q=^t7`DxYULm* zcu%&fgtrp58eVTS_vf{ar}?g(#acz&_2{+gD}GT#J4-!dp}MMC0H{KAj9bob>>Bweac5?t%|nV{2ok-fpprz5)Zz(s4KHd984< z_g?-P!&R}@YQ3E-fqRdw=|;eK&nx_$j(q=EwK5yg>3bNw*iWk8ga00|fs*g;c5`OD zZS9T?bL5Kc7JV6KU#)htQlD&3>1SW!_El{Sr0F@2+t>I^jq#cs$y@huZu7FeVCDLq zQ|`oQbLGXp#c;Er6Co>b~!5AkQ-N zmB^mC`YL$YuCCps-S=F!t84E{cHeT@uCCpBchaNp%w=9zV8)AikAc~fSYHVz+?eR&Cs+Wy2?@3rt=s2?&e-cjVYKQZI< z_dS*SQ@6j^vvcf*;WxL4HMegd;?(u=2d<3qV_E!m1!jzX z(~!L%g}Ya|KF8p$=+(W7&4Khk4lnOjeI?YD?9RIO@K@JvUE`hevRz%f{cHad+_`>! z(w%+%!>+Es>oO*!8@`fi)>B@BXWX4VEk*YX#I*OLJ9lD|{udQEe^~lkU(B5Pdq3t9 z-;i|QU*x|8+5Gxn!Cz;qA2QbxxO(Ke0=ZMyJNk($}2o zem7k9y$)^;`@W99%C|r+b@y~zp=H?`PS~^DkT7w{Io|?)OGa`&g3WEZmR(x#&uEf8X`>Y?tBxF1Wtl!3ti6 z-y6^Qd@otyqi$bE;riIuF}S*Q-vc+Vn0=`qPgtDCiKOd)D#_MT{}|kRu&?lc5ZUjB zy7eD|x*%ugQMkU=H2zy~ zdio>!rI7RK_rdR%m}I}!`ZN5wYDMj~T^=AcGH*-Sv z?ESf%w|{|nZuVAKgUZD41psz0JYmu)n>Bg@w>At;z{4Yk=M?CVs1X)~imGk$bYmfXdMZPxa=D!Xq=U;=ak9g#N8M3(KD(81Dw4471 z_$#0rlWzW-pvb=t`DRETaqq_Wcq=6C@=Tm9F=gj!Lz11T%}E}BZ-M^JNp6KZ-|~OZ z#~tujK`!k>aP4yY?1kS6nZtRphi$W1PqrO-2Q&`U1`oXxu-XE6H8k)y9MP;d?y(;qCps1&93ewkaoXapKO1dK^q_I?7kP> z`Z2rjLp}~!PumG7V&9LfJ!bblWb=u~?0x`QJZATPWS4zu`yeD{U&?U~A3}~kP9c97 ziaxZ({=NT?B>TcNJ0C@NKD`rd-pfh2xcQCwI3yPOCy-Yccuz5ppDg4o6JN+Xc1Ax1 znODEtAbrez8m=vR|1@&+K8E}mD0AHkd>*o1ypt~^ zOk9e0@_?A7`F8Welg z_8_FMv-WjJd(6u>67~@MVdi@m{F{)tnBTfb;4bGy+ryBU^P+6-1@OnAMbHlJ>M{7Y z6DIER9H;Sp6#gAZyRpmQ--VulrqJiXzn8E^^8bFq?xRQJe*l?7+%q|oFyD0aCRe{7 zZm)9n14)<18U7I2GmP)ekC4TtAoFVzGv05B`DWn8KMDT{bS~-k|5Io_6#s8|3Rxd< zf0v!3pFvMSE^C~Hic2>selZtf`g^9oggjIA1@K=%<@ L+W$+ITcQ5}wX$pv literal 6529 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 diff --git a/Assets/Shaders/TestCube_FS.glsl b/Assets/Shaders/TestCube_FS.glsl index b6a1eab6..cb7bfefd 100644 --- a/Assets/Shaders/TestCube_FS.glsl +++ b/Assets/Shaders/TestCube_FS.glsl @@ -16,11 +16,12 @@ layout(location = 0) in struct vec4 vertPos; // location 0 vec2 uv; // location = 1 vec4 normal; // location = 2 + vec4 worldPos; // location = 3 } In; // material stuff -layout(location = 3) flat in struct +layout(location = 4) flat in struct { int materialIndex; uint eid; @@ -38,12 +39,14 @@ layout(location = 1) out uint outEntityID; layout(location = 2) out uint lightLayerIndices; layout(location = 3) out vec4 normals; layout(location = 4) out vec4 albedo; +layout(location = 5) out vec4 worldSpacePosition; void main() { position = In.vertPos; normals = In.normal; albedo = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv) * MatProp.data[In2.materialIndex].color; + worldSpacePosition = In.worldPos; outEntityID = In2.eid; lightLayerIndices = In2.lightLayerIndex; diff --git a/Assets/Shaders/TestCube_FS.shshaderb b/Assets/Shaders/TestCube_FS.shshaderb index abd90cf744ad1b20429e7740fe4354edc390101c..2974523d7405e05bdcf30d419f0663694bcc271b 100644 GIT binary patch delta 444 zcmYjLu}T9`5Zv|d@=WA3sJT*L!*Ke zWC_dzo|F6A>p}7$;y!ht4I}hs>iON})eTy48Yd%>06%vmkEtD{ar$!BfnvnEuD7e| zPoDhx7Kb;00O*OI4UlWj?c~EBuKb-xPQ(;3t`>aj#Xjtdpj^RZb?{}>X3jUkkMegF zm40$&qM!X^RG#|Zx2|uTzLp`kfDquyChSab2vBcf2~U%^k)NwhfE}O)(9g9UfI9s= bO+NQ`@uq(rnEQKpL$7257KFkKDffV1b_6lJ delta 288 zcmYk0ISRr+6o%h38G=#4jo67GT4-TmqqvR>Vq@(AY%J6!3N}_=Amko`4tO6c?;r&H zpC~x+G4n6;W}@69>!p`*`YbC}c8HiU%f*Ro&r9T4F&x2oo{Pm@;aTXon(H3|Ey#FFQ diff --git a/Assets/Shaders/TestCube_VS.glsl b/Assets/Shaders/TestCube_VS.glsl index 554ce379..041c552f 100644 --- a/Assets/Shaders/TestCube_VS.glsl +++ b/Assets/Shaders/TestCube_VS.glsl @@ -17,11 +17,12 @@ layout(location = 0) out struct vec4 vertPos; // location 0 vec2 uv; // location = 1 vec4 normal; // location = 2 + vec4 worldPos; // location = 3 } Out; // material stuff -layout(location = 3) out struct +layout(location = 4) out struct { int materialIndex; uint eid; @@ -49,6 +50,8 @@ void main() // gBuffer position will be in view space Out.vertPos = modelViewMat * vec4(aVertexPos, 1.0f); + Out.worldPos = worldTransform * vec4 (aVertexPos, 1.0f); + // uvs for texturing in fragment shader Out.uv = aUV; diff --git a/Assets/Shaders/TestCube_VS.shshaderb b/Assets/Shaders/TestCube_VS.shshaderb index a1138f75c885a67d6cb7ac2abb1928fe9de3a08e..0467a41d3c9dffd337d9ea55d160e5a79bb1d13c 100644 GIT binary patch literal 3905 zcmZ9NX?GM=5QaP3fGh&CDu^?H21OASFp6vf1~8ByA?^-srU{LcnK+q*#V!5=@hADK z{Ng!2Pfu6q!_9fmt$J&@b?a77h9>_~=Tl4NsIEB48$ z+f&Dv`>o?APo2=^#bl)L)Mp!iu2Ha<<{jltU@O=K-Ujc3)8IPz4)nnq7~yZ2{T~vI z5;Zy1oSdGXoVwDSUs`G|_aC>jW;^d>%~sya=KJ|-rr*YjU*4H-ue7QTV|Y|+8RLwN zoZ+e^8`kB;w4e3zw0*79${rOqGuw$I$@12^ul2R_h5P-f^l{c3czcF-oL=dBwPcLE z-glwhyw+Lnr=9sM(qbDc`jB_}*+SO4oc2?gT5<&c#cnHW&*j;}8>uZRd|zk3lrCny zv~b0`~#N-I+=6%wer1Gst~QqY-qN)66ki%v5@FaF~8Qc-~?r>kX3WXASZ$ zZP7|+Lf-ldo`<@fKVj008Q8oFwoC1N>2f}J-*uaJ(zeoWuiLDDln1RFSuB*hv`;Qg+vw6^G`*R#0dC3jpyi+w! z-8g$3=gB=E=Y6Yj>c;&AB2F&iCh3KBn#+4ScZY!e4!wcwQg;TceQ`e2UE2K}sp`&$ zdgSx>McwnPC*IuNx`NYR&OJC|i+dKsJZAGsLL-dn0$O%o+Eoqi=yXzj^dmcb??5`wMNX_K4qs ztbH%`m)Jeqn)Tnwu1(&2>dvE_@%rutF8%kgYm53{M)o}QIB!3)`6K=SvN3z`tg{Pi zX_T`4-iLmOT~6Jz4zrtA{vbDUwzR7U^m_w+7-;tn>fU{23H!QKG!?!r9pv3qyz=23Ts<;-)EyWbM5E z=a9_R0MXkEC8zxwva!}>K6SqlIqg&I#%s5~H`zT~PWv>w{gsb;{H7wli9GOq_LeO; z`*MKzpV{k$Jm{0(U!&x-4eX-wyny{Ep6%QC%PH&huWd3pnTIFxNgHua7hS3NXhG zU=DSCBFC%9=5W>{hrbu{k>fRFbNGFjLtP*3&gh$99B4O(^Z6E#5B(ivXZ3Glv>ylh z$eYvN$c6t0$a3nw{fEGryG4AR{Uadf3hrZMIo~6=GbQKS%+Mj<`4eEg{@R`0r{vXk z7I?Nk-p^S+5Bxsj9n|%US}!7dx2W|~p*|Mvl~GFm=AS*;%>K)eTOYf=pptmfHf;?n=Rk_ zHnKMF*C_ZTk#kM+U&1%M17=IG6?wdC#LOWZWB!Qw5?Nljv{hriLN`V(V!lR}7p{nz z;SM*^zX8@_Zhh^O-=e(t*5_Lw7jODKvcECTiFf${=p%oTyiNAIz+UbLev|RmDYE`9 z&$`Pl7jZu#N1Web#LXicXZ^TWeBkmruarVSG{p4as7LX&(`!&$-1NrD- zUUKp-YcQX4;Qb$zoHMC!)btZ_e-pIpRsD{<8x zER}K51O4Re!BO@VFb#^drAabax_sqBD92qnWx_e3KUPID^nwWeh~${$70D&Z$C9g(mSkPBBiWOb^;gpV zuM$-h)$a7#YisS!?OuO8?oE&xH~8ks$vvtsp^cw zI)hbnhxYZMm-unug{#rP=iaq6Go5hG4+i^O>I;MI$4SR~=EoVEGq~g0Zo<`ERe8DZ zcGz2uCW#mIeM>7}HSI$XCH}S_uXu?kq~IIEGfJ|xO(38<186G`UTFyXD#FH!KpLF^&soPADSp) zG9NX|w;TrJl^}b^eINb9w;P80K6=9}v*;-^?QM9`wjZVM+0N%=PB`({%*m`|F}L|f z@H3-#l!G^AEo7Up%Kkf7g&Bu?z&UvU)5n}+SsZsN#$glJl~^vYgK^YbjKe1GFNwv0 zSzKE;q;_&~&!+Zy33Zy?kj}zp*0?v{DmL?h&BA6zigqivEg!!l_&JYy?9J&d%P{z0 z?1m8oM*W7NgJt!U(|mRp-j%c9oYslp4O!UeXB1V_UYBqVHhsZn&8a@#7Y=yltGJh> zlLOy%#bEQh0=AgvwENU$9~Dl1^1#Ptp1|<)OH3?&i$5hD|2g?z*3Q|~4F9xteBk86 zW*)(ahkHiCf`3*!KCAy#>70jc=e;hS{1$&fIx%O(tZPT8rIG9O`@HOV?O@oPwV<86 z;B&eWvxOhq1m4@SOA`Ft0lS%F_}|HOVz3vr&q%Q0V>63j)b)Y(x`dp(8^3oA2{=1B zKGM#;@sR_Y`2{1#W$pFchJQu+j07A$HuDWepX%DLNu2xh7W|vi$kmWwf2kcVH4u;8 zl7Qh~)(#&(y}YfRv%v6wt({(i+xdJy7QZPyNQibTDk*{!fg$X?}mi4;c!1@_m+h3!QKHI z9;KDunxwo2_uF)7Sm02>}**~S9jn$yf2{^a>M0KnQw6J z4d*)vn7!$SbiP}9&s`o!;DEQ3m+$y{3B6>tm~-w`*ZzY9K8v&9fmz&-(k+hJwz!|9 z6G#2T!2`3npQT&eL+KXxi*(}X332eiY({>SZgJeNA-g95w;pcg7&yy%$Q*EgFURQB zmc(lMO}gbS_Mk7E7#20b1GBh+bc-wYz!z?35eE;<;vN;^iaprQELEZ(l1HucVHwP4!F(5SbFhW|6Mj1%ibfF4n_|Ro8%bv*|(lZCmufj;agI_a9^e_#I(VS_DEFAULT); @@ -194,6 +196,7 @@ namespace SHADE // Initialize world render graph renderGraph->Init("World Render Graph", device, swapchain, &resourceManager, renderContextCmdPools); renderGraph->AddResource("Position", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); + renderGraph->AddResource("Position World Space", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Normals", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); //worldRenderGraph->AddResource("Tangents", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Albedo", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second); @@ -218,7 +221,8 @@ namespace SHADE "Albedo", "Depth Buffer", "SSAO", - "SSAO Blur" + "SSAO Blur", + "Position World Space" }, {}); // no predecessors @@ -231,6 +235,7 @@ namespace SHADE gBufferSubpass->AddColorOutput("Light Layer Indices"); gBufferSubpass->AddColorOutput("Normals"); gBufferSubpass->AddColorOutput("Albedo"); + gBufferSubpass->AddColorOutput("Position World Space"); gBufferSubpass->AddDepthOutput("Depth Buffer", SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL); @@ -277,7 +282,7 @@ namespace SHADE "Normals", "Albedo", "Scene", - "SSAO Blur" + "SSAO Blur", }, { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS .data()}); @@ -763,6 +768,9 @@ namespace SHADE // Create new renderer for the light component and give it to the light component Handle newRenderer = resourceManager.Create(device, swapchain->GetNumImages(), descPool, SHRenderer::PROJECTION_TYPE::ORTHOGRAPHIC); lightComp->SetRenderer (newRenderer); + + // assign shadow map index to light component + lightComp->SetShadowMapIndex (lightingSubSystem->GetNumShadowMaps()); } // Add the shadow map resource to the graph diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.cpp index 4dc6e83e..6943ec09 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.cpp @@ -129,6 +129,11 @@ namespace SHADE renderer = newRenderer; } + void SHLightComponent::SetShadowMapIndex(uint32_t index) noexcept + { + lightData.shadowMapIndex = index; + } + SHLightData const& SHLightComponent::GetLightData(void) const noexcept { return lightData; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.h index 4019d2f4..4974f3f5 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightComponent.h @@ -55,6 +55,7 @@ namespace SHADE void SetStrength (float value) noexcept; // serialized void SetEnableShadow (bool flag) noexcept; void SetRenderer (Handle newRenderer) noexcept; + void SetShadowMapIndex (uint32_t index) noexcept; SHLightData const& GetLightData (void) const noexcept; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp index 6beac351..c3ba7ec3 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.cpp @@ -395,7 +395,7 @@ namespace SHADE switch (lightComp->GetLightData().type) { case SH_LIGHT_TYPE::DIRECTIONAL: - return SHMatrix::Transpose (SHMatrix::LookAtLH(/*lightComp->GetLightData().position*/SHVec3(-0.7768f, 3.82611f, 9.23839f), SHVec3(-0.7619f, 3.30361f, 8.38588f), SHVec3(0.0f, -1.0f, 0.0f))); + return SHMatrix::Transpose (SHMatrix::LookAtLH(/*lightComp->GetLightData().position*/SHVec3(1.27862f, 4.78952f, 4.12811f), SHVec3(-0.280564f, -0.66262f, -0.69422f), SHVec3(0.0f, -1.0f, 0.0f))); case SH_LIGHT_TYPE::POINT: return {}; case SH_LIGHT_TYPE::SPOT: @@ -478,6 +478,7 @@ namespace SHADE //#endif shadowMapSampler = inShadowMapSampler; + shadowMaps.clear(); //numLightComponents = 0; #pragma endregion } @@ -516,7 +517,7 @@ namespace SHADE if (auto renderer = light.GetRenderer()) { //SHMatrix orthoMatrix = SHMatrix::OrthographicRH() - renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(12.0f, 12.0f, 0.1f, 20.0f)); + renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(9.0f, 9.0f, 0.1f, 20.0f)); } auto enumValue = SHUtilities::ConvertEnum(light.GetLightData().type); @@ -595,7 +596,7 @@ namespace SHADE uint32_t SHLightingSubSystem::AddShadowMap(Handle newShadowMap, EntityID lightEntity) noexcept { // Add to container of shadow maps - shadowMapIndexing.emplace(lightEntity, shadowMaps.size()); + shadowMapIndexing.emplace(lightEntity, static_cast (shadowMaps.size())); shadowMaps.emplace_back(newShadowMap); // Just use the image view stored in the resource @@ -684,4 +685,9 @@ namespace SHADE return shadowMapImageSamplers[index]; } + uint32_t SHLightingSubSystem::GetNumShadowMaps(void) const noexcept + { + return static_cast(shadowMaps.size()); + } + } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h index 43d901fc..7794a2fb 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Lights/SHLightingSubSystem.h @@ -223,6 +223,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ Handle GetLightDataDescriptorSet (void) const noexcept; std::tuple, Handle, vk::ImageLayout> const& GetViewSamplerLayout (uint32_t index) const noexcept; + uint32_t GetNumShadowMaps (void) const noexcept; }; }