hydra-synth
Version:
base synth for hydra-editor
115 lines (99 loc) • 3.15 kB
JavaScript
import generateGlsl from './generate-glsl.js'
// const formatArguments = require('./glsl-utils.js').formatArguments
// const glslTransforms = require('./glsl/composable-glsl-functions.js')
import utilityGlsl from './glsl/utility-functions.js'
var GlslSource = function (obj) {
this.transforms = []
this.transforms.push(obj)
this.defaultOutput = obj.defaultOutput
this.synth = obj.synth
this.type = 'GlslSource'
this.defaultUniforms = obj.defaultUniforms
return this
}
GlslSource.prototype.addTransform = function (obj) {
this.transforms.push(obj)
}
GlslSource.prototype.out = function (_output) {
var output = _output || this.defaultOutput
var glsl = this.glsl(output)
this.synth.currentFunctions = []
// output.renderPasses(glsl)
if(output) try{
output.render(glsl)
} catch (error) {
console.log('shader could not compile', error)
}
}
GlslSource.prototype.glsl = function () {
//var output = _output || this.defaultOutput
var self = this
// uniforms included in all shaders
// this.defaultUniforms = output.uniforms
var passes = []
var transforms = []
// console.log('output', output)
this.transforms.forEach((transform) => {
if(transform.transform.type === 'renderpass'){
// if (transforms.length > 0) passes.push(this.compile(transforms, output))
// transforms = []
// var uniforms = {}
// const inputs = formatArguments(transform, -1)
// inputs.forEach((uniform) => { uniforms[uniform.name] = uniform.value })
//
// passes.push({
// frag: transform.transform.frag,
// uniforms: Object.assign({}, self.defaultUniforms, uniforms)
// })
// transforms.push({name: 'prev', transform: glslTransforms['prev'], synth: this.synth})
console.warn('no support for renderpass')
} else {
transforms.push(transform)
}
})
if (transforms.length > 0) passes.push(this.compile(transforms))
return passes
}
GlslSource.prototype.compile = function (transforms) {
var shaderInfo = generateGlsl(transforms, this.synth)
var uniforms = {}
shaderInfo.uniforms.forEach((uniform) => { uniforms[uniform.name] = uniform.value })
var frag = `
precision ${this.defaultOutput.precision} float;
${Object.values(shaderInfo.uniforms).map((uniform) => {
let type = uniform.type
switch (uniform.type) {
case 'texture':
type = 'sampler2D'
break
}
return `
uniform ${type} ${uniform.name};`
}).join('')}
uniform float time;
uniform vec2 resolution;
varying vec2 uv;
uniform sampler2D prevBuffer;
${Object.values(utilityGlsl).map((transform) => {
// console.log(transform.glsl)
return `
${transform.glsl}
`
}).join('')}
${shaderInfo.glslFunctions.map((transform) => {
return `
${transform.transform.glsl}
`
}).join('')}
void main () {
vec4 c = vec4(1, 0, 0, 1);
vec2 st = gl_FragCoord.xy/resolution.xy;
gl_FragColor = ${shaderInfo.fragColor};
}
`
return {
frag: frag,
uniforms: Object.assign({}, this.defaultUniforms, uniforms)
}
}
export default GlslSource