From 9fc42bcc1b35cb337016e88f4b1969b6e3baafdf Mon Sep 17 00:00:00 2001
From: 3gg <3gg@shellblade.net>
Date: Wed, 23 Aug 2023 08:46:52 -0700
Subject: Render without deforming paddles/ball.

---
 Demos/Pong/Main.hs | 55 +++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 17 deletions(-)

(limited to 'Demos/Pong')

diff --git a/Demos/Pong/Main.hs b/Demos/Pong/Main.hs
index ee0f8d8..0644f9d 100644
--- a/Demos/Pong/Main.hs
+++ b/Demos/Pong/Main.hs
@@ -1,10 +1,9 @@
-{-# LANGUAGE ImportQualifiedPost #-}
-
 module Main where
 
-import           Data.Maybe                   (mapMaybe)
-import           Graphics.Rendering.OpenGL.GL (($=))
-import qualified Graphics.Rendering.OpenGL.GL as GL
+import           Data.Maybe                              (mapMaybe)
+import           Graphics.Rendering.OpenGL.GL            (($=))
+import qualified Graphics.Rendering.OpenGL.GL            as GL
+import           Graphics.Rendering.OpenGL.GL.VertexSpec (currentColor)
 import           Pong
 import           Spear.App
 import           Spear.Game
@@ -23,12 +22,7 @@ main =
     loop step
 
 initGame :: Window -> Game () GameState
-initGame window = do
-  gameIO $ do
-    GL.clearColor $= GL.Color4 0.7 0.5 0.7 1.0
-    GL.matrixMode $= GL.Modelview 0
-    GL.loadIdentity
-  return $ GameState window newWorld
+initGame window = return $ GameState window newWorld
 
 step :: Elapsed -> Dt -> [InputEvent] -> Game GameState Bool
 step elapsed dt inputEvents = do
@@ -43,9 +37,29 @@ step elapsed dt inputEvents = do
   return (not $ exitRequested inputEvents)
 
 render world = do
+  -- Clear the background to a different colour than the playable area to make
+  -- the latter distinguishable.
+  GL.clearColor $= GL.Color4 0.2 0.2 0.2 0.0
   GL.clear [GL.ColorBuffer]
+  GL.matrixMode $= GL.Modelview 0
+  GL.loadIdentity
+  renderBackground
+  -- Draw objects.
+  GL.currentColor $= GL.Color4 1.0 1.0 1.0 1.0
   mapM_ renderGO world
 
+renderBackground :: IO ()
+renderBackground =
+  let pmin = 0 :: Float
+      pmax = 1 :: Float
+  in do
+    GL.currentColor $= GL.Color4 0.7 0.5 0.7 1.0
+    GL.renderPrimitive GL.TriangleStrip $ do
+        GL.vertex (GL.Vertex2 pmin pmax)
+        GL.vertex (GL.Vertex2 pmin pmin)
+        GL.vertex (GL.Vertex2 pmax pmax)
+        GL.vertex (GL.Vertex2 pmax pmin)
+
 renderGO :: GameObject -> IO ()
 renderGO go = do
   let (AABB2 (Vector2 xmin' ymin') (Vector2 xmax' ymax')) = aabb go
@@ -61,12 +75,19 @@ renderGO go = do
 
 process = mapM_ procEvent
 
-procEvent (Resize w h) = do
-  GL.viewport $= (GL.Position 0 0, GL.Size (fromIntegral w) (fromIntegral h))
-  GL.matrixMode $= GL.Projection
-  GL.loadIdentity
-  GL.ortho 0 1 0 1 (-1) 1
-  GL.matrixMode $= GL.Modelview 0
+procEvent (Resize w h) =
+  let r = (fromIntegral w) / (fromIntegral h)
+      pad    = if r > 1 then (r-1) / 2 else (1/r - 1) / 2
+      left   = if r > 1 then -pad else 0
+      right  = if r > 1 then 1 + pad else 1
+      bottom = if r > 1 then 0 else -pad
+      top    = if r > 1 then 1 else 1 + pad
+  in do
+    GL.viewport $= (GL.Position 0 0, GL.Size (fromIntegral w) (fromIntegral h))
+    GL.matrixMode $= GL.Projection
+    GL.loadIdentity
+    GL.ortho left right bottom top (-1) 1
+    GL.matrixMode $= GL.Modelview 0
 procEvent _ = return ()
 
 translate = mapMaybe translate'
-- 
cgit v1.2.3