|
@@ -30,6 +30,14 @@ class GLSLNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ getPropertyName( node, shaderStage ) {
|
|
|
+
|
|
|
+ if ( node.isOutputStructVar ) return '';
|
|
|
+
|
|
|
+ return super.getPropertyName( node, shaderStage );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
getTexture( texture, textureProperty, uvSnippet ) {
|
|
|
|
|
|
if ( texture.isTextureCube ) {
|
|
@@ -62,6 +70,8 @@ class GLSLNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
for ( const variable of vars ) {
|
|
|
|
|
|
+ if ( variable.isOutputStructVar ) continue;
|
|
|
+
|
|
|
snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
|
|
|
|
|
|
}
|
|
@@ -160,6 +170,49 @@ class GLSLNodeBuilder extends NodeBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ getStructMembers( struct ) {
|
|
|
+
|
|
|
+ const snippets = [];
|
|
|
+ const members = struct.getMemberTypes();
|
|
|
+
|
|
|
+ for ( let i = 0; i < members.length; i ++ ) {
|
|
|
+
|
|
|
+ const member = members[ i ];
|
|
|
+ snippets.push( `layout( location = ${i} ) out ${ member} m${i};` );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return snippets.join( '\n' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ getStructs( shaderStage ) {
|
|
|
+
|
|
|
+ const snippets = [];
|
|
|
+ const structs = this.structs[ shaderStage ];
|
|
|
+
|
|
|
+ if ( structs.length === 0 ) {
|
|
|
+
|
|
|
+ return "layout( location = 0 ) out vec4 fragColor;\n";
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for ( let index = 0, length = structs.length; index < length; index ++ ) {
|
|
|
+
|
|
|
+ const struct = structs[ index ];
|
|
|
+
|
|
|
+ let snippet = `\n`;
|
|
|
+ snippet += this.getStructMembers( struct );
|
|
|
+ snippet += '\n';
|
|
|
+
|
|
|
+ snippets.push( snippet );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return snippets.join( '\n\n' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
getVaryings( shaderStage ) {
|
|
|
|
|
|
let snippet = '';
|
|
@@ -281,7 +334,7 @@ ${shaderData.varyings}
|
|
|
// codes
|
|
|
${shaderData.codes}
|
|
|
|
|
|
-layout( location = 0 ) out vec4 fragColor;
|
|
|
+${shaderData.structs}
|
|
|
|
|
|
void main() {
|
|
|
|
|
@@ -330,14 +383,18 @@ void main() {
|
|
|
if ( shaderStage === 'vertex' ) {
|
|
|
|
|
|
flow += 'gl_Position = ';
|
|
|
+ flow += `${ flowSlotData.result };`;
|
|
|
|
|
|
} else if ( shaderStage === 'fragment' ) {
|
|
|
|
|
|
- flow += 'fragColor = ';
|
|
|
+ if ( ! node.outputNode.isOutputStructNode ) {
|
|
|
|
|
|
- }
|
|
|
+ flow += 'fragColor = ';
|
|
|
+ flow += `${ flowSlotData.result };`;
|
|
|
|
|
|
- flow += `${ flowSlotData.result };`;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -349,6 +406,7 @@ void main() {
|
|
|
stageData.attributes = this.getAttributes( shaderStage );
|
|
|
stageData.varyings = this.getVaryings( shaderStage );
|
|
|
stageData.vars = this.getVars( shaderStage );
|
|
|
+ stageData.structs = this.getStructs( shaderStage );
|
|
|
stageData.codes = this.getCodes( shaderStage );
|
|
|
stageData.flow = flow;
|
|
|
|