@edv4h/usketch-gpu3d-renderer 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +62 -2
- package/dist/gpu3d-ground.d.ts +42 -0
- package/dist/gpu3d-ground.d.ts.map +1 -0
- package/dist/gpu3d-ground.js +187 -0
- package/dist/gpu3d-ground.js.map +1 -0
- package/dist/gpu3d-renderer.d.ts +36 -0
- package/dist/gpu3d-renderer.d.ts.map +1 -0
- package/dist/gpu3d-renderer.js +363 -0
- package/dist/gpu3d-renderer.js.map +1 -0
- package/dist/gpu3d-shapes.d.ts +40 -0
- package/dist/gpu3d-shapes.d.ts.map +1 -0
- package/dist/gpu3d-shapes.js +272 -0
- package/dist/gpu3d-shapes.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/shape-raster.d.ts +27 -0
- package/dist/shape-raster.d.ts.map +1 -0
- package/dist/shape-raster.js +140 -0
- package/dist/shape-raster.js.map +1 -0
- package/package.json +49 -3
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// The GPU 3D renderer (experimental): draws the board's 3D view (the core `View3dState`)
|
|
3
|
+
// on one WebGL2 canvas with a depth buffer, instead of tilting the DOM layers like the
|
|
4
|
+
// CSS 3D renderer. Plugins with their own GPU drawing (the elevation's terrain) draw
|
|
5
|
+
// into the same canvas through the board's GL hook (`view3dGl` in shared), so the
|
|
6
|
+
// terrain and what stands on it hide each other by depth.
|
|
7
|
+
//
|
|
8
|
+
// While it draws, the layers that show in 3D (`tilt` / `depth`) are hidden: what they
|
|
9
|
+
// show is drawn on the canvas. The shapes are pictures of their (hidden) DOM drawing laid
|
|
10
|
+
// on the ground (see `gpu3d-shapes`). Screen layers (the sky, fog, HUD) stay DOM. It draws
|
|
11
|
+
// nothing while the board is flat (the 2D renderers draw it then).
|
|
12
|
+
import { boardHeight, defineService, view3dCellOf, view3dGl, view3dRendererService, viewMatrix, } from "@edv4h/usketch-shared";
|
|
13
|
+
import { useEffect, useRef } from "react";
|
|
14
|
+
import { GroundPainter } from "./gpu3d-ground.js";
|
|
15
|
+
import { ShapePainter } from "./gpu3d-shapes.js";
|
|
16
|
+
/** The canvas layer's id. */
|
|
17
|
+
export const GPU3D_LAYER_ID = "gpu3d:view";
|
|
18
|
+
/** Attribute on the main canvas container while the GPU renderer draws. */
|
|
19
|
+
export const GPU_STAGE_ATTR = "data-view3d-gpu";
|
|
20
|
+
/** Just above the sky (Mode 7's, order 1), under every other layer. */
|
|
21
|
+
const LAYER_ORDER = 2;
|
|
22
|
+
/** The DOM renderer's shape layer (its nodes are what the shape pictures are made of). */
|
|
23
|
+
const DOM_SHAPES_LAYER_ID = "dom-shapes";
|
|
24
|
+
/** The GPU 3D renderer on `ctx.services` (one per board). */
|
|
25
|
+
export const gpu3dRendererService = defineService("usketch-gpu3d-renderer");
|
|
26
|
+
/** The camera a 3D view state draws with, as the projection functions take it. Pure. */
|
|
27
|
+
export function drawnCamera(state, zoom) {
|
|
28
|
+
const a = Math.min(1, Math.max(0, state.amount));
|
|
29
|
+
const { pitch, fov, horizon, height } = state.camera;
|
|
30
|
+
const z = Number.isFinite(zoom) && zoom > 0 ? zoom : 1;
|
|
31
|
+
return { pitch: pitch * a, yaw: 0, fov, horizon, heightPx: height * z * a };
|
|
32
|
+
}
|
|
33
|
+
/** The CSS that hides the layers the canvas draws instead. Pure. */
|
|
34
|
+
export function hiddenLayerRules(ids) {
|
|
35
|
+
const stage = `[${GPU_STAGE_ATTR}="on"]`;
|
|
36
|
+
const rules = ids.map((id) => `${stage}>[data-layer-id="${id.replace(/["\\]/g, "")}"]{visibility:hidden !important;}`);
|
|
37
|
+
rules.push(`${stage} [data-view3d="hidden"]{display:none !important;}`);
|
|
38
|
+
return rules.join("");
|
|
39
|
+
}
|
|
40
|
+
function declared(ctx, kinds) {
|
|
41
|
+
return ctx.layers
|
|
42
|
+
.getLayers()
|
|
43
|
+
.filter((l) => l.view3d !== undefined && kinds.includes(l.view3d))
|
|
44
|
+
.map((l) => l.id);
|
|
45
|
+
}
|
|
46
|
+
/** The bg-grid plugin's line: #e0e0e0 at half opacity (premultiplied). */
|
|
47
|
+
const GRID_LINE = [
|
|
48
|
+
(0xe0 / 255) * 0.5,
|
|
49
|
+
(0xe0 / 255) * 0.5,
|
|
50
|
+
(0xe0 / 255) * 0.5,
|
|
51
|
+
0.5,
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* The ground's own colour: none, as the CSS 3D renderer's tilted grid (the board's
|
|
55
|
+
* background and the 3D view's sky show through between the lines, which hazes the far
|
|
56
|
+
* ground the same way).
|
|
57
|
+
*/
|
|
58
|
+
const GROUND_BACKGROUND = [0, 0, 0, 0];
|
|
59
|
+
/** The GL side: one canvas, its context and what draws in it. */
|
|
60
|
+
class Painter {
|
|
61
|
+
gl;
|
|
62
|
+
ground;
|
|
63
|
+
shapes;
|
|
64
|
+
static create(canvas, onReady, shapes) {
|
|
65
|
+
const gl = canvas.getContext("webgl2", {
|
|
66
|
+
antialias: true,
|
|
67
|
+
premultipliedAlpha: true,
|
|
68
|
+
alpha: true,
|
|
69
|
+
});
|
|
70
|
+
if (!gl)
|
|
71
|
+
return null;
|
|
72
|
+
try {
|
|
73
|
+
return new Painter(gl, onReady, shapes);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error("[gpu3d-renderer] WebGL2 setup failed", err);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
constructor(gl, onReady, shapes) {
|
|
81
|
+
this.gl = gl;
|
|
82
|
+
this.ground = new GroundPainter(gl);
|
|
83
|
+
this.shapes = shapes ? new ShapePainter(gl, onReady) : null;
|
|
84
|
+
}
|
|
85
|
+
/** Draw a frame; `true` when a drawable wants another. */
|
|
86
|
+
draw(frame, look, hook, size, shapes) {
|
|
87
|
+
const { gl } = this;
|
|
88
|
+
const canvas = gl.canvas;
|
|
89
|
+
const pw = Math.max(1, Math.round(size.width * frame.pixelRatio));
|
|
90
|
+
const ph = Math.max(1, Math.round(size.height * frame.pixelRatio));
|
|
91
|
+
if (canvas.width !== pw || canvas.height !== ph) {
|
|
92
|
+
canvas.width = pw;
|
|
93
|
+
canvas.height = ph;
|
|
94
|
+
}
|
|
95
|
+
gl.viewport(0, 0, pw, ph);
|
|
96
|
+
gl.clearColor(0, 0, 0, 0);
|
|
97
|
+
gl.clearDepth(1);
|
|
98
|
+
gl.depthMask(true);
|
|
99
|
+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
|
|
100
|
+
gl.enable(gl.DEPTH_TEST);
|
|
101
|
+
gl.depthFunc(gl.LEQUAL);
|
|
102
|
+
gl.enable(gl.BLEND);
|
|
103
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
104
|
+
const full = { ...frame, gl };
|
|
105
|
+
this.ground.draw(full, look);
|
|
106
|
+
let again = false;
|
|
107
|
+
for (const d of hook.drawables()) {
|
|
108
|
+
try {
|
|
109
|
+
if (d.draw(full))
|
|
110
|
+
again = true;
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
console.error(`[gpu3d-renderer] drawable ${d.id} failed`, err);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (this.shapes && shapes && this.shapes.draw(full, shapes))
|
|
117
|
+
again = true;
|
|
118
|
+
return again;
|
|
119
|
+
}
|
|
120
|
+
clear() {
|
|
121
|
+
const { gl } = this;
|
|
122
|
+
gl.clearColor(0, 0, 0, 0);
|
|
123
|
+
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
|
|
124
|
+
}
|
|
125
|
+
release(hook) {
|
|
126
|
+
for (const d of hook.drawables()) {
|
|
127
|
+
try {
|
|
128
|
+
d.release?.(this.gl);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// A drawable failing to free its objects can't stop the others.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
this.ground.release();
|
|
135
|
+
this.shapes?.release();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Set the renderer up on `ctx` (the plugin does it). Returns its API and teardown, or
|
|
140
|
+
* `null` when the board has no 3D view state.
|
|
141
|
+
*/
|
|
142
|
+
export function setupGpu3dRenderer(ctx, options = {}) {
|
|
143
|
+
const cell = options.view3d ?? view3dCellOf(ctx.store);
|
|
144
|
+
if (!cell)
|
|
145
|
+
return null;
|
|
146
|
+
const hook = view3dGl(ctx.services);
|
|
147
|
+
let tiltOverride = options.tiltLayerIds ?? null;
|
|
148
|
+
let depthOverride = options.depthLayerIds ?? null;
|
|
149
|
+
const tiltLayers = () => tiltOverride ?? declared(ctx, ["tilt", "depth"]);
|
|
150
|
+
const depthLayers = () => depthOverride ?? declared(ctx, ["depth"]);
|
|
151
|
+
let canvas = null;
|
|
152
|
+
let painter = null;
|
|
153
|
+
let raf = 0;
|
|
154
|
+
let styleEl = null;
|
|
155
|
+
let stage = null;
|
|
156
|
+
const drawing = () => cell.get().amount > 0 && painter !== null;
|
|
157
|
+
const height = ctx.height ?? boardHeight(ctx.services);
|
|
158
|
+
let rc = null;
|
|
159
|
+
const shapeSource = () => {
|
|
160
|
+
if (!rc || !stage)
|
|
161
|
+
return null;
|
|
162
|
+
const layer = stage.querySelector(`:scope > [data-layer-id="${DOM_SHAPES_LAYER_ID}"]`);
|
|
163
|
+
const nodes = new Map();
|
|
164
|
+
if (layer) {
|
|
165
|
+
for (const el of layer.querySelectorAll("[data-shape-id]")) {
|
|
166
|
+
const id = el.getAttribute("data-shape-id");
|
|
167
|
+
if (id && !nodes.has(id))
|
|
168
|
+
nodes.set(id, el);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
shapes: rc.shapesSorted,
|
|
173
|
+
registry: ctx.shapes,
|
|
174
|
+
node: (id) => nodes.get(id) ?? null,
|
|
175
|
+
groundAt: (x, y) => height.groundAt(x, y),
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
const showLayers = (on) => {
|
|
179
|
+
// The canvas sits in its layer's node, whose parent holds every layer.
|
|
180
|
+
const container = canvas?.closest("[data-layer-id]")?.parentElement ?? null;
|
|
181
|
+
if (stage && stage !== container)
|
|
182
|
+
stage.removeAttribute(GPU_STAGE_ATTR);
|
|
183
|
+
stage = container;
|
|
184
|
+
if (!on) {
|
|
185
|
+
stage?.removeAttribute(GPU_STAGE_ATTR);
|
|
186
|
+
if (styleEl)
|
|
187
|
+
styleEl.textContent = "";
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (typeof document === "undefined" || !stage)
|
|
191
|
+
return;
|
|
192
|
+
if (!styleEl) {
|
|
193
|
+
styleEl = document.createElement("style");
|
|
194
|
+
styleEl.setAttribute("data-gpu3d-renderer", "");
|
|
195
|
+
document.head.appendChild(styleEl);
|
|
196
|
+
}
|
|
197
|
+
const ids = [
|
|
198
|
+
...new Set([
|
|
199
|
+
...tiltLayers(),
|
|
200
|
+
...depthLayers(),
|
|
201
|
+
...declared(ctx, ["ground"]),
|
|
202
|
+
// The canvas draws itself: never hide it.
|
|
203
|
+
]),
|
|
204
|
+
].filter((id) => id !== GPU3D_LAYER_ID);
|
|
205
|
+
const css = hiddenLayerRules(ids);
|
|
206
|
+
if (styleEl.textContent !== css)
|
|
207
|
+
styleEl.textContent = css;
|
|
208
|
+
stage.setAttribute(GPU_STAGE_ATTR, "on");
|
|
209
|
+
};
|
|
210
|
+
const look = () => {
|
|
211
|
+
return {
|
|
212
|
+
background: GROUND_BACKGROUND,
|
|
213
|
+
line: GRID_LINE,
|
|
214
|
+
grid: tiltLayers().includes("bg-grid"),
|
|
215
|
+
// 1 px of the flat grid (it is drawn in screen px, then tilted).
|
|
216
|
+
lineWidth: 1 / (ctx.store.getViewport().zoom || 1),
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
const frame = () => {
|
|
220
|
+
raf = 0;
|
|
221
|
+
if (!painter || !canvas)
|
|
222
|
+
return;
|
|
223
|
+
const state = cell.get();
|
|
224
|
+
if (!(state.amount > 0)) {
|
|
225
|
+
painter.clear();
|
|
226
|
+
showLayers(false);
|
|
227
|
+
hook.setDrawing(false);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
showLayers(true);
|
|
231
|
+
const size = { width: canvas.clientWidth, height: canvas.clientHeight };
|
|
232
|
+
if (!(size.width > 0 && size.height > 0))
|
|
233
|
+
return;
|
|
234
|
+
const viewport = ctx.store.getViewport();
|
|
235
|
+
const view = { viewport, camera: drawnCamera(state, viewport.zoom), stage: size };
|
|
236
|
+
const pixelRatio = typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1;
|
|
237
|
+
const again = painter.draw({
|
|
238
|
+
view,
|
|
239
|
+
matrix: viewMatrix(view),
|
|
240
|
+
pixelRatio,
|
|
241
|
+
amount: Math.min(1, state.amount),
|
|
242
|
+
drawDistance: state.drawDistance,
|
|
243
|
+
}, look(), hook, size, options.shapes === false ? null : shapeSource());
|
|
244
|
+
hook.setDrawing(true);
|
|
245
|
+
if (again)
|
|
246
|
+
schedule();
|
|
247
|
+
};
|
|
248
|
+
const schedule = () => {
|
|
249
|
+
if (raf || !painter)
|
|
250
|
+
return;
|
|
251
|
+
raf = typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame(frame) : 0;
|
|
252
|
+
};
|
|
253
|
+
const attach = (el) => {
|
|
254
|
+
if (el === canvas)
|
|
255
|
+
return;
|
|
256
|
+
if (painter) {
|
|
257
|
+
painter.release(hook);
|
|
258
|
+
painter = null;
|
|
259
|
+
}
|
|
260
|
+
if (raf && typeof cancelAnimationFrame !== "undefined")
|
|
261
|
+
cancelAnimationFrame(raf);
|
|
262
|
+
raf = 0;
|
|
263
|
+
showLayers(false);
|
|
264
|
+
hook.setDrawing(false);
|
|
265
|
+
canvas = el;
|
|
266
|
+
if (el) {
|
|
267
|
+
painter = Painter.create(el, schedule, options.shapes !== false);
|
|
268
|
+
schedule();
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
const offs = [
|
|
272
|
+
cell.subscribe(schedule),
|
|
273
|
+
ctx.store.onMutation((e) => {
|
|
274
|
+
if (e.type === "viewport:changed")
|
|
275
|
+
schedule();
|
|
276
|
+
}),
|
|
277
|
+
hook.onFrameRequest(schedule),
|
|
278
|
+
hook.subscribe(schedule),
|
|
279
|
+
height.subscribe(schedule),
|
|
280
|
+
ctx.events.on("layers:changed", schedule),
|
|
281
|
+
];
|
|
282
|
+
if (typeof window !== "undefined")
|
|
283
|
+
window.addEventListener("resize", schedule);
|
|
284
|
+
const layer = {
|
|
285
|
+
id: GPU3D_LAYER_ID,
|
|
286
|
+
order: LAYER_ORDER,
|
|
287
|
+
avoidCollision: true,
|
|
288
|
+
fixed: true,
|
|
289
|
+
render: (layerCtx) => {
|
|
290
|
+
// The shapes drawn next frame (the layer re-renders as the board changes).
|
|
291
|
+
rc = layerCtx;
|
|
292
|
+
schedule();
|
|
293
|
+
return _jsx(Gpu3dCanvas, { attach: attach });
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
ctx.layers.register(layer);
|
|
297
|
+
const api = {
|
|
298
|
+
isDrawing: drawing,
|
|
299
|
+
setTiltLayers(ids) {
|
|
300
|
+
tiltOverride = ids ? [...ids] : null;
|
|
301
|
+
schedule();
|
|
302
|
+
},
|
|
303
|
+
setDepthLayers(ids) {
|
|
304
|
+
depthOverride = ids ? [...ids] : null;
|
|
305
|
+
schedule();
|
|
306
|
+
},
|
|
307
|
+
getTiltLayers: () => tiltLayers(),
|
|
308
|
+
getDepthLayers: () => depthLayers(),
|
|
309
|
+
};
|
|
310
|
+
return {
|
|
311
|
+
api,
|
|
312
|
+
dispose: () => {
|
|
313
|
+
if (ctx.layers.getLayers().some((l) => l === layer))
|
|
314
|
+
ctx.layers.unregister(GPU3D_LAYER_ID);
|
|
315
|
+
attach(null);
|
|
316
|
+
for (const off of offs)
|
|
317
|
+
off();
|
|
318
|
+
if (typeof window !== "undefined")
|
|
319
|
+
window.removeEventListener("resize", schedule);
|
|
320
|
+
styleEl?.remove();
|
|
321
|
+
styleEl = null;
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function Gpu3dCanvas({ attach }) {
|
|
326
|
+
const ref = useRef(null);
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
attach(ref.current);
|
|
329
|
+
return () => attach(null);
|
|
330
|
+
}, [attach]);
|
|
331
|
+
return (_jsx("canvas", { ref: ref, "data-gpu3d-canvas": "", style: {
|
|
332
|
+
position: "absolute",
|
|
333
|
+
inset: 0,
|
|
334
|
+
width: "100%",
|
|
335
|
+
height: "100%",
|
|
336
|
+
pointerEvents: "none",
|
|
337
|
+
} }));
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* The GPU 3D renderer plugin (experimental). Add it INSTEAD of the CSS 3D renderer, before
|
|
341
|
+
* the 3D view (Mode 7). If a 3D renderer is already on the board, this one does nothing.
|
|
342
|
+
*/
|
|
343
|
+
export function createGpu3dRendererPlugin(options = {}) {
|
|
344
|
+
return {
|
|
345
|
+
id: "usketch-gpu3d-renderer",
|
|
346
|
+
name: "GPU 3D renderer (experimental)",
|
|
347
|
+
setup(ctx) {
|
|
348
|
+
if (view3dRendererService.get(ctx.services))
|
|
349
|
+
return;
|
|
350
|
+
const renderer = setupGpu3dRenderer(ctx, options);
|
|
351
|
+
if (!renderer)
|
|
352
|
+
return;
|
|
353
|
+
const unprovide = gpu3dRendererService.provide(ctx.services, renderer.api);
|
|
354
|
+
const unprovideGeneric = view3dRendererService.provide(ctx.services, renderer.api);
|
|
355
|
+
return () => {
|
|
356
|
+
unprovideGeneric();
|
|
357
|
+
unprovide();
|
|
358
|
+
renderer.dispose();
|
|
359
|
+
};
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=gpu3d-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu3d-renderer.js","sourceRoot":"","sources":["../src/gpu3d-renderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type BoundingBox, type ShapeData, type ShapeRegistry, type View3dGlFrame } from "@edv4h/usketch-shared";
|
|
2
|
+
/** What the shapes are drawn from in a frame (the latest layer render context). */
|
|
3
|
+
export interface ShapeSource {
|
|
4
|
+
shapes: readonly ShapeData[];
|
|
5
|
+
registry: ShapeRegistry;
|
|
6
|
+
/** The DOM node a shape is drawn in (hidden while the GPU draws), or `null`. */
|
|
7
|
+
node(id: string): Element | null;
|
|
8
|
+
/** The ground's height under a world point. */
|
|
9
|
+
groundAt(x: number, y: number): number;
|
|
10
|
+
}
|
|
11
|
+
/** How high a flat shape lies: the ground under its centre (as the CSS 3D renderer). Pure. */
|
|
12
|
+
export declare function flatShapeHeight(box: BoundingBox, groundAt: (x: number, y: number) => number): number;
|
|
13
|
+
export declare class ShapePainter {
|
|
14
|
+
private readonly gl;
|
|
15
|
+
/** Asked for another frame when a picture is ready. */
|
|
16
|
+
private readonly onReady;
|
|
17
|
+
private readonly program;
|
|
18
|
+
private readonly vao;
|
|
19
|
+
private readonly buffer;
|
|
20
|
+
private readonly u;
|
|
21
|
+
private readonly pictures;
|
|
22
|
+
private frameNo;
|
|
23
|
+
/** Anisotropic filtering (sharp pictures seen at a grazing angle), when there is. */
|
|
24
|
+
private readonly aniso;
|
|
25
|
+
private pending;
|
|
26
|
+
private released;
|
|
27
|
+
constructor(gl: WebGL2RenderingContext,
|
|
28
|
+
/** Asked for another frame when a picture is ready. */
|
|
29
|
+
onReady: () => void);
|
|
30
|
+
/** Draw the shapes; `true` when pictures are still to be made (draw again). */
|
|
31
|
+
draw(frame: View3dGlFrame, source: ShapeSource): boolean;
|
|
32
|
+
private makePictures;
|
|
33
|
+
private finish;
|
|
34
|
+
private upload;
|
|
35
|
+
private forgetOld;
|
|
36
|
+
/** Pictures held now (tests, stats). */
|
|
37
|
+
pictureCount(): number;
|
|
38
|
+
release(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=gpu3d-shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu3d-shapes.d.ts","sourceRoot":"","sources":["../src/gpu3d-shapes.ts"],"names":[],"mappings":"AAMA,OAAO,EACN,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,aAAa,EAGlB,KAAK,aAAa,EAElB,MAAM,uBAAuB,CAAC;AAU/B,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,gFAAgF;IAChF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAUD,8FAA8F;AAC9F,wBAAgB,eAAe,CAC9B,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,GACxC,MAAM,CAGR;AA8CD,qBAAa,YAAY;IAavB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAmD;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,OAAO,CAAK;IACpB,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAS;IAEzB,YACkB,EAAE,EAAE,sBAAsB;IAC3C,uDAAuD;IACtC,OAAO,EAAE,MAAM,IAAI,EAwBpC;IAED,+EAA+E;IAC/E,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CA+DvD;IAED,OAAO,CAAC,YAAY;IA2CpB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,SAAS;IASjB,wCAAwC;IACxC,YAAY,IAAI,MAAM,CAErB;IAED,OAAO,IAAI,IAAI,CAQd;CACD"}
|