Merge branch 'iqm' into tessallation

Conflicts:
	src/Render/Render.hs
	src/Types.hs
This commit is contained in:
Stefan Dresselhaus
2014-05-07 09:54:34 +02:00
8 changed files with 420 additions and 13 deletions

View File

@ -132,6 +132,7 @@ main =
}
, _io = IOState
{ _clock = now
, _tessClockFactor = 0
}
, _mouse = MouseState
{ _isDown = False
@ -228,17 +229,30 @@ run = do
}
-}
mt <- liftIO $ do
let double = fromRational.toRational :: (Real a) => a -> Double
(mt,tc,sleepAmount) <- liftIO $ do
let double = fromRational.toRational :: (Real a) => a -> Double
targetFramerate = 40.0
targetFrametime = 1.0/targetFramerate
targetFrametimeμs = targetFrametime * 1000000.0
now <- getCurrentTime
diff <- return $ diffUTCTime now (state ^. io.clock) -- get time-diffs
title <- return $ unwords ["Pioneers @ ",show ((round . double $ 1.0/diff)::Int),"fps"]
let diff = diffUTCTime now (state ^. io.clock) -- get time-diffs
title = unwords ["Pioneers @ ",show ((round . double $ 1.0/diff)::Int),"fps"]
setWindowTitle (env ^. windowObject) title
sleepAmount <- return $ floor (max 0 (0.04 - diff))*1000000 -- get time until next frame in microseconds
threadDelay sleepAmount
return now
let sleepAmount = floor ((targetFrametime - double diff)*1000000) :: Int -- get time until next frame in microseconds
clockFactor = (state ^. io.tessClockFactor)
tessChange
| (clockFactor > (2*targetFrametimeμs)) && (state ^. gl.glMap.stateTessellationFactor < 5) = ((+)1 :: Int -> Int)
-- > factor < 5 & 10% of frame idle -> increase graphics
| sleepAmount < 0 && (state ^. gl.glMap.stateTessellationFactor > 1) = (flip (-) 1 :: Int -> Int)
-- frame used up completely -> decrease
| otherwise = ((+)0 :: Int -> Int) -- 0ms > x > 10% -> keep settings
when (sleepAmount > 0) $ threadDelay sleepAmount
return (now,tessChange,sleepAmount)
-- set state with new clock-time
modify $ io.clock .~ mt
modify $ (io.clock .~ mt)
. (gl.glMap.stateTessellationFactor %~ tc)
. (io.tessClockFactor %~ (((+) (fromIntegral sleepAmount)).((*) 0.99)))
-- liftIO $ putStrLn $ concat $ ["TessFactor at: ",show (state ^. gl.glMap.stateTessellationFactor), " - slept for ",show sleepAmount, "μs."]
shouldClose' <- return $ state ^. window.shouldClose
unless shouldClose' run

View File

@ -288,6 +288,10 @@ renderOverview = do
checkError "draw map"
-}
renderObject :: MapObject -> IO ()
renderObject (MapObject model (L.V3 x y z) _{-state-}) =
undefined
render :: Pioneers ()
render = do
@ -384,6 +388,12 @@ render = do
checkError "draw map"
---- RENDER MAPOBJECTS --------------------------------------------
currentProgram $= Just (state ^. gl.glMap.objectsProgram)
mapM_ renderObject (state ^. gl.glMap.mapObjects)
-- set sample 1 as target in renderbuffer
{-framebufferRenderbuffer
DrawFramebuffer --write-only

View File

@ -8,6 +8,7 @@ import Foreign.C (CFloat)
import qualified Data.HashMap.Strict as Map
import Data.Time (UTCTime)
import Linear.Matrix (M44)
import Linear (V3)
import Control.Monad.RWS.Strict (RWST)
import Control.Lens
import Graphics.Rendering.OpenGL.GL.Texturing.Objects (TextureObject)
@ -51,6 +52,7 @@ data CameraState = CameraState
data IOState = IOState
{ _clock :: !UTCTime
, _tessClockFactor :: !Double
}
data GameState = GameState
@ -120,6 +122,15 @@ data GLMapState = GLMapState
}
data GLObject = GLObject IQM (Coord3D Double)
, _objectsProgram :: !GL.Program
, _mapObjects :: ![MapObject]
}
data MapObject = MapObject !IQM !MapCoordinates !MapObjectState
data MapObjectState = MapObjectState ()
type MapCoordinates = V3 CFloat
data GLHud = GLHud
{ _hudTexture :: !TextureObject -- ^ HUD-Texture itself