|
|
@ -0,0 +1,54 @@
|
|
|
1
|
function findSlider(input) {
|
|
|
2
|
var type = "unknown";
|
|
|
3
|
var match = input.match(/^(uniform|attribute) (float|vec2|vec3) (.*);/);
|
|
|
4
|
if (!match) {
|
|
|
5
|
return false;
|
|
|
6
|
}
|
|
|
7
|
type = match[2];
|
|
|
8
|
var name = match[3];
|
|
|
9
|
|
|
|
10
|
var numRegexp = /[+-]?(?:\d+(?:\.\d+)?)/;
|
|
|
11
|
var singleValueRegexp = new RegExp(`\\((${numRegexp.source}),\\s*(${numRegexp.source}),\\s*(${numRegexp.source})\\)`);
|
|
|
12
|
var vec2Regexp = new RegExp(`^${singleValueRegexp.source},\\s*${singleValueRegexp.source}$`)
|
|
|
13
|
var vec3Regexp = new RegExp(`^${singleValueRegexp.source},\\s*${singleValueRegexp.source},\\s*${singleValueRegexp.source}$`)
|
|
|
14
|
|
|
|
15
|
var match = input.match(/\/\/#slider\[(.*)\]/);
|
|
|
16
|
if (!match) {
|
|
|
17
|
return false;
|
|
|
18
|
}
|
|
|
19
|
|
|
|
20
|
var rawVal = match[1];
|
|
|
21
|
|
|
|
22
|
if (type == "float") {
|
|
|
23
|
var vals = rawVal.split(",");
|
|
|
24
|
|
|
|
25
|
vals = vals.map(function(v) {
|
|
|
26
|
return Number(v);
|
|
|
27
|
});
|
|
|
28
|
} else if (type == "vec2" || type == "vec3") {
|
|
|
29
|
var re = type == "vec2" ? vec2Regexp : vec3Regexp;
|
|
|
30
|
var match = rawVal.match(re);
|
|
|
31
|
if (!match) {
|
|
|
32
|
throw new Error("invalid " + type + " slider");
|
|
|
33
|
}
|
|
|
34
|
|
|
|
35
|
var vals = [];
|
|
|
36
|
for (var i = 0; i < Number(type[type.length-1]); i++) {
|
|
|
37
|
vals.push([match[1+i*3+0], match[1+i*3+1], match[1+i*3+2]].map(Number));
|
|
|
38
|
}
|
|
|
39
|
} else {
|
|
|
40
|
throw new Error("unknown type");
|
|
|
41
|
}
|
|
|
42
|
|
|
|
43
|
return {name: name, type: type, range: vals};
|
|
|
44
|
}
|
|
|
45
|
|
|
|
46
|
var vars = [];
|
|
|
47
|
input.split("\n").forEach(function(line) {
|
|
|
48
|
var slider = findSlider(line);
|
|
|
49
|
if (slider) {
|
|
|
50
|
vars.push(slider);
|
|
|
51
|
}
|
|
|
52
|
});
|
|
|
53
|
|
|
|
54
|
return vars;
|