-
Notifications
You must be signed in to change notification settings - Fork 59
/
Reader.hx
107 lines (96 loc) · 3.98 KB
/
Reader.hx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package format.pex;
import haxe.io.Input;
import haxe.xml.Fast;
import format.pex.Data;
class Reader
{
/**
* Parse a PexParticle from a .pex XML file.
*/
public static function read(i:Input):PexParticle
{
var contents = i.readAll().toString();
return parse(contents);
}
/**
* Parse a PexParticle from a string contianing .pex XML.
*/
public static function parse(contents:String):PexParticle
{
var data = new Fast(Xml.parse(contents).firstElement());
var particle:PexParticle = new PexParticle();
particle.emitterType = parseInt(data, "emitterType");
particle.textureName = data.node.texture.att.name;
particle.duration = parseFloat(data, "duration");
particle.maxParticles = parseInt(data, "maxParticles");
particle.emitterXVariance = parseFloat(data, "sourcePositionVariance", "x");
particle.emitterYVariance = parseFloat(data, "sourcePositionVariance", "y");
particle.gravityX = parseFloat(data, "gravity", "x");
particle.gravityY = parseFloat(data, "gravity", "y");
particle.lifespan = parseFloatWithVariance(data, "particleLifespan");
particle.startSize = parseFloatWithVariance(data, "startParticleSize");
particle.endSize = parseFloatWithVariance(data, "finishParticleSize");
particle.emitAngle = parseFloatWithVariance(data, "angle");
particle.startRotation = parseFloatWithVariance(data, "rotationStart");
particle.endRotation = parseFloatWithVariance(data, "rotationEnd");
particle.speed = parseFloatWithVariance(data, "speed");
particle.radialAcceleration = parseFloatWithVariance(data, "radialAcceleration", "radialAccelVariance");
particle.tangentialAcceleration = parseFloatWithVariance(data, "tangentialAcceleration", "tangentialAccelVariance");
particle.maxRadius = parseFloatWithVariance(data, "maxRadius");
particle.minRadius = parseFloatWithVariance(data, "minRadius");
particle.rotatePerSecond = parseFloatWithVariance(data, "rotatePerSecond");
particle.startColor = parseColor(data, "startColor");
particle.endColor = parseColor(data, "finishColor");
particle.blendSource = parseInt(data, "blendFuncSource");
particle.blendDestination = parseInt(data, "blendFuncDestination");
return particle;
}
static inline function parseFloat(data:Fast, nodeName:String, att:String = "value"):Float
{
return Std.parseFloat(findNode(data, nodeName).att.resolve(att));
}
static inline function parseInt(data:Fast, nodeName:String, att:String = "value"):Int
{
return Std.parseInt(findNode(data, nodeName).att.resolve(att));
}
static inline function parseFloatWithVariance(data:Fast, nodeName:String, ?varianceName:String):FloatWithVariance
{
if (varianceName == null) varianceName = nodeName + "Variance";
var base = parseFloat(data, nodeName);
var variance = parseFloat(data, varianceName);
return new FloatWithVariance(base, variance);
}
static inline function parseColor(data:Fast, nodeName:String, ?varianceName:String):UIntWithVariance
{
if (varianceName == null) varianceName = nodeName + "Variance";
var a = parseFloat(data, nodeName, "alpha"),
r = parseFloat(data, nodeName, "red"),
g = parseFloat(data, nodeName, "green"),
b = parseFloat(data, nodeName, "blue"),
av = parseFloat(data, varianceName, "alpha"),
rv = parseFloat(data, varianceName, "red"),
gv = parseFloat(data, varianceName, "green"),
bv = parseFloat(data, varianceName, "blue");
return new UIntWithVariance(makeColor(a, r, g, b), makeColor(av, rv, gv, bv));
}
static inline function makeColor(a:Float, r:Float, g:Float, b:Float):UInt
{
return (Std.int(0xFF * a) << 16) | (Std.int(0xFF * r) << 16) | (Std.int(0xFF * g) << 8) | Std.int(0xFF * b);
}
/**
* Case-insensitive node search to deal with historical case changes of pex
* element names.
*/
static function findNode(data:Fast, nodeName:String):Fast
{
nodeName = nodeName.toLowerCase();
for (child in data.x.iterator())
{
if (child.nodeType == Element && child.nodeName.toLowerCase() == nodeName)
{
return new Fast(child);
}
}
throw 'pex node not found: $nodeName';
}
}