-
Notifications
You must be signed in to change notification settings - Fork 0
/
geo.mjs
61 lines (53 loc) · 1.33 KB
/
geo.mjs
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
import {
distance,
normalize,
rotate3DX,
rotate3DY,
sub,
abs,
max,
} from "./shaderLib.mjs";
import { unionSDF, subtractSDF, rayMarch } from "./marchLib.mjs";
let globalTime = 0;
/**
* Signed-distance-function for a sphere.
* @param point {[number, number, number]}
* @param center {[number, number, number]}
* @param radius {number}
* @returns {number}
*/
const sphereSDF = (point, center, radius) => {
return distance(point, center) - radius;
};
/**
* Signed-distance-function for a box.
* @param point {[number, number, number]}
* @param size {[number, number, number]}
* @returns {number}
*/
const boxSDF = (point, size) => {
const center = [0.0, 0.0, 0.0];
const q = sub(abs(point), size);
return distance(max(q, 0.0), center) + Math.min(Math.max(...q), 0.0);
};
const sceneSDF = (point) => {
const rotatedPoint = rotate3DY(
rotate3DX(point, Math.sin(globalTime)),
Math.cos(globalTime)
);
return unionSDF(
subtractSDF(
boxSDF(rotatedPoint, [0.9, 0.9, 0.9]),
sphereSDF(point, [0, 0, 0], 1.1)
),
sphereSDF(rotatedPoint, [Math.sin(globalTime) * 2.5, 0, 0], 0.3)
);
};
export const fragment = (x, y, time) => {
globalTime = time;
x -= 0.5;
y -= 0.5;
const source = [0, 0, -5];
const direction = normalize([x, y, 1]);
return rayMarch(source, direction, sceneSDF);
};