1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
{-# LANGUAGE OverloadedStrings #-}
module RenderGeometry where
import Control.Monad
import Data.Word (Word8)
import Foreign (castPtr, plusPtr, sizeOf)
import Foreign.C.Types
import SDL.Vect
import qualified Data.Vector.Storable as V
import SDL (($=))
import qualified SDL
import SDL.Raw.Types (FPoint(..), Color(..))
screenWidth, screenHeight :: CInt
(screenWidth, screenHeight) = (640, 480)
main :: IO ()
main = do
SDL.initialize [SDL.InitVideo]
SDL.HintRenderScaleQuality $= SDL.ScaleLinear
do renderQuality <- SDL.get SDL.HintRenderScaleQuality
when (renderQuality /= SDL.ScaleLinear) $
putStrLn "Warning: Linear texture filtering not enabled!"
window <-
SDL.createWindow
"SDL / RenderGeometry Example"
SDL.defaultWindow
{ SDL.windowInitialSize = V2 screenWidth screenHeight
, SDL.windowGraphicsContext = SDL.OpenGLContext SDL.defaultOpenGL
}
SDL.showWindow window
renderer <- SDL.createRenderer window (-1) SDL.defaultRenderer
let
tl = fromIntegral screenWidth * 0.1
tt = fromIntegral screenHeight * 0.1
tr = fromIntegral screenWidth * 0.9
tb = fromIntegral screenHeight * 0.9
triVertices = V.fromList
[ SDL.Vertex
(FPoint tl tb)
(Color 0xFF 0 0 255)
(FPoint 0 0)
, SDL.Vertex
(FPoint tr tb)
(Color 0 0xFF 0 255)
(FPoint 0 1)
, SDL.Vertex
(FPoint (tl/2 + tr/2) tt)
(Color 0 0 0xFF 255)
(FPoint 1 1)
]
let
l = fromIntegral screenWidth * 0.2
t = fromIntegral screenHeight * 0.2
r = fromIntegral screenWidth * 0.8
b = fromIntegral screenHeight * 0.8
quadVertices = V.fromList
[ SDL.Vertex
(FPoint l b)
(Color 0xFF 0 0xFF 127)
(FPoint 0 0)
, SDL.Vertex
(FPoint r b)
(Color 0xFF 0 0xFF 127)
(FPoint 1 0)
, SDL.Vertex
(FPoint r t)
(Color 0xFF 0xFF 0 127)
(FPoint 1 1)
, SDL.Vertex
(FPoint l t)
(Color 0 0 0 127)
(FPoint 0 1)
]
quadIndices = V.fromList
[ 0, 1, 3
, 2, 3, 1
]
stride = fromIntegral $ sizeOf (undefined :: SDL.Vertex)
let loop = do
events <- SDL.pollEvents
let quit = elem SDL.QuitEvent $ map SDL.eventPayload events
SDL.rendererDrawColor renderer $= V4 maxBound maxBound maxBound maxBound
SDL.clear renderer
SDL.renderGeometry
renderer
Nothing
triVertices
mempty
SDL.rendererDrawBlendMode renderer $= SDL.BlendAlphaBlend
V.unsafeWith quadVertices $ \ptr ->
SDL.renderGeometryRaw
renderer
Nothing
(castPtr ptr)
stride
(castPtr ptr `plusPtr` sizeOf (undefined :: FPoint))
stride
(castPtr ptr `plusPtr` sizeOf (undefined :: FPoint) `plusPtr` sizeOf (undefined :: Color))
stride
(fromIntegral $ V.length quadVertices)
(quadIndices :: V.Vector Word8)
SDL.present renderer
unless quit loop
loop
SDL.destroyWindow window
SDL.quit
|