diff options
-rw-r--r-- | Spear.lkshs | 10 | ||||
-rw-r--r-- | Spear.lkshw | 2 | ||||
-rw-r--r-- | Spear/Assets/Model.hsc | 62 | ||||
-rw-r--r-- | Spear/Assets/Model/Model.c | 19 | ||||
-rw-r--r-- | Spear/Assets/Model/Model.h | 9 | ||||
-rw-r--r-- | Spear/Scene/Loader.hs | 21 |
6 files changed, 76 insertions, 47 deletions
diff --git a/Spear.lkshs b/Spear.lkshs index 26a1ff6..a3f492f 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 7 23:33:12 CEST 2012" | 4 | "Wed Aug 8 13:25:10 CEST 2012" |
5 | Layout: VerticalP (TerminalP {paneGroups = fromList [], paneTabs = Just TopP, currentPage = 2, 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}) 263) 197)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 691) 954 | 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}) 273) 205)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 716) 954 |
6 | Population: [(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs" 75)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collisioner.hs" 551)),[SplitP LeftP]),(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/demos/simple-scene/GameObject.hs" 3124)),[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 286 (SystemScope,False) (Nothing,Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics.hs" 207)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/Rigid.hs" 2175)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Math/Spatial.hs" 0)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/Types.hs" 194)),[SplitP LeftP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/World.hs" 3782)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/demos/simple-scene/main.hs" 1603)),[SplitP LeftP])] | 6 | Population: [(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/demos/simple-scene/GameObject.hs" 3129)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/IDStore.hs" 186)),[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 286 (PackageScope False,False) (Nothing,Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([[5]],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics.hs" 207)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/Rigid.hs" 2175)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Math/Spatial.hs" 0)),[SplitP LeftP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/World.hs" 3781)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/demos/simple-scene/main.hs" 1603)),[SplitP LeftP])] |
7 | Window size: (1841,964) | 7 | Window size: (1841,964) |
8 | Completion size: | 8 | Completion size: |
9 | (750,400) | 9 | (750,400) |
10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" | 10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" |
11 | Active pane: Just "GameObject.hs" | 11 | Active pane: Just "IDStore.hs" |
12 | Toolbar visible: | 12 | Toolbar visible: |
13 | True | 13 | True |
14 | FindbarState: (False,FindState {entryStr = "asd", entryHist = ["gravity","asdad","rotSpeed","azimuth","mandatory","mandao","col","forward","MouseButton"], replaceStr = "mandatory'", replaceHist = [], caseSensitive = False, entireWord = False, wrapAround = False, regex = False, lineNr = 1}) | 14 | FindbarState: (False,FindState {entryStr = "asd", entryHist = ["gravity","asdad","rotSpeed","azimuth","mandatory","mandao","col","forward","MouseButton"], replaceStr = "mandatory'", replaceHist = [], caseSensitive = False, entireWord = False, wrapAround = False, regex = False, lineNr = 1}) |
15 | Recently opened files: | 15 | Recently opened files: |
16 | ["/home/jeanne/programming/haskell/Spear/Spear/App/Input.hs"] | 16 | ["/home/jeanne/programming/haskell/Spear/demos/simple-scene/Spear/IDStore.hs","/home/jeanne/programming/haskell/Spear/Spear/Physics/Types.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/App/Input.hs"] |
17 | Recently opened workspaces: | 17 | Recently opened workspaces: |
18 | ["/home/jeanne/leksah.lkshw"] \ No newline at end of file | 18 | ["/home/jeanne/leksah.lkshw"] \ No newline at end of file |
diff --git a/Spear.lkshw b/Spear.lkshw index ef77439..cc572e4 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 | "Wed Aug 8 12:06:13 CEST 2012" | 4 | "Wed Aug 8 15:15:08 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 5fd2db3..9e718c7 100644 --- a/Spear/Assets/Model.hsc +++ b/Spear/Assets/Model.hsc | |||
@@ -29,7 +29,8 @@ module Spear.Assets.Model | |||
29 | , animationByName | 29 | , animationByName |
30 | , numAnimations | 30 | , numAnimations |
31 | -- * Manipulation | 31 | -- * Manipulation |
32 | , transform | 32 | , transformVerts |
33 | , transformNormals | ||
33 | , toGround | 34 | , toGround |
34 | ) | 35 | ) |
35 | where | 36 | where |
@@ -232,72 +233,72 @@ fromCAnimation (CAnimation cname start end) = | |||
232 | Animation (B.unpack cname) (fromIntegral start) (fromIntegral end) | 233 | Animation (B.unpack cname) (fromIntegral start) (fromIntegral end) |
233 | 234 | ||
234 | 235 | ||
235 | -- | Release the given 'Model'. | 236 | -- | Release the model. |
236 | releaseModel :: Model -> Setup () | 237 | releaseModel :: Model -> Setup () |
237 | releaseModel = release . rkey | 238 | releaseModel = release . rkey |
238 | 239 | ||
239 | 240 | ||
240 | -- | Free the given 'CModel'. | 241 | -- | Free the C model. |
241 | freeModel :: CModel -> IO () | 242 | freeModel :: CModel -> IO () |
242 | freeModel model = Foreign.with model model_free | 243 | freeModel model = Foreign.with model model_free |
243 | 244 | ||
244 | 245 | ||
245 | -- | Return 'True' if the given 'Model' is animated, 'False' otherwise. | 246 | -- | Return 'True' if the model is animated, 'False' otherwise. |
246 | animated :: Model -> Bool | 247 | animated :: Model -> Bool |
247 | animated = (>1) . numFrames | 248 | animated = (>1) . numFrames |
248 | 249 | ||
249 | 250 | ||
250 | -- | Return the given 'Model's vertices. | 251 | -- | Return the model's vertices. |
251 | vertices :: Model -> Ptr Vec3 | 252 | vertices :: Model -> Ptr Vec3 |
252 | vertices = cVerts . modelData | 253 | vertices = cVerts . modelData |
253 | 254 | ||
254 | 255 | ||
255 | -- | Return the given 'Model's normals. | 256 | -- | Return the model's normals. |
256 | normals :: Model -> Ptr Vec3 | 257 | normals :: Model -> Ptr Vec3 |
257 | normals = cNormals . modelData | 258 | normals = cNormals . modelData |
258 | 259 | ||
259 | 260 | ||
260 | -- | Return the given 'Model's texCoords. | 261 | -- | Return the model's texCoords. |
261 | texCoords :: Model -> Ptr TexCoord | 262 | texCoords :: Model -> Ptr TexCoord |
262 | texCoords = cTexCoords . modelData | 263 | texCoords = cTexCoords . modelData |
263 | 264 | ||
264 | 265 | ||
265 | -- | Return the given 'Model's triangles. | 266 | -- | Return the model's triangles. |
266 | triangles :: Model -> Ptr Triangle | 267 | triangles :: Model -> Ptr Triangle |
267 | triangles = cTris . modelData | 268 | triangles = cTris . modelData |
268 | 269 | ||
269 | 270 | ||
270 | -- | Return the given 'Model's skins. | 271 | -- | Return the model's skins. |
271 | skins :: Model -> Ptr Skin | 272 | skins :: Model -> Ptr Skin |
272 | skins = cSkins . modelData | 273 | skins = cSkins . modelData |
273 | 274 | ||
274 | 275 | ||
275 | -- | Return the given 'Model's number of frames. | 276 | -- | Return the model's number of frames. |
276 | numFrames :: Model -> Int | 277 | numFrames :: Model -> Int |
277 | numFrames = fromIntegral . cnFrames . modelData | 278 | numFrames = fromIntegral . cnFrames . modelData |
278 | 279 | ||
279 | 280 | ||
280 | -- | Return the given 'Model's number of vertices. | 281 | -- | Return the model's number of vertices. |
281 | numVertices :: Model -> Int | 282 | numVertices :: Model -> Int |
282 | numVertices = fromIntegral . cnVerts . modelData | 283 | numVertices = fromIntegral . cnVerts . modelData |
283 | 284 | ||
284 | 285 | ||
285 | -- | Return the given 'Model's number of triangles. | 286 | -- | Return the model's number of triangles. |
286 | numTriangles :: Model -> Int | 287 | numTriangles :: Model -> Int |
287 | numTriangles = fromIntegral . cnTris . modelData | 288 | numTriangles = fromIntegral . cnTris . modelData |
288 | 289 | ||
289 | 290 | ||
290 | -- | Return the given 'Model's number of texture coordinates. | 291 | -- | Return the model's number of texture coordinates. |
291 | numTexCoords :: Model -> Int | 292 | numTexCoords :: Model -> Int |
292 | numTexCoords = fromIntegral . cnTexCoords . modelData | 293 | numTexCoords = fromIntegral . cnTexCoords . modelData |
293 | 294 | ||
294 | 295 | ||
295 | -- | Return the given 'Model's number of skins. | 296 | -- | Return the model's number of skins. |
296 | numSkins :: Model -> Int | 297 | numSkins :: Model -> Int |
297 | numSkins = fromIntegral . cnSkins . modelData | 298 | numSkins = fromIntegral . cnSkins . modelData |
298 | 299 | ||
299 | 300 | ||
300 | -- | Return the underlying 'CModel'. | 301 | -- | Return the underlying C model. |
301 | cmodel :: Model -> CModel | 302 | cmodel :: Model -> CModel |
302 | cmodel = modelData | 303 | cmodel = modelData |
303 | 304 | ||
@@ -312,27 +313,38 @@ animationByName :: Model -> String -> Maybe Animation | |||
312 | animationByName model anim = V.find ((==) anim . name) $ mAnimations model | 313 | animationByName model anim = V.find ((==) anim . name) $ mAnimations model |
313 | 314 | ||
314 | 315 | ||
315 | -- | Return the number of animations in the given 'Model'. | 316 | -- | Return the number of animations of the given model. |
316 | numAnimations :: Model -> Int | 317 | numAnimations :: Model -> Int |
317 | numAnimations = V.length . mAnimations | 318 | numAnimations = V.length . mAnimations |
318 | 319 | ||
319 | 320 | ||
320 | -- | Transform the given 'Model's vertices with the given matrix. | 321 | -- | Transform the model's vertices with the given matrix. |
321 | transform :: M4.Matrix4 -> Model -> IO () | 322 | transformVerts :: M4.Matrix4 -> Model -> IO () |
322 | transform mat (Model model _ _) = | 323 | transformVerts mat (Model model _ _) = |
323 | allocaBytes (16*sizeFloat) $ \matPtr -> | 324 | allocaBytes (16*sizeFloat) $ \matPtr -> |
324 | allocaBytes (9*sizeFloat) $ \normalPtr -> | ||
325 | with model $ \modelPtr -> do | 325 | with model $ \modelPtr -> do |
326 | poke matPtr mat | 326 | poke matPtr mat |
327 | poke normalPtr $ fastNormalMatrix mat | 327 | model_transform_vertices modelPtr matPtr |
328 | model_transform modelPtr matPtr normalPtr | ||
329 | 328 | ||
330 | 329 | ||
331 | foreign import ccall "Model.h model_transform" | 330 | -- | Transform the model's normals with the given matrix. |
332 | model_transform :: Ptr CModel -> Ptr M4.Matrix4 -> Ptr M3.Matrix3 -> IO () | 331 | transformNormals :: M3.Matrix3 -> Model -> IO () |
332 | transformNormals mat (Model model _ _) = | ||
333 | allocaBytes (9*sizeFloat) $ \normalPtr -> | ||
334 | with model $ \modelPtr -> do | ||
335 | poke normalPtr mat | ||
336 | model_transform_normals modelPtr normalPtr | ||
337 | |||
338 | |||
339 | foreign import ccall "Model.h model_transform_vertices" | ||
340 | model_transform_vertices :: Ptr CModel -> Ptr M4.Matrix4 -> IO () | ||
341 | |||
342 | |||
343 | foreign import ccall "Model.h model_transform_normals" | ||
344 | model_transform_normals :: Ptr CModel -> Ptr M3.Matrix3 -> IO () | ||
333 | 345 | ||
334 | 346 | ||
335 | -- | Transform the given 'Model' such that its lowest point has y = 0. | 347 | -- | Transform the model such that its lowest point has y = 0. |
336 | toGround :: Model -> IO () | 348 | toGround :: Model -> IO () |
337 | toGround (Model model _ _) = with model model_to_ground | 349 | toGround (Model model _ _) = with model model_to_ground |
338 | 350 | ||
diff --git a/Spear/Assets/Model/Model.c b/Spear/Assets/Model/Model.c index 837dd93..f6b2f1f 100644 --- a/Spear/Assets/Model/Model.c +++ b/Spear/Assets/Model/Model.c | |||
@@ -56,19 +56,28 @@ static void mul_normal (float m[9], vec3* n) | |||
56 | } | 56 | } |
57 | 57 | ||
58 | 58 | ||
59 | void model_transform (Model* model, float mat[16], float normal[9]) | 59 | void model_transform_vertices (Model* model, float mat[16]) |
60 | { | 60 | { |
61 | unsigned i = 0; | 61 | unsigned i = 0; |
62 | unsigned j = model->numVertices * model->numFrames; | 62 | unsigned j = model->numVertices * model->numFrames; |
63 | vec3* v = model->vertices; | 63 | vec3* v = model->vertices; |
64 | vec3* n = model->normals; | ||
65 | 64 | ||
66 | for (; i < j; ++i) | 65 | for (; i < j; ++i, ++v) |
67 | { | 66 | { |
68 | mul (mat, v); | 67 | mul (mat, v); |
68 | } | ||
69 | } | ||
70 | |||
71 | |||
72 | void model_transform_normals (Model* model, float normal[9]) | ||
73 | { | ||
74 | unsigned i = 0; | ||
75 | unsigned j = model->numVertices * model->numFrames; | ||
76 | vec3* n = model->normals; | ||
77 | |||
78 | for (; i < j; ++i, ++n) | ||
79 | { | ||
69 | mul_normal (normal, n); | 80 | mul_normal (normal, n); |
70 | v++; | ||
71 | n++; | ||
72 | } | 81 | } |
73 | } | 82 | } |
74 | 83 | ||
diff --git a/Spear/Assets/Model/Model.h b/Spear/Assets/Model/Model.h index 34c6444..84be6aa 100644 --- a/Spear/Assets/Model/Model.h +++ b/Spear/Assets/Model/Model.h | |||
@@ -69,10 +69,13 @@ extern "C" { | |||
69 | /// The 'model' pointer itself is not freed. | 69 | /// The 'model' pointer itself is not freed. |
70 | void model_free (Model* model); | 70 | void model_free (Model* model); |
71 | 71 | ||
72 | /// Transform the given Model's vertices by the given matrix. | 72 | /// Transform the Model's vertices by the given matrix. |
73 | void model_transform (Model* model, float mat[16], float normal[9]); | 73 | void model_transform_verts (Model* model, float mat[16]); |
74 | 74 | ||
75 | /// Translate the given Model such that its lowest point has y = 0. | 75 | /// Transform the Model's normals by the given matrix. |
76 | void model_transform_normals (Model* model, float normal[9]); | ||
77 | |||
78 | /// Translate the Model such that its lowest point has y = 0. | ||
76 | void model_to_ground (Model* model); | 79 | void model_to_ground (Model* model); |
77 | 80 | ||
78 | #ifdef __cplusplus | 81 | #ifdef __cplusplus |
diff --git a/Spear/Scene/Loader.hs b/Spear/Scene/Loader.hs index 6001bdb..06e0aa9 100644 --- a/Spear/Scene/Loader.hs +++ b/Spear/Scene/Loader.hs | |||
@@ -20,6 +20,7 @@ where | |||
20 | import Spear.Assets.Model as Model | 20 | import Spear.Assets.Model as Model |
21 | import qualified Spear.GLSL as GLSL | 21 | import qualified Spear.GLSL as GLSL |
22 | import Spear.Math.Matrix4 as M4 | 22 | import Spear.Math.Matrix4 as M4 |
23 | import Spear.Math.MatrixUtils (fastNormalMatrix) | ||
23 | import Spear.Math.Vector3 as V3 | 24 | import Spear.Math.Vector3 as V3 |
24 | import Spear.Math.Vector4 | 25 | import Spear.Math.Vector4 |
25 | import Spear.Render.AnimatedModel | 26 | import Spear.Render.AnimatedModel |
@@ -192,20 +193,24 @@ loadModel' file rotation scale = do | |||
192 | Just rot -> setupIO $ rotateModel model rot | 193 | Just rot -> setupIO $ rotateModel model rot |
193 | Nothing -> return () | 194 | Nothing -> return () |
194 | case scale of | 195 | case scale of |
195 | Just s -> setupIO $ Model.transform (scalev s) model | 196 | Just s -> setupIO $ Model.transformVerts (scalev s) model |
196 | Nothing -> return () | 197 | Nothing -> return () |
197 | setupIO $ toGround model | 198 | setupIO $ toGround model |
198 | return model | 199 | return model |
199 | 200 | ||
200 | 201 | ||
201 | rotateModel :: Model -> Rotation -> IO () | 202 | rotateModel :: Model -> Rotation -> IO () |
202 | rotateModel model (Rotation x y z order) = case order of | 203 | rotateModel model (Rotation x y z order) = |
203 | XYZ -> Model.transform (rotZ z * rotY y * rotX x) model | 204 | let mat = case order of |
204 | XZY -> Model.transform (rotY y * rotZ z * rotX x) model | 205 | XYZ -> rotZ z * rotY y * rotX x |
205 | YXZ -> Model.transform (rotZ z * rotX x * rotY y) model | 206 | XZY -> rotY y * rotZ z * rotX x |
206 | YZX -> Model.transform (rotX x * rotZ z * rotY y) model | 207 | YXZ -> rotZ z * rotX x * rotY y |
207 | ZXY -> Model.transform (rotY y * rotX x * rotZ z) model | 208 | YZX -> rotX x * rotZ z * rotY y |
208 | ZYX -> Model.transform (rotX x * rotY y * rotZ z) model | 209 | ZXY -> rotY y * rotX x * rotZ z |
210 | ZYX -> rotX x * rotY y * rotZ z | ||
211 | normalMat = fastNormalMatrix mat | ||
212 | in | ||
213 | Model.transformVerts mat model >> Model.transformNormals normalMat model | ||
209 | 214 | ||
210 | 215 | ||
211 | loadTexture :: FilePath -> Loader GLSL.Texture | 216 | loadTexture :: FilePath -> Loader GLSL.Texture |