From 6b0f78d4ebe447552012b833051eeac29e3806ea Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 26 Feb 2023 23:38:58 +0000 Subject: [PATCH] Add num_shadow_casters graphics parameter, allow cycle down enum options --- data/texture/charMap.png | Bin 3438 -> 3438 bytes src/Dodge/Data/Config.hs | 29 +++- src/Dodge/Menu.hs | 1 + src/Dodge/Menu/OptionType.hs | 8 +- src/Dodge/Render.hs | 10 +- src/Dodge/Render/Lights.hs | 5 +- src/Dodge/TestString.hs | 8 +- src/Preload/Render.hs | 287 ++++++++++++++++++----------------- src/Render.hs | 6 +- 9 files changed, 203 insertions(+), 151 deletions(-) diff --git a/data/texture/charMap.png b/data/texture/charMap.png index 115dafb7c1f36be85356de646b5aad5f1920803f..e780bf5fa4fd3c40b3b689557619554e46311058 100644 GIT binary patch delta 1569 zcmV++2HyGZ8txj9M1O6PB&!Yl&nbKaBq1an2Lwd;20p%%>Ymw|-Ld^%gqx|ZYKjjj zQ%W&q|LdQp`~x2{;?mT-NADG%7A<(-!RzZ2&o|Zfe1Ck}yZ2jv`Fzjl65QqW)5hyg z1O57I!p9yozxNk^zhQqb^s(}LLAg6K9@bYQ(a*1bYVU<&zkeQjxP3Ks^6Q@OfsZNg zOYB+tbCLVIeC=okl$K(YFmEBL&$quUkb8-Y=RRzkdW4LKTbY1GB@yQRi!ksq`zh zyu<(c&gUi5118WV8ALyApWwxoaPn$ktjzsumOU<5^o{?km zk_DMqecAFAYiueTO0nD4-M4MuvByEI9Xajj>Bo+rIOCJGH>-cNzrh;4S>uPPJI+2? zLvJzrSc0yc=;aKIaU(EpmjMJcU(TviYkZlzoPX80DyIx1^>R}dUB*CR+r)b4le=Hc z{UzRt`d{LW{}*%RQuqI0u7J8fdHaF2b?aO{jJ>k(Vp;{+x8`EY!rIs18w)z%xybluZ|v9RP#rtY<}nd59JN7nXE4Z6nhvbCj5!UcO71?HdRd41 zW}vI*7GgjFNq5)eO3QqbSG+JAXiLGZw>jZPR`3wfd}OLD(VoBN2qL=JZ~J z5-N38t7GY$s0q1gT3|!+#T+p^lpe#H4>*hZl%Rj&n1Sd(IoJp}e*8ml>OnCNrF5Jp zJZbqAwF7fet7PxG`(Q(H5yTcFvhTLj2b@o_wf9UrQv*0dEgNQmw*cc?v9kz#W`Bgb z!?f^3;B5o|kXj{c9#~&jBy!m{a_2CZ$8YXS1rN^y0&{qk0v&;qthL6U(fpZICwCqKU;b53phg2tp5f1weCb&;)M`Tz`UQDkbmP$L5t>d|e`qa_xTp{om$c;VPp+I6>Yv23QU4S(fGPliDKo%!J8Dm8g?~tv& zz=vSkMErQnJ7HU_4GUysBF}f?udj|Y_Gy}1OFOpv&7lhPQszy2u)G;)`@mpm#XT%3 zZJy?1Ak|M8&33yGrFVE)--~cq<08RAVDCPYu&TU_}J3(Kx+`9 zI9TObdd@*zTc}(JkqQm)d;b`LRD8zZNcb9Z2i$e)Pov7WVSnuNeVg|xKaMGX%N7)% zLj#!foL8Sa9TdxH_3UB?88IPq)#yqdG_2k_gR|!=oU!M^e=_CYDhD4<2C_*3O|w4+ T!T|^v6%YsJvrFT%2?%8cLh=oi delta 1569 zcmV++2HyGZ8txj9M1NtDE3FOu&na>QBq1an2Lx2*204D3v3K9@dz<9@s^VFD#u$Xu zEw$LP|MkyP{(%=6acOGaqxXteixxca;Pv&2=aXuCK0jXVJ^F3DeE!ZD65QqW)yC^i z1LOK@!N(pnzmFGx|HA$@^kMmJQ0~r*hxOG-jPq-p+S^d<*MCC~x38{Fe%P-;I9Dv z4*v60en-EypTXzxo*}Go0mS@bxI5_3<)b2%xO+pq}V@cixgf`(%U+CF4p8b*>J1@diCKw|u`HxrmZ$JK> ztDKV;B6|e_U_+>wlNTLaM@;J}^519Cf}-Or>AB zB@fSnd5Zg63yQ6`0r-Qx70!@=f!axwI#pvfBH-vCXuxxp#uE&XDla(6O{8-%cD{RK zjnOlgl{?>IXcLG~>0;m}WPq&J6!~M#kwZg8o2qs-^`fDpOK)9!@7Ax#4HIjo*3HZ< zY`A!H^?&Z>?%^Xi1RAK(!@?tC3@!s34cHo(KQJMeJ9665(~liLamFWWZ&v@f{swFGW{n@F?mYWs z4Wq^E!vtM9(aRYa<3?cIE(1ttzMNI3*7!1aIe)8hRZbaB>gA>^x{QIswu$x7CwIS? z`%AnP^}oa$|1ajsrSAX1Tmf}|^7aF3>-M>P7<*OW#k2~lZ_UM)g|)B2Hy3mu$fL`h z7ldc|hH{+%b0U@}U@@tSXXgohToub2Fqzutm}roeDREFPMEfY$ZO+|!hp>{A%qVi zn9e!cv~{@ka@O+eE-L=n8~e36RL739c}!#sM{UsD84NO%rUR=jV@?CAlDki)Ue=+$ z8R+V{jTlhCdGe@GWJFMDHG^*7EDG|$4u8R37_dO~iR7TAz{F-Ob}rN^}91Hqy{CFq|xW*|Gz4mMJbpZJiRdeF>6DIMnt zPg;IO?Z931D%rd4KG@J)1i8h??7Qvsf#6eY?LE`Z)Bw&<%Z63pEx`Cz>@0$q8Gotn za4kHMcpC`-q*lqA2j15eiCVUe+Bpp7@tylp0W+z7d9i^uc20ZY6kTxE0~HIQ;#=Vs zy+I6)M8yF{kP~vU2l`<8SYvgHnQ5UL=R%YtPBTM}_S}ekJDjAA4pd(Dq3{7*QCW!L zf_ZXI)mF13QXE9~7Dy97%0A+N34c`PM2{GKEo>08G(Zy*2crwG?>4tO@N$_G^g|3X zWY1TQVVQ%l-GGuwN2GFh!6U(fpZICwCq6y=f2Usx#1gQtT0-!lIXhJjwE`LEY>b&77 z!DvSePokv|^uF4z`p!vh(asPmop>#L)TeVXRh(vIzZYp4RflzGb@EN=$dJ}?EyD z4pw=Vo^#OG7CIMFq(TGy-alrb6rVXb627L~3D-{jX;%3*?T>xFZ}YbD Configuration -> Bool debugOn db = S.member db . _debug_booleans makeLenses ''Configuration +deriveJSON defaultOptions ''NumShadowCasters deriveJSON defaultOptions ''ResFactor deriveJSON defaultOptions ''ObjectShadows deriveJSON defaultOptions ''RoomClipping diff --git a/src/Dodge/Menu.hs b/src/Dodge/Menu.hs index 26d3d5db2..b145a233b 100644 --- a/src/Dodge/Menu.hs +++ b/src/Dodge/Menu.hs @@ -186,6 +186,7 @@ graphicsMenuOptions = , makeBoolOption graphics_wall_textured "WALL TEXTURES" , makeEnumOption graphics_object_shadows "OBJECT SHADOWS" id , makeBoolOption graphics_cloud_shadows "CLOUD SHADOWS" + , makeEnumOption graphics_num_shadow_casters "SHADOW CASTERS" id ] gameOverMenu :: Universe -> ScreenLayer diff --git a/src/Dodge/Menu/OptionType.hs b/src/Dodge/Menu/OptionType.hs index 233f1b9ab..abe32b805 100644 --- a/src/Dodge/Menu/OptionType.hs +++ b/src/Dodge/Menu/OptionType.hs @@ -11,8 +11,9 @@ makeBoolOption lns t = (\u -> MODStringOption t (show (u ^# uvConfig . lns))) makeEnumOption lns str sideeff = - Toggle + Toggle2 (\u -> sideeff (u & uvConfig . lns #%~ cycleEnum)) + (\u -> sideeff (u & uvConfig . lns #%~ cycleDownEnum)) (\u -> MODStringOption str (show (u ^# uvConfig . lns))) makeSubmenuOption submenu t = Toggle (pushScreen submenu) (const t) @@ -21,3 +22,8 @@ cycleEnum :: (Eq a, Enum a, Bounded a) => a -> a cycleEnum x | x == maxBound = minBound | otherwise = succ x + +cycleDownEnum :: (Eq a, Enum a, Bounded a) => a -> a +cycleDownEnum x + | x == minBound = maxBound + | otherwise = pred x diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index c5a25e8ca..b173ee731 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -21,7 +21,7 @@ import Graphics.GL.Core43 import Graphics.Rendering.OpenGL hiding (color, rotate, scale, translate) import MatrixHelper import Render -import qualified SDL +--import qualified SDL import Shader import Shader.Bind import Shader.Data @@ -29,9 +29,9 @@ import Shader.ExtraPrimitive import Shader.Parameters import Shader.Poke -doDrawing :: RenderData -> Universe -> IO Word32 +doDrawing :: RenderData -> Universe -> IO () doDrawing pdata u = do - sTicks <- SDL.ticks +-- sTicks <- SDL.ticks let w = _uvWorld u cfig = _uvConfig u rot = w ^. cWorld . camPos . camRot @@ -293,8 +293,8 @@ doDrawing pdata u = do renderLayer FixedCoordLayer shadV layerCounts renderFoldable shadV $ fixedCoordPictures u depthMask $= Enabled - eTicks <- SDL.ticks - return (eTicks - sTicks) +-- eTicks <- SDL.ticks +-- return (eTicks - sTicks) -------------------------------------------------------------------------------- -- note: currently assume there is only one UBO, we only bind it once at setup diff --git a/src/Dodge/Render/Lights.hs b/src/Dodge/Render/Lights.hs index f28e66b26..d75697f62 100644 --- a/src/Dodge/Render/Lights.hs +++ b/src/Dodge/Render/Lights.hs @@ -2,6 +2,7 @@ module Dodge.Render.Lights ( lightsToRender, ) where +import Data.List (sortOn) import Data.Maybe import Dodge.Data.LWorld import Dodge.Data.CamPos @@ -11,7 +12,9 @@ import qualified IntMapHelp as IM import Control.Lens lightsToRender :: Configuration -> CamPos -> LWorld -> [(Point3, Float, Point3)] -lightsToRender cfig campos w = +{-# INLINE lightsToRender #-} +lightsToRender cfig campos w = take (fromEnum $ cfig ^. graphics_num_shadow_casters) $ + sortOn (\(_,x,_) -> negate x) $ mapMaybe getLS (IM.elems $ w ^. lightSources) ++ mapMaybe getTLS (w ^. tempLightSources) where diff --git a/src/Dodge/TestString.hs b/src/Dodge/TestString.hs index 2f2a48223..50bc4d42c 100644 --- a/src/Dodge/TestString.hs +++ b/src/Dodge/TestString.hs @@ -1,5 +1,7 @@ module Dodge.TestString where +import Dodge.Render.ShapePicture +import Dodge.Render.Lights import Data.Aeson (ToJSON) import Data.ByteString.Lazy.Char8 (unpack) import qualified Data.Aeson.Encode.Pretty as AEP @@ -10,7 +12,11 @@ import Dodge.Data.Universe --import qualified Data.Map.Strict as M --import qualified IntMapHelp as IM testStringInit :: Universe -> [String] -testStringInit u = [show $ u ^? uvWorld . hud . hudElement . diSections . sssExtra . sssSelPos . _Just] +testStringInit u = [show $ length $ lightsToRender (u ^. uvConfig) (u ^. uvWorld . cWorld . camPos) + (u ^. uvWorld . cWorld . lWorld) + , show $ length $ fst $ worldSPic (u ^. uvConfig) (u ^. uvWorld) + , show $ length $ snd $ worldSPic (u ^. uvConfig) (u ^. uvWorld) ] + --[show $ u ^? uvWorld . hud . hudElement . diSections . sssExtra . sssSelPos . _Just] -- [show $ fmap IM.keys $ u ^? uvWorld . hud . hudElement . subInventory . ciSections . sssSections] getPretty :: ToJSON a => a -> [String] diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index e9ff2cca0..abc404e34 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -1,23 +1,22 @@ --{-# LANGUAGE TemplateHaskell #-} --{-# OPTIONS_GHC -Wno-unused-top-binds #-} -module Preload.Render - ( preloadRender - , cleanUpRenderPreload - ) - where -import Shader -import Shader.Data -import Shader.Compile -import Shader.AuxAddition -import Shader.Parameters -import Shader.Bind -import Framebuffer.Setup -import Data.Preload.Render +module Preload.Render ( + preloadRender, + cleanUpRenderPreload, +) where -import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight) import Control.Monad -import Foreign +import Data.Preload.Render import qualified Data.Vector.Mutable as MV +import Foreign +import Framebuffer.Setup +import Graphics.Rendering.OpenGL hiding (Point, imageHeight, scale, translate) +import Shader +import Shader.AuxAddition +import Shader.Bind +import Shader.Compile +import Shader.Data +import Shader.Parameters numDrawableWalls :: Int numDrawableWalls = 5000 @@ -33,12 +32,12 @@ preloadRender = do wpVBOname <- genObjectName wpVBOptr <- mallocArray (8 * numDrawableWalls) bindBuffer ArrayBuffer $= Just wpVBOname - bufferData ArrayBuffer $= - (fromIntegral $ floatSize * numDrawableWalls * 8 - , nullPtr - , StreamDraw - ) - let wpVBO = VBO {_vbo = wpVBOname, _vboPtr = wpVBOptr, _vboAttribSizes = [4,4], _vboStride = 8} + bufferData ArrayBuffer + $= ( fromIntegral $ floatSize * numDrawableWalls * 8 + , nullPtr + , StreamDraw + ) + let wpVBO = VBO{_vbo = wpVBOname, _vboPtr = wpVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} wpVAOname <- genObjectName bindVertexArrayObject $= Just wpVAOname bindBuffer ArrayBuffer $= Just wpVBOname @@ -47,42 +46,42 @@ preloadRender = do bindVertexArrayObject $= Just wpColVAOname setupVertexAttribPointer 0 4 8 0 setupVertexAttribPointer 1 4 8 4 - let wpVAO = VAO {_vao = wpVAOname, _vaoVBO = wpVBO} - wpColVAO = VAO {_vao = wpColVAOname, _vaoVBO = wpVBO} + let wpVAO = VAO{_vao = wpVAOname, _vaoVBO = wpVBO} + wpColVAO = VAO{_vao = wpColVAOname, _vaoVBO = wpVBO} -- setup window points VBO, VAOs and shaders winVBOname <- genObjectName winVBOptr <- mallocArray (8 * numDrawableWalls) bindBuffer ArrayBuffer $= Just winVBOname - bufferData ArrayBuffer $= - (fromIntegral $ floatSize * numDrawableWalls * 8 - , nullPtr - , StreamDraw - ) - let winVBO = VBO {_vbo = winVBOname, _vboPtr = winVBOptr, _vboAttribSizes = [4,4], _vboStride = 8} + bufferData ArrayBuffer + $= ( fromIntegral $ floatSize * numDrawableWalls * 8 + , nullPtr + , StreamDraw + ) + let winVBO = VBO{_vbo = winVBOname, _vboPtr = winVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} winColVAOname <- genObjectName bindVertexArrayObject $= Just winColVAOname setupVertexAttribPointer 0 4 8 0 setupVertexAttribPointer 1 4 8 4 - let winColVAO = VAO {_vao = winColVAOname, _vaoVBO = winVBO} + let winColVAO = VAO{_vao = winColVAOname, _vaoVBO = winVBO} -- setup shape geometry/cap VBO and two VAOs shEBOname <- genObjectName shEBOptr <- mallocArray numDrawableElements bindBuffer ElementArrayBuffer $= Just shEBOname - bufferData ElementArrayBuffer $= - ( fromIntegral $ glushortSize * numDrawableElements - , nullPtr - , StreamDraw - ) - let shEBO = EBO {_ebo = shEBOname, _eboPtr = shEBOptr} + bufferData ElementArrayBuffer + $= ( fromIntegral $ glushortSize * numDrawableElements + , nullPtr + , StreamDraw + ) + let shEBO = EBO{_ebo = shEBOname, _eboPtr = shEBOptr} shVBOname <- genObjectName - shVBOptr <- mallocArray (7 * numDrawableElements) + shVBOptr <- mallocArray (7 * numDrawableElements) bindBuffer ArrayBuffer $= Just shVBOname - bufferData ArrayBuffer $= - ( fromIntegral $ floatSize * numDrawableElements * 7 - , nullPtr - , StreamDraw - ) - let shVBO = VBO {_vbo = shVBOname, _vboPtr = shVBOptr, _vboAttribSizes = [4,4], _vboStride = 8} + bufferData ArrayBuffer + $= ( fromIntegral $ floatSize * numDrawableElements * 7 + , nullPtr + , StreamDraw + ) + let shVBO = VBO{_vbo = shVBOname, _vboPtr = shVBOptr, _vboAttribSizes = [4, 4], _vboStride = 8} shPosColVAOname <- genObjectName bindVertexArrayObject $= Just shPosColVAOname bindBuffer ArrayBuffer $= Just shVBOname @@ -94,8 +93,8 @@ preloadRender = do bindBuffer ArrayBuffer $= Just shVBOname setupVertexAttribPointer 0 3 7 0 bindBuffer ElementArrayBuffer $= Just shEBOname - let shPosColVAO = VAO { _vao = shPosColVAOname, _vaoVBO = shVBO } - shPosVAO = VAO { _vao = shPosVAOname, _vaoVBO = shVBO } + let shPosColVAO = VAO{_vao = shPosColVAOname, _vaoVBO = shVBO} + shPosVAO = VAO{_vao = shPosVAOname, _vaoVBO = shVBO} --setup silhouette edge VAO shEdgeVAOname <- genObjectName bindVertexArrayObject $= Just shEdgeVAOname @@ -106,59 +105,64 @@ preloadRender = do silEBOptr <- mallocArray numDrawableElements -- it may be important to bind this while the correct VAO is bound bindBuffer ElementArrayBuffer $= Just silEBOname - bufferData ElementArrayBuffer $= - ( fromIntegral $ glushortSize * numDrawableElements - , nullPtr - , StreamDraw - ) - let silEBO = EBO {_ebo = silEBOname, _eboPtr = silEBOptr} - shEdgeVAO = VAO { _vao = shEdgeVAOname, _vaoVBO = shVBO } + bufferData ElementArrayBuffer + $= ( fromIntegral $ glushortSize * numDrawableElements + , nullPtr + , StreamDraw + ) + let silEBO = EBO{_ebo = silEBOname, _eboPtr = silEBOptr} + shEdgeVAO = VAO{_vao = shEdgeVAOname, _vaoVBO = shVBO} -- lighting shaders - lightingWallShadShad <- makeShaderUsingVAO "lighting/wallShadow" [vert,geom,frag] EPoints wpVAO - >>= addUniforms ["lightPos"] - lightingCapShad - <- makeShaderUsingVAO "lighting/cap" [vert,geom,frag] ETriangles shPosVAO - >>= addUniforms ["lightPos"] - lightingLineShadowShad - <- makeShaderUsingVAO "lighting/lineShadow" [vert,geom,frag] ELinesAdjacency shEdgeVAO - >>= addUniforms ["lightPos","radiusUniform"] --- positional shader - positionalBlankShad <- makeShader "positional/blank" [vert,frag] [3] ETriangles --- 2D draw shaders - bslist <- makeShader "dualTwoD/basic" [vert,frag] [3,4] ETriangles - bslista <- makeShader "dualTwoD/basic" [vert,frag] [3,4] ETriangles - aslist <- makeShader "dualTwoD/arc" [vert,frag] [3,4,3] ETriangles - eslist <- makeShader "dualTwoD/ellipse" [vert,geom,frag] [3,4] ETriangles - bezierQuadShader <- makeShader "dualTwoD/bezierQuad" [vert,frag] [3,4,4] ETriangleStrip - cslist <- makeShader "dualTwoD/character" [vert,frag] [3,4,2] ETriangles - >>= vaddTextureNoFilter "data/texture/charMap.png" - -- this should really be a 2d texture array - basicTweakZShad <- makeShader "dualTwoD/basicTweakZ" [vert,frag] [4,4] ETriangles --- fullscreen shaders + lightingWallShadShad <- + makeShaderUsingVAO "lighting/wallShadow" [vert, geom, frag] EPoints wpVAO + >>= addUniforms ["lightPos"] + lightingCapShad <- + makeShaderUsingVAO "lighting/cap" [vert, geom, frag] ETriangles shPosVAO + >>= addUniforms ["lightPos"] + lightingLineShadowShad <- + makeShaderUsingVAO "lighting/lineShadow" [vert, geom, frag] ELinesAdjacency shEdgeVAO + >>= addUniforms ["lightPos", "radiusUniform"] + -- positional shader + positionalBlankShad <- makeShader "positional/blank" [vert, frag] [3] ETriangles + -- 2D draw shaders + bslist <- makeShader "dualTwoD/basic" [vert, frag] [3, 4] ETriangles + bslista <- makeShader "dualTwoD/basic" [vert, frag] [3, 4] ETriangles + aslist <- makeShader "dualTwoD/arc" [vert, frag] [3, 4, 3] ETriangles + eslist <- makeShader "dualTwoD/ellipse" [vert, geom, frag] [3, 4] ETriangles + bezierQuadShader <- makeShader "dualTwoD/bezierQuad" [vert, frag] [3, 4, 4] ETriangleStrip + cslist <- + makeShader "dualTwoD/character" [vert, frag] [3, 4, 2] ETriangles + >>= vaddTextureNoFilter "data/texture/charMap.png" + -- this should really be a 2d texture array + basicTweakZShad <- makeShader "dualTwoD/basicTweakZ" [vert, frag] [4, 4] ETriangles + -- fullscreen shaders --fullscreenAlphaHalveShad <- makeShaderSized "fullscreen/alphaHalve" [vert,frag] [2] 4 ETriangleStrip --pokeArray (shadVBOptr fullscreenAlphaHalveShad) $ concat cornerListNoCoord --- texture shaders, no textures attached - fsShad <- makeShaderSized "texture/simple" [vert,frag] [2,2] 4 ETriangleStrip + -- texture shaders, no textures attached + fsShad <- makeShaderSized "texture/simple" [vert, frag] [2, 2] 4 ETriangleStrip -- note we directly poke the shader vertex data here pokeArray (shadVBOptr fsShad) $ concat cornerList - bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad - colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad - grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad - lightingTextureShad <- makeShaderUsingShaderVAO "lighting/texture" [vert,frag] ETriangleStrip fsShad - >>= addUniforms ["lightPos","lumRad"] - barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints --- blank wallShader - wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert,geom,frag] EPoints wpColVAO --- textured wallShader - wallTextureShad <- makeShaderUsingVAO "wall/texture" [vert,geom,frag] EPoints wpColVAO - >>= addTexture "data/texture/grayscaleDirt.png" ----- texture array shader - textArrayShad <- makeShader "texture/arrayPos" [vert,frag] [3,3] ETriangles - >>= addTextureArray "data/texture/ayene_wooden_floor_transformed.png" - -- >>= addTextureArray "data/texture/ayene_wooden_floor.png" + bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert, frag] ETriangleStrip fsShad + colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert, frag] ETriangleStrip fsShad + grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert, frag] ETriangleStrip fsShad + lightingTextureShad <- + makeShaderUsingShaderVAO "lighting/texture" [vert, frag] ETriangleStrip fsShad + >>= addUniforms ["lightPos", "lumRad"] + barrelShad <- makeShader "texture/barrel" [vert, geom, frag] [2, 2, 2, 1] EPoints + -- blank wallShader + wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert, geom, frag] EPoints wpColVAO + -- textured wallShader + wallTextureShad <- + makeShaderUsingVAO "wall/texture" [vert, geom, frag] EPoints wpColVAO + >>= addTexture "data/texture/grayscaleDirt.png" + ---- texture array shader + textArrayShad <- + makeShader "texture/arrayPos" [vert, frag] [3, 3] ETriangles + >>= addTextureArray "data/texture/ayene_wooden_floor_transformed.png" + -- >>= addTextureArray "data/texture/ayene_wooden_floor.png" -- bind fixed vertex data - bindShaderBuffers [fsShad] [4,4] + bindShaderBuffers [fsShad] [4, 4] framebuf2 <- setupTextureFramebuffer 800 600 framebuf3 <- setupTextureFramebuffer 800 600 @@ -166,11 +170,11 @@ preloadRender = do bindRenderbuffer Renderbuffer $= rboBaseBloomName renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize 800 600) - fboBaseName <- setupFramebuffer2GivenStencil rboBaseBloomName - fboCloudName <- setupFramebuffer2GivenStencil rboBaseBloomName + fboBaseName <- setupFramebuffer2GivenStencil rboBaseBloomName + fboCloudName <- setupFramebuffer2GivenStencil rboBaseBloomName fboBloomName <- setupFramebufferGivenStencil rboBaseBloomName fboColorName <- setupFramebufferGivenStencil rboBaseBloomName - fboPosName <- setupFramebufferGivenStencil rboBaseBloomName + fboPosName <- setupFramebufferGivenStencil rboBaseBloomName fboLightingName <- setupFramebufferGivenStencil rboBaseBloomName fboLightingHighName <- setupFramebufferGivenStencil rboBaseBloomName @@ -178,64 +182,69 @@ preloadRender = do fboHalf2Name <- setupTextureFramebuffer 300 300 fboHalf3Name <- setupTextureFramebuffer 300 300 --- reset to default framebuffer, ready for drawing direct to screen + -- reset to default framebuffer, ready for drawing direct to screen bindFramebuffer Framebuffer $= defaultFramebufferObject --- set the clearColor to have 1 alpha + -- set the clearColor to have 1 alpha clearColor $= Color4 0 0 0 1 shadV <- MV.new 6 - zipWithM_ (MV.write shadV) [0..5] - [ bslist -- note the ordering is very important - , basicTweakZShad -- ShadNum + zipWithM_ + (MV.write shadV) + [0 .. 5] + [ bslist -- note the ordering is very important + , basicTweakZShad -- ShadNum , bezierQuadShader - , cslist + , cslist , aslist , eslist ] - return $ RenderData - { _pictureShaders = shadV - , _shapeShader = bslista {_shadVAO = shPosColVAO } - , _shapeEBO = shEBO - , _silhouetteEBO = silEBO - , _lightingCapShader = lightingCapShad - , _lightingLineShadowShader = lightingLineShadowShad - , _positionalBlankShader = positionalBlankShad - , _lightingWallShadShader = lightingWallShadShad - , _wallBlankShader = wallBlankShad - , _wallTextureShader = wallTextureShad - , _windowShader = wallBlankShad { _shadVAO = winColVAO } - , _textureArrayShader = textArrayShad - , _fullscreenShader = fsShad - , _lightingTextureShader = lightingTextureShad - , _bloomBlurShader = bloomBlurShad - , _colorBlurShader = colorBlurShad - , _barrelShader = barrelShad - , _grayscaleShader = grayscaleShad - , _fbo2 = framebuf2 - , _fbo3 = framebuf3 - , _fboHalf1 = fboHalf1Name - , _fboHalf2 = fboHalf2Name - , _fboHalf3 = fboHalf3Name - , _fboLighting = fboLightingName - , _fboLightingHigh = fboLightingHighName - , _fboBase = fboBaseName - , _fboCloud = fboCloudName - , _fboBloom = fboBloomName - , _fboColor = fboColorName - , _fboPos = fboPosName - , _rboBaseBloom = rboBaseBloomName - , _matUBO = theUBO - } + return $ + RenderData + { _pictureShaders = shadV + , _shapeShader = bslista{_shadVAO = shPosColVAO} + , _shapeEBO = shEBO + , _silhouetteEBO = silEBO + , _lightingCapShader = lightingCapShad + , _lightingLineShadowShader = lightingLineShadowShad + , _positionalBlankShader = positionalBlankShad + , _lightingWallShadShader = lightingWallShadShad + , _wallBlankShader = wallBlankShad + , _wallTextureShader = wallTextureShad + , _windowShader = wallBlankShad{_shadVAO = winColVAO} + , _textureArrayShader = textArrayShad + , _fullscreenShader = fsShad + , _lightingTextureShader = lightingTextureShad + , _bloomBlurShader = bloomBlurShad + , _colorBlurShader = colorBlurShad + , _barrelShader = barrelShad + , _grayscaleShader = grayscaleShad + , _fbo2 = framebuf2 + , _fbo3 = framebuf3 + , _fboHalf1 = fboHalf1Name + , _fboHalf2 = fboHalf2Name + , _fboHalf3 = fboHalf3Name + , _fboLighting = fboLightingName + , _fboLightingHigh = fboLightingHighName + , _fboBase = fboBaseName + , _fboCloud = fboCloudName + , _fboBloom = fboBloomName + , _fboColor = fboColorName + , _fboPos = fboPosName + , _rboBaseBloom = rboBaseBloomName + , _matUBO = theUBO + } + --------------------end preloadRender cornerList :: [[Float]] cornerList = - [[-1, 1,0,1] - ,[-1,-1,0,0] - ,[ 1, 1,1,1] - ,[ 1,-1,1,0] - ] + [ [-1, 1, 0, 1] + , [-1, -1, 0, 0] + , [1, 1, 1, 1] + , [1, -1, 1, 0] + ] + cleanUpRenderPreload :: RenderData -> IO () cleanUpRenderPreload pd = do -- TODO fix this diff --git a/src/Render.hs b/src/Render.hs index 2b46cf9b5..dd5fe6bdb 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -63,14 +63,14 @@ createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUSh -- to consider: adding normals/a "material" for each fragment blendFunc $= (Zero, OneMinusSrcColor) stencilTest $= Enabled + stencilOpSeparate Front $= (OpKeep, OpKeep, OpIncrWrap) + stencilOpSeparate Back $= (OpKeep, OpKeep, OpDecrWrap) flip VFSM.mapM_ (VFSM.fromList lightPoints) $ \(V3 x y z, rad, V3 r g b) -> do depthFunc $= Just Less -- setup stencil colorMask $= Color4 Disabled Disabled Disabled Disabled clear [StencilBuffer] cullFace $= Nothing - stencilOpSeparate Front $= (OpKeep, OpKeep, OpIncrWrap) - stencilOpSeparate Back $= (OpKeep, OpKeep, OpDecrWrap) stencilFunc $= (Always, 0, 255) --draw wall shadows currentProgram $= Just (_shadProg lwallShad) @@ -110,7 +110,7 @@ createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUSh -- bind world position texture bindTO toPos colorMask $= Color4 Enabled Enabled Enabled Enabled - stencilOp $= (OpKeep, OpKeep, OpKeep) + --stencilOp $= (OpKeep, OpKeep, OpKeep) stencilFunc $= (Equal, 0, 255) currentProgram $= ltextShad ^? shadProg --Just (_shadProg ltextShad) uniform (_shadUnis ltextShad V.! 0) $= Vector3 x y z