@tolokoban/tgd 2.0.100 → 2.0.102
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/lib/dist/color/color.d.ts +4 -0
- package/lib/dist/color/color.d.ts.map +1 -1
- package/lib/dist/color/color.js +21 -1
- package/lib/dist/context/context.d.ts +3 -0
- package/lib/dist/context/context.d.ts.map +1 -1
- package/lib/dist/context/context.js +10 -7
- package/lib/dist/context/logic.d.ts +2 -2
- package/lib/dist/context/logic.js +2 -2
- package/lib/dist/context/ubo-manager.d.ts +10 -0
- package/lib/dist/context/ubo-manager.d.ts.map +1 -0
- package/lib/dist/context/ubo-manager.js +23 -0
- package/lib/dist/dataset/dataset.d.ts +8 -3
- package/lib/dist/dataset/dataset.d.ts.map +1 -1
- package/lib/dist/dataset/dataset.js +35 -12
- package/lib/dist/filter/blur.d.ts +1 -0
- package/lib/dist/filter/blur.d.ts.map +1 -1
- package/lib/dist/filter/blur.js +3 -1
- package/lib/dist/filter/filter.d.ts +4 -1
- package/lib/dist/filter/filter.d.ts.map +1 -1
- package/lib/dist/filter/filter.js +4 -1
- package/lib/dist/filter/hue-rotation.d.ts +2 -1
- package/lib/dist/filter/hue-rotation.d.ts.map +1 -1
- package/lib/dist/filter/hue-rotation.js +3 -2
- package/lib/dist/index.d.ts +1 -0
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +2 -1
- package/lib/dist/interface/transformable.d.ts +1 -1
- package/lib/dist/loader/image.d.ts +3 -3
- package/lib/dist/loader/image.d.ts.map +1 -1
- package/lib/dist/loader/image.js +10 -22
- package/lib/dist/material/glass.js +3 -3
- package/lib/dist/material/material.d.ts +3 -7
- package/lib/dist/material/material.d.ts.map +1 -1
- package/lib/dist/material/material.js +1 -1
- package/lib/dist/painter/background-with-depth/background-with-depth.d.ts +1 -1
- package/lib/dist/painter/background-with-depth/background-with-depth.js +2 -2
- package/lib/dist/painter/filter/filter.d.ts +7 -9
- package/lib/dist/painter/filter/filter.d.ts.map +1 -1
- package/lib/dist/painter/filter/filter.js +41 -47
- package/lib/dist/painter/fragment-shader/fragment-shader.d.ts +2 -2
- package/lib/dist/painter/fragment-shader/fragment-shader.js +2 -2
- package/lib/dist/painter/framebuffer-msaa.d.ts +23 -12
- package/lib/dist/painter/framebuffer-msaa.d.ts.map +1 -1
- package/lib/dist/painter/framebuffer-msaa.js +60 -9
- package/lib/dist/painter/framebuffer.d.ts +19 -18
- package/lib/dist/painter/framebuffer.d.ts.map +1 -1
- package/lib/dist/painter/framebuffer.js +76 -19
- package/lib/dist/painter/gizmo/gizmo.d.ts +31 -0
- package/lib/dist/painter/gizmo/gizmo.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/gizmo.js +186 -0
- package/lib/dist/painter/gizmo/index.d.ts +2 -0
- package/lib/dist/painter/gizmo/index.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/index.js +2 -0
- package/lib/dist/painter/gizmo/painters/axes.1.d.ts +14 -0
- package/lib/dist/painter/gizmo/painters/axes.1.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/axes.1.js +50 -0
- package/lib/dist/painter/gizmo/painters/axes.d.ts +16 -0
- package/lib/dist/painter/gizmo/painters/axes.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/axes.js +81 -0
- package/lib/dist/painter/gizmo/painters/consts.d.ts +4 -0
- package/lib/dist/painter/gizmo/painters/consts.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/consts.js +4 -0
- package/lib/dist/painter/gizmo/painters/mask.d.ts +14 -0
- package/lib/dist/painter/gizmo/painters/mask.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/mask.js +90 -0
- package/lib/dist/painter/gizmo/painters/normal.1.d.ts +21 -0
- package/lib/dist/painter/gizmo/painters/normal.1.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/normal.1.js +111 -0
- package/lib/dist/painter/gizmo/painters/normal.d.ts +17 -0
- package/lib/dist/painter/gizmo/painters/normal.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/normal.js +87 -0
- package/lib/dist/painter/gizmo/painters/tips.d.ts +18 -0
- package/lib/dist/painter/gizmo/painters/tips.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/painters/tips.js +44 -0
- package/lib/dist/painter/gizmo/tips.d.ts +22 -0
- package/lib/dist/painter/gizmo/tips.d.ts.map +1 -0
- package/lib/dist/painter/gizmo/tips.js +51 -0
- package/lib/dist/painter/group-camera.d.ts +4 -2
- package/lib/dist/painter/group-camera.d.ts.map +1 -1
- package/lib/dist/painter/group-camera.js +7 -3
- package/lib/dist/painter/group.d.ts +6 -6
- package/lib/dist/painter/group.d.ts.map +1 -1
- package/lib/dist/painter/group.js +19 -13
- package/lib/dist/painter/index.d.ts +3 -0
- package/lib/dist/painter/index.d.ts.map +1 -1
- package/lib/dist/painter/index.js +4 -1
- package/lib/dist/painter/lod/lod.d.ts +1 -1
- package/lib/dist/painter/lod/lod.js +2 -2
- package/lib/dist/painter/logic.d.ts +2 -2
- package/lib/dist/painter/logic.js +2 -2
- package/lib/dist/painter/mesh/gltf/gltf.d.ts +2 -8
- package/lib/dist/painter/mesh/gltf/gltf.d.ts.map +1 -1
- package/lib/dist/painter/mesh/gltf/gltf.js +1 -1
- package/lib/dist/painter/mesh/mesh/mesh.d.ts +7 -16
- package/lib/dist/painter/mesh/mesh/mesh.d.ts.map +1 -1
- package/lib/dist/painter/mesh/mesh/mesh.js +21 -9
- package/lib/dist/painter/node/node.d.ts +3 -3
- package/lib/dist/painter/node/node.js +4 -4
- package/lib/dist/painter/overlay/index.d.ts +2 -0
- package/lib/dist/painter/overlay/index.d.ts.map +1 -0
- package/lib/dist/painter/overlay/index.js +2 -0
- package/lib/dist/painter/overlay/overlay.d.ts +77 -0
- package/lib/dist/painter/overlay/overlay.d.ts.map +1 -0
- package/lib/dist/painter/overlay/overlay.js +196 -0
- package/lib/dist/painter/painter.d.ts +1 -1
- package/lib/dist/painter/program.d.ts +70 -0
- package/lib/dist/painter/program.d.ts.map +1 -0
- package/lib/dist/painter/program.js +250 -0
- package/lib/dist/painter/scissor.d.ts +1 -1
- package/lib/dist/painter/scissor.js +2 -2
- package/lib/dist/painter/segments/segments-morphing.d.ts +4 -13
- package/lib/dist/painter/segments/segments-morphing.d.ts.map +1 -1
- package/lib/dist/painter/segments/segments-morphing.js +3 -3
- package/lib/dist/painter/segments/segments.d.ts +4 -13
- package/lib/dist/painter/segments/segments.d.ts.map +1 -1
- package/lib/dist/painter/segments/segments.js +3 -3
- package/lib/dist/painter/sprites/sprites.d.ts +5 -0
- package/lib/dist/painter/sprites/sprites.d.ts.map +1 -1
- package/lib/dist/painter/sprites/sprites.js +20 -9
- package/lib/dist/painter/state/state.js +4 -4
- package/lib/dist/painter/tubes/tubes.d.ts +4 -13
- package/lib/dist/painter/tubes/tubes.d.ts.map +1 -1
- package/lib/dist/painter/tubes/tubes.js +2 -2
- package/lib/dist/painter/x-ray/x-ray.d.ts +3 -11
- package/lib/dist/painter/x-ray/x-ray.d.ts.map +1 -1
- package/lib/dist/painter/x-ray/x-ray.js +3 -3
- package/lib/dist/parser/gltf/gltf.d.ts +2 -5
- package/lib/dist/parser/gltf/gltf.d.ts.map +1 -1
- package/lib/dist/parser/gltf/gltf.js +1 -1
- package/lib/dist/program/program.d.ts +2 -0
- package/lib/dist/program/program.d.ts.map +1 -1
- package/lib/dist/program/program.js +43 -8
- package/lib/dist/shader/fragment.d.ts.map +1 -1
- package/lib/dist/shader/fragment.js +3 -3
- package/lib/dist/shader/vertex.d.ts +3 -1
- package/lib/dist/shader/vertex.d.ts.map +1 -1
- package/lib/dist/shader/vertex.js +8 -6
- package/lib/dist/texture/texture-depth.d.ts +3 -11
- package/lib/dist/texture/texture-depth.d.ts.map +1 -1
- package/lib/dist/texture/texture-depth.js +1 -1
- package/lib/dist/texture/texture2d.d.ts +5 -11
- package/lib/dist/texture/texture2d.d.ts.map +1 -1
- package/lib/dist/texture/texture2d.js +3 -3
- package/lib/dist/time/interval/interval.d.ts +3 -3
- package/lib/dist/time/interval/interval.js +6 -6
- package/lib/dist/types/painter.d.ts +1 -1
- package/lib/dist/types/program.d.ts +3 -2
- package/lib/dist/types/program.d.ts.map +1 -1
- package/lib/dist/uniform/index.d.ts +3 -0
- package/lib/dist/uniform/index.d.ts.map +1 -0
- package/lib/dist/uniform/index.js +3 -0
- package/lib/dist/uniform/ubo-camera.d.ts +9 -0
- package/lib/dist/uniform/ubo-camera.d.ts.map +1 -0
- package/lib/dist/uniform/ubo-camera.js +20 -0
- package/lib/dist/uniform/uniform-buffer-object.d.ts +56 -0
- package/lib/dist/uniform/uniform-buffer-object.d.ts.map +1 -0
- package/lib/dist/uniform/uniform-buffer-object.js +347 -0
- package/lib/dist/utils/array.d.ts +2 -0
- package/lib/dist/utils/array.d.ts.map +1 -0
- package/lib/dist/utils/array.js +6 -0
- package/lib/dist/utils/index.d.ts +1 -0
- package/lib/dist/utils/index.d.ts.map +1 -1
- package/lib/dist/utils/index.js +2 -1
- package/package.json +2 -2
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { TgdPainter } from "../painter.js";
|
|
2
|
+
import { TgdDataset } from "./../../dataset/index.js";
|
|
3
|
+
import { TgdProgram } from "./../../program/index.js";
|
|
4
|
+
import { TgdShaderFragment, TgdShaderVertex } from "./../../shader/index.js";
|
|
5
|
+
import { TgdVertexArray } from "./../../vao/index.js";
|
|
6
|
+
import { TgdEvent } from "./../../event/index.js";
|
|
7
|
+
export class TgdPainterOverlay extends TgdPainter {
|
|
8
|
+
constructor(context, { alignX = +1, alignY = +1, scaleX = 1, scaleY = 1, width, height, margin = 0, z = 0, texture, } = {}) {
|
|
9
|
+
super();
|
|
10
|
+
this.context = context;
|
|
11
|
+
this.eventResize = new TgdEvent();
|
|
12
|
+
this.eventPointerTap = new TgdEvent();
|
|
13
|
+
this.eventPointerHover = new TgdEvent();
|
|
14
|
+
this.lastWidth = 0;
|
|
15
|
+
this.lastHeight = 0;
|
|
16
|
+
this.handleTap = (evtScreen) => {
|
|
17
|
+
const x = this.xScreenToLayout(evtScreen.x);
|
|
18
|
+
const y = this.yScreenToLayout(evtScreen.y);
|
|
19
|
+
if (Math.abs(x) > 1 || Math.abs(y) > 1)
|
|
20
|
+
return;
|
|
21
|
+
const evtOverlay = structuredClone(evtScreen);
|
|
22
|
+
evtOverlay.x = x;
|
|
23
|
+
evtOverlay.y = y;
|
|
24
|
+
this.eventPointerTap.dispatch(evtOverlay);
|
|
25
|
+
};
|
|
26
|
+
this.handleHover = (evtScreen) => {
|
|
27
|
+
const x = this.xScreenToLayout(evtScreen.current.x);
|
|
28
|
+
const y = this.yScreenToLayout(evtScreen.current.y);
|
|
29
|
+
if (Math.abs(x) > 1 || Math.abs(y) > 1)
|
|
30
|
+
return;
|
|
31
|
+
const evtOverlay = structuredClone(evtScreen);
|
|
32
|
+
evtOverlay.current.x = x;
|
|
33
|
+
evtOverlay.current.y = y;
|
|
34
|
+
this.eventPointerHover.dispatch(evtOverlay);
|
|
35
|
+
};
|
|
36
|
+
this.xScreenToLayout = (xScreen) => {
|
|
37
|
+
var _a;
|
|
38
|
+
const { context, alignX, marginLeft, marginRight } = this;
|
|
39
|
+
const marginPx = marginLeft + marginRight;
|
|
40
|
+
const widthPx = (_a = this.width) !== null && _a !== void 0 ? _a : context.width - marginPx;
|
|
41
|
+
const frameWidthPx = context.width - widthPx - marginPx;
|
|
42
|
+
const screenPerPixel = 2 / context.width;
|
|
43
|
+
const center = marginLeft + (widthPx + (1 + alignX) * frameWidthPx - context.width) / 2;
|
|
44
|
+
const factor = context.width / widthPx;
|
|
45
|
+
return (xScreen - center * screenPerPixel) * factor;
|
|
46
|
+
};
|
|
47
|
+
this.xLayoutToScreen = (xLayout) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const { context, alignX, marginLeft, marginRight } = this;
|
|
50
|
+
const marginPx = marginLeft + marginRight;
|
|
51
|
+
const widthPx = (_a = this.width) !== null && _a !== void 0 ? _a : context.width - marginPx;
|
|
52
|
+
const frameWidthPx = context.width - widthPx - marginPx;
|
|
53
|
+
const screenPerPixel = 2 / context.width;
|
|
54
|
+
const center = marginLeft + (widthPx + (1 + alignX) * frameWidthPx - context.width) / 2;
|
|
55
|
+
const factor = widthPx / context.width;
|
|
56
|
+
return xLayout * factor + center * screenPerPixel;
|
|
57
|
+
};
|
|
58
|
+
this.yScreenToLayout = (yScreen) => {
|
|
59
|
+
var _a;
|
|
60
|
+
const { context, alignY, marginTop, marginBottom } = this;
|
|
61
|
+
const marginPx = marginTop + marginBottom;
|
|
62
|
+
const heightPx = (_a = this.height) !== null && _a !== void 0 ? _a : context.height - marginPx;
|
|
63
|
+
const frameHeightPx = context.height - heightPx - marginPx;
|
|
64
|
+
const screenPerPixel = 2 / context.height;
|
|
65
|
+
const center = marginBottom + (heightPx + (1 + alignY) * frameHeightPx - context.height) / 2;
|
|
66
|
+
const factor = context.height / heightPx;
|
|
67
|
+
return (yScreen - center * screenPerPixel) * factor;
|
|
68
|
+
};
|
|
69
|
+
this.yLayoutToScreen = (yLayout) => {
|
|
70
|
+
var _a;
|
|
71
|
+
const { context, alignY, marginTop, marginBottom } = this;
|
|
72
|
+
const marginPx = marginTop + marginBottom;
|
|
73
|
+
const heightPx = (_a = this.height) !== null && _a !== void 0 ? _a : context.height - marginPx;
|
|
74
|
+
const frameHeightPx = context.height - heightPx - marginPx;
|
|
75
|
+
const screenPerPixel = 2 / context.height;
|
|
76
|
+
const center = marginBottom + (heightPx + (1 + alignY) * frameHeightPx - context.height) / 2;
|
|
77
|
+
const factor = heightPx / context.height;
|
|
78
|
+
return yLayout * factor + center * screenPerPixel;
|
|
79
|
+
};
|
|
80
|
+
this.name = `Overlay/${this.name}`;
|
|
81
|
+
this.alignX = alignX;
|
|
82
|
+
this.alignY = alignY;
|
|
83
|
+
this.scaleX = scaleX;
|
|
84
|
+
this.scaleY = scaleY;
|
|
85
|
+
this.width = width;
|
|
86
|
+
this.height = height;
|
|
87
|
+
if (typeof margin === "number") {
|
|
88
|
+
this.marginTop = margin;
|
|
89
|
+
this.marginRight = margin;
|
|
90
|
+
this.marginBottom = margin;
|
|
91
|
+
this.marginLeft = margin;
|
|
92
|
+
}
|
|
93
|
+
else if (margin.length === 2) {
|
|
94
|
+
const [vertical, horizontal] = margin;
|
|
95
|
+
this.marginTop = vertical;
|
|
96
|
+
this.marginRight = horizontal;
|
|
97
|
+
this.marginBottom = vertical;
|
|
98
|
+
this.marginLeft = horizontal;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const [top, right, bottom, left] = margin;
|
|
102
|
+
this.marginTop = top;
|
|
103
|
+
this.marginRight = right;
|
|
104
|
+
this.marginBottom = bottom;
|
|
105
|
+
this.marginLeft = left;
|
|
106
|
+
}
|
|
107
|
+
this.z = z;
|
|
108
|
+
this.texture = texture;
|
|
109
|
+
const dataset = new TgdDataset({
|
|
110
|
+
attPos: "vec2",
|
|
111
|
+
attUV: "vec2",
|
|
112
|
+
});
|
|
113
|
+
dataset.set("attPos", new Float32Array([+1, -1, +1, +1, -1, -1, -1, +1]));
|
|
114
|
+
dataset.set("attUV", new Float32Array([1, 1, 1, 0, 0, 1, 0, 0]));
|
|
115
|
+
const prg = new TgdProgram(context.gl, {
|
|
116
|
+
vert: new TgdShaderVertex({
|
|
117
|
+
uniforms: {
|
|
118
|
+
uniCenter: "vec2",
|
|
119
|
+
uniScale: "vec2",
|
|
120
|
+
uniScaleUV: "vec2",
|
|
121
|
+
uniZ: "float",
|
|
122
|
+
},
|
|
123
|
+
varying: {
|
|
124
|
+
varUV: "vec2",
|
|
125
|
+
},
|
|
126
|
+
attributes: {
|
|
127
|
+
attPos: "vec2",
|
|
128
|
+
attUV: "vec2",
|
|
129
|
+
},
|
|
130
|
+
mainCode: [
|
|
131
|
+
"varUV = (attUV - vec2(.5)) * uniScaleUV + vec2(.5);",
|
|
132
|
+
"gl_Position = vec4(attPos * uniScale + uniCenter, uniZ, 1);",
|
|
133
|
+
],
|
|
134
|
+
}).code,
|
|
135
|
+
frag: new TgdShaderFragment({
|
|
136
|
+
uniforms: {
|
|
137
|
+
uniTexture: "sampler2D",
|
|
138
|
+
},
|
|
139
|
+
varying: {
|
|
140
|
+
varUV: "vec2",
|
|
141
|
+
},
|
|
142
|
+
mainCode: ["FragColor = texture(uniTexture, varUV);"],
|
|
143
|
+
}).code,
|
|
144
|
+
});
|
|
145
|
+
const vao = new TgdVertexArray(context.gl, prg, [dataset]);
|
|
146
|
+
this.prg = prg;
|
|
147
|
+
this.vao = vao;
|
|
148
|
+
const { pointer } = context.inputs;
|
|
149
|
+
pointer.eventTap.addListener(this.handleTap);
|
|
150
|
+
pointer.eventHover.addListener(this.handleHover);
|
|
151
|
+
}
|
|
152
|
+
delete() {
|
|
153
|
+
const { context } = this;
|
|
154
|
+
if (context) {
|
|
155
|
+
this.eventPointerTap.removeListener(this.handleTap);
|
|
156
|
+
}
|
|
157
|
+
this.prg.delete();
|
|
158
|
+
this.vao.delete();
|
|
159
|
+
}
|
|
160
|
+
paint(time, delta) {
|
|
161
|
+
this.checkForResizeEvent();
|
|
162
|
+
const { context, prg, vao, z, scaleX, scaleY, xLayoutToScreen, yLayoutToScreen, texture } = this;
|
|
163
|
+
const { gl } = context;
|
|
164
|
+
prg.use();
|
|
165
|
+
prg.uniform1f("uniZ", z);
|
|
166
|
+
const x0 = xLayoutToScreen(0);
|
|
167
|
+
const y0 = yLayoutToScreen(0);
|
|
168
|
+
prg.uniform2f("uniCenter", x0, y0);
|
|
169
|
+
const x1 = xLayoutToScreen(1);
|
|
170
|
+
const y1 = yLayoutToScreen(1);
|
|
171
|
+
prg.uniform2f("uniScale", x1 - x0, y1 - y0);
|
|
172
|
+
prg.uniform2f("uniScaleUV", scaleX, scaleY);
|
|
173
|
+
if (!texture) {
|
|
174
|
+
throw new Error("[TgdPainterOverlay] texture has not been set!");
|
|
175
|
+
}
|
|
176
|
+
texture.activate(0, prg, "uniTexture");
|
|
177
|
+
vao.bind();
|
|
178
|
+
const cull = context.webglParams.cullFace;
|
|
179
|
+
context.webglParams.cullFace = false;
|
|
180
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
181
|
+
context.webglParams.cullFace = cull;
|
|
182
|
+
vao.unbind();
|
|
183
|
+
}
|
|
184
|
+
checkForResizeEvent() {
|
|
185
|
+
var _a, _b;
|
|
186
|
+
const { context, lastWidth, lastHeight, marginLeft, marginRight, marginTop, marginBottom } = this;
|
|
187
|
+
const width = Math.max(0, (_a = this.width) !== null && _a !== void 0 ? _a : context.width - marginLeft - marginRight);
|
|
188
|
+
const height = Math.max(0, (_b = this.height) !== null && _b !== void 0 ? _b : context.height - marginTop - marginBottom);
|
|
189
|
+
if (width !== lastWidth || height !== lastHeight) {
|
|
190
|
+
this.lastWidth = width;
|
|
191
|
+
this.lastHeight = height;
|
|
192
|
+
this.eventResize.dispatch({ width, height });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWludGVyL292ZXJsYXkvb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQXdDckMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFVBQVU7SUFzQjdDLFlBQ3FCLE9BQW1CLEVBQ3BDLEVBQ0ksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNYLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDWCxNQUFNLEdBQUcsQ0FBQyxFQUNWLE1BQU0sR0FBRyxDQUFDLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEdBQUcsQ0FBQyxFQUNWLENBQUMsR0FBRyxDQUFDLEVBQ0wsT0FBTyxNQUM0QixFQUFFO1FBRXpDLEtBQUssRUFBRSxDQUFBO1FBYlUsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQXRCeEIsZ0JBQVcsR0FBRyxJQUFJLFFBQVEsRUFBcUMsQ0FBQTtRQUMvRCxvQkFBZSxHQUFHLElBQUksUUFBUSxFQUEyQixDQUFBO1FBQ3pELHNCQUFpQixHQUFHLElBQUksUUFBUSxFQUE0QixDQUFBO1FBY3BFLGNBQVMsR0FBRyxDQUFDLENBQUE7UUFDYixlQUFVLEdBQUcsQ0FBQyxDQUFBO1FBMEZkLGNBQVMsR0FBRyxDQUFDLFNBQWtDLEVBQUUsRUFBRTtZQUN2RCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxD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
|
|
@@ -11,7 +11,7 @@ export declare abstract class TgdPainter {
|
|
|
11
11
|
name: string;
|
|
12
12
|
active: boolean;
|
|
13
13
|
abstract delete(): void;
|
|
14
|
-
abstract paint(time: number,
|
|
14
|
+
abstract paint(time: number, delta: number): void;
|
|
15
15
|
get hierarchy(): TgdDebugPainterHierarchy;
|
|
16
16
|
debug(caption?: string): void;
|
|
17
17
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { TgdContext } from "../context";
|
|
2
|
+
import { TgdDataset, type TgdDatasetOptions, type TgdDatasetType } from "../dataset";
|
|
3
|
+
import { type TgdCodeBloc, type TgdCodeFunctions, type TgdCodeVariables } from "../shader";
|
|
4
|
+
import type { TgdTypeArrayForElements, WebglAttributeType } from "../types";
|
|
5
|
+
import type { TgdPainterFunction } from "../types/painter";
|
|
6
|
+
import { TgdTexture2D, TgdTextureCube } from "@tolokoban/tgd";
|
|
7
|
+
import { TgdUniformBufferObject, type TgdUniformBufferObjectOptions } from "./../uniform/uniform-buffer-object";
|
|
8
|
+
import { TgdPainter } from "./painter";
|
|
9
|
+
import { type TgdPainterStateOptions } from "./state";
|
|
10
|
+
interface DatasetOptions extends Partial<Omit<TgdDatasetOptions, "data" | "buffer">> {
|
|
11
|
+
attribs: Record<string, {
|
|
12
|
+
type: TgdDatasetType;
|
|
13
|
+
data: ArrayBuffer | Int8Array | Uint8Array | Int16Array | Uint16Array | Uint32Array | Float32Array | {
|
|
14
|
+
buffer: ArrayBuffer;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export interface TgdPainterProgramOptions {
|
|
19
|
+
drawMode: "POINTS" | "LINE_STRIP" | "LINE_LOOP" | "LINES" | "TRIANGLE_STRIP" | "TRIANGLE_FAN" | "TRIANGLES" | WebGL2RenderingContext["POINTS"] | WebGL2RenderingContext["LINE_STRIP"] | WebGL2RenderingContext["LINE_LOOP"] | WebGL2RenderingContext["LINES"] | WebGL2RenderingContext["TRIANGLE_STRIP"] | WebGL2RenderingContext["TRIANGLE_FAN"] | WebGL2RenderingContext["TRIANGLES"];
|
|
20
|
+
uniforms?: Record<string, TgdUniformBufferObject | Omit<TgdUniformBufferObjectOptions, "bindingPoint">>;
|
|
21
|
+
textures?: Record<string, TgdTexture2D | TgdTextureCube>;
|
|
22
|
+
dataset: TgdDataset | DatasetOptions | (TgdDataset | DatasetOptions)[];
|
|
23
|
+
varying?: TgdCodeVariables<WebglAttributeType>;
|
|
24
|
+
vert: Partial<{
|
|
25
|
+
precision: "lowp" | "mediump" | "highp";
|
|
26
|
+
functions: TgdCodeFunctions;
|
|
27
|
+
mainCode: TgdCodeBloc;
|
|
28
|
+
header: TgdCodeBloc;
|
|
29
|
+
}>;
|
|
30
|
+
frag: Partial<{
|
|
31
|
+
precision: "lowp" | "mediump" | "highp";
|
|
32
|
+
outputs: TgdCodeVariables<WebglAttributeType>;
|
|
33
|
+
functions: TgdCodeFunctions | TgdCodeBloc;
|
|
34
|
+
mainCode: TgdCodeBloc;
|
|
35
|
+
header: TgdCodeBloc;
|
|
36
|
+
}>;
|
|
37
|
+
elements?: TgdTypeArrayForElements;
|
|
38
|
+
state?: Partial<Omit<TgdPainterStateOptions, "children">>;
|
|
39
|
+
elementsCount?: number;
|
|
40
|
+
elementsOffset?: number;
|
|
41
|
+
instancesCount?: number;
|
|
42
|
+
onEnter?: TgdPainterFunction;
|
|
43
|
+
onDelete?: () => void;
|
|
44
|
+
}
|
|
45
|
+
export declare class TgdPainterProgram extends TgdPainter {
|
|
46
|
+
private readonly context;
|
|
47
|
+
elementsCount: number;
|
|
48
|
+
elementsOffset: number;
|
|
49
|
+
instancesCount: number;
|
|
50
|
+
readonly textures: Record<string, TgdTexture2D | TgdTextureCube>;
|
|
51
|
+
private readonly uniformBlocks;
|
|
52
|
+
private readonly uniformBlocksToDelete;
|
|
53
|
+
private readonly prg;
|
|
54
|
+
private readonly vao;
|
|
55
|
+
private readonly drawMode;
|
|
56
|
+
private readonly painterState;
|
|
57
|
+
private readonly hasElements;
|
|
58
|
+
private readonly elementsType;
|
|
59
|
+
private readonly onEnter?;
|
|
60
|
+
private readonly onDelete?;
|
|
61
|
+
constructor(context: TgdContext, { onEnter, onDelete, uniforms, textures, varying, vert, frag, dataset, elements, drawMode, state, elementsCount, elementsOffset, instancesCount, }: TgdPainterProgramOptions);
|
|
62
|
+
delete(): void;
|
|
63
|
+
paint(time: number, delta: number): void;
|
|
64
|
+
debug(caption?: string): void;
|
|
65
|
+
private readonly internalPaint;
|
|
66
|
+
private uniformsToCode;
|
|
67
|
+
private resolveUniformBlock;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/painter/program.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAA6B,MAAM,cAAc,CAAA;AAGjH,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAIxB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAA;AAC/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,OAAO,EAAmB,YAAY,EAAE,cAAc,EAAkB,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAEtE,UAAU,cAAe,SAAQ,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IAChF,OAAO,EAAE,MAAM,CACX,MAAM,EACN;QACI,IAAI,EAAE,cAAc,CAAA;QACpB,IAAI,EACE,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,GACV,WAAW,GACX,WAAW,GACX,YAAY,GACZ;YAAE,MAAM,EAAE,WAAW,CAAA;SAAE,CAAA;KAChC,CACJ,CAAA;CACJ;AAED,MAAM,WAAW,wBAAwB;IACrC,QAAQ,EACF,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,OAAO,GACP,gBAAgB,GAChB,cAAc,GACd,WAAW,GACX,sBAAsB,CAAC,QAAQ,CAAC,GAChC,sBAAsB,CAAC,YAAY,CAAC,GACpC,sBAAsB,CAAC,WAAW,CAAC,GACnC,sBAAsB,CAAC,OAAO,CAAC,GAC/B,sBAAsB,CAAC,gBAAgB,CAAC,GACxC,sBAAsB,CAAC,cAAc,CAAC,GACtC,sBAAsB,CAAC,WAAW,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC,6BAA6B,EAAE,cAAc,CAAC,CAAC,CAAA;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC,CAAA;IACxD,OAAO,EAAE,UAAU,GAAG,cAAc,GAAG,CAAC,UAAU,GAAG,cAAc,CAAC,EAAE,CAAA;IACtE,OAAO,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;IAC9C,IAAI,EAAE,OAAO,CAAC;QACV,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;QACvC,SAAS,EAAE,gBAAgB,CAAA;QAC3B,QAAQ,EAAE,WAAW,CAAA;QACrB,MAAM,EAAE,WAAW,CAAA;KACtB,CAAC,CAAA;IACF,IAAI,EAAE,OAAO,CAAC;QACV,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;QACvC,OAAO,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;QAC7C,SAAS,EAAE,gBAAgB,GAAG,WAAW,CAAA;QACzC,QAAQ,EAAE,WAAW,CAAA;QACrB,MAAM,EAAE,WAAW,CAAA;KACtB,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,uBAAuB,CAAA;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC,CAAA;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IAkBzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBrB,aAAa,SAAI;IACjB,cAAc,SAAI;IAClB,cAAc,SAAI;IACzB,SAAgB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC,CAAA;IAEvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA+B;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAY;gBAGjB,OAAO,EAAE,UAAU,EACpC,EACI,OAAO,EACP,QAAQ,EACR,QAAa,EACb,QAAa,EACb,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,aAAa,EACb,cAAc,EACd,cAAc,GACjB,EAAE,wBAAwB;IAkE/B,MAAM,IAAI,IAAI;IASd,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM;IAWtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAwC7B;IAED,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,mBAAmB;CAK9B"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { TgdDataset } from "./../dataset/index.js";
|
|
2
|
+
import { TgdConsole } from "./../debug/index.js";
|
|
3
|
+
import { TgdProgram } from "./../program/index.js";
|
|
4
|
+
import { TgdShaderFragment, TgdShaderVertex, tgdCodeStringify, } from "./../shader/index.js";
|
|
5
|
+
import { ensureArray, webglElementTypeFromTypedArray, webglLookup } from "./../utils/index.js";
|
|
6
|
+
import { TgdPainterLogic, TgdTexture2D, TgdTextureCube, TgdVertexArray } from "./../index.js";
|
|
7
|
+
import { TgdUniformBufferObject } from "./../uniform/uniform-buffer-object.js";
|
|
8
|
+
import { TgdPainter } from "./painter.js";
|
|
9
|
+
import { TgdPainterState } from "./state/index.js";
|
|
10
|
+
export class TgdPainterProgram extends TgdPainter {
|
|
11
|
+
constructor(context, { onEnter, onDelete, uniforms = {}, textures = {}, varying, vert, frag, dataset, elements, drawMode, state, elementsCount, elementsOffset, instancesCount, }) {
|
|
12
|
+
super();
|
|
13
|
+
this.context = context;
|
|
14
|
+
this.elementsCount = 0;
|
|
15
|
+
this.elementsOffset = 0;
|
|
16
|
+
this.instancesCount = 0;
|
|
17
|
+
this.uniformBlocks = [];
|
|
18
|
+
this.uniformBlocksToDelete = [];
|
|
19
|
+
this.internalPaint = (time, delta) => {
|
|
20
|
+
const { context, onEnter, textures, uniformBlocks, prg, vao, elementsType, elementsCount, elementsOffset, instancesCount, drawMode: mode, } = this;
|
|
21
|
+
const { gl } = context;
|
|
22
|
+
prg.use();
|
|
23
|
+
let unit = 0;
|
|
24
|
+
for (const name of Object.keys(textures)) {
|
|
25
|
+
const texture = textures[name];
|
|
26
|
+
texture.activate(unit++, prg, name);
|
|
27
|
+
}
|
|
28
|
+
onEnter === null || onEnter === void 0 ? void 0 : onEnter(time, delta);
|
|
29
|
+
for (const block of uniformBlocks) {
|
|
30
|
+
block.updateData();
|
|
31
|
+
}
|
|
32
|
+
vao.bind();
|
|
33
|
+
if (this.hasElements) {
|
|
34
|
+
if (instancesCount > 0) {
|
|
35
|
+
gl.drawElementsInstanced(mode, elementsCount, elementsType, elementsOffset, instancesCount);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
gl.drawElements(mode, elementsCount, elementsType, elementsOffset);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (instancesCount > 0) {
|
|
43
|
+
gl.drawArraysInstanced(mode, elementsOffset, elementsCount, instancesCount);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
gl.drawArrays(mode, elementsOffset, elementsCount);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
vao.unbind();
|
|
50
|
+
};
|
|
51
|
+
this.textures = textures;
|
|
52
|
+
this.onEnter = onEnter;
|
|
53
|
+
this.onDelete = onDelete;
|
|
54
|
+
const datasets = ensureArray(dataset).map((item) => {
|
|
55
|
+
if (item instanceof TgdDataset)
|
|
56
|
+
return item;
|
|
57
|
+
const attributesDefinition = {};
|
|
58
|
+
for (const attribName of Object.keys(item.attribs)) {
|
|
59
|
+
attributesDefinition[attribName] = item.attribs[attribName].type;
|
|
60
|
+
}
|
|
61
|
+
const ds = new TgdDataset(attributesDefinition, item);
|
|
62
|
+
for (const attribName of Object.keys(item.attribs)) {
|
|
63
|
+
ds.set(attribName, item.attribs[attribName].data);
|
|
64
|
+
}
|
|
65
|
+
return ds;
|
|
66
|
+
});
|
|
67
|
+
this.drawMode = typeof drawMode === "number" ? drawMode : context.gl[drawMode];
|
|
68
|
+
const uniformsHeader = ensureArray(this.uniformsToCode(uniforms));
|
|
69
|
+
const uniformsForTextures = texturesToUniforms(textures);
|
|
70
|
+
const vertexShader = new TgdShaderVertex(Object.assign(Object.assign({}, vert), { uniforms: uniformsForTextures, attributes: resolveAttributesFromDataset(datasets), header: [...uniformsHeader, ...ensureArray(vert.header)], varying }));
|
|
71
|
+
const fragmentShader = new TgdShaderFragment(Object.assign(Object.assign({}, frag), { uniforms: uniformsForTextures, header: [...uniformsHeader, ...ensureArray(vert.header)], varying }));
|
|
72
|
+
const program = new TgdProgram(context.gl, {
|
|
73
|
+
vert: vertexShader,
|
|
74
|
+
frag: fragmentShader,
|
|
75
|
+
});
|
|
76
|
+
this.prg = program;
|
|
77
|
+
const vao = new TgdVertexArray(context.gl, program, datasets, elements);
|
|
78
|
+
this.vao = vao;
|
|
79
|
+
this.painterState = new TgdPainterState(context, Object.assign(Object.assign({}, state), { children: [new TgdPainterLogic(this.internalPaint)] }));
|
|
80
|
+
this.elementsCount = elementsCount !== null && elementsCount !== void 0 ? elementsCount : resolveElementsCount(datasets, elements);
|
|
81
|
+
this.elementsOffset = elementsOffset !== null && elementsOffset !== void 0 ? elementsOffset : 0;
|
|
82
|
+
this.instancesCount = instancesCount !== null && instancesCount !== void 0 ? instancesCount : resolveInstancesCount(datasets);
|
|
83
|
+
this.hasElements = !!elements;
|
|
84
|
+
this.elementsType = elements ? webglElementTypeFromTypedArray(elements) : 0;
|
|
85
|
+
const setBindingPoints = new Set();
|
|
86
|
+
Object.keys(uniforms).forEach((blockName, index) => {
|
|
87
|
+
const block = this.uniformBlocks[index];
|
|
88
|
+
if (setBindingPoints.has(block.bindingPoint)) {
|
|
89
|
+
const code = Object.keys(uniforms).map((blockName, index) => this.uniformBlocks[index].toShaderCode(blockName));
|
|
90
|
+
throw new Error(`[TgdPainterProgram] Uniform blocks must have distincts binding points!\n${tgdCodeStringify(code)}`);
|
|
91
|
+
}
|
|
92
|
+
setBindingPoints.add(block.bindingPoint);
|
|
93
|
+
block.bindToProgram(program, blockName);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
delete() {
|
|
97
|
+
var _a;
|
|
98
|
+
(_a = this.onDelete) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
99
|
+
for (const block of this.uniformBlocksToDelete) {
|
|
100
|
+
block.delete();
|
|
101
|
+
}
|
|
102
|
+
this.prg.delete();
|
|
103
|
+
this.vao.delete();
|
|
104
|
+
}
|
|
105
|
+
paint(time, delta) {
|
|
106
|
+
this.painterState.paint(time, delta);
|
|
107
|
+
}
|
|
108
|
+
debug(caption) {
|
|
109
|
+
console.log(caption !== null && caption !== void 0 ? caption : this.name);
|
|
110
|
+
console.log({
|
|
111
|
+
drawMode: webglLookup(this.drawMode),
|
|
112
|
+
elementsCount: this.elementsCount,
|
|
113
|
+
elementsOffset: this.elementsOffset,
|
|
114
|
+
instancesCount: this.instancesCount,
|
|
115
|
+
});
|
|
116
|
+
this.vao.debug();
|
|
117
|
+
}
|
|
118
|
+
uniformsToCode(uniforms) {
|
|
119
|
+
const code = [];
|
|
120
|
+
const setNames = new Set();
|
|
121
|
+
const setDuplicated = new Set();
|
|
122
|
+
const names = {};
|
|
123
|
+
for (const blockName of Object.keys(uniforms)) {
|
|
124
|
+
const block = this.resolveUniformBlock(uniforms[blockName]);
|
|
125
|
+
this.uniformBlocks.push(block);
|
|
126
|
+
names[blockName] = block.names;
|
|
127
|
+
code.push(...ensureArray(block.toShaderCode(blockName)));
|
|
128
|
+
for (const name of block.names) {
|
|
129
|
+
if (setNames.has(name))
|
|
130
|
+
setDuplicated.add(name);
|
|
131
|
+
else
|
|
132
|
+
setNames.add(name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (setDuplicated.size > 0) {
|
|
136
|
+
// There is a duplicate!
|
|
137
|
+
const out = new TgdConsole({
|
|
138
|
+
text: "[TgdPainterProgram] You have duplicated names in your uniform blocks:\n",
|
|
139
|
+
color: "#f33",
|
|
140
|
+
});
|
|
141
|
+
for (const blockName of Object.keys(names)) {
|
|
142
|
+
out.add(` ${blockName}`, { bold: true }).add(": ");
|
|
143
|
+
names[blockName].forEach((name, index) => {
|
|
144
|
+
if (index > 0)
|
|
145
|
+
out.add(", ");
|
|
146
|
+
out.add(name, setDuplicated.has(name)
|
|
147
|
+
? {
|
|
148
|
+
bold: true,
|
|
149
|
+
color: "#f33",
|
|
150
|
+
}
|
|
151
|
+
: undefined);
|
|
152
|
+
});
|
|
153
|
+
out.nl();
|
|
154
|
+
}
|
|
155
|
+
out.error();
|
|
156
|
+
}
|
|
157
|
+
return code;
|
|
158
|
+
}
|
|
159
|
+
resolveUniformBlock(obj) {
|
|
160
|
+
if (obj instanceof TgdUniformBufferObject)
|
|
161
|
+
return obj;
|
|
162
|
+
return new TgdUniformBufferObject(this.context, obj);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function resolveAttributesFromDataset(datasets) {
|
|
166
|
+
const attributes = {};
|
|
167
|
+
const setNames = new Set();
|
|
168
|
+
const setDuplicated = new Set();
|
|
169
|
+
for (const dataset of datasets) {
|
|
170
|
+
for (const name of dataset.attributesNames) {
|
|
171
|
+
if (setNames.has(name))
|
|
172
|
+
setDuplicated.add(name);
|
|
173
|
+
else
|
|
174
|
+
setNames.add(name);
|
|
175
|
+
attributes[name] = dataset.getType(name);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (setDuplicated.size > 0) {
|
|
179
|
+
// There is a duplicate!
|
|
180
|
+
const out = new TgdConsole({
|
|
181
|
+
text: "[TgdPainterProgram] You have duplicated names in your datasets:\n",
|
|
182
|
+
color: "#f33",
|
|
183
|
+
});
|
|
184
|
+
for (const dataset of datasets) {
|
|
185
|
+
out.add(` ${dataset.name}`, { bold: true }).add(": ");
|
|
186
|
+
dataset.attributesNames.forEach((name, index) => {
|
|
187
|
+
if (index > 0)
|
|
188
|
+
out.add(", ");
|
|
189
|
+
out.add(name, setDuplicated.has(name)
|
|
190
|
+
? {
|
|
191
|
+
bold: true,
|
|
192
|
+
color: "#f33",
|
|
193
|
+
}
|
|
194
|
+
: undefined);
|
|
195
|
+
});
|
|
196
|
+
out.nl();
|
|
197
|
+
}
|
|
198
|
+
out.error();
|
|
199
|
+
}
|
|
200
|
+
return attributes;
|
|
201
|
+
}
|
|
202
|
+
function resolveElementsCount(datasets, elements) {
|
|
203
|
+
if (elements)
|
|
204
|
+
return elements.length;
|
|
205
|
+
const counts = datasets.filter((ds) => ds.divisor === 0).map((ds) => ds.count);
|
|
206
|
+
if (counts.length === 0) {
|
|
207
|
+
throw new Error("[TgdPainterProgram] You must give at least one Dataset with divisor 0 in the constructor!\nOr you can specify elementsCount.");
|
|
208
|
+
}
|
|
209
|
+
if (counts.length === 1)
|
|
210
|
+
return counts[0];
|
|
211
|
+
counts.sort();
|
|
212
|
+
const [first] = counts;
|
|
213
|
+
const last = counts[counts.length - 1];
|
|
214
|
+
if (first === last)
|
|
215
|
+
return first;
|
|
216
|
+
throw new Error(`[TgdPainterPogram] I cannot resolve elementsCount because your datasets have different counts!\n${datasets
|
|
217
|
+
.filter((ds) => ds.divisor === 0)
|
|
218
|
+
.map((ds) => ` ${ds.name}: count == ${ds.count}`)}`);
|
|
219
|
+
}
|
|
220
|
+
function resolveInstancesCount(datasets) {
|
|
221
|
+
const counts = datasets.filter((ds) => ds.divisor > 0).map((ds) => ds.count / ds.divisor);
|
|
222
|
+
if (counts.length === 0)
|
|
223
|
+
return 0;
|
|
224
|
+
if (counts.length === 1)
|
|
225
|
+
return counts[0];
|
|
226
|
+
counts.sort();
|
|
227
|
+
const [first] = counts;
|
|
228
|
+
const last = counts[counts.length - 1];
|
|
229
|
+
if (first === last)
|
|
230
|
+
return first;
|
|
231
|
+
throw new Error(`[TgdPainterPogram] I cannot resolve elementsCount because your instance datasets have different counts!\n${datasets
|
|
232
|
+
.filter((ds) => ds.divisor > 0)
|
|
233
|
+
.map((ds) => ` ${ds.name}: count == ${ds.count} / ${ds.divisor} == ${ds.count / ds.divisor}`)}`);
|
|
234
|
+
}
|
|
235
|
+
function texturesToUniforms(textures) {
|
|
236
|
+
const uniforms = {};
|
|
237
|
+
for (const name of Object.keys(textures)) {
|
|
238
|
+
uniforms[name] = resolveTextureType(textures[name]);
|
|
239
|
+
}
|
|
240
|
+
return uniforms;
|
|
241
|
+
}
|
|
242
|
+
function resolveTextureType(texture) {
|
|
243
|
+
if (texture instanceof TgdTexture2D)
|
|
244
|
+
return "sampler2D";
|
|
245
|
+
if (texture instanceof TgdTextureCube)
|
|
246
|
+
return "samplerCube";
|
|
247
|
+
console.error("[resolveTextureType] Don't know the type of this texture:", texture);
|
|
248
|
+
throw new Error("[resolveTextureType] Don't know the type of this texture!");
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYWludGVyL3Byb2dyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBMEUsTUFBTSxjQUFjLENBQUE7QUFDakgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFJSCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGdCQUFnQixHQUNuQixNQUFNLGFBQWEsQ0FBQTtBQUdwQixPQUFPLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFzQyxNQUFNLG9DQUFvQyxDQUFBO0FBQy9HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBK0IsTUFBTSxTQUFTLENBQUE7QUE4RHRFLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxVQUFVO0lBaUI3QyxZQUNxQixPQUFtQixFQUNwQyxFQUNJLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxHQUFHLEVBQUUsRUFDYixRQUFRLEdBQUcsRUFBRSxFQUNiLE9BQU8sRUFDUCxJQUFJLEVBQ0osSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLEtBQUssRUFDTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLGNBQWMsR0FDUztRQUUzQixLQUFLLEVBQUUsQ0FBQTtRQWxCVSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBakJqQyxrQkFBYSxHQUFHLENBQUMsQ0FBQTtRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQTtRQUNs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
|
|
@@ -41,6 +41,6 @@ export declare class TgdPainterScissor extends TgdPainterGroup {
|
|
|
41
41
|
constructor(context: {
|
|
42
42
|
gl: WebGL2RenderingContext;
|
|
43
43
|
}, options: TgdPainterScissorOptions);
|
|
44
|
-
paint(time: number,
|
|
44
|
+
paint(time: number, delta: number): void;
|
|
45
45
|
}
|
|
46
46
|
//# sourceMappingURL=scissor.d.ts.map
|
|
@@ -27,7 +27,7 @@ export class TgdPainterScissor extends TgdPainterGroup {
|
|
|
27
27
|
this.width = options.width;
|
|
28
28
|
this.height = options.height;
|
|
29
29
|
}
|
|
30
|
-
paint(time,
|
|
30
|
+
paint(time, delta) {
|
|
31
31
|
const { gl } = this.context;
|
|
32
32
|
const enabled = gl.getParameter(gl.SCISSOR_TEST);
|
|
33
33
|
const [curX, curY, curW, curH] = gl.getParameter(gl.SCISSOR_BOX);
|
|
@@ -37,7 +37,7 @@ export class TgdPainterScissor extends TgdPainterGroup {
|
|
|
37
37
|
const h = Math.round(this.height * gl.drawingBufferHeight);
|
|
38
38
|
gl.enable(gl.SCISSOR_TEST);
|
|
39
39
|
gl.scissor(x, y, w, h);
|
|
40
|
-
super.paint(time,
|
|
40
|
+
super.paint(time, delta);
|
|
41
41
|
if (enabled) {
|
|
42
42
|
gl.enable(gl.SCISSOR_TEST);
|
|
43
43
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type { TgdCamera } from "../../camera";
|
|
2
|
-
import type { WebglParams } from "../../context/webgl-params";
|
|
3
1
|
import type { TgdDataset } from "../../dataset";
|
|
4
2
|
import { type TgdMaterial } from "../../material";
|
|
5
3
|
import { TgdTransfo } from "../../math";
|
|
6
4
|
import { TgdPainter } from "../painter";
|
|
7
5
|
import { TgdTexture2D } from "../../texture";
|
|
6
|
+
import { TgdContext } from "../../context";
|
|
8
7
|
type DatasetOption = TgdDataset | (() => TgdDataset);
|
|
9
8
|
export type TgdPainterSegmentsMorphingOptions = {
|
|
10
9
|
/**
|
|
@@ -55,11 +54,7 @@ export type TgdPainterSegmentsMorphingOptions = {
|
|
|
55
54
|
* ```
|
|
56
55
|
*/
|
|
57
56
|
export declare class TgdPainterSegmentsMorphing extends TgdPainter {
|
|
58
|
-
protected readonly context:
|
|
59
|
-
gl: WebGL2RenderingContext;
|
|
60
|
-
webglParams: WebglParams;
|
|
61
|
-
camera: TgdCamera;
|
|
62
|
-
};
|
|
57
|
+
protected readonly context: TgdContext;
|
|
63
58
|
readonly transfo: TgdTransfo;
|
|
64
59
|
colorTexture: TgdTexture2D;
|
|
65
60
|
minRadius: number;
|
|
@@ -76,13 +71,9 @@ export declare class TgdPainterSegmentsMorphing extends TgdPainter {
|
|
|
76
71
|
private readonly prg;
|
|
77
72
|
private readonly vertexCount;
|
|
78
73
|
private readonly material;
|
|
79
|
-
constructor(context:
|
|
80
|
-
gl: WebGL2RenderingContext;
|
|
81
|
-
webglParams: WebglParams;
|
|
82
|
-
camera: TgdCamera;
|
|
83
|
-
}, options: TgdPainterSegmentsMorphingOptions);
|
|
74
|
+
constructor(context: TgdContext, options: TgdPainterSegmentsMorphingOptions);
|
|
84
75
|
delete(): void;
|
|
85
|
-
paint(time: number,
|
|
76
|
+
paint(time: number, delta: number): void;
|
|
86
77
|
private get vao();
|
|
87
78
|
}
|
|
88
79
|
export {};
|