TRIANGLEEEEESS!!!!11!!
finally.
This commit is contained in:
		| @@ -9,5 +9,5 @@ out vec4 fg_FragColor; | |||||||
| void main(void) | void main(void) | ||||||
| { | { | ||||||
| //copy-shader | //copy-shader | ||||||
|    fg_FragColor = vec4(0.5,0.5,0.5,1.0);//fg_SmoothColor; |    fg_FragColor = fg_SmoothColor; | ||||||
| } | } | ||||||
| @@ -2,19 +2,21 @@ | |||||||
|  |  | ||||||
| //constant projection matrix | //constant projection matrix | ||||||
| uniform mat4 fg_ProjectionMatrix; | uniform mat4 fg_ProjectionMatrix; | ||||||
|  | uniform mat4 fg_ModelMatrix; | ||||||
|  |  | ||||||
| //vertex-data | //vertex-data | ||||||
| //in vec4 fg_Color; | in vec4 fg_Color; | ||||||
| in vec3 fg_VertexIn; | in vec3 fg_VertexIn; | ||||||
| //in vec3 fg_Normal; | //in vec3 fg_Normal; | ||||||
|  |  | ||||||
| //output-data for later stages | //output-data for later stages | ||||||
| //smooth out vec4 fg_SmoothColor; | smooth out vec4 fg_SmoothColor; | ||||||
|  |  | ||||||
| void main() | void main() | ||||||
| { | { | ||||||
|    //transform vec3 into vec4, setting w to 1 |    //transform vec3 into vec4, setting w to 1 | ||||||
|    vec4 fg_Vertex = vec4(fg_VertexIn, 1.0); |    vec4 fg_Vertex = vec4(fg_VertexIn, 1.0); | ||||||
|    //fg_SmoothColor = fg_Color + 0.001* fg_Normal.xyzx; |    fg_SmoothColor = fg_Color; | ||||||
|    gl_Position = fg_ProjectionMatrix * fg_Vertex; |                     // + 0.001* fg_Normal.xyzx; | ||||||
|  |    gl_Position = fg_ProjectionMatrix * fg_ModelMatrix * fg_Vertex; | ||||||
| } | } | ||||||
							
								
								
									
										22
									
								
								src/Main.hs
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/Main.hs
									
									
									
									
									
								
							| @@ -47,7 +47,9 @@ data State = State | |||||||
