Compare commits

...

3 Commits

Author SHA1 Message Date
1ad81d6ae5
scaled map correctly; fixed whacky cam
- scaled map correctly by factor 10
- fixed whacky camera (vorzeichenfehler -.-)
- adapted view-distance
- adapted scroll-speed
- adapted model-position
2014-09-24 01:14:43 +02:00
8630ef951d Merge branch 'master' into tessallation 2014-09-15 15:09:58 +02:00
24e05db27d
objects now use their position and scale.
- objects use their position and scale
- cube hacky nailed down at camera-pos.
- started working on Icons
2014-09-15 15:07:56 +02:00
11 changed files with 187 additions and 92 deletions

View File

@ -96,8 +96,8 @@ float snoise(vec3 v)
float fog(float dist) { float fog(float dist) {
dist = max(0,dist - 50); dist = max(0,dist - 50);
dist = dist * 0.05; dist = dist * 0.005;
// dist = dist*dist; dist = dist*dist;
return 1-exp(-dist); return 1-exp(-dist);
} }

View File

@ -6,7 +6,8 @@ layout(location=2) in vec2 TexCoord;
uniform mat4 ProjectionMatrix; uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix; uniform mat4 ViewMatrix;
uniform mat3 NormalMatrix; uniform mat3 NormalMatrix;
uniform vec3 PositionOffset = vec3(5,2,5); uniform vec3 PositionOffset = vec3(5.0,2.0,5.0);
uniform vec3 Scale = vec3(1.0,1.0,1.0);
uniform float TessLevelInner = 1.0; // controlled by keyboard buttons uniform float TessLevelInner = 1.0; // controlled by keyboard buttons
uniform float TessLevelOuter = 1.0; // controlled by keyboard buttons uniform float TessLevelOuter = 1.0; // controlled by keyboard buttons
@ -16,6 +17,7 @@ out vec3 vNormal;
void main () { void main () {
vPosition = Position; vPosition = Position;
//gl_Position = vec4(Position,1); //gl_Position = vec4(Position,1);
gl_Position = ProjectionMatrix * ViewMatrix * vec4(PositionOffset + Position, 1); // component-wise
gl_Position = ProjectionMatrix * ViewMatrix * vec4(PositionOffset + (Scale * Position), 1);
vNormal = Normal; vNormal = Normal;
} }

40
src/Icons/GUIQuad.hs Normal file
View File

@ -0,0 +1,40 @@
module Icons.GUIQuad (GUIQuad(..), Icon(..), marshalIcon) where
import Data.Word (Word8)
type Coord = (Float, Float)
type ZIndex = Float
data GUIQuad = GUIQuad Coord Coord ZIndex Icon
data Icon =
Woodcutter
| Stonemason
--
| CloseButton
| NextButton
| PreviousButton
numIcons :: Int
numIcons = 32
sizeIcon :: Float
sizeIcon = 1.0/(fromIntegral numIcons)
iconToTex :: Icon -> Coord
iconToTex i =
(x,y)
where
x = (fromIntegral (num `mod` numIcons)) * sizeIcon
y = (fromIntegral (num `div` numIcons)) * sizeIcon
num = fromIntegral.marshalIcon $ i
marshalIcon :: Icon -> Word8
marshalIcon a = case a of
Woodcutter -> 0
Stonemason -> 1
--
CloseButton -> 32
NextButton -> 33
PreviousButton -> 34

View File

