Skip to content

Commit f738e6a

Browse files
committed
init: minimalist new nodematerial system
1 parent ac23d85 commit f738e6a

File tree

9 files changed

+323
-48
lines changed

9 files changed

+323
-48
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Node from './Node.js';
2+
3+
class InputNode extends Node {
4+
5+
constructor( type ) {
6+
7+
super( type );
8+
9+
this.isInputNode = true;
10+
11+
// force constant for now
12+
this.constant = true;
13+
14+
}
15+
16+
generateConst( builder, output ) {
17+
18+
console.warn("Abstract function");
19+
20+
}
21+
22+
generate( builder, output ) {
23+
24+
if ( this.constant ) {
25+
26+
return builder.format( this.generateConst( builder, output ), output );
27+
28+
} else {
29+
30+
builder.createUniformFromNode( node );
31+
32+
}
33+
34+
}
35+
36+
}
37+
38+
export default InputNode;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Node {
2+
3+
constructor( type ) {
4+
5+
this.type = type;
6+
7+
this.isNode = true;
8+
9+
}
10+
11+
getType( builder ) {
12+
13+
return this.type;
14+
15+
}
16+
17+
generate( builder, output ) {
18+
19+
console.warn("Abstract function");
20+
21+
}
22+
23+
build( builder, output ) {
24+
25+
return this.generate( builder, output );
26+
27+
}
28+
29+
}
30+
31+
export default Node;
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
const VERSION = '1';
2+
3+
class NodeBuilder {
4+
5+
constructor() {
6+
7+
this.slots = { vertex: [], fragment: [] };
8+
this.defines = { vertex: {}, fragment: {} };
9+
10+
this.nodesData = new WeakMap();
11+
12+
this.shader = undefined;
13+
14+
}
15+
16+
setMaterial( material ) {
17+
18+
this.material = material;
19+
20+
}
21+
22+
addSlot( shader, slot ) {
23+
24+
this.slots[ shader ].push( slot );
25+
26+
}
27+
28+
addDefine( shader, name, value ) {
29+
30+
this.defines[ shader ][ name ] = value || '';
31+
32+
}
33+
34+
generateVec3( x, y, z ) {
35+
36+
return `vec3( ${x}, ${y}, ${z} )`;
37+
38+
}
39+
40+
generateFloat( value ) {
41+
42+
return value + ( value % 1 ? '' : '.0' );
43+
44+
}
45+
/*
46+
createDataFromNode( node ) {
47+
48+
return this.nodesData[ node ] = this.nodesData[ node ] || {};
49+
50+
}
51+
*/
52+
createUniformFromNode( node ) {
53+
54+
55+
56+
}
57+
/*
58+
analyzeNode( node ) {
59+
60+
61+
}
62+
*/
63+
flowNode( node, output ) {
64+
65+
let flowData = {};
66+
flowData.result = node.build( this, output );
67+
68+
return flowData;
69+
70+
}
71+
72+
buildDefines( shader ) {
73+
74+
const defines = this.defines[ shader ];
75+
76+
let code = '';
77+
78+
for ( let name in defines ) {
79+
80+
code += `#define NODE_${name} ${defines[name]}\n`;
81+
82+
}
83+
84+
return code;
85+
86+
}
87+
88+
build( shader ) {
89+
90+
const slots = this.slots[ shader ];
91+
92+
if ( slots.length ) {
93+
94+
this.addDefine( shader, 'NODE', VERSION );
95+
96+
for( let i = 0; i < slots.length; i++) {
97+
98+
let slot = slots[i];
99+
100+
let flowData = this.flowNode( slot.node );
101+
102+
this.addDefine( shader, slot.name, flowData.result );
103+
104+
}
105+
106+
}
107+
108+
let defines = this.buildDefines( shader );
109+
110+
return {
111+
defines
112+
};
113+
114+
}
115+
116+
format( code, fromType, toType ) {
117+
118+
const typeToType = toType + ' <- ' + fromType;
119+
120+
switch ( typeToType ) {
121+
122+
case 'f <- v2' : return code + '.x';
123+
case 'f <- v3' : return code + '.x';
124+
case 'f <- v4' : return code + '.x';
125+
case 'f <- i' :
126+
case 'f <- b' : return 'float( ' + code + ' )';
127+
128+
case 'v2 <- f' : return 'vec2( ' + code + ' )';
129+
case 'v2 <- v3': return code + '.xy';
130+
case 'v2 <- v4': return code + '.xy';
131+
case 'v2 <- i' :
132+
case 'v2 <- b' : return 'vec2( float( ' + code + ' ) )';
133+
134+
case 'v3 <- f' : return 'vec3( ' + code + ' )';
135+
case 'v3 <- v2': return 'vec3( ' + code + ', 0.0 )';
136+
case 'v3 <- v4': return code + '.xyz';
137+
case 'v3 <- i' :
138+
case 'v3 <- b' : return 'vec2( float( ' + code + ' ) )';
139+
140+
case 'v4 <- f' : return 'vec4( ' + code + ' )';
141+
case 'v4 <- v2': return 'vec4( ' + code + ', 0.0, 1.0 )';
142+
case 'v4 <- v3': return 'vec4( ' + code + ', 1.0 )';
143+
case 'v4 <- i' :
144+
case 'v4 <- b' : return 'vec4( float( ' + code + ' ) )';
145+
146+
case 'i <- f' :
147+
case 'i <- b' : return 'int( ' + code + ' )';
148+
case 'i <- v2' : return 'int( ' + code + '.x )';
149+
case 'i <- v3' : return 'int( ' + code + '.x )';
150+
case 'i <- v4' : return 'int( ' + code + '.x )';
151+
152+
case 'b <- f' : return '( ' + code + ' != 0.0 )';
153+
case 'b <- v2' : return '( ' + code + ' != vec2( 0.0 ) )';
154+
case 'b <- v3' : return '( ' + code + ' != vec3( 0.0 ) )';
155+
case 'b <- v4' : return '( ' + code + ' != vec4( 0.0 ) )';
156+
case 'b <- i' : return '( ' + code + ' != 0 )';
157+
158+
}
159+
160+
return code;
161+
162+
}
163+
164+
}
165+
166+
export default NodeBuilder;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class NodeSlot {
2+
3+
constructor( node, name, output ) {
4+
5+
this.node = node;
6+
this.name = name;
7+
this.output = output;
8+
9+
}
10+
11+
}
12+
13+
export default NodeSlot;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import InputNode from '../core/InputNode.js';
2+
3+
class Vector3Node extends InputNode {
4+
5+
constructor( value ) {
6+
7+
super( 'v3' );
8+
9+
this.value = value
10+
11+
}
12+
13+
generateConst( builder ) {
14+
15+
return builder.generateVec3( this.value.x, this.value.y, this.value.z );
16+
17+
}
18+
19+
}
20+
21+
export default Vector3Node;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import Node from '../core/Node.js';
2+
3+
class OperatorNode extends Node {
4+
5+
constructor( op, a, b ) {
6+
7+
super();
8+
9+
this.op = op;
10+
11+
this.a = a;
12+
this.b = b;
13+
14+
}
15+
16+
getType( builder ) {
17+
18+
// ignore auto length for now
19+
20+
return this.a.getType( builder );
21+
22+
}
23+
24+
generate( builder, output ) {
25+
26+
const nodeType = this.getType( builder );
27+
28+
const a = this.a.build( builder, nodeType );
29+
const b = this.b.build( builder, nodeType );
30+
31+
return builder.format( '( ' + a + ' ' + this.op + ' ' + b + ' )', nodeType, output );
32+
33+
}
34+
35+
}
36+
37+
export default OperatorNode;

0 commit comments

Comments
 (0)