import Data.Maybe import Data.Map import qualified Data.List as List 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 main = do updateGlobalLogger rootLoggerName (setLevel DEBUG) initialize openWindow (Size 640 480) [DisplayRGBBits 8 8 8, DisplayAlphaBits 8, DisplayDepthBits 24] Window windowTitle $= "LambdaCube Engine Camera Track Example" initGL 640 480 (windowSize,windowSizeSink) <- external (0,0) windowSizeCallback $= resizeGLScene windowSizeSink let curve kfl t = (fx + t' * dx, fy + t' * dy, fz + t' * dz) where t'' = len * (snd $ properFraction $ (realToFrac t) / len) t' = t'' - ft (al,bl) = List.span (\(a,_)-> a <= t'') kfl (ft,(fx,fy,fz)) = last al (gt,(gx,gy,gz)) = head bl dt = gt - ft dx = (gx-fx) / dt dy = (gy-fy) / dt dz = (gz-fz) / dt len = fst $ last kfl idMatrix4 = transl 0 0 0 track = [ (0, (-100 , 100 , 100)) , (2.5, (-300 ,-10 ,-200)) , (5, ( 500 , 700 ,-500)) , (7.5, ( 200 ,-10 , 400)) , (10, (-100 , 100 , 100)) ] mediaPath <- getDataFileName "media" renderSystem <- mkGLRenderSystem world' <- addRenderWindow "MainWindow" 640 480 [mkViewport 0 0 1 1 "Camera1" []] =<< addScene [ mkNode "Root" "OgreHead" idMatrix4 [mesh "ogrehead.mesh.xml"] , mkNode "Root" "Light1" (transl 5 5 10) [light{-,mesh "Cube.mesh.xml"-}] , mkNode "Root" "Light2" (transl (-5) 15 10) [light{-,mesh "Cube.mesh.xml"-}] , mkNode "Root" "CameraNode1" idMatrix4 [simpleCamera "Camera1"] -- , mkNode "Root" "GroundNode1" (scal 7000 <> transl 0 (-70) 0) [meshMat "Ground.mesh.xml" ["Examples/RustySteel"]] , mkNode "Root" "GroundNode1" (scal 7000 <> transl 0 (-70) 0) [meshMat "Ground.mesh.xml" ["MyAnimMaterial"]] , mkNode "Root" "SkyBoxNode1" (scal 1000) [mesh "Box.mesh.xml"] ] =<< addResourceLibrary [("General",[(PathDir,mediaPath)])] -- =<< addConfig "resources.cfg" =<< mkWorld renderSystem [Stb.loadImage] (world,worldSink) <- external world' time <- createSignal $ stateful 0 (+) let anim = curve track <$> time s <- fpsState driveNetwork (drawGLScene worldSink <$> world <*> windowSize <*> anim <*> time) (readInput s) closeWindow readInput s = do t <- get GLFW.time updateFPS s t GLFW.time $= 0 k <- getKey ESC return (if k == Press then Nothing else Just t) drawGLScene worldSink world (w,h) (x,y,z) time = do w' <- updateTargetSize "MainWindow" w h =<< updateTransforms [("CameraNode1", lookat (Vec4 x y z 0) (Vec4 x y z 0) (Vec4 0 1 0 0))] world w <- renderWorld (realToFrac time) "MainWindow" (flattenScene $ wrScene w') w' worldSink w swapBuffers