Просмотр исходного кода

TSL: Fix type propagation in members (#31699)

sunag 9 месяцев назад
Родитель
Сommit
43d3d5e56d
3 измененных файлов с 64 добавлено и 12 удалено
  1. 5 5
      src/nodes/core/StructNode.js
  2. 1 0
      src/nodes/core/StructTypeNode.js
  3. 58 7
      src/nodes/utils/MemberNode.js

+ 5 - 5
src/nodes/core/StructNode.js

@@ -30,11 +30,11 @@ class StructNode extends Node {
 
 
 	}
 	}
 
 
-	constructor( structLayoutNode, values ) {
+	constructor( structTypeNode, values ) {
 
 
 		super( 'vec3' );
 		super( 'vec3' );
 
 
-		this.structLayoutNode = structLayoutNode;
+		this.structTypeNode = structTypeNode;
 		this.values = values;
 		this.values = values;
 
 
 		this.isStructNode = true;
 		this.isStructNode = true;
@@ -43,13 +43,13 @@ class StructNode extends Node {
 
 
 	getNodeType( builder ) {
 	getNodeType( builder ) {
 
 
-		return this.structLayoutNode.getNodeType( builder );
+		return this.structTypeNode.getNodeType( builder );
 
 
 	}
 	}
 
 
 	getMemberType( builder, name ) {
 	getMemberType( builder, name ) {
 
 
-		return this.structLayoutNode.getMemberType( builder, name );
+		return this.structTypeNode.getMemberType( builder, name );
 
 
 	}
 	}
 
 
@@ -59,7 +59,7 @@ class StructNode extends Node {
 		const structType = nodeVar.type;
 		const structType = nodeVar.type;
 		const propertyName = builder.getPropertyName( nodeVar );
 		const propertyName = builder.getPropertyName( nodeVar );
 
 
-		builder.addLineFlowCode( `${ propertyName } = ${ builder.generateStruct( structType, this.structLayoutNode.membersLayout, this.values ) }`, this );
+		builder.addLineFlowCode( `${ propertyName } = ${ builder.generateStruct( structType, this.structTypeNode.membersLayout, this.values ) }`, this );
 
 
 		return nodeVar.name;
 		return nodeVar.name;
 
 

+ 1 - 0
src/nodes/core/StructTypeNode.js

@@ -138,6 +138,7 @@ class StructTypeNode extends Node {
 
 
 	setup( builder ) {
 	setup( builder ) {
 
 
+		builder.getStructTypeFromNode( this, this.membersLayout, this.name );
 		builder.addInclude( this );
 		builder.addInclude( this );
 
 
 	}
 	}

+ 58 - 7
src/nodes/utils/MemberNode.js

@@ -15,21 +15,21 @@ class MemberNode extends Node {
 	}
 	}
 
 
 	/**
 	/**
-	 * Constructs an array element node.
+	 * Constructs a member node.
 	 *
 	 *
-	 * @param {Node} node - The array-like node.
+	 * @param {Node} structNode - The struct node.
 	 * @param {string} property - The property name.
 	 * @param {string} property - The property name.
 	 */
 	 */
-	constructor( node, property ) {
+	constructor( structNode, property ) {
 
 
 		super();
 		super();
 
 
 		/**
 		/**
-		 * The array-like node.
+		 * The struct node.
 		 *
 		 *
 		 * @type {Node}
 		 * @type {Node}
 		 */
 		 */
-		this.node = node;
+		this.structNode = structNode;
 
 
 		/**
 		/**
 		 * The property name.
 		 * The property name.
@@ -49,15 +49,66 @@ class MemberNode extends Node {
 
 
 	}
 	}
 
 
+	hasMember( builder ) {
+
+		if ( this.structNode.isMemberNode ) {
+
+			if ( this.structNode.hasMember( builder ) === false ) {
+
+				return false;
+
+			}
+
+		}
+
+		return this.structNode.getMemberType( builder, this.property ) !== 'void';
+
+	}
+
 	getNodeType( builder ) {
 	getNodeType( builder ) {
 
 
-		return this.node.getMemberType( builder, this.property );
+		if ( this.hasMember( builder ) === false ) {
+
+			// default type if member does not exist
+
+			return 'float';
+
+		}
+
+		return this.structNode.getMemberType( builder, this.property );
+
+	}
+
+	getMemberType( builder, name ) {
+
+		if ( this.hasMember( builder ) === false ) {
+
+			// default type if member does not exist
+
+			return 'float';
+
+		}
+
+		const type = this.getNodeType( builder );
+		const struct = builder.getStructTypeNode( type );
+
+		return struct.getMemberType( builder, name );
 
 
 	}
 	}
 
 
 	generate( builder ) {
 	generate( builder ) {
 
 
-		const propertyName = this.node.build( builder );
+		if ( this.hasMember( builder ) === false ) {
+
+			console.warn( `THREE.TSL: Member "${ this.property }" does not exist in struct.` );
+
+			const type = this.getNodeType( builder );
+
+			return builder.generateConst( type );
+
+		}
+
+		const propertyName = this.structNode.build( builder );
 
 
 		return propertyName + '.' + this.property;
 		return propertyName + '.' + this.property;
 
 

粤ICP备19079148号