onejs-sl 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +96 -7
- package/goldens/goldens.json +480 -0
- package/lib/common.hlsl +155 -0
- package/lib/noise2d.hlsl +167 -0
- package/lib/sdf2d.hlsl +510 -0
- package/package.json +9 -3
- package/src/body.ts +243 -0
- package/src/core.ts +1 -1
- package/src/emit/hlsl-body.ts +7 -0
- package/src/encode.ts +3 -24
- package/src/hlsl.ts +34 -143
- package/src/ir.ts +49 -2
- package/src/lang/lower.ts +6 -3
- package/src/lib/glsl.ts +899 -0
- package/src/lib/hlsl.ts +891 -0
- package/src/lib/index.ts +47 -0
- package/src/lib/table.ts +125 -0
- package/src/lib/types.ts +23 -0
- package/src/lib/wgsl.ts +994 -0
- package/src/serial.ts +3 -1
- package/src/shapes.ts +4 -4
- package/src/sl.ts +27 -1
- package/src/web.ts +53 -28
- package/src/weblib.ts +0 -1303
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The helper library every backend draws from: value and simplex noise, the
|
|
3
|
+
* octave kinds, voronoi, hsv2rgb, toLinear and the 42 distance shapes.
|
|
4
|
+
*
|
|
5
|
+
* Its one source is `lib/*.hlsl` in this package. OneJS's `.cginc` files are
|
|
6
|
+
* generated copies of it, and the tables here (`table.ts`, `glsl.ts`,
|
|
7
|
+
* `wgsl.ts`, `hlsl.ts`) are its translations, printed at build time by
|
|
8
|
+
* `lib/translate.ts`. Nothing here parses shader text; it only picks entries.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { LIB_FUNCTIONS } from "./table"
|
|
12
|
+
|
|
13
|
+
export { LIB_FUNCTIONS, SDF_CALLS } from "./table"
|
|
14
|
+
export type { LibFunction, SdfCall } from "./types"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A function's index by name, and by parameter types when the name is
|
|
18
|
+
* overloaded (`sl_toLinear`, `onejsFbm`). Throws for a name the library does
|
|
19
|
+
* not have, since an emitter asking for one is a bug in the emitter.
|
|
20
|
+
*/
|
|
21
|
+
export function libIndex(name: string, params?: readonly string[]): number {
|
|
22
|
+
const hits: number[] = []
|
|
23
|
+
LIB_FUNCTIONS.forEach((f, i) => {
|
|
24
|
+
if (f.name === name && (params === undefined || sameList(f.params, params))) hits.push(i)
|
|
25
|
+
})
|
|
26
|
+
if (hits.length !== 1) {
|
|
27
|
+
const sig = params === undefined ? name : `${name}(${params.join(", ")})`
|
|
28
|
+
throw new Error(`internal: the shader library has ${hits.length === 0 ? "no" : "more than one"} ${sig}`)
|
|
29
|
+
}
|
|
30
|
+
return hits[0]!
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Every index named, with everything each one calls, in library order (which is dependency order). */
|
|
34
|
+
export function libClosure(indices: Iterable<number>): number[] {
|
|
35
|
+
const want = new Set<number>()
|
|
36
|
+
const add = (i: number) => {
|
|
37
|
+
if (want.has(i)) return
|
|
38
|
+
want.add(i)
|
|
39
|
+
for (const d of LIB_FUNCTIONS[i]!.deps) add(d)
|
|
40
|
+
}
|
|
41
|
+
for (const i of indices) add(i)
|
|
42
|
+
return [...want].sort((a, b) => a - b)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function sameList(a: readonly string[], b: readonly string[]): boolean {
|
|
46
|
+
return a.length === b.length && a.every((x, i) => x === b[i])
|
|
47
|
+
}
|
package/src/lib/table.ts
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// GENERATED by lib/generate.ts from lib/*.hlsl. Do not edit: change the
|
|
2
|
+
// .hlsl and run `npm run lib`. src/lib/lib.test.ts fails when this is stale.
|
|
3
|
+
|
|
4
|
+
import type { LibFunction, SdfCall } from "./types"
|
|
5
|
+
|
|
6
|
+
/** Every function in the library, in dependency order. `deps` are indices into this list. */
|
|
7
|
+
export const LIB_FUNCTIONS: readonly LibFunction[] = [
|
|
8
|
+
{ name: "glslMod", params: ["float", "float"], ret: "float", wgsl: "glslMod", deps: [], colour: false },
|
|
9
|
+
{ name: "ndot", params: ["float2", "float2"], ret: "float", wgsl: "ndot", deps: [], colour: false },
|
|
10
|
+
{ name: "dot2", params: ["float2"], ret: "float", wgsl: "dot2", deps: [], colour: false },
|
|
11
|
+
{ name: "sdCircle", params: ["float2", "float"], ret: "float", wgsl: "sdCircle", deps: [], colour: false },
|
|
12
|
+
{ name: "sdRoundedBox", params: ["float2", "float2", "float4"], ret: "float", wgsl: "sdRoundedBox", deps: [], colour: false },
|
|
13
|
+
{ name: "sdBox", params: ["float2", "float2"], ret: "float", wgsl: "sdBox", deps: [], colour: false },
|
|
14
|
+
{ name: "sdOrientedBox", params: ["float2", "float2", "float2", "float"], ret: "float", wgsl: "sdOrientedBox", deps: [], colour: false },
|
|
15
|
+
{ name: "sdSegment", params: ["float2", "float2", "float2"], ret: "float", wgsl: "sdSegment", deps: [], colour: false },
|
|
16
|
+
{ name: "sdRhombus", params: ["float2", "float2"], ret: "float", wgsl: "sdRhombus", deps: [1], colour: false },
|
|
17
|
+
{ name: "sdTrapezoid", params: ["float2", "float", "float", "float"], ret: "float", wgsl: "sdTrapezoid", deps: [2], colour: false },
|
|
18
|
+
{ name: "sdParallelogram", params: ["float2", "float", "float", "float"], ret: "float", wgsl: "sdParallelogram", deps: [], colour: false },
|
|
19
|
+
{ name: "sdEquilateralTriangle", params: ["float2", "float"], ret: "float", wgsl: "sdEquilateralTriangle", deps: [], colour: false },
|
|
20
|
+
{ name: "sdTriangleIsosceles", params: ["float2", "float2"], ret: "float", wgsl: "sdTriangleIsosceles", deps: [], colour: false },
|
|
21
|
+
{ name: "sdTriangle", params: ["float2", "float2", "float2", "float2"], ret: "float", wgsl: "sdTriangle", deps: [], colour: false },
|
|
22
|
+
{ name: "sdUnevenCapsule", params: ["float2", "float", "float", "float"], ret: "float", wgsl: "sdUnevenCapsule", deps: [], colour: false },
|
|
23
|
+
{ name: "sdPentagon", params: ["float2", "float"], ret: "float", wgsl: "sdPentagon", deps: [], colour: false },
|
|
24
|
+
{ name: "sdHexagon", params: ["float2", "float"], ret: "float", wgsl: "sdHexagon", deps: [], colour: false },
|
|
25
|
+
{ name: "sdOctogon", params: ["float2", "float"], ret: "float", wgsl: "sdOctogon", deps: [], colour: false },
|
|
26
|
+
{ name: "sdHexagram", params: ["float2", "float"], ret: "float", wgsl: "sdHexagram", deps: [], colour: false },
|
|
27
|
+
{ name: "sdStar5", params: ["float2", "float", "float"], ret: "float", wgsl: "sdStar5", deps: [], colour: false },
|
|
28
|
+
{ name: "sdStar", params: ["float2", "float", "int", "float"], ret: "float", wgsl: "sdStar", deps: [0], colour: false },
|
|
29
|
+
{ name: "sdPie", params: ["float2", "float2", "float"], ret: "float", wgsl: "sdPie", deps: [], colour: false },
|
|
30
|
+
{ name: "sdCutDisk", params: ["float2", "float", "float"], ret: "float", wgsl: "sdCutDisk", deps: [], colour: false },
|
|
31
|
+
{ name: "sdArc", params: ["float2", "float2", "float", "float"], ret: "float", wgsl: "sdArc", deps: [], colour: false },
|
|
32
|
+
{ name: "sdRing", params: ["float2", "float2", "float", "float"], ret: "float", wgsl: "sdRing", deps: [], colour: false },
|
|
33
|
+
{ name: "sdHorseshoe", params: ["float2", "float2", "float", "float2"], ret: "float", wgsl: "sdHorseshoe", deps: [], colour: false },
|
|
34
|
+
{ name: "sdVesica", params: ["float2", "float", "float"], ret: "float", wgsl: "sdVesica", deps: [], colour: false },
|
|
35
|
+
{ name: "sdOrientedVesica", params: ["float2", "float2", "float2", "float"], ret: "float", wgsl: "sdOrientedVesica", deps: [], colour: false },
|
|
36
|
+
{ name: "sdMoon", params: ["float2", "float", "float", "float"], ret: "float", wgsl: "sdMoon", deps: [], colour: false },
|
|
37
|
+
{ name: "sdRoundedCross", params: ["float2", "float"], ret: "float", wgsl: "sdRoundedCross", deps: [2], colour: false },
|
|
38
|
+
{ name: "sdEgg", params: ["float2", "float", "float", "float", "float"], ret: "float", wgsl: "sdEgg", deps: [], colour: false },
|
|
39
|
+
{ name: "sdHeart", params: ["float2"], ret: "float", wgsl: "sdHeart", deps: [], colour: false },
|
|
40
|
+
{ name: "sdCross", params: ["float2", "float2", "float"], ret: "float", wgsl: "sdCross", deps: [], colour: false },
|
|
41
|
+
{ name: "sdRoundedX", params: ["float2", "float", "float"], ret: "float", wgsl: "sdRoundedX", deps: [], colour: false },
|
|
42
|
+
{ name: "sdEllipse", params: ["float2", "float2"], ret: "float", wgsl: "sdEllipse", deps: [], colour: false },
|
|
43
|
+
{ name: "sdParabola", params: ["float2", "float"], ret: "float", wgsl: "sdParabola", deps: [], colour: false },
|
|
44
|
+
{ name: "sdParabolaSegment", params: ["float2", "float", "float"], ret: "float", wgsl: "sdParabolaSegment", deps: [], colour: false },
|
|
45
|
+
{ name: "sdBezier", params: ["float2", "float2", "float2", "float2"], ret: "float", wgsl: "sdBezier", deps: [], colour: false },
|
|
46
|
+
{ name: "sdBlobbyCross", params: ["float2", "float"], ret: "float", wgsl: "sdBlobbyCross", deps: [], colour: false },
|
|
47
|
+
{ name: "sdTunnel", params: ["float2", "float2"], ret: "float", wgsl: "sdTunnel", deps: [], colour: false },
|
|
48
|
+
{ name: "sdStairs", params: ["float2", "float2", "float"], ret: "float", wgsl: "sdStairs", deps: [], colour: false },
|
|
49
|
+
{ name: "sdQuadraticCircle", params: ["float2"], ret: "float", wgsl: "sdQuadraticCircle", deps: [], colour: false },
|
|
50
|
+
{ name: "sdHyberbola", params: ["float2", "float", "float"], ret: "float", wgsl: "sdHyberbola", deps: [], colour: false },
|
|
51
|
+
{ name: "sdCoolS", params: ["float2"], ret: "float", wgsl: "sdCoolS", deps: [2], colour: false },
|
|
52
|
+
{ name: "sdCircleWave", params: ["float2", "float", "float"], ret: "float", wgsl: "sdCircleWave", deps: [0], colour: false },
|
|
53
|
+
{ name: "onejsHash21", params: ["float2", "float"], ret: "float", wgsl: "onejsHash21", deps: [], colour: false },
|
|
54
|
+
{ name: "onejsVNoise", params: ["float2", "float"], ret: "float", wgsl: "onejsVNoise", deps: [45], colour: false },
|
|
55
|
+
{ name: "onejsFbm", params: ["float2", "float", "int", "float", "float"], ret: "float", wgsl: "onejsFbm_f2_f_i_f_f", deps: [46], colour: false },
|
|
56
|
+
{ name: "onejsFbm", params: ["float2", "float", "int"], ret: "float", wgsl: "onejsFbm_f2_f_i", deps: [47], colour: false },
|
|
57
|
+
{ name: "onejsMod289", params: ["float2"], ret: "float2", wgsl: "onejsMod289_f2", deps: [], colour: false },
|
|
58
|
+
{ name: "onejsMod289", params: ["float3"], ret: "float3", wgsl: "onejsMod289_f3", deps: [], colour: false },
|
|
59
|
+
{ name: "onejsPermute", params: ["float3"], ret: "float3", wgsl: "onejsPermute", deps: [50], colour: false },
|
|
60
|
+
{ name: "onejsSimplexRaw", params: ["float2"], ret: "float", wgsl: "onejsSimplexRaw", deps: [49, 51], colour: false },
|
|
61
|
+
{ name: "onejsSimplex", params: ["float2", "float"], ret: "float", wgsl: "onejsSimplex", deps: [52], colour: false },
|
|
62
|
+
{ name: "onejsFbmSimplex", params: ["float2", "float", "int", "float", "float"], ret: "float", wgsl: "onejsFbmSimplex", deps: [53], colour: false },
|
|
63
|
+
{ name: "onejsTurbulence", params: ["float2", "float", "int", "float", "float"], ret: "float", wgsl: "onejsTurbulence", deps: [52], colour: false },
|
|
64
|
+
{ name: "onejsRidged", params: ["float2", "float", "int", "float", "float"], ret: "float", wgsl: "onejsRidged", deps: [52], colour: false },
|
|
65
|
+
{ name: "onejsFbmKind", params: ["int", "float2", "float", "int", "float", "float"], ret: "float", wgsl: "onejsFbmKind", deps: [47, 54, 55, 56], colour: false },
|
|
66
|
+
{ name: "sl_hash21", params: ["float2"], ret: "float", wgsl: "sl_hash21", deps: [], colour: false },
|
|
67
|
+
{ name: "sl_valueNoise", params: ["float2"], ret: "float", wgsl: "sl_valueNoise", deps: [46], colour: false },
|
|
68
|
+
{ name: "sl_simplex", params: ["float2"], ret: "float", wgsl: "sl_simplex", deps: [53], colour: false },
|
|
69
|
+
{ name: "sl_fbm", params: ["float2", "int", "int"], ret: "float", wgsl: "sl_fbm", deps: [57], colour: false },
|
|
70
|
+
{ name: "sl_hsv2rgb", params: ["float3"], ret: "float3", wgsl: "sl_hsv2rgb", deps: [], colour: false },
|
|
71
|
+
{ name: "sl_sdfDistance", params: ["int", "float2", "float4", "float2"], ret: "float", wgsl: "sl_sdfDistance", deps: [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], colour: false },
|
|
72
|
+
{ name: "sl_voronoi", params: ["float2"], ret: "float", wgsl: "sl_voronoi", deps: [58], colour: false },
|
|
73
|
+
{ name: "sl_luminance", params: ["float3"], ret: "float", wgsl: "sl_luminance", deps: [], colour: false },
|
|
74
|
+
{ name: "sl_gammaToLinear", params: ["float3"], ret: "float3", wgsl: "sl_gammaToLinear", deps: [], colour: false },
|
|
75
|
+
{ name: "sl_toLinear", params: ["float"], ret: "float", wgsl: "sl_toLinear_f", deps: [66], colour: true },
|
|
76
|
+
{ name: "sl_toLinear", params: ["float2"], ret: "float2", wgsl: "sl_toLinear_f2", deps: [66], colour: true },
|
|
77
|
+
{ name: "sl_toLinear", params: ["float3"], ret: "float3", wgsl: "sl_toLinear_f3", deps: [66], colour: true },
|
|
78
|
+
{ name: "sl_toLinear", params: ["float4"], ret: "float4", wgsl: "sl_toLinear_f4", deps: [66], colour: true },
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
/** Shape id to the function and where its parameters come from, read from sl_sdfDistance's switch. */
|
|
82
|
+
export const SDF_CALLS: readonly SdfCall[] = [
|
|
83
|
+
{ fn: "sdCircle", args: [[0]] },
|
|
84
|
+
{ fn: "sdRoundedBox", args: [[0, 1], [2, 3, 4, 5]] },
|
|
85
|
+
{ fn: "sdBox", args: [[0, 1]] },
|
|
86
|
+
{ fn: "sdOrientedBox", args: [[0, 1], [2, 3], [4]] },
|
|
87
|
+
{ fn: "sdSegment", args: [[0, 1], [2, 3]] },
|
|
88
|
+
{ fn: "sdRhombus", args: [[0, 1]] },
|
|
89
|
+
{ fn: "sdTrapezoid", args: [[0], [1], [2]] },
|
|
90
|
+
{ fn: "sdParallelogram", args: [[0], [1], [2]] },
|
|
91
|
+
{ fn: "sdEquilateralTriangle", args: [[0]] },
|
|
92
|
+
{ fn: "sdTriangleIsosceles", args: [[0, 1]] },
|
|
93
|
+
{ fn: "sdTriangle", args: [[0, 1], [2, 3], [4, 5]] },
|
|
94
|
+
{ fn: "sdUnevenCapsule", args: [[0], [1], [2]] },
|
|
95
|
+
{ fn: "sdPentagon", args: [[0]] },
|
|
96
|
+
{ fn: "sdHexagon", args: [[0]] },
|
|
97
|
+
{ fn: "sdOctogon", args: [[0]] },
|
|
98
|
+
{ fn: "sdHexagram", args: [[0]] },
|
|
99
|
+
{ fn: "sdStar5", args: [[0], [1]] },
|
|
100
|
+
{ fn: "sdStar", args: [[0], { int: 1 }, [2]] },
|
|
101
|
+
{ fn: "sdPie", args: [[0, 1], [2]] },
|
|
102
|
+
{ fn: "sdCutDisk", args: [[0], [1]] },
|
|
103
|
+
{ fn: "sdArc", args: [[0, 1], [2], [3]] },
|
|
104
|
+
{ fn: "sdRing", args: [[0, 1], [2], [3]] },
|
|
105
|
+
{ fn: "sdHorseshoe", args: [[0, 1], [2], [3, 4]] },
|
|
106
|
+
{ fn: "sdVesica", args: [[0], [1]] },
|
|
107
|
+
{ fn: "sdOrientedVesica", args: [[0, 1], [2, 3], [4]] },
|
|
108
|
+
{ fn: "sdMoon", args: [[0], [1], [2]] },
|
|
109
|
+
{ fn: "sdRoundedCross", args: [[0]] },
|
|
110
|
+
{ fn: "sdEgg", args: [[0], [1], [2], [3]] },
|
|
111
|
+
{ fn: "sdHeart", args: [] },
|
|
112
|
+
{ fn: "sdCross", args: [[0, 1], [2]] },
|
|
113
|
+
{ fn: "sdRoundedX", args: [[0], [1]] },
|
|
114
|
+
{ fn: "sdEllipse", args: [[0, 1]] },
|
|
115
|
+
{ fn: "sdParabola", args: [[0]] },
|
|
116
|
+
{ fn: "sdParabolaSegment", args: [[0], [1]] },
|
|
117
|
+
{ fn: "sdBezier", args: [[0, 1], [2, 3], [4, 5]] },
|
|
118
|
+
{ fn: "sdBlobbyCross", args: [[0]] },
|
|
119
|
+
{ fn: "sdTunnel", args: [[0, 1]] },
|
|
120
|
+
{ fn: "sdStairs", args: [[0, 1], [2]] },
|
|
121
|
+
{ fn: "sdQuadraticCircle", args: [] },
|
|
122
|
+
{ fn: "sdHyberbola", args: [[0], [1]] },
|
|
123
|
+
{ fn: "sdCoolS", args: [] },
|
|
124
|
+
{ fn: "sdCircleWave", args: [[0], [1]] },
|
|
125
|
+
]
|
package/src/lib/types.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** One function of the helper library, as `lib/generate.ts` records it. */
|
|
2
|
+
export interface LibFunction {
|
|
3
|
+
name: string
|
|
4
|
+
/** Parameter types, HLSL spelling: `float`, `float2`, `int`... */
|
|
5
|
+
params: readonly string[]
|
|
6
|
+
ret: string
|
|
7
|
+
/** Its WGSL name: an overloaded name carries its signature there, since WGSL has no overloading. */
|
|
8
|
+
wgsl: string
|
|
9
|
+
/** Indices of the functions it calls, all earlier in the list. */
|
|
10
|
+
deps: readonly number[]
|
|
11
|
+
/** Written once per colour space (`#ifdef UNITY_COLORSPACE_GAMMA`). */
|
|
12
|
+
colour: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* How a shape's parameters reach its function: each argument after the point
|
|
17
|
+
* is a list of indices into `[a.x, a.y, a.z, a.w, b.x, b.y]`, or `{ int: i }`
|
|
18
|
+
* for an integer parameter.
|
|
19
|
+
*/
|
|
20
|
+
export interface SdfCall {
|
|
21
|
+
fn: string
|
|
22
|
+
args: ReadonlyArray<readonly number[] | { int: number }>
|
|
23
|
+
}
|