@babylonjs/lite-gl 0.1.0 → 0.2.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 +10 -34
- package/apply-states.d.ts +1 -0
- package/apply-states.js +30 -0
- package/apply-states.js.map +1 -0
- package/blend.d.ts +123 -0
- package/blend.js +194 -0
- package/blend.js.map +1 -0
- package/context.d.ts +130 -0
- package/context.js +354 -0
- package/context.js.map +1 -0
- package/depth-stencil.d.ts +155 -231
- package/depth-stencil.js +399 -262
- package/depth-stencil.js.map +1 -1
- package/dynamic-texture.d.ts +59 -149
- package/dynamic-texture.js +123 -69
- package/dynamic-texture.js.map +1 -1
- package/effect-renderer.d.ts +65 -0
- package/effect-renderer.js +132 -0
- package/effect-renderer.js.map +1 -0
- package/effect.d.ts +142 -0
- package/effect.js +465 -0
- package/effect.js.map +1 -0
- package/html-texture.d.ts +44 -143
- package/html-texture.js +87 -81
- package/html-texture.js.map +1 -1
- package/index.d.ts +23 -1482
- package/index.js +42 -263
- package/index.js.map +1 -1
- package/mesh.d.ts +210 -307
- package/mesh.js +436 -311
- package/mesh.js.map +1 -1
- package/package.json +5 -29
- package/render-loop.d.ts +8 -0
- package/render-loop.js +62 -0
- package/render-loop.js.map +1 -0
- package/render-target.d.ts +233 -290
- package/render-target.js +534 -335
- package/render-target.js.map +1 -1
- package/scissor.d.ts +30 -72
- package/scissor.js +47 -33
- package/scissor.js.map +1 -1
- package/shader.d.ts +22 -0
- package/shader.js +65 -0
- package/shader.js.map +1 -0
- package/sprites.d.ts +182 -263
- package/sprites.js +426 -10
- package/sprites.js.map +1 -1
- package/state.d.ts +126 -0
- package/state.js +153 -0
- package/state.js.map +1 -0
- package/texture.d.ts +142 -0
- package/texture.js +433 -0
- package/texture.js.map +1 -0
- package/effect-BxxwfB_O.js +0 -737
- package/effect-BxxwfB_O.js.map +0 -1
- package/sprites--1oyVtJ3.js +0 -437
- package/sprites--1oyVtJ3.js.map +0 -1
- package/state--j_ncWIi.js +0 -155
- package/state--j_ncWIi.js.map +0 -1
- package/texture-DaMd1gGm.js +0 -329
- package/texture-DaMd1gGm.js.map +0 -1
package/effect-BxxwfB_O.js
DELETED
|
@@ -1,737 +0,0 @@
|
|
|
1
|
-
import { A as createGLState, B as resetGLState, C as resetGLStateCache } from "./state--j_ncWIi.js";
|
|
2
|
-
import { b as bindTexture } from "./texture-DaMd1gGm.js";
|
|
3
|
-
function createGLEngine(canvas, options) {
|
|
4
|
-
const o = options ?? {};
|
|
5
|
-
const attrs = {
|
|
6
|
-
alpha: o.alpha ?? true,
|
|
7
|
-
premultipliedAlpha: o.premultipliedAlpha ?? true,
|
|
8
|
-
antialias: o.antialias ?? false,
|
|
9
|
-
preserveDrawingBuffer: o.preserveDrawingBuffer ?? false,
|
|
10
|
-
depth: o.depth ?? false,
|
|
11
|
-
stencil: o.stencil ?? false,
|
|
12
|
-
powerPreference: o.powerPreference ?? "default",
|
|
13
|
-
failIfMajorPerformanceCaveat: o.failIfMajorPerformanceCaveat ?? false
|
|
14
|
-
};
|
|
15
|
-
const gl = canvas.getContext("webgl2", attrs);
|
|
16
|
-
if (gl === null) {
|
|
17
|
-
throw new Error("lite-gl: WebGL2 is not supported on this canvas");
|
|
18
|
-
}
|
|
19
|
-
const parallelExt = gl.getExtension("KHR_parallel_shader_compile");
|
|
20
|
-
const colorBufferFloat = gl.getExtension("EXT_color_buffer_float") !== null;
|
|
21
|
-
const colorBufferHalfFloat = gl.getExtension("EXT_color_buffer_half_float") !== null;
|
|
22
|
-
const floatLinear = gl.getExtension("OES_texture_float_linear") !== null;
|
|
23
|
-
const caps = {
|
|
24
|
-
maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),
|
|
25
|
-
maxTextureUnits: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),
|
|
26
|
-
parallelShaderCompile: parallelExt,
|
|
27
|
-
textureFloatRender: colorBufferFloat,
|
|
28
|
-
textureFloatLinearFiltering: floatLinear,
|
|
29
|
-
// In WebGL2, EXT_color_buffer_float also makes RGBA16F renderable; the
|
|
30
|
-
// half-float-only extension is the fallback for drivers exposing just it.
|
|
31
|
-
textureHalfFloatRender: colorBufferFloat || colorBufferHalfFloat,
|
|
32
|
-
// Half-float linear filtering is core in WebGL2 (no extension needed).
|
|
33
|
-
textureHalfFloatLinearFiltering: true,
|
|
34
|
-
// NPOT textures are core in WebGL2 — mips/wrap work at any size.
|
|
35
|
-
needPOTTextures: false
|
|
36
|
-
};
|
|
37
|
-
const engine = {
|
|
38
|
-
canvas,
|
|
39
|
-
gl,
|
|
40
|
-
caps,
|
|
41
|
-
_hsl: 1,
|
|
42
|
-
_rafId: 0,
|
|
43
|
-
_loops: [],
|
|
44
|
-
_prevNow: 0,
|
|
45
|
-
_state: createGLState(caps.maxTextureUnits),
|
|
46
|
-
_effects: [],
|
|
47
|
-
_effectCache: /* @__PURE__ */ new Map(),
|
|
48
|
-
_textures: [],
|
|
49
|
-
_renderTargets: [],
|
|
50
|
-
_currentRenderTarget: null,
|
|
51
|
-
_buffers: [],
|
|
52
|
-
_onLost: [],
|
|
53
|
-
_onRestored: [],
|
|
54
|
-
_isLost: false,
|
|
55
|
-
_disposed: false,
|
|
56
|
-
_lostHandler: () => {
|
|
57
|
-
},
|
|
58
|
-
_restoredHandler: () => {
|
|
59
|
-
},
|
|
60
|
-
_wasLoopActive: false,
|
|
61
|
-
_scheduleFrame: null
|
|
62
|
-
};
|
|
63
|
-
engine._lostHandler = (e) => handleContextLost(engine, e);
|
|
64
|
-
engine._restoredHandler = () => handleContextRestored(engine);
|
|
65
|
-
canvas.addEventListener("webglcontextlost", engine._lostHandler, false);
|
|
66
|
-
canvas.addEventListener("webglcontextrestored", engine._restoredHandler, false);
|
|
67
|
-
return engine;
|
|
68
|
-
}
|
|
69
|
-
function disposeGLEngine(engine) {
|
|
70
|
-
if (engine._disposed) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
engine._disposed = true;
|
|
74
|
-
if (engine._rafId !== 0) {
|
|
75
|
-
cancelAnimationFrame(engine._rafId);
|
|
76
|
-
engine._rafId = 0;
|
|
77
|
-
}
|
|
78
|
-
engine._loops.length = 0;
|
|
79
|
-
engine.canvas.removeEventListener("webglcontextlost", engine._lostHandler, false);
|
|
80
|
-
engine.canvas.removeEventListener("webglcontextrestored", engine._restoredHandler, false);
|
|
81
|
-
const gl = engine.gl;
|
|
82
|
-
const effects = engine._effects.slice();
|
|
83
|
-
for (const eff of effects) {
|
|
84
|
-
if (!eff._disposed) {
|
|
85
|
-
eff._disposed = true;
|
|
86
|
-
eff.isReady = false;
|
|
87
|
-
gl.deleteProgram(eff.program);
|
|
88
|
-
gl.deleteShader(eff._vs);
|
|
89
|
-
gl.deleteShader(eff._fs);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
engine._effects.length = 0;
|
|
93
|
-
engine._effectCache.clear();
|
|
94
|
-
const textures = engine._textures.slice();
|
|
95
|
-
for (const tex of textures) {
|
|
96
|
-
if (!tex._disposed) {
|
|
97
|
-
tex._disposed = true;
|
|
98
|
-
gl.deleteTexture(tex.handle);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
engine._textures.length = 0;
|
|
102
|
-
const rts = engine._renderTargets.slice();
|
|
103
|
-
for (const rt of rts) {
|
|
104
|
-
if (!rt._disposed) {
|
|
105
|
-
rt._disposed = true;
|
|
106
|
-
rt._deleteGpu(gl);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
engine._renderTargets.length = 0;
|
|
110
|
-
const buffers = engine._buffers.slice();
|
|
111
|
-
for (const buf of buffers) {
|
|
112
|
-
if (!buf._disposed) {
|
|
113
|
-
buf._disposed = true;
|
|
114
|
-
buf._deleteGpu(gl);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
engine._buffers.length = 0;
|
|
118
|
-
resetGLState(engine._state);
|
|
119
|
-
engine._currentRenderTarget = null;
|
|
120
|
-
engine._onLost.length = 0;
|
|
121
|
-
engine._onRestored.length = 0;
|
|
122
|
-
}
|
|
123
|
-
function resizeGLEngine(engine) {
|
|
124
|
-
if (engine._disposed || engine._isLost) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
const canvas = engine.canvas;
|
|
128
|
-
if (!("clientWidth" in canvas)) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const dpr = typeof devicePixelRatio === "number" ? devicePixelRatio : 1;
|
|
132
|
-
const w = Math.max(1, Math.floor(canvas.clientWidth * dpr / engine._hsl));
|
|
133
|
-
const h = Math.max(1, Math.floor(canvas.clientHeight * dpr / engine._hsl));
|
|
134
|
-
if (canvas.width !== w) {
|
|
135
|
-
canvas.width = w;
|
|
136
|
-
}
|
|
137
|
-
if (canvas.height !== h) {
|
|
138
|
-
canvas.height = h;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
function setGLEngineSize(engine, width, height) {
|
|
142
|
-
if (engine._disposed) {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
const canvas = engine.canvas;
|
|
146
|
-
const w = Math.max(1, Math.floor(width / engine._hsl));
|
|
147
|
-
const h = Math.max(1, Math.floor(height / engine._hsl));
|
|
148
|
-
if (canvas.width !== w) {
|
|
149
|
-
canvas.width = w;
|
|
150
|
-
}
|
|
151
|
-
if (canvas.height !== h) {
|
|
152
|
-
canvas.height = h;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
function wipeGLStateCache(engine) {
|
|
156
|
-
if (engine._disposed || engine._isLost) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
resetGLStateCache(engine._state);
|
|
160
|
-
}
|
|
161
|
-
function getRenderWidth(engine) {
|
|
162
|
-
return engine.canvas.width;
|
|
163
|
-
}
|
|
164
|
-
function getRenderHeight(engine) {
|
|
165
|
-
return engine.canvas.height;
|
|
166
|
-
}
|
|
167
|
-
function getHardwareScalingLevel(engine) {
|
|
168
|
-
return engine._hsl;
|
|
169
|
-
}
|
|
170
|
-
function setHardwareScalingLevel(engine, level) {
|
|
171
|
-
if (level <= 0 || !isFinite(level)) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
engine._hsl = level;
|
|
175
|
-
resizeGLEngine(engine);
|
|
176
|
-
}
|
|
177
|
-
function getRenderingCanvas(engine) {
|
|
178
|
-
return engine.canvas;
|
|
179
|
-
}
|
|
180
|
-
function onContextLost(engine, cb) {
|
|
181
|
-
if (engine._onLost.indexOf(cb) === -1) {
|
|
182
|
-
engine._onLost.push(cb);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
function offContextLost(engine, cb) {
|
|
186
|
-
const i = engine._onLost.indexOf(cb);
|
|
187
|
-
if (i !== -1) {
|
|
188
|
-
engine._onLost.splice(i, 1);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function onContextRestored(engine, cb) {
|
|
192
|
-
if (engine._onRestored.indexOf(cb) === -1) {
|
|
193
|
-
engine._onRestored.push(cb);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function offContextRestored(engine, cb) {
|
|
197
|
-
const i = engine._onRestored.indexOf(cb);
|
|
198
|
-
if (i !== -1) {
|
|
199
|
-
engine._onRestored.splice(i, 1);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
function handleContextLost(engine, e) {
|
|
203
|
-
e.preventDefault();
|
|
204
|
-
if (engine._isLost || engine._disposed) {
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
engine._isLost = true;
|
|
208
|
-
engine._wasLoopActive = engine._rafId !== 0;
|
|
209
|
-
if (engine._rafId !== 0) {
|
|
210
|
-
cancelAnimationFrame(engine._rafId);
|
|
211
|
-
engine._rafId = 0;
|
|
212
|
-
}
|
|
213
|
-
resetGLState(engine._state);
|
|
214
|
-
engine._currentRenderTarget = null;
|
|
215
|
-
for (const eff of engine._effects) {
|
|
216
|
-
eff.isReady = false;
|
|
217
|
-
eff._samplersAssigned = false;
|
|
218
|
-
eff.uniformLocations = {};
|
|
219
|
-
eff.attributeLocations = {};
|
|
220
|
-
clearObject(eff._lastF1);
|
|
221
|
-
clearObject(eff._lastVec);
|
|
222
|
-
clearObject(eff._lastI1);
|
|
223
|
-
}
|
|
224
|
-
for (const tex of engine._textures) {
|
|
225
|
-
tex._wasReady = tex.isReady;
|
|
226
|
-
tex.isReady = false;
|
|
227
|
-
}
|
|
228
|
-
const cbs = engine._onLost.slice();
|
|
229
|
-
for (const cb of cbs) {
|
|
230
|
-
try {
|
|
231
|
-
cb();
|
|
232
|
-
} catch (err) {
|
|
233
|
-
console.error("lite-gl: onLost callback threw", err);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
function handleContextRestored(engine) {
|
|
238
|
-
if (engine._disposed) {
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
for (const eff of engine._effects) {
|
|
242
|
-
if (!eff._disposed) {
|
|
243
|
-
eff._restore(engine);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
for (const tex of engine._textures) {
|
|
247
|
-
if (!tex._disposed) {
|
|
248
|
-
const newHandle = engine.gl.createTexture();
|
|
249
|
-
if (newHandle !== null) {
|
|
250
|
-
tex.handle = newHandle;
|
|
251
|
-
tex._upload(engine);
|
|
252
|
-
tex.isReady = tex._wasReady;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
engine._isLost = false;
|
|
257
|
-
for (const rt of engine._renderTargets) {
|
|
258
|
-
if (!rt._disposed) {
|
|
259
|
-
rt._restore(engine);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
for (const buf of engine._buffers) {
|
|
263
|
-
if (!buf._disposed) {
|
|
264
|
-
buf._restore(engine);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
if (engine._wasLoopActive && engine._loops.length > 0 && engine._scheduleFrame !== null) {
|
|
268
|
-
engine._scheduleFrame(engine);
|
|
269
|
-
}
|
|
270
|
-
const cbs = engine._onRestored.slice();
|
|
271
|
-
for (const cb of cbs) {
|
|
272
|
-
try {
|
|
273
|
-
cb();
|
|
274
|
-
} catch (err) {
|
|
275
|
-
console.error("lite-gl: onRestored callback threw", err);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
function clearObject(o) {
|
|
280
|
-
for (const key in o) {
|
|
281
|
-
delete o[key];
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
function compileShader(gl, source, stage, errorOut) {
|
|
285
|
-
const shader = gl.createShader(stage);
|
|
286
|
-
if (shader === null) {
|
|
287
|
-
errorOut[0] = "gl.createShader returned null";
|
|
288
|
-
return null;
|
|
289
|
-
}
|
|
290
|
-
gl.shaderSource(shader, source);
|
|
291
|
-
gl.compileShader(shader);
|
|
292
|
-
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
293
|
-
errorOut[0] = gl.getShaderInfoLog(shader) ?? "shader compile failed";
|
|
294
|
-
gl.deleteShader(shader);
|
|
295
|
-
return null;
|
|
296
|
-
}
|
|
297
|
-
return shader;
|
|
298
|
-
}
|
|
299
|
-
function linkProgram(gl, vs, fs, attributeNames) {
|
|
300
|
-
const program = gl.createProgram();
|
|
301
|
-
if (program === null) {
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
gl.attachShader(program, vs);
|
|
305
|
-
gl.attachShader(program, fs);
|
|
306
|
-
for (let i = 0; i < attributeNames.length; i++) {
|
|
307
|
-
const name = attributeNames[i];
|
|
308
|
-
if (name !== void 0) {
|
|
309
|
-
gl.bindAttribLocation(program, i, name);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
gl.linkProgram(program);
|
|
313
|
-
return program;
|
|
314
|
-
}
|
|
315
|
-
function isLinkComplete(gl, program, parallel) {
|
|
316
|
-
if (parallel === null) {
|
|
317
|
-
return true;
|
|
318
|
-
}
|
|
319
|
-
return Boolean(gl.getProgramParameter(program, parallel.COMPLETION_STATUS_KHR));
|
|
320
|
-
}
|
|
321
|
-
function getLinkError(gl, program) {
|
|
322
|
-
if (gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
323
|
-
return null;
|
|
324
|
-
}
|
|
325
|
-
return gl.getProgramInfoLog(program) ?? "link failed";
|
|
326
|
-
}
|
|
327
|
-
function createEffect(engine, options) {
|
|
328
|
-
const attribs = options.attributeNames ?? ["position"];
|
|
329
|
-
const gl = engine.gl;
|
|
330
|
-
const cacheKey = [options.vertexSource, options.fragmentSource, options.defines ?? "", attribs.join(","), options.uniformNames.join(","), options.samplerNames.join(",")].join(
|
|
331
|
-
"\0"
|
|
332
|
-
);
|
|
333
|
-
const cached = engine._effectCache.get(cacheKey);
|
|
334
|
-
if (cached !== void 0 && !cached._disposed) {
|
|
335
|
-
cached._refCount++;
|
|
336
|
-
return cached;
|
|
337
|
-
}
|
|
338
|
-
const compileErr = [null];
|
|
339
|
-
const finalVS = applyDefines(options.vertexSource, options.defines);
|
|
340
|
-
const finalFS = applyDefines(options.fragmentSource, options.defines);
|
|
341
|
-
const vs = compileShader(gl, finalVS, gl.VERTEX_SHADER, compileErr);
|
|
342
|
-
if (vs === null) {
|
|
343
|
-
throw new Error(`lite-gl: ${options.name} vertex compile failed: ${compileErr[0] ?? "unknown"}`);
|
|
344
|
-
}
|
|
345
|
-
const fs = compileShader(gl, finalFS, gl.FRAGMENT_SHADER, compileErr);
|
|
346
|
-
if (fs === null) {
|
|
347
|
-
gl.deleteShader(vs);
|
|
348
|
-
throw new Error(`lite-gl: ${options.name} fragment compile failed: ${compileErr[0] ?? "unknown"}`);
|
|
349
|
-
}
|
|
350
|
-
const program = linkProgram(gl, vs, fs, attribs);
|
|
351
|
-
if (program === null) {
|
|
352
|
-
gl.deleteShader(vs);
|
|
353
|
-
gl.deleteShader(fs);
|
|
354
|
-
throw new Error(`lite-gl: ${options.name} program allocation failed`);
|
|
355
|
-
}
|
|
356
|
-
const effect = {
|
|
357
|
-
name: options.name,
|
|
358
|
-
options,
|
|
359
|
-
program,
|
|
360
|
-
_vs: vs,
|
|
361
|
-
_fs: fs,
|
|
362
|
-
uniformLocations: {},
|
|
363
|
-
samplerUnits: {},
|
|
364
|
-
_samplersAssigned: false,
|
|
365
|
-
attributeLocations: {},
|
|
366
|
-
_lastF1: {},
|
|
367
|
-
_lastVec: {},
|
|
368
|
-
_lastI1: {},
|
|
369
|
-
isReady: false,
|
|
370
|
-
_compileError: null,
|
|
371
|
-
_disposed: false,
|
|
372
|
-
_refCount: 1,
|
|
373
|
-
_cacheKey: cacheKey,
|
|
374
|
-
_onCompiled: [],
|
|
375
|
-
_restore: () => {
|
|
376
|
-
}
|
|
377
|
-
};
|
|
378
|
-
effect._restore = (target) => {
|
|
379
|
-
const g = target.gl;
|
|
380
|
-
const newVS = compileShader(g, applyDefines(options.vertexSource, options.defines), g.VERTEX_SHADER, [null]);
|
|
381
|
-
const newFS = compileShader(g, applyDefines(options.fragmentSource, options.defines), g.FRAGMENT_SHADER, [null]);
|
|
382
|
-
if (newVS === null || newFS === null) {
|
|
383
|
-
effect._compileError = "context-restore: shader compile failed";
|
|
384
|
-
return;
|
|
385
|
-
}
|
|
386
|
-
const newProg = linkProgram(g, newVS, newFS, attribs);
|
|
387
|
-
if (newProg === null) {
|
|
388
|
-
g.deleteShader(newVS);
|
|
389
|
-
g.deleteShader(newFS);
|
|
390
|
-
effect._compileError = "context-restore: program allocation failed";
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
effect.program = newProg;
|
|
394
|
-
effect._vs = newVS;
|
|
395
|
-
effect._fs = newFS;
|
|
396
|
-
effect.isReady = false;
|
|
397
|
-
effect._samplersAssigned = false;
|
|
398
|
-
effect.uniformLocations = {};
|
|
399
|
-
effect.attributeLocations = {};
|
|
400
|
-
effect._compileError = null;
|
|
401
|
-
};
|
|
402
|
-
engine._effects.push(effect);
|
|
403
|
-
engine._effectCache.set(cacheKey, effect);
|
|
404
|
-
return effect;
|
|
405
|
-
}
|
|
406
|
-
function isEffectReady(engine, effect) {
|
|
407
|
-
if (effect.isReady) {
|
|
408
|
-
return true;
|
|
409
|
-
}
|
|
410
|
-
if (effect._disposed || engine._isLost || engine._disposed) {
|
|
411
|
-
return false;
|
|
412
|
-
}
|
|
413
|
-
if (effect._compileError !== null) {
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
if (!isLinkComplete(engine.gl, effect.program, engine.caps.parallelShaderCompile)) {
|
|
417
|
-
return false;
|
|
418
|
-
}
|
|
419
|
-
const linkErr = getLinkError(engine.gl, effect.program);
|
|
420
|
-
if (linkErr !== null) {
|
|
421
|
-
effect._compileError = linkErr;
|
|
422
|
-
console.error(`lite-gl: ${effect.name} link failed:`, linkErr);
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
finalizeEffect(engine, effect);
|
|
426
|
-
return true;
|
|
427
|
-
}
|
|
428
|
-
function finalizeEffect(engine, effect) {
|
|
429
|
-
const gl = engine.gl;
|
|
430
|
-
const program = effect.program;
|
|
431
|
-
for (const name of effect.options.uniformNames) {
|
|
432
|
-
effect.uniformLocations[name] = gl.getUniformLocation(program, name);
|
|
433
|
-
}
|
|
434
|
-
const attribs = effect.options.attributeNames ?? ["position"];
|
|
435
|
-
for (const name of attribs) {
|
|
436
|
-
effect.attributeLocations[name] = gl.getAttribLocation(program, name);
|
|
437
|
-
}
|
|
438
|
-
useEffect(engine, effect);
|
|
439
|
-
let unit = 0;
|
|
440
|
-
for (const name of effect.options.samplerNames) {
|
|
441
|
-
const loc = gl.getUniformLocation(program, name);
|
|
442
|
-
if (loc !== null) {
|
|
443
|
-
gl.uniform1i(loc, unit);
|
|
444
|
-
}
|
|
445
|
-
effect.samplerUnits[name] = unit;
|
|
446
|
-
unit++;
|
|
447
|
-
}
|
|
448
|
-
effect._samplersAssigned = true;
|
|
449
|
-
effect.isReady = true;
|
|
450
|
-
const cbs = effect._onCompiled.slice();
|
|
451
|
-
effect._onCompiled.length = 0;
|
|
452
|
-
for (const cb of cbs) {
|
|
453
|
-
try {
|
|
454
|
-
cb(effect);
|
|
455
|
-
} catch (err) {
|
|
456
|
-
console.error(`lite-gl: ${effect.name} onCompiled callback threw`, err);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
function executeWhenCompiled(engine, effect, cb) {
|
|
461
|
-
if (isEffectReady(engine, effect)) {
|
|
462
|
-
cb(effect);
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
effect._onCompiled.push(cb);
|
|
466
|
-
}
|
|
467
|
-
function disposeEffect(engine, effect) {
|
|
468
|
-
if (effect._disposed) {
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
if (--effect._refCount > 0) {
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
effect._disposed = true;
|
|
475
|
-
effect.isReady = false;
|
|
476
|
-
const i = engine._effects.indexOf(effect);
|
|
477
|
-
if (i !== -1) {
|
|
478
|
-
engine._effects.splice(i, 1);
|
|
479
|
-
}
|
|
480
|
-
engine._effectCache.delete(effect._cacheKey);
|
|
481
|
-
if (!engine._isLost && !engine._disposed) {
|
|
482
|
-
engine.gl.deleteProgram(effect.program);
|
|
483
|
-
engine.gl.deleteShader(effect._vs);
|
|
484
|
-
engine.gl.deleteShader(effect._fs);
|
|
485
|
-
}
|
|
486
|
-
if (engine._state.currentProgram === effect.program) {
|
|
487
|
-
engine._state.currentProgram = null;
|
|
488
|
-
}
|
|
489
|
-
effect._onCompiled.length = 0;
|
|
490
|
-
}
|
|
491
|
-
function useEffect(engine, effect) {
|
|
492
|
-
if (engine._isLost || engine._disposed || effect._disposed) {
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
if (engine._state.currentProgram === effect.program) {
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
engine.gl.useProgram(effect.program);
|
|
499
|
-
engine._state.currentProgram = effect.program;
|
|
500
|
-
}
|
|
501
|
-
function setEffectFloat(engine, effect, name, x) {
|
|
502
|
-
if (engine._isLost || !effect.isReady) {
|
|
503
|
-
return;
|
|
504
|
-
}
|
|
505
|
-
const loc = effect.uniformLocations[name];
|
|
506
|
-
if (loc === null || loc === void 0) {
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
if (effect._lastF1[name] === x) {
|
|
510
|
-
return;
|
|
511
|
-
}
|
|
512
|
-
effect._lastF1[name] = x;
|
|
513
|
-
engine.gl.uniform1f(loc, x);
|
|
514
|
-
}
|
|
515
|
-
function setEffectFloat2(engine, effect, name, x, y) {
|
|
516
|
-
if (engine._isLost || !effect.isReady) {
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
const loc = effect.uniformLocations[name];
|
|
520
|
-
if (loc === null || loc === void 0) {
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
let v = effect._lastVec[name];
|
|
524
|
-
if (v !== void 0 && v[0] === x && v[1] === y) {
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
if (v === void 0) {
|
|
528
|
-
v = [x, y];
|
|
529
|
-
effect._lastVec[name] = v;
|
|
530
|
-
} else {
|
|
531
|
-
v[0] = x;
|
|
532
|
-
v[1] = y;
|
|
533
|
-
}
|
|
534
|
-
engine.gl.uniform2f(loc, x, y);
|
|
535
|
-
}
|
|
536
|
-
function setEffectFloat3(engine, effect, name, x, y, z) {
|
|
537
|
-
if (engine._isLost || !effect.isReady) {
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
|
-
const loc = effect.uniformLocations[name];
|
|
541
|
-
if (loc === null || loc === void 0) {
|
|
542
|
-
return;
|
|
543
|
-
}
|
|
544
|
-
let v = effect._lastVec[name];
|
|
545
|
-
if (v !== void 0 && v[0] === x && v[1] === y && v[2] === z) {
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
if (v === void 0) {
|
|
549
|
-
v = [x, y, z];
|
|
550
|
-
effect._lastVec[name] = v;
|
|
551
|
-
} else {
|
|
552
|
-
v[0] = x;
|
|
553
|
-
v[1] = y;
|
|
554
|
-
v[2] = z;
|
|
555
|
-
}
|
|
556
|
-
engine.gl.uniform3f(loc, x, y, z);
|
|
557
|
-
}
|
|
558
|
-
function setEffectFloat4(engine, effect, name, x, y, z, w) {
|
|
559
|
-
if (engine._isLost || !effect.isReady) {
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
const loc = effect.uniformLocations[name];
|
|
563
|
-
if (loc === null || loc === void 0) {
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
566
|
-
let v = effect._lastVec[name];
|
|
567
|
-
if (v !== void 0 && v[0] === x && v[1] === y && v[2] === z && v[3] === w) {
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
if (v === void 0) {
|
|
571
|
-
v = [x, y, z, w];
|
|
572
|
-
effect._lastVec[name] = v;
|
|
573
|
-
} else {
|
|
574
|
-
v[0] = x;
|
|
575
|
-
v[1] = y;
|
|
576
|
-
v[2] = z;
|
|
577
|
-
v[3] = w;
|
|
578
|
-
}
|
|
579
|
-
engine.gl.uniform4f(loc, x, y, z, w);
|
|
580
|
-
}
|
|
581
|
-
function setEffectColor3(engine, effect, name, c) {
|
|
582
|
-
setEffectFloat3(engine, effect, name, c.r, c.g, c.b);
|
|
583
|
-
}
|
|
584
|
-
function setEffectColor4(engine, effect, name, c) {
|
|
585
|
-
setEffectFloat4(engine, effect, name, c.r, c.g, c.b, c.a);
|
|
586
|
-
}
|
|
587
|
-
function setEffectVector2(engine, effect, name, v) {
|
|
588
|
-
setEffectFloat2(engine, effect, name, v.x, v.y);
|
|
589
|
-
}
|
|
590
|
-
function setEffectDirectColor4(engine, effect, name, c) {
|
|
591
|
-
setEffectFloat4(engine, effect, name, c.r, c.g, c.b, c.a);
|
|
592
|
-
}
|
|
593
|
-
function setEffectInt(engine, effect, name, x) {
|
|
594
|
-
if (engine._isLost || !effect.isReady) {
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
const loc = effect.uniformLocations[name];
|
|
598
|
-
if (loc === null || loc === void 0) {
|
|
599
|
-
return;
|
|
600
|
-
}
|
|
601
|
-
if (effect._lastI1[name] === x) {
|
|
602
|
-
return;
|
|
603
|
-
}
|
|
604
|
-
effect._lastI1[name] = x;
|
|
605
|
-
engine.gl.uniform1i(loc, x);
|
|
606
|
-
}
|
|
607
|
-
function setEffectMatrix(engine, effect, name, matrix) {
|
|
608
|
-
if (engine._isLost || !effect.isReady) {
|
|
609
|
-
return;
|
|
610
|
-
}
|
|
611
|
-
const loc = effect.uniformLocations[name];
|
|
612
|
-
if (loc === null || loc === void 0) {
|
|
613
|
-
return;
|
|
614
|
-
}
|
|
615
|
-
engine.gl.uniformMatrix4fv(loc, false, matrix);
|
|
616
|
-
}
|
|
617
|
-
function setEffectMatrix3x3(engine, effect, name, matrix) {
|
|
618
|
-
if (engine._isLost || !effect.isReady) {
|
|
619
|
-
return;
|
|
620
|
-
}
|
|
621
|
-
const loc = effect.uniformLocations[name];
|
|
622
|
-
if (loc === null || loc === void 0) {
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
engine.gl.uniformMatrix3fv(loc, false, matrix);
|
|
626
|
-
}
|
|
627
|
-
function setEffectFloatArray(engine, effect, name, array) {
|
|
628
|
-
if (engine._isLost || !effect.isReady) {
|
|
629
|
-
return;
|
|
630
|
-
}
|
|
631
|
-
const loc = effect.uniformLocations[name];
|
|
632
|
-
if (loc === null || loc === void 0) {
|
|
633
|
-
return;
|
|
634
|
-
}
|
|
635
|
-
engine.gl.uniform1fv(loc, array);
|
|
636
|
-
}
|
|
637
|
-
function setEffectFloatArray4(engine, effect, name, array) {
|
|
638
|
-
if (engine._isLost || !effect.isReady) {
|
|
639
|
-
return;
|
|
640
|
-
}
|
|
641
|
-
const loc = effect.uniformLocations[name];
|
|
642
|
-
if (loc === null || loc === void 0) {
|
|
643
|
-
return;
|
|
644
|
-
}
|
|
645
|
-
engine.gl.uniform4fv(loc, array);
|
|
646
|
-
}
|
|
647
|
-
function setEffectIntArray(engine, effect, name, array) {
|
|
648
|
-
if (engine._isLost || !effect.isReady) {
|
|
649
|
-
return;
|
|
650
|
-
}
|
|
651
|
-
const loc = effect.uniformLocations[name];
|
|
652
|
-
if (loc === null || loc === void 0) {
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
engine.gl.uniform1iv(loc, array);
|
|
656
|
-
}
|
|
657
|
-
function setEffectTexture(engine, effect, samplerName, tex) {
|
|
658
|
-
if (engine._isLost || !effect.isReady) {
|
|
659
|
-
return;
|
|
660
|
-
}
|
|
661
|
-
const unit = effect.samplerUnits[samplerName];
|
|
662
|
-
if (unit === void 0) {
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
bindTexture(engine, unit, tex);
|
|
666
|
-
}
|
|
667
|
-
function getEffectAttributeLocation(engine, effect, name) {
|
|
668
|
-
const cached = effect.attributeLocations[name];
|
|
669
|
-
if (cached !== void 0) {
|
|
670
|
-
return cached;
|
|
671
|
-
}
|
|
672
|
-
const loc = engine.gl.getAttribLocation(effect.program, name);
|
|
673
|
-
effect.attributeLocations[name] = loc;
|
|
674
|
-
return loc;
|
|
675
|
-
}
|
|
676
|
-
function applyDefines(source, defines) {
|
|
677
|
-
if (defines === void 0 || defines.length === 0) {
|
|
678
|
-
return source;
|
|
679
|
-
}
|
|
680
|
-
const marker = "// __DEFINES__";
|
|
681
|
-
const idx = source.indexOf(marker);
|
|
682
|
-
if (idx !== -1) {
|
|
683
|
-
return source.slice(0, idx) + defines + source.slice(idx + marker.length);
|
|
684
|
-
}
|
|
685
|
-
const lines = source.split("\n");
|
|
686
|
-
let insertAt = 0;
|
|
687
|
-
for (let i = 0; i < lines.length; i++) {
|
|
688
|
-
const line = lines[i];
|
|
689
|
-
if (line === void 0) {
|
|
690
|
-
continue;
|
|
691
|
-
}
|
|
692
|
-
const trimmed = line.trim();
|
|
693
|
-
if (trimmed.startsWith("#version") || trimmed.startsWith("precision ")) {
|
|
694
|
-
insertAt = i + 1;
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
lines.splice(insertAt, 0, defines);
|
|
698
|
-
return lines.join("\n");
|
|
699
|
-
}
|
|
700
|
-
export {
|
|
701
|
-
setEffectIntArray as A,
|
|
702
|
-
setEffectMatrix as B,
|
|
703
|
-
setEffectMatrix3x3 as C,
|
|
704
|
-
setEffectTexture as D,
|
|
705
|
-
setEffectVector2 as E,
|
|
706
|
-
setGLEngineSize as F,
|
|
707
|
-
setHardwareScalingLevel as G,
|
|
708
|
-
wipeGLStateCache as H,
|
|
709
|
-
getEffectAttributeLocation as I,
|
|
710
|
-
createGLEngine as a,
|
|
711
|
-
disposeGLEngine as b,
|
|
712
|
-
createEffect as c,
|
|
713
|
-
disposeEffect as d,
|
|
714
|
-
executeWhenCompiled as e,
|
|
715
|
-
getRenderHeight as f,
|
|
716
|
-
getHardwareScalingLevel as g,
|
|
717
|
-
getRenderWidth as h,
|
|
718
|
-
getRenderingCanvas as i,
|
|
719
|
-
isEffectReady as j,
|
|
720
|
-
offContextRestored as k,
|
|
721
|
-
onContextLost as l,
|
|
722
|
-
onContextRestored as m,
|
|
723
|
-
setEffectColor4 as n,
|
|
724
|
-
offContextLost as o,
|
|
725
|
-
setEffectDirectColor4 as p,
|
|
726
|
-
setEffectFloat as q,
|
|
727
|
-
resizeGLEngine as r,
|
|
728
|
-
setEffectColor3 as s,
|
|
729
|
-
setEffectFloat2 as t,
|
|
730
|
-
useEffect as u,
|
|
731
|
-
setEffectFloat3 as v,
|
|
732
|
-
setEffectFloat4 as w,
|
|
733
|
-
setEffectFloatArray as x,
|
|
734
|
-
setEffectFloatArray4 as y,
|
|
735
|
-
setEffectInt as z
|
|
736
|
-
};
|
|
737
|
-
//# sourceMappingURL=effect-BxxwfB_O.js.map
|