@ -117,7 +117,7 @@ main = do
let camStack' = Map.empty let camStack' = Map.empty
glHud' <- initHud glHud' <- initHud
let zDistClosest' = 2 let zDistClosest' = 2
zDistFarthest' = zDistClosest' + 10 zDistFarthest' = zDistClosest' + 100
--TODO: Move near/far/fov to state for runtime-changability & central storage --TODO: Move near/far/fov to state for runtime-changability & central storage
aks = ArrowKeyState { aks = ArrowKeyState {
_up = False _up = False
@ -190,12 +190,13 @@ run = do
cam <- readTVar (state ^. camera) cam <- readTVar (state ^. camera)
game' <- readTVar (state ^. game) game' <- readTVar (state ^. game)
let let
scrollFactor = 1
multc = cos $ cam ^. yAngle multc = cos $ cam ^. yAngle
mults = sin $ cam ^. yAngle mults = sin $ cam ^. yAngle
modx x' = x' - 0.2 * kxrot * multc modx x' = x' - kxrot * multc * scrollFactor
- 0.2 * kyrot * mults - kyrot * mults * scrollFactor
mody y' = y' + 0.2 * kxrot * mults mody y' = y' + kxrot * mults * scrollFactor
- 0.2 * kyrot * multc - kyrot * multc * scrollFactor
cam' <- return $ camObject %~ (\c -> moveBy c (\(x,y) -> (modx x,mody y)) (game' ^. currentMap)) $ cam cam' <- return $ camObject %~ (\c -> moveBy c (\(x,y) -> (modx x,mody y)) (game' ^. currentMap)) $ cam
writeTVar (state ^. camera) cam' writeTVar (state ^. camera) cam'
@ -232,7 +233,7 @@ run = do
now' <- getCurrentTime now' <- getCurrentTime
return (now',tessChange,sleepAmount,ddiff,hasChanged) return (now',tessChange,sleepAmount,ddiff,hasChanged)
-- set state with new clock-time -- set state with new clock-time
--liftIO $ putStrLn $ unwords ["clockFactor:",show (state ^. io.tessClockFactor),"\ttc:", show (tc (state ^. gl.glMap.stateTessellationFactor)),"\tsleep ",show frameTime,"ms"] --liftIO $ putStrLn $ unwords ["clockFactor:",show (state ^. io.tessClockFactor),"\ttc:", show (tc (state ^. gl.glMap.stateTessellationFactor)),"\tframe took ",show frameTime,"ms"]
if hC then if hC then
do do
liftIO $ putStrLn $ unwords ["modifying TessFactor to",show $ tc $ state ^. gl.glMap.stateTessellationFactor] liftIO $ putStrLn $ unwords ["modifying TessFactor to",show $ tc $ state ^. gl.glMap.stateTessellationFactor]
@ -273,7 +274,7 @@ adjustWindow = do
fbHeight = state ^. window.height fbHeight = state ^. window.height
fov = 90 --field of view fov = 90 --field of view
near = 1 --near plane near = 1 --near plane
far = 100 --far plane far = 500 --far plane
ratio = fromIntegral fbWidth / fromIntegral fbHeight ratio = fromIntegral fbWidth / fromIntegral fbHeight
frust = createFrustum fov near far ratio frust = createFrustum fov near far ratio
liftIO $ glViewport 0 0 (fromIntegral fbWidth) (fromIntegral fbHeight) liftIO $ glViewport 0 0 (fromIntegral fbWidth) (fromIntegral fbHeight)

View File

@ -7,7 +7,8 @@ fgColorIndex,
fgNormalIndex, fgNormalIndex,
fgVertexIndex, fgVertexIndex,
mapStride, mapStride,
getMapBufferObject getMapBufferObject,
unitLength
) )
where where
@ -39,6 +40,10 @@ type MapEntry = (
) )
type GraphicsMap = Array (Int, Int) MapEntry type GraphicsMap = Array (Int, Int) MapEntry
-- | length of 1 Unit in World-Coordinates
unitLength :: Double
unitLength = 10.0
-- converts from classical x/z to striped version of a map -- converts from classical x/z to striped version of a map
convertToStripeMap :: PlayMap -> PlayMap convertToStripeMap :: PlayMap -> PlayMap
convertToStripeMap mp = array (stripify l, stripify u) (map (stripify *** strp) (assocs mp)) convertToStripeMap mp = array (stripify l, stripify u) (map (stripify *** strp) (assocs mp))
@ -205,6 +210,8 @@ colorLookup hs t = if inRange (bounds hs) t then c else (0.0, 0.0, 0.0)
coordLookup :: (Int,Int) -> GLfloat -> V3 GLfloat coordLookup :: (Int,Int) -> GLfloat -> V3 GLfloat
coordLookup (x,z) y = coordLookup (x,z) y =
if even x then if even x then
V3 (fromIntegral $ x `div` 2) y (fromIntegral (2 * z) * lineHeight) (f unitLength) *^ V3 (fromIntegral $ x `div` 2) y (fromIntegral (2 * z) * lineHeight)
else else
V3 (fromIntegral (x `div` 2) + 0.5) y (fromIntegral (2 * z + 1) * lineHeight) (f unitLength) *^ V3 (fromIntegral (x `div` 2) + 0.5) y (fromIntegral (2 * z + 1) * lineHeight)
where
f = fromRational.toRational

View File

