Skip to content

Commit ad4f102

Browse files
committed
Added ability to load Unity meta data files for sprite sheets
1 parent 2955df2 commit ad4f102

6 files changed

Lines changed: 199 additions & 1 deletion

File tree

v3/src/loader/BaseLoader.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,21 @@ var BaseLoader = new Class({
373373
}
374374
break;
375375

376+
case 'unityatlas':
377+
378+
fileA = file.fileA;
379+
fileB = file.fileB;
380+
381+
if (fileA.type === 'image')
382+
{
383+
textures.addUnityAtlas(fileA.key, fileA.data, fileB.data);
384+
}
385+
else
386+
{
387+
textures.addUnityAtlas(fileB.key, fileB.data, fileA.data);
388+
}
389+
break;
390+
376391
case 'bitmapfont':
377392

378393
fileA = file.fileA;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var ImageFile = require('./ImageFile.js');
2+
var TextFile = require('./TextFile.js');
3+
4+
var UnityAtlasFile = function (key, textureURL, atlasURL, path, textureXhrSettings, atlasXhrSettings)
5+
{
6+
var image = new ImageFile(key, textureURL, path, textureXhrSettings);
7+
var data = new TextFile(key, atlasURL, path, atlasXhrSettings);
8+
9+
// Link them together
10+
image.linkFile = data;
11+
data.linkFile = image;
12+
13+
// Set the type
14+
image.linkType = 'unityatlas';
15+
data.linkType = 'unityatlas';
16+
17+
return { texture: image, data: data };
18+
};
19+
20+
module.exports = UnityAtlasFile;

v3/src/plugins/Loader.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var ScriptFile = require('../loader/filetypes/ScriptFile');
1414
var SpriteSheet = require('../loader/filetypes/SpriteSheet');
1515
var SVGFile = require('../loader/filetypes/SVGFile');
1616
var TextFile = require('../loader/filetypes/TextFile');
17+
var UnityAtlasFile = require('../loader/filetypes/UnityAtlasFile');
1718
var XMLFile = require('../loader/filetypes/XMLFile');
1819

1920
var Loader = new Class({
@@ -91,6 +92,17 @@ var Loader = new Class({
9192
// Multi-File Loaders
9293
// ---------------------------------------------------
9394

95+
unityAtlas: function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
96+
{
97+
// Returns an object with two properties: 'texture' and 'data'
98+
var files = new UnityAtlasFile(key, textureURL, atlasURL, this.path, textureXhrSettings, atlasXhrSettings);
99+
100+
this.addFile(files.texture);
101+
this.addFile(files.data);
102+
103+
return this;
104+
},
105+
94106
atlas: function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
95107
{
96108
// Returns an object with two properties: 'texture' and 'data'

v3/src/textures/TextureManager.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,15 @@ var TextureManager = new Class({
138138
return texture;
139139
},
140140

141+
addUnityAtlas: function (key, source, data)
142+
{
143+
var texture = this.create(key, source);
144+
145+
Parser.UnityYAML(texture, 0, data);
146+
147+
return texture;
148+
},
149+
141150
/**
142151
* [addSpriteSheet description]
143152
* @param {[type]} key [description]
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/*
2+
Example data:
3+
4+
TextureImporter:
5+
spritePivot: {x: .5, y: .5}
6+
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
7+
spritePixelsToUnits: 100
8+
spriteSheet:
9+
sprites:
10+
- name: asteroids_0
11+
rect:
12+
serializedVersion: 2
13+
x: 5
14+
y: 328
15+
width: 65
16+
height: 82
17+
alignment: 0
18+
pivot: {x: 0, y: 0}
19+
border: {x: 0, y: 0, z: 0, w: 0}
20+
- name: asteroids_1
21+
rect:
22+
serializedVersion: 2
23+
x: 80
24+
y: 322
25+
width: 53
26+
height: 88
27+
alignment: 0
28+
pivot: {x: 0, y: 0}
29+
border: {x: 0, y: 0, z: 0, w: 0}
30+
spritePackingTag: Asteroids
31+
*/
32+
33+
var imageHeight = 0;
34+
35+
var addFrame = function (texture, sourceIndex, name, frame)
36+
{
37+
// The frame values are the exact coordinates to cut the frame out of the atlas from
38+
39+
var y = imageHeight - frame.y - frame.height;
40+
41+
var newFrame = texture.add(name, sourceIndex, frame.x, y, frame.width, frame.height);
42+
43+
// console.log('name', name, 'rect', frame.x, y, frame.width, frame.height);
44+
45+
// These are the original (non-trimmed) sprite values
46+
/*
47+
if (src.trimmed)
48+
{
49+
newFrame.setTrim(
50+
src.sourceSize.w,
51+
src.sourceSize.h,
52+
src.spriteSourceSize.x,
53+
src.spriteSourceSize.y,
54+
src.spriteSourceSize.w,
55+
src.spriteSourceSize.h
56+
);
57+
}
58+
*/
59+
};
60+
61+
// https://docs.unity3d.com/ScriptReference/SpriteMetaData.html
62+
63+
var UnityYAML = function (texture, sourceIndex, yaml)
64+
{
65+
// Add in a __BASE entry (for the entire atlas)
66+
var source = texture.source[sourceIndex];
67+
68+
texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
69+
70+
imageHeight = source.height;
71+
72+
var data = yaml.split('\n');
73+
74+
var lineRegExp = /^[ ]*(- )*(\w+)+[: ]+(.*)/;
75+
76+
var prevSprite = '';
77+
var currentSprite = '';
78+
var rect = { x: 0, y: 0, width: 0, height: 0 };
79+
var pivot = { x: 0, y: 0 };
80+
var border = { x: 0, y: 0, z: 0, w: 0 };
81+
82+
for (var i = 0; i < data.length; i++)
83+
{
84+
var results = data[i].match(lineRegExp);
85+
86+
if (!results)
87+
{
88+
continue;
89+
}
90+
91+
var isList = (results[1] === '- ');
92+
var key = results[2];
93+
var value = results[3];
94+
95+
if (isList)
96+
{
97+
if (currentSprite !== prevSprite)
98+
{
99+
addFrame(texture, sourceIndex, currentSprite, rect);
100+
101+
prevSprite = currentSprite;
102+
}
103+
104+
rect = { x: 0, y: 0, width: 0, height: 0 };
105+
}
106+
107+
if (key === 'name')
108+
{
109+
// Start new list
110+
currentSprite = value;
111+
continue;
112+
}
113+
114+
switch (key)
115+
{
116+
case 'x':
117+
case 'y':
118+
case 'width':
119+
case 'height':
120+
rect[key] = parseInt(value, 10);
121+
break;
122+
123+
case 'pivot':
124+
pivot = eval('var obj = ' + value);
125+
break;
126+
127+
case 'border':
128+
border = eval('var obj = ' + value);
129+
break;
130+
}
131+
}
132+
133+
if (currentSprite !== prevSprite)
134+
{
135+
addFrame(texture, sourceIndex, currentSprite, rect);
136+
}
137+
138+
return texture;
139+
};
140+
141+
module.exports = UnityYAML;

v3/src/textures/parsers/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ module.exports = {
77
Pyxel: require('./Pyxel'),
88
SpriteSheet: require('./SpriteSheet'),
99
SpriteSheetFromAtlas: require('./SpriteSheetFromAtlas'),
10-
StarlingXML: require('./StarlingXML')
10+
StarlingXML: require('./StarlingXML'),
11+
UnityYAML: require('./UnityYAML')
1112
};

0 commit comments

Comments
 (0)