1.0.1 • Published 8 years ago

glsl-token-functions v1.0.1

Weekly downloads
2
License
MIT
Repository
github
Last release
8 years ago

glsl-token-functions

stable

Extract function definitions from an array of GLSL tokens from glsl-tokenizer.

You can use this to grab all of the functions in a shader, along with their arguments, return value and name.

Usage

NPM

functions = tokenFunctions(tokens)

Given an array of tokens produced by glsl-tokenizer, return an array of function data in the following format:

{
  name: 'functionName',
  type: 'vec4'
  body: [100, 110],
  args: [98, 99],
  outer: [80, 111]
}

fn.name

The function name. For example, the following function would be main:

void main();

fn.type

The function return type. For example, the following function would be vec2:

vec2 getModel(vec3 p);

Note that this supports structs too! The following function's type would be Ray:

struct Ray {
  vec3 ro;
  vec3 rd;
}

Ray getCamera(vec3 origin);

fn.body

The start and end index in the original tokens array of the function body, i.e. the part between the curly braces. If the function doesn't have a body, this will be false.

For example:

const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void main() { gl_FragColor = vec4(1); }
`

const tokens = tokenize(src)
const functions = tokenFunctions(tokens)

console.log(getBody(functions[0])) // false
console.log(getBody(functions[1])) // " gl_FragColor = vec4(1); "

function getBody () {
  return toString(tokens.slice(fn.body[0], fn.body[1]))
}

fn.args

The start and end index in the original tokens array of the function arguments, i.e. the part including the parenthesis in the function definition.

For example:

const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void drawImage(vec3 ro, vec3 rd);
`

const tokens = tokenize(src)
const functions = tokenFunctions(tokens)

console.log(getArgs(functions[0])) // "()"
console.log(getArgs(functions[1])) // "(vec3 ro, vec3 rd)"

function getArgs () {
  return toString(tokens.slice(fn.args[0], fn.args[1]))
}

fn.outer

The start and end index in the original tokens array of the entire function.

For example:

const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void main() { gl_FragColor = vec4(1); }
`

const tokens = tokenize(src)
const functions = tokenFunctions(tokens)

console.log(getOuter(functions[0])) // "void main();"
console.log(getOuter(functions[1])) // "void main() { gl_FragColor = vec4(1); }"

function getOuter () {
  return toString(tokens.slice(fn.outer[0], fn.outer[1]))
}

Contributing

See stackgl/contributing for details.

License

MIT. See LICENSE.md for details.