@zephyr3d/device 0.2.4 → 0.2.5

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 (42) hide show
  1. package/dist/base_types.js +7 -66
  2. package/dist/base_types.js.map +1 -1
  3. package/dist/builder/ast.js +112 -118
  4. package/dist/builder/ast.js.map +1 -1
  5. package/dist/builder/base.js +23 -25
  6. package/dist/builder/base.js.map +1 -1
  7. package/dist/builder/builtinfunc.js +19 -1
  8. package/dist/builder/builtinfunc.js.map +1 -1
  9. package/dist/builder/constructors.js +1 -1
  10. package/dist/builder/constructors.js.map +1 -1
  11. package/dist/builder/errors.js +7 -7
  12. package/dist/builder/errors.js.map +1 -1
  13. package/dist/builder/misc.js +10 -0
  14. package/dist/builder/misc.js.map +1 -0
  15. package/dist/builder/programbuilder.js +45 -32
  16. package/dist/builder/programbuilder.js.map +1 -1
  17. package/dist/builder/reflection.js.map +1 -1
  18. package/dist/builder/types.js +70 -70
  19. package/dist/builder/types.js.map +1 -1
  20. package/dist/device.js +72 -43
  21. package/dist/device.js.map +1 -1
  22. package/dist/gpuobject.js +82 -24
  23. package/dist/gpuobject.js.map +1 -1
  24. package/dist/helpers/drawtext.js +1 -0
  25. package/dist/helpers/drawtext.js.map +1 -1
  26. package/dist/helpers/font.js +1 -0
  27. package/dist/helpers/font.js.map +1 -1
  28. package/dist/helpers/glyphmanager.js +7 -7
  29. package/dist/helpers/glyphmanager.js.map +1 -1
  30. package/dist/helpers/textureatlas.js +3 -5
  31. package/dist/helpers/textureatlas.js.map +1 -1
  32. package/dist/index.d.ts +199 -152
  33. package/dist/index.js +6 -5
  34. package/dist/index.js.map +1 -1
  35. package/dist/pool.js +54 -25
  36. package/dist/pool.js.map +1 -1
  37. package/dist/timer.js.map +1 -1
  38. package/dist/uniformdata.js +2 -2
  39. package/dist/uniformdata.js.map +1 -1
  40. package/dist/vertexdata.js +27 -1
  41. package/dist/vertexdata.js.map +1 -1
  42. package/package.json +31 -16
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
- export { DeviceGPUObjectAddedEvent, DeviceGPUObjectRemovedEvent, DeviceGPUObjectRenameEvent, DeviceLostEvent, DeviceResizeEvent, DeviceRestoreEvent, ShaderType, encodePixel, encodePixelToArray, getTextureFormatBlockHeight, getTextureFormatBlockSize, getTextureFormatBlockWidth, hasAlphaChannel, hasBlueChannel, hasDepthChannel, hasGreenChannel, hasRedChannel, hasStencilChannel, isCompressedTextureFormat, isFloatTextureFormat, isIntegerTextureFormat, isSRGBTextureFormat, isSignedTextureFormat, linearTextureFormatToSRGB } from './base_types.js';
1
+ export { ShaderType, encodePixel, encodePixelToArray, getTextureFormatBlockHeight, getTextureFormatBlockSize, getTextureFormatBlockWidth, hasAlphaChannel, hasBlueChannel, hasDepthChannel, hasGreenChannel, hasRedChannel, hasStencilChannel, isCompressedTextureFormat, isFloatTextureFormat, isIntegerTextureFormat, isSRGBTextureFormat, isSignedTextureFormat, linearTextureFormatToSRGB } from './base_types.js';
2
2
  export { VertexData } from './vertexdata.js';
3
- export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, semanticList, semanticToAttrib } from './gpuobject.js';
3
+ export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexAttributeFormat, getVertexAttributeIndex, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, matchVertexBuffer, semanticList, semanticToAttrib } from './gpuobject.js';
4
4
  export { BaseDevice } from './device.js';
5
- export { PBShaderExp, Proxiable, getCurrentProgramBuilder, makeConstructor, setCurrentProgramBuilder } from './builder/base.js';
5
+ export { Pool } from './pool.js';
6
+ export { CPUTimer } from './timer.js';
7
+ export { StructuredBufferData } from './uniformdata.js';
8
+ export { PBShaderExp, Proxiable, makeConstructor } from './builder/base.js';
6
9
  export { ASTAddressOf, ASTArrayIndex, ASTAssignment, ASTBinaryFunc, ASTBreak, ASTCallFunction, ASTCast, ASTContinue, ASTDeclareVar, ASTDiscard, ASTDoWhile, ASTExpression, ASTFunction, ASTFunctionParameter, ASTGlobalScope, ASTHash, ASTIf, ASTLValue, ASTLValueArray, ASTLValueDeclare, ASTLValueHash, ASTLValueScalar, ASTNakedScope, ASTPrimitive, ASTRange, ASTReferenceOf, ASTReturn, ASTScalar, ASTScope, ASTSelect, ASTShaderExpConstructor, ASTStructDefine, ASTTouch, ASTUnaryFunc, ASTWhile, DeclareType, ShaderAST, ShaderPrecisionType, builtinVariables, genSamplerName, getBuiltinInputStructInstanceName, getBuiltinInputStructName, getBuiltinOutputStructInstanceName, getBuiltinOutputStructName, getBuiltinParamName, getTextureSampleType } from './builder/ast.js';
7
10
  export { PBBuiltinScope, PBDoWhileScope, PBForScope, PBFunctionScope, PBGlobalScope, PBIfScope, PBInputScope, PBInsideFunctionScope, PBLocalScope, PBNakedScope, PBOutputScope, PBScope, PBWhileScope, ProgramBuilder } from './builder/programbuilder.js';
8
11
  export { PBAddressSpace, PBAnyTypeInfo, PBArrayTypeInfo, PBAtomicI32TypeInfo, PBAtomicU32TypeInfo, PBFunctionTypeInfo, PBPointerTypeInfo, PBPrimitiveType, PBPrimitiveTypeInfo, PBSamplerAccessMode, PBSamplerTypeInfo, PBStructTypeInfo, PBTextureType, PBTextureTypeInfo, PBTypeInfo, PBVoidTypeInfo, typeAny, typeAtomicI32, typeAtomicU32, typeBVec2, typeBVec3, typeBVec4, typeBool, typeF16, typeF16Vec2, typeF16Vec3, typeF16Vec4, typeF32, typeF32Vec2, typeF32Vec3, typeF32Vec4, typeFrexpResult, typeFrexpResultVec2, typeFrexpResultVec3, typeFrexpResultVec4, typeI16, typeI16Vec2, typeI16Vec2_Norm, typeI16Vec3, typeI16Vec3_Norm, typeI16Vec4, typeI16Vec4_Norm, typeI16_Norm, typeI32, typeI32Vec2, typeI32Vec2_Norm, typeI32Vec3, typeI32Vec3_Norm, typeI32Vec4, typeI32Vec4_Norm, typeI32_Norm, typeI8, typeI8Vec2, typeI8Vec2_Norm, typeI8Vec3, typeI8Vec3_Norm, typeI8Vec4, typeI8Vec4_Norm, typeI8_Norm, typeITex1D, typeITex2D, typeITex2DArray, typeITex3D, typeITexCube, typeITexCubeArray, typeITexMultisampled2D, typeMat2, typeMat2x3, typeMat2x4, typeMat3, typeMat3x2, typeMat3x4, typeMat4, typeMat4x2, typeMat4x3, typeSampler, typeSamplerComparison, typeTex1D, typeTex2D, typeTex2DArray, typeTex3D, typeTexCube, typeTexCubeArray, typeTexDepth2D, typeTexDepth2DArray, typeTexDepthCube, typeTexDepthCubeArray, typeTexDepthMultisampled2D, typeTexExternal, typeTexMultisampled2D, typeTexStorage1D_bgra8unorm, typeTexStorage1D_r32float, typeTexStorage1D_r32sint, typeTexStorage1D_r32uint, typeTexStorage1D_rg32float, typeTexStorage1D_rg32sint, typeTexStorage1D_rg32uint, typeTexStorage1D_rgba16float, typeTexStorage1D_rgba16sint, typeTexStorage1D_rgba16uint, typeTexStorage1D_rgba32float, typeTexStorage1D_rgba32sint, typeTexStorage1D_rgba32uint, typeTexStorage1D_rgba8sint, typeTexStorage1D_rgba8snorm, typeTexStorage1D_rgba8uint, typeTexStorage1D_rgba8unorm, typeTexStorage2DArray_bgra8unorm, typeTexStorage2DArray_r32float, typeTexStorage2DArray_r32sint, typeTexStorage2DArray_r32uint, typeTexStorage2DArray_rg32float, typeTexStorage2DArray_rg32sint, typeTexStorage2DArray_rg32uint, typeTexStorage2DArray_rgba16float, typeTexStorage2DArray_rgba16sint, typeTexStorage2DArray_rgba16uint, typeTexStorage2DArray_rgba32float, typeTexStorage2DArray_rgba32sint, typeTexStorage2DArray_rgba32uint, typeTexStorage2DArray_rgba8sint, typeTexStorage2DArray_rgba8snorm, typeTexStorage2DArray_rgba8uint, typeTexStorage2DArray_rgba8unorm, typeTexStorage2D_bgra8unorm, typeTexStorage2D_r32float, typeTexStorage2D_r32sint, typeTexStorage2D_r32uint, typeTexStorage2D_rg32float, typeTexStorage2D_rg32sint, typeTexStorage2D_rg32uint, typeTexStorage2D_rgba16float, typeTexStorage2D_rgba16sint, typeTexStorage2D_rgba16uint, typeTexStorage2D_rgba32float, typeTexStorage2D_rgba32sint, typeTexStorage2D_rgba32uint, typeTexStorage2D_rgba8sint, typeTexStorage2D_rgba8snorm, typeTexStorage2D_rgba8uint, typeTexStorage2D_rgba8unorm, typeTexStorage3D_bgra8unorm, typeTexStorage3D_r32float, typeTexStorage3D_r32sint, typeTexStorage3D_r32uint, typeTexStorage3D_rg32float, typeTexStorage3D_rg32sint, typeTexStorage3D_rg32uint, typeTexStorage3D_rgba16float, typeTexStorage3D_rgba16sint, typeTexStorage3D_rgba16uint, typeTexStorage3D_rgba32float, typeTexStorage3D_rgba32sint, typeTexStorage3D_rgba32uint, typeTexStorage3D_rgba8sint, typeTexStorage3D_rgba8snorm, typeTexStorage3D_rgba8uint, typeTexStorage3D_rgba8unorm, typeU16, typeU16Vec2, typeU16Vec2_Norm, typeU16Vec3, typeU16Vec3_Norm, typeU16Vec4, typeU16Vec4_Norm, typeU16_Norm, typeU32, typeU32Vec2, typeU32Vec2_Norm, typeU32Vec3, typeU32Vec3_Norm, typeU32Vec4, typeU32Vec4_Norm, typeU32_Norm, typeU8, typeU8Vec2, typeU8Vec2_Norm, typeU8Vec3, typeU8Vec3_Norm, typeU8Vec4, typeU8Vec4_Norm, typeU8_Norm, typeUTex1D, typeUTex2D, typeUTex2DArray, typeUTex3D, typeUTexCube, typeUTexCubeArray, typeUTexMultisampled2D, typeVoid } from './builder/types.js';
