1
- {-# LANGUAGE OverloadedStrings #-}
1
+ {-# LANGUAGE StandaloneDeriving #-}
2
2
module Sprite where
3
3
-- TODO: prune
4
4
import Control.Monad
5
5
import Control.Monad.Reader
6
6
import Data.CaseInsensitive hiding (map )
7
7
import Data.Foldable
8
8
import Data.IORef
9
- import Data.Array.IO as AI
10
- import qualified Data.ByteString as BS
11
- import qualified Data.ByteString.Char8 as BSC
12
- import qualified Data.Map as M
9
+ import Data.Array.IO as AI
10
+ import qualified Data.ByteString as BS
11
+ import qualified Data.ByteString.Char8 as BSC
12
+ import qualified Data.Map as M
13
13
import Data.Maybe
14
+ import Data.Char
14
15
import Foreign
15
16
import Foreign.C.String
16
17
import Game
17
- import qualified Game.Waddle as WAD
18
+ import qualified Game.Waddle as WAD
18
19
import GLUtils
19
20
import Graphics.GL.Core33
20
21
import Graphics.UI.GLFW
21
22
import Linear
22
23
import Var
23
24
import Window
25
+ import Types
24
26
import TextureLoader
27
+ import SpriteMap
25
28
import Data.Array.IO
26
- import Data.List
27
29
28
- testSpriteVbo :: Float -> Float -> [GLfloat ]
29
- testSpriteVbo k n = [
30
- - 1 / 8 , 1 , 0.0 , k / n , 0.0 ,
31
- 1 / 8 , 1 , 0.0 , (k + 1 ) / n , 0.0 ,
32
- - 1 / 8 , - 1 , 0.0 , k / n , 1 ,
33
- 1 / 8 , - 1 , 0.0 , (k + 1 ) / n , 1 ]
30
+ testSpriteVbo :: [GLfloat ]
31
+ testSpriteVbo = [
32
+ - 0.5 , 0.5 , 0.0 , 0.0 , 0.0 ,
33
+ 0.5 , 0.5 , 0.0 , 1.0 , 0.0 ,
34
+ - 0.5 , - 0.5 , 0.0 , 0.0 , 1.0 ,
35
+ 0.5 , - 0.5 , 0.0 , 1.0 , 1.0 ]
34
36
35
37
testSpriteEbo :: [GLuint ]
36
38
testSpriteEbo = [
37
39
0 , 1 , 2 ,
38
40
2 , 1 , 3 ]
39
41
40
- loadSprite :: [WAD. Sprite ] -> IO [Word8 ]
41
- loadSprite sprites@ (s: _) = do
42
- let pic = WAD. spritePicture s
42
+ loadSpriteColor :: WAD. Sprite -> ColorPalette -> IO [GLfloat ]
43
+ loadSpriteColor sprite cp
44
+ = unpackTuples <$> (textureDataToColor cp <$> loadSprite sprite)
45
+
46
+ loadSprite :: WAD. Sprite -> IO [Word8 ]
47
+ loadSprite sprite = do
48
+ let pic = WAD. spritePicture sprite
43
49
let fW = WAD. pictureWidth pic
44
50
let fH = WAD. pictureHeight pic
45
- pxArr <- AI. newArray (0 , fW * fH * length sprites ) (0xFF :: Word8 )
51
+ pxArr <- AI. newArray (0 , fW * fH) (0xFF :: Word8 )
46
52
:: IO (IOArray Int Word8 )
47
- forM_ ( zip [ 0 .. ] sprites) $ \ (n, col) -> do
48
- let posts = WAD. picturePosts pic
49
- forM_ ( zip [ 0 .. ] posts) $ \ (x, col) ->
50
- forM_ col $ \ post -> do
51
- let tx = x
52
- forM_ ( zip [ 0 .. ] ( BS. unpack $ WAD. postPixels post)) $ \ (i, pt) -> do
53
- let ty = ( fromIntegral $ WAD. postTop post) + i
54
- writeArray pxArr (tx + ty * fW + fW * n) pt
53
+ let posts = WAD. picturePosts pic
54
+ forM_ ( zip [ 0 .. ] posts) $ \ (x, col) ->
55
+ forM_ col $ \ post -> do
56
+ let tx = x
57
+ forM_ ( zip [ 0 .. ] ( BS. unpack $ WAD. postPixels post)) $ \ (i, pt) -> do
58
+ let ty = ( fromIntegral $ WAD. postTop post) + i
59
+ when (tx <= fW - 1 && ty <= fH - 1 && tx >= 0 && ty >= 0 ) $
60
+ writeArray pxArr (tx + ty * fW) pt
55
61
getElems pxArr
56
62
63
+ createLevelThings :: WAD. Wad -> GLuint -> [WAD. Thing ] -> IO [Sprite ]
64
+ createLevelThings wad progId things
65
+ = mapM (\ t -> makeSprite' (mkVbo t) (mkEbo t) (Just t) wad progId (thingToSprite $ WAD. thingType t))
66
+ (filter (\ t ->
67
+ notElem (thingTypeToInt $ WAD. thingType t) reservedSpriteIds)
68
+ things)
69
+ where
70
+ pW = 3 -- fixME, ugly
71
+ pH = 3 -- fixME, ugly
72
+ tx t = fromIntegral (WAD. thingX t) / scale
73
+ ty t = fromIntegral (WAD. thingY t) / scale
74
+ mkVbo t = [ - tx t, pW, ty t, 1 , 0
75
+ , - tx t + pH, pW, ty t + pH, 0 , 0
76
+ , - tx t, 0 , ty t, 1 , 1
77
+ , - tx t + pH, 0 , ty t + pH, 0 , 1
78
+ ]
79
+ mkEbo t = [
80
+ 0 , 1 , 2 ,
81
+ 2 , 1 , 3 ]
82
+
57
83
makeSprite :: WAD. Wad -> GLuint -> WAD. LumpName -> IO Sprite
58
- makeSprite wad progId spriteName = do
84
+ makeSprite
85
+ = makeSprite' testSpriteVbo testSpriteEbo Nothing
86
+
87
+ findSpriteName :: WAD. Wad -> WAD. LumpName -> WAD. LumpName
88
+ findSpriteName wad name
89
+ = findSpriteName' wad name " A" " 0"
90
+ where
91
+ findSpriteName' wad name f@ (a : as) g@ (b : bs)
92
+ | isNothing p = findSpriteName' wad name (na : as) (nb : bs)
93
+ | otherwise = t
94
+ where
95
+ p = M. lookup (mk t) (WAD. wadSprites wad)
96
+ t = BS. append (BS. append name (BSC. pack f)) (BSC. pack g)
97
+ na = chr ((ord a) + 1 )
98
+ nb = chr ((ord b) + 1 )
99
+
100
+ makeSprite' :: [GLfloat ] -> [GLuint ] -> Maybe WAD. Thing -> WAD. Wad -> GLuint -> WAD. LumpName -> IO Sprite
101
+ makeSprite' vbo ebo thing wad progId spriteName' = do
102
+ let spriteName = if (length (BS. unpack spriteName') == 4 ) then
103
+ findSpriteName wad spriteName'
104
+ else
105
+ spriteName'
106
+
59
107
vaoId <- withNewPtr (glGenVertexArrays 1 )
60
108
glBindVertexArray vaoId
61
109
62
110
vboId <- withNewPtr (glGenBuffers 1 )
63
111
glBindBuffer GL_ARRAY_BUFFER vboId
64
- -- needs unhardcoding
65
- withArrayLen (testSpriteVbo 0 8 ) $ \ len vertices ->
112
+ withArrayLen vbo $ \ len vertices ->
66
113
glBufferData GL_ARRAY_BUFFER
67
114
(fromIntegral $ len * sizeOf (0 :: GLfloat ))
68
115
(vertices :: Ptr GLfloat )
69
116
GL_STATIC_DRAW
70
117
71
118
eboId <- withNewPtr (glGenBuffers 1 )
72
119
glBindBuffer GL_ELEMENT_ARRAY_BUFFER eboId
73
- withArrayLen testSpriteEbo $ \ len vertices ->
120
+ withArrayLen ebo $ \ len vertices ->
74
121
glBufferData GL_ELEMENT_ARRAY_BUFFER
75
122
(fromIntegral $ len * sizeOf (0 :: GLuint ))
76
123
(vertices :: Ptr GLuint )
77
124
GL_STATIC_DRAW
78
125
79
126
-- load sprite image
80
- let spriteMap = WAD. wadSprites wad
81
- let sprites @ (sprite : _) = catMaybes [ M. lookup (mk $ BS. concat [ spriteName, BSC. singleton c, " 1 " ]) spriteMap | c <- [ ' A ' .. ' Z ' ]]
127
+ let sprite = fromMaybe ( error ( " invalid sprite " ++ ( BSC. unpack spriteName)))
128
+ ( M. lookup (mk spriteName) ( WAD. wadSprites wad))
82
129
let loadedPalette = loadPalettes wad
83
- p <- loadSprite sprites
130
+ p <- loadSprite sprite
84
131
let spritePixels = unpackTuples (textureDataToColor loadedPalette p)
85
132
let sW = fromIntegral $ WAD. pictureWidth $ WAD. spritePicture sprite
86
133
let sH = fromIntegral $ WAD. pictureHeight $ WAD. spritePicture sprite
87
- n = length sprites
88
134
texId <- withNewPtr (glGenTextures 1 )
89
135
glBindTexture GL_TEXTURE_2D texId
90
136
@@ -93,7 +139,7 @@ makeSprite wad progId spriteName = do
93
139
glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER (fromIntegral GL_NEAREST )
94
140
glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER (fromIntegral GL_NEAREST )
95
141
withArray spritePixels $
96
- glTexImage2D GL_TEXTURE_2D 0 (fromIntegral GL_RGBA ) (sW * fromIntegral n) sH 0 GL_RGBA GL_FLOAT
142
+ glTexImage2D GL_TEXTURE_2D 0 (fromIntegral GL_RGBA ) sW sH 0 GL_RGBA GL_FLOAT
97
143
98
144
posAttrib <- get $ AttribLocation progId " position"
99
145
glEnableVertexAttribArray posAttrib
@@ -119,7 +165,13 @@ makeSprite wad progId spriteName = do
119
165
rdProg = progId,
120
166
rdEbo = eboId}
121
167
168
+ let v3 = if isNothing thing then
169
+ (V3 (vbo !! 0 ) (vbo !! 1 ) (vbo !! 2 ))
170
+ else let jt = fromJust thing in
171
+ (V3 (fromIntegral $ WAD. thingX jt) 0.0 (fromIntegral $ WAD. thingY jt))
172
+
122
173
Sprite <$> pure " Lev"
123
174
<*> newIORef False
124
175
<*> newIORef 0
125
176
<*> pure renderData
177
+ <*> pure v3
0 commit comments