From 899c1c5f6ea7d824ffed0ac4632bf50b0a811e55 Mon Sep 17 00:00:00 2001 From: jgk Date: Wed, 23 Jun 2021 01:35:38 +0200 Subject: [PATCH] Refactor text rendering --- shader/twoD/character.frag | 4 +-- shader/twoD/character.vert | 10 ++++---- src/Dodge/Item/Weapon.hs | 4 +-- src/Dodge/Item/Weapon/Decoration.hs | 2 +- src/Dodge/Picture/Layer.hs | 2 +- src/Dodge/Render.hs | 3 ++- src/Dodge/SoundLogic/LoadSound.hs | 2 ++ src/Dodge/SoundLogic/Synonyms.hs | 2 ++ src/MatrixHelper.hs | 2 +- src/Picture/Data.hs | 2 +- src/Picture/Render.hs | 39 ++++++----------------------- src/Picture/Tree.hs | 28 ++++++++++++++------- src/Preload/Render.hs | 4 +-- 13 files changed, 48 insertions(+), 56 deletions(-) diff --git a/shader/twoD/character.frag b/shader/twoD/character.frag index a1cefb0e9..5f5e495d4 100644 --- a/shader/twoD/character.frag +++ b/shader/twoD/character.frag @@ -2,13 +2,13 @@ out vec4 FragColor; in vec4 gColor; -in vec2 gTex; +in vec2 gTexCoord; uniform sampler2D aTexture; void main() { - FragColor = texture(aTexture, gTex) * gColor; + FragColor = texture(aTexture, vec2 (gTexCoord.x * 0.0078125, gTexCoord.y)) * gColor; // FragColor = texture(aTexture, vTexCoord); // FragColor = gColor; // FragColor = vec4 (1,1,1,1); diff --git a/shader/twoD/character.vert b/shader/twoD/character.vert index e836e0c4f..5d702ba15 100644 --- a/shader/twoD/character.vert +++ b/shader/twoD/character.vert @@ -1,16 +1,16 @@ #version 430 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec4 aColor; -layout (location = 2) in vec3 aTexCoord; +layout (location = 2) in vec2 aTexCoord; uniform mat4 worldMat; -out vec4 vColor; -out vec3 vTexCoord; +out vec4 gColor; +out vec2 gTexCoord; void main() { gl_Position = vec4(aPos, 1.0); - vColor = aColor; - vTexCoord = aTexCoord; + gColor = aColor; + gTexCoord = aTexCoord; } diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 29cc879b7..c73d0fe98 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -396,9 +396,9 @@ longGun = defaultGun , _itIdentity = LongGun , _wpMaxAmmo = 1 , _wpLoadedAmmo = 1 - , _wpReloadTime = 80 + , _wpReloadTime = 100 , _wpReloadState = 0 - , _wpReloadType = PassiveReload sineRaisePitchOneSecSound + , _wpReloadType = PassiveReload skwareFadeTwoSecSound , _itUseRate = 100 , _itUseTime = 0 , _itUse = shootWithSound (fromIntegral longGunSound) diff --git a/src/Dodge/Item/Weapon/Decoration.hs b/src/Dodge/Item/Weapon/Decoration.hs index 7e1d170e2..f1484dd6c 100644 --- a/src/Dodge/Item/Weapon/Decoration.hs +++ b/src/Dodge/Item/Weapon/Decoration.hs @@ -16,7 +16,7 @@ makeLaserScope -> Float -- ^ Fraction of red/green -> Particle makeLaserScope p ep relFrac = Particle - {_ptDraw = const $ onLayer PtLayer $ pictures + {_ptDraw = const $ setLayer 1 $ onLayer PtLayer $ pictures [lineAlphaThick 0.5 0.5 ,lineAlphaThick 0.2 1.5 ,lineAlphaThick 0.1 2 diff --git a/src/Dodge/Picture/Layer.hs b/src/Dodge/Picture/Layer.hs index 43a85ecd4..26653be70 100644 --- a/src/Dodge/Picture/Layer.hs +++ b/src/Dodge/Picture/Layer.hs @@ -10,7 +10,7 @@ import Dodge.Picture.Layer.Data import Picture {- | Uses a layer to set the depth. -} onLayer :: Layer -> Picture -> Picture -onLayer l = setDepth $ 1 - fromIntegral (levLayer l) / 100 +onLayer l = setDepth $ (1 - fromIntegral (levLayer l) / 100) / 100 {- | Set a depth according to a list of numbers. Lists are lexicographically ordered if input values are always less than 100. Higher numbers will get placed on top of lower numbers. -} diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index dbfea6bf5..02d1796c9 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -56,7 +56,8 @@ doDrawing pdata w = do pic = worldPictures w wallPoints = map fst wallPointsCol -- set the coordinate uniforms ready for drawing elements using world coordinates - setIsoMatrixUniforms pdata rot camzoom trans wins + --setIsoMatrixUniforms pdata rot camzoom trans wins + setPerpMatrixUniforms pdata rot camzoom trans wins viewFroms depthFunc $= Just Less pmat <- (newMatrix RowMajor $ perspectiveMatrix rot camzoom trans wins viewFroms) :: IO (GLmatrix GLfloat) diff --git a/src/Dodge/SoundLogic/LoadSound.hs b/src/Dodge/SoundLogic/LoadSound.hs index fae84aca4..d8aee1369 100644 --- a/src/Dodge/SoundLogic/LoadSound.hs +++ b/src/Dodge/SoundLogic/LoadSound.hs @@ -50,6 +50,7 @@ loadSounds = do foamSprayFadeOut <- Mix.load "./data/sound/foamSprayFadeOut.wav" sineRaisePitchOneSec <- Mix.load "./data/sound/sineRaisePitchOneSec.wav" sineRaisePitchTwoSec <- Mix.load "./data/sound/sineRaisePitchTwoSec.wav" + skwareFadeTwoSec <- Mix.load "./data/sound/skwareFadeTwoSec.wav" return $ IM.fromList $ zip [0..] [ pFireSound , click @@ -96,6 +97,7 @@ loadSounds = do , foamSprayFadeOut , sineRaisePitchOneSec , sineRaisePitchTwoSec + , skwareFadeTwoSec ] loadMusic :: IO (IM.IntMap Mix.Music) diff --git a/src/Dodge/SoundLogic/Synonyms.hs b/src/Dodge/SoundLogic/Synonyms.hs index 8fab99a3e..d4be0a834 100644 --- a/src/Dodge/SoundLogic/Synonyms.hs +++ b/src/Dodge/SoundLogic/Synonyms.hs @@ -30,6 +30,8 @@ sineRaisePitchOneSecSound :: Int sineRaisePitchOneSecSound = 43 sineRaisePitchTwoSecSound :: Int sineRaisePitchTwoSecSound = 44 +skwareFadeTwoSecSound :: Int +skwareFadeTwoSecSound = 45 drawWeaponSound = 4 holsterWeaponSound = 5 diff --git a/src/MatrixHelper.hs b/src/MatrixHelper.hs index 46cb3d489..8722d3cd2 100644 --- a/src/MatrixHelper.hs +++ b/src/MatrixHelper.hs @@ -20,7 +20,7 @@ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy) = let scalMat = Linear.Matrix.transpose $ V4 (V4 (2*zoom/winx) 0 0 (0::GLfloat)) (V4 0 (2*zoom/winy) 0 0) - (V4 0 0 0.5 0) --scaled to make walls shorter + (V4 0 0 1 0) (V4 0 0 0 1) rotMat = Linear.Matrix.transpose $ V4 (V4 (cos rot) (sin (-rot)) 0 0) diff --git a/src/Picture/Data.hs b/src/Picture/Data.hs index abda207e3..c9d3e3b2b 100644 --- a/src/Picture/Data.hs +++ b/src/Picture/Data.hs @@ -16,7 +16,7 @@ import Geometry.Data data RenderType = RenderPoly [(Point3,Point4)] | RenderBezQ [(Point3,Point4,Point4)] - | RenderText [(Point3,Point4,Point3)] + | RenderText [(Point3,Point4,Point2)] | RenderArc (Point3,Point4,Point4) | RenderLine [(Point3,Point4)] | RenderEllipse [(Point3,Point4)] diff --git a/src/Picture/Render.hs b/src/Picture/Render.hs index 7b9c7b6dd..d2a12019b 100644 --- a/src/Picture/Render.hs +++ b/src/Picture/Render.hs @@ -206,37 +206,20 @@ renderBackground pdata rot camZoom (tranx,trany) (winx,winy) = do textureBinding Texture2D $= _textureObject <$> _shaderTexture (_backgroundShader pdata) drawArrays Points 0 1 -setCommonUniforms +setPerpMatrixUniforms :: RenderData -> Float -- ^ Rotation -> Float -- ^ Zoom -> (Float,Float) -- ^ Translation -> (Float,Float) -- ^ Window size + -> (Float,Float) -- ^ ViewFrom -> IO () -setCommonUniforms pdata rot camZoom (tranx,trany) (winx,winy) = do - setShaderUniforms rot camZoom (tranx,trany) (winx,winy) - ( extractProgAndUnis (_lightingFloorShader pdata) - : extractProgAndUnis (_lightingOccludeShader pdata) - : extractProgAndUnis (_lightingWallShader pdata) - : extractProgAndUnis (_backgroundShader pdata) - : extractProgAndUnis (_textureShader pdata) - : map extractProgAndUnis (_pictureShaders pdata) - ) - -setIsoMatrixUniforms - :: RenderData - -> Float -- ^ Rotation - -> Float -- ^ Zoom - -> (Float,Float) -- ^ Translation - -> (Float,Float) -- ^ Window size - -> IO () -setIsoMatrixUniforms pdata rot camZoom (tranx,trany) (winx,winy) = do - setShaderUniforms rot camZoom (tranx,trany) (winx,winy) - ( extractProgAndUnis (_lightingFloorShader pdata) - : extractProgAndUnis (_backgroundShader pdata) - : extractProgAndUnis (_textureShader pdata) - : extractProgAndUnis (_textureArrayShader pdata) - : map extractProgAndUnis (_pictureShaders pdata) +setPerpMatrixUniforms pdata rot czoom trans wins vfs = mapM_ (setPerpMatUniform rot czoom trans wins vfs) + $ ( (_lightingFloorShader pdata) + : (_backgroundShader pdata) + : (_textureShader pdata) + : (_textureArrayShader pdata) + : (_pictureShaders pdata) ) renderShader @@ -252,12 +235,6 @@ renderShader shad dat = do eticks <- SDL.ticks return $ eticks - sticks ---renderPictureLayer --- :: PictureShaderData --- -> Picture --- -> IO Word32 ---renderPictureLayer - renderFoldable :: Foldable f => RenderData diff --git a/src/Picture/Tree.hs b/src/Picture/Tree.hs index 61267bdb8..042ea7ce1 100644 --- a/src/Picture/Tree.hs +++ b/src/Picture/Tree.hs @@ -70,9 +70,9 @@ white, black :: Color white = (1,1,1,1) black = (0,0,0,1) -scaleT :: (Float,Float) -> (Point3,Point4,Point3) -> (Point3,Point4,Point3) +scaleT :: (Float,Float) -> (Point3,Point4,Point2) -> (Point3,Point4,Point2) {-# INLINE scaleT #-} -scaleT (x,y) (a,b,(o,s,t)) = (a,b,(o,s*x,t*y)) +scaleT (x,y) (a,b,(o,s)) = (a,b,(o,s)) overPos :: (Point3 -> Point3) -> RenderType -> RenderType {-# INLINE overPos #-} @@ -104,19 +104,29 @@ overSca :: (Point2 -> Point2) -> RenderType -> RenderType overSca f (RenderText vs) = RenderText $ map (scaleT (f (1,1))) vs overSca _ p = p -stringToList :: String -> [(Point3,Point4,Point3)] +stringToList :: String -> [(Point3,Point4,Point2)] {-# INLINE stringToList #-} -stringToList s = zipWith (\x (a,b,c) -> (translate3 x 0 a,b,c)) - [0,0.9*dimText..] - $ map charToTuple s +stringToList s = concat $ zipWith (\x -> map (f x)) + [0,0.9*dimText..] + $ map charToTuple s + where + f y (a,b,c) = (translate3 y 0 a,b,c) --where dimText = 100 dimText :: Float dimText = 100 -charToTuple :: Char -> (Point3,Point4,Point3) +charToTuple :: Char -> [(Point3,Point4,Point2)] {-# INLINE charToTuple #-} -charToTuple c = ((0,0,0),white,(offset,dimText,2*dimText)) - where offset = fromIntegral (fromEnum c) - 32 +charToTuple c = + [((-50,-100,0), white,(offset,1)) + ,((-50,100,0), white,(offset,0)) + ,(( 50,100,0), white,(offset+1,0)) + ,((-50,-100,0), white,(offset,1)) + ,(( 50,-100,0), white,(offset+1,1)) + ,(( 50,100,0), white,(offset+1,0)) + ] + where + offset = fromIntegral (fromEnum c) - 32 {- Translate a 3D vector in the x and y directions. -} translate3 :: Float -> Float -> Point3 -> Point3 diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 9b44ff2ec..d9c32f7df 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -32,7 +32,7 @@ preloadRender = do aslist <- makeShader "twoD/arc" [vert,geom,frag] [3,4,4] Points pokeArcStrat eslist <- makeShader "twoD/ellipse" [vert,geom,frag] [3,4] Triangles pokeEllStrat bezierQuadShader <- makeShader "twoD/bezierQuad" [vert,frag] [3,4,4] TriangleStrip pokeBezQStrat - cslist <- makeShader "twoD/character" [vert,geom,frag] [3,4,3] Points pokeCharStrat + cslist <- makeShader "twoD/character" [vert,frag] [3,4,2] Triangles pokeCharStrat >>= addTexture "data/texture/charMap.png" -- texture shaders, no textures attached fsShad <- makeShader "texture/simple" [vert,frag] [2,2] TriangleStrip $ const cornerList @@ -174,7 +174,7 @@ pokeLightingFloorStrat :: RenderType -> [[Float]] pokeLightingFloorStrat Render1111{_unRender1111=x} = [flat4 x] pokeLightingFloorStrat _ = undefined -pokeCharStrat (RenderText vs) = fmap (\(a,b,c) -> concat [flat3 a, flat4 b, flat3 c]) vs +pokeCharStrat (RenderText vs) = fmap (\(a,b,c) -> concat [flat3 a, flat4 b, flat2 c]) vs pokeCharStrat _ = [] pokeArcStrat (RenderArc (a,b,c)) = [concat [flat3 a, flat4 b, flat4 c]]