@@ -2,86 +2,99 @@ path=require "path"
22fs = require " fs"
33Canvas = require " canvas"
44
5- module .exports = (pref ,size ,xpath ,buildPath ,totalImages ,atlasSize ,mini ,miniAtlasSize )->
6- createCanvas = Canvas .createCanvas
7- loadImage = Canvas .loadImage
8- Image = Canvas .Image
5+ class AtlasCreator
6+ constructor : (options )->
7+ @pref = options .pref
8+ @size = options .size
9+ @xpath = options .xpath
10+ @buildPath = options .buildPath
11+ @totalImages = options .totalImages
12+ @atlasSize = options .atlasSize
13+ @mini = options .mini
14+ @miniAtlasSize = options .miniAtlasSize
915
10- toxelX = 1
11- toxelY = 1
12- miniX = 1
13- miniY = 1
14- loadedImages = 0
15-
16- if not fs .existsSync buildPath
17- fs .mkdirSync buildPath
18-
19-
20- canvas = createCanvas atlasSize* size,atlasSize* size
21- ctx = canvas .getContext ' 2d'
22-
23- images = {}
24- textureMapping = {}
25- miniMapping = {}
26-
27- firstLoad = ->
28- fs .readdir xpath, (err , files )->
16+ @canvas = Canvas .createCanvas @atlasSize * @size ,@atlasSize * @size
17+ @ctx = @canvas .getContext ' 2d'
18+ @toxelX = 1
19+ @toxelY = 1
20+ @miniX = 1
21+ @miniY = 1
22+ @loadedImages = 0
23+ @images = {}
24+ @textureMapping = {}
25+ @miniMapping = {}
26+ @ emptyDir ()
27+ @ firstLoad ()
28+ return
29+ emptyDir : ()->
30+ if not fs .existsSync @buildPath
31+ fs .mkdirSync @buildPath
32+ return
33+ firstLoad : ()->
34+ _this = @
35+ fs .readdir @xpath , (err , files )->
2936 files .forEach (file)->
30- filePath = " #{ xpath} /#{ file} "
37+ filePath = " #{ _this . xpath } /#{ file} "
3138 if path .extname (file) is " .png"
32- addImageToLoad filePath,file
39+ # console.log filePath
40+ _this .addImageToLoad filePath,file
3341 return
3442 return
3543 return
36- addImageToLoad = (filePath ,name )->
37- img = new Image
44+ addImageToLoad : (filePath ,name )->
45+ _this = @
46+ img = new Canvas.Image
3847 img .onload = ->
39- images[name]= img
40- loadedImages++
41- if loadedImages is totalImages
42- forEachToxel ()
48+ _this . images [name]= img
49+ _this . loadedImages ++
50+ if _this . loadedImages is _this . totalImages
51+ _this . forEachToxel ()
4352 img .src = filePath
44- forEachToxel = ->
45- Object .keys (images).forEach (name)->
46- img = images[name]
47- addToxelToAtlas img,name
48- updateAtlas ()
49- addToxelToAtlas = (img ,name )->
50- w = img .width / size
51- h = img .height / size
53+ return
54+ forEachToxel : ()->
55+ _this = @
56+ Object .keys (@images ).forEach (name)->
57+ img = _this .images [name]
58+ _this .addToxelToAtlas img,name
59+ return
60+ @ updateAtlas ()
61+ addToxelToAtlas : (img ,name )->
62+ w = img .width / @size
63+ h = img .height / @size
5264 if w> 1 or h> 1
5365 for i in [0 .. w- 1 ]
5466 for j in [0 .. h- 1 ]
55- ctx .drawImage img,i* size,j* size,size,size,(toxelX- 1 )* size, ( toxelY- 1 )* size, size,size
56- textureMapping[name .substr (0 ,name .length - 4 )+ " @#{ i} @#{ j} " ]= {x : toxelX,y : toxelY}
57- moveToxel ()
67+ @ ctx .drawImage img,i* @ size ,j* @ size ,@ size ,@ size ,(@ toxelX- 1 )* @ size ,( @ toxelY- 1 )* @ size , @ size ,@ size
68+ @ textureMapping [" #{ name .substr (0 ,name .length - 4 )} @#{ i} @#{ j} " ]= {x : @ toxelX ,y : @ toxelY }
69+ @ moveToxel ()
5870 else
59- ctx .drawImage img, ( toxelX- 1 )* size, ( toxelY- 1 )* size, size,size
60- textureMapping[name .substr (0 ,name .length - 4 )]= {x : toxelX,y : toxelY}
61- moveToxel ()
62- if mini
63- miniMapping[name .substr (0 ,name .length - 4 )]= {x : miniX,y : miniY}
64- if miniX is miniAtlasSize
65- miniX = 1
66- miniY += 1
71+ @ ctx .drawImage img,( @ toxelX- 1 )* @ size ,( @ toxelY- 1 )* @ size ,@ size ,@ size
72+ @ textureMapping [name .substr (0 ,name .length - 4 )]= {x : @ toxelX ,y : @ toxelY }
73+ @ moveToxel ()
74+ if @ mini
75+ @ miniMapping [name .substr (0 ,name .length - 4 )]= {x : @ miniX ,y : @ miniY }
76+ if @ miniX is @ miniAtlasSize
77+ @ miniX= 1
78+ @ miniY+= 1
6779 else
68- miniX += 1
69- moveToxel = ->
70- if toxelX is atlasSize
71- toxelX = 1
72- toxelY += 1
80+ @miniX += 1
81+ return
82+ moveToxel : ()->
83+ if @toxelX is @atlasSize
84+ @toxelX = 1
85+ @toxelY += 1
7386 else
74- toxelX += 1
75- updateAtlas = (path )->
76- fs .writeFileSync " #{ buildPath} /#{ pref} Atlas-full.png" , canvas .toBuffer (' image/png' )
77- console .log " \x1b [33mSAVING: #{ buildPath} /#{ pref} Atlas-full.png"
78-
79- fs .writeFileSync " #{ buildPath} /#{ pref} Mapping-full.json" ,JSON .stringify (textureMapping,null ,2 )
80- console .log " \x1b [33mSAVING: #{ buildPath} /#{ pref} Mapping-full.json"
81- if mini
82- fs .writeFileSync " #{ buildPath} /#{ pref} Mapping.json" ,JSON .stringify (miniMapping,null ,2 )
83- console .log " \x1b [33mSAVING: #{ buildPath} /#{ pref} Mapping.json"
87+ @toxelX += 1
88+ return
89+ updateAtlas : (path )->
90+ fs .writeFileSync " #{ @buildPath } /#{ @pref } Atlas-full.png" , @canvas .toBuffer (' image/png' )
91+ console .log " \x1b [33mFull atlas: #{ @buildPath } /#{ @pref } Atlas-full.png"
92+ fs .writeFileSync " #{ @buildPath } /#{ @pref } Mapping-full.json" ,JSON .stringify (@textureMapping ,null ,2 )
93+ console .log " \x1b [33mFull atlas mapping: #{ @buildPath } /#{ @pref } Mapping-full.json"
94+ if @mini
95+ fs .writeFileSync " #{ @buildPath } /#{ @pref } Mapping.json" ,JSON .stringify (@miniMapping ,null ,2 )
96+ console .log " \x1b [33mMini atlas mapping: #{ @buildPath } /#{ @pref } Mapping.json"
97+ console .log " \x1b [32mSuccessfully generated #{ @canvas .width } x#{ @canvas .height } Texture Atlas!\n\x1b [0m"
98+ return
8499
85- console .log " \x1b [32mSuccessfully created #{ canvas .width } x#{ canvas .height } Texture Atlas!\n\x1b [0m"
86- firstLoad ()
87- return
100+ module .exports = AtlasCreator
0 commit comments