diff --git a/modules/core/src/lib/base-model.js b/modules/core/src/lib/base-model.js index cad8b25702..96e5783688 100644 --- a/modules/core/src/lib/base-model.js +++ b/modules/core/src/lib/base-model.js @@ -141,6 +141,18 @@ export default class BaseModel { return this; } + getModuleUniforms(opts) { + this._checkProgram(); + + const getUniforms = this.programManager.getUniforms(this.program); + + if (getUniforms) { + return getUniforms(opts); + } + + return {}; + } + updateModuleSettings(opts) { const uniforms = this.getModuleUniforms(opts || {}); return this.setUniforms(uniforms); @@ -271,7 +283,6 @@ export default class BaseModel { let {program} = this.programProps; if (program) { - this.getModuleUniforms = () => {}; this._managedProgram = false; } else { const { @@ -285,7 +296,6 @@ export default class BaseModel { bufferMode } = this.programProps; program = this.programManager.get({vs, fs, modules, inject, defines, varyings, bufferMode}); - this.getModuleUniforms = this.programManager.getUniforms(program); if (this.program && this._managedProgram) { this.programManager.release(this.program); } diff --git a/modules/core/test/lib/model.spec.js b/modules/core/test/lib/model.spec.js index c586fcb5db..b7627a15a9 100644 --- a/modules/core/test/lib/model.spec.js +++ b/modules/core/test/lib/model.spec.js @@ -2,6 +2,7 @@ import GL from '@luma.gl/constants'; import luma from '@luma.gl/webgl/init'; // TODO - Model test should not depend on Cube import {Buffer, Model, CubeGeometry, ProgramManager} from '@luma.gl/core'; +import {picking} from '@luma.gl/shadertools'; import test from 'tape-catch'; import {fixture} from 'test/setup'; @@ -209,6 +210,37 @@ test('Model#program management', t => { t.end(); }); +test('Model#program management - getModuleUniforms', t => { + const {gl} = fixture; + + const pm = new ProgramManager(gl); + + const vs = 'void main() {}'; + const fs = 'void main() {}'; + + const model = new Model(gl, { + programManager: pm, + vs, + fs + }); + + t.deepEqual(model.getModuleUniforms(), {}, 'Module uniforms empty with no modules'); + + model.setProgram({ + vs, + fs, + modules: [picking] + }); + + t.deepEqual( + model.getModuleUniforms(), + picking.getUniforms(), + 'Module uniforms correct after update' + ); + + t.end(); +}); + test('getBuffersFromGeometry', t => { const {gl} = fixture;