@tolokoban/tgd 2.0.36 → 2.0.39

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.
Files changed (53) hide show
  1. package/lib/dist/code/math.d.ts +3 -0
  2. package/lib/dist/code/math.d.ts.map +1 -1
  3. package/lib/dist/code/math.js +13 -2
  4. package/lib/dist/controller/camera/orbit.d.ts +5 -1
  5. package/lib/dist/controller/camera/orbit.d.ts.map +1 -1
  6. package/lib/dist/controller/camera/orbit.js +10 -7
  7. package/lib/dist/filter/blur.d.ts.map +1 -1
  8. package/lib/dist/filter/blur.js +6 -3
  9. package/lib/dist/geometry/geometry.d.ts +1 -1
  10. package/lib/dist/geometry/geometry.d.ts.map +1 -1
  11. package/lib/dist/geometry/geometry.js +6 -4
  12. package/lib/dist/geometry/grid.d.ts +15 -0
  13. package/lib/dist/geometry/grid.d.ts.map +1 -0
  14. package/lib/dist/geometry/grid.js +65 -0
  15. package/lib/dist/geometry/index.d.ts +1 -0
  16. package/lib/dist/geometry/index.d.ts.map +1 -1
  17. package/lib/dist/geometry/index.js +2 -1
  18. package/lib/dist/geometry/plane.js +1 -1
  19. package/lib/dist/loader/image.d.ts +6 -0
  20. package/lib/dist/loader/image.d.ts.map +1 -1
  21. package/lib/dist/loader/image.js +65 -27
  22. package/lib/dist/material/index.d.ts +1 -0
  23. package/lib/dist/material/index.d.ts.map +1 -1
  24. package/lib/dist/material/index.js +2 -1
  25. package/lib/dist/material/normal-map.d.ts +5 -0
  26. package/lib/dist/material/normal-map.d.ts.map +1 -0
  27. package/lib/dist/material/normal-map.js +20 -0
  28. package/lib/dist/painter/background/background.d.ts.map +1 -1
  29. package/lib/dist/painter/background/background.js +12 -3
  30. package/lib/dist/painter/framebuffer-msaa.d.ts.map +1 -1
  31. package/lib/dist/painter/framebuffer-msaa.js +3 -1
  32. package/lib/dist/painter/framebuffer.d.ts.map +1 -1
  33. package/lib/dist/painter/framebuffer.js +3 -1
  34. package/lib/dist/painter/mesh/gltf/gltf.d.ts.map +1 -1
  35. package/lib/dist/painter/mesh/gltf/gltf.js +5 -4
  36. package/lib/dist/parser/gltf/gltf.d.ts.map +1 -1
  37. package/lib/dist/parser/gltf/gltf.js +13 -6
  38. package/lib/dist/utils/canvas.d.ts +1 -0
  39. package/lib/dist/utils/canvas.d.ts.map +1 -1
  40. package/lib/dist/utils/canvas.js +6 -1
  41. package/lib/dist/utils/webgl.d.ts +7 -0
  42. package/lib/dist/utils/webgl.d.ts.map +1 -1
  43. package/lib/dist/utils/webgl.js +17 -1
  44. package/package.json +1 -1
  45. package/lib/dist/painter/fragment-dhader/filter.d.ts +0 -31
  46. package/lib/dist/painter/fragment-dhader/filter.d.ts.map +0 -1
  47. package/lib/dist/painter/fragment-dhader/filter.js +0 -161
  48. package/lib/dist/painter/fragment-dhader/index.d.ts +0 -2
  49. package/lib/dist/painter/fragment-dhader/index.d.ts.map +0 -1
  50. package/lib/dist/painter/fragment-dhader/index.js +0 -2
  51. package/lib/dist/painter/fragment-shader/filter.d.ts +0 -31
  52. package/lib/dist/painter/fragment-shader/filter.d.ts.map +0 -1
  53. package/lib/dist/painter/fragment-shader/filter.js +0 -161
