diff --git a/src/Main.hs b/src/Main.hs index a361524..e00587e 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -82,9 +82,7 @@ main = (Size fbWidth fbHeight) <- glGetDrawableSize window' initRendering --generate map vertices - (mapBuffer, vert) <- getMapBufferObject - (mapprog, ci, ni, vi, pri, vii, mi, nmi, tli, tlo, mapTex) <- initMapShader - overTex <- GL.genObjectName + glMap' <- initMapShader 4 =<< getMapBufferObject print window' eventQueue <- newTQueueIO :: IO (TQueue Event) putStrLn "foo" @@ -109,23 +107,6 @@ main = , _left = False , _right = False } - glMap' = GLMapState - { _shdrVertexIndex = vi - , _shdrNormalIndex = ni - , _shdrColorIndex = ci - , _shdrProjMatIndex = pri - , _shdrViewMatIndex = vii - , _shdrModelMatIndex = mi - , _shdrNormalMatIndex = nmi - , _shdrTessInnerIndex = tli - , _shdrTessOuterIndex = tlo - , _stateTessellationFactor = 4 - , _stateMap = mapBuffer - , _mapVert = vert - , _mapProgram = mapprog - , _mapTexture = mapTex - , _overviewTexture = overTex - } env = Env { _eventsChan = eventQueue , _windowObject = window' @@ -302,7 +283,7 @@ adjustWindow = do let hudtexid = state ^. gl.glHud.hudTexture - maptexid = state ^. gl.glMap.mapTexture + maptexid = state ^. gl.glMap.renderedMapTexture allocaBytes (fbWidth*fbHeight*4) $ \ptr -> do --default to ugly pink to see if --somethings go wrong. diff --git a/src/Render/Render.hs b/src/Render/Render.hs index 66702aa..6b3e4d3 100644 --- a/src/Render/Render.hs +++ b/src/Render/Render.hs @@ -50,22 +50,11 @@ initBuffer varray = checkError "initBuffer" return bufferObject -initMapShader :: IO ( - Program -- the GLSL-Program - , AttribLocation -- color - , AttribLocation -- normal - , AttribLocation -- vertex - , UniformLocation -- ProjectionMat - , UniformLocation -- ViewMat - , UniformLocation -- ModelMat - , UniformLocation -- NormalMat - , UniformLocation -- TessLevelInner - , UniformLocation -- TessLevelOuter - , TextureObject -- Texture where to draw into - ) -- ^ (the GLSL-Program, color, normal, vertex, ProjectionMat, ViewMat, - -- ModelMat, NormalMat, TessLevelInner, TessLevelOuter, - -- Texture where to draw into) -initMapShader = do +initMapShader :: + Int -- ^ initial Tessallation-Factor + -> (BufferObject,NumArrayIndices) -- ^ Buffer with Data and DataDescriptor + -> IO GLMapState +initMapShader tessFac (buf, vertDes) = do ! vertexSource <- B.readFile mapVertexShaderFile ! tessControlSource <- B.readFile mapTessControlShaderFile ! tessEvalSource <- B.readFile mapTessEvalShaderFile @@ -120,9 +109,30 @@ initMapShader = do putStrLn $ unlines $ ["Indices: ", show (colorIndex, normalIndex, vertexIndex)] tex <- genObjectName + overTex <- genObjectName + + texts <- genObjectNames 6 + checkError "initShader" - return (program, colorIndex, normalIndex, vertexIndex, projectionMatrixIndex, viewMatrixIndex, modelMatrixIndex, normalMatrixIndex, tessLevelInner, tessLevelOuter, tex) + return GLMapState + { _mapProgram = program + , _shdrColorIndex = colorIndex + , _shdrNormalIndex = normalIndex + , _shdrVertexIndex = vertexIndex + , _shdrProjMatIndex = projectionMatrixIndex + , _shdrViewMatIndex = viewMatrixIndex + , _shdrModelMatIndex = modelMatrixIndex + , _shdrNormalMatIndex = normalMatrixIndex + , _shdrTessInnerIndex = tessLevelInner + , _shdrTessOuterIndex = tessLevelOuter + , _renderedMapTexture = tex + , _stateTessellationFactor = tessFac + , _stateMap = buf + , _mapVert = vertDes + , _overviewTexture = overTex + , _mapTextures = texts + } initHud :: IO GLHud initHud = do @@ -193,13 +203,13 @@ renderOverview = do DepthAttachment Renderbuffer (state ^. gl.glRenderbuffer) - textureBinding Texture2D $= Just (state ^. gl.glMap.mapTexture) + textureBinding Texture2D $= Just (state ^. gl.glMap.renderedMapTexture) framebufferTexture2D Framebuffer (ColorAttachment 0) Texture2D - (state ^. gl.glMap.mapTexture) + (state ^. gl.glMap.renderedMapTexture) 0 -- Render to FrameBufferObject @@ -285,13 +295,13 @@ render = do DepthAttachment Renderbuffer (state ^. gl.glRenderbuffer) - textureBinding Texture2D $= Just (state ^. gl.glMap.mapTexture) + textureBinding Texture2D $= Just (state ^. gl.glMap.renderedMapTexture) framebufferTexture2D Framebuffer (ColorAttachment 0) Texture2D - (state ^. gl.glMap.mapTexture) + (state ^. gl.glMap.renderedMapTexture) 0 -- Render to FrameBufferObject @@ -371,7 +381,7 @@ render = do uniform (hud ^. hudTexIndex) $= Index1 (0::GLint) activeTexture $= TextureUnit 1 - textureBinding Texture2D $= Just (state ^. gl.glMap.mapTexture) + textureBinding Texture2D $= Just (state ^. gl.glMap.renderedMapTexture) uniform (hud ^. hudBackIndex) $= Index1 (1::GLint) bindBuffer ArrayBuffer $= Just (hud ^. hudVBO) diff --git a/src/Types.hs b/src/Types.hs index 64e7f17..22329f8 100644 --- a/src/Types.hs +++ b/src/Types.hs @@ -74,6 +74,26 @@ data KeyboardState = KeyboardState { _arrowsPressed :: !ArrowKeyState } +-- | State in which all map-related Data is stored +-- +-- The map itself is rendered with mapProgram and the shaders given here directly +-- This does not include any objects on the map - only the map itself +-- +-- _mapTextures must contain the following Textures (in this ordering) after initialisation: +-- +-- 1. Grass +-- +-- 2. Sand +-- +-- 3. Water +-- +-- 4. Stone +-- +-- 5. Snow +-- +-- 6. Dirt (blended on grass) + + data GLMapState = GLMapState { _shdrVertexIndex :: !GL.AttribLocation , _shdrColorIndex :: !GL.AttribLocation @@ -88,8 +108,9 @@ data GLMapState = GLMapState , _stateMap :: !GL.BufferObject , _mapVert :: !GL.NumArrayIndices , _mapProgram :: !GL.Program - , _mapTexture :: !TextureObject + , _renderedMapTexture :: !TextureObject --TODO: Probably move to UI? , _overviewTexture :: !TextureObject + , _mapTextures :: ![TextureObject] --TODO: Fix size on list? } data GLHud = GLHud