瀏覽代碼

WebGLNodeBuilder: Fix Multi-Material (#26841)

sunag 1 年之前
父節點
當前提交
688b7499db

+ 2 - 2
examples/jsm/nodes/core/NodeBuilder.js

@@ -50,10 +50,10 @@ const toFloat = ( value ) => {
 
 class NodeBuilder {
 
-	constructor( object, renderer, parser, scene = null ) {
+	constructor( object, renderer, parser, scene = null, material = null ) {
 
 		this.object = object;
-		this.material = ( object && object.material ) || null;
+		this.material = material || ( object && object.material ) || null;
 		this.geometry = ( object && object.geometry ) || null;
 		this.renderer = renderer;
 		this.parser = parser;

+ 2 - 2
examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js

@@ -38,9 +38,9 @@ function getShaderStageProperty( shaderStage ) {
 
 class WebGLNodeBuilder extends NodeBuilder {
 
-	constructor( object, renderer, shader ) {
+	constructor( object, renderer, shader, material = null ) {
 
-		super( object, renderer, new GLSLNodeParser() );
+		super( object, renderer, new GLSLNodeParser(), null, material );
 
 		this.shader = shader;
 		this.slots = { vertex: [], fragment: [] };

+ 14 - 2
examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js

@@ -8,9 +8,21 @@ export const nodeFrame = new NodeFrame();
 
 Material.prototype.onBuild = function ( object, parameters, renderer ) {
 
-	if ( object.material.isNodeMaterial === true ) {
+	if ( Array.isArray( object.material ) ) {
 
-		builders.set( this, new WebGLNodeBuilder( object, renderer, parameters ).build() );
+		for ( const material of object.material ) {
+
+			if ( material.isNodeMaterial === true ) {
+
+				builders.set( material, new WebGLNodeBuilder( object, renderer, parameters, material ).build() );
+
+			}
+
+		}
+
+	} else if ( object.material.isNodeMaterial === true ) {
+
+		builders.set( object.material, new WebGLNodeBuilder( object, renderer, parameters ).build() );
 
 	}