diff options
| -rw-r--r-- | Spear.cabal | 29 | ||||
| -rw-r--r-- | Spear.lkshs | 14 | ||||
| -rw-r--r-- | Spear.lkshw | 2 | ||||
| -rw-r--r-- | Spear/Assets/Model.hsc | 139 | ||||
| -rw-r--r-- | Spear/Assets/Model/Model.c | 27 | ||||
| -rw-r--r-- | Spear/Assets/Model/Model.h | 3 | ||||
| -rw-r--r-- | Spear/Render/AnimatedModel.hs | 29 | ||||
| -rw-r--r-- | Spear/Render/StaticModel.hs | 7 | 
8 files changed, 179 insertions, 71 deletions
| diff --git a/Spear.cabal b/Spear.cabal index ffe11dc..254f181 100644 --- a/Spear.cabal +++ b/Spear.cabal | |||
| @@ -16,24 +16,25 @@ library | |||
| 16 | StateVar -any, base -any, bytestring -any, directory -any, | 16 | StateVar -any, base -any, bytestring -any, directory -any, | 
| 17 | mtl -any, transformers -any, resourcet -any, parsec >=3.1.3, | 17 | mtl -any, transformers -any, resourcet -any, parsec >=3.1.3, | 
| 18 | containers -any, vector -any, array -any | 18 | containers -any, vector -any, array -any | 
| 19 | exposed-modules: Spear.Math.QuadTree Spear.Physics.Types Spear.App | 19 | exposed-modules: Spear.Scene.GameObject Spear.Math.QuadTree | 
| 20 | Spear.App.Application Spear.App.Input Spear.Assets.Image | 20 | Spear.Physics.Types Spear.App Spear.App.Application Spear.App.Input | 
| 21 | Spear.Assets.Model Spear.Collision Spear.Math.AABB | 21 | Spear.Assets.Image Spear.Assets.Model Spear.Collision | 
| 22 | Spear.Collision.Collision Spear.Collision.Collisioner | 22 | Spear.Math.AABB Spear.Collision.Collision | 
| 23 | Spear.Math.Circle Spear.Math.Triangle Spear.Collision.Types | 23 | Spear.Collision.Collisioner Spear.Math.Circle Spear.Math.Triangle | 
| 24 | Spear.Game Spear.GLSL Spear.GLSL.Buffer Spear.GLSL.Error | 24 | Spear.Collision.Types Spear.Game Spear.GLSL Spear.GLSL.Buffer | 
| 25 | Spear.GLSL.Management Spear.GLSL.Texture Spear.GLSL.Uniform | 25 | Spear.GLSL.Error Spear.GLSL.Management Spear.GLSL.Texture | 
| 26 | Spear.GLSL.VAO Spear.Math.Camera Spear.Math.Entity | 26 | Spear.GLSL.Uniform Spear.GLSL.VAO Spear.Math.Camera | 
| 27 | Spear.Math.Matrix3 Spear.Math.Matrix4 Spear.Math.MatrixUtils | 27 | Spear.Math.Entity Spear.Math.Matrix3 Spear.Math.Matrix4 | 
| 28 | Spear.Math.Plane Spear.Math.Quaternion Spear.Math.Spatial | 28 | Spear.Math.MatrixUtils Spear.Math.Plane Spear.Math.Quaternion | 
| 29 | Spear.Math.Vector3 Spear.Math.Vector4 Spear.Physics | 29 | Spear.Math.Spatial Spear.Math.Vector3 Spear.Math.Vector4 | 
| 30 | Spear.Physics.Rigid Spear.Render.AnimatedModel | 30 | Spear.Physics Spear.Physics.Rigid Spear.Render.AnimatedModel | 
| 31 | Spear.Render.Material Spear.Render.Model Spear.Render.Program | 31 | Spear.Render.Material Spear.Render.Model Spear.Render.Program | 
| 32 | Spear.Render.Renderable Spear.Render.StaticModel | 32 | Spear.Render.Renderable Spear.Render.StaticModel | 
| 33 | Spear.Render.Texture Spear.Scene.Graph Spear.Scene.Light | 33 | Spear.Render.Texture Spear.Scene.Graph Spear.Scene.Light | 
| 34 | Spear.Scene.Loader Spear.Scene.Scene Spear.Scene.SceneResources | 34 | Spear.Scene.Loader Spear.Scene.Scene Spear.Scene.SceneResources | 
| 35 | Spear.Setup Spear.Sys.Timer Spear.Sys.Store Spear.Sys.Store.ID | 35 | Spear.Setup Spear.Sys.Timer Spear.Sys.Store Spear.Sys.Store.ID | 
| 36 | Spear.Updatable Spear.Math.Vector2 | 36 | Spear.Updatable Spear.Math.Vector2 Spear.Math.Quad Spear.Math.Ray | 
| 37 | Spear.Math.Segment Spear.Math.Utils | ||
| 37 | exposed: True | 38 | exposed: True | 
| 38 | buildable: True | 39 | buildable: True | 
| 39 | build-tools: hsc2hs -any | 40 | build-tools: hsc2hs -any | 
| @@ -56,4 +57,4 @@ library | |||
| 56 | Spear/Sys | 57 | Spear/Sys | 
| 57 | hs-source-dirs: . | 58 | hs-source-dirs: . | 
| 58 | ghc-options: -O2 -rtsopts | 59 | ghc-options: -O2 -rtsopts | 
| 59 | 60 | \ No newline at end of file | |
| diff --git a/Spear.lkshs b/Spear.lkshs index 2663b79..8ff60d0 100644 --- a/Spear.lkshs +++ b/Spear.lkshs | |||
| @@ -1,18 +1,18 @@ | |||
| 1 | Version of session file format: | 1 | Version of session file format: | 
| 2 | 1 | 2 | 1 | 
| 3 | Time of storage: | 3 | Time of storage: | 
| 4 | "Tue Aug 28 18:24:30 CEST 2012" | 4 | "Tue Aug 28 22:08:10 CEST 2012" | 
| 5 | Layout: VerticalP (TerminalP {paneGroups = fromList [], paneTabs = Just TopP, currentPage = -1, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [("Browser",HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 240) 199)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 696) 954 | 5 | Layout: VerticalP (TerminalP {paneGroups = fromList [], paneTabs = Just TopP, currentPage = 3, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [("Browser",HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 308) 194)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 683) 954 | 
| 6 | Population: [(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (InfoSt (InfoState Nothing)),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP BottomP]),(Just (LogSt LogState),[SplitP RightP,SplitP BottomP]),(Just (ModulesSt (ModulesState 328 (PackageScope False,False) (Nothing,Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([[0]],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP])] | 6 | Population: [(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Render/AnimatedModel.hs" 247)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs" 2235)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collisioner.hs" 1019)),[SplitP LeftP]),(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Scene/GameObject.hs" 1898)),[SplitP LeftP]),(Just (InfoSt (InfoState Nothing)),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP BottomP]),(Just (LogSt LogState),[SplitP RightP,SplitP BottomP]),(Just (ModulesSt (ModulesState 328 (PackageScope False,False) (Just (ModuleName ["Spear","Collision","Collision"]),Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([[0,7],[0,4],[0,1],[0]],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP])] | 
| 7 | Window size: (1820,939) | 7 | Window size: (1820,939) | 
| 8 | Completion size: | 8 | Completion size: | 
| 9 | (750,400) | 9 | (750,399) | 
| 10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" | 10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" | 
| 11 | Active pane: Just "Modules" | 11 | Active pane: Just "GameObject.hs" | 
| 12 | Toolbar visible: | 12 | Toolbar visible: | 
| 13 | True | 13 | True | 
| 14 | FindbarState: (False,FindState {entryStr = "asad", entryHist = ["asad","Octree","idxs","asd","elemIndexa","elemtIn","splitAt","allocaBytes","copyArray","allocaArray","allocaa","putStrLn"], replaceStr = "QuadTree", replaceHist = [], caseSensitive = True, entireWord = False, wrapAround = False, regex = False, lineNr = 1}) | 14 | FindbarState: (False,FindState {entryStr = "asd", entryHist = ["copy_tr","asad","Octree","idxs","asd","elemIndexa","elemtIn","splitAt","allocaBytes","copyArray","allocaArray","allocaa"], replaceStr = "QuadTree", replaceHist = [], caseSensitive = True, entireWord = False, wrapAround = False, regex = False, lineNr = 1}) | 
| 15 | Recently opened files: | 15 | Recently opened files: | 
| 16 | ["/home/jeanne/programming/haskell/Spear/Spear/Math/AABB.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Circle.hs","/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs","/home/jeanne/programming/haskell/Spear/Spear/Collision/Collisioner.hs","/home/jeanne/programming/haskell/Spear/Spear/Scene/Scene.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/QuadTree.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Sphere.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Triangle.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Spatial.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Quaternion.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Plane.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Octree.hs"] | 16 | ["/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Matrix3.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/AABB.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/Texture.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/Program.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameObject/Factory.hs","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model.hsc","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model/Model.h","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model/Model.c","/home/jeanne/programming/haskell/Spear/Spear/App/Input.hs","/home/jeanne/programming/haskell/Spear/Spear/Scene/SceneResources.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/StaticModel.hs"] | 
| 17 | Recently opened workspaces: | 17 | Recently opened workspaces: | 
| 18 | ["/home/jeanne/programming/haskell/hagen/hagen.lkshw","/home/jeanne/programming/haskell/foo/foo.lkshw","/home/jeanne/programming/haskell/Spear/Spear.lkshw","/home/jeanne/programming/haskell/nexus/nexus.lkshw","/home/jeanne/leksah.lkshw"] \ No newline at end of file | 18 | ["/home/jeanne/programming/haskell/hagen/hagen.lkshw","/home/jeanne/programming/haskell/foo/foo.lkshw","/home/jeanne/programming/haskell/Spear/Spear.lkshw","/home/jeanne/programming/haskell/nexus/nexus.lkshw","/home/jeanne/leksah.lkshw"] \ No newline at end of file | 
| diff --git a/Spear.lkshw b/Spear.lkshw index 5345907..b41cb88 100644 --- a/Spear.lkshw +++ b/Spear.lkshw | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | Version of workspace file format: | 1 | Version of workspace file format: | 
| 2 | 1 | 2 | 1 | 
| 3 | Time of storage: | 3 | Time of storage: | 
| 4 | "Tue Aug 28 17:23:50 CEST 2012" | 4 | "Tue Aug 28 21:08:58 CEST 2012" | 
| 5 | Name of the workspace: | 5 | Name of the workspace: | 
| 6 | "Spear" | 6 | "Spear" | 
| 7 | File paths of contained packages: | 7 | File paths of contained packages: | 
| diff --git a/Spear/Assets/Model.hsc b/Spear/Assets/Model.hsc index b7cb90d..1b01062 100644 --- a/Spear/Assets/Model.hsc +++ b/Spear/Assets/Model.hsc | |||
| @@ -3,9 +3,11 @@ | |||
| 3 | module Spear.Assets.Model | 3 | module Spear.Assets.Model | 
| 4 | ( | 4 | ( | 
| 5 | -- * Data types | 5 | -- * Data types | 
| 6 | Vec3(..) | 6 | Vec2(..) | 
| 7 | , Vec3(..) | ||
| 7 | , TexCoord(..) | 8 | , TexCoord(..) | 
| 8 | , CTriangle(..) | 9 | , CTriangle(..) | 
| 10 | , Box(..) | ||
| 9 | , Skin(..) | 11 | , Skin(..) | 
| 10 | , Animation(..) | 12 | , Animation(..) | 
| 11 | , Triangle(..) | 13 | , Triangle(..) | 
| @@ -21,6 +23,7 @@ module Spear.Assets.Model | |||
| 21 | , transformVerts | 23 | , transformVerts | 
| 22 | , transformNormals | 24 | , transformNormals | 
| 23 | , toGround | 25 | , toGround | 
| 26 | , modelBoxes | ||
| 24 | ) | 27 | ) | 
| 25 | where | 28 | where | 
| 26 | 29 | ||
| @@ -31,7 +34,8 @@ import Spear.Setup | |||
| 31 | import qualified Data.ByteString.Char8 as B | 34 | import qualified Data.ByteString.Char8 as B | 
| 32 | import Data.Char (toLower) | 35 | import Data.Char (toLower) | 
| 33 | import Data.List (splitAt, elemIndex) | 36 | import Data.List (splitAt, elemIndex) | 
| 34 | import qualified Data.Vector.Storable as V | 37 | import qualified Data.Vector as V | 
| 38 | import qualified Data.Vector.Storable as S | ||
| 35 | import Foreign.Ptr | 39 | import Foreign.Ptr | 
| 36 | import Foreign.Storable | 40 | import Foreign.Storable | 
| 37 | import Foreign.C.Types | 41 | import Foreign.C.Types | 
| @@ -61,8 +65,26 @@ sizeFloat = #{size float} | |||
| 61 | sizePtr = #{size int*} | 65 | sizePtr = #{size int*} | 
| 62 | 66 | ||
| 63 | 67 | ||
| 68 | -- | A 2D vector. | ||
| 69 | data Vec2 = Vec2 {-# UNPACK #-} !Float {-# UNPACK #-} !Float | ||
| 70 | |||
| 71 | |||
| 72 | instance Storable Vec2 where | ||
| 73 | sizeOf _ = 2*sizeFloat | ||
| 74 | alignment _ = alignment (undefined :: CFloat) | ||
| 75 | |||
| 76 | peek ptr = do | ||
| 77 | f0 <- peekByteOff ptr 0 | ||
| 78 | f1 <- peekByteOff ptr sizeFloat | ||
| 79 | return $ Vec2 f0 f1 | ||
| 80 | |||
| 81 | poke ptr (Vec2 f0 f1) = do | ||
| 82 | pokeByteOff ptr 0 f0 | ||
| 83 | pokeByteOff ptr sizeFloat f1 | ||
| 84 | |||
| 85 | |||
| 64 | -- | A 3D vector. | 86 | -- | A 3D vector. | 
| 65 | data Vec3 = Vec3 !Float !Float !Float | 87 | data Vec3 = Vec3 {-# UNPACK #-} !Float {-# UNPACK #-} !Float {-# UNPACK #-} !Float | 
| 66 | 88 | ||
| 67 | 89 | ||
| 68 | instance Storable Vec3 where | 90 | instance Storable Vec3 where | 
| @@ -82,7 +104,7 @@ instance Storable Vec3 where | |||
| 82 | 104 | ||
| 83 | 105 | ||
| 84 | -- | A 2D texture coordinate. | 106 | -- | A 2D texture coordinate. | 
| 85 | data TexCoord = TexCoord !Float !Float | 107 | data TexCoord = TexCoord {-# UNPACK #-} !Float {-# UNPACK #-} !Float | 
| 86 | 108 | ||
| 87 | 109 | ||
| 88 | instance Storable TexCoord where | 110 | instance Storable TexCoord where | 
| @@ -101,12 +123,12 @@ instance Storable TexCoord where | |||
| 101 | 123 | ||
| 102 | -- | A raw triangle holding vertex/normal and texture indices. | 124 | -- | A raw triangle holding vertex/normal and texture indices. | 
| 103 | data CTriangle = CTriangle | 125 | data CTriangle = CTriangle | 
| 104 | { vertexIndex0 :: !CUShort | 126 | { vertexIndex0 :: {-# UNPACK #-} !CUShort | 
| 105 | , vertexIndex1 :: !CUShort | 127 | , vertexIndex1 :: {-# UNPACK #-} !CUShort | 
| 106 | , vertexIndex2 :: !CUShort | 128 | , vertexIndex2 :: {-# UNPACK #-} !CUShort | 
| 107 | , textureIndex1 :: !CUShort | 129 | , textureIndex1 :: {-# UNPACK #-} !CUShort | 
| 108 | , textureIndex2 :: !CUShort | 130 | , textureIndex2 :: {-# UNPACK #-} !CUShort | 
| 109 | , textureIndex3 :: !CUShort | 131 | , textureIndex3 :: {-# UNPACK #-} !CUShort | 
| 110 | } | 132 | } | 
| 111 | 133 | ||
| 112 | 134 | ||
| @@ -135,6 +157,28 @@ instance Storable CTriangle where | |||
| 135 | #{poke triangle, textureIndices[2]} ptr t2 | 157 | #{poke triangle, textureIndices[2]} ptr t2 | 
| 136 | 158 | ||
| 137 | 159 | ||
| 160 | -- | A 2D axis-aligned bounding box. | ||
| 161 | data Box = Box {-# UNPACK #-} !Vec2 {-# UNPACK #-} !Vec2 | ||
| 162 | |||
| 163 | |||
| 164 | instance Storable Box where | ||
| 165 | sizeOf _ = 4 * sizeFloat | ||
| 166 | alignment _ = alignment (undefined :: CFloat) | ||
| 167 | |||
| 168 | peek ptr = do | ||
| 169 | f0 <- peekByteOff ptr 0 | ||
| 170 | f1 <- peekByteOff ptr sizeFloat | ||
| 171 | f2 <- peekByteOff ptr $ 2*sizeFloat | ||
| 172 | f3 <- peekByteOff ptr $ 3*sizeFloat | ||
| 173 | return $ Box (Vec2 f0 f1) (Vec2 f2 f3) | ||
| 174 | |||
| 175 | poke ptr (Box (Vec2 f0 f1) (Vec2 f2 f3)) = do | ||
| 176 | pokeByteOff ptr 0 f0 | ||
| 177 | pokeByteOff ptr sizeFloat f1 | ||
| 178 | pokeByteOff ptr (2*sizeFloat) f2 | ||
| 179 | pokeByteOff ptr (3*sizeFloat) f3 | ||
| 180 | |||
| 181 | |||
| 138 | -- | A model skin. | 182 | -- | A model skin. | 
| 139 | newtype Skin = Skin { skinName :: B.ByteString } | 183 | newtype Skin = Skin { skinName :: B.ByteString } | 
| 140 | 184 | ||
| @@ -179,12 +223,12 @@ instance Storable Animation where | |||
| 179 | 223 | ||
| 180 | -- | A 3D model. | 224 | -- | A 3D model. | 
| 181 | data Model = Model | 225 | data Model = Model | 
| 182 | { vertices :: V.Vector Vec3 -- ^ Array of 'numFrames' * 'numVerts' vertices. | 226 | { vertices :: S.Vector Vec3 -- ^ Array of 'numFrames' * 'numVerts' vertices. | 
| 183 | , normals :: V.Vector Vec3 -- ^ Array of 'numFrames' * 'numVerts' normals. | 227 | , normals :: S.Vector Vec3 -- ^ Array of 'numFrames' * 'numVerts' normals. | 
| 184 | , texCoords :: V.Vector TexCoord -- ^ Array of 'numTexCoords' texture coordinates. | 228 | , texCoords :: S.Vector TexCoord -- ^ Array of 'numTexCoords' texture coordinates. | 
| 185 | , triangles :: V.Vector CTriangle -- ^ Array of 'numTriangles' triangles. | 229 | , triangles :: S.Vector CTriangle -- ^ Array of 'numTriangles' triangles. | 
| 186 | , skins :: V.Vector Skin -- ^ Array of 'numSkins' skins. | 230 | , skins :: S.Vector Skin -- ^ Array of 'numSkins' skins. | 
| 187 | , animations :: V.Vector Animation -- ^ Array of 'numAnimations' animations. | 231 | , animations :: S.Vector Animation -- ^ Array of 'numAnimations' animations. | 
| 188 | , numFrames :: Int -- ^ Number of frames. | 232 | , numFrames :: Int -- ^ Number of frames. | 
| 189 | , numVerts :: Int -- ^ Number of vertices (and normals) per frame. | 233 | , numVerts :: Int -- ^ Number of vertices (and normals) per frame. | 
| 190 | , numTriangles :: Int -- ^ Number of triangles in one frame. | 234 | , numTriangles :: Int -- ^ Number of triangles in one frame. | 
| @@ -211,12 +255,12 @@ instance Storable Model where | |||
| 211 | pTriangles <- peekByteOff ptr (3*sizePtr) | 255 | pTriangles <- peekByteOff ptr (3*sizePtr) | 
| 212 | pSkins <- peekByteOff ptr (4*sizePtr) | 256 | pSkins <- peekByteOff ptr (4*sizePtr) | 
| 213 | pAnimations <- peekByteOff ptr (5*sizePtr) | 257 | pAnimations <- peekByteOff ptr (5*sizePtr) | 
| 214 | vertices <- fmap V.fromList $ peekArray (numVertices*numFrames) pVerts | 258 | vertices <- fmap S.fromList $ peekArray (numVertices*numFrames) pVerts | 
| 215 | normals <- fmap V.fromList $ peekArray (numVertices*numFrames) pNormals | 259 | normals <- fmap S.fromList $ peekArray (numVertices*numFrames) pNormals | 
| 216 | texCoords <- fmap V.fromList $ peekArray numTexCoords pTexCoords | 260 | texCoords <- fmap S.fromList $ peekArray numTexCoords pTexCoords | 
| 217 | triangles <- fmap V.fromList $ peekArray numTriangles pTriangles | 261 | triangles <- fmap S.fromList $ peekArray numTriangles pTriangles | 
| 218 | skins <- fmap V.fromList $ peekArray numSkins pSkins | 262 | skins <- fmap S.fromList $ peekArray numSkins pSkins | 
| 219 | animations <- fmap V.fromList $ peekArray numAnimations pAnimations | 263 | animations <- fmap S.fromList $ peekArray numAnimations pAnimations | 
| 220 | return $ | 264 | return $ | 
| 221 | Model vertices normals texCoords triangles skins animations | 265 | Model vertices normals texCoords triangles skins animations | 
| 222 | numFrames numVertices numTriangles numTexCoords numSkins numAnimations | 266 | numFrames numVertices numTriangles numTexCoords numSkins numAnimations | 
| @@ -224,12 +268,12 @@ instance Storable Model where | |||
| 224 | poke ptr | 268 | poke ptr | 
| 225 | (Model verts normals texCoords tris skins animations | 269 | (Model verts normals texCoords tris skins animations | 
| 226 | numFrames numVerts numTris numTex numSkins numAnimations) = | 270 | numFrames numVerts numTris numTex numSkins numAnimations) = | 
| 227 | V.unsafeWith verts $ \pVerts -> | 271 | S.unsafeWith verts $ \pVerts -> | 
| 228 | V.unsafeWith normals $ \pNormals -> | 272 | S.unsafeWith normals $ \pNormals -> | 
| 229 | V.unsafeWith texCoords $ \pTexCoords -> | 273 | S.unsafeWith texCoords $ \pTexCoords -> | 
| 230 | V.unsafeWith tris $ \pTris -> | 274 | S.unsafeWith tris $ \pTris -> | 
| 231 | V.unsafeWith skins $ \pSkins -> | 275 | S.unsafeWith skins $ \pSkins -> | 
| 232 | V.unsafeWith animations $ \pAnimations -> do | 276 | S.unsafeWith animations $ \pAnimations -> do | 
| 233 | #{poke Model, vertices} ptr pVerts | 277 | #{poke Model, vertices} ptr pVerts | 
| 234 | #{poke Model, normals} ptr pNormals | 278 | #{poke Model, normals} ptr pNormals | 
| 235 | #{poke Model, texCoords} ptr pTexCoords | 279 | #{poke Model, texCoords} ptr pTexCoords | 
| @@ -349,13 +393,13 @@ animated = (>1) . numFrames | |||
| 349 | 393 | ||
| 350 | -- | Return the model's ith animation. | 394 | -- | Return the model's ith animation. | 
| 351 | animation :: Model -> Int -> Animation | 395 | animation :: Model -> Int -> Animation | 
| 352 | animation model i = animations model V.! i | 396 | animation model i = animations model S.! i | 
| 353 | 397 | ||
| 354 | 398 | ||
| 355 | -- | Return the animation specified by the given string. | 399 | -- | Return the animation specified by the given string. | 
| 356 | animationByName :: Model -> String -> Maybe Animation | 400 | animationByName :: Model -> String -> Maybe Animation | 
| 357 | animationByName model anim = | 401 | animationByName model anim = | 
| 358 | let anim' = B.pack anim in V.find ((==) anim' . name) $ animations model | 402 | let anim' = B.pack anim in S.find ((==) anim' . name) $ animations model | 
| 359 | 403 | ||
| 360 | 404 | ||
| 361 | -- | Return a copy of the model's triangles. | 405 | -- | Return a copy of the model's triangles. | 
| @@ -378,8 +422,8 @@ transformVerts :: Model -> (Vec3 -> Vec3) -> Model | |||
| 378 | transformVerts model f = model { vertices = vertices' } | 422 | transformVerts model f = model { vertices = vertices' } | 
| 379 | where | 423 | where | 
| 380 | n = numVerts model * numFrames model | 424 | n = numVerts model * numFrames model | 
| 381 | vertices' = V.generate n f' | 425 | vertices' = S.generate n f' | 
| 382 | f' i = f $ vertices model V.! i | 426 | f' i = f $ vertices model S.! i | 
| 383 | 427 | ||
| 384 | 428 | ||
| 385 | -- | Transform the model's normals. | 429 | -- | Transform the model's normals. | 
| @@ -387,14 +431,14 @@ transformNormals :: Model -> (Vec3 -> Vec3) -> Model | |||
| 387 | transformNormals model f = model { normals = normals' } | 431 | transformNormals model f = model { normals = normals' } | 
| 388 | where | 432 | where | 
| 389 | n = numVerts model * numFrames model | 433 | n = numVerts model * numFrames model | 
| 390 | normals' = V.generate n f' | 434 | normals' = S.generate n f' | 
| 391 | f' i = f $ normals model V.! i | 435 | f' i = f $ normals model S.! i | 
| 392 | 436 | ||
| 393 | 437 | ||
| 394 | -- | Translate the model such that its lowest point has y = 0. | 438 | -- | Translate the model such that its lowest point has y = 0. | 
| 395 | toGround :: Model -> IO Model | 439 | toGround :: Model -> IO Model | 
| 396 | toGround model = | 440 | toGround model = | 
| 397 | let model' = model { vertices = V.generate n $ \i -> vertices model V.! i } | 441 | let model' = model { vertices = S.generate n $ \i -> vertices model S.! i } | 
| 398 | n = numVerts model * numFrames model | 442 | n = numVerts model * numFrames model | 
| 399 | in | 443 | in | 
| 400 | with model' model_to_ground >> return model' | 444 | with model' model_to_ground >> return model' | 
| @@ -402,3 +446,28 @@ toGround model = | |||
| 402 | 446 | ||
| 403 | foreign import ccall "Model.h model_to_ground" | 447 | foreign import ccall "Model.h model_to_ground" | 
| 404 | model_to_ground :: Ptr Model -> IO () | 448 | model_to_ground :: Ptr Model -> IO () | 
| 449 | |||
| 450 | |||
| 451 | -- | Get the model's 2D bounding boxes. | ||
| 452 | modelBoxes :: Model -> IO (V.Vector Box) | ||
| 453 | modelBoxes model = | ||
| 454 | with model $ \modelPtr -> | ||
| 455 | allocaArray (numVerts model * numFrames model) $ \pointsPtr -> do | ||
| 456 | model_compute_boxes modelPtr pointsPtr | ||
| 457 | let n = numFrames model | ||
| 458 | getBoxes = peekBoxes pointsPtr n 0 0 $ return [] | ||
| 459 | peekBoxes ptr n cur off l | ||
| 460 | | cur == n = l | ||
| 461 | | otherwise = do | ||
| 462 | f0 <- peekByteOff ptr off | ||
| 463 | f1 <- peekByteOff ptr $ off + sizeFloat | ||
| 464 | f2 <- peekByteOff ptr $ off + 2*sizeFloat | ||
| 465 | f3 <- peekByteOff ptr $ off + 3*sizeFloat | ||
| 466 | peekBoxes ptr n (cur+1) (off + 4*sizeFloat) $ | ||
| 467 | fmap ((f3:) . (f2:) . (f1:) . (f0:)) l | ||
| 468 | fmap (V.fromList . reverse) getBoxes | ||
| 469 | |||
| 470 | |||
| 471 | |||
| 472 | foreign import ccall "Model.h model_compute_boxes" | ||
| 473 | model_compute_boxes :: Ptr Model -> Ptr Vec2 -> IO () | ||
| diff --git a/Spear/Assets/Model/Model.c b/Spear/Assets/Model/Model.c index 4942566..6fa88c3 100644 --- a/Spear/Assets/Model/Model.c +++ b/Spear/Assets/Model/Model.c | |||
| @@ -79,3 +79,30 @@ void model_copy_triangles (Model* model, unsigned frame, model_triangle* tris) | |||
| 79 | tris->t2 = t[tri->textureIndices[2]]; | 79 | tris->t2 = t[tri->textureIndices[2]]; | 
| 80 | } | 80 | } | 
| 81 | } | 81 | } | 
| 82 | |||
| 83 | |||
| 84 | void model_box (Model* model, float* points) | ||
| 85 | { | ||
| 86 | vec3* v = model->vertices; | ||
| 87 | |||
| 88 | unsigned f; | ||
| 89 | for (f = 0; f < model->numFrames; ++f) | ||
| 90 | { | ||
| 91 | float xmin = v->x; | ||
| 92 | float xmax = v->x; | ||
| 93 | float ymin = v->y; | ||
| 94 | float ymax = v->y; | ||
| 95 | |||
| 96 | unsigned i; | ||
| 97 | for (i = 0; i < model->numVertices; ++i, ++v) | ||
| 98 | { | ||
| 99 | xmin = fmin (xmin, v->x); | ||
| 100 | ymin = fmin (ymin, v->y); | ||
| 101 | xmax = fmax (xmax, v->x); | ||
| 102 | ymax = fmax (ymax, v->y); | ||
| 103 | } | ||
| 104 | |||
| 105 | *points++ = xmin; *points++ = ymin; | ||
| 106 | *points++ = xmax; *points++ = ymax; | ||
| 107 | } | ||
| 108 | } | ||
| diff --git a/Spear/Assets/Model/Model.h b/Spear/Assets/Model/Model.h index 0532322..eb9c39b 100644 --- a/Spear/Assets/Model/Model.h +++ b/Spear/Assets/Model/Model.h | |||
| @@ -90,6 +90,9 @@ void model_to_ground (Model* model); | |||
| 90 | /// Copy the triangles of the given frame from the Model into the given array. | 90 | /// Copy the triangles of the given frame from the Model into the given array. | 
| 91 | void model_copy_triangles (Model* model, unsigned frame, model_triangle* tris); | 91 | void model_copy_triangles (Model* model, unsigned frame, model_triangle* tris); | 
| 92 | 92 | ||
| 93 | /// Compute the model's 2d AABBs. | ||
| 94 | void model_compute_boxes (Model* model, float* points); | ||
| 95 | |||
| 93 | #ifdef __cplusplus | 96 | #ifdef __cplusplus | 
| 94 | } | 97 | } | 
| 95 | #endif | 98 | #endif | 
| diff --git a/Spear/Render/AnimatedModel.hs b/Spear/Render/AnimatedModel.hs index cc31f12..8db87c3 100644 --- a/Spear/Render/AnimatedModel.hs +++ b/Spear/Render/AnimatedModel.hs | |||
| @@ -9,6 +9,7 @@ module Spear.Render.AnimatedModel | |||
| 9 | , currentAnimation | 9 | , currentAnimation | 
| 10 | , bind | 10 | , bind | 
| 11 | , render | 11 | , render | 
| 12 | , update | ||
| 12 | ) | 13 | ) | 
| 13 | where | 14 | where | 
| 14 | 15 | ||
| @@ -18,10 +19,10 @@ import Spear.Render.Model | |||
| 18 | import Spear.GLSL | 19 | import Spear.GLSL | 
| 19 | import Spear.Render.Material | 20 | import Spear.Render.Material | 
| 20 | import Spear.Render.Program | 21 | import Spear.Render.Program | 
| 21 | import Spear.Updatable | ||
| 22 | import Spear.Setup as Setup | 22 | import Spear.Setup as Setup | 
| 23 | 23 | ||
| 24 | import Control.Applicative ((<$>), (<*>)) | 24 | import Control.Applicative ((<$>), (<*>)) | 
| 25 | import qualified Data.Vector as V | ||
| 25 | import Graphics.Rendering.OpenGL.Raw.Core31 | 26 | import Graphics.Rendering.OpenGL.Raw.Core31 | 
| 26 | import Unsafe.Coerce (unsafeCoerce) | 27 | import Unsafe.Coerce (unsafeCoerce) | 
| 27 | 28 | ||
| @@ -36,6 +37,7 @@ data AnimatedModelResource = AnimatedModelResource | |||
| 36 | , nVertices :: Int | 37 | , nVertices :: Int | 
| 37 | , material :: Material | 38 | , material :: Material | 
| 38 | , texture :: Texture | 39 | , texture :: Texture | 
| 40 | , boxes :: V.Vector Box | ||
| 39 | , rkey :: Resource | 41 | , rkey :: Resource | 
| 40 | } | 42 | } | 
| 41 | 43 | ||
| @@ -89,6 +91,7 @@ animatedModelResource | |||
| 89 | RenderModel elements numFrames numVertices <- setupIO . renderModelFromModel $ model | 91 | RenderModel elements numFrames numVertices <- setupIO . renderModelFromModel $ model | 
| 90 | elementBuf <- newBuffer | 92 | elementBuf <- newBuffer | 
| 91 | vao <- newVAO | 93 | vao <- newVAO | 
| 94 | boxes <- setupIO $ modelBoxes model | ||
| 92 | 95 | ||
| 93 | setupIO $ do | 96 | setupIO $ do | 
| 94 | 97 | ||
| @@ -119,7 +122,8 @@ animatedModelResource | |||
| 119 | releaseBuffer elementBuf | 122 | releaseBuffer elementBuf | 
| 120 | 123 | ||
| 121 | return $ AnimatedModelResource | 124 | return $ AnimatedModelResource | 
| 122 | model vao (unsafeCoerce numFrames) (unsafeCoerce numVertices) material texture rkey | 125 | model vao (unsafeCoerce numFrames) (unsafeCoerce numVertices) | 
| 126 | material texture boxes rkey | ||
| 123 | 127 | ||
| 124 | 128 | ||
| 125 | -- | Release the given 'AnimatedModelResource'. | 129 | -- | Release the given 'AnimatedModelResource'. | 
| @@ -132,16 +136,17 @@ animatedModelRenderer :: AnimatedModelResource -> AnimatedModelRenderer | |||
| 132 | animatedModelRenderer modelResource = AnimatedModelRenderer modelResource 0 0 0 0 0 | 136 | animatedModelRenderer modelResource = AnimatedModelRenderer modelResource 0 0 0 0 0 | 
| 133 | 137 | ||
| 134 | 138 | ||
| 135 | instance Updatable AnimatedModelRenderer where | 139 | -- | Update the 'AnimatedModelRenderer'. | 
| 136 | 140 | update dt (AnimatedModelRenderer model curAnim startFrame endFrame curFrame fp) = | |
| 137 | update dt (AnimatedModelRenderer model curAnim startFrame endFrame curFrame fp) = | 141 | AnimatedModelRenderer model curAnim startFrame endFrame curFrame' fp' | 
| 138 | AnimatedModelRenderer model curAnim startFrame endFrame curFrame' fp' | 142 | where f = fp + dt | 
| 139 | where f = fp + dt | 143 | nextFrame = f >= 1.0 | 
| 140 | nextFrame = f >= 1.0 | 144 | fp' = if nextFrame then f - 1.0 else f | 
| 141 | fp' = if nextFrame then f - 1.0 else f | 145 | curFrame' = if nextFrame | 
| 142 | curFrame' = if nextFrame | 146 | then | 
| 143 | then let x = curFrame + 1 in if x > endFrame then startFrame else x | 147 | let x = curFrame + 1 | 
| 144 | else curFrame | 148 | in if x > endFrame then startFrame else x | 
| 149 | else curFrame | ||
| 145 | 150 | ||
| 146 | 151 | ||
| 147 | -- | Set the active animation to the given one. | 152 | -- | Set the active animation to the given one. | 
| diff --git a/Spear/Render/StaticModel.hs b/Spear/Render/StaticModel.hs index 05e80e4..cefb7ed 100644 --- a/Spear/Render/StaticModel.hs +++ b/Spear/Render/StaticModel.hs | |||
| @@ -18,6 +18,7 @@ import Spear.Render.Material | |||
| 18 | import Spear.Render.Program | 18 | import Spear.Render.Program | 
| 19 | import Spear.Setup as Setup | 19 | import Spear.Setup as Setup | 
| 20 | 20 | ||
| 21 | import qualified Data.Vector as V | ||
| 21 | import Graphics.Rendering.OpenGL.Raw.Core31 | 22 | import Graphics.Rendering.OpenGL.Raw.Core31 | 
| 22 | import Unsafe.Coerce (unsafeCoerce) | 23 | import Unsafe.Coerce (unsafeCoerce) | 
| 23 | 24 | ||
| @@ -27,6 +28,7 @@ data StaticModelResource = StaticModelResource | |||
| 27 | , nVertices :: Int | 28 | , nVertices :: Int | 
| 28 | , material :: Material | 29 | , material :: Material | 
| 29 | , texture :: Texture | 30 | , texture :: Texture | 
| 31 | , boxes :: V.Vector Box | ||
| 30 | , rkey :: Resource | 32 | , rkey :: Resource | 
| 31 | } | 33 | } | 
| 32 | 34 | ||
| @@ -61,6 +63,7 @@ staticModelResource (StaticProgramChannels vertChan normChan texChan) material t | |||
| 61 | RenderModel elements _ numVertices <- setupIO . renderModelFromModel $ model | 63 | RenderModel elements _ numVertices <- setupIO . renderModelFromModel $ model | 
| 62 | elementBuf <- newBuffer | 64 | elementBuf <- newBuffer | 
| 63 | vao <- newVAO | 65 | vao <- newVAO | 
| 66 | boxes <- setupIO $ modelBoxes model | ||
| 64 | 67 | ||
| 65 | setupIO $ do | 68 | setupIO $ do | 
| 66 | 69 | ||
| @@ -85,9 +88,9 @@ staticModelResource (StaticProgramChannels vertChan normChan texChan) material t | |||
| 85 | setupIO $ putStrLn "Releasing static model resource" | 88 | setupIO $ putStrLn "Releasing static model resource" | 
| 86 | releaseVAO vao | 89 | releaseVAO vao | 
| 87 | releaseBuffer elementBuf | 90 | releaseBuffer elementBuf | 
| 88 | --sequence_ . fmap releaseBuffer $ [elementBuf, indexBuf] | ||
| 89 | 91 | ||
| 90 | return $ StaticModelResource vao (unsafeCoerce numVertices) material texture rkey | 92 | return $ StaticModelResource | 
| 93 | vao (unsafeCoerce numVertices) material texture boxes rkey | ||
| 91 | 94 | ||
| 92 | 95 | ||
| 93 | -- | Release the given 'StaticModelResource'. | 96 | -- | Release the given 'StaticModelResource'. | 
