builds, but does not work.
pattern-match-failure.
This commit is contained in:
parent
e37832371c
commit
ee5eb95a2e
@ -14,7 +14,11 @@ import Data.ByteString (split, null, ByteString)
|
|||||||
import Data.ByteString.Unsafe (unsafeUseAsCString)
|
import Data.ByteString.Unsafe (unsafeUseAsCString)
|
||||||
import qualified Data.ByteString as B
|
import qualified Data.ByteString as B
|
||||||
import Graphics.GLUtil
|
import Graphics.GLUtil
|
||||||
|
import Graphics.Rendering.OpenGL.GL.StateVar (($=))
|
||||||
import Graphics.Rendering.OpenGL.GL.BufferObjects
|
import Graphics.Rendering.OpenGL.GL.BufferObjects
|
||||||
|
import Graphics.Rendering.OpenGL.GL.VertexArrays
|
||||||
|
import Graphics.Rendering.OpenGL.GL.VertexArrayObjects
|
||||||
|
import Graphics.Rendering.OpenGL.GL.VertexSpec
|
||||||
import Data.Word
|
import Data.Word
|
||||||
import Data.Int
|
import Data.Int
|
||||||
import Unsafe.Coerce
|
import Unsafe.Coerce
|
||||||
@ -205,8 +209,9 @@ parseIQM :: String -> IO IQM
|
|||||||
parseIQM a =
|
parseIQM a =
|
||||||
do
|
do
|
||||||
f <- B.readFile a
|
f <- B.readFile a
|
||||||
|
vao <- makeVAO (return ())
|
||||||
-- Parse Headers/Offsets
|
-- Parse Headers/Offsets
|
||||||
let result = parse doIQMparse f
|
let result = parse (doIQMparse vao) f
|
||||||
raw <- case result of
|
raw <- case result of
|
||||||
Done _ x -> return x
|
Done _ x -> return x
|
||||||
y -> error $ show y
|
y -> error $ show y
|
||||||
@ -214,11 +219,28 @@ parseIQM a =
|
|||||||
let va = vertexArrays raw
|
let va = vertexArrays raw
|
||||||
va' <- mapM (readInVAO f) va
|
va' <- mapM (readInVAO f) va
|
||||||
vbo <- sequence $ map toVBOfromVAO va
|
vbo <- sequence $ map toVBOfromVAO va
|
||||||
|
withVAO vao $ createVAO (zip va' vbo)
|
||||||
return $ raw
|
return $ raw
|
||||||
{ vertexArrays = va'
|
{ vertexArrays = va'
|
||||||
, vertexBufferObjects = vbo
|
, vertexBufferObjects = vbo
|
||||||
|
, vertexArrayObject = vao
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createVAO :: [(IQMVertexArray, BufferObject)] -> IO ()
|
||||||
|
createVAO bo = do
|
||||||
|
initVAO (AttribLocation 0) IQMPosition bo
|
||||||
|
initVAO (AttribLocation 2) IQMColor bo
|
||||||
|
initVAO (AttribLocation 1) IQMNormal bo
|
||||||
|
-- initVAO (AttribLocation 3) IQMTexCoord bo
|
||||||
|
|
||||||
|
initVAO :: AttribLocation -> IQMVertexArrayType -> [(IQMVertexArray, BufferObject)] -> IO ()
|
||||||
|
initVAO l t bo = do
|
||||||
|
let [(IQMVertexArray _ _ _ num _ _,buf)] = filter (\(IQMVertexArray ty _ _ _ _ _, _) -> ty == t) bo
|
||||||
|
bindBuffer (toBufferTargetfromVAType t)$= Just buf
|
||||||
|
vertexAttribArray l $= Enabled
|
||||||
|
vertexAttribPointer l $= (ToFloat, VertexArrayDescriptor num Float 0 nullPtr)
|
||||||
|
|
||||||
|
|
||||||
-- | Creates a BufferObject on the Graphicscard for each BufferObject
|
-- | Creates a BufferObject on the Graphicscard for each BufferObject
|
||||||
|
|
||||||
toVBOfromVAO :: IQMVertexArray -> IO BufferObject
|
toVBOfromVAO :: IQMVertexArray -> IO BufferObject
|
||||||
@ -258,8 +280,8 @@ readInVAO d (IQMVertexArray type' a format num offset ptr) =
|
|||||||
--
|
--
|
||||||
-- Consumes the String only once, thus in O(n). But all Data-Structures are
|
-- Consumes the String only once, thus in O(n). But all Data-Structures are
|
||||||
-- not allocated and copied. readInVAO has to be called on each one.
|
-- not allocated and copied. readInVAO has to be called on each one.
|
||||||
doIQMparse :: Parser IQM
|
doIQMparse :: VertexArrayObject -> Parser IQM
|
||||||
doIQMparse =
|
doIQMparse vao =
|
||||||
flip evalStateT 0 $ --evaluate parser with state starting at 0
|
flip evalStateT 0 $ --evaluate parser with state starting at 0
|
||||||
do
|
do
|
||||||
h <- readHeader --read header
|
h <- readHeader --read header
|
||||||
@ -275,7 +297,8 @@ doIQMparse =
|
|||||||
, texts = filter (not.null) (split (unsafeCoerce '\0') text)
|
, texts = filter (not.null) (split (unsafeCoerce '\0') text)
|
||||||
, meshes = meshes'
|
, meshes = meshes'
|
||||||
, vertexArrays = vaf
|
, vertexArrays = vaf
|
||||||
, vertexArrayObjects = [] --initialized later, after vaf get allocated.
|
, vertexBufferObjects = [] --initialized later, after vaf get allocated.
|
||||||
|
, vertexArrayObject = vao
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | Helper-Function for Extracting a random substring out of a Bytestring
|
-- | Helper-Function for Extracting a random substring out of a Bytestring
|
||||||
|
@ -14,6 +14,7 @@ import Prelude as P
|
|||||||
import Foreign.Storable
|
import Foreign.Storable
|
||||||
import Foreign.C.Types
|
import Foreign.C.Types
|
||||||
import Graphics.Rendering.OpenGL.GL.BufferObjects hiding (Offset)
|
import Graphics.Rendering.OpenGL.GL.BufferObjects hiding (Offset)
|
||||||
|
import Graphics.Rendering.OpenGL.GL.VertexArrayObjects
|
||||||
|
|
||||||
-- | Mesh-Indices to distinguish the meshes referenced
|
-- | Mesh-Indices to distinguish the meshes referenced
|
||||||
newtype Mesh = Mesh Word32 deriving (Show, Eq)
|
newtype Mesh = Mesh Word32 deriving (Show, Eq)
|
||||||
|
@ -308,6 +308,8 @@ renderOverview = 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 -> IO ()
|
||||||
renderIQM m p@(L.V3 x y z) s@(L.V3 sx sy sz) = do
|
renderIQM m p@(L.V3 x y z) s@(L.V3 sx sy sz) = do
|
||||||
|
bindVertexArrayObject $= Just (vertexArrayObject m)
|
||||||
|
glDrawArrays gl_TRIANGLES 0 3
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
renderObject :: MapObject -> IO ()
|
renderObject :: MapObject -> IO ()
|
||||||
|
Loading…
Reference in New Issue
Block a user