name: h170505
version: 0.1.0.0
-- synopsis:
-- description:
homepage: https://github.com/githubuser/h170505#readme
license: BSD3
license-file: LICENSE
author: Author name here
maintainer: example@example.com
copyright: 2017 Author name here
category: Web
build-type: Simple
extra-source-files: README.md
cabal-version: >=1.10
library
hs-source-dirs: src
exposed-modules: Lib
, Bindings
, Display
, Cube
, Points
build-depends: base >= 4.7 && < 5
, GLUT
, OpenGL
default-language: Haskell2010
executable h170505-exe
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, h170505
, GLUT
, OpenGL
default-language: Haskell2010
test-suite h170505-test
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Spec.hs
build-depends: base
, h170505
ghc-options: -threaded -rtsopts -with-rtsopts=-N
default-language: Haskell2010
source-repository head
type: git
location: https://github.com/githubuser/h170505
import Graphics.UI.GLUT
import Data.IORef
import Bindings
main :: IO ()
main = do
(_progName, _args) <- getArgsAndInitialize
initialDisplayMode $= [WithDepthBuffer, DoubleBuffered]
_window <- createWindow "Hello World"
reshapeCallback $= Just reshape
depthFunc $= Just Less
angle <- newIORef 0
delta <- newIORef 0.1
pos <- newIORef (0, 0)
keyboardMouseCallback $= Just (keyboardMouse delta pos)
idleCallback $= Just (idle angle delta)
displayCallback $= display angle pos
mainLoop
module Bindings (idle, display, reshape, keyboardMouse) where
import Graphics.UI.GLUT
import Data.IORef
import Display
reshape :: ReshapeCallback
reshape size = do
viewport $= (Position 0 0, size)
keyboardMouse :: IORef GLfloat -> IORef (GLfloat, GLfloat) -> KeyboardMouseCallback
keyboardMouse a p key Down _ _ = case key of
(Char ' ') -> a $~! negate
(Char '+') -> a $~! (* 2)
(Char '-') -> a $~! (/ 2)
(SpecialKey KeyLeft ) -> p $~! \(x,y) -> (x-0.1,y)
(SpecialKey KeyRight) -> p $~! \(x,y) -> (x+0.1,y)
(SpecialKey KeyUp ) -> p $~! \(x,y) -> (x,y+0.1)
(SpecialKey KeyDown ) -> p $~! \(x,y) -> (x,y-0.1)
_ -> return ()
keyboardMouse _ _ _ _ _ _ = return ()
module Display (idle, display) where
import Graphics.UI.GLUT
import Control.Monad
import Data.IORef
import Cube
import Points
display :: IORef GLfloat -> IORef (GLfloat, GLfloat) -> DisplayCallback
display angle pos = do
clear [ColorBuffer, DepthBuffer]
clear [ColorBuffer]
loadIdentity
(x',y') <- get pos
translate $ Vector3 x' y' 0
preservingMatrix $ do
a <- get angle
rotate a $ Vector3 0 0 1
rotate a $ Vector3 0 0.1 1
scale 0.7 0.7 (0.7::GLfloat)
forM_ (points 7) $ \(x,y,z) -> preservingMatrix $ do
color $ Color3 ((x+1)/2) ((y+1)/2) ((z+1)/2)
translate $ Vector3 x y z
cube 0.1
color $ Color3 (0::GLfloat) 0 0
cubeFrame 0.1
swapBuffers
idle :: IORef GLfloat -> IORef GLfloat -> IdleCallback
idle angle delta = do
d <- get delta
angle $~! (+ d)
postRedisplay Nothing
module Cube where
import Graphics.UI.GLUT
vertex3f :: (GLfloat, GLfloat, GLfloat) -> IO ()
vertex3f (x, y, z) = vertex $ Vertex3 x y z
cube :: GLfloat -> IO ()
cube w = renderPrimitive Quads $ mapM_ vertex3f
[ ( w, w, w), ( w, w,-w), ( w,-w,-w), ( w,-w, w),
( w, w, w), ( w, w,-w), (-w, w,-w), (-w, w, w),
( w, w, w), ( w,-w, w), (-w,-w, w), (-w, w, w),
(-w, w, w), (-w, w,-w), (-w,-w,-w), (-w,-w, w),
( w,-w, w), ( w,-w,-w), (-w,-w,-w), (-w,-w, w),
( w, w,-w), ( w,-w,-w), (-w,-w,-w), (-w, w,-w) ]
cubeFrame :: GLfloat -> IO ()
cubeFrame w = renderPrimitive Lines $ mapM_ vertex3f
[ ( w,-w, w), ( w, w, w), ( w, w, w), (-w, w, w),
(-w, w, w), (-w,-w, w), (-w,-w, w), ( w,-w, w),
( w,-w, w), ( w,-w,-w), ( w, w, w), ( w, w,-w),
(-w, w, w), (-w, w,-w), (-w,-w, w), (-w,-w,-w),
( w,-w,-w), ( w, w,-w), ( w, w,-w), (-w, w,-w),
(-w, w,-w), (-w,-w,-w), (-w,-w,-w), ( w,-w,-w) ]
module Points where
import Graphics.Rendering.OpenGL
points :: Int -> [(GLfloat,GLfloat,GLfloat)]
points n = [ (sin (2*pi*k/n'), cos (2*pi*k/n'), 0) | k <- [1..n'] ]
where n' = fromIntegral n