@swf2es/context3d 0.0.0-stage → 0.1.1
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/LICENSE +202 -0
- package/README.md +219 -2
- package/dist/agal.d.ts +23 -0
- package/dist/agal.d.ts.map +1 -0
- package/dist/agal.js +410 -0
- package/dist/agal.js.map +1 -0
- package/dist/backend.d.ts +122 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/device/index.d.ts +3 -0
- package/dist/device/index.d.ts.map +1 -0
- package/dist/device/index.js +6 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/programs.d.ts +13 -0
- package/dist/device/programs.d.ts.map +1 -0
- package/dist/device/programs.js +59 -0
- package/dist/device/programs.js.map +1 -0
- package/dist/device/state.d.ts +53 -0
- package/dist/device/state.d.ts.map +1 -0
- package/dist/device/state.js +196 -0
- package/dist/device/state.js.map +1 -0
- package/dist/dxt.d.ts +22 -0
- package/dist/dxt.d.ts.map +1 -0
- package/dist/dxt.js +304 -0
- package/dist/dxt.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/webgl/buffers.d.ts +27 -0
- package/dist/webgl/buffers.d.ts.map +1 -0
- package/dist/webgl/buffers.js +53 -0
- package/dist/webgl/buffers.js.map +1 -0
- package/dist/webgl/context.d.ts +123 -0
- package/dist/webgl/context.d.ts.map +1 -0
- package/dist/webgl/context.js +1368 -0
- package/dist/webgl/context.js.map +1 -0
- package/dist/webgl/index.d.ts +3 -0
- package/dist/webgl/index.d.ts.map +1 -0
- package/dist/webgl/index.js +2 -0
- package/dist/webgl/index.js.map +1 -0
- package/dist/webgl/limits.d.ts +23 -0
- package/dist/webgl/limits.d.ts.map +1 -0
- package/dist/webgl/limits.js +35 -0
- package/dist/webgl/limits.js.map +1 -0
- package/dist/webgl/programs.d.ts +22 -0
- package/dist/webgl/programs.d.ts.map +1 -0
- package/dist/webgl/programs.js +110 -0
- package/dist/webgl/programs.js.map +1 -0
- package/dist/webgl/state.d.ts +42 -0
- package/dist/webgl/state.d.ts.map +1 -0
- package/dist/webgl/state.js +55 -0
- package/dist/webgl/state.js.map +1 -0
- package/dist/webgl/targets.d.ts +20 -0
- package/dist/webgl/targets.d.ts.map +1 -0
- package/dist/webgl/targets.js +138 -0
- package/dist/webgl/targets.js.map +1 -0
- package/dist/webgl/textures.d.ts +28 -0
- package/dist/webgl/textures.d.ts.map +1 -0
- package/dist/webgl/textures.js +119 -0
- package/dist/webgl/textures.js.map +1 -0
- package/dist/webgl/validation.d.ts +4 -0
- package/dist/webgl/validation.d.ts.map +1 -0
- package/dist/webgl/validation.js +52 -0
- package/dist/webgl/validation.js.map +1 -0
- package/package.json +37 -3
- package/src/agal.ts +496 -0
- package/src/backend.ts +210 -0
- package/src/device/index.ts +5 -0
- package/src/device/programs.ts +66 -0
- package/src/device/state.ts +214 -0
- package/src/dxt.ts +349 -0
- package/src/errors.ts +68 -0
- package/src/index.ts +35 -0
- package/src/webgl/buffers.ts +102 -0
- package/src/webgl/context.ts +1803 -0
- package/src/webgl/index.ts +2 -0
- package/src/webgl/limits.ts +61 -0
- package/src/webgl/programs.ts +145 -0
- package/src/webgl/state.ts +65 -0
- package/src/webgl/targets.ts +229 -0
- package/src/webgl/textures.ts +200 -0
- package/src/webgl/validation.ts +72 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Context3DError } from "../errors.js";
|
|
2
|
+
export function selectSamples(gl, quality, depth) {
|
|
3
|
+
if (!Number.isInteger(quality)) {
|
|
4
|
+
throw new Context3DError("operation", "Context3D experiment: invalid antialiasing quality");
|
|
5
|
+
}
|
|
6
|
+
if (quality < 2) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
const color = gl.getInternalformatParameter(gl.RENDERBUFFER, gl.RGBA8, gl.SAMPLES);
|
|
10
|
+
const stencil = depth
|
|
11
|
+
? gl.getInternalformatParameter(gl.RENDERBUFFER, gl.DEPTH24_STENCIL8, gl.SAMPLES)
|
|
12
|
+
: null;
|
|
13
|
+
let samples = 0;
|
|
14
|
+
// Quality is a hardware-dependent request; bound this experiment to 4x.
|
|
15
|
+
for (let i = 0; i < color.length; i++) {
|
|
16
|
+
const count = color[i];
|
|
17
|
+
if (count > samples && count <= Math.min(quality, 4) && (!stencil || stencil.includes(count))) {
|
|
18
|
+
samples = count;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return samples;
|
|
22
|
+
}
|
|
23
|
+
export function targetFramebuffer(state) {
|
|
24
|
+
return state.samples ? (state.multisample?.framebuffer ?? null) : state.framebuffer;
|
|
25
|
+
}
|
|
26
|
+
export function resolveTarget(gl, texture, state, face, scissor) {
|
|
27
|
+
const target = state.multisample;
|
|
28
|
+
if (!state.samples || !target?.dirty) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, target.framebuffer);
|
|
32
|
+
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, target.resolve ?? state.framebuffer);
|
|
33
|
+
if (scissor) {
|
|
34
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
35
|
+
}
|
|
36
|
+
gl.blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width, texture.height, gl.COLOR_BUFFER_BIT, gl.NEAREST);
|
|
37
|
+
if (target.resolve) {
|
|
38
|
+
// SwiftShader corrupts direct multisample blits into cube faces.
|
|
39
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, target.resolve);
|
|
40
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
41
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, state.handle);
|
|
42
|
+
gl.copyTexSubImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, 0, 0, 0, 0, texture.width, texture.height);
|
|
43
|
+
}
|
|
44
|
+
target.dirty = false;
|
|
45
|
+
}
|
|
46
|
+
export function deleteMultisample(gl, target) {
|
|
47
|
+
gl.deleteFramebuffer(target.framebuffer);
|
|
48
|
+
gl.deleteRenderbuffer(target.color);
|
|
49
|
+
gl.deleteRenderbuffer(target.depth);
|
|
50
|
+
gl.deleteFramebuffer(target.resolve);
|
|
51
|
+
gl.deleteTexture(target.texture);
|
|
52
|
+
}
|
|
53
|
+
export function allocateMultisample(gl, texture, old, samples, depth, depthWrite, stencilWrite) {
|
|
54
|
+
const same = old?.samples === samples;
|
|
55
|
+
const newDepth = depth && (!same || !old.depth);
|
|
56
|
+
const framebuffer = same ? old.framebuffer : gl.createFramebuffer();
|
|
57
|
+
const color = same ? old.color : gl.createRenderbuffer();
|
|
58
|
+
const depthBuffer = newDepth ? gl.createRenderbuffer() : same ? old.depth : null;
|
|
59
|
+
const resolve = same ? old.resolve : texture.cube ? gl.createFramebuffer() : null;
|
|
60
|
+
const resolved = same ? old.texture : texture.cube ? gl.createTexture() : null;
|
|
61
|
+
try {
|
|
62
|
+
if (texture.cube && (!resolve || !resolved)) {
|
|
63
|
+
throw new Context3DError("operation", "Context3D experiment: cannot allocate cube resolve target");
|
|
64
|
+
}
|
|
65
|
+
if (texture.cube && !same) {
|
|
66
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
67
|
+
gl.bindTexture(gl.TEXTURE_2D, resolved);
|
|
68
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, texture.width, texture.height);
|
|
69
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, resolve);
|
|
70
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, resolved, 0);
|
|
71
|
+
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
72
|
+
throw new Context3DError("operation", "Context3D experiment: incomplete cube resolve target");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!framebuffer || !color || (newDepth && !depthBuffer)) {
|
|
76
|
+
throw new Context3DError("operation", "Context3D experiment: cannot allocate multisample target");
|
|
77
|
+
}
|
|
78
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
79
|
+
if (!same) {
|
|
80
|
+
gl.bindRenderbuffer(gl.RENDERBUFFER, color);
|
|
81
|
+
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, gl.RGBA8, texture.width, texture.height);
|
|
82
|
+
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, color);
|
|
83
|
+
}
|
|
84
|
+
if (newDepth) {
|
|
85
|
+
gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
|
|
86
|
+
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, gl.DEPTH24_STENCIL8, texture.width, texture.height);
|
|
87
|
+
}
|
|
88
|
+
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, depth ? depthBuffer : null);
|
|
89
|
+
if ((!same || newDepth) &&
|
|
90
|
+
gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
91
|
+
throw new Context3DError("operation", "Context3D experiment: incomplete multisample target");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (!same) {
|
|
96
|
+
gl.deleteFramebuffer(framebuffer);
|
|
97
|
+
gl.deleteRenderbuffer(color);
|
|
98
|
+
gl.deleteFramebuffer(resolve);
|
|
99
|
+
gl.deleteTexture(resolved);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, old.framebuffer);
|
|
103
|
+
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, old.depthAttached ? old.depth : null);
|
|
104
|
+
}
|
|
105
|
+
if (newDepth) {
|
|
106
|
+
gl.deleteRenderbuffer(depthBuffer);
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
if (newDepth) {
|
|
111
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
112
|
+
gl.depthMask(true);
|
|
113
|
+
gl.stencilMask(255);
|
|
114
|
+
gl.clearDepth(1);
|
|
115
|
+
gl.clearStencil(0);
|
|
116
|
+
gl.clear(gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
|
|
117
|
+
gl.depthMask(depthWrite);
|
|
118
|
+
gl.stencilMask(stencilWrite);
|
|
119
|
+
}
|
|
120
|
+
if (same) {
|
|
121
|
+
old.depth = depthBuffer;
|
|
122
|
+
old.depthAttached = depth;
|
|
123
|
+
return old;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
framebuffer,
|
|
127
|
+
color,
|
|
128
|
+
depth: depthBuffer,
|
|
129
|
+
samples,
|
|
130
|
+
resolve,
|
|
131
|
+
texture: resolved,
|
|
132
|
+
valid: false,
|
|
133
|
+
dirty: false,
|
|
134
|
+
face: 0,
|
|
135
|
+
depthAttached: depth,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/webgl/targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Texture3D } from "../backend.js";
|
|
2
|
+
import { type DxtEncoder } from "../dxt.js";
|
|
3
|
+
import type { MultisampleTarget } from "./targets.js";
|
|
4
|
+
export interface TextureState {
|
|
5
|
+
handle: WebGLTexture;
|
|
6
|
+
/** The internal format its storage has: RGBA8, or S3TC's for a compressed texture. */
|
|
7
|
+
storage: number;
|
|
8
|
+
/** RGBA staging for a level, made at the first upload that needs it: base-sized. */
|
|
9
|
+
bytes: Uint8Array;
|
|
10
|
+
uploaded: Uint16Array;
|
|
11
|
+
framebuffer: WebGLFramebuffer | null;
|
|
12
|
+
depthBuffer: WebGLRenderbuffer | null;
|
|
13
|
+
dirty: boolean;
|
|
14
|
+
face: number;
|
|
15
|
+
mipFramebuffer: WebGLFramebuffer | null;
|
|
16
|
+
depthAttached: boolean;
|
|
17
|
+
multisample: MultisampleTarget | null;
|
|
18
|
+
samples: number;
|
|
19
|
+
antiAlias: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function uploadTexture(gl: WebGL2RenderingContext, texture: Texture3D, state: TextureState, pixels: Uint32Array, level: number, face: number, sourceWidth?: number, sourceHeight?: number, encoder?: DxtEncoder | null): void;
|
|
22
|
+
export declare function uploadTextureBytes(gl: WebGL2RenderingContext, texture: Texture3D, state: TextureState, data: Uint8Array, offset: number, level: number, face: number, encoder?: DxtEncoder | null): void;
|
|
23
|
+
/**
|
|
24
|
+
* A compressed texture's level from S3TC blocks: as they are where its
|
|
25
|
+
* storage is S3TC's, or decoded to RGBA where the context takes no S3TC.
|
|
26
|
+
*/
|
|
27
|
+
export declare function uploadCompressedLevel(gl: WebGL2RenderingContext, texture: Texture3D, state: TextureState, blocks: Uint8Array, level: number, face: number): void;
|
|
28
|
+
//# sourceMappingURL=textures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textures.d.ts","sourceRoot":"","sources":["../../src/webgl/textures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAc,KAAK,UAAU,EAAwB,MAAM,WAAW,CAAC;AAG9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgDD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,sBAAsB,EAC1B,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE,UAAU,GAAG,IAAW,GAChC,IAAI,CAmDN;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,sBAAsB,EAC1B,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,UAAU,GAAG,IAAW,GAChC,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,sBAAsB,EAC1B,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,IAAI,CAyBN"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { blockBytes, decodeDxt, encodeDxt } from "../dxt.js";
|
|
2
|
+
import { Context3DError } from "../errors.js";
|
|
3
|
+
import { range } from "./state.js";
|
|
4
|
+
/** The staging array, made base-sized at its first use: a texture given only blocks on S3TC has none. */
|
|
5
|
+
function staging(texture, state) {
|
|
6
|
+
if (state.bytes.length === 0) {
|
|
7
|
+
state.bytes = new Uint8Array(texture.width * texture.height * 4);
|
|
8
|
+
}
|
|
9
|
+
return state.bytes;
|
|
10
|
+
}
|
|
11
|
+
/** The staged level uploaded: as it is, or a compressed texture's encoded to its blocks, as AIR compresses pixels. */
|
|
12
|
+
function uploadLevel(gl, texture, state, level, face, w, h, encoder) {
|
|
13
|
+
if (texture.format !== "bgra") {
|
|
14
|
+
const rgba = state.bytes.subarray(0, w * h * 4);
|
|
15
|
+
const dxt5 = texture.format === "compressedAlpha";
|
|
16
|
+
const blocks = encoder?.(rgba, dxt5, w, h) ?? encodeDxt(rgba, dxt5, w, h);
|
|
17
|
+
uploadCompressedLevel(gl, texture, state, blocks, level, face);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const cube = texture.cube;
|
|
21
|
+
const target = cube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;
|
|
22
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
23
|
+
gl.bindTexture(target, state.handle);
|
|
24
|
+
gl.texSubImage2D(cube ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + face : target, level, 0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, state.bytes);
|
|
25
|
+
state.uploaded[face] |= 1 << level;
|
|
26
|
+
}
|
|
27
|
+
export function uploadTexture(gl, texture, state, pixels, level, face, sourceWidth, sourceHeight, encoder = null) {
|
|
28
|
+
const { width, height, levels, cube } = texture;
|
|
29
|
+
const faces = cube ? 6 : 1;
|
|
30
|
+
range(level, 1, levels);
|
|
31
|
+
range(face, 1, faces);
|
|
32
|
+
const w = Math.max(1, width >> level);
|
|
33
|
+
const h = Math.max(1, height >> level);
|
|
34
|
+
const sw = sourceWidth ?? w;
|
|
35
|
+
const sh = sourceHeight ?? h;
|
|
36
|
+
if (!Number.isSafeInteger(sw) ||
|
|
37
|
+
sw <= 0 ||
|
|
38
|
+
!Number.isSafeInteger(sh) ||
|
|
39
|
+
sh <= 0 ||
|
|
40
|
+
pixels.length !== sw * sh) {
|
|
41
|
+
throw new Context3DError("textureUpload", "Context3D experiment: texture upload size mismatch");
|
|
42
|
+
}
|
|
43
|
+
// Made once the call is known good: a refused one allocates nothing.
|
|
44
|
+
staging(texture, state);
|
|
45
|
+
if (sw === w && sh === h) {
|
|
46
|
+
for (let i = 0; i < pixels.length; i++) {
|
|
47
|
+
const pixel = pixels[i];
|
|
48
|
+
const at = i * 4;
|
|
49
|
+
state.bytes[at] = pixel >>> 16;
|
|
50
|
+
state.bytes[at + 1] = pixel >>> 8;
|
|
51
|
+
state.bytes[at + 2] = pixel;
|
|
52
|
+
state.bytes[at + 3] = pixel >>> 24;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// AIR clips at the top-left and clears uncovered pixels, without scaling.
|
|
57
|
+
if (sw < w || sh < h) {
|
|
58
|
+
state.bytes.fill(0, 0, w * h * 4);
|
|
59
|
+
}
|
|
60
|
+
const columns = Math.min(w, sw);
|
|
61
|
+
const rows = Math.min(h, sh);
|
|
62
|
+
for (let y = 0; y < rows; y++) {
|
|
63
|
+
for (let x = 0; x < columns; x++) {
|
|
64
|
+
const pixel = pixels[y * sw + x];
|
|
65
|
+
const at = (y * w + x) * 4;
|
|
66
|
+
state.bytes[at] = pixel >>> 16;
|
|
67
|
+
state.bytes[at + 1] = pixel >>> 8;
|
|
68
|
+
state.bytes[at + 2] = pixel;
|
|
69
|
+
state.bytes[at + 3] = pixel >>> 24;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
uploadLevel(gl, texture, state, level, face, w, h, encoder);
|
|
74
|
+
}
|
|
75
|
+
export function uploadTextureBytes(gl, texture, state, data, offset, level, face, encoder = null) {
|
|
76
|
+
const { width, height, levels, cube } = texture;
|
|
77
|
+
const faces = cube ? 6 : 1;
|
|
78
|
+
range(level, 1, levels);
|
|
79
|
+
range(face, 1, faces);
|
|
80
|
+
const w = Math.max(1, width >> level);
|
|
81
|
+
const h = Math.max(1, height >> level);
|
|
82
|
+
const length = w * h * 4;
|
|
83
|
+
range(offset, length, data.length);
|
|
84
|
+
staging(texture, state);
|
|
85
|
+
for (let i = 0; i < length; i += 4) {
|
|
86
|
+
state.bytes[i] = data[offset + i + 2];
|
|
87
|
+
state.bytes[i + 1] = data[offset + i + 1];
|
|
88
|
+
state.bytes[i + 2] = data[offset + i];
|
|
89
|
+
state.bytes[i + 3] = data[offset + i + 3];
|
|
90
|
+
}
|
|
91
|
+
uploadLevel(gl, texture, state, level, face, w, h, encoder);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A compressed texture's level from S3TC blocks: as they are where its
|
|
95
|
+
* storage is S3TC's, or decoded to RGBA where the context takes no S3TC.
|
|
96
|
+
*/
|
|
97
|
+
export function uploadCompressedLevel(gl, texture, state, blocks, level, face) {
|
|
98
|
+
const { width, height, levels, cube } = texture;
|
|
99
|
+
range(level, 1, levels);
|
|
100
|
+
range(face, 1, cube ? 6 : 1);
|
|
101
|
+
const w = Math.max(1, width >> level);
|
|
102
|
+
const h = Math.max(1, height >> level);
|
|
103
|
+
const dxt5 = texture.format === "compressedAlpha";
|
|
104
|
+
if (blocks.length !== blockBytes(w, h, dxt5)) {
|
|
105
|
+
throw new Context3DError("textureUpload", "Context3D experiment: compressed level size mismatch");
|
|
106
|
+
}
|
|
107
|
+
const target = cube ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + face : gl.TEXTURE_2D;
|
|
108
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
109
|
+
gl.bindTexture(cube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, state.handle);
|
|
110
|
+
if (state.storage === gl.RGBA8) {
|
|
111
|
+
decodeDxt(blocks, dxt5, w, h, staging(texture, state));
|
|
112
|
+
gl.texSubImage2D(target, level, 0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, state.bytes);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
gl.compressedTexSubImage2D(target, level, 0, 0, w, h, state.storage, blocks);
|
|
116
|
+
}
|
|
117
|
+
state.uploaded[face] |= 1 << level;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=textures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textures.js","sourceRoot":"","sources":["../../src/webgl/textures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BufferState, VertexBinding } from "./buffers.js";
|
|
2
|
+
export declare function validateIndices(index: BufferState, first: number, count: number): number;
|
|
3
|
+
export declare function validateVertices(vertex: BufferState, index: BufferState, binding: VertexBinding, first: number, count: number, maximum: number): void;
|
|
4
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/webgl/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA8BxF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,IAAI,CA6BN"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Context3DError } from "../errors.js";
|
|
2
|
+
export function validateIndices(index, first, count) {
|
|
3
|
+
if (index.checkedVersion === index.version &&
|
|
4
|
+
index.checkedFirst === first &&
|
|
5
|
+
index.checkedCount === count) {
|
|
6
|
+
return index.maximum;
|
|
7
|
+
}
|
|
8
|
+
const values = index.indices;
|
|
9
|
+
if (!values) {
|
|
10
|
+
throw new Context3DError("indexBuffer", "Context3D draw needs an index buffer");
|
|
11
|
+
}
|
|
12
|
+
const end = first + count;
|
|
13
|
+
let maximum = -1;
|
|
14
|
+
for (let i = first; i < end; i++) {
|
|
15
|
+
if (index.prefix < end && !index.uploaded[i]) {
|
|
16
|
+
throw new Context3DError("indexData", "Context3D index not uploaded");
|
|
17
|
+
}
|
|
18
|
+
maximum = Math.max(maximum, values[i]);
|
|
19
|
+
}
|
|
20
|
+
index.checkedVersion = index.version;
|
|
21
|
+
index.checkedFirst = first;
|
|
22
|
+
index.checkedCount = count;
|
|
23
|
+
index.maximum = maximum;
|
|
24
|
+
return maximum;
|
|
25
|
+
}
|
|
26
|
+
export function validateVertices(vertex, index, binding, first, count, maximum) {
|
|
27
|
+
if (maximum < vertex.prefix) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (maximum >= vertex.uploaded.length) {
|
|
31
|
+
throw new Context3DError("vertexData", "Context3D vertex outside its buffer");
|
|
32
|
+
}
|
|
33
|
+
if (binding.checkedIndex === index &&
|
|
34
|
+
binding.checkedIndexVersion === index.version &&
|
|
35
|
+
binding.checkedVertexVersion === vertex.version &&
|
|
36
|
+
binding.checkedFirst === first &&
|
|
37
|
+
binding.checkedCount === count) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const values = index.indices;
|
|
41
|
+
for (let i = first; i < first + count; i++) {
|
|
42
|
+
if (!vertex.uploaded[values[i]]) {
|
|
43
|
+
throw new Context3DError("vertexStream", "Context3D vertex not uploaded");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
binding.checkedIndex = index;
|
|
47
|
+
binding.checkedIndexVersion = index.version;
|
|
48
|
+
binding.checkedVertexVersion = vertex.version;
|
|
49
|
+
binding.checkedFirst = first;
|
|
50
|
+
binding.checkedCount = count;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/webgl/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,KAAa,EAAE,KAAa;IAC9E,IACE,KAAK,CAAC,cAAc,KAAK,KAAK,CAAC,OAAO;QACtC,KAAK,CAAC,YAAY,KAAK,KAAK;QAC5B,KAAK,CAAC,YAAY,KAAK,KAAK,EAC5B,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,cAAc,CAAC,aAAa,EAAE,sCAAsC,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,cAAc,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;IACrC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAmB,EACnB,KAAkB,EAClB,OAAsB,EACtB,KAAa,EACb,KAAa,EACb,OAAe;IAEf,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAAC;IAChF,CAAC;IACD,IACE,OAAO,CAAC,YAAY,KAAK,KAAK;QAC9B,OAAO,CAAC,mBAAmB,KAAK,KAAK,CAAC,OAAO;QAC7C,OAAO,CAAC,oBAAoB,KAAK,MAAM,CAAC,OAAO;QAC/C,OAAO,CAAC,YAAY,KAAK,KAAK;QAC9B,OAAO,CAAC,YAAY,KAAK,KAAK,EAC9B,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAsB,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,cAAc,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;IAC7B,OAAO,CAAC,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5C,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9C,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;IAC7B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;AAC/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swf2es/context3d",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Experimental Context3D resource contracts, AGAL translation and an optional WebGL2 backend",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"flash",
|
|
7
|
+
"stage3d",
|
|
8
|
+
"context3d",
|
|
9
|
+
"agal",
|
|
10
|
+
"webgl2"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://swf2es.github.io/swf2es/",
|
|
13
|
+
"bugs": "https://github.com/swf2es/swf2es/issues",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/swf2es/swf2es.git",
|
|
17
|
+
"directory": "packages/context3d"
|
|
18
|
+
},
|
|
19
|
+
"license": "Apache-2.0",
|
|
20
|
+
"type": "module",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./device": {
|
|
27
|
+
"types": "./dist/device/index.d.ts",
|
|
28
|
+
"default": "./dist/device/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./webgl": {
|
|
31
|
+
"types": "./dist/webgl/index.d.ts",
|
|
32
|
+
"default": "./dist/webgl/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"!dist/**/.tsbuildinfo",
|
|
38
|
+
"src"
|
|
39
|
+
]
|
|
6
40
|
}
|