瀏覽代碼

a script for reading sliders/uniforms from shaders

Lucas Stadler 10 年之前
父節點
當前提交
7cbdced6f3
共有 1 個文件被更改,包括 54 次插入0 次删除
  1. 54 0
      glsl/findSlider.js

+ 54 - 0
glsl/findSlider.js

@ -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;