@ludicon/spark.js 0.0.14 → 0.1.0
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/README.md +33 -11
- package/dist/spark.esm.js +995 -471
- package/dist/spark_astc_rgb-CTmg8wnA.js +4 -0
- package/dist/spark_astc_rgba-CDMNWH6H.js +4 -0
- package/dist/spark_bc1_rgb-C0pbbQPO.js +4 -0
- package/dist/spark_bc4_r-YQ6i79H9.js +4 -0
- package/dist/spark_bc5_rg-BqzKgeMU.js +4 -0
- package/dist/spark_bc7_rgb-DBkDHCzE.js +4 -0
- package/dist/spark_bc7_rgba-DQUk89UX.js +4 -0
- package/dist/spark_eac_r-Dvy2qUxf.js +4 -0
- package/dist/spark_eac_rg-DKLVL9co.js +4 -0
- package/dist/spark_etc2_rgb-BpnNweVx.js +4 -0
- package/dist/utils-D_dYVlAC.js +419 -0
- package/package.json +6 -3
- package/src/three-gltf.js +29 -14
- package/dist/utils-BigAnOxg.js +0 -234
package/dist/utils-BigAnOxg.js
DELETED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
const n = `struct Params {
|
|
2
|
-
colorMode: u32,
|
|
3
|
-
};
|
|
4
|
-
|
|
5
|
-
@group(0) @binding(0) var src : texture_2d<f32>;
|
|
6
|
-
@group(0) @binding(1) var dst : texture_storage_2d<rgba8unorm, write>;
|
|
7
|
-
@group(0) @binding(2) var smp: sampler;
|
|
8
|
-
@group(0) @binding(3) var<uniform> params: Params;
|
|
9
|
-
|
|
10
|
-
fn linear_to_srgb_vec3(c: vec3<f32>) -> vec3<f32> {
|
|
11
|
-
return select(
|
|
12
|
-
1.055 * pow(c, vec3<f32>(1.0 / 2.4)) - 0.055,
|
|
13
|
-
c * 12.92,
|
|
14
|
-
c <= vec3<f32>(0.0031308)
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
fn linear_to_srgb_vec4(c: vec4<f32>) -> vec4<f32> {
|
|
19
|
-
return vec4<f32>(linear_to_srgb_vec3(c.xyz), c.w);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
fn normalize_vec4(c: vec4<f32>) -> vec4<f32> {
|
|
23
|
-
if (c.z == 0.0) {
|
|
24
|
-
// If the normal is stored with only the XY components, there's no need to normalize.
|
|
25
|
-
return c;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
return vec4<f32>(saturate(0.5 * normalize(2 * c.xyz - 1) + 0.5), c.w);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@compute @workgroup_size(8, 8)
|
|
33
|
-
fn mipmap(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
34
|
-
let dstSize = textureDimensions(dst).xy;
|
|
35
|
-
if (id.x >= dstSize.x || id.y >= dstSize.y) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
let size_rcp = vec2f(1.0) / vec2f(dstSize);
|
|
40
|
-
|
|
41
|
-
// We are not doing this yet, but in some cases we want to take 4 samples in order to apply alpha weighting,
|
|
42
|
-
// or to support non multiple of two textures.
|
|
43
|
-
let uv0 = (vec2f(id.xy) + vec2f(0.25)) * size_rcp;
|
|
44
|
-
let uv1 = uv0 + 0.5 * size_rcp;
|
|
45
|
-
|
|
46
|
-
var color = vec4f(0.0);
|
|
47
|
-
color += textureSampleLevel(src, smp, vec2f(uv0.x, uv0.y), 0);
|
|
48
|
-
color += textureSampleLevel(src, smp, vec2f(uv1.x, uv0.y), 0);
|
|
49
|
-
color += textureSampleLevel(src, smp, vec2f(uv0.x, uv1.y), 0);
|
|
50
|
-
color += textureSampleLevel(src, smp, vec2f(uv1.x, uv1.y), 0);
|
|
51
|
-
color *= 0.25;
|
|
52
|
-
|
|
53
|
-
// This would be the single sample implementation:
|
|
54
|
-
// let uv = (vec2f(id.xy) + vec2f(0.5)) * size_rcp;
|
|
55
|
-
// var color = textureSampleLevel(src, smp, vec2f(uv.x, uv.y), 0);
|
|
56
|
-
|
|
57
|
-
if (params.colorMode == 1) {
|
|
58
|
-
color = linear_to_srgb_vec4(color);
|
|
59
|
-
} else if (params.colorMode == 2) {
|
|
60
|
-
color = normalize_vec4(color);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
textureStore(dst, id.xy, color);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@compute @workgroup_size(8, 8)
|
|
67
|
-
fn resize(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
68
|
-
let dstSize = textureDimensions(dst).xy;
|
|
69
|
-
if (id.x >= dstSize.x || id.y >= dstSize.y) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
let uv = (vec2f(id.xy) + vec2f(0.5)) / vec2f(dstSize);
|
|
74
|
-
var color = textureSampleLevel(src, smp, uv, 0);
|
|
75
|
-
|
|
76
|
-
if (params.colorMode == 1) {
|
|
77
|
-
color = linear_to_srgb_vec4(color);
|
|
78
|
-
} else if (params.colorMode == 2) {
|
|
79
|
-
color = normalize_vec4(color);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
textureStore(dst, id.xy, color);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@compute @workgroup_size(8, 8)
|
|
86
|
-
fn flipy(@builtin(global_invocation_id) id : vec3<u32>) {
|
|
87
|
-
let dstSize = textureDimensions(dst).xy;
|
|
88
|
-
if (id.x >= dstSize.x || id.y >= dstSize.y) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
let uv = (vec2f(f32(id.x), f32(dstSize.y - 1u - id.y)) + vec2f(0.5)) / vec2f(dstSize);
|
|
93
|
-
var color = textureSampleLevel(src, smp, uv, 0);
|
|
94
|
-
|
|
95
|
-
if (params.colorMode == 1) {
|
|
96
|
-
color = linear_to_srgb_vec4(color);
|
|
97
|
-
} else if (params.colorMode == 2) {
|
|
98
|
-
color = normalize_vec4(color);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
textureStore(dst, id.xy, color);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Fullscreen vertex shader
|
|
105
|
-
struct VSOutput {
|
|
106
|
-
@builtin(position) pos: vec4<f32>,
|
|
107
|
-
@location(0) tex : vec2<f32>
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
@vertex
|
|
111
|
-
fn fullscreen_vs(@builtin(vertex_index) vertexIndex : u32) -> VSOutput {
|
|
112
|
-
|
|
113
|
-
var pos = array<vec2<f32>, 4>(
|
|
114
|
-
vec2<f32>(-1.0, 1.0),
|
|
115
|
-
vec2<f32>( 1.0, 1.0),
|
|
116
|
-
vec2<f32>(-1.0, -1.0),
|
|
117
|
-
vec2<f32>( 1.0, -1.0)
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
var tex = array<vec2<f32>, 4>(
|
|
121
|
-
vec2<f32>(0.0, 0.0),
|
|
122
|
-
vec2<f32>(1.0, 0.0),
|
|
123
|
-
vec2<f32>(0.0, 1.0),
|
|
124
|
-
vec2<f32>(1.0, 1.0)
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
var vs_output : VSOutput;
|
|
128
|
-
vs_output.tex = tex[vertexIndex];
|
|
129
|
-
vs_output.pos = vec4<f32>(pos[vertexIndex], 0.0, 1.0);
|
|
130
|
-
return vs_output;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
@fragment
|
|
134
|
-
fn mipmap_fs(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {
|
|
135
|
-
|
|
136
|
-
var color = textureSample(src, smp, uv);
|
|
137
|
-
|
|
138
|
-
if (params.colorMode == 2) {
|
|
139
|
-
color = normalize_vec4(color);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return color;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
@fragment
|
|
146
|
-
fn resize_fs(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {
|
|
147
|
-
|
|
148
|
-
var color = textureSample(src, smp, uv);
|
|
149
|
-
|
|
150
|
-
if (params.colorMode == 2) {
|
|
151
|
-
color = normalize_vec4(color);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return color;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
@fragment
|
|
158
|
-
fn flipy_fs(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {
|
|
159
|
-
|
|
160
|
-
var color = textureSample(src, smp, vec2(uv.x, 1 - uv.y));
|
|
161
|
-
|
|
162
|
-
if (params.colorMode == 2) {
|
|
163
|
-
color = normalize_vec4(color);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return color;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
@group(0) @binding(1) var<storage, read_write> global_counters: array<atomic<u32>, 3>;
|
|
171
|
-
|
|
172
|
-
var<workgroup> local_opaque: atomic<u32>;
|
|
173
|
-
var<workgroup> local_grayscale: atomic<u32>;
|
|
174
|
-
var<workgroup> local_invalid_normals: atomic<u32>;
|
|
175
|
-
|
|
176
|
-
@compute @workgroup_size(8, 8)
|
|
177
|
-
fn detect_channel_count(@builtin(global_invocation_id) global_id: vec3<u32>,
|
|
178
|
-
@builtin(local_invocation_index) local_id: u32) {
|
|
179
|
-
|
|
180
|
-
if (local_id == 0u) {
|
|
181
|
-
atomicStore(&local_opaque, 1u);
|
|
182
|
-
atomicStore(&local_grayscale, 1u);
|
|
183
|
-
atomicStore(&local_invalid_normals, 0u);
|
|
184
|
-
}
|
|
185
|
-
workgroupBarrier();
|
|
186
|
-
|
|
187
|
-
let tex_size = textureDimensions(src);
|
|
188
|
-
if (global_id.x < tex_size.x && global_id.y < tex_size.y) {
|
|
189
|
-
|
|
190
|
-
let color = textureLoad(src, vec2<i32>(global_id.xy), 0);
|
|
191
|
-
|
|
192
|
-
// Alpha check
|
|
193
|
-
if (color.a < 1.0) {
|
|
194
|
-
atomicStore(&local_opaque, 0u);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Grayscale check
|
|
198
|
-
if (color.r != color.g || color.g != color.b) {
|
|
199
|
-
atomicStore(&local_grayscale, 0u);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Normal check
|
|
203
|
-
let n = color.rgb * 2.0 - vec3(1.0);
|
|
204
|
-
let len = length(n);
|
|
205
|
-
|
|
206
|
-
if (abs(len - 1.0) > 0.2 || n.z < -0.1) {
|
|
207
|
-
atomicAdd(&local_invalid_normals, 1u);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
workgroupBarrier();
|
|
212
|
-
|
|
213
|
-
if (local_id == 0u) {
|
|
214
|
-
// If not opaque, write not-opaque flag.
|
|
215
|
-
if (atomicLoad(&local_opaque) == 0u) {
|
|
216
|
-
atomicStore(&global_counters[0], 1u);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// If not greyscale, write not greyscale flag.
|
|
220
|
-
if (atomicLoad(&local_grayscale) == 0u) {
|
|
221
|
-
atomicStore(&global_counters[1], 1u);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Add number of texels that are not normal.
|
|
225
|
-
atomicAdd(&global_counters[2], atomicLoad(&local_invalid_normals));
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
// @@ Compute RMSE?
|
|
231
|
-
`;
|
|
232
|
-
export {
|
|
233
|
-
n as default
|
|
234
|
-
};
|