forked from webaverse/app
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmaterials.js
More file actions
97 lines (87 loc) · 3.17 KB
/
Copy pathmaterials.js
File metadata and controls
97 lines (87 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import * as THREE from 'three';
import {parser, generate} from '@shaderfrog/glsl-parser';
// const baseUrl = import.meta.url.replace(/(\/)[^\/\\]*$/, '$1');
const replaceStatementText = 'bool _webaverseShaderReplace = false;';
const appendMain = (shaderText, postfixLine) => {
const replaceStatmentAst = parser.parse(replaceStatementText);
const ast = parser.parse(shaderText);
const {program} = ast;
// console.log('got program', program);
const mainProgram = program.find(p => p.type === 'function' && p.prototype.header.name.identifier === 'main');
if (mainProgram) {
const {body: {statements}} = mainProgram;
statements.push(...replaceStatmentAst.program);
}
const s = generate(ast)
.replace(replaceStatementText, postfixLine + '\n');
// console.log('got o', ast, s);
return s;
};
/* window.shaderText = `\
${THREE.ShaderChunk.common}
uniform float iTime;
varying vec2 uvs;
varying vec3 vNormal;
varying vec3 vWorldPosition;
${THREE.ShaderChunk.logdepthbuf_pars_vertex}
void main() {
uvs = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
vNormal = normal;
vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
vWorldPosition = worldPosition.xyz;
${THREE.ShaderChunk.logdepthbuf_vertex}
}
`; */
// memoize a function which takes a string and returns a string
const _memoize = fn => {
const cache = new Map();
return s => {
let result = cache.get(s);
if (result === undefined) {
result = fn(s);
cache.set(s, result);
}
return result;
};
}
const formatVertexShader = _memoize(vertexShader => `\
${THREE.ShaderChunk.common}
${THREE.ShaderChunk.logdepthbuf_pars_vertex}
${appendMain(vertexShader, THREE.ShaderChunk.logdepthbuf_vertex)}
`);
const formatFragmentShader = _memoize(fragmentShader => `\
${THREE.ShaderChunk.logdepthbuf_pars_fragment}
${appendMain(fragmentShader, THREE.ShaderChunk.logdepthbuf_fragment)}
`);
class WebaverseShaderMaterial extends THREE.ShaderMaterial {
constructor(opts = {}) {
opts.vertexShader = formatVertexShader(opts.vertexShader);
opts.fragmentShader = formatFragmentShader(opts.fragmentShader);
super(opts);
}
}
class WebaverseRawShaderMaterial extends THREE.RawShaderMaterial {
constructor(opts = {}) {
opts.vertexShader = formatVertexShader(opts.vertexShader);
const lines = opts.vertexShader.split('\n');
let firstNonPrecisionLine = -1;
for (let i = 0; i < lines.length; i++) {
if (!lines[i].trim().startsWith('precision')) {
firstNonPrecisionLine = i;
break;
}
}
if (firstNonPrecisionLine !== -1 && !lines.some(l => l.trim().startsWith('#define USE_LOGDEPTHBUF'))) {
lines.splice(firstNonPrecisionLine, 0, '#define USE_LOGDEPTHBUF');
opts.vertexShader = lines.join('\n');
}
// opts.vertexShader = opts.vertexShader.replace('#define EPSILON 1e-6', '#define EPSILON 1e-6\n#define USE_LOGDEPTHBUF 1');
opts.fragmentShader = formatFragmentShader(opts.fragmentShader);
super(opts);
}
}
export {
WebaverseShaderMaterial,
WebaverseRawShaderMaterial,
};