array-objects get initialized

- initialized array-objects
- still need to be rendered and collected to a VertexBufferObject

refs #482 @2h
This commit is contained in:
Nicole Dresselhaus 2014-05-13 15:04:20 +02:00
parent 4d31866256
commit b5a4d03f8c
No known key found for this signature in database
GPG Key ID: BC16D887851A1A80
3 changed files with 26 additions and 7 deletions

View File

@ -13,6 +13,8 @@ import Data.ByteString.Char8 (pack)
import Data.ByteString (split, null, ByteString) 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.Rendering.OpenGL.GL.BufferObjects
import Data.Word import Data.Word
import Data.Int import Data.Int
import Unsafe.Coerce import Unsafe.Coerce
@ -211,10 +213,29 @@ parseIQM a =
-- Fill Vertex-Arrays with data of Offsets -- Fill Vertex-Arrays with data of Offsets
let va = vertexArrays raw let va = vertexArrays raw
va' <- mapM (readInVAO f) va va' <- mapM (readInVAO f) va
return $ raw { vbo <- sequence $ map toVBOfromVAO va
vertexArrays = va' return $ raw
{ vertexArrays = va'
, vertexArrayObjects = vbo
} }
-- | Creates a BufferObject on the Graphicscard for each BufferObject
toVBOfromVAO :: IQMVertexArray -> IO BufferObject
toVBOfromVAO (IQMVertexArray type' _ _ num _ ptr) =
fromPtr (toBufferTargetfromVAType type') (fromIntegral num) ptr
-- | translates from VA-type to BufferTarget
toBufferTargetfromVAType :: IQMVertexArrayType -> BufferTarget
toBufferTargetfromVAType IQMPosition = ArrayBuffer
toBufferTargetfromVAType IQMTexCoord = TextureBuffer
toBufferTargetfromVAType IQMNormal = ArrayBuffer
toBufferTargetfromVAType IQMBlendIndexes = ElementArrayBuffer
toBufferTargetfromVAType IQMBlendWeights = ArrayBuffer
toBufferTargetfromVAType IQMColor = ArrayBuffer
toBufferTargetfromVAType _ = ArrayBuffer
-- | Allocates memory for the Vertex-data and copies it over there -- | Allocates memory for the Vertex-data and copies it over there
-- from the given input-String -- from the given input-String
-- --
@ -254,6 +275,7 @@ 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.
} }
-- | Helper-Function for Extracting a random substring out of a Bytestring -- | Helper-Function for Extracting a random substring out of a Bytestring

View File

@ -13,6 +13,7 @@ import Graphics.Rendering.OpenGL.Raw.Types
import Prelude as P 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)
-- | 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)
@ -108,6 +109,7 @@ data IQM = IQM
, texts :: [ByteString] , texts :: [ByteString]
, meshes :: [IQMMesh] , meshes :: [IQMMesh]
, vertexArrays :: [IQMVertexArray] , vertexArrays :: [IQMVertexArray]
, vertexArrayObjects :: [BufferObject]
} deriving (Show, Eq) } deriving (Show, Eq)
-- | Different Vertex-Array-Types in IQM -- | Different Vertex-Array-Types in IQM

View File

@ -138,8 +138,3 @@ genColorData :: Int -- ^ Amount
-> [Int8] -- ^ [r,g,b,a], [r,g,b] - whatever should be repeatet. -> [Int8] -- ^ [r,g,b,a], [r,g,b] - whatever should be repeatet.
-> [Int8] -> [Int8]
genColorData n c = take (length c*n) (cycle c) genColorData n c = take (length c*n) (cycle c)
-- from GLUtil
-- |Allocate and fill a 'BufferObject' from a list of 'Storable's.
makeBuffer :: Storable a => BufferTarget -> [a] -> IO BufferObject
makeBuffer target elems = makeBufferLen target (length elems) elems