@ -1,6 +1,7 @@
module Map.Map where module Map.Map where
import Map.Types import Map.Types
import Map.Graphics (unitLength)
import Data.Array (bounds, (!)) import Data.Array (bounds, (!))
import Data.List (sort, group) import Data.List (sort, group)
@ -44,21 +45,23 @@ giveMapHeight :: PlayMap
-> (Double, Double) -> (Double, Double)
-> Double -> Double
giveMapHeight mop (x, z) giveMapHeight mop (x, z)
| outsideMap (x,z') = 0.0 | outsideMap (x/unitLength,z'/unitLength) = 0.0
| otherwise = height --sum $ map (\(p,d) -> hlu p * (d / totald)) tups | otherwise = height' --sum $ map (\(p,d) -> hlu p * (d / totald)) tups
where where
z' = z * 2/ sqrt 3 z' = z * 2/ sqrt 3
rx = x - (fromIntegral $ floor (x +0.5)) rx = (x/unitLength) - (fromIntegral $ floor (x/unitLength ))
rz = z' - (fromIntegral $ floor (z'+0.5)) rz = (z'/unitLength) - (fromIntegral $ floor (z'/unitLength))
hoi = map (hlu . clmp . tadd (floor x, floor z')) mods hoi = map (hlu . clmp . tadd (floor (x/unitLength), floor (z'/unitLength))) mods
where where
mods = [(0,0),(0,1),(1,0),(1,1)] mods = [(0,0),(0,1),(1,0),(1,1)]
tadd (a,b) (c,d) = (a+c,b+d) tadd (a,b) (c,d) = (a+c,b+d)
height' = height*unitLength
height = --trace (show [rx,rz] ++ show hoi) height = --trace (show [rx,rz] ++ show hoi)
rz * (rx * (hoi !! 0) + (1-rx) * (hoi !! 2)) (1-rz) * ((1-rx) * (hoi !! 0) + rx * (hoi !! 2))
+ (1-rz) * (rx * (hoi !! 1) + (1-rx) * (hoi !! 3)) + rz * ((1-rx) * (hoi !! 1) + rx * (hoi !! 3))
outsideMap :: (Double, Double) -> Bool outsideMap :: (Double, Double) -> Bool
outsideMap (mx, mz) = let ((a,b),(c,d)) = bounds mop outsideMap (mx, mz) = let ((a,b),(c,d)) = bounds mop

View File

@ -68,13 +68,14 @@ createProgramUsing shaders = do
createFrustum :: Float -> Float -> Float -> Float -> M44 CFloat createFrustum :: Float -> Float -> Float -> Float -> M44 CFloat
createFrustum fov n' f' rat = createFrustum fov n' f' rat =
let let
f = realToFrac f' ff = fromRational.toRational
n = realToFrac n' f = ff f'
s = realToFrac $ recip (tan $ fov*0.5 * pi / 180) n = ff n'
s = ff $ recip (tan $ fov*0.5 * pi / 180)
(ratw,rath) = if rat > 1 then (ratw,rath) = if rat > 1 then
(1,1/realToFrac rat) (1,1/ff rat)
else else
(realToFrac rat,1) (ff rat,1)
in in
V4 (V4 (s/ratw) 0 0 0) V4 (V4 (s/ratw) 0 0 0)
(V4 0 (s/rath) 0 0) (V4 0 (s/rath) 0 0)

View File