@@ -1,161 +0,0 @@
1
- import { TgdPainter } from "./../painter.js";
2
- import { TgdDataset } from "./../../dataset/dataset.js";
3
- import { TgdVertexArray } from "./../../vao/index.js";
4
- import { TgdShaderVertex } from "./../../shader/vertex.js";
5
- import { TgdShaderFragment } from "./../../shader/fragment.js";
6
- import { TgdProgram } from "./../../program/index.js";
7
- export class TgdPainterFilter extends TgdPainter {
8
- constructor(context, options) {
9
- var _a, _b, _c;
10
- super();
11
- this.context = context;
12
- this.z = 0;
13
- this.textures = null;
14
- this.texturesWith = -1;
15
- this.texturesHeight = -1;
16
- this.z = (_a = options.z) !== null && _a !== void 0 ? _a : 0.999999;
17
- this.texture = options.texture;
18
- const filters = (_b = options.filters) !== null && _b !== void 0 ? _b : [];
19
- if (filters.length === 0) {
20
- throw new Error(`[TgdPainterFilter] filters is expected to have at least one element!`);
21
- }
22
- const programs = filters.map(filter => {
23
- const vert = new TgdShaderVertex({
24
- attributes: {
25
- attPoint: "vec2",
26
- attUV: "vec2",
27
- },
28
- varying: {
29
- varUV: "vec2",
30
- },
31
- uniforms: {
32
- uniZ: "float",
33
- },
34
- mainCode: [
35
- "varUV = attUV;",
36
- "gl_Position = vec4(",
37
- ["attPoint,", "uniZ,", "1.0"],
38
- ");",
39
- ],
40
- }).code;
41
- const frag = new TgdShaderFragment({
42
- uniforms: Object.assign({ uniWidth: "float", uniHeight: "float", uniTexture: "sampler2D" }, filter.uniforms),
43
- varying: {
44
- varUV: "vec2",
45
- },
46
- mainCode: filter.fragmentShaderCode,
47
- functions: filter.extraFunctions,
48
- }).code;
49
- return new TgdProgram(context.gl, { vert, frag });
50
- });
51
- const vaos = programs.map(program => createVAO(context, program, options.flipY ? -1 : +1));
52
- this.program = programs.pop();
53
- this.programs = programs;
54
- this.filter = filters.pop();
55
- this.filters = filters;
56
- const vao = vaos.pop();
57
- this.vaos = vaos;
58
- const count = vaos.length + (options.flipY ? 1 : 0);
59
- this.vao = count % 2 === 0 ? vao : createVAO(context, this.program, -1);
60
- const framebuffer = context.gl.createFramebuffer();
61
- if (!framebuffer)
62
- throw new Error("Unable to create a WebGL Framebuffer!");
63
- this.framebuffer = framebuffer;
64
- this.name = (_c = options.name) !== null && _c !== void 0 ? _c : `Filter/${this.name}`;
65
- }
66
- delete() {
67
- const { context, textures, vaos, vao, framebuffer } = this;
68
- const { gl } = context;
69
- for (const vao of vaos)
70
- vao.delete();
71
- vao.delete();
72
- gl.deleteFramebuffer(framebuffer);
73
- if (textures) {
74
- for (const tex of textures)
75
- gl.deleteTexture(tex);
76
- }
77
- }
78
- paint(time, delay) {
79
- const { vaos, texture, z, context } = this;
80
- const { gl } = this.program;
81
- let inputTexture = texture === null || texture === void 0 ? void 0 : texture.glTexture;
82
- if (!inputTexture) {
83
- console.warn("[TgdPainterFilter] Input texture is undefined!");
84
- return;
85
- }
86
- if (vaos.length > 0) {
87
- const { programs, filters, framebuffer } = this;
88
- const currentFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
89
- const textures = this.getTextures(gl);
90
- let texIndex = 0;
91
- let outputTexture = textures[texIndex];
92
- for (const [index, vao] of vaos.entries()) {
93
- gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
94
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0);
95
- paintOneFilter(time, delay, vao, programs[index], filters[index], inputTexture, z, context);
96
- texIndex = 1 - texIndex;
97
- inputTexture = outputTexture;
98
- outputTexture = textures[texIndex];
99
- }
100
- gl.bindFramebuffer(gl.FRAMEBUFFER, currentFramebuffer);
101
- }
102
- paintOneFilter(time, delay, this.vao, this.program, this.filter, inputTexture, z, context);
103
- gl.bindVertexArray(null);
104
- }
105
- getTextures(gl) {
106
- var _a;
107
- const { width, height } = (_a = this.texture) !== null && _a !== void 0 ? _a : { width: 64, height: 64 };
108
- if (this.textures &&
109
- this.texturesWith === width &&
110
- this.texturesHeight === height) {
111
- return [...this.textures];
112
- }
113
- if (this.textures) {
114
- for (const tex of this.textures)
115
- gl.deleteTexture(tex);
116
- }
117
- this.texturesWith = width;
118
- this.texturesHeight = height;
119
- this.textures = [0, 1].map(() => {
120
- const texture = gl.createTexture();
121
- gl.bindTexture(gl.TEXTURE_2D, texture);
122
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
123
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
124
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
125
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
126
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
127
- return texture;
128
- });
129
- return this.textures;
130
- }
131
- }
132
- function paintOneFilter(time, delay, vao, program, filter, texture, z, context) {
133
- const { gl } = program;
134
- program.use();
135
- program.uniform1f("uniZ", z);
136
- filter.setUniforms({ context, program, time, delay });
137
- gl.activeTexture(gl.TEXTURE0);
138
- gl.bindTexture(gl.TEXTURE_2D, texture);
139
- program.uniform1i("uniTexture", 0);
140
- vao.bind();
141
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
142
- }
143
- function createVAO(context, program, flipY = +1) {
144
- const dataset = new TgdDataset({
145
- attPoint: "vec2",
146
- attUV: "vec2",
147
- });
148
- // prettier-ignore
149
- dataset.set("attPoint", new Float32Array([
150
- -1, +1 * flipY,
151
- +1, +1 * flipY,
152
- -1, -1 * flipY,
153
- +1, -1 * flipY,
154
- ]));
155
- dataset.set("attUV", new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]));
156
- const vao = new TgdVertexArray(context.gl, program, [dataset]);
157
- if (!vao)
158
- throw new Error("Unable to create WebGL VAO!");
159
- return vao;
160
- }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvZnJhZ21lbnQtc2hhZGVyL2ZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFVekMsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFVBQVU7SUFlNUMsWUFDcUIsT0FBbUIsRUFDcEMsT0FBZ0M7O1FBRWhDLEtBQUssRUFBRSxDQUFBO1FBSFUsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQWRqQyxNQUFDLEdBQUcsQ0FBQyxDQUFBO1FBU0osYUFBUSxHQUF3QyxJQUFJLENBQUE7UUFDcEQsaUJBQVksR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBT3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBQSxPQUFPLENBQUMsQ0FBQyxtQ0FBSSxRQUFRLENBQUE7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFBO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQUEsT0FBTyxDQUFDLE9BQU8sbUNBQUksRUFBRSxDQUFBO1FBQ3JDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUNYLHNFQUFzRSxDQUN6RSxDQUFBO1FBQ0wsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE9B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