import Data.Maybe
import Data.Map
import Control.Applicative
import Control.Monad
import Graphics.UI.GLFW as GLFW
import Graphics.Rendering.OpenGL as GL hiding (light)
import System.Log.Logger
import FRP.Elerea
import Graphics.LambdaCube
import Graphics.LambdaCube.RenderSystem.GL
import qualified Graphics.LambdaCube.Loader.StbImage as Stb
import Paths_lambdacube_examples (getDataFileName)
import Utils
integral v0 s = transfer v0 (\dt v v0 -> v0+v*realToFrac dt) s
baseMousePos = Position 200 200
width = 150
height = 150
main = do
updateGlobalLogger rootLoggerName (setLevel DEBUG)
initialize
openWindow (Size 640 480) [DisplayRGBBits 8 8 8, DisplayAlphaBits 8, DisplayDepthBits 24] Window
windowTitle $= "LambdaCube Engine Basic Example"
GLFW.mousePos $= baseMousePos
GLFW.disableSpecial MouseCursor
initGL 640 480
(windowSize,windowSizeSink) <- external (0,0)
(mousePosition,mousePositionSink) <- external (0,0)
(mousePress,mousePressSink) <- external False
(fblrPress,fblrPressSink) <- external (False,False,False,False,False)
windowSizeCallback $= resizeGLScene windowSizeSink
let --mkNodeR = mkNode "Root"
idMatrix4 = transl 0 0 0
mediaPath <- getDataFileName "media"
renderSystem <- mkGLRenderSystem
world' <- addRenderWindow "MainWindow" 640 480 [mkViewport 0 0 1 0.5 "Camera1" ["Glass"{- "Tiling","Glass" -}], mkViewport 0 0.5 1 0.5 "Camera2" []]
=<< addRenderTexture "RenderTex01" 640 480
=<< addScene ([-- mkNode "Root" "Car" idMatrix4 [mesh "scooby_body.mesh.xml"]
mkNode "Root" "Robot" idMatrix4 [mesh "robot.mesh.xml"]
-- , mkNodeR "OgreHead" idMatrix4 [mesh "BigRamp_N.mesh.xml"]
-- , mkNodeR "Plane" (transl 41.5 (-50) (-146)) [entity "robot.mesh.xml"]
, mkNode "Root" "OgreHead" (scal 0.05) [mesh "ogrehead.mesh.xml",mesh "Quad.mesh.xml"]
-- , mkNodeR "Light1" transl 5 5 10 $ [sun ]
, mkNode "Root" "Light1" (transl 5 5 10) [light,mesh "ogrehead.mesh.xml"]
-- , mkNode "Root" "Light2" (transl (-5) 15 10) [light,mesh "Cube.mesh.xml"]
-- , mkNodeR "CustomMeshNode" idMatrix4 [customMesh (plane) "RenderTex01Material"]
, mkNode "Root" "CameraNode1" idMatrix4 [simpleCamera "Camera1"]
, mkNode "Root" "CameraEye" idMatrix4 [mesh "Box.mesh.xml"]
-- , mkNode "Root" "CameraNode1" idMatrix4 [wireCamera "Camera1"]
, mkNode "Root" "CameraNode2" (transl 0 0 (-10)) [simpleCamera "Camera2"] ]
-- , mkNode "Root" "CameraNode2" (transl 0 0 10) [simpleCamera "Camera2"] ]
-- ++ [ mkNode "Root" ("Robot" ++ show i) (transl ((i-100)*20) (-50) (-166)) [mesh "robot.mesh.xml"] | i <- [1..200] ])
++ [ mkNode "Root" ("Knot" ++ show i) idMatrix4 [meshMat "knot.mesh.xml" (repeat "Examples/TransparentTest")] | i <- [1..200]::[Int] ])
=<< addResourceLibrary [("General",[(PathDir,mediaPath)])]
-- =<< addConfig "resources.cfg"
=<< mkWorld renderSystem [Stb.loadImage]
(world,worldSink) <- external world'
re1 <- createSignal $ integral 0 $ pure (1.5)-- :: Float)
re2 <- createSignal $ integral 10 $ pure (-1.0)-- :: Float)
re3 <- createSignal $ integral 110 $ pure (0.8)-- :: Float)
time <- createSignal $ stateful 0 (+)
cam <- cameraSignal (-4,0,0) mousePosition fblrPress
s <- fpsState
driveNetwork (drawGLScene worldSink <$> world <*> windowSize <*> mousePosition <*> re1 <*> re2 <*> re3 <*> cam)-- <*> zsin <*> cam)
(readInput s mousePositionSink mousePressSink fblrPressSink)
closeWindow
readInput s mousePos mouseBut fblrPress = do
t <- get GLFW.time
updateFPS s t
GLFW.time $= 0
let Position x0 y0 = baseMousePos
f = (==) Press
Position x y <- get GLFW.mousePos
GLFW.mousePos $= baseMousePos
mousePos (fromIntegral (x-x0),fromIntegral (y-x0))
b <- GLFW.getMouseButton GLFW.ButtonLeft
mouseBut (b == GLFW.Press)
k <- getKey ESC
kw <- getKey UP -- $ CharKey 'w'
ks <- getKey DOWN -- $ CharKey 's'
ka <- getKey LEFT -- $ CharKey 'a'
kd <- getKey RIGHT -- $ CharKey 'd'
turbo <- getKey RSHIFT
--print (ka,kw,ks,kd)
fblrPress (f ka,f kw,f ks,f kd,f turbo)
return (if k == Press then Nothing else Just t)
drawGLScene worldSink world (w,h) (cx,cy) re1 re2 re3 (cam,dir,up,_) {-zsin camMat-} = do
w' <- updateTargetSize "MainWindow" w h
=<< updateTransforms
([ {-("Car", rotY re3 <> scal 0.4 <> transl (cx/w*2-1) (h/w-cy/w*2) zsin)
, -}("Robot", scal 0.1 <> rotY re2 <> transl 3.5 (-5) (-7))
, ("Light1", transl 0 100 200 <> rotX re2)
-- , ("OgreHead", rotX (cy/50) <> rotY (-cx/50) <> transl (-0.5) 0 (-160))
-- , ("OgreHead", rotY re2 <> transl (-0.5) 0 (-160))
-- , ("CameraNode1", rotX (cy/50) <> rotY (-cx/50) <> transl 0 0 (cx/30))--camMat)
, ("CameraEye", scal (1) <> (\(Vec4 x y z _) -> transl x y z) cam)
, ("CameraNode1", lookat cam dir up)
]
++ [ (("Knot" ++ show i),(rotY re3 <> transl ((fromIntegral $ (i`mod`14)-7)*width) (height*(fromIntegral $ i`div`14 -7)) (-166))) | i <- [1..200] ])
world
w <- renderWorld 0 "MainWindow" (flattenScene $ wrScene w') w'
worldSink w
swapBuffers