99 lines
2.5 KiB
Markdown
99 lines
2.5 KiB
Markdown
# glsl-token-descope
|
||
|
||
[![experimental](http://badges.github.io/stability-badges/dist/experimental.svg)](http://github.com/badges/stability-badges)
|
||
|
||
"Descope" an array of GLSL tokens such that they can be safely inlined alongside
|
||
within another shader without causing any global variable conflicts.
|
||
|
||
Useful for modularising GLSL source files, e.g. as is done in
|
||
[glslify](http://github.com/stackgl/glslify), but should be useful in other
|
||
tools too.
|
||
|
||
Written with WebGL's GLSL syntax in mind – all the same, pull requests to
|
||
support other variants would be much appreciated :)
|
||
|
||
## Usage
|
||
|
||
[![NPM](https://nodei.co/npm/glsl-token-descope.png)](https://nodei.co/npm/glsl-token-descope/)
|
||
|
||
### `descope(tokens, [rename(name)])`
|
||
|
||
Takes an array of GLSL `tokens` produced by
|
||
[glsl-tokenizer](http://github.com/stackgl/glsl-tokenizer) and renames variables
|
||
to avoid global conflicts by modifying their "data" property in-place.
|
||
|
||
For example:
|
||
|
||
``` javascript
|
||
var tokenize = require('glsl-tokenizer/string')
|
||
var descope = require('glsl-token-descope')
|
||
var stringify = require('glsl-token-string')
|
||
|
||
var src = `
|
||
precision mediump float;
|
||
|
||
uniform mat4 top1;
|
||
uniform float top2;
|
||
|
||
void main() {
|
||
float x = 1.0;
|
||
gl_FragColor = vec4(vec3(x), top2);
|
||
}
|
||
`.trim()
|
||
|
||
var tokens = tokenize(src)
|
||
|
||
console.log(stringify(descope(tokens)))
|
||
```
|
||
|
||
Which should rename `main`, `top1` and `top2` to result in this output:
|
||
|
||
``` glsl
|
||
precision mediump float;
|
||
|
||
uniform mat4 top1_0;
|
||
uniform float top2_1;
|
||
|
||
void main_2() {
|
||
float x = 1.0;
|
||
gl_FragColor = vec4(vec3(x), top2_1);
|
||
}
|
||
```
|
||
|
||
Optionally, you may pass in a custom `rename` function as `descope`'s second
|
||
argument to choose how you rename your variables. For example, adding a custom
|
||
`rename` function to the previous function:
|
||
|
||
``` javascript
|
||
descope(tokens, function(name) {
|
||
return 'a_' + name
|
||
})
|
||
```
|
||
|
||
Would result in the following shader:
|
||
|
||
``` glsl
|
||
precision mediump float;
|
||
|
||
uniform mat4 a_top1;
|
||
uniform float a_top2;
|
||
|
||
void a_main() {
|
||
float x = 1.0;
|
||
gl_FragColor = vec4(vec3(x), a_top2);
|
||
}
|
||
```
|
||
|
||
## See Also
|
||
|
||
* [glslify](http://github.com/stackgl/glslify)
|
||
* [glsl-token-scope](http://github.com/stackgl/glsl-token-scope)
|
||
* [glsl-token-depth](http://github.com/stackgl/glsl-token-depth)
|
||
* [glsl-token-properties](http://github.com/stackgl/glsl-token-properties)
|
||
* [glsl-token-assignments](http://github.com/stackgl/glsl-token-assignments)
|
||
* [glsl-token-string](http://github.com/stackgl/glsl-token-string)
|
||
|
||
## License
|
||
|
||
MIT. See [LICENSE.md](http://github.com/stackgl/glsl-token-descope/blob/master/LICENSE.md) for details.
|