@@ -11,6 +14,4 @@ export { TextureAtlasManager } from './helpers/textureatlas.js';
11
14
  export { Font, FontCanvas } from './helpers/font.js';
12
15
  export { GlyphManager } from './helpers/glyphmanager.js';
13
16
  export { DrawText } from './helpers/drawtext.js';
14
- export { CPUTimer } from './timer.js';
15
- export { StructuredBufferData } from './uniformdata.js';
16
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
package/dist/pool.js CHANGED
@@ -5,6 +5,7 @@
5
5
  /** @internal */ _memCost;
6
6
  /** @internal */ _memCostThreshold;
7
7
  /** @internal */ _device;
8
+ /** @internal */ _id;
8
9
  /** @internal */ _freeTextures = {};
9
10
  /** @internal */ _allocatedTextures = new WeakMap();
10
11
  /** @internal */ _autoReleaseTextures = new Set();
@@ -14,8 +15,9 @@
14
15
  /**
15
16
  * Creates an instance of Pool class
16
17
  * @param device - Rendering device
17
- */ constructor(device, memCostThreshold = 1024 * 1024 * 1024){
18
+ */ constructor(device, id, memCostThreshold = 1024 * 1024 * 1024){
18
19
  this._device = device;
20
+ this._id = id;
19
21
  this._memCost = 0;
20
22
  this._memCostThreshold = memCostThreshold;
21
23
  this._freeTextures = {};
@@ -26,6 +28,11 @@
26
28
  this._autoReleaseFramebuffers = new Set();
27
29
  this._memCost = 0;
28
30
  }
31
+ /**
32
+ * Id for this pool
33
+ */ get id() {
34
+ return this._id;
35
+ }
29
36
  autoRelease() {
30
37
  // auto release objects
31
38
  for (const tex of this._autoReleaseTextures){
@@ -54,10 +61,8 @@
54
61
  let texture = null;
55
62
  const list = this._freeTextures[hash];
56
63
  if (!list) {
57
- texture = this._device.createTexture2D(format, width, height, mipmapping ? {} : {
58
- samplerOptions: {
59
- mipFilter: 'none'
60
- }
64
+ texture = this._device.createTexture2D(format, width, height, {
65
+ mipmapping
61
66
  });
62
67
  this._memCost += texture.memCost;
63
68
  } else {
@@ -90,10 +95,8 @@
90
95
  let texture = null;
91
96
  const list = this._freeTextures[hash];
92
97
  if (!list) {
93
- texture = this._device.createTexture2DArray(format, width, height, numLayers, mipmapping ? {} : {
94
- samplerOptions: {
95
- mipFilter: 'none'
96
- }
98
+ texture = this._device.createTexture2DArray(format, width, height, numLayers, {
99
+ mipmapping
97
100
  });
98
101
  this._memCost += texture.memCost;
99
102
  } else {
@@ -124,10 +127,8 @@
124
127
  let texture = null;
125
128
  const list = this._freeTextures[hash];
126
129
  if (!list) {
127
- texture = this._device.createCubeTexture(format, size, mipmapping ? {} : {
128
- samplerOptions: {
129
- mipFilter: 'none'
130
- }
130
+ texture = this._device.createCubeTexture(format, size, {
131
+ mipmapping
131
132
  });
132
133
  this._memCost += texture.memCost;
133
134
  } else {
@@ -228,7 +229,10 @@
228
229
  info.refcount++;
229
230
  }
230
231
  }
231
- this._allocatedFramebuffers.set(fb, hash);
232
+ this._allocatedFramebuffers.set(fb, {
233
+ hash,
234
+ refcount: 1
235
+ });
232
236
  if (autoRelease) {
233
237
  this._autoReleaseFramebuffers.add(fb);
234
238
  }
@@ -252,6 +256,17 @@
252
256
  }
253
257
  }
254
258
  /**
259
+ * Increment reference counter for given texture
260
+ * @param texture - The texture to retain
261
+ */ retainTexture(texture) {
262
+ const info = this._allocatedTextures.get(texture);
263
+ if (!info) {
264
+ console.error(`ObjectPool.retainTexture(): texture is not allocated from pool`);
265
+ } else {
266
+ info.refcount++;
267
+ }
268
+ }
269
+ /**
255
270
  * Dispose a framebuffer that is allocated from the object pool.
256
271
  * @param fb - The framebuffer to dispose.
257
272
  */ disposeFrameBuffer(fb) {
@@ -267,22 +282,36 @@
267
282
  * Release a framebuffer back to the object pool.
268
283
  * @param fb - The framebuffer to release.
269
284
  */ releaseFrameBuffer(fb) {
270
- const hash = this._allocatedFramebuffers.get(fb);
271
- if (!hash) {
285
+ const info = this._allocatedFramebuffers.get(fb);
286
+ if (!info) {
272
287
  console.error(`ObjectPool.releaseFrameBuffer(): framebuffer is not allocated from pool`);
273
288
  } else {
274
- this.internalDisposeFrameBuffer(fb);
275
- const list = this._freeFramebuffers[hash];
276
- if (list) {
277
- list.push(fb);
278
- } else {
279
- this._freeFramebuffers[hash] = [
280
- fb
281
- ];
289
+ info.refcount--;
290
+ if (info.refcount <= 0) {
291
+ this.internalDisposeFrameBuffer(fb);
292
+ const list = this._freeFramebuffers[info.hash];
293
+ if (list) {
294
+ list.push(fb);
295
+ } else {
296
+ this._freeFramebuffers[info.hash] = [
297
+ fb
298
+ ];
299
+ }
282
300
  }
283
301
  }
284
302
  }
285
303
  /**
304
+ * Increment reference counter for given framebuffer
305
+ * @param fb - The framebuffer to retain
306
+ */ retainFrameBuffer(fb) {
307
+ const info = this._allocatedFramebuffers.get(fb);
308
+ if (!info) {
309
+ console.error(`ObjectPool.retainFrameBuffer(): framebuffer is not allocated from pool`);
310
+ } else {
311
+ info.refcount++;
312
+ }
313
+ }
314
+ /**
286
315
  * Purge the object pool by disposing all free framebuffers and textures.
287
316
  */ purge() {
288
317
  for(const k in this._freeFramebuffers){
@@ -325,7 +354,7 @@
325
354
  const info = this._allocatedTextures.get(texture);
326
355
  if (info) {
327
356
  info.refcount--;
328
- if (info.refcount === 0) {
357
+ if (info.refcount <= 0) {
329
358
  this._allocatedTextures.delete(texture);
330
359
  this._autoReleaseTextures.delete(texture);
331
360
  if (purge || info.dispose) {
package/dist/pool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pool.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"pool.js","sources":["../src/pool.ts"],"sourcesContent":["import type { MaybeArray } from '@zephyr3d/base';\r\nimport type { AbstractDevice, TextureFormat } from './base_types';\r\nimport type { BaseTexture, FrameBuffer, Texture2D, Texture2DArray, TextureCube } from './gpuobject';\r\n\r\n/**\r\n * ObjectPool class is responsible for managing and reusing textures and framebuffers.\r\n * @public\r\n */\r\nexport class Pool {\r\n /** @internal */\r\n private _memCost: number;\r\n /** @internal */\r\n private readonly _memCostThreshold: number;\r\n /** @internal */\r\n private readonly _device: AbstractDevice;\r\n /** @internal */\r\n private readonly _id: string | symbol;\r\n /** @internal */\r\n private _freeTextures: Record<string, BaseTexture[]> = {};\r\n /** @internal */\r\n private readonly _allocatedTextures: WeakMap<\r\n BaseTexture,\r\n { hash: string; refcount: number; dispose: boolean }\r\n > = new WeakMap();\r\n /** @internal */\r\n private readonly _autoReleaseTextures: Set<BaseTexture> = new Set();\r\n /** @internal */\r\n private _freeFramebuffers: Record<string, FrameBuffer[]> = {};\r\n /** @internal */\r\n private readonly _allocatedFramebuffers: WeakMap<FrameBuffer, { hash: string; refcount: number }> =\r\n new WeakMap();\r\n /** @internal */\r\n private readonly _autoReleaseFramebuffers: Set<FrameBuffer> = new Set();\r\n /**\r\n * Creates an instance of Pool class\r\n * @param device - Rendering device\r\n */\r\n constructor(device: AbstractDevice, id: string | symbol, memCostThreshold = 1024 * 1024 * 1024) {\r\n this._device = device;\r\n this._id = id;\r\n this._memCost = 0;\r\n this._memCostThreshold = memCostThreshold;\r\n this._freeTextures = {};\r\n this._allocatedTextures = new WeakMap();\r\n this._autoReleaseTextures = new Set();\r\n this._freeFramebuffers = {};\r\n this._allocatedFramebuffers = new WeakMap();\r\n this._autoReleaseFramebuffers = new Set();\r\n this._memCost = 0;\r\n }\r\n /**\r\n * Id for this pool\r\n */\r\n get id(): string | symbol {\r\n return this._id;\r\n }\r\n autoRelease(): void {\r\n // auto release objects\r\n for (const tex of this._autoReleaseTextures) {\r\n this.releaseTexture(tex);\r\n }\r\n this._autoReleaseTextures.clear();\r\n for (const fb of this._autoReleaseFramebuffers) {\r\n this.releaseFrameBuffer(fb);\r\n }\r\n this._autoReleaseFramebuffers.clear();\r\n // Free up video memory if memory usage is greater than specific value\r\n if (this._memCost >= this._memCostThreshold) {\r\n this.purge();\r\n }\r\n }\r\n /**\r\n * Fetch a temporal 2D texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - The format of the texture.\r\n * @param width - The width of the texture.\r\n * @param height - The height of the texture.\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched Texture2D object.\r\n */\r\n fetchTemporalTexture2D(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n mipmapping = false\r\n ): Texture2D {\r\n const hash = `2d:${format}:${width}:${height}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createTexture2D(format, width, height, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as Texture2D;\r\n }\r\n /**\r\n * Fetch a temporal 2D array texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - Format of the texture.\r\n * @param width - Width of the texture.\r\n * @param height - Height of the texture.\r\n * @param numLayers - Layer count of the texture\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched Texture2DArray object.\r\n */\r\n fetchTemporalTexture2DArray(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n numLayers: number,\r\n mipmapping = false\r\n ): Texture2DArray {\r\n const hash = `2darray:${format}:${width}:${height}:${numLayers}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createTexture2DArray(format, width, height, numLayers, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as Texture2DArray;\r\n }\r\n /**\r\n * Fetch a temporal Cube texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - Format of the texture.\r\n * @param size - size of the texture.\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched TextureCube object.\r\n */\r\n fetchTemporalTextureCube(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n size: number,\r\n mipmapping = false\r\n ): TextureCube {\r\n const hash = `cube:${format}:${size}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createCubeTexture(format, size, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as TextureCube;\r\n }\r\n /**\r\n * Creates a temporal framebuffer from the object pool.\r\n * @param autoRelease - Whether the framebuffer should be automatically released at the next frame.\r\n * @param width - Width of the framebuffer\r\n * @param height - Height of the framebuffer\r\n * @param colorAttachments - Array of color attachments or texture format of the framebuffer.\r\n * @param depthAttachment - Depth attachment or texture format of the framebuffer.\r\n * @param mipmapping - Whether mipmapping should be enabled when creating color attachment textures, default is false.\r\n * @param sampleCount - The sample count for the framebuffer, default is 1.\r\n * @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.\r\n * @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0\r\n * @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0\r\n * @param attachmentLayer - The texture layer to which the color attachment will render, default is 0\r\n * @returns The fetched FrameBuffer object.\r\n */\r\n fetchTemporalFramebuffer<T extends BaseTexture<unknown>>(\r\n autoRelease: boolean,\r\n width: number,\r\n height: number,\r\n colorTexOrFormat: MaybeArray<TextureFormat | T>,\r\n depthTexOrFormat: TextureFormat | T = null,\r\n mipmapping = false,\r\n sampleCount = 1,\r\n ignoreDepthStencil = true,\r\n attachmentMipLevel = 0,\r\n attachmentCubeface = 0,\r\n attachmentLayer = 0\r\n ): FrameBuffer {\r\n const colors = Array.isArray(colorTexOrFormat)\r\n ? colorTexOrFormat\r\n : colorTexOrFormat\r\n ? [colorTexOrFormat]\r\n : [];\r\n const colorAttachments = colors.map((val) => {\r\n return typeof val === 'string'\r\n ? this.fetchTemporalTexture2D(false, val, width, height, mipmapping)\r\n : val;\r\n });\r\n const depthAttachment =\r\n typeof depthTexOrFormat === 'string'\r\n ? this.fetchTemporalTexture2D(false, depthTexOrFormat, width, height, false)\r\n : depthTexOrFormat;\r\n const fb = this.createTemporalFramebuffer(\r\n autoRelease,\r\n colorAttachments,\r\n depthAttachment,\r\n sampleCount,\r\n ignoreDepthStencil,\r\n attachmentMipLevel,\r\n attachmentCubeface,\r\n attachmentLayer\r\n );\r\n for (let i = 0; i < colors.length; i++) {\r\n if (typeof colors[i] === 'string') {\r\n this.releaseTexture(colorAttachments[i]);\r\n }\r\n }\r\n if (typeof depthTexOrFormat === 'string') {\r\n this.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /**\r\n * Creates a temporal framebuffer from the object pool.\r\n * @param autoRelease - Whether the framebuffer should be automatically released at the next frame.\r\n * @param colorAttachments - Array of color attachments for the framebuffer.\r\n * @param depthAttachment - Depth attachment for the framebuffer.\r\n * @param sampleCount - The sample count for the framebuffer, default is 1.\r\n * @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.\r\n * @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0.\r\n * @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0.\r\n * @param attachmentLayer - The texture layer to which the color attachment will render, default is 0.\r\n * @returns The fetched FrameBuffer object.\r\n */\r\n createTemporalFramebuffer(\r\n autoRelease: boolean,\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: BaseTexture = null,\r\n sampleCount = 1,\r\n ignoreDepthStencil = true,\r\n attachmentMipLevel = 0,\r\n attachmentCubeface = 0,\r\n attachmentLayer = 0\r\n ): FrameBuffer {\r\n colorAttachments = colorAttachments ?? [];\r\n let hash = `${depthAttachment?.uid ?? 0}:${sampleCount ?? 1}:${ignoreDepthStencil ? 1 : 0}`;\r\n if (colorAttachments.length > 0) {\r\n hash += `:${attachmentMipLevel}:${attachmentCubeface}:${attachmentLayer}`;\r\n for (const tex of colorAttachments) {\r\n hash += `:${tex.uid}`;\r\n }\r\n }\r\n let fb: FrameBuffer = null;\r\n const list = this._freeFramebuffers[hash];\r\n if (!list) {\r\n fb = this._device.createFrameBuffer(colorAttachments, depthAttachment, {\r\n ignoreDepthStencil,\r\n sampleCount\r\n });\r\n for (let i = 0; i < fb.getColorAttachments().length; i++) {\r\n fb.setColorAttachmentMipLevel(i, attachmentMipLevel);\r\n fb.setColorAttachmentCubeFace(i, attachmentCubeface);\r\n fb.setColorAttachmentLayer(i, attachmentLayer);\r\n }\r\n } else {\r\n fb = list.pop();\r\n if (list.length === 0) {\r\n this._freeFramebuffers[hash] = undefined;\r\n }\r\n }\r\n // Mark referenced textures\r\n const info = this._allocatedTextures.get(depthAttachment);\r\n if (info) {\r\n info.refcount++;\r\n }\r\n for (const tex of colorAttachments) {\r\n const info = this._allocatedTextures.get(tex);\r\n if (info) {\r\n info.refcount++;\r\n }\r\n }\r\n this._allocatedFramebuffers.set(fb, { hash, refcount: 1 });\r\n if (autoRelease) {\r\n this._autoReleaseFramebuffers.add(fb);\r\n }\r\n return fb;\r\n }\r\n /**\r\n * Dispose a texture that is allocated from the object pool.\r\n * @param texture - The texture to dispose.\r\n */\r\n disposeTexture(texture: BaseTexture): void {\r\n this.safeReleaseTexture(texture, true);\r\n }\r\n /**\r\n * Release a texture back to the object pool.\r\n * @param texture - The texture to release.\r\n */\r\n releaseTexture(texture: BaseTexture): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (!info) {\r\n console.error(`ObjectPool.releaseTexture(): texture is not allocated from pool`);\r\n } else {\r\n this.safeReleaseTexture(texture);\r\n }\r\n }\r\n /**\r\n * Increment reference counter for given texture\r\n * @param texture - The texture to retain\r\n */\r\n retainTexture(texture: BaseTexture): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (!info) {\r\n console.error(`ObjectPool.retainTexture(): texture is not allocated from pool`);\r\n } else {\r\n info.refcount++;\r\n }\r\n }\r\n /**\r\n * Dispose a framebuffer that is allocated from the object pool.\r\n * @param fb - The framebuffer to dispose.\r\n */\r\n disposeFrameBuffer(fb: FrameBuffer): void {\r\n const hash = this._allocatedFramebuffers.get(fb);\r\n if (!hash) {\r\n console.error(`ObjectPool.disposeFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n this.internalDisposeFrameBuffer(fb);\r\n fb.dispose();\r\n }\r\n }\r\n /**\r\n * Release a framebuffer back to the object pool.\r\n * @param fb - The framebuffer to release.\r\n */\r\n releaseFrameBuffer(fb: FrameBuffer): void {\r\n const info = this._allocatedFramebuffers.get(fb);\r\n if (!info) {\r\n console.error(`ObjectPool.releaseFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n info.refcount--;\r\n if (info.refcount <= 0) {\r\n this.internalDisposeFrameBuffer(fb);\r\n const list = this._freeFramebuffers[info.hash];\r\n if (list) {\r\n list.push(fb);\r\n } else {\r\n this._freeFramebuffers[info.hash] = [fb];\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Increment reference counter for given framebuffer\r\n * @param fb - The framebuffer to retain\r\n */\r\n retainFrameBuffer(fb: FrameBuffer): void {\r\n const info = this._allocatedFramebuffers.get(fb);\r\n if (!info) {\r\n console.error(`ObjectPool.retainFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n info.refcount++;\r\n }\r\n }\r\n /**\r\n * Purge the object pool by disposing all free framebuffers and textures.\r\n */\r\n purge(): void {\r\n for (const k in this._freeFramebuffers) {\r\n const list = this._freeFramebuffers[k];\r\n if (list) {\r\n for (const fb of this._freeFramebuffers[k]) {\r\n this.internalDisposeFrameBuffer(fb);\r\n fb.dispose();\r\n }\r\n }\r\n }\r\n this._freeFramebuffers = {};\r\n for (const k in this._freeTextures) {\r\n const list = this._freeTextures[k];\r\n for (const tex of list) {\r\n this._memCost -= tex.memCost;\r\n tex.dispose();\r\n }\r\n }\r\n this._freeTextures = {};\r\n }\r\n /** @internal */\r\n private internalDisposeFrameBuffer(fb: FrameBuffer): void {\r\n if (fb) {\r\n // Release attachment textures\r\n const colorAttachments = fb.getColorAttachments();\r\n if (colorAttachments) {\r\n for (const tex of colorAttachments) {\r\n this.safeReleaseTexture(tex);\r\n }\r\n }\r\n const depthAttachment = fb.getDepthAttachment();\r\n if (depthAttachment) {\r\n this.safeReleaseTexture(depthAttachment);\r\n }\r\n this._allocatedFramebuffers.delete(fb);\r\n this._autoReleaseFramebuffers.delete(fb);\r\n }\r\n }\r\n /** @internal */\r\n private safeReleaseTexture(texture: BaseTexture, purge = false): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (info) {\r\n info.refcount--;\r\n if (info.refcount <= 0) {\r\n this._allocatedTextures.delete(texture);\r\n this._autoReleaseTextures.delete(texture);\r\n if (purge || info.dispose) {\r\n this._memCost -= texture.memCost;\r\n texture.dispose();\r\n } else {\r\n const list = this._freeTextures[info.hash];\r\n if (list) {\r\n list.push(texture);\r\n } else {\r\n this._freeTextures[info.hash] = [texture];\r\n }\r\n }\r\n } else if (purge) {\r\n info.dispose = true;\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["Pool","_freeTextures","_allocatedTextures","WeakMap","_autoReleaseTextures","Set","_freeFramebuffers","_allocatedFramebuffers","_autoReleaseFramebuffers","device","id","memCostThreshold","_device","_id","_memCost","_memCostThreshold","autoRelease","tex","releaseTexture","clear","fb","releaseFrameBuffer","purge","fetchTemporalTexture2D","format","width","height","mipmapping","hash","texture","list","createTexture2D","memCost","pop","length","undefined","set","refcount","dispose","add","fetchTemporalTexture2DArray","numLayers","createTexture2DArray","fetchTemporalTextureCube","size","createCubeTexture","fetchTemporalFramebuffer","colorTexOrFormat","depthTexOrFormat","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","colors","Array","isArray","colorAttachments","map","val","depthAttachment","createTemporalFramebuffer","i","uid","createFrameBuffer","getColorAttachments","setColorAttachmentMipLevel","setColorAttachmentCubeFace","setColorAttachmentLayer","info","get","disposeTexture","safeReleaseTexture","console","error","retainTexture","disposeFrameBuffer","internalDisposeFrameBuffer","push","retainFrameBuffer","k","getDepthAttachment","delete"],"mappings":"AAIA;;;AAGC,IACM,MAAMA,IAAAA,CAAAA;qBAEX,QAAyB;qBAEzB,iBAA2C;qBAE3C,OAAyC;qBAEzC,GAAsC;AACtC,qBACQC,aAA+C,GAAA,EAAG;AAC1D,qBACiBC,kBAGb,GAAA,IAAIC,OAAU,EAAA;AAClB,qBACiBC,oBAAyC,GAAA,IAAIC,GAAM,EAAA;AACpE,qBACQC,iBAAmD,GAAA,EAAG;AAC9D,qBACiBC,sBACf,GAAA,IAAIJ,OAAU,EAAA;AAChB,qBACiBK,wBAA6C,GAAA,IAAIH,GAAM,EAAA;AACxE;;;MAIA,WAAA,CAAYI,MAAsB,EAAEC,EAAmB,EAAEC,gBAAmB,GAAA,IAAA,GAAO,IAAO,GAAA,IAAI,CAAE;QAC9F,IAAI,CAACC,OAAO,GAAGH,MAAAA;QACf,IAAI,CAACI,GAAG,GAAGH,EAAAA;QACX,IAAI,CAACI,QAAQ,GAAG,CAAA;QAChB,IAAI,CAACC,iBAAiB,GAAGJ,gBAAAA;QACzB,IAAI,CAACV,aAAa,GAAG,EAAC;QACtB,IAAI,CAACC,kBAAkB,GAAG,IAAIC,OAAAA,EAAAA;QAC9B,IAAI,CAACC,oBAAoB,GAAG,IAAIC,GAAAA,EAAAA;QAChC,IAAI,CAACC,iBAAiB,GAAG,EAAC;QAC1B,IAAI,CAACC,sBAAsB,GAAG,IAAIJ,OAAAA,EAAAA;QAClC,IAAI,CAACK,wBAAwB,GAAG,IAAIH,GAAAA,EAAAA;QACpC,IAAI,CAACS,QAAQ,GAAG,CAAA;AAClB;AACA;;AAEC,MACD,IAAIJ,EAAsB,GAAA;QACxB,OAAO,IAAI,CAACG,GAAG;AACjB;IACAG,WAAoB,GAAA;;AAElB,QAAA,KAAK,MAAMC,GAAAA,IAAO,IAAI,CAACb,oBAAoB,CAAE;YAC3C,IAAI,CAACc,cAAc,CAACD,GAAAA,CAAAA;AACtB;QACA,IAAI,CAACb,oBAAoB,CAACe,KAAK,EAAA;AAC/B,QAAA,KAAK,MAAMC,EAAAA,IAAM,IAAI,CAACZ,wBAAwB,CAAE;YAC9C,IAAI,CAACa,kBAAkB,CAACD,EAAAA,CAAAA;AAC1B;QACA,IAAI,CAACZ,wBAAwB,CAACW,KAAK,EAAA;;AAEnC,QAAA,IAAI,IAAI,CAACL,QAAQ,IAAI,IAAI,CAACC,iBAAiB,EAAE;AAC3C,YAAA,IAAI,CAACO,KAAK,EAAA;AACZ;AACF;AACA;;;;;;;;MASAC,sBAAAA,CACEP,WAAoB,EACpBQ,MAAqB,EACrBC,KAAa,EACbC,MAAc,EACdC,UAAa,GAAA,KAAK,EACP;AACX,QAAA,MAAMC,IAAO,GAAA,CAAC,GAAG,EAAEJ,OAAO,CAAC,EAAEC,KAAM,CAAA,CAAC,EAAEC,MAAO,CAAA,CAAC,EAAEC,UAAAA,GAAa,IAAI,CAAG,CAAA,CAAA;AACpE,QAAA,IAAIE,OAAuB,GAAA,IAAA;AAC3B,QAAA,MAAMC,IAAO,GAAA,IAAI,CAAC7B,aAAa,CAAC2B,IAAK,CAAA;AACrC,QAAA,IAAI,CAACE,IAAM,EAAA;YACTD,OAAU,GAAA,IAAI,CAACjB,OAAO,CAACmB,eAAe,CAACP,MAAAA,EAAQC,OAAOC,MAAQ,EAAA;AAAEC,gBAAAA;AAAW,aAAA,CAAA;AAC3E,YAAA,IAAI,CAACb,QAAQ,IAAIe,OAAAA,CAAQG,OAAO;SAC3B,MAAA;AACLH,YAAAA,OAAAA,GAAUC,KAAKG,GAAG,EAAA;YAClB,IAAIH,IAAAA,CAAKI,MAAM,KAAK,CAAG,EAAA;AACrB,gBAAA,IAAI,CAACjC,aAAa,CAAC2B,IAAAA,CAAK,GAAGO,SAAAA;AAC7B;AACF;AACA,QAAA,IAAI,CAACjC,kBAAkB,CAACkC,GAAG,CAACP,OAAS,EAAA;AAAED,YAAAA,IAAAA;YAAMS,QAAU,EAAA,CAAA;YAAGC,OAAS,EAAA;AAAM,SAAA,CAAA;AACzE,QAAA,IAAItB,WAAa,EAAA;AACf,YAAA,IAAI,CAACZ,oBAAoB,CAACmC,GAAG,CAACV,OAAAA,CAAAA;AAChC;QACA,OAAOA,OAAAA;AACT;AACA;;;;;;;;;AASC,MACDW,2BACExB,CAAAA,WAAoB,EACpBQ,MAAqB,EACrBC,KAAa,EACbC,MAAc,EACde,SAAiB,EACjBd,UAAAA,GAAa,KAAK,EACF;AAChB,QAAA,MAAMC,OAAO,CAAC,QAAQ,EAAEJ,MAAO,CAAA,CAAC,EAAEC,KAAM,CAAA,CAAC,EAAEC,MAAAA,CAAO,CAAC,EAAEe,SAAAA,CAAU,CAAC,EAAEd,UAAAA,GAAa,IAAI,CAAG,CAAA,CAAA;AACtF,QAAA,IAAIE,OAAuB,GAAA,IAAA;AAC3B,QAAA,MAAMC,IAAO,GAAA,IAAI,CAAC7B,aAAa,CAAC2B,IAAK,CAAA;AACrC,QAAA,IAAI,CAACE,IAAM,EAAA;YACTD,OAAU,GAAA,IAAI,CAACjB,OAAO,CAAC8B,oBAAoB,CAAClB,MAAAA,EAAQC,KAAOC,EAAAA,MAAAA,EAAQe,SAAW,EAAA;AAAEd,gBAAAA;AAAW,aAAA,CAAA;AAC3F,YAAA,IAAI,CAACb,QAAQ,IAAIe,OAAAA,CAAQG,OAAO;SAC3B,MAAA;AACLH,YAAAA,OAAAA,GAAUC,KAAKG,GAAG,EAAA;YAClB,IAAIH,IAAAA,CAAKI,MAAM,KAAK,CAAG,EAAA;AACrB,gBAAA,IAAI,CAACjC,aAAa,CAAC2B,IAAAA,CAAK,GAAGO,SAAAA;AAC7B;AACF;AACA,QAAA,IAAI,CAACjC,kBAAkB,CAACkC,GAAG,CAACP,OAAS,EAAA;AAAED,YAAAA,IAAAA;YAAMS,QAAU,EAAA,CAAA;YAAGC,OAAS,EAAA;AAAM,SAAA,CAAA;AACzE,QAAA,IAAItB,WAAa,EAAA;AACf,YAAA,IAAI,CAACZ,oBAAoB,CAACmC,GAAG,CAACV,OAAAA,CAAAA;AAChC;QACA,OAAOA,OAAAA;AACT;AACA;;;;;;;MAQAc,wBAAAA,CACE3B,WAAoB,EACpBQ,MAAqB,EACrBoB,IAAY,EACZjB,UAAa,GAAA,KAAK,EACL;AACb,QAAA,MAAMC,IAAO,GAAA,CAAC,KAAK,EAAEJ,MAAO,CAAA,CAAC,EAAEoB,IAAAA,CAAK,CAAC,EAAEjB,UAAa,GAAA,CAAA,GAAI,CAAG,CAAA,CAAA;AAC3D,QAAA,IAAIE,OAAuB,GAAA,IAAA;AAC3B,QAAA,MAAMC,IAAO,GAAA,IAAI,CAAC7B,aAAa,CAAC2B,IAAK,CAAA;AACrC,QAAA,IAAI,CAACE,IAAM,EAAA;AACTD,YAAAA,OAAAA,GAAU,IAAI,CAACjB,OAAO,CAACiC,iBAAiB,CAACrB,QAAQoB,IAAM,EAAA;AAAEjB,gBAAAA;AAAW,aAAA,CAAA;AACpE,YAAA,IAAI,CAACb,QAAQ,IAAIe,OAAAA,CAAQG,OAAO;SAC3B,MAAA;AACLH,YAAAA,OAAAA,GAAUC,KAAKG,GAAG,EAAA;YAClB,IAAIH,IAAAA,CAAKI,MAAM,KAAK,CAAG,EAAA;AACrB,gBAAA,IAAI,CAACjC,aAAa,CAAC2B,IAAAA,CAAK,GAAGO,SAAAA;AAC7B;AACF;AACA,QAAA,IAAI,CAACjC,kBAAkB,CAACkC,GAAG,CAACP,OAAS,EAAA;AAAED,YAAAA,IAAAA;YAAMS,QAAU,EAAA,CAAA;YAAGC,OAAS,EAAA;AAAM,SAAA,CAAA;AACzE,QAAA,IAAItB,WAAa,EAAA;AACf,YAAA,IAAI,CAACZ,oBAAoB,CAACmC,GAAG,CAACV,OAAAA,CAAAA;AAChC;QACA,OAAOA,OAAAA;AACT;AACA;;;;;;;;;;;;;;AAcC,MACDiB,wBACE9B,CAAAA,WAAoB,EACpBS,KAAa,EACbC,MAAc,EACdqB,gBAA+C,EAC/CC,gBAAAA,GAAsC,IAAI,EAC1CrB,UAAa,GAAA,KAAK,EAClBsB,WAAAA,GAAc,CAAC,EACfC,kBAAqB,GAAA,IAAI,EACzBC,kBAAAA,GAAqB,CAAC,EACtBC,kBAAqB,GAAA,CAAC,EACtBC,eAAAA,GAAkB,CAAC,EACN;AACb,QAAA,MAAMC,SAASC,KAAMC,CAAAA,OAAO,CAACT,gBAAAA,CAAAA,GACzBA,mBACAA,gBACE,GAAA;AAACA,YAAAA;AAAiB,SAAA,GAClB,EAAE;AACR,QAAA,MAAMU,gBAAmBH,GAAAA,MAAAA,CAAOI,GAAG,CAAC,CAACC,GAAAA,GAAAA;YACnC,OAAO,OAAOA,GAAQ,KAAA,QAAA,GAClB,IAAI,CAACpC,sBAAsB,CAAC,KAAOoC,EAAAA,GAAAA,EAAKlC,KAAOC,EAAAA,MAAAA,EAAQC,UACvDgC,CAAAA,GAAAA,GAAAA;AACN,SAAA,CAAA;AACA,QAAA,MAAMC,eACJ,GAAA,OAAOZ,gBAAqB,KAAA,QAAA,GACxB,IAAI,CAACzB,sBAAsB,CAAC,KAAOyB,EAAAA,gBAAAA,EAAkBvB,KAAOC,EAAAA,MAAAA,EAAQ,KACpEsB,CAAAA,GAAAA,gBAAAA;QACN,MAAM5B,EAAAA,GAAK,IAAI,CAACyC,yBAAyB,CACvC7C,WACAyC,EAAAA,gBAAAA,EACAG,eACAX,EAAAA,WAAAA,EACAC,kBACAC,EAAAA,kBAAAA,EACAC,kBACAC,EAAAA,eAAAA,CAAAA;AAEF,QAAA,IAAK,IAAIS,CAAI,GAAA,CAAA,EAAGA,IAAIR,MAAOpB,CAAAA,MAAM,EAAE4B,CAAK,EAAA,CAAA;AACtC,YAAA,IAAI,OAAOR,MAAM,CAACQ,CAAAA,CAAE,KAAK,QAAU,EAAA;AACjC,gBAAA,IAAI,CAAC5C,cAAc,CAACuC,gBAAgB,CAACK,CAAE,CAAA,CAAA;AACzC;AACF;QACA,IAAI,OAAOd,qBAAqB,QAAU,EAAA;YACxC,IAAI,CAAC9B,cAAc,CAAC0C,eAAAA,CAAAA;AACtB;QACA,OAAOxC,EAAAA;AACT;AACA;;;;;;;;;;;MAYAyC,yBAAAA,CACE7C,WAAoB,EACpByC,gBAA+B,EAC/BG,eAA+B,GAAA,IAAI,EACnCX,WAAAA,GAAc,CAAC,EACfC,qBAAqB,IAAI,EACzBC,qBAAqB,CAAC,EACtBC,qBAAqB,CAAC,EACtBC,eAAkB,GAAA,CAAC,EACN;AACbI,QAAAA,gBAAAA,GAAmBA,oBAAoB,EAAE;AACzC,QAAA,IAAI7B,IAAO,GAAA,CAAA,EAAGgC,eAAiBG,EAAAA,GAAAA,IAAO,CAAE,CAAA,CAAC,EAAEd,WAAAA,IAAe,CAAE,CAAA,CAAC,EAAEC,kBAAAA,GAAqB,IAAI,CAAG,CAAA,CAAA;QAC3F,IAAIO,gBAAAA,CAAiBvB,MAAM,GAAG,CAAG,EAAA;YAC/BN,IAAQ,IAAA,CAAC,CAAC,EAAEuB,kBAAAA,CAAmB,CAAC,EAAEC,kBAAAA,CAAmB,CAAC,EAAEC,eAAiB,CAAA,CAAA;YACzE,KAAK,MAAMpC,OAAOwC,gBAAkB,CAAA;AAClC7B,gBAAAA,IAAAA,IAAQ,CAAC,CAAC,EAAEX,GAAAA,CAAI8C,GAAG,CAAE,CAAA;AACvB;AACF;AACA,QAAA,IAAI3C,EAAkB,GAAA,IAAA;AACtB,QAAA,MAAMU,IAAO,GAAA,IAAI,CAACxB,iBAAiB,CAACsB,IAAK,CAAA;AACzC,QAAA,IAAI,CAACE,IAAM,EAAA;AACTV,YAAAA,EAAAA,GAAK,IAAI,CAACR,OAAO,CAACoD,iBAAiB,CAACP,kBAAkBG,eAAiB,EAAA;AACrEV,gBAAAA,kBAAAA;AACAD,gBAAAA;AACF,aAAA,CAAA;YACA,IAAK,IAAIa,IAAI,CAAGA,EAAAA,CAAAA,GAAI1C,GAAG6C,mBAAmB,EAAA,CAAG/B,MAAM,EAAE4B,CAAK,EAAA,CAAA;gBACxD1C,EAAG8C,CAAAA,0BAA0B,CAACJ,CAAGX,EAAAA,kBAAAA,CAAAA;gBACjC/B,EAAG+C,CAAAA,0BAA0B,CAACL,CAAGV,EAAAA,kBAAAA,CAAAA;gBACjChC,EAAGgD,CAAAA,uBAAuB,CAACN,CAAGT,EAAAA,eAAAA,CAAAA;AAChC;SACK,MAAA;AACLjC,YAAAA,EAAAA,GAAKU,KAAKG,GAAG,EAAA;YACb,IAAIH,IAAAA,CAAKI,MAAM,KAAK,CAAG,EAAA;AACrB,gBAAA,IAAI,CAAC5B,iBAAiB,CAACsB,IAAAA,CAAK,GAAGO,SAAAA;AACjC;AACF;;AAEA,QAAA,MAAMkC,OAAO,IAAI,CAACnE,kBAAkB,CAACoE,GAAG,CAACV,eAAAA,CAAAA;AACzC,QAAA,IAAIS,IAAM,EAAA;AACRA,YAAAA,IAAAA,CAAKhC,QAAQ,EAAA;AACf;QACA,KAAK,MAAMpB,OAAOwC,gBAAkB,CAAA;AAClC,YAAA,MAAMY,OAAO,IAAI,CAACnE,kBAAkB,CAACoE,GAAG,CAACrD,GAAAA,CAAAA;AACzC,YAAA,IAAIoD,IAAM,EAAA;AACRA,gBAAAA,IAAAA,CAAKhC,QAAQ,EAAA;AACf;AACF;AACA,QAAA,IAAI,CAAC9B,sBAAsB,CAAC6B,GAAG,CAAChB,EAAI,EAAA;AAAEQ,YAAAA,IAAAA;YAAMS,QAAU,EAAA;AAAE,SAAA,CAAA;AACxD,QAAA,IAAIrB,WAAa,EAAA;AACf,YAAA,IAAI,CAACR,wBAAwB,CAAC+B,GAAG,CAACnB,EAAAA,CAAAA;AACpC;QACA,OAAOA,EAAAA;AACT;AACA;;;MAIAmD,cAAAA,CAAe1C,OAAoB,EAAQ;QACzC,IAAI,CAAC2C,kBAAkB,CAAC3C,OAAS,EAAA,IAAA,CAAA;AACnC;AACA;;;MAIAX,cAAAA,CAAeW,OAAoB,EAAQ;AACzC,QAAA,MAAMwC,OAAO,IAAI,CAACnE,kBAAkB,CAACoE,GAAG,CAACzC,OAAAA,CAAAA;AACzC,QAAA,IAAI,CAACwC,IAAM,EAAA;AACTI,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,+DAA+D,CAAC,CAAA;SAC1E,MAAA;YACL,IAAI,CAACF,kBAAkB,CAAC3C,OAAAA,CAAAA;AAC1B;AACF;AACA;;;MAIA8C,aAAAA,CAAc9C,OAAoB,EAAQ;AACxC,QAAA,MAAMwC,OAAO,IAAI,CAACnE,kBAAkB,CAACoE,GAAG,CAACzC,OAAAA,CAAAA;AACzC,QAAA,IAAI,CAACwC,IAAM,EAAA;AACTI,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,8DAA8D,CAAC,CAAA;SACzE,MAAA;AACLL,YAAAA,IAAAA,CAAKhC,QAAQ,EAAA;AACf;AACF;AACA;;;MAIAuC,kBAAAA,CAAmBxD,EAAe,EAAQ;AACxC,QAAA,MAAMQ,OAAO,IAAI,CAACrB,sBAAsB,CAAC+D,GAAG,CAAClD,EAAAA,CAAAA;AAC7C,QAAA,IAAI,CAACQ,IAAM,EAAA;AACT6C,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,uEAAuE,CAAC,CAAA;SAClF,MAAA;YACL,IAAI,CAACG,0BAA0B,CAACzD,EAAAA,CAAAA;AAChCA,YAAAA,EAAAA,CAAGkB,OAAO,EAAA;AACZ;AACF;AACA;;;MAIAjB,kBAAAA,CAAmBD,EAAe,EAAQ;AACxC,QAAA,MAAMiD,OAAO,IAAI,CAAC9D,sBAAsB,CAAC+D,GAAG,CAAClD,EAAAA,CAAAA;AAC7C,QAAA,IAAI,CAACiD,IAAM,EAAA;AACTI,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,uEAAuE,CAAC,CAAA;SAClF,MAAA;AACLL,YAAAA,IAAAA,CAAKhC,QAAQ,EAAA;YACb,IAAIgC,IAAAA,CAAKhC,QAAQ,IAAI,CAAG,EAAA;gBACtB,IAAI,CAACwC,0BAA0B,CAACzD,EAAAA,CAAAA;AAChC,gBAAA,MAAMU,OAAO,IAAI,CAACxB,iBAAiB,CAAC+D,IAAAA,CAAKzC,IAAI,CAAC;AAC9C,gBAAA,IAAIE,IAAM,EAAA;AACRA,oBAAAA,IAAAA,CAAKgD,IAAI,CAAC1D,EAAAA,CAAAA;iBACL,MAAA;AACL,oBAAA,IAAI,CAACd,iBAAiB,CAAC+D,IAAKzC,CAAAA,IAAI,CAAC,GAAG;AAACR,wBAAAA;AAAG,qBAAA;AAC1C;AACF;AACF;AACF;AACA;;;MAIA2D,iBAAAA,CAAkB3D,EAAe,EAAQ;AACvC,QAAA,MAAMiD,OAAO,IAAI,CAAC9D,sBAAsB,CAAC+D,GAAG,CAAClD,EAAAA,CAAAA;AAC7C,QAAA,IAAI,CAACiD,IAAM,EAAA;AACTI,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,sEAAsE,CAAC,CAAA;SACjF,MAAA;AACLL,YAAAA,IAAAA,CAAKhC,QAAQ,EAAA;AACf;AACF;AACA;;AAEC,MACDf,KAAc,GAAA;AACZ,QAAA,IAAK,MAAM0D,CAAAA,IAAK,IAAI,CAAC1E,iBAAiB,CAAE;AACtC,YAAA,MAAMwB,IAAO,GAAA,IAAI,CAACxB,iBAAiB,CAAC0E,CAAE,CAAA;AACtC,YAAA,IAAIlD,IAAM,EAAA;AACR,gBAAA,KAAK,MAAMV,EAAM,IAAA,IAAI,CAACd,iBAAiB,CAAC0E,EAAE,CAAE;oBAC1C,IAAI,CAACH,0BAA0B,CAACzD,EAAAA,CAAAA;AAChCA,oBAAAA,EAAAA,CAAGkB,OAAO,EAAA;AACZ;AACF;AACF;QACA,IAAI,CAAChC,iBAAiB,GAAG,EAAC;AAC1B,QAAA,IAAK,MAAM0E,CAAAA,IAAK,IAAI,CAAC/E,aAAa,CAAE;AAClC,YAAA,MAAM6B,IAAO,GAAA,IAAI,CAAC7B,aAAa,CAAC+E,CAAE,CAAA;YAClC,KAAK,MAAM/D,OAAOa,IAAM,CAAA;AACtB,gBAAA,IAAI,CAAChB,QAAQ,IAAIG,GAAAA,CAAIe,OAAO;AAC5Bf,gBAAAA,GAAAA,CAAIqB,OAAO,EAAA;AACb;AACF;QACA,IAAI,CAACrC,aAAa,GAAG,EAAC;AACxB;AACA,qBACQ4E,0BAA2BzD,CAAAA,EAAe,EAAQ;AACxD,QAAA,IAAIA,EAAI,EAAA;;YAEN,MAAMqC,gBAAAA,GAAmBrC,GAAG6C,mBAAmB,EAAA;AAC/C,YAAA,IAAIR,gBAAkB,EAAA;gBACpB,KAAK,MAAMxC,OAAOwC,gBAAkB,CAAA;oBAClC,IAAI,CAACe,kBAAkB,CAACvD,GAAAA,CAAAA;AAC1B;AACF;YACA,MAAM2C,eAAAA,GAAkBxC,GAAG6D,kBAAkB,EAAA;AAC7C,YAAA,IAAIrB,eAAiB,EAAA;gBACnB,IAAI,CAACY,kBAAkB,CAACZ,eAAAA,CAAAA;AAC1B;AACA,YAAA,IAAI,CAACrD,sBAAsB,CAAC2E,MAAM,CAAC9D,EAAAA,CAAAA;AACnC,YAAA,IAAI,CAACZ,wBAAwB,CAAC0E,MAAM,CAAC9D,EAAAA,CAAAA;AACvC;AACF;AACA,qBACA,kBAAQoD,CAAmB3C,OAAoB,EAAEP,KAAAA,GAAQ,KAAK,EAAQ;AACpE,QAAA,MAAM+C,OAAO,IAAI,CAACnE,kBAAkB,CAACoE,GAAG,CAACzC,OAAAA,CAAAA;AACzC,QAAA,IAAIwC,IAAM,EAAA;AACRA,YAAAA,IAAAA,CAAKhC,QAAQ,EAAA;YACb,IAAIgC,IAAAA,CAAKhC,QAAQ,IAAI,CAAG,EAAA;AACtB,gBAAA,IAAI,CAACnC,kBAAkB,CAACgF,MAAM,CAACrD,OAAAA,CAAAA;AAC/B,gBAAA,IAAI,CAACzB,oBAAoB,CAAC8E,MAAM,CAACrD,OAAAA,CAAAA;gBACjC,IAAIP,KAAAA,IAAS+C,IAAK/B,CAAAA,OAAO,EAAE;AACzB,oBAAA,IAAI,CAACxB,QAAQ,IAAIe,OAAAA,CAAQG,OAAO;AAChCH,oBAAAA,OAAAA,CAAQS,OAAO,EAAA;iBACV,MAAA;AACL,oBAAA,MAAMR,OAAO,IAAI,CAAC7B,aAAa,CAACoE,IAAAA,CAAKzC,IAAI,CAAC;AAC1C,oBAAA,IAAIE,IAAM,EAAA;AACRA,wBAAAA,IAAAA,CAAKgD,IAAI,CAACjD,OAAAA,CAAAA;qBACL,MAAA;AACL,wBAAA,IAAI,CAAC5B,aAAa,CAACoE,IAAKzC,CAAAA,IAAI,CAAC,GAAG;AAACC,4BAAAA;AAAQ,yBAAA;AAC3C;AACF;AACF,aAAA,MAAO,IAAIP,KAAO,EAAA;AAChB+C,gBAAAA,IAAAA,CAAK/B,OAAO,GAAG,IAAA;AACjB;AACF;AACF;AACF;;;;"}
package/dist/timer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"timer.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"timer.js","sources":["../src/timer.ts"],"sourcesContent":["/**\r\n * Abstract timer interface\r\n * @public\r\n */\r\nexport interface ITimer {\r\n begin(): void;\r\n end(): void;\r\n ended(): boolean;\r\n elapsed(): number;\r\n}\r\n\r\n/**\r\n * CPU timer class\r\n * @public\r\n */\r\nexport class CPUTimer implements ITimer {\r\n /** @internal */\r\n private readonly _cpuTimer: Performance | DateConstructor;\r\n /** @internal */\r\n private _cpuStart: number;\r\n /** @internal */\r\n private _cpuTime: number;\r\n /** @internal */\r\n private _ended: boolean;\r\n constructor() {\r\n this._cpuTimer = window.performance || window.Date;\r\n this._cpuTime = null;\r\n this._ended = false;\r\n }\r\n now(): number {\r\n return this._cpuTimer.now();\r\n }\r\n begin(): void {\r\n this._cpuStart = this.now();\r\n this._cpuTime = null;\r\n this._ended = false;\r\n }\r\n end(): void {\r\n this._cpuTime = this.now() - this._cpuStart;\r\n this._ended = true;\r\n }\r\n ended(): boolean {\r\n return this._ended;\r\n }\r\n elapsed(): number {\r\n return this._cpuTime;\r\n }\r\n}\r\n"],"names":["CPUTimer","_cpuTimer","window","performance","Date","_cpuTime","_ended","now","begin","_cpuStart","end","ended","elapsed"],"mappings":"AAAA;;;;;;AAcC,IACM,MAAMA,QAAAA,CAAAA;qBAEX,SAA0D;qBAE1D,SAA0B;qBAE1B,QAAyB;qBAEzB,MAAwB;IACxB,WAAc,EAAA;AACZ,QAAA,IAAI,CAACC,SAAS,GAAGC,OAAOC,WAAW,IAAID,OAAOE,IAAI;QAClD,IAAI,CAACC,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAC,GAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAACN,SAAS,CAACM,GAAG,EAAA;AAC3B;IACAC,KAAc,GAAA;AACZ,QAAA,IAAI,CAACC,SAAS,GAAG,IAAI,CAACF,GAAG,EAAA;QACzB,IAAI,CAACF,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAI,GAAY,GAAA;QACV,IAAI,CAACL,QAAQ,GAAG,IAAI,CAACE,GAAG,EAAA,GAAK,IAAI,CAACE,SAAS;QAC3C,IAAI,CAACH,MAAM,GAAG,IAAA;AAChB;IACAK,KAAiB,GAAA;QACf,OAAO,IAAI,CAACL,MAAM;AACpB;IACAM,OAAkB,GAAA;QAChB,OAAO,IAAI,CAACP,QAAQ;AACtB;AACF;;;;"}
@@ -14,7 +14,7 @@ import { PBPrimitiveType } from './builder/types.js';
14
14
  * @param layout - Layout of the structure
15
15
  * @param buffer - Buffer that holds the data
16
16
  */ constructor(layout, buffer){
17
- this._size = layout.byteSize + 15 & ~15;
17
+ this._size = layout.byteSize + 15 & -16;
18
18
  if (this._size <= 0) {
19
19
  throw new Error(`UniformBuffer(): invalid uniform buffer byte size: ${this._size}`);
20
20
  }
@@ -48,7 +48,7 @@ import { PBPrimitiveType } from './builder/types.js';
48
48
  } else if (value?._v) {
49
49
  view.set(value._v);
50
50
  } else if (typeof value?.length === 'number') {
51
- view.set(value);
51
+ view.set(value.length > view.length ? value.subarray(0, view.length) : value);
52
52
  } else {
53
53
  throw new Error('invalid uniform value');
54
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uniformdata.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"uniformdata.js","sources":["../src/uniformdata.ts"],"sourcesContent":["import { PBPrimitiveType } from './builder/types';\r\nimport type { TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\r\nimport type { StructuredValue, UniformBufferLayout, StructuredBuffer } from './gpuobject';\r\n\r\n/**\r\n * Structured buffer data\r\n * @public\r\n */\r\nexport class StructuredBufferData {\r\n /** @internal */\r\n protected _cache: ArrayBuffer;\r\n /** @internal */\r\n protected _buffer: StructuredBuffer;\r\n /** @internal */\r\n protected _size: number;\r\n /** @internal */\r\n protected _uniformMap: Record<string, TypedArray>;\r\n /** @internal */\r\n protected _uniformPositions: Record<string, [number, number]>;\r\n /**\r\n * Creates a new structured buffer data\r\n * @param layout - Layout of the structure\r\n * @param buffer - Buffer that holds the data\r\n */\r\n constructor(layout: UniformBufferLayout, buffer?: StructuredBuffer | ArrayBuffer) {\r\n this._size = (layout.byteSize + 15) & ~15;\r\n if (this._size <= 0) {\r\n throw new Error(`UniformBuffer(): invalid uniform buffer byte size: ${this._size}`);\r\n }\r\n // this._cache = new ArrayBuffer(size);\r\n this._uniformMap = {};\r\n this._uniformPositions = {};\r\n this._cache = buffer instanceof ArrayBuffer ? buffer : null;\r\n this._buffer = buffer instanceof ArrayBuffer ? null : buffer;\r\n this.init(layout, 0, '');\r\n }\r\n /** The buffer size in bytes */\r\n get byteLength(): number {\r\n return this._size;\r\n }\r\n /** Get the data cache buffer */\r\n get buffer(): ArrayBuffer {\r\n return this._cache;\r\n }\r\n /** Get all the uniform datas */\r\n get uniforms(): Record<string, TypedArray> {\r\n return this._uniformMap;\r\n }\r\n /**\r\n * Sets the value of a structure member\r\n * @param name - Name of the member\r\n * @param value - Value to set\r\n */\r\n set(name: string, value: StructuredValue): void {\r\n if (value !== undefined) {\r\n const view = this._uniformMap[name];\r\n if (view) {\r\n if (this._cache) {\r\n if (typeof value === 'number') {\r\n view[0] = value;\r\n } else if ((value as any)?._v) {\r\n view.set((value as any)._v);\r\n } else if (typeof (value as any)?.length === 'number') {\r\n view.set(\r\n (value as TypedArray).length > view.length\r\n ? (value as TypedArray).subarray(0, view.length)\r\n : (value as TypedArray)\r\n );\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n } else {\r\n const size = this._uniformPositions[name][1];\r\n if (typeof value === 'number') {\r\n view[0] = value;\r\n this._buffer.bufferSubData(this._uniformPositions[name][0], view);\r\n } else if (value['BYTES_PER_ELEMENT'] && size <= (value['byteLength'] as number)) {\r\n const arr = value as TypedArray;\r\n this._buffer.bufferSubData(\r\n this._uniformPositions[name][0],\r\n arr,\r\n 0,\r\n (size / arr.BYTES_PER_ELEMENT) >> 0\r\n );\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n }\r\n } else {\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto === Object.getPrototypeOf({})) {\r\n this.setStruct(name, value);\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private setStruct(name: string, value: any): void {\r\n for (const k in value) {\r\n this.set(`${name}.${k}`, value[k]);\r\n }\r\n }\r\n /** @internal */\r\n private init(layout: UniformBufferLayout, offset: number, prefix: string): number {\r\n for (const entry of layout.entries) {\r\n if (entry.subLayout) {\r\n offset = this.init(entry.subLayout, offset, `${prefix}${entry.name}.`);\r\n } else {\r\n const name = `${prefix}${entry.name}`;\r\n if (this._uniformPositions[name]) {\r\n throw new Error(`UniformBuffer(): duplicate uniform name: ${name}`);\r\n }\r\n if (entry.offset < offset || entry.byteSize < 0) {\r\n throw new Error('UniformBuffer(): invalid layout');\r\n }\r\n this._uniformPositions[name] = [entry.offset, entry.byteSize];\r\n let viewCtor: TypedArrayConstructor = null;\r\n switch (entry.type) {\r\n case PBPrimitiveType.F32:\r\n viewCtor = Float32Array;\r\n break;\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.BOOL:\r\n viewCtor = Uint32Array;\r\n break;\r\n case PBPrimitiveType.I32:\r\n viewCtor = Int32Array;\r\n break;\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM:\r\n case PBPrimitiveType.F16:\r\n viewCtor = Uint16Array;\r\n break;\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM:\r\n viewCtor = Int16Array;\r\n break;\r\n case PBPrimitiveType.U8:\r\n case PBPrimitiveType.U8_NORM:\r\n viewCtor = Uint8Array;\r\n break;\r\n case PBPrimitiveType.I8:\r\n case PBPrimitiveType.I8_NORM:\r\n viewCtor = Int8Array;\r\n break;\r\n }\r\n if (!viewCtor) {\r\n throw new Error(`UniformBuffer(): invalid data type for uniform: ${name}`);\r\n }\r\n if (entry.byteSize % viewCtor.BYTES_PER_ELEMENT) {\r\n throw new Error(`UniformBuffer(): invalid byte size for uniform: ${name}`);\r\n }\r\n if (this._cache) {\r\n this._uniformMap[name] = new viewCtor(\r\n this._cache,\r\n entry.offset,\r\n entry.byteSize / viewCtor.BYTES_PER_ELEMENT\r\n );\r\n } else {\r\n this._uniformMap[name] = new viewCtor(1);\r\n }\r\n offset = entry.offset + entry.byteSize;\r\n }\r\n }\r\n return offset;\r\n }\r\n}\r\n"],"names":["StructuredBufferData","layout","buffer","_size","byteSize","Error","_uniformMap","_uniformPositions","_cache","ArrayBuffer","_buffer","init","byteLength","uniforms","set","name","value","undefined","view","_v","length","subarray","size","bufferSubData","arr","BYTES_PER_ELEMENT","proto","Object","getPrototypeOf","setStruct","k","offset","prefix","entry","entries","subLayout","viewCtor","type","PBPrimitiveType","F32","Float32Array","U32","BOOL","Uint32Array","I32","Int32Array","U16","U16_NORM","F16","Uint16Array","I16","I16_NORM","Int16Array","U8","U8_NORM","Uint8Array","I8","I8_NORM","Int8Array"],"mappings":"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"}
@@ -7,6 +7,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
7
7
  /** @internal */ _vertexBuffers;
8
8
  /** @internal */ _indexBuffer;
9
9
  /** @internal */ _drawOffset;
10
+ /** @internal */ _numVertices;
10
11
  constructor(){
11
12
  this._vertexBuffers = [];
12
13
  for(let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++){
@@ -14,6 +15,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
14
15
  }
15
16
  this._indexBuffer = null;
16
17
  this._drawOffset = 0;
18
+ this._numVertices = 0;
17
19
  }
18
20
  /**
19
21
  * Creates a new instance of VertexData by copying from this object
@@ -23,6 +25,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
23
25
  newVertexData._vertexBuffers = this._vertexBuffers.slice();
24
26
  newVertexData._indexBuffer = this._indexBuffer;
25
27
  newVertexData._drawOffset = this._drawOffset;
28
+ newVertexData.calcNumVertices();
26
29
  return newVertexData;
27
30
  }
28
31
  /** Vertex buffer information list */ get vertexBuffers() {
@@ -31,12 +34,16 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
31
34
  /** Index buffer */ get indexBuffer() {
32
35
  return this._indexBuffer;
33
36
  }
37
+ /** Number of vertices */ get numVertices() {
38
+ return this._numVertices;
39
+ }
34
40
  /** Draw offset */ getDrawOffset() {
35
41
  return this._drawOffset;
36
42
  }
37
43
  setDrawOffset(offset) {
38
44
  if (offset !== this._drawOffset) {
39
45
  this._drawOffset = offset;
46
+ this.calcNumVertices();
40
47
  }
41
48
  }
42
49
  /**
@@ -65,7 +72,10 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
65
72
  * @param stepMode - Step mode of the buffer
66
73
  * @returns The buffer that was set
67
74
  */ setVertexBuffer(buffer, stepMode) {
68
- if (!buffer || !(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {
75
+ if (!buffer) {
76
+ return null;
77
+ }
78
+ if (!(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {
69
79
  throw new Error('setVertexBuffer() failed: buffer is null or buffer has not Vertex usage flag');
70
80
  }
71
81
  stepMode = stepMode || 'vertex';
@@ -97,6 +107,9 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
97
107
  removed = true;
98
108
  }
99
109
  }
110
+ if (removed) {
111
+ this.calcNumVertices();
112
+ }
100
113
  return removed;
101
114
  }
102
115
  /**
@@ -109,6 +122,18 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
109
122
  }
110
123
  return buffer;
111
124
  }
125
+ /** @internal */ calcNumVertices() {
126
+ this._numVertices = 0;
127
+ for(let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++){
128
+ const info = this._vertexBuffers[i];
129
+ if (info && info.stepMode !== 'instance') {
130
+ const n = Math.floor(info.buffer.byteLength / info.stride);
131
+ if (n > this._numVertices) {
132
+ this._numVertices = n;
133
+ }
134
+ }
135
+ }
136
+ }
112
137
  /** @internal */ internalSetVertexBuffer(loc, buffer, offset, stepMode) {
113
138
  if (loc < 0 || loc >= MAX_VERTEX_ATTRIBUTES) {
114
139
  throw new Error(`setVertexBuffer() failed: location out of bounds: ${loc}`);
@@ -125,6 +150,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
125
150
  drawOffset: 0,
126
151
  stepMode: stepMode
127
152
  };
153
+ this.calcNumVertices();
128
154
  return buffer;
129
155
  }
130
156
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"vertexdata.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"vertexdata.js","sources":["../src/vertexdata.ts"],"sourcesContent":["import type { StructuredBuffer, IndexBuffer, VertexStepMode, VertexSemantic } from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n MAX_VERTEX_ATTRIBUTES,\r\n getVertexAttribByName,\r\n getVertexBufferStride,\r\n getVertexBufferAttribType\r\n} from './gpuobject';\r\nimport type { PBArrayTypeInfo, PBPrimitiveTypeInfo } from './builder/types';\r\n\r\n/**\r\n * Vertex buffer information\r\n * @public\r\n */\r\nexport type VertexBufferInfo = {\r\n buffer: StructuredBuffer;\r\n offset: number;\r\n stride: number;\r\n drawOffset: number;\r\n type: PBPrimitiveTypeInfo;\r\n stepMode: VertexStepMode;\r\n};\r\n\r\n/**\r\n * The vertex data class\r\n * @public\r\n */\r\nexport class VertexData {\r\n /** @internal */\r\n private _vertexBuffers: VertexBufferInfo[];\r\n /** @internal */\r\n private _indexBuffer: IndexBuffer;\r\n /** @internal */\r\n private _drawOffset: number;\r\n /** @internal */\r\n private _numVertices: number;\r\n constructor() {\r\n this._vertexBuffers = [];\r\n for (let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++) {\r\n this._vertexBuffers.push(null);\r\n }\r\n this._indexBuffer = null;\r\n this._drawOffset = 0;\r\n this._numVertices = 0;\r\n }\r\n /**\r\n * Creates a new instance of VertexData by copying from this object\r\n * @returns New instance of VertexData\r\n */\r\n clone(): VertexData {\r\n const newVertexData = new VertexData();\r\n newVertexData._vertexBuffers = this._vertexBuffers.slice();\r\n newVertexData._indexBuffer = this._indexBuffer;\r\n newVertexData._drawOffset = this._drawOffset;\r\n newVertexData.calcNumVertices();\r\n return newVertexData;\r\n }\r\n /** Vertex buffer information list */\r\n get vertexBuffers(): VertexBufferInfo[] {\r\n return this._vertexBuffers;\r\n }\r\n /** Index buffer */\r\n get indexBuffer(): IndexBuffer {\r\n return this._indexBuffer;\r\n }\r\n /** Number of vertices */\r\n get numVertices() {\r\n return this._numVertices;\r\n }\r\n /** Draw offset */\r\n getDrawOffset(): number {\r\n return this._drawOffset;\r\n }\r\n setDrawOffset(offset: number): void {\r\n if (offset !== this._drawOffset) {\r\n this._drawOffset = offset;\r\n this.calcNumVertices();\r\n }\r\n }\r\n /**\r\n * Gets the vertex buffer by specific vertex semantic\r\n * @param semantic - The vertex semantic\r\n * @returns Vertex buffer of the given semantic\r\n */\r\n getVertexBuffer(semantic: VertexSemantic): StructuredBuffer {\r\n return this._vertexBuffers[getVertexAttribByName(semantic)]?.buffer ?? null;\r\n }\r\n /**\r\n * Gets the vertex buffer information by specific vertex semantic\r\n * @param semantic - The vertex semantic\r\n * @returns Vertex buffer information of the given semantic\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic): VertexBufferInfo {\r\n return this._vertexBuffers[getVertexAttribByName(semantic)] ?? null;\r\n }\r\n /**\r\n * Gets the index buffer\r\n * @returns The index buffer\r\n */\r\n getIndexBuffer(): IndexBuffer {\r\n return this._indexBuffer || null;\r\n }\r\n /**\r\n * Sets a vertex buffer\r\n * @param buffer - The vertex buffer object\r\n * @param stepMode - Step mode of the buffer\r\n * @returns The buffer that was set\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode): StructuredBuffer {\r\n if (!buffer) {\r\n return null;\r\n }\r\n if (!(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {\r\n throw new Error('setVertexBuffer() failed: buffer is null or buffer has not Vertex usage flag');\r\n }\r\n stepMode = stepMode || 'vertex';\r\n const vertexType = (buffer.structure.structMembers[0].type as PBArrayTypeInfo).elementType;\r\n if (vertexType.isStructType()) {\r\n let offset = 0;\r\n for (const attrib of vertexType.structMembers) {\r\n const loc = getVertexAttribByName(attrib.name as VertexSemantic);\r\n this.internalSetVertexBuffer(loc, buffer, offset, stepMode);\r\n offset += attrib.size;\r\n }\r\n } else {\r\n const loc = getVertexAttribByName(buffer.structure.structMembers[0].name as VertexSemantic);\r\n this.internalSetVertexBuffer(loc, buffer, 0, stepMode);\r\n }\r\n return buffer;\r\n }\r\n /**\r\n * Removes a vertex buffer\r\n * @param buffer - Vertex buffer to be removed\r\n * @returns true if the buffer was successfully removed, otherwise false\r\n */\r\n removeVertexBuffer(buffer: StructuredBuffer): boolean {\r\n let removed = false;\r\n for (let loc = 0; loc < this._vertexBuffers.length; loc++) {\r\n const info = this._vertexBuffers[loc];\r\n const remove = info?.buffer === buffer;\r\n if (remove) {\r\n this._vertexBuffers[loc] = null;\r\n removed = true;\r\n }\r\n }\r\n if (removed) {\r\n this.calcNumVertices();\r\n }\r\n return removed;\r\n }\r\n /**\r\n * Sets the index buffer\r\n * @param buffer - Index buffer to be set\r\n * @returns The index buffer that was set\r\n */\r\n setIndexBuffer(buffer: IndexBuffer): IndexBuffer {\r\n if (buffer !== this._indexBuffer) {\r\n this._indexBuffer = buffer || null;\r\n }\r\n return buffer;\r\n }\r\n /** @internal */\r\n private calcNumVertices() {\r\n this._numVertices = 0;\r\n for (let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++) {\r\n const info = this._vertexBuffers[i];\r\n if (info && info.stepMode !== 'instance') {\r\n const n = Math.floor(info.buffer.byteLength / info.stride);\r\n if (n > this._numVertices) {\r\n this._numVertices = n;\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private internalSetVertexBuffer(\r\n loc: number,\r\n buffer: StructuredBuffer,\r\n offset?: number,\r\n stepMode?: VertexStepMode\r\n ): StructuredBuffer {\r\n if (loc < 0 || loc >= MAX_VERTEX_ATTRIBUTES) {\r\n throw new Error(`setVertexBuffer() failed: location out of bounds: ${loc}`);\r\n }\r\n offset = Number(offset) || 0;\r\n stepMode = stepMode || 'vertex';\r\n const old = this._vertexBuffers[loc];\r\n if (!old || old.buffer !== buffer || old.offset !== offset || old.stepMode !== stepMode) {\r\n this._vertexBuffers[loc] = {\r\n buffer: buffer,\r\n offset: offset,\r\n type: getVertexBufferAttribType(buffer.structure, loc),\r\n stride: getVertexBufferStride(buffer.structure),\r\n drawOffset: 0,\r\n stepMode: stepMode\r\n };\r\n this.calcNumVertices();\r\n return buffer;\r\n }\r\n return null;\r\n }\r\n}\r\n"],"names":["VertexData","_vertexBuffers","i","MAX_VERTEX_ATTRIBUTES","push","_indexBuffer","_drawOffset","_numVertices","clone","newVertexData","slice","calcNumVertices","vertexBuffers","indexBuffer","numVertices","getDrawOffset","setDrawOffset","offset","getVertexBuffer","semantic","getVertexAttribByName","buffer","getVertexBufferInfo","getIndexBuffer","setVertexBuffer","stepMode","usage","GPUResourceUsageFlags","BF_VERTEX","Error","vertexType","structure","structMembers","type","elementType","isStructType","attrib","loc","name","internalSetVertexBuffer","size","removeVertexBuffer","removed","length","info","remove","setIndexBuffer","n","Math","floor","byteLength","stride","Number","old","getVertexBufferAttribType","getVertexBufferStride","drawOffset"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zephyr3d/device",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Device API for zephyr3d",
5
5
  "homepage": "https://github.com/gavinyork/zephyr3d#readme",
6
6
  "type": "module",
@@ -38,29 +38,44 @@
38
38
  "devDependencies": {
39
39
  "@babel/core": "^7.20.12",
40
40
  "@babel/preset-env": "^7.20.2",
41
- "@rollup/plugin-babel": "^6.0.3",
42
- "@rollup/plugin-node-resolve": "^15.0.1",
43
- "@rollup/plugin-strip": "^3.0.2",
44
- "@rollup/plugin-terser": "^0.4.0",
45
- "@rollup/pluginutils": "^5.0.2",
46
- "@swc/core": "^1.3.62",
47
- "cross-env": "^7.0.3",
48
- "rollup": "^3.15.0",
41
+ "@rollup/plugin-node-resolve": "~16.0.0",
42
+ "@rollup/plugin-strip": "~3.0.4",
43
+ "@rollup/plugin-terser": "~0.4.4",
44
+ "@rollup/pluginutils": "~5.1.4",
45
+ "rollup": "~4.30.1",
46
+ "rollup-plugin-dts": "~6.1.1",
49
47
  "rollup-plugin-copy": "^3.4.0",
50
- "rollup-plugin-dts": "^5.2.0",
51
- "rollup-plugin-swc3": "^0.8.2",
52
48
  "rollup-plugin-typescript2": "^0.34.1",
49
+ "@swc/core": "^1.3.62",
50
+ "rollup-plugin-swc3": "~0.12.1",
53
51
  "shx": "^0.3.4",
54
- "typescript": "^5.1.3"
52
+ "cross-env": "^7.0.3",
53
+ "typescript": "^5.7.3",
54
+ "eslint": "~9.38.0",
55
+ "@eslint/js": "~9.38.0",
56
+ "@typescript-eslint/parser": "~8.46.1",
57
+ "@typescript-eslint/eslint-plugin": "~8.46.1",
58
+ "prettier": "~3.6.2",
59
+ "eslint-plugin-prettier": "~5.5.4",
60
+ "eslint-config-prettier": "~10.1.8",
61
+ "eslint-plugin-import": "~2.32.0",
62
+ "eslint-import-resolver-typescript": "~4.4.4",
63
+ "eslint-plugin-tsdoc": "~0.4.0",
64
+ "globals": "^16.4.0",
65
+ "eslint-formatter-compact": "~8.40.0"
55
66
  },
56
67
  "dependencies": {
57
- "@zephyr3d/base": "^0.1.5",
58
- "@webgpu/types": "^0.1.40",
59
- "@types/node": "^18.13.0"
68
+ "@zephyr3d/base": "^0.2.0",
69
+ "@webgpu/types": "^0.1.65",
70
+ "@types/node": "^22.12.0",
71
+ "@rollup/plugin-commonjs": "~28.0.2",
72
+ "rollup-plugin-import-css": "~3.5.8"
60
73
  },
61
74
  "scripts": {
62
75
  "clean": "shx rm -rf ./dist .tsbuildinfo",
63
- "tsc": "tsc -p . --noEmit",
76
+ "build:check": "tsc -p . --noEmit",
77
+ "lint": "cross-env NODE_OPTIONS=--max_old_space_size=8192 eslint \"src/**/*.ts\" -f compact",
78
+ "lint-fix": "cross-env NODE_OPTIONS=--max_old_space_size=8192 eslint --fix \"src/**/*.ts\" -f compact",
64
79
  "build": "cross-env NODE_OPTIONS=--max_old_space_size=8192 rollup -c --silent"
65
80
  }
66
81
  }