bplinejs 0.0.101-beta.10

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 (129) hide show
  1. package/README.md +215 -0
  2. package/docs/API.md +471 -0
  3. package/lib/Camera/index.d.ts +88 -0
  4. package/lib/Camera/index.js +178 -0
  5. package/lib/Camera/index.js.map +1 -0
  6. package/lib/Color/index.d.ts +99 -0
  7. package/lib/Color/index.js +178 -0
  8. package/lib/Color/index.js.map +1 -0
  9. package/lib/Geometry/Geo.d.ts +131 -0
  10. package/lib/Geometry/Geo.js +180 -0
  11. package/lib/Geometry/Geo.js.map +1 -0
  12. package/lib/Geometry/Poly2D.d.ts +53 -0
  13. package/lib/Geometry/Poly2D.js +133 -0
  14. package/lib/Geometry/Poly2D.js.map +1 -0
  15. package/lib/Geometry/Rect2d.d.ts +89 -0
  16. package/lib/Geometry/Rect2d.js +128 -0
  17. package/lib/Geometry/Rect2d.js.map +1 -0
  18. package/lib/Geometry/index.d.ts +6 -0
  19. package/lib/Geometry/index.js +4 -0
  20. package/lib/Group/index.d.ts +70 -0
  21. package/lib/Group/index.js +110 -0
  22. package/lib/Group/index.js.map +1 -0
  23. package/lib/ID.d.ts +6 -0
  24. package/lib/ID.js +15 -0
  25. package/lib/ID.js.map +1 -0
  26. package/lib/IMesh/index.d.ts +104 -0
  27. package/lib/IMesh/index.js +333 -0
  28. package/lib/IMesh/index.js.map +1 -0
  29. package/lib/Material/Material.d.ts +158 -0
  30. package/lib/Material/Material.js +229 -0
  31. package/lib/Material/Material.js.map +1 -0
  32. package/lib/Material/baseMaterial.d.ts +15 -0
  33. package/lib/Material/baseMaterial.js +24 -0
  34. package/lib/Material/baseMaterial.js.map +1 -0
  35. package/lib/Material/index.d.ts +4 -0
  36. package/lib/Material/index.js +3 -0
  37. package/lib/Material/shaders/base/poly/fragment.js +6 -0
  38. package/lib/Material/shaders/base/poly/fragment.js.map +1 -0
  39. package/lib/Material/shaders/base/poly/vertex.js +6 -0
  40. package/lib/Material/shaders/base/poly/vertex.js.map +1 -0
  41. package/lib/Material/shaders/base/rect/fragment.js +6 -0
  42. package/lib/Material/shaders/base/rect/fragment.js.map +1 -0
  43. package/lib/Material/shaders/base/rect/vertex.js +6 -0
  44. package/lib/Material/shaders/base/rect/vertex.js.map +1 -0
  45. package/lib/Material/shaders/line/fragment.js +6 -0
  46. package/lib/Material/shaders/line/fragment.js.map +1 -0
  47. package/lib/Material/shaders/line/vertex.js +6 -0
  48. package/lib/Material/shaders/line/vertex.js.map +1 -0
  49. package/lib/Mesh/index.d.ts +154 -0
  50. package/lib/Mesh/index.js +254 -0
  51. package/lib/Mesh/index.js.map +1 -0
  52. package/lib/Object/index.d.ts +95 -0
  53. package/lib/Object/index.js +212 -0
  54. package/lib/Object/index.js.map +1 -0
  55. package/lib/Raws/index.d.ts +87 -0
  56. package/lib/Raws/index.js +164 -0
  57. package/lib/Raws/index.js.map +1 -0
  58. package/lib/Render/BufferManager.d.ts +93 -0
  59. package/lib/Render/BufferManager.js +281 -0
  60. package/lib/Render/BufferManager.js.map +1 -0
  61. package/lib/Render/DepthManager.d.ts +22 -0
  62. package/lib/Render/DepthManager.js +95 -0
  63. package/lib/Render/DepthManager.js.map +1 -0
  64. package/lib/Render/DestroyManager.d.ts +74 -0
  65. package/lib/Render/DestroyManager.js +221 -0
  66. package/lib/Render/DestroyManager.js.map +1 -0
  67. package/lib/Render/DevelopmentValidator.d.ts +73 -0
  68. package/lib/Render/DevelopmentValidator.js +188 -0
  69. package/lib/Render/DevelopmentValidator.js.map +1 -0
  70. package/lib/Render/DrawCallManager.d.ts +58 -0
  71. package/lib/Render/DrawCallManager.js +267 -0
  72. package/lib/Render/DrawCallManager.js.map +1 -0
  73. package/lib/Render/PipelineManager.d.ts +46 -0
  74. package/lib/Render/PipelineManager.js +254 -0
  75. package/lib/Render/PipelineManager.js.map +1 -0
  76. package/lib/Render/SamplerManager.d.ts +26 -0
  77. package/lib/Render/SamplerManager.js +42 -0
  78. package/lib/Render/SamplerManager.js.map +1 -0
  79. package/lib/Render/SceneUpdate.d.ts +9 -0
  80. package/lib/Render/SceneUpdate.js +18 -0
  81. package/lib/Render/SceneUpdate.js.map +1 -0
  82. package/lib/Render/TextureManager.d.ts +33 -0
  83. package/lib/Render/TextureManager.js +152 -0
  84. package/lib/Render/TextureManager.js.map +1 -0
  85. package/lib/Render/index.d.ts +212 -0
  86. package/lib/Render/index.js +347 -0
  87. package/lib/Render/index.js.map +1 -0
  88. package/lib/Render/types.d.ts +191 -0
  89. package/lib/Scene/index.d.ts +124 -0
  90. package/lib/Scene/index.js +225 -0
  91. package/lib/Scene/index.js.map +1 -0
  92. package/lib/Style/EdgeStyle.d.ts +28 -0
  93. package/lib/Style/EdgeStyle.js +67 -0
  94. package/lib/Style/EdgeStyle.js.map +1 -0
  95. package/lib/Style/JoinStyle.d.ts +27 -0
  96. package/lib/Style/JoinStyle.js +53 -0
  97. package/lib/Style/JoinStyle.js.map +1 -0
  98. package/lib/Style/PartStyle.d.ts +50 -0
  99. package/lib/Style/PartStyle.js +92 -0
  100. package/lib/Style/PartStyle.js.map +1 -0
  101. package/lib/Style/PointsStyle.d.ts +43 -0
  102. package/lib/Style/PointsStyle.js +98 -0
  103. package/lib/Style/PointsStyle.js.map +1 -0
  104. package/lib/Style/SolidStyle.d.ts +37 -0
  105. package/lib/Style/SolidStyle.js +83 -0
  106. package/lib/Style/SolidStyle.js.map +1 -0
  107. package/lib/Style/TexturedStyle.d.ts +29 -0
  108. package/lib/Style/TexturedStyle.js +66 -0
  109. package/lib/Style/TexturedStyle.js.map +1 -0
  110. package/lib/Style/WireframeStyle.d.ts +7 -0
  111. package/lib/Style/WireframeStyle.js +13 -0
  112. package/lib/Style/WireframeStyle.js.map +1 -0
  113. package/lib/Style/WriteStyleData.d.ts +10 -0
  114. package/lib/Style/WriteStyleData.js +59 -0
  115. package/lib/Style/WriteStyleData.js.map +1 -0
  116. package/lib/Style/index.d.ts +50 -0
  117. package/lib/Style/index.js +92 -0
  118. package/lib/Style/index.js.map +1 -0
  119. package/lib/Style/types.d.ts +21 -0
  120. package/lib/Texture/Layers.d.ts +26 -0
  121. package/lib/Texture/Layers.js +42 -0
  122. package/lib/Texture/Layers.js.map +1 -0
  123. package/lib/Texture/index.d.ts +116 -0
  124. package/lib/Texture/index.js +198 -0
  125. package/lib/Texture/index.js.map +1 -0
  126. package/lib/global-types.d.ts +8 -0
  127. package/lib/index.d.ts +43 -0
  128. package/lib/index.js +34 -0
  129. package/package.json +130 -0
