-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
101 lines (86 loc) · 2.65 KB
/
index.js
File metadata and controls
101 lines (86 loc) · 2.65 KB
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
var fs = require('fs');
var path = require('path');
var through = require('through');
exports = module.exports = shaderify;
function shaderify(arg) {
// Webpack loader.
if (this && typeof this.async === 'function') {
return webpackShaderLoader.call(this, arg);
}
// Browserify loader.
var opts = arg || {};
if (opts.extensions === undefined) opts.extensions = ['shader'];
return function shader_transform(file) {
if (opts.extensions.indexOf(file.split('.').pop()) == -1) return through();
var buffer = '', vert, frag, throughput;
return through(write, end);
function write(c) {
buffer += c.toString();
}
function end() {
var shader;
try {
shader = JSON.parse(buffer);
}
catch(e) {
this.queue(buffer);
this.queue(null);
return;
}
throughput = this;
load(shader.vertex, function(err, b) { vert = b; finish(err); });
load(shader.fragment, function(err, b) { frag = b; finish(err); });
}
function load(f, n) {
if (Array.isArray(f))
return n(null, f.join('\n'));
if (typeof f !== 'string')
return n(new Error("invalid shader: " + f));
if (f.indexOf('{') !== -1)
return n(null, f);
fs.readFile(path.resolve(path.dirname(file), f), 'utf8', n);
}
function finish(err) {
if (err && throughput) {
throughput.emit('error', err);
throughput = null;
return;
}
if (throughput === null || vert === undefined || frag === undefined)
return;
throughput.queue("var shaderify = require('shaderify');\n");
throughput.queue("var vert = " + JSON.stringify(vert) + ";\n");
throughput.queue("var frag = " + JSON.stringify(frag) + ";\n");
throughput.queue("module.exports = function(gl) { return shaderify.compile(gl, vert, frag); }\n");
throughput.queue(null);
}
};
}
function normalize(path) {
if (path[0] === '.' && path[1] === '/')
return path;
if (path[0] === '.' && path[1] === '.' && path[1] === '/')
return path;
if (path[0] === '/')
return path;
return './' + path;
}
function loadShaderProgram(src) {
if (Array.isArray(src))
return JSON.stringify(src.join('\n'));
if (typeof src !== 'string')
return n(new Error("invalid shaderify program value: " + src));
if (src.indexOf('{') !== -1)
return JSON.stringify(src);
return "require('raw-loader!" + normalize(src) + "')";
}
function webpackShaderLoader(source) {
this.cacheable();
var shader = JSON.parse(source);
var vert = loadShaderProgram(shader.vertex);
var frag = loadShaderProgram(shader.fragment);
return "var shaderify = require('shaderify');\n" +
"var vert = " + vert + ";\n" +
"var frag = " + frag + ";\n" +
"module.exports = function(gl) { return shaderify.compile(gl, vert, frag); }\n";
}