@ -9,9 +9,9 @@ import Graphics.Rendering.OpenGL.Raw.Core31
import Graphics.Rendering.OpenGL.Raw.ARB.TessellationShader import Graphics.Rendering.OpenGL.Raw.ARB.TessellationShader
import Graphics.GLUtil.BufferObjects import Graphics.GLUtil.BufferObjects
import qualified Linear as L import qualified Linear as L
import Control.Lens ((^.)) import Control.Lens ((^.),(%~))
import Control.Monad.RWS.Strict (liftIO) import Control.Monad.RWS.Strict (liftIO)
import qualified Control.Monad.RWS.Strict as RWS (get) import qualified Control.Monad.RWS.Strict as RWS (get,modify)
import Control.Concurrent.STM (readTVarIO) import Control.Concurrent.STM (readTVarIO)
import Data.Distributive (distribute, collect) import Data.Distributive (distribute, collect)
-- FFI -- FFI
@ -166,6 +166,12 @@ initMapShader tessFac (buf, vertDes) = do
normalMatrixIndex' <- get (uniformLocation objProgram "NormalMatrix") normalMatrixIndex' <- get (uniformLocation objProgram "NormalMatrix")
checkError "normalMat" checkError "normalMat"
positionOffsetIndex' <- get (uniformLocation objProgram "PositionOffset")
checkError "PositionOffset"
scaleIndex' <- get (uniformLocation objProgram "Scale")
checkError "Scale"
--tessLevelInner' <- get (uniformLocation objProgram "TessLevelInner") --tessLevelInner' <- get (uniformLocation objProgram "TessLevelInner")
--checkError "TessLevelInner" --checkError "TessLevelInner"
@ -182,7 +188,10 @@ initMapShader tessFac (buf, vertDes) = do
putStrLn $ unlines $ ["Model-Indices: ", show (texIndex', normalIndex', vertexIndex')] putStrLn $ unlines $ ["Model-Indices: ", show (texIndex', normalIndex', vertexIndex')]
testobj <- parseIQM "models/holzfaellerHaus1.iqm" testobj <- parseIQM "models/holzfaellerHaus1.iqm"
let objs = [MapObject testobj (L.V3 0 10 0) (MapObjectState ())] cube <- parseIQM "models/box.iqm"
let objs = [ MapObject testobj (L.V3 20 10 20) (MapObjectState ())
, MapObject cube (L.V3 25 5 25) (MapObjectState ())
]
currentProgram $= Nothing currentProgram $= Nothing
@ -208,6 +217,8 @@ initMapShader tessFac (buf, vertDes) = do
, shdrMOViewMatIndex = viewMatrixIndex' , shdrMOViewMatIndex = viewMatrixIndex'
, shdrMOModelMatIndex = modelMatrixIndex' , shdrMOModelMatIndex = modelMatrixIndex'
, shdrMONormalMatIndex = normalMatrixIndex' , shdrMONormalMatIndex = normalMatrixIndex'
, shdrMOPositionOffsetIndex = positionOffsetIndex'
, shdrMOScaleIndex = scaleIndex'
, shdrMOTessInnerIndex = UniformLocation 0 --tessLevelInner' , shdrMOTessInnerIndex = UniformLocation 0 --tessLevelInner'
, shdrMOTessOuterIndex = UniformLocation 0 --tessLevelOuter' , shdrMOTessOuterIndex = UniformLocation 0 --tessLevelOuter'
} }
@ -285,10 +296,18 @@ initRendering = do
-- | renders an IQM-Model at Position with scaling -- | renders an IQM-Model at Position with scaling
renderIQM :: IQM -> L.V3 CFloat -> L.V3 CFloat -> IO () renderIQM :: IQM -> L.V3 CFloat -> L.V3 CFloat -> Pioneers ()
renderIQM m p@(L.V3 x y z) s@(L.V3 sx sy sz) = do renderIQM m (L.V3 x y z) (L.V3 sx sy sz) = do
state <- RWS.get
let
dmo = state ^. gl.glMap.mapObjectShaderData
po = shdrMOPositionOffsetIndex dmo
so = shdrMOScaleIndex dmo
liftIO $ do
withVAO (vertexArrayObject m) $ do withVAO (vertexArrayObject m) $ do
withVAA [(AttribLocation 0),(AttribLocation 1)] $ do withVAA [(AttribLocation 0),(AttribLocation 1)] $ do
uniform po $= Vertex3 x y z
uniform so $= Vertex3 sx sy sz
checkError "setting array to enabled" checkError "setting array to enabled"
bindBuffer ElementArrayBuffer $= Just (triangleBufferObject m) bindBuffer ElementArrayBuffer $= Just (triangleBufferObject m)
checkError "bindBuffer" checkError "bindBuffer"
@ -300,8 +319,8 @@ renderIQM m p@(L.V3 x y z) s@(L.V3 sx sy sz) = do
checkError "unbind buffer" checkError "unbind buffer"
return () return ()
renderObject :: MapObject -> IO () renderObject :: MapObject -> Pioneers ()
renderObject (MapObject model pos@(L.V3 x y z) _{-state-}) = renderObject (MapObject model pos _{-state-}) =
renderIQM model pos (L.V3 1 1 1) renderIQM model pos (L.V3 1 1 1)
drawMap :: Pioneers () drawMap :: Pioneers ()
@ -343,6 +362,7 @@ drawMap = do
(ColorAttachment 1) --sample 1 (ColorAttachment 1) --sample 1
Renderbuffer --const Renderbuffer --const
rb --buffer-} rb --buffer-}
mat44ToGPU :: L.M44 CFloat -> UniformLocation -> String -> IO () mat44ToGPU :: L.M44 CFloat -> UniformLocation -> String -> IO ()
mat44ToGPU mat (UniformLocation dest) name = do mat44ToGPU mat (UniformLocation dest) name = do
with (distribute mat) $ \ptr -> with (distribute mat) $ \ptr ->
@ -386,6 +406,14 @@ render = do
(Just a) -> a (Just a) -> a
Nothing -> L.eye3) :: L.M33 CFloat Nothing -> L.eye3) :: L.M33 CFloat
nmap = collect id normal' :: L.M33 CFloat --transpose... nmap = collect id normal' :: L.M33 CFloat --transpose...
camTarget = getCamTarget camPos
moveTo :: L.V3 CFloat -> MapObject -> MapObject
moveTo p (MapObject o _ s) = MapObject o p s
-- TODO: remove hack for Target
RWS.modify $ gl.glMap.mapObjects %~ (\objs ->
head objs : [moveTo camTarget $ objs !! 1])
liftIO $ do liftIO $ do
@ -500,6 +528,7 @@ render = do
mat33ToGPU nmap nmatmo "mapObjects-nmat" mat33ToGPU nmap nmatmo "mapObjects-nmat"
mapM_ renderObject (state ^. gl.glMap.mapObjects) mapM_ renderObject (state ^. gl.glMap.mapObjects)
liftIO $ do
checkError "draw mapobjects" checkError "draw mapobjects"
---- COMPOSE RENDERING -------------------------------------------- ---- COMPOSE RENDERING --------------------------------------------

