diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 91f943a3c..a92998b2c 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -77,13 +77,13 @@ pistol = defaultGun , _wpSpread = 0.02 , _wpRange = 20 , _itHammer = HammerUp - , _itFloorPict = (,) emptySH $ onLayer FlItLayer pistolPic + , _itFloorPict = pistolPic , _itAmount = 1 , _itMaxStack = 1 , _itAimingSpeed = 1 , _itAimingRange = 0 , _itZoom = defaultItZoom - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH pistolPic + , _itEquipPict = pictureWeaponOnAim pistolPic , _itAttachment = NoItAttachment , _itID = Nothing , _itEffect = wpRecock @@ -93,8 +93,11 @@ pistol = defaultGun , _itWorldTrigger = Nothing , _wpAmmo = basicBullet } -pistolPic :: Picture -pistolPic = color green $ polygon $ rectNESW 5 5 (-5) (-5) +pistolPic :: SPic +pistolPic = + ( colorSH green $ upperPrismPoly 3 $ rectNESW 5 5 (-5) (-5) + , mempty + ) effectGun :: String -> (Creature -> World -> World) -> Item @@ -152,17 +155,19 @@ teslaGun = defaultGun ] , _wpSpread = 0.001 , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer teslaGunPic + , _itFloorPict = teslaGunPic , _itAimingSpeed = 0.4 , _itZoom = defaultItZoom , _itAimingRange = 0 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH teslaGunPic + , _itEquipPict = pictureWeaponOnAim teslaGunPic } -teslaGunPic :: Picture -teslaGunPic = color blue $ pictures - [polygon $ rectNESW xb y xa (-y) - ,polygon $ rectNESW (-xa) y (-xb) (-y) - ] +teslaGunPic :: SPic +teslaGunPic = + ( colorSH blue $ + upperPrismPoly 5 (rectNESW xb y xa (-y)) + ++ (upperPrismPoly 5 $ rectNESW (-xa) y (-xb) (-y)) + , mempty + ) where xa = 1 xb = 9 @@ -187,16 +192,19 @@ lasGun = defaultAutoGun ] , _wpSpread = 0.001 , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer lasGunPic + , _itFloorPict = lasGunPic , _itAimingSpeed = 0.4 , _itAimingRange = 1 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH lasGunPic + , _itEquipPict = pictureWeaponOnAim lasGunPic , _itAttachment = ItCharMode $ Seq.fromList "/VZ" , _itScroll = scrollCharMode , _itInvDisplay = basicWeaponDisplay } -lasGunPic :: Picture -lasGunPic = color blue . polygon $ rectNESW 3 15 (-3) (-15) +lasGunPic :: SPic +lasGunPic = + ( colorSH blue . upperPrismPoly 5 $ rectNESW 3 15 (-3) (-15) + , mempty + ) forceFieldGun :: Item forceFieldGun = defaultGun { _itName = "FORCEFIELD" @@ -278,12 +286,18 @@ remoteLauncher = defaultGun ] , _wpSpread = 0.02 , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer $ color cyan $ polygon $ rectNESW 5 5 (-5) (-5) + , _itFloorPict = remoteLauncherSPic , _itAimingSpeed = 0.2 , _itAimingRange = 0.5 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH $ color cyan $ polygon $ rectNESW 5 5 (-5) (-5) + , _itEquipPict = pictureWeaponOnAim remoteLauncherSPic , _itAttachment = ItScope (V2 0 0) 0 1 True } +remoteLauncherSPic :: SPic +remoteLauncherSPic = + ( colorSH cyan $ upperPrismPoly 7 $ rectNESW 5 5 (-5) (-5) + , mempty + ) + hvAutoGun :: Item hvAutoGun = defaultAutoGun { _itName = "AUTO-HV" @@ -303,14 +317,17 @@ hvAutoGun = defaultAutoGun , withMuzFlareI ] , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer hvAutoGunPic + , _itFloorPict = hvAutoGunPic , _itAimingSpeed = 0.2 , _itAimingRange = 1 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH hvAutoGunPic + , _itEquipPict = pictureWeaponOnAim hvAutoGunPic , _wpAmmo = hvBullet } -hvAutoGunPic :: Picture -hvAutoGunPic = color orange $ polygon $ rectNESW 5 12 (-5) (-12) +hvAutoGunPic :: SPic +hvAutoGunPic = + ( colorSH orange $ upperPrismPoly 5 $ rectNESW 5 12 (-5) (-12) + , mempty + ) ltAutoGun :: Item ltAutoGun = defaultAutoGun { _itName = "AUTO-LT" @@ -334,19 +351,19 @@ ltAutoGun = defaultAutoGun ] , _wpSpread = 0.5 , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer ltAutoGunPic + , _itFloorPict = ltAutoGunPic , _itAimingSpeed = 1 , _itAimingRange = 0 , _itZoom = defaultItZoom - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH ltAutoGunPic + , _itEquipPict = pictureWeaponOnAim ltAutoGunPic , _itAimStance = OneHand , _wpAmmo = ltBullet } -ltAutoGunPic :: Picture -ltAutoGunPic = color green $ pictures - [polygon $ rectNSWE 5 (-5) (-5) 0 - ,circleSolid 5 - ] +ltAutoGunPic :: SPic +ltAutoGunPic = + ( colorSH green $ upperPrismPoly 5 $ mirrorXAxis [V2 (-5) 5, V2 5 5, V2 10 0] + , mempty + ) miniGun :: Item miniGun = defaultAutoGun { _itName = "MINI-G" @@ -393,10 +410,10 @@ miniGun = defaultAutoGun , withSmoke 1 black 20 200 5 ] , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer miniGunPict + , _itFloorPict = miniGunPict , _itAimingSpeed = 0.4 , _itAimingRange = 1 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH miniGunPict + , _itEquipPict = pictureWeaponOnAim miniGunPict , _wpAmmo = basicBullet } where @@ -411,11 +428,13 @@ miniGun = defaultAutoGun [ 0.25, 0.5, 0.9] --[ 0.75, 0.5, 0.25] --[ 0, 0, 0] -miniGunPict :: Picture -miniGunPict = pictures - [ translate 5 0 . color red $ polygon $ rectNESW 9 7 (-9) (-5) - , color red . polygon $ rectNESW 4 12 (-4) (-12) - ] +miniGunPict :: SPic +miniGunPict = + ( (translateSHf 5 0 . colorSH red $ upperPrismPoly 10 $ rectNESW 9 7 (-9) (-5)) + ++ (colorSH red . upperPrismPoly 5 $ rectNESW 4 12 (-4) (-12)) + + , mempty + ) spreadGun :: Item spreadGun = defaultGun { _itName = "SPREAD" @@ -443,7 +462,7 @@ spreadGun = defaultGun , _itFloorPict = spreadGunPic , _itAimingSpeed = 1 , _itAimingRange = 0 - , _itEquipPict = pictureWeaponOnAim $ spreadGunPic + , _itEquipPict = pictureWeaponOnAim spreadGunPic , _wpAmmo = basicBullet , _wpNumBarrels = 50 } @@ -475,28 +494,31 @@ multGun = defaultGun ] , _wpSpread = spreadGunSpread , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer multGunPic + , _itFloorPict = multGunSPic , _itAimingSpeed = 0.4 , _itAimingRange = 1 , _itZoom = defaultItZoom , _itAimZoom = defaultItZoom {_itZoomFac = 1.5} - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH multGunPic + , _itEquipPict = pictureWeaponOnAim multGunSPic , _itAimStance = TwoHandTwist , _wpAmmo = basicBullet , _wpNumBarrels = 5 } -multGunPic :: Picture -multGunPic = color red $ pictures - [ polygon $ rectNESW 4 8 (-4) (-12) - , translate 8 0 $ pictures - [ polygon $ rectNSEW 12 8 2 (-2) - , polygon $ rectNSEW 7 3 2 (-2) - , polygon $ rectNSEW 2 (-2) 2 (-2) - , polygon $ rectNSEW (-3) (-7) 2 (-2) - , polygon $ rectNSEW (-8) (-12) 2 (-2) - , polygon $ map toV2 [(-1.5,12),(-2,12),(-2,-12),(-1.5,-12)] - ] - ] +multGunSPic :: SPic +multGunSPic = + ( colorSH red $ + upperPrismPoly 2 (rectNESW 4 8 (-4) (-12)) ++ + translateSHf 8 0 (mconcat + [ upperPrismPoly 5 $ rectNSEW 12 8 2 (-2) + , upperPrismPoly 5 $ rectNSEW 7 3 2 (-2) + , upperPrismPoly 5 $ rectNSEW 2 (-2) 2 (-2) + , upperPrismPoly 5 $ rectNSEW (-3) (-7) 2 (-2) + , upperPrismPoly 5 $ rectNSEW (-8) (-12) 2 (-2) + , upperPrismPoly 2 $ map toV2 [(-1.5,12),(-2,12),(-2,-12),(-1.5,-12)] + ] + ) + , mempty + ) longGun :: Item longGun = defaultGun { _itName = "LONGGUN" @@ -520,20 +542,23 @@ longGun = defaultGun , withMuzFlareI ] , _wpRange = 200 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer longGunPic + , _itFloorPict = longGunSPic , _itAimingSpeed = 0.2 , _itAimingRange = 1 , _itZoom = defaultItZoom , _itAimZoom = defaultItZoom {_itZoomMax = 0.5, _itZoomMin = 0.5} - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH longGunPic + , _itEquipPict = pictureWeaponOnAim longGunSPic , _itScroll = zoomLongGun , _itAttachment = ItScope (V2 0 0) 0 1 False , _itEffect = itemLaserScopeEffect , _wpAmmo = hvBullet , _itAimStance = TwoHandTwist } -longGunPic :: Picture -longGunPic = pictures [color orange $ polygon $ rectNESW 2 12 (-2) (-12) ] +longGunSPic :: SPic +longGunSPic = + ( colorSH orange $ upperPrismPoly 5 $ rectNESW 2 12 (-2) (-12) + , mempty + ) zoomLongGun :: Float -> Creature -> Item -> Item zoomLongGun x _ @@ -591,19 +616,21 @@ flamer = defaultAutoGun ] , _wpSpread = 0 , _wpRange = 8 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer flamerPic + , _itFloorPict = flamerPic , _itAimingSpeed = 0.5 , _itAimingRange = 0 , _itZoom = defaultItZoom , _itAimZoom = defaultItZoom {_itZoomMax = 5, _itZoomMin = 1.5} - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH flamerPic + , _itEquipPict = pictureWeaponOnAim flamerPic , _itAttachment = NoItAttachment } -flamerPic :: Picture -flamerPic = color yellow $ pictures - [ translate (negate 5) (negate 7) $ circleSolid 5 - , polygon $ rectNESW 2 9 (-2) (-9) - ] +flamerPic :: SPic +flamerPic = + ( colorSH yellow $ + translateSHf (negate 5) (negate 7) (upperPrismPoly 3 $ polyCirc 3 5) + ++ upperPrismPoly 5 (rectNESW 2 9 (-2) (-9)) + , mempty + ) blinkGun :: Item blinkGun = defaultGun { _itName = "BLINKER" diff --git a/src/Dodge/Item/Weapon/Launcher.hs b/src/Dodge/Item/Weapon/Launcher.hs index c22cdb89a..16225b529 100644 --- a/src/Dodge/Item/Weapon/Launcher.hs +++ b/src/Dodge/Item/Weapon/Launcher.hs @@ -6,7 +6,6 @@ import Dodge.Default.Weapon import Dodge.Default.Shell import Dodge.SoundLogic.LoadSound import Dodge.WorldEvent.Explosion -import Dodge.Picture.Layer import Dodge.Item.Data import Dodge.Item.Draw import Dodge.Item.Weapon.Shell @@ -22,7 +21,7 @@ import Geometry.Vector3D import Picture import qualified IntMapHelp as IM import Padding ---import ShapePicture +import ShapePicture import Shape import Data.Maybe @@ -50,10 +49,10 @@ launcher = defaultGun ] , _wpSpread = 0.02 , _wpRange = 20 - , _itFloorPict = (,) emptySH $ onLayer FlItLayer launcherPic + , _itFloorPict = launcherPic , _itAimingSpeed = 0.2 , _itAimingRange = 0.5 - , _itEquipPict = pictureWeaponOnAim $ (,) emptySH launcherPic + , _itEquipPict = pictureWeaponOnAim launcherPic , _itHammer = NoHammer , _itEffect = NoItEffect , _wpAmmo = defaultShellAmmo @@ -65,8 +64,11 @@ launcher = defaultGun , _itAimStance = TwoHandTwist } -launcherPic :: Picture -launcherPic = color cyan $ polygon $ rectNESW 5 10 (-5) (-10) +launcherPic :: SPic +launcherPic = + ( colorSH cyan $ upperPrismPoly 7 $ rectNESW 5 10 (-5) (-10) + , mempty + ) basicAmPjMoves :: [PjParam] basicAmPjMoves = diff --git a/src/Geometry.hs b/src/Geometry.hs index 08e838be1..1ae34f316 100644 --- a/src/Geometry.hs +++ b/src/Geometry.hs @@ -25,6 +25,7 @@ import Geometry.Vector import Geometry.LHS --import Geometry.Zone +import Data.Maybe import Data.List -- | Return a point a distance away from a first point towards a second point. -- Does not go past the second point. @@ -64,6 +65,13 @@ rectNSWE !n !s !w !e = [V2 w n, V2 w s, V2 e s, V2 e n] -- | Draw a rectangle around the origin with given height and width rectWdthHght :: Float -> Float -> [Point2] rectWdthHght w h = rectNSWE h (-h) (-w) w + +mirrorXAxis :: [Point2] -> [Point2] +mirrorXAxis ps = orderPolygon $ ps ++ mapMaybe f ps + where + f (V2 _ 0) = Nothing + f (V2 x y) = Just $ V2 x (-y) + -- | Test whether a point is in a polygon or on the polygon border. -- Supposes the points in the -- polygon are listed in anticlockwise order. diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 7bc2d2f71..d0eccec61 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -117,13 +117,13 @@ preloadRender = do let silEBO = EBO {_ebo = silEBOname, _eboPtr = silEBOptr} shEdgeVAO = VAO { _vao = shEdgeVAOname, _vaoVBO = shVBO } -- lighting shaders - wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints + lightingOccludeShad <- makeShaderUsingVAO "lighting/occlude" [vert,geom,frag] EPoints wpVAO >>= addUniforms ["lightPos"] lightingCapShad - <- makeShader "lighting/cap" [vert,geom,frag] [3] ETriangles + <- makeShaderUsingVAO "lighting/cap" [vert,geom,frag] ETriangles shPosVAO >>= addUniforms ["lightPos"] lightingLineShadowShad - <- makeShader "lighting/lineShadow" [vert,geom,frag] [3] ELinesAdjacency + <- makeShaderUsingVAO "lighting/lineShadow" [vert,geom,frag] ELinesAdjacency shEdgeVAO >>= addUniforms ["lightPos"] -- 2D draw shaders bslist <- makeShader "dualTwoD/basic" [vert,frag] [3,4] ETriangles @@ -150,9 +150,9 @@ preloadRender = do >>= addUniforms ["lightPos","lumRad"] barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints -- blank wallShader - wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints + wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert,geom,frag] EPoints wpColVAO -- textured wallShader - wlTexture <- makeShader "wall/texture" [vert,geom,frag] [4,4] EPoints + 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 @@ -200,12 +200,12 @@ preloadRender = do , _shapeShader = bslista {_shadVAO = shPosColVAO } , _shapeEBO = shEBO , _silhouetteEBO = silEBO - , _lightingCapShader = lightingCapShad { _shadVAO = shPosVAO } - , _lightingLineShadowShader = lightingLineShadowShad {_shadVAO = shEdgeVAO} - , _lightingOccludeShader = wsShad {_shadVAO = wpVAO} - , _wallBlankShader = wlBlank { _shadVAO = wpColVAO } - , _wallTextureShader = wlTexture { _shadVAO = wpColVAO } - , _windowShader = wlBlank { _shadVAO = winColVAO } + , _lightingCapShader = lightingCapShad + , _lightingLineShadowShader = lightingLineShadowShad + , _lightingOccludeShader = lightingOccludeShad + , _wallBlankShader = wallBlankShad + , _wallTextureShader = wallTextureShad + , _windowShader = wallBlankShad { _shadVAO = winColVAO } , _textureArrayShader = textArrayShad , _fullscreenShader = fsShad , _fullLightingShader = fullLightingShad diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index 912fcfae3..36d4c803f 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -4,6 +4,7 @@ module Shader.Compile , makeByteStringShaderUsingVAO , makeShaderSized , makeShaderUsingShaderVAO + , makeShaderUsingVAO , makeSourcedShader , setupVAO , setupVertexAttribPointer @@ -67,6 +68,23 @@ makeByteStringShaderUsingVAO s shaderlist pm fs = do , _shadUnis = [] } +-- | Takes the VAO from elsewhere +makeShaderUsingVAO + :: String -- ^ First part of the name of the shader + -> [ShaderType] -- ^ Filetype extensions + -> EPrimitiveMode + -> VAO + -> IO FullShader +makeShaderUsingVAO s shaderlist pm theVAO = do + prog <- makeSourcedShader s shaderlist + return $ FullShader + { _shadProg = prog + , _shadVAO = theVAO + , _shadPrim = pm + , _shadTex = Nothing + , _shadUnis = [] + } + -- | Takes the VAO from another shader makeShaderUsingShaderVAO :: String -- ^ First part of the name of the shader