|     -- pointer to bindings for locations inside the compiled shader |     -- pointer to bindings for locations inside the compiled shader | ||||||
|     -- mutable because shaders may be changed in the future. |     -- mutable because shaders may be changed in the future. | ||||||
|     , shdrVertexIndex      :: !GL.AttribLocation |     , shdrVertexIndex      :: !GL.AttribLocation | ||||||
|  |     , shdrColorIndex       :: !GL.AttribLocation | ||||||
|     , shdrProjMatIndex     :: !GL.UniformLocation |     , shdrProjMatIndex     :: !GL.UniformLocation | ||||||
|  |     , shdrModelMatIndex    :: !GL.UniformLocation | ||||||
|     -- the map |     -- the map | ||||||
|     , stateMap             :: !GL.BufferObject |     , stateMap             :: !GL.BufferObject | ||||||
|     , mapVert              :: !GL.NumArrayIndices |     , mapVert              :: !GL.NumArrayIndices | ||||||
| @@ -105,7 +107,7 @@ main = do | |||||||
|  |  | ||||||
|         --generate map vertices |         --generate map vertices | ||||||
|         (mapBuffer, vert) <- getMapBufferObject |         (mapBuffer, vert) <- getMapBufferObject | ||||||
|         (vi, pi) <- initShader |         (ci, vi, pi, mi) <- initShader | ||||||
|  |  | ||||||
|         let zDistClosest  = 10 |         let zDistClosest  = 10 | ||||||
|             zDistFarthest = zDistClosest + 20 |             zDistFarthest = zDistClosest + 20 | ||||||
| @@ -135,7 +137,9 @@ main = do | |||||||
|               , stateDragStartXAngle = 0 |               , stateDragStartXAngle = 0 | ||||||
|               , stateDragStartYAngle = 0 |               , stateDragStartYAngle = 0 | ||||||
|               , shdrVertexIndex      = vi |               , shdrVertexIndex      = vi | ||||||
|  |               , shdrColorIndex       = ci | ||||||
|               , shdrProjMatIndex     = pi |               , shdrProjMatIndex     = pi | ||||||
|  |               , shdrModelMatIndex    = mi | ||||||
|               , stateMap             = mapBuffer |               , stateMap             = mapBuffer | ||||||
|               , mapVert              = vert |               , mapVert              = vert | ||||||
|               , stateFrustum         = frust |               , stateFrustum         = frust | ||||||
| @@ -222,6 +226,7 @@ run = do | |||||||
|     processEvents |     processEvents | ||||||
|  |  | ||||||
|     -- update State |     -- update State | ||||||
|  |     {- | ||||||
|     state <- get |     state <- get | ||||||
|     if stateDragging state |     if stateDragging state | ||||||
|       then do |       then do | ||||||
| @@ -243,6 +248,7 @@ run = do | |||||||
|             { stateXAngle = stateXAngle state + (2 * kxrot) + (2 * jxrot) |             { stateXAngle = stateXAngle state + (2 * kxrot) + (2 * jxrot) | ||||||
|             , stateYAngle = stateYAngle state + (2 * kyrot) + (2 * jyrot) |             , stateYAngle = stateYAngle state + (2 * kyrot) + (2 * jyrot) | ||||||
|             } |             } | ||||||
|  |     -} | ||||||
|     {- |     {- | ||||||
|     --modify the state with all that happened in mt time.  |     --modify the state with all that happened in mt time.  | ||||||
|     mt <- liftIO GLFW.getTime |     mt <- liftIO GLFW.getTime | ||||||
| @@ -373,12 +379,16 @@ draw = do | |||||||
|     let xa = stateXAngle state |     let xa = stateXAngle state | ||||||
|         ya = stateYAngle state |         ya = stateYAngle state | ||||||
|         za = stateZAngle state |         za = stateZAngle state | ||||||
|         (GL.UniformLocation proj) = shdrProjMatIndex state |         (GL.UniformLocation proj)  = shdrProjMatIndex state | ||||||
|  |         (GL.UniformLocation mmat)  = shdrModelMatIndex state | ||||||
|         vi = shdrVertexIndex state |         vi = shdrVertexIndex state | ||||||
|  |         ci = shdrColorIndex state | ||||||
|         numVert = mapVert state |         numVert = mapVert state | ||||||
|         map' = stateMap state |         map' = stateMap state | ||||||
|         frust = stateFrustum state |         frust = stateFrustum state | ||||||
|     liftIO $ do |     liftIO $ do | ||||||
|  |         --(vi,GL.UniformLocation proj) <- initShader | ||||||
|  |         GL.clearColor GL.$= GL.Color4 0.5 0.1 1 1 | ||||||
|         GL.clear [GL.ColorBuffer] |         GL.clear [GL.ColorBuffer] | ||||||
|         let fov = 90 |         let fov = 90 | ||||||
|             s = recip (tan $ fov * 0.5 * pi / 180) |             s = recip (tan $ fov * 0.5 * pi / 180) | ||||||
| @@ -391,7 +401,15 @@ draw = do | |||||||
|                                       , 0, 0, -((f*n)/(f-n)), 0 |                                       , 0, 0, -((f*n)/(f-n)), 0 | ||||||
|                                       ] |                                       ] | ||||||
|         V.unsafeWith perspective $ \ptr -> GL.glUniformMatrix4fv proj 1 0 ptr |         V.unsafeWith perspective $ \ptr -> GL.glUniformMatrix4fv proj 1 0 ptr | ||||||
|  |         let model = V.fromList [ | ||||||
|  |                                         1,  0, 0, 0 | ||||||
|  |                                       , 0,  0, 1, 0 | ||||||
|  |                                       , 0,  1, 0, 0 | ||||||
|  |                                       ,-1, -1, -5, 1 | ||||||
|  |                                       ] | ||||||
|  |         V.unsafeWith model $ \ptr -> GL.glUniformMatrix4fv mmat 1 0 ptr | ||||||
|         GL.bindBuffer GL.ArrayBuffer GL.$= Just map' |         GL.bindBuffer GL.ArrayBuffer GL.$= Just map' | ||||||
|  |         GL.vertexAttribPointer ci GL.$= fgColorIndex | ||||||
|         GL.vertexAttribPointer vi GL.$= fgVertexIndex |         GL.vertexAttribPointer vi GL.$= fgVertexIndex | ||||||
|  |  | ||||||
|         GL.drawArrays GL.Triangles 0 numVert |         GL.drawArrays GL.Triangles 0 numVert | ||||||
|   | |||||||
| @@ -47,31 +47,31 @@ lineHeight :: GLfloat | |||||||
| lineHeight = 0.8660254 | lineHeight = 0.8660254 | ||||||
|  |  | ||||||
| numComponents :: Int | numComponents :: Int | ||||||
| numComponents = 3 | numComponents = 7 | ||||||
|  |  | ||||||
| mapStride :: Stride | mapStride :: Stride | ||||||
| mapStride = fromIntegral (sizeOf (0.0 :: GLfloat)) * fromIntegral numComponents | mapStride = fromIntegral (sizeOf (0.0 :: GLfloat) * numComponents) | ||||||
|  |  | ||||||
| bufferObjectPtr :: Integral a => a -> Ptr b | bufferObjectPtr :: Integral a => a -> Ptr GLfloat | ||||||
| bufferObjectPtr = plusPtr (nullPtr :: Ptr GLchar) . fromIntegral | bufferObjectPtr = plusPtr (nullPtr :: Ptr GLfloat) . fromIntegral | ||||||
|  |  | ||||||
| mapVertexArrayDescriptor :: NumComponents -> NumComponents -> VertexArrayDescriptor a | mapVertexArrayDescriptor :: NumComponents -> NumComponents -> VertexArrayDescriptor GLfloat | ||||||
| mapVertexArrayDescriptor count' offset = | mapVertexArrayDescriptor count' offset = | ||||||
|    VertexArrayDescriptor count' Float mapStride (bufferObjectPtr (fromIntegral numComponents * offset)) |    VertexArrayDescriptor count' Float mapStride (bufferObjectPtr offset ) --(fromIntegral numComponents * offset)) | ||||||
|  |  | ||||||
| fgColorIndex :: (IntegerHandling, VertexArrayDescriptor a) | fgColorIndex :: (IntegerHandling, VertexArrayDescriptor GLfloat) | ||||||
| fgColorIndex = (ToFloat, mapVertexArrayDescriptor 4 0)  --color first | fgColorIndex = (ToFloat, mapVertexArrayDescriptor 4 3)  --color first | ||||||
|  |  | ||||||
| fgNormalIndex :: (IntegerHandling, VertexArrayDescriptor a) | fgNormalIndex :: (IntegerHandling, VertexArrayDescriptor GLfloat) | ||||||
| fgNormalIndex = (ToFloat, mapVertexArrayDescriptor 3 4) --normal after color | fgNormalIndex = (ToFloat, mapVertexArrayDescriptor 3 4) --normal after color | ||||||
|  |  | ||||||
| fgVertexIndex :: (IntegerHandling, VertexArrayDescriptor a) | fgVertexIndex :: (IntegerHandling, VertexArrayDescriptor GLfloat) | ||||||
| fgVertexIndex = (ToFloat, mapVertexArrayDescriptor 3 7) --vertex after normal | fgVertexIndex = (ToFloat, mapVertexArrayDescriptor 3 0) --vertex after normal | ||||||
|  |  | ||||||
| getMapBufferObject :: IO (BufferObject, NumArrayIndices) | getMapBufferObject :: IO (BufferObject, NumArrayIndices) | ||||||
| getMapBufferObject = do | getMapBufferObject = do | ||||||
|         map' <- testmap |         map' <- testmap | ||||||
|         map' <- return $ generateCube --generateTriangles map' |         map' <- return $ P.map (*1) (generateTriangles map') | ||||||
|         putStrLn $ P.unlines $ P.map show (prettyMap map') |         putStrLn $ P.unlines $ P.map show (prettyMap map') | ||||||
|         len <- return $ fromIntegral $ P.length map' `div` numComponents |         len <- return $ fromIntegral $ P.length map' `div` numComponents | ||||||
|         putStrLn $ P.unwords ["num verts",show len] |         putStrLn $ P.unwords ["num verts",show len] | ||||||
| @@ -177,9 +177,9 @@ lookupVertex map' x y = | |||||||
|                         --TODO: calculate normals correctly! |                         --TODO: calculate normals correctly! | ||||||
|                 in |                 in | ||||||
|                 [ |                 [ | ||||||
|                         cr, cg, cb, 1.0,        -- RGBA Color |                         vx, vy, vz,              -- 3 Vertex | ||||||
|                         nx, ny, nz,             -- 3 Normal |                         cr, cg, cb, 1.0        -- RGBA Color | ||||||
|                         vx, vy, vz              -- 3 Vertex |                         --nx, ny, nz,             -- 3 Normal | ||||||
|                 ] |                 ] | ||||||
|  |  | ||||||
| heightLookup :: PlayMap -> (Int,Int) -> GLfloat | heightLookup :: PlayMap -> (Int,Int) -> GLfloat | ||||||
| @@ -202,7 +202,7 @@ coordLookup (x,z) y = | |||||||
|                 if even x then |                 if even x then | ||||||
|                         (fromIntegral $ x `div` 2, y, fromIntegral (2 * z) * lineHeight) |                         (fromIntegral $ x `div` 2, y, fromIntegral (2 * z) * lineHeight) | ||||||
|                 else |                 else | ||||||
|                         (fromIntegral (x `div` 2) / 2.0, y, fromIntegral (2 * z + 1) * lineHeight) |                         (fromIntegral (x `div` 2) + 0.5, y, fromIntegral (2 * z + 1) * lineHeight) | ||||||
|  |  | ||||||
|  |  | ||||||
| -- if writing in ASCII-Format transpose so i,j -> y,x | -- if writing in ASCII-Format transpose so i,j -> y,x | ||||||
| @@ -233,14 +233,15 @@ testMapTemplate = T.transpose [ | |||||||
|  |  | ||||||
| testMapTemplate2 :: [Text] | testMapTemplate2 :: [Text] | ||||||
| testMapTemplate2 = T.transpose [ | testMapTemplate2 = T.transpose [ | ||||||
|                 "~~~~~~" |                 "~~~~~~~~~~~~", | ||||||
|  |                 "~SSSSSSSSSS~" | ||||||
|                 ] |                 ] | ||||||
|  |  | ||||||
| testmap :: IO PlayMap | testmap :: IO PlayMap | ||||||
| testmap = do | testmap = do | ||||||
|                 g <- getStdGen |                 g <- getStdGen | ||||||
|                 rawMap <- return $ parseTemplate (randoms g) (T.concat testMapTemplate2) |                 rawMap <- return $ parseTemplate (randoms g) (T.concat testMapTemplate2) | ||||||
|                 return $ listArray ((0,0),(5,0)) rawMap |                 return $ listArray ((0,0),(9,1)) rawMap | ||||||
|  |  | ||||||
|  |  | ||||||
| parseTemplate :: [Int] -> Text -> [MapEntry] | parseTemplate :: [Int] -> Text -> [MapEntry] | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ initBuffer varray = | |||||||
|            checkError "initBuffer" |            checkError "initBuffer" | ||||||
|            return bufferObject |            return bufferObject | ||||||
|  |  | ||||||
| initShader :: IO (AttribLocation, UniformLocation) | initShader :: IO (AttribLocation, AttribLocation, UniformLocation, UniformLocation) | ||||||
| initShader = do | initShader = do | ||||||
|    ! vertexSource <- B.readFile vertexShaderFile |    ! vertexSource <- B.readFile vertexShaderFile | ||||||
|    ! fragmentSource <- B.readFile fragmentShaderFile |    ! fragmentSource <- B.readFile fragmentShaderFile | ||||||
| @@ -49,12 +49,23 @@ initShader = do | |||||||
|    projectionMatrixIndex <- get (uniformLocation program "fg_ProjectionMatrix") |    projectionMatrixIndex <- get (uniformLocation program "fg_ProjectionMatrix") | ||||||
|    checkError "projMat" |    checkError "projMat" | ||||||
|  |  | ||||||
|  |    modelMatrixIndex <- get (uniformLocation program "fg_ModelMatrix") | ||||||
|  |    checkError "modelMat" | ||||||
|  |  | ||||||
|  |    att <- get (activeAttribs program) | ||||||
|  |  | ||||||
|    vertexIndex <- get (attribLocation program "fg_VertexIn") |    vertexIndex <- get (attribLocation program "fg_VertexIn") | ||||||
|    vertexAttribArray vertexIndex $= Enabled |    vertexAttribArray vertexIndex $= Enabled | ||||||
|    checkError "vertexInd" |    checkError "vertexInd" | ||||||
|  |  | ||||||
|  |    colorIndex <- get (attribLocation program "fg_Color") | ||||||
|  |    vertexAttribArray colorIndex $= Enabled | ||||||
|  |    checkError "colorInd" | ||||||
|  |  | ||||||
|  |    putStrLn $ unlines $ "Attributes: ":map show att | ||||||
|  |  | ||||||
|    checkError "initShader" |    checkError "initShader" | ||||||
|    return (vertexIndex, projectionMatrixIndex) |    return (colorIndex, vertexIndex, projectionMatrixIndex, modelMatrixIndex) | ||||||
|  |  | ||||||
| initRendering :: IO () | initRendering :: IO () | ||||||
| initRendering = do | initRendering = do | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user