diff --git a/README.md b/README.md index a873654..aa52e95 100644 --- a/README.md +++ b/README.md @@ -63,12 +63,12 @@ Here is the result: # Install - npm install gl-shader + npm install @lfdoherty/gl-shader # API ```javascript -var createShader = require('gl-shader') +var createShader = require('@lfdoherty/gl-shader') ``` diff --git a/index.js b/index.js index 95b6969..6308b72 100644 --- a/index.js +++ b/index.js @@ -56,6 +56,21 @@ function compareAttributes(a, b) { return 1 } +proto.toString = function(){ + var result = {} + if(!this.uniforms){ + result.neverBound = true; + }else{ + result.types = this.types + result.uniforms = {} + var local = this; + Object.keys(this.types.uniforms).forEach(function(uniformName){ + result.uniforms[uniformName] = local.uniforms[uniformName] + }) + } + return JSON.stringify(result) +} + //Update export hook for glslify-live proto.update = function( vertSource diff --git a/lib/create-uniforms.js b/lib/create-uniforms.js index 1d0870b..baf2efe 100644 --- a/lib/create-uniforms.js +++ b/lib/create-uniforms.js @@ -31,7 +31,7 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { return proc(gl, wrapper, locations) } - function makePropSetter(path, index, type) { + function makePropSetter(path, index, type, size, name) { switch(type) { case 'bool': case 'int': @@ -47,12 +47,18 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { if(d < 2 || d > 4) { throw new GLError('', 'Invalid data type') } + let checkStr = '' + if(size && size > d){ + checkStr = 'if(!(obj instanceof Float32Array)){throw new Error("must use Float32Array to set uniform array '+name+'")};\n'; + const valueSize = size * d; + checkStr += 'if(obj.length !== '+valueSize+'){throw new Error("for uniform '+name+' size is " + obj.length + " but should be ' + valueSize + '")};\n' + } switch(type.charAt(0)) { case 'b': case 'i': - return 'gl.uniform' + d + 'iv(locations[' + index + '],obj' + path + ')' + return checkStr + 'gl.uniform' + d + 'iv(locations[' + index + '],obj' + path + ')' case 'v': - return 'gl.uniform' + d + 'fv(locations[' + index + '],obj' + path + ')' + return checkStr + 'gl.uniform' + d + 'fv(locations[' + index + '],obj' + path + ')' default: throw new GLError('', 'Unrecognized data type for vector ' + name + ': ' + type) } @@ -99,7 +105,7 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { var path = item[0] var idx = item[1] if(locations[idx]) { - code.push(makePropSetter(path, idx, uniforms[idx].type)) + code.push(makePropSetter(path, idx, uniforms[idx].type, uniforms[idx].size, uniforms[idx].name)) } } code.push('return obj}') @@ -143,9 +149,9 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { function storeProperty(obj, prop, type) { if(typeof type === 'object') { - var child = processObject(type) + // var child = processObject(type) Object.defineProperty(obj, prop, { - get: identity(child), + //get: identity(child), set: makeSetter(type), enumerable: true, configurable: false @@ -153,7 +159,7 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { } else { if(locations[type]) { Object.defineProperty(obj, prop, { - get: makeGetter(type), + // get: makeGetter(type), set: makeSetter(type), enumerable: true, configurable: false @@ -167,13 +173,17 @@ function createUniformWrapper(gl, wrapper, uniforms, locations) { function processObject(obj) { var result if(Array.isArray(obj)) { - result = new Array(obj.length) + throw new Error('should not happen') + /*result = new Array(obj.length) for(var i=0; i 1) { + /*if(info.size > 1) { for(var j=0; j