@@ -0,0 +1,347 @@
1
+ import { GETID } from "../ID.js";
2
+ import DepthManager from "./DepthManager.js";
3
+ import DevelopmentValidator from "./DevelopmentValidator.js";
4
+ import BufferManager from "./BufferManager.js";
5
+ import DestroyManager from "./DestroyManager.js";
6
+ import SamplerManager from "./SamplerManager.js";
7
+ import DrawCallManager from "./DrawCallManager.js";
8
+ import TextureManager from "./TextureManager.js";
9
+ import PipelineManager from "./PipelineManager.js";
10
+ import { InitCamera, InitScene, MatrixUpdate } from "./SceneUpdate.js";
11
+ import { GetInner } from "bpmatrixjs/Utils";
12
+ //#region src/scripts/Render/index.ts
13
+ /**
14
+ * WebGPU 2D 渲染器。
15
+ * 负责生命周期和渲染流程调度,具体 GPU 资源由各管理器维护。
16
+ * @class
17
+ * @implements RenderLike
18
+ */
19
+ var Render = class {
20
+ /**
21
+ * 当前 Render 的全局唯一 ID。
22
+ */
23
+ id;
24
+ /**
25
+ * 对象类型。
26
+ */
27
+ type = "Render";
28
+ /**
29
+ * 画布容器。
30
+ */
31
+ container;
32
+ /**
33
+ * 渲染画布。
34
+ */
35
+ canvas;
36
+ /**
37
+ * 每帧开始前用于清空画布的 RGBA 颜色。
38
+ */
39
+ backgroundColor = {
40
+ r: 0,
41
+ g: 0,
42
+ b: 0,
43
+ a: 0
44
+ };
45
+ /**
46
+ * 当前 Render 的共享 WebGPU 资源。
47
+ */
48
+ pipeline;
49
+ /**
50
+ * WebGPU 初始化完成状态。
51
+ */
52
+ ready;
53
+ _alphaMode;
54
+ _resizeTimer;
55
+ _destroyed;
56
+ _dpr;
57
+ _renderMode;
58
+ bufferManager;
59
+ destroyManager;
60
+ drawCallManager;
61
+ pipelineManager;
62
+ textureManager;
63
+ /**
64
+ * 创建渲染器并开始异步初始化 WebGPU。
65
+ * @param div 容器节点或容器 ID
66
+ * @param renderMode Render 运行模式
67
+ */
68
+ constructor(div, renderMode = "development") {
69
+ this.id = GETID();
70
+ if (typeof div === "string") {
71
+ const container = document.getElementById(div);
72
+ if (container === null) throw new Error(`Render container "${div}" was not found.`);
73
+ this.container = container;
74
+ } else this.container = div;
75
+ this.canvas = document.createElement("canvas");
76
+ this.canvas.style.display = "block";
77
+ this.canvas.style.width = "100%";
78
+ this.canvas.style.height = "100%";
79
+ this.container.appendChild(this.canvas);
80
+ this._alphaMode = "premultiplied";
81
+ this._resizeTimer = null;
82
+ this._destroyed = false;
83
+ this._dpr = GetInner().dpr;
84
+ this._renderMode = renderMode;
85
+ this.pipeline = {
86
+ pipelineTemplates: /* @__PURE__ */ new Map(),
87
+ textures: /* @__PURE__ */ new Map(),
88
+ samplers: /* @__PURE__ */ new Map(),
89
+ sceneResources: /* @__PURE__ */ new Map(),
90
+ buffers: {
91
+ meshMatrix: /* @__PURE__ */ new Map(),
92
+ meshDepth: /* @__PURE__ */ new Map(),
93
+ geometry: /* @__PURE__ */ new Map(),
94
+ meshStyle: /* @__PURE__ */ new Map(),
95
+ cameraUniform: []
96
+ }
97
+ };
98
+ this.destroyManager = new DestroyManager(this.pipeline);
99
+ this.textureManager = new TextureManager(this.pipeline);
100
+ const samplerManager = new SamplerManager(this.pipeline);
101
+ this.pipelineManager = new PipelineManager(this.pipeline, this.textureManager, samplerManager);
102
+ this.bufferManager = new BufferManager(this.pipeline);
103
+ this.drawCallManager = new DrawCallManager(this.pipeline, samplerManager);
104
+ this.ready = this.initWebGPU();
105
+ }
106
+ /**
107
+ * 创建当前画布对应的 WebGPU 设备与呈现上下文。
108
+ * @returns WebGPU 初始化完成状态
109
+ */
110
+ async initWebGPU() {
111
+ const webGPU = navigator.gpu;
112
+ if (webGPU === void 0) throw new Error("WebGPU is not supported by this browser.");
113
+ const adapter = await webGPU.requestAdapter();
114
+ if (adapter === null) throw new Error("No compatible WebGPU adapter was found.");
115
+ if (this.isDestroyed()) return;
116
+ const device = await adapter.requestDevice();
117
+ if (this.isDestroyed()) {
118
+ device.destroy();
119
+ return;
120
+ }
121
+ const context = this.canvas.getContext("webgpu");
122
+ if (context === null) throw new Error("WebGPU canvas context could not be created.");
123
+ const format = webGPU.getPreferredCanvasFormat();
124
+ context.configure({
125
+ device,
126
+ format,
127
+ alphaMode: this._alphaMode
128
+ });
129
+ this.pipeline.adapter = adapter;
130
+ this.pipeline.device = device;
131
+ this.pipeline.context = context;
132
+ this.pipeline.format = format;
133
+ this.pipelineManager.initResources(device);
134
+ }
135
+ /**
136
+ * 设置 Canvas 与下层 HTML 内容的 Alpha 合成方式。
137
+ * @param alphaMode Alpha 合成方式
138
+ */
139
+ set alphaMode(alphaMode) {
140
+ if (this._alphaMode === alphaMode) return;
141
+ this._alphaMode = alphaMode;
142
+ const device = this.pipeline.device;
143
+ const context = this.pipeline.context;
144
+ const format = this.pipeline.format;
145
+ if (device !== void 0 && context !== void 0 && format !== void 0) context.configure({
146
+ device,
147
+ format,
148
+ alphaMode
149
+ });
150
+ }
151
+ /**
152
+ * 获取 Canvas Alpha 合成方式。
153
+ * @returns Alpha 合成方式
154
+ */
155
+ get alphaMode() {
156
+ return this._alphaMode;
157
+ }
158
+ /**
159
+ * 获取当前 Canvas 使用的设备像素比。
160
+ * @returns 设备像素比
161
+ */
162
+ get dpr() {
163
+ return this._dpr;
164
+ }
165
+ /**
166
+ * 设置 Render 运行模式。
167
+ * production 会跳过 GPUBuffer 创建前的全部开发检查。
168
+ * @param renderMode Render 运行模式
169
+ */
170
+ set renderMode(renderMode) {
171
+ this._renderMode = renderMode;
172
+ }
173
+ /**
174
+ * 获取 Render 运行模式。
175
+ * @returns 当前 Render 运行模式
176
+ */
177
+ get renderMode() {
178
+ return this._renderMode;
179
+ }
180
+ /**
181
+ * 预热场景所需缓存,但不提交 DrawCall。
182
+ * @param scene 场景对象
183
+ * @param camera 相机对象
184
+ * @returns 无返回值
185
+ */
186
+ warmup(scene, camera) {
187
+ if (this._destroyed || this.pipeline.device === void 0) return;
188
+ this.initScene(scene);
189
+ if (this.pipeline.sceneResources.get(scene.id)?.version !== scene.version) this.trim(scene);
190
+ this.matrixUpdate(scene);
191
+ this.initCamera(camera);
192
+ this.drawBuffers(scene, camera);
193
+ this.drawTextures(scene);
194
+ this.drawPipelines(scene);
195
+ this.drawCallManager.prepare(this.canvas.width, this.canvas.height);
196
+ }
197
+ /**
198
+ * 预热缓存并绘制当前场景。
199
+ * @param scene 场景对象
200
+ * @param camera 相机对象
201
+ * @returns 无返回值
202
+ */
203
+ render(scene, camera) {
204
+ if (this._destroyed || this.pipeline.device === void 0) return;
205
+ this.warmup(scene, camera);
206
+ this.drawCall(scene);
207
+ }
208
+ /**
209
+ * 创建或更新当前场景的 GPUBuffer。
210
+ * @param scene 场景对象
211
+ * @param camera 相机对象
212
+ * @returns 无返回值
213
+ */
214
+ drawBuffers(scene, camera) {
215
+ this.bufferManager.draw(scene, camera, this._dpr, this._renderMode);
216
+ }
217
+ /**
218
+ * 创建或更新当前场景的 GPUTexture。
219
+ * @param scene 场景对象
220
+ * @returns 无返回值
221
+ */
222
+ drawTextures(scene) {
223
+ this.textureManager.draw(scene);
224
+ }
225
+ /**
226
+ * 创建或更新当前场景的 Pipeline 模板。
227
+ * @param scene 场景对象
228
+ * @returns 无返回值
229
+ */
230
+ drawPipelines(scene) {
231
+ this.pipelineManager.draw(scene);
232
+ }
233
+ /**
234
+ * 编码并提交当前场景的绘制命令。
235
+ * @param scene 场景对象
236
+ * @returns 无返回值
237
+ */
238
+ drawCall(scene) {
239
+ this.drawCallManager.draw(scene, this.backgroundColor, this._alphaMode);
240
+ }
241
+ /**
242
+ * 销毁指定 Mesh 缓存。
243
+ * @param mesh Mesh 对象或全局 ID
244
+ * @returns 是否销毁了任意资源
245
+ */
246
+ destroyMesh(mesh) {
247
+ return this.destroyManager.destroyMesh(mesh);
248
+ }
249
+ /**
250
+ * 销毁指定 Texture 缓存。
251
+ * @param texture Texture 对象或全局 ID
252
+ * @returns 是否销毁了对应资源
253
+ */
254
+ destroyTexture(texture) {
255
+ return this.destroyManager.destroyTexture(texture);
256
+ }
257
+ /**
258
+ * 销毁指定 Material 缓存。
259
+ * @param material Material 对象或全局 ID
260
+ * @returns 是否销毁了任意资源
261
+ */
262
+ destroyMaterial(material) {
263
+ return this.destroyManager.destroyMaterial(material);
264
+ }
265
+ /**
266
+ * 销毁指定 Geometry 缓存。
267
+ * @param geometry Geometry 对象或全局 ID
268
+ * @returns 是否销毁了对应资源
269
+ */
270
+ destroyGeometry(geometry) {
271
+ return this.destroyManager.destroyGeometry(geometry);
272
+ }
273
+ /**
274
+ * 回收所有场景均未引用的 GPU 缓存。
275
+ * @param scene 需要同步资源使用记录的场景
276
+ * @returns 无返回值
277
+ */
278
+ trim(scene) {
279
+ this.destroyManager.trim(scene);
280
+ }
281
+ /**
282
+ * 更新场景版本落后的节点矩阵。
283
+ * @param scene 场景对象
284
+ * @returns 无返回值
285
+ */
286
+ matrixUpdate(scene) {
287
+ MatrixUpdate(scene);
288
+ }
289
+ /**
290
+ * 根据版本更新 Scene 列表。
291
+ * @param scene 场景对象
292
+ * @returns 无返回值
293
+ */
294
+ initScene(scene) {
295
+ InitScene(scene);
296
+ }
297
+ /**
298
+ * 根据版本更新 Camera 矩阵。
299
+ * @param camera 相机对象
300
+ * @returns 无返回值
301
+ */
302
+ initCamera(camera) {
303
+ InitCamera(camera);
304
+ }
305
+ /**
306
+ * 销毁当前 Render 持有的全部资源并移除 Canvas。
307
+ * @returns 无返回值
308
+ */
309
+ destroy() {
310
+ if (this._destroyed) return;
311
+ this._destroyed = true;
312
+ if (this._resizeTimer !== null) {
313
+ window.clearTimeout(this._resizeTimer);
314
+ this._resizeTimer = null;
315
+ }
316
+ this.destroyManager.destroyAll();
317
+ this.canvas.remove();
318
+ }
319
+ /**
320
+ * 延迟更新 Canvas 实际像素尺寸。
321
+ * 连续 100ms 没有新的调用时才执行。
322
+ * @returns 无返回值
323
+ */
324
+ resize() {
325
+ if (this._destroyed) return;
326
+ const currentDpr = GetInner().dpr;
327
+ if (this._dpr !== currentDpr) this._dpr = currentDpr;
328
+ if (this._resizeTimer !== null) window.clearTimeout(this._resizeTimer);
329
+ this._resizeTimer = window.setTimeout(() => {
330
+ const inner = GetInner();
331
+ if (this.canvas.width !== inner.width) this.canvas.width = inner.width;
332
+ if (this.canvas.height !== inner.height) this.canvas.height = inner.height;
333
+ this._resizeTimer = null;
334
+ }, 100);
335
+ }
336
+ /**
337
+ * 获取当前 Render 销毁状态。
338
+ * @returns 是否已经销毁
339
+ */
340
+ isDestroyed() {
341
+ return this._destroyed;
342
+ }
343
+ };
344
+ //#endregion
345
+ export { BufferManager, DepthManager, DestroyManager, DevelopmentValidator, DrawCallManager, InitCamera, InitScene, MatrixUpdate, PipelineManager, SamplerManager, TextureManager, Render as default };
346
+
347
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/scripts/Render/index.ts"],"sourcesContent":["import { GetInner } from \"bpmatrixjs/Utils\";\nimport type Camera from \"../Camera\";\nimport type { GeoData } from \"../Geometry\";\nimport type { Material2d } from \"../global-types\";\nimport { GETID } from \"../ID\";\nimport type { MeshLike } from \"../Mesh\";\nimport type Scene from \"../Scene\";\nimport type { TextureResource } from \"../Texture/Layers\";\nimport BufferManager from \"./BufferManager\";\nimport DevelopmentValidator from \"./DevelopmentValidator\";\nimport DepthManager from \"./DepthManager\";\nimport DestroyManager from \"./DestroyManager\";\nimport DrawCallManager from \"./DrawCallManager\";\nimport PipelineManager from \"./PipelineManager\";\nimport SamplerManager from \"./SamplerManager\";\nimport { InitCamera, InitScene, MatrixUpdate } from \"./SceneUpdate\";\nimport TextureManager from \"./TextureManager\";\nimport type {\n GeometryBufferLike,\n GPUTextureResourceLike,\n MeshStyleBufferLike,\n PipelineLike,\n PipelineTemplateLike,\n RenderLike,\n RenderMode,\n SceneResourcesLike,\n} from \"./types\";\n\n/**\n * WebGPU 2D 渲染器。\n * 负责生命周期和渲染流程调度,具体 GPU 资源由各管理器维护。\n * @class\n * @implements RenderLike\n */\nclass Render implements RenderLike {\n /**\n * 当前 Render 的全局唯一 ID。\n */\n public readonly id: number;\n\n /**\n * 对象类型。\n */\n public readonly type: string = \"Render\";\n\n /**\n * 画布容器。\n */\n public container: HTMLElement;\n\n /**\n * 渲染画布。\n */\n public canvas: HTMLCanvasElement;\n\n /**\n * 每帧开始前用于清空画布的 RGBA 颜色。\n */\n public backgroundColor: GPUColorDict = { r: 0, g: 0, b: 0, a: 0 };\n\n /**\n * 当前 Render 的共享 WebGPU 资源。\n */\n public pipeline: PipelineLike;\n\n /**\n * WebGPU 初始化完成状态。\n */\n public readonly ready: Promise<void>;\n\n private _alphaMode: GPUCanvasAlphaMode;\n private _resizeTimer: number | null;\n private _destroyed: boolean;\n private _dpr: number;\n private _renderMode: RenderMode;\n private readonly bufferManager: BufferManager;\n private readonly destroyManager: DestroyManager;\n private readonly drawCallManager: DrawCallManager;\n private readonly pipelineManager: PipelineManager;\n private readonly textureManager: TextureManager;\n\n /**\n * 创建渲染器并开始异步初始化 WebGPU。\n * @param div 容器节点或容器 ID\n * @param renderMode Render 运行模式\n */\n public constructor(div: HTMLElement | string, renderMode: RenderMode = \"development\") {\n this.id = GETID();\n\n if (typeof div === \"string\") {\n const container: HTMLElement | null = document.getElementById(div);\n\n if (container === null) {\n throw new Error(`Render container \"${div}\" was not found.`);\n }\n\n this.container = container;\n } else {\n this.container = div;\n }\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.container.appendChild(this.canvas);\n this._alphaMode = \"premultiplied\";\n this._resizeTimer = null;\n this._destroyed = false;\n this._dpr = GetInner().dpr;\n this._renderMode = renderMode;\n this.pipeline = {\n pipelineTemplates: new Map<string, PipelineTemplateLike>(),\n textures: new Map<number, GPUTextureResourceLike>(),\n samplers: new Map<string, GPUSampler>(),\n sceneResources: new Map<number, SceneResourcesLike>(),\n buffers: {\n meshMatrix: new Map(),\n meshDepth: new Map(),\n geometry: new Map<number, GeometryBufferLike>(),\n meshStyle: new Map<number, MeshStyleBufferLike>(),\n cameraUniform: [],\n },\n };\n\n this.destroyManager = new DestroyManager(this.pipeline);\n this.textureManager = new TextureManager(this.pipeline);\n const samplerManager = new SamplerManager(this.pipeline);\n\n this.pipelineManager = new PipelineManager(this.pipeline, this.textureManager, samplerManager);\n this.bufferManager = new BufferManager(this.pipeline);\n this.drawCallManager = new DrawCallManager(this.pipeline, samplerManager);\n this.ready = this.initWebGPU();\n }\n\n /**\n * 创建当前画布对应的 WebGPU 设备与呈现上下文。\n * @returns WebGPU 初始化完成状态\n */\n public async initWebGPU(): Promise<void> {\n const webGPU: GPU | undefined = (navigator as { gpu?: GPU }).gpu;\n\n if (webGPU === undefined) {\n throw new Error(\"WebGPU is not supported by this browser.\");\n }\n\n const adapter: GPUAdapter | null = await webGPU.requestAdapter();\n\n if (adapter === null) {\n throw new Error(\"No compatible WebGPU adapter was found.\");\n }\n\n if (this.isDestroyed()) {\n return;\n }\n\n const device: GPUDevice = await adapter.requestDevice();\n\n if (this.isDestroyed()) {\n device.destroy();\n return;\n }\n\n const context: GPUCanvasContext | null = this.canvas.getContext(\"webgpu\");\n\n if (context === null) {\n throw new Error(\"WebGPU canvas context could not be created.\");\n }\n\n const format: GPUTextureFormat = webGPU.getPreferredCanvasFormat();\n\n context.configure({\n device,\n format,\n alphaMode: this._alphaMode,\n });\n this.pipeline.adapter = adapter;\n this.pipeline.device = device;\n this.pipeline.context = context;\n this.pipeline.format = format;\n this.pipelineManager.initResources(device);\n }\n\n /**\n * 设置 Canvas 与下层 HTML 内容的 Alpha 合成方式。\n * @param alphaMode Alpha 合成方式\n */\n public set alphaMode(alphaMode: GPUCanvasAlphaMode) {\n if (this._alphaMode === alphaMode) {\n return;\n }\n\n this._alphaMode = alphaMode;\n\n const device: GPUDevice | undefined = this.pipeline.device;\n const context: GPUCanvasContext | undefined = this.pipeline.context;\n const format: GPUTextureFormat | undefined = this.pipeline.format;\n\n if (device !== undefined && context !== undefined && format !== undefined) {\n context.configure({ device, format, alphaMode });\n }\n }\n\n /**\n * 获取 Canvas Alpha 合成方式。\n * @returns Alpha 合成方式\n */\n public get alphaMode(): GPUCanvasAlphaMode {\n return this._alphaMode;\n }\n\n /**\n * 获取当前 Canvas 使用的设备像素比。\n * @returns 设备像素比\n */\n public get dpr(): number {\n return this._dpr;\n }\n\n /**\n * 设置 Render 运行模式。\n * production 会跳过 GPUBuffer 创建前的全部开发检查。\n * @param renderMode Render 运行模式\n */\n public set renderMode(renderMode: RenderMode) {\n this._renderMode = renderMode;\n }\n\n /**\n * 获取 Render 运行模式。\n * @returns 当前 Render 运行模式\n */\n public get renderMode(): RenderMode {\n return this._renderMode;\n }\n\n /**\n * 预热场景所需缓存,但不提交 DrawCall。\n * @param scene 场景对象\n * @param camera 相机对象\n * @returns 无返回值\n */\n public warmup(scene: Scene, camera: Camera): void {\n if (this._destroyed || this.pipeline.device === undefined) {\n return;\n }\n\n this.initScene(scene);\n if (this.pipeline.sceneResources.get(scene.id)?.version !== scene.version) {\n this.trim(scene);\n }\n\n this.matrixUpdate(scene);\n this.initCamera(camera);\n this.drawBuffers(scene, camera);\n this.drawTextures(scene);\n this.drawPipelines(scene);\n this.drawCallManager.prepare(this.canvas.width, this.canvas.height);\n }\n\n /**\n * 预热缓存并绘制当前场景。\n * @param scene 场景对象\n * @param camera 相机对象\n * @returns 无返回值\n */\n public render(scene: Scene, camera: Camera): void {\n if (this._destroyed || this.pipeline.device === undefined) {\n return;\n }\n\n this.warmup(scene, camera);\n this.drawCall(scene);\n }\n\n /**\n * 创建或更新当前场景的 GPUBuffer。\n * @param scene 场景对象\n * @param camera 相机对象\n * @returns 无返回值\n */\n public drawBuffers(scene: Scene, camera: Camera): void {\n this.bufferManager.draw(scene, camera, this._dpr, this._renderMode);\n }\n\n /**\n * 创建或更新当前场景的 GPUTexture。\n * @param scene 场景对象\n * @returns 无返回值\n */\n public drawTextures(scene: Scene): void {\n this.textureManager.draw(scene);\n }\n\n /**\n * 创建或更新当前场景的 Pipeline 模板。\n * @param scene 场景对象\n * @returns 无返回值\n */\n public drawPipelines(scene: Scene): void {\n this.pipelineManager.draw(scene);\n }\n\n /**\n * 编码并提交当前场景的绘制命令。\n * @param scene 场景对象\n * @returns 无返回值\n */\n public drawCall(scene: Scene): void {\n this.drawCallManager.draw(scene, this.backgroundColor, this._alphaMode);\n }\n\n /**\n * 销毁指定 Mesh 缓存。\n * @param mesh Mesh 对象或全局 ID\n * @returns 是否销毁了任意资源\n */\n public destroyMesh(mesh: MeshLike | number): boolean {\n return this.destroyManager.destroyMesh(mesh);\n }\n\n /**\n * 销毁指定 Texture 缓存。\n * @param texture Texture 对象或全局 ID\n * @returns 是否销毁了对应资源\n */\n public destroyTexture(texture: TextureResource | number): boolean {\n return this.destroyManager.destroyTexture(texture);\n }\n\n /**\n * 销毁指定 Material 缓存。\n * @param material Material 对象或全局 ID\n * @returns 是否销毁了任意资源\n */\n public destroyMaterial(material: Material2d | number): boolean {\n return this.destroyManager.destroyMaterial(material);\n }\n\n /**\n * 销毁指定 Geometry 缓存。\n * @param geometry Geometry 对象或全局 ID\n * @returns 是否销毁了对应资源\n */\n public destroyGeometry(geometry: GeoData | number): boolean {\n return this.destroyManager.destroyGeometry(geometry);\n }\n\n /**\n * 回收所有场景均未引用的 GPU 缓存。\n * @param scene 需要同步资源使用记录的场景\n * @returns 无返回值\n */\n public trim(scene: Scene): void {\n this.destroyManager.trim(scene);\n }\n\n /**\n * 更新场景版本落后的节点矩阵。\n * @param scene 场景对象\n * @returns 无返回值\n */\n public matrixUpdate(scene: Scene): void {\n MatrixUpdate(scene);\n }\n\n /**\n * 根据版本更新 Scene 列表。\n * @param scene 场景对象\n * @returns 无返回值\n */\n public initScene(scene: Scene): void {\n InitScene(scene);\n }\n\n /**\n * 根据版本更新 Camera 矩阵。\n * @param camera 相机对象\n * @returns 无返回值\n */\n public initCamera(camera: Camera): void {\n InitCamera(camera);\n }\n\n /**\n * 销毁当前 Render 持有的全部资源并移除 Canvas。\n * @returns 无返回值\n */\n public destroy(): void {\n if (this._destroyed) {\n return;\n }\n\n this._destroyed = true;\n\n if (this._resizeTimer !== null) {\n window.clearTimeout(this._resizeTimer);\n this._resizeTimer = null;\n }\n\n this.destroyManager.destroyAll();\n this.canvas.remove();\n }\n\n /**\n * 延迟更新 Canvas 实际像素尺寸。\n * 连续 100ms 没有新的调用时才执行。\n * @returns 无返回值\n */\n public resize(): void {\n if (this._destroyed) {\n return;\n }\n\n const currentDpr: number = GetInner().dpr;\n\n if (this._dpr !== currentDpr) {\n this._dpr = currentDpr;\n }\n\n if (this._resizeTimer !== null) {\n window.clearTimeout(this._resizeTimer);\n }\n\n this._resizeTimer = window.setTimeout((): void => {\n const inner = GetInner();\n\n if (this.canvas.width !== inner.width) {\n this.canvas.width = inner.width;\n }\n if (this.canvas.height !== inner.height) {\n this.canvas.height = inner.height;\n }\n\n this._resizeTimer = null;\n }, 100);\n }\n\n /**\n * 获取当前 Render 销毁状态。\n * @returns 是否已经销毁\n */\n private isDestroyed(): boolean {\n return this._destroyed;\n }\n}\n\nexport default Render;\nexport {\n BufferManager,\n DepthManager,\n DevelopmentValidator,\n DestroyManager,\n DrawCallManager,\n InitCamera,\n InitScene,\n MatrixUpdate,\n PipelineManager,\n SamplerManager,\n TextureManager,\n};\nexport type {\n DepthTextureLike,\n MeshDepthBufferLike,\n GeometryBufferPartLike,\n GeometryBufferLike,\n GPUTextureResourceLike,\n MeshMatrixBufferLike,\n MeshStyleBufferLike,\n PipelineBuffersLike,\n PipelineLike,\n PipelineTemplateLike,\n RenderLike,\n RenderMode,\n SceneResourcesLike,\n} from \"./types\";\nexport type { BufferManagerLike } from \"./BufferManager\";\nexport type { DevelopmentValidatorLike } from \"./DevelopmentValidator\";\nexport type { DestroyManagerLike } from \"./DestroyManager\";\nexport type { DrawCallManagerLike } from \"./DrawCallManager\";\nexport type { PipelineManagerLike } from \"./PipelineManager\";\nexport type { SamplerManagerLike } from \"./SamplerManager\";\nexport type { TextureManagerLike } from \"./TextureManager\";\n"],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ /// <reference types="@webgpu/types" preserve="true" />
2
+ import type Camera from "../Camera";
3
+ import type { GeoData } from "../Geometry";
4
+ import type { Material2d } from "../global-types";
5
+ import type { MeshLike } from "../Mesh";
6
+ import type Scene from "../Scene";
7
+ import type { TextureResource } from "../Texture/Layers";
8
+ /**
9
+ * Render 运行模式。
10
+ * development 启用运行时资源检查,production 跳过全部开发检查。
11
+ */
12
+ type RenderMode = "development" | "production";
13
+ /** group(0) 的资源身份快照;所属矩阵缓存被替换时一起释放。 */
14
+ interface MatrixBindGroupCache {
15
+ group: GPUBindGroup;
16
+ layout: GPUBindGroupLayout;
17
+ view: GPUBuffer;
18
+ projection: GPUBuffer;
19
+ parameters: GPUBuffer;
20
+ geometry: GPUBuffer;
21
+ depth: GPUBuffer;
22
+ }
23
+ /** group(1) 的资源身份快照;样式数值更新不使绑定失效。 */
24
+ interface StyleBindGroupCache {
25
+ group: GPUBindGroup;
26
+ layout: GPUBindGroupLayout;
27
+ baseView: GPUTextureView;
28
+ edgeView: GPUTextureView;
29
+ pointsView: GPUTextureView;
30
+ baseSampler: GPUSampler;
31
+ edgeSampler: GPUSampler;
32
+ pointsSampler: GPUSampler;
33
+ }
34
+ /**
35
+ * 单个 Mesh 的世界矩阵缓冲位。
36
+ */
37
+ interface MeshMatrixBufferLike {
38
+ /** 已创建的矩阵绑定组,只在绑定对象或布局变化后重建。 */
39
+ bindGroup?: MatrixBindGroupCache;
40
+ /**
41
+ * 对应 Mesh 的全局 ID。
42
+ */
43
+ meshId: number;
44
+ /**
45
+ * 当前 Render 创建的 GPU 矩阵缓冲。
46
+ */
47
+ buffer: GPUBuffer;
48
+ /** 当前数组容量,实例个数而非 float 个数。 */
49
+ capacity: number;
50
+ /** 已上传的 Mesh.matrixVersion。 */
51
+ version: number;
52
+ }
53
+ /** 每个 Mesh 独立的连续实例样式缓冲。 */
54
+ interface MeshStyleBufferLike {
55
+ /** 已创建的样式绑定组,随该 Mesh 样式缓存一起回收。 */
56
+ bindGroup?: StyleBindGroupCache;
57
+ meshId: number;
58
+ /** 用于 destroyMaterial 清理当前绑定该材质的样式缓存。 */
59
+ materialId: number;
60
+ buffer: GPUBuffer;
61
+ capacity: number;
62
+ version: number;
63
+ }
64
+ /**
65
+ * 单种 Geometry 绘制模式对应的顶点、二维轮廓法线、UV 和索引缓冲。
66
+ */
67
+ interface GeometryBufferPartLike {
68
+ vertex: GPUBuffer;
69
+ normal: GPUBuffer;
70
+ uv: GPUBuffer;
71
+ index: GPUBuffer;
72
+ miterScale?: GPUBuffer;
73
+ /** 点型逐顶点中心坐标缓冲。 */
74
+ position?: GPUBuffer;
75
+ /** 连续逐顶点类型缓冲,0 / 0.5 / 1 对应面 / 宽边框 / 关键点。 */
76
+ vertexType?: GPUBuffer;
77
+ /** 关键点在合并索引中的起始位置,供原生线框插入时保持覆盖顺序。 */
78
+ pointsFirstIndex: number;
79
+ /** 上传时保留的索引位宽,不能把 Uint32Array 强转为 Uint16Array。 */
80
+ indexFormat: GPUIndexFormat;
81
+ }
82
+ /**
83
+ * 单个 Geometry 对应的 WebGPU 缓存集合。
84
+ */
85
+ interface GeometryBufferLike {
86
+ geometryId: number;
87
+ version: number;
88
+ uniform: GPUBuffer;
89
+ geometry?: GeometryBufferPartLike;
90
+ linePoints?: GeometryBufferPartLike;
91
+ }
92
+ /** 单个 Mesh 的层级起点和实例读取方向,静止帧不重复上传。 */
93
+ interface MeshDepthBufferLike {
94
+ meshId: number;
95
+ buffer: GPUBuffer;
96
+ data: Uint32Array<ArrayBuffer>;
97
+ }
98
+ /** 与画布实际尺寸绑定的 Render 私有深度附件。 */
99
+ interface DepthTextureLike {
100
+ texture: GPUTexture;
101
+ view: GPUTextureView;
102
+ width: number;
103
+ height: number;
104
+ }
105
+ interface PipelineBuffersLike {
106
+ meshDepth: Map<number, MeshDepthBufferLike>;
107
+ /** CPU 按 Mesh ID 查询缓冲对象;buffer 内仍是连续矩阵数值。 */
108
+ meshMatrix: Map<number, MeshMatrixBufferLike>;
109
+ geometry: Map<number, GeometryBufferLike>;
110
+ meshStyle: Map<number, MeshStyleBufferLike>;
111
+ cameraUniform: GPUBuffer[];
112
+ }
113
+ /**
114
+ * 单个 Scene 当前使用的 Render 缓存资源集合。
115
+ */
116
+ interface SceneResourcesLike {
117
+ /** 当前 Render 已处理的 Scene 版本。 */
118
+ version: number;
119
+ meshIds: Set<number>;
120
+ geometryIds: Set<number>;
121
+ materialIds: Set<number>;
122
+ textureIds: Set<number>;
123
+ pipelineKeys: Set<string>;
124
+ }
125
+ /**
126
+ * 单个 Texture 对应的 WebGPU 贴图资源。
127
+ */
128
+ interface GPUTextureResourceLike {
129
+ textureId: number;
130
+ /** 层内源图 ID,显式销毁图片时同时失效引用它的层组。 */
131
+ sourceIds?: ReadonlySet<number>;
132
+ /** 当前 Render 已上传的贴图版本,不随其他 Render 清理标记而变化。 */
133
+ version: number;
134
+ texture: GPUTexture;
135
+ view: GPUTextureView;
136
+ }
137
+ /**
138
+ * 相同材质 key 共享的 WebGPU 管线模板。
139
+ */
140
+ interface PipelineTemplateLike {
141
+ key: string;
142
+ renderPipeline?: GPURenderPipeline;
143
+ lineRenderPipeline?: GPURenderPipeline;
144
+ defaultBindGroupLayout: GPUBindGroupLayout;
145
+ materialBindGroupLayout: GPUBindGroupLayout;
146
+ }
147
+ interface PipelineLike {
148
+ adapter?: GPUAdapter;
149
+ device?: GPUDevice;
150
+ context?: GPUCanvasContext;
151
+ format?: GPUTextureFormat;
152
+ pipelineTemplates: Map<string, PipelineTemplateLike>;
153
+ defaultBindGroupLayout?: GPUBindGroupLayout;
154
+ baseMaterialBindGroupLayout?: GPUBindGroupLayout;
155
+ textures: Map<number, GPUTextureResourceLike>;
156
+ samplers: Map<string, GPUSampler>;
157
+ fallbackTexture?: GPUTextureResourceLike;
158
+ depthTexture?: DepthTextureLike;
159
+ sceneResources: Map<number, SceneResourcesLike>;
160
+ buffers: PipelineBuffersLike;
161
+ }
162
+ interface RenderLike {
163
+ readonly id: number;
164
+ readonly type: string;
165
+ readonly dpr: number;
166
+ renderMode: RenderMode;
167
+ container: HTMLElement;
168
+ canvas: HTMLCanvasElement;
169
+ backgroundColor: GPUColorDict;
170
+ alphaMode: GPUCanvasAlphaMode;
171
+ pipeline: PipelineLike;
172
+ readonly ready: Promise<void>;
173
+ initWebGPU(): Promise<void>;
174
+ destroy(): void;
175
+ warmup(scene: Scene, camera: Camera): void;
176
+ render(scene: Scene, camera: Camera): void;
177
+ drawBuffers(scene: Scene, camera: Camera): void;
178
+ drawTextures(scene: Scene): void;
179
+ drawPipelines(scene: Scene): void;
180
+ drawCall(scene: Scene): void;
181
+ destroyMesh(mesh: MeshLike | number): boolean;
182
+ destroyMaterial(material: Material2d | number): boolean;
183
+ destroyGeometry(geometry: GeoData | number): boolean;
184
+ destroyTexture(texture: TextureResource | number): boolean;
185
+ trim(scene: Scene): void;
186
+ matrixUpdate(scene: Scene): void;
187
+ initScene(scene: Scene): void;
188
+ initCamera(camera: Camera): void;
189
+ resize(): void;
190
+ }
191
+ export type { DepthTextureLike, MeshDepthBufferLike, GeometryBufferPartLike, GeometryBufferLike, GPUTextureResourceLike, MeshMatrixBufferLike, MeshStyleBufferLike, PipelineBuffersLike, PipelineLike, PipelineTemplateLike, RenderLike, RenderMode, SceneResourcesLike, };