@needle-tools/three
Version:
JavaScript 3D library
66 lines (38 loc) • 1.36 kB
JavaScript
import { nodeFrame, WebGLNodeBuilder } from './WebGLNodeBuilder.js';
import { Material } from 'three';
const builders = new WeakMap();
Material.prototype.onBuild = function ( object, parameters, renderer ) {
const material = this;
if ( material.isNodeMaterial === true ) {
let newBuilder;
try {
newBuilder = new WebGLNodeBuilder( object, renderer, parameters, material ).build();
builders.set( material, newBuilder );
} catch ( e ) {
console.error( 'Material.prototype.onBuild: ', e );
}
// console.log( 'Material.prototype.onBuild: new builder', this, newBuilder );
}
};
Material.prototype.onBeforeRender = function ( renderer, scene, camera, geometry, object ) {
const nodeBuilder = builders.get( this );
// if ( this.isNodeMaterial )
// console.log( 'Material.prototype.onBeforeRender', this, nodeBuilder );
if ( nodeBuilder !== undefined ) {
nodeFrame.material = this;
nodeFrame.camera = camera;
nodeFrame.object = object;
nodeFrame.renderer = renderer;
nodeFrame.scene = scene;
nodeFrame.geometry = geometry;
const updateNodes = nodeBuilder.updateNodes;
if ( updateNodes.length > 0 ) {
// force refresh material uniforms
renderer.state.useProgram( null );
//this.uniformsNeedUpdate = true;
for ( const node of updateNodes ) {
nodeFrame.updateNode( node );
}
}
}
};