memory gets allocated and written.
No garantuee for correctness....
This commit is contained in:
parent
a81418bf40
commit
2e22e77d75
@ -200,28 +200,30 @@ parseIQM :: String -> IO IQM
|
||||
parseIQM a =
|
||||
do
|
||||
f <- B.readFile a
|
||||
putStrLn "Before Parse:"
|
||||
putStrLn $ show f
|
||||
putStrLn "Real Parse:"
|
||||
r <- return $ parse doIQMparse f
|
||||
raw <- case r of
|
||||
-- Parse Headers/Offsets
|
||||
let result = parse doIQMparse f
|
||||
raw <- case result of
|
||||
Done _ x -> return x
|
||||
y -> error $ show y
|
||||
let ret = raw
|
||||
return ret
|
||||
y -> error $ show y
|
||||
-- Fill Vertex-Arrays with data of Offsets
|
||||
let va = vertexArrays raw
|
||||
va' <- mapM (readInVAO f) va
|
||||
return $ raw {
|
||||
vertexArrays = va'
|
||||
}
|
||||
|
||||
readInVAO :: IQMVertexArray -> ByteString -> IO IQMVertexArray
|
||||
readInVAO (IQMVertexArray type' a format num offset ptr) d =
|
||||
readInVAO :: ByteString -> IQMVertexArray -> IO IQMVertexArray
|
||||
readInVAO d (IQMVertexArray type' a format num offset ptr) =
|
||||
do
|
||||
let
|
||||
byteLen = (fromIntegral num)*(vaSize format)
|
||||
byteLen = fromIntegral num * vaSize format
|
||||
data' = skipDrop (fromIntegral offset) byteLen d
|
||||
|
||||
when (not (ptr == nullPtr)) $ error $ "Error reading Vertex-Array: Double Read of " ++ show type'
|
||||
unless (ptr == nullPtr) $ error $ "Error reading Vertex-Array: Double Read of " ++ show type'
|
||||
p <- mallocBytes byteLen
|
||||
putStrLn $ concat ["Allocating ", show byteLen, " Bytes at ", show p]
|
||||
unsafeUseAsCString data' (\s -> copyBytes p s byteLen)
|
||||
p' <- unsafeCoerce p
|
||||
return (IQMVertexArray type' a format num offset p')
|
||||
return $ IQMVertexArray type' a format num offset $ castPtr p
|
||||
|
||||
doIQMparse :: Parser IQM
|
||||
doIQMparse =
|
||||
@ -235,8 +237,6 @@ doIQMparse =
|
||||
meshes' <- readMeshes $ fromIntegral $ num_meshes h --read meshes
|
||||
skipToCounter $ ofs_vertexarrays h --skip 0-n bytes to get to Vertex-Arrays
|
||||
vaf <- readVAFs $ fromIntegral $ num_vertexarrays h --read Vertex-Arrays
|
||||
|
||||
_ <- lift takeByteString
|
||||
return IQM
|
||||
{ header = h
|
||||
, texts = filter (not.null) (split (unsafeCoerce '\0') text)
|
||||
|
@ -1,4 +1,4 @@
|
||||
{-# LANGUAGE ExistentialQuantification, RankNTypes, CPP, BangPatterns #-}
|
||||
-- {-# LANGUAGE ExistentialQuantification, RankNTypes, CPP, BangPatterns #-}
|
||||
-- | Word32 or Word64 - depending on implementation. Format just specifies "uint".
|
||||
-- 4-Byte in the documentation indicates Word32 - but not specified!
|
||||
module Importer.IQM.Types where
|
||||
@ -13,7 +13,6 @@ import Graphics.Rendering.OpenGL.Raw.Types
|
||||
import Prelude as P
|
||||
import Foreign.Storable
|
||||
import Foreign.C.Types
|
||||
import Foreign.Marshal.Array
|
||||
|
||||
-- | Mesh-Indices to distinguish the meshes referenced
|
||||
newtype Mesh = Mesh Word32 deriving (Show, Eq)
|
||||
@ -148,7 +147,7 @@ vaSize IQMshort = sizeOf (undefined :: CShort)
|
||||
vaSize IQMushort = sizeOf (undefined :: CUShort)
|
||||
vaSize IQMint = sizeOf (undefined :: CInt)
|
||||
vaSize IQMuint = sizeOf (undefined :: CUInt)
|
||||
vaSize IQMhalf = sizeOf (undefined :: Word16) --TODO: Find 16-Bit-Float-Datatype
|
||||
vaSize IQMhalf = sizeOf (undefined :: Word16) --TODO: Find 16-Bit-Float-Datatype FIXME!
|
||||
vaSize IQMfloat = sizeOf (undefined :: CFloat)
|
||||
vaSize IQMdouble = sizeOf (undefined :: CDouble)
|
||||
|
||||
@ -187,10 +186,11 @@ data IQMVertexArray = IQMVertexArray
|
||||
IQMData
|
||||
deriving (Eq)
|
||||
instance Show IQMVertexArray where
|
||||
show (IQMVertexArray t fl fo nc off _) = "IQMVertexArray (Type: " ++ show t ++
|
||||
show (IQMVertexArray t fl fo nc off dat) = "IQMVertexArray (Type: " ++ show t ++
|
||||
", Flags: " ++ show fl ++
|
||||
", Format: " ++ show fo ++
|
||||
", NumComponents: " ++ show nc ++
|
||||
", Offset: " ++ show off ++
|
||||
", Data at: " ++ show dat ++
|
||||
")"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user