View File

@ -24,6 +24,8 @@ class GLCamera a where
moveBy :: a -> (Position -> Position) -> PlayMap -> a moveBy :: a -> (Position -> Position) -> PlayMap -> a
-- | Moves the Camera-Target to an absoloute position -- | Moves the Camera-Target to an absoloute position
move :: a -> Position -> PlayMap -> a move :: a -> Position -> PlayMap -> a
-- | Gets the target point of a camera
getCamTarget :: a -> V3 CFloat
-- | Alias for a camera-position onto the 2d-plane it moves on -- | Alias for a camera-position onto the 2d-plane it moves on
type Position = (Double, Double) type Position = (Double, Double)
@ -88,6 +90,14 @@ instance GLCamera Camera where
(x,z) = f (x', z') (x,z) = f (x', z')
y = giveMapHeight map (x,z) y = giveMapHeight map (x,z)
move c (x', z') map = moveBy c (\(x,z) -> (x+x',z+z')) map move c (x', z') map = moveBy c (\(x,z) -> (x+x',z+z')) map
getCamTarget (Flat (x',z') y') =
V3 x y z
where
x = realToFrac x'
y = realToFrac y'
z = realToFrac z'
getCamTarget (Sphere (inc', az') r') =
undefined
-- | converting spherical to cartesian coordinates -- | converting spherical to cartesian coordinates
sphereToCart :: (Floating a) => a -> a -> a -> V3 a sphereToCart :: (Floating a) => a -> a -> a -> V3 a

View File

@ -9,7 +9,7 @@ import qualified Data.HashMap.Strict as Map
import Data.Time (UTCTime) import Data.Time (UTCTime)
import Linear.Matrix (M44) import Linear.Matrix (M44)
import Linear (V3) import Linear (V3)
import Control.Monad.RWS.Strict (RWST, liftIO, get) import Control.Monad.RWS.Strict (RWST, get)
import Control.Monad.Writer.Strict import Control.Monad.Writer.Strict
--import Control.Monad (when) --import Control.Monad (when)
import Control.Lens import Control.Lens
@ -131,6 +131,8 @@ data MapObjectShaderData = MapObjectShaderData
, shdrMOViewMatIndex :: !GL.UniformLocation , shdrMOViewMatIndex :: !GL.UniformLocation
, shdrMOModelMatIndex :: !GL.UniformLocation , shdrMOModelMatIndex :: !GL.UniformLocation
, shdrMONormalMatIndex :: !GL.UniformLocation , shdrMONormalMatIndex :: !GL.UniformLocation
, shdrMOPositionOffsetIndex :: !GL.UniformLocation
, shdrMOScaleIndex :: !GL.UniformLocation
, shdrMOTessInnerIndex :: !GL.UniformLocation , shdrMOTessInnerIndex :: !GL.UniformLocation
, shdrMOTessOuterIndex :: !GL.UniformLocation , shdrMOTessOuterIndex :: !GL.UniformLocation
} }

View File

@ -123,7 +123,7 @@ eventCallback e = do
state <- get state <- get
liftIO $ atomically $ do liftIO $ atomically $ do
cam <- readTVar (state ^. camera) cam <- readTVar (state ^. camera)
let zDist' = (cam ^. zDist) + realToFrac (negate vscroll) let zDist' = (cam ^. zDist) + 4*realToFrac (negate vscroll)
zDist'' = curb (env ^. zDistClosest) (env ^. zDistFarthest) zDist' zDist'' = curb (env ^. zDistClosest) (env ^. zDistFarthest) zDist'
cam' <- return $ zDist .~ zDist'' $ cam cam' <- return $ zDist .~ zDist'' $ cam
writeTVar (state ^. camera) cam' writeTVar (state ^. camera) cam'