@rings-webgpu/core 1.0.11 → 1.0.13

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.
@@ -2113,7 +2113,7 @@ function GetShader(name) {
2113
2113
  }
2114
2114
 
2115
2115
  var __defProp$2 = Object.defineProperty;
2116
- var __decorateClass$j = (decorators, target, key, kind) => {
2116
+ var __decorateClass$m = (decorators, target, key, kind) => {
2117
2117
  var result = void 0 ;
2118
2118
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
2119
2119
  if (decorator = decorators[i])
@@ -2216,10 +2216,10 @@ const _Struct = class _Struct {
2216
2216
  return struct.__size;
2217
2217
  }
2218
2218
  };
2219
- __decorateClass$j([
2219
+ __decorateClass$m([
2220
2220
  NonSerialize
2221
2221
  ], _Struct.prototype, "__refection");
2222
- __decorateClass$j([
2222
+ __decorateClass$m([
2223
2223
  NonSerialize
2224
2224
  ], _Struct.prototype, "__size");
2225
2225
  let Struct = _Struct;
@@ -5025,18 +5025,20 @@ class SkeletonAnimation_shader {
5025
5025
  }
5026
5026
  }
5027
5027
 
5028
- let VertexAttributes_vert = `
5028
+ let VertexAttributes_vert = (
5029
+ /*wgsl*/
5030
+ `
5029
5031
  var<private> PI: f32 = 3.14159265359;
5030
5032
  #if USE_METAHUMAN
5031
5033
  ${MorphTarget_shader.getMorphTargetShaderBinding(3, 0)}
5032
- ${SkeletonAnimation_shader.groupBindingAndFunctions(3, 2)}
5034
+ ${SkeletonAnimation_shader.groupBindingAndFunctions(3, 2)}
5033
5035
  #else
5034
5036
  #if USE_MORPHTARGETS
5035
5037
  ${MorphTarget_shader.getMorphTargetShaderBinding(3, 0)}
5036
5038
  #endif
5037
5039
 
5038
5040
  #if USE_SKELETON
5039
- ${SkeletonAnimation_shader.groupBindingAndFunctions(3, 0)}
5041
+ ${SkeletonAnimation_shader.groupBindingAndFunctions(3, 0)}
5040
5042
  #endif
5041
5043
  #endif
5042
5044
 
@@ -5071,6 +5073,10 @@ let VertexAttributes_vert = `
5071
5073
  #endif
5072
5074
  #endif
5073
5075
  #else
5076
+ #if USE_TANGENT
5077
+ @location(auto) TANGENT: vec4<f32>,
5078
+ #endif
5079
+
5074
5080
  #if USE_SKELETON
5075
5081
  #if USE_TANGENT
5076
5082
  @location(auto) joints0: vec4<f32>,
@@ -5117,6 +5123,7 @@ let VertexAttributes_vert = `
5117
5123
  #if USE_TANGENT
5118
5124
  @location(auto) varying_Tangent: vec4<f32>,
5119
5125
  #endif
5126
+
5120
5127
 
5121
5128
  @builtin(position) member: vec4<f32>
5122
5129
  };
@@ -5166,23 +5173,24 @@ let VertexAttributes_vert = `
5166
5173
  clipPosition.z = log2Depth(clipPosition.w, globalUniform.near, globalUniform.far);
5167
5174
  #endif
5168
5175
 
5169
- ORI_CameraWorldDir = normalize(ORI_CAMERAMATRIX[3].xyz - worldPos.xyz);
5176
+ ORI_CameraWorldDir = normalize(ORI_CAMERAMATRIX[3].xyz - worldPos.xyz) ;
5170
5177
 
5171
- ORI_VertexOut.index = f32(vertex.index);
5178
+ ORI_VertexOut.index = f32(vertex.index) ;
5172
5179
 
5173
- ORI_VertexOut.varying_UV0 = vertex.uv.xy;
5180
+ ORI_VertexOut.varying_UV0 = vertex.uv.xy ;
5174
5181
 
5175
5182
  ORI_VertexOut.varying_UV1 = vertex.TEXCOORD_1.xy;
5176
5183
 
5177
- ORI_VertexOut.varying_ViewPos = viewPosition;
5178
- ORI_VertexOut.varying_Clip = clipPosition;
5179
- ORI_VertexOut.varying_WPos = worldPos;
5184
+ ORI_VertexOut.varying_ViewPos = viewPosition ;
5185
+ ORI_VertexOut.varying_Clip = clipPosition ;
5186
+ ORI_VertexOut.varying_WPos = worldPos ;
5180
5187
  ORI_VertexOut.varying_WPos.w = f32(vertex.index);
5181
- ORI_VertexOut.varying_WNormal = normalize(ORI_NORMALMATRIX * vertexNormal.xyz);
5188
+ ORI_VertexOut.varying_WNormal = normalize(ORI_NORMALMATRIX * vertexNormal.xyz) ;
5182
5189
 
5183
- ORI_VertexOut.member = clipPosition;
5190
+ ORI_VertexOut.member = clipPosition ;
5184
5191
  }
5185
- `;
5192
+ `
5193
+ );
5186
5194
 
5187
5195
  let VideoUniform_frag = `
5188
5196
  struct MaterialUniform {
@@ -5301,68 +5309,90 @@ let Inline_vert = (
5301
5309
  `
5302
5310
  );
5303
5311
 
5304
- let Common_frag = `
5305
- #include "GlobalUniform"
5306
- #include "FragmentVarying"
5307
- #include "FragmentOutput"
5308
- #include "ShadingInput"
5309
- #include "ColorUtil_frag"
5310
- #include "BitUtil"
5311
-
5312
- var<private> ORI_FragmentOutput: FragmentOutput;
5313
- var<private> ORI_VertexVarying: FragmentVarying;
5314
- var<private> ORI_ShadingInput: ShadingInput;
5315
- var<private> viewDir:vec3<f32>;
5316
- var<private> modelIndex:u32;
5312
+ let Common_frag = (
5313
+ /*wgsl*/
5314
+ `
5315
+ #include "GlobalUniform"
5316
+ #include "FragmentVarying"
5317
+ #include "FragmentOutput"
5318
+ #include "ShadingInput"
5319
+ #include "ColorUtil_frag"
5320
+ #include "BitUtil"
5317
5321
 
5318
- @fragment
5319
- fn FragMain( vertex_varying:FragmentVarying ) -> FragmentOutput {
5320
- modelIndex = u32(round(vertex_varying.index));
5321
- ORI_VertexVarying = vertex_varying;
5322
- ORI_VertexVarying.vWorldNormal = normalize(vertex_varying.vWorldNormal);
5322
+ var<private> ORI_FragmentOutput: FragmentOutput;
5323
+ var<private> ORI_VertexVarying: FragmentVarying;
5324
+ var<private> ORI_ShadingInput: ShadingInput;
5325
+ var<private> viewDir:vec3<f32>;
5326
+ var<private> modelIndex:u32;
5327
+
5328
+ @fragment
5329
+ fn FragMain( vertex_varying:FragmentVarying ) -> FragmentOutput {
5323
5330
  ORI_FragmentOutput.color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
5324
- viewDir = normalize(globalUniform.CameraPos.xyz - ORI_VertexVarying.vWorldPos.xyz);
5325
- frag();
5331
+ ORI_VertexVarying = vertex_varying;
5332
+ ORI_VertexVarying.vWorldNormal = normalize(vertex_varying.vWorldNormal);
5333
+ ORI_FragmentOutput.color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
5334
+ viewDir = normalize(globalUniform.CameraPos.xyz - ORI_VertexVarying.vWorldPos.xyz) ;
5326
5335
 
5327
- #if USE_DEBUG
5328
- debugFragmentOut();
5329
- #endif
5336
+ frag();
5337
+
5338
+ #if USE_DEBUG
5339
+ debugFragmentOut();
5340
+ #endif
5330
5341
 
5331
- #if USE_OUTDEPTH
5332
- #if USE_LOGDEPTH
5333
- ORI_FragmentOutput.out_depth = log2DepthFixPersp(ORI_VertexVarying.fragPosition.w, globalUniform.near, globalUniform.far);
5334
- #else
5335
- ORI_FragmentOutput.out_depth = ORI_ShadingInput.FragDepth;
5336
- #endif
5337
- #endif
5342
+ #if USE_DEFAULTFRAGOUT
5343
+ // let finalMatrix = globalUniform.projMat * globalUniform.viewMat ;
5344
+ // let nMat = mat3x3<f32>(finalMatrix[0].xyz,finalMatrix[1].xyz,finalMatrix[2].xyz) ;
5345
+ // let ORI_NORMALMATRIX = transpose(inverse( nMat ));
5346
+ // var vNormal = normalize(ORI_NORMALMATRIX * (ORI_VertexVarying.vWorldNormal));
5347
+
5348
+ // let gBuffer = packNHMDGBuffer(
5349
+ // ORI_VertexVarying.fragCoord.z,
5350
+ // ORI_ShadingInput.BaseColor.rgb,
5351
+ // ORI_ShadingInput.BaseColor.rgb,
5352
+ // vec3f(ORI_ShadingInput.Roughness,ORI_ShadingInput.Metallic,ORI_ShadingInput.AmbientOcclusion),
5353
+ // ORI_ShadingInput.Normal,
5354
+ // ORI_ShadingInput.Opacity
5355
+ // ) ;
5356
+ #endif
5338
5357
 
5339
- return ORI_FragmentOutput;
5340
- }
5358
+ #if USE_OUTDEPTH
5359
+ #if USE_LOGDEPTH
5360
+ ORI_FragmentOutput.out_depth = log2DepthFixPersp(ORI_VertexVarying.fragPosition.w, globalUniform.near, globalUniform.far);
5361
+ #else
5362
+ ORI_FragmentOutput.out_depth = ORI_ShadingInput.FragDepth ;
5363
+ #endif
5364
+ #endif
5341
5365
 
5342
- fn packNHMDGBuffer(depth:f32, albedo:vec3f,hdrLighting:vec3f,rmao:vec3f,normal:vec3f,alpha:f32) -> vec4f {
5343
- var gBuffer : vec4f;
5344
- var octUVNormal = (octEncode(normalize( (normal) )) + 1.0) * 0.5;
5345
- var yc = f32(r11g11b9_to_float(vec3f(octUVNormal,rmao.r)));
5346
- #if USE_CASTREFLECTION
5347
- var rgbm = EncodeRGBM(hdrLighting);
5348
- var zc = f32(pack4x8unorm(vec4f(rgbm.rgb,0.0))) ;
5349
- var wc = f32(pack4x8unorm(vec4f(rmao.rg,rgbm.a,0.0)));
5350
- #else
5351
- var zc = f32(vec4fToFloat_7bits(vec4f(albedo.rgb,alpha)));
5352
- var wc = f32(r22g8_to_float(vec2f(f32(modelIndex)/f_r22g8.r,rmao.g)));
5353
- #endif
5366
+ return ORI_FragmentOutput ;
5367
+ }
5354
5368
 
5355
- gBuffer.x = depth ;
5356
- gBuffer.y = yc;
5357
- gBuffer.z = zc;
5358
- gBuffer.w = wc;
5359
- return gBuffer;
5360
- }
5361
5369
 
5362
- fn transformUV( uv:vec2f , offsetScale:vec4f ) -> vec2f{
5363
- return uv * offsetScale.zw + offsetScale.xy;
5364
- }
5365
- `;
5370
+ fn packNHMDGBuffer(depth:f32, albedo:vec3f,hdrLighting:vec3f,rmao:vec3f,normal:vec3f,alpha:f32) -> vec4f {
5371
+ var gBuffer : vec4f ;
5372
+ var octUVNormal = (octEncode(normalize( (normal) )) + 1.0) * 0.5 ;
5373
+ var yc = f32(r11g11b9_to_float(vec3f(octUVNormal,rmao.r))) ;
5374
+ #if USE_CASTREFLECTION
5375
+ var rgbm = EncodeRGBM(hdrLighting);
5376
+ var zc = f32(pack4x8unorm(vec4f(rgbm.rgb,0.0))) ;
5377
+ var wc = f32(pack4x8unorm(vec4f(rmao.rg,rgbm.a,0.0)));
5378
+ #else
5379
+ var zc = f32(vec4fToFloat_7bits(vec4f(albedo.rgb,alpha)));
5380
+ var wc = f32(r22g8_to_float(vec2f(f32(modelIndex)/f_r22g8.r,rmao.g)));
5381
+ #endif
5382
+
5383
+ gBuffer.x = depth ;
5384
+ gBuffer.y = yc ;
5385
+ gBuffer.z = zc ;
5386
+ gBuffer.w = wc ;
5387
+ return gBuffer ;
5388
+ }
5389
+
5390
+ fn transformUV( uv:vec2f , offsetScale:vec4f ) -> vec2f{
5391
+ return uv * offsetScale.zw + offsetScale.xy ;
5392
+ }
5393
+
5394
+ `
5395
+ );
5366
5396
 
5367
5397
  let Common_vert = (
5368
5398
  /*wgsl*/
@@ -5732,6 +5762,7 @@ let FragmentVarying = `
5732
5762
  let FragmentOutput = `
5733
5763
  #if USE_CASTREFLECTION
5734
5764
  struct FragmentOutput {
5765
+ @location(auto) color: vec4<f32>,
5735
5766
  @location(auto) gBuffer: vec4<f32>,
5736
5767
  #if USE_OUTDEPTH
5737
5768
  @builtin(frag_depth) out_depth: f32
@@ -9525,6 +9556,186 @@ fn SH9(dir: vec3<f32>, coefficients: array<vec4f, 9>) -> vec4<f32> {
9525
9556
  }
9526
9557
  `;
9527
9558
 
9559
+ const FatLine_VS = (
9560
+ /* wgsl */
9561
+ `
9562
+ #include "GlobalUniform"
9563
+
9564
+ // Instance attributes stored in storage buffer
9565
+ // Extended with prevDir and nextDir for Line Join support
9566
+ struct InstanceData {
9567
+ start: vec3<f32>,
9568
+ _padding1: f32,
9569
+ end: vec3<f32>,
9570
+ _padding2: f32,
9571
+ colorStart: vec3<f32>,
9572
+ _padding3: f32,
9573
+ colorEnd: vec3<f32>,
9574
+ _padding4: f32,
9575
+ };
9576
+
9577
+ struct VertexInput {
9578
+ @builtin(instance_index) instanceIndex: u32,
9579
+ @location(0) position: vec3<f32>, // Quad vertices
9580
+ @location(1) uv: vec2<f32>, // UV coordinates
9581
+ };
9582
+
9583
+ struct VertexOutput {
9584
+ @builtin(position) position: vec4<f32>,
9585
+ @location(0) vUv: vec2<f32>,
9586
+ @location(1) vColor: vec3<f32>,
9587
+ };
9588
+
9589
+ struct MaterialUniform {
9590
+ baseColor: vec4<f32>,
9591
+ lineWidth: f32,
9592
+ opacity: f32,
9593
+ resolution: vec2<f32>,
9594
+ modelMatrix: mat4x4<f32>,
9595
+ };
9596
+
9597
+ @group(1) @binding(0) var<uniform> materialUniform: MaterialUniform;
9598
+ @group(1) @binding(1) var<storage, read> instances: array<InstanceData>;
9599
+
9600
+ @vertex
9601
+ fn VertMain(input: VertexInput) -> VertexOutput {
9602
+ var output: VertexOutput;
9603
+
9604
+ let instance = instances[input.instanceIndex];
9605
+
9606
+ // Transform from local space to world space, then to view space
9607
+ let start_world = materialUniform.modelMatrix * vec4<f32>(instance.start, 1.0);
9608
+ let end_world = materialUniform.modelMatrix * vec4<f32>(instance.end, 1.0);
9609
+
9610
+ let start_view = globalUniform.viewMat * start_world;
9611
+ let end_view = globalUniform.viewMat * end_world;
9612
+
9613
+ // Project to clip space
9614
+ var clip_start = globalUniform.projMat * start_view;
9615
+ var clip_end = globalUniform.projMat * end_view;
9616
+
9617
+ // Perspective division to NDC space
9618
+ let ndc_start = clip_start.xyz / clip_start.w;
9619
+ let ndc_end = clip_end.xyz / clip_end.w;
9620
+
9621
+ // Calculate screen-space direction
9622
+ var dir = ndc_end.xy - ndc_start.xy;
9623
+
9624
+ // Account for aspect ratio
9625
+ let aspect = materialUniform.resolution.x / materialUniform.resolution.y;
9626
+ dir.x *= aspect;
9627
+ dir = normalize(dir);
9628
+
9629
+ // Calculate perpendicular offset
9630
+ var offset = vec2<f32>(dir.y, -dir.x);
9631
+
9632
+ // Undo aspect ratio adjustment for both dir and offset
9633
+ dir.x /= aspect;
9634
+ offset.x /= aspect;
9635
+
9636
+ // Flip offset direction based on position.x
9637
+ if (input.position.x < 0.0) {
9638
+ offset *= -1.0;
9639
+ }
9640
+
9641
+ // Handle endcaps
9642
+ if (input.position.y < 0.0) {
9643
+ offset += -dir;
9644
+ } else if (input.position.y > 1.0) {
9645
+ offset += dir;
9646
+ }
9647
+
9648
+ // Apply line width
9649
+ offset *= materialUniform.lineWidth;
9650
+ offset /= materialUniform.resolution.y; // Convert to clip space
9651
+
9652
+ // Select start or end point
9653
+ var clip = select(clip_end, clip_start, input.position.y < 0.5);
9654
+
9655
+ // Shift the depth of the projected points so the line segments
9656
+ // overlap neatly and face the camera properly (billboard effect)
9657
+ let clipPose = select(ndc_end, ndc_start, input.position.y < 0.5);
9658
+ clip.z = clipPose.z * clip.w;
9659
+
9660
+ // Perspective correction
9661
+ offset *= clip.w;
9662
+ clip.x += offset.x;
9663
+ clip.y += offset.y;
9664
+
9665
+ output.position = clip;
9666
+ output.vUv = input.uv;
9667
+ output.vColor = select(instance.colorEnd, instance.colorStart, input.position.y < 0.5);
9668
+
9669
+ return output;
9670
+ }
9671
+ `
9672
+ );
9673
+ const FatLine_FS = (
9674
+ /* wgsl */
9675
+ `
9676
+ struct FragmentOutput {
9677
+ @location(0) color: vec4<f32>,
9678
+ @location(1) gBuffer: vec4<f32>,
9679
+ };
9680
+
9681
+ struct VertexOutput {
9682
+ @builtin(position) position: vec4<f32>,
9683
+ @location(0) vUv: vec2<f32>,
9684
+ @location(1) vColor: vec3<f32>,
9685
+ };
9686
+
9687
+ struct MaterialUniform {
9688
+ baseColor: vec4<f32>,
9689
+ lineWidth: f32,
9690
+ opacity: f32,
9691
+ resolution: vec2<f32>,
9692
+ modelMatrix: mat4x4<f32>,
9693
+ };
9694
+
9695
+ @group(1) @binding(0) var<uniform> materialUniform: MaterialUniform;
9696
+
9697
+ @fragment
9698
+ fn FragMain(input: VertexOutput) -> FragmentOutput {
9699
+ var output: FragmentOutput;
9700
+
9701
+ var alpha = materialUniform.opacity;
9702
+
9703
+ // Round endcap rendering with anti-aliasing
9704
+ let a = input.vUv.x;
9705
+ let b = select(input.vUv.y - 1.0, input.vUv.y + 1.0, input.vUv.y > 0.0);
9706
+ let len2 = a * a + b * b;
9707
+
9708
+ // Calculate derivative (must be in uniform control flow)
9709
+ let dlen = fwidth(len2);
9710
+
9711
+ // Round endcap rendering - simple approach
9712
+ if (abs(input.vUv.y) > 1.0) {
9713
+ // Determine circle center: (0, 1) for top, (0, -1) for bottom
9714
+ var basePoint = select(
9715
+ vec2<f32>(0.0, -1.0), // Bottom endcap
9716
+ vec2<f32>(0.0, 1.0), // Top endcap
9717
+ input.vUv.y > 0.0
9718
+ );
9719
+
9720
+ // Distance from UV to circle center
9721
+ // var dist = length(input.vUv - basePoint);
9722
+ var dist2 = (input.vUv.x - basePoint.x) * (input.vUv.x - basePoint.x) + (input.vUv.y - basePoint.y) * (input.vUv.y - basePoint.y);
9723
+
9724
+ // Discard pixels outside circle (radius = 1.0)
9725
+ if (dist2 > 1.0) {
9726
+ discard;
9727
+ }
9728
+ }
9729
+
9730
+ let color = input.vColor * materialUniform.baseColor.rgb;
9731
+ output.color = vec4<f32>(color, alpha);
9732
+ output.gBuffer = vec4<f32>(0.0, 0.0, 0.0, 0.0); // No GBuffer data for lines
9733
+
9734
+ return output;
9735
+ }
9736
+ `
9737
+ );
9738
+
9528
9739
  class ShaderLib {
9529
9740
  static init() {
9530
9741
  ShaderLib.register("MathShader", MathShader);
@@ -9594,6 +9805,8 @@ class ShaderLib {
9594
9805
  );
9595
9806
  ShaderLib.register("ZPass_shader_vs", ZPassShader_vs);
9596
9807
  ShaderLib.register("ZPass_shader_fs", ZPassShader_fs);
9808
+ ShaderLib.register("FatLine_VS", FatLine_VS);
9809
+ ShaderLib.register("FatLine_FS", FatLine_FS);
9597
9810
  }
9598
9811
  static register(keyName, code) {
9599
9812
  if (!ShaderLib[keyName.toLowerCase()]) {
@@ -21680,9 +21893,9 @@ class OctreeEntity {
21680
21893
  }
21681
21894
 
21682
21895
  var __defProp$1 = Object.defineProperty;
21683
- var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
21684
- var __decorateClass$i = (decorators, target, key, kind) => {
21685
- var result = __getOwnPropDesc$i(target, key) ;
21896
+ var __getOwnPropDesc$l = Object.getOwnPropertyDescriptor;
21897
+ var __decorateClass$l = (decorators, target, key, kind) => {
21898
+ var result = __getOwnPropDesc$l(target, key) ;
21686
21899
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21687
21900
  if (decorator = decorators[i])
21688
21901
  result = (decorator(target, key, result) ) || result;
@@ -22267,221 +22480,16 @@ class RenderNode extends ComponentBase {
22267
22480
  this._combineShaderRefection = void 0;
22268
22481
  }
22269
22482
  }
22270
- __decorateClass$i([
22483
+ __decorateClass$l([
22271
22484
  EditorInspector
22272
22485
  ], RenderNode.prototype, "materials");
22273
- __decorateClass$i([
22486
+ __decorateClass$l([
22274
22487
  EditorInspector
22275
22488
  ], RenderNode.prototype, "castShadow");
22276
- __decorateClass$i([
22489
+ __decorateClass$l([
22277
22490
  EditorInspector
22278
22491
  ], RenderNode.prototype, "castGI");
22279
22492
 
22280
- class Shader {
22281
- computes;
22282
- passShader;
22283
- constructor() {
22284
- this.computes = [];
22285
- this.passShader = /* @__PURE__ */ new Map();
22286
- }
22287
- addRenderPass(renderShader, index = -1) {
22288
- let subShader = this.passShader.get(renderShader.passType) || [];
22289
- if (index == -1) {
22290
- subShader.push(renderShader);
22291
- } else {
22292
- subShader.splice(index, -1, renderShader);
22293
- }
22294
- this.passShader.set(renderShader.passType, subShader);
22295
- }
22296
- removeShader(renderShader, index = -1) {
22297
- let subShader = this.passShader.get(
22298
- renderShader.passType
22299
- );
22300
- if (subShader) {
22301
- if (index == -1) {
22302
- let index2 = subShader.indexOf(renderShader);
22303
- if (index2 != -1) {
22304
- subShader.splice(index2);
22305
- }
22306
- } else {
22307
- subShader.splice(index, 1);
22308
- }
22309
- }
22310
- }
22311
- removeShaderByIndex(passType, index = -1) {
22312
- let subShader = this.passShader.get(passType);
22313
- if (subShader) {
22314
- if (index == -1) {
22315
- this.passShader.delete(passType);
22316
- } else {
22317
- subShader.splice(index, 1);
22318
- }
22319
- }
22320
- }
22321
- getSubShaders(passType) {
22322
- return this.passShader.get(passType) || [];
22323
- }
22324
- hasSubShaders(passType) {
22325
- let subs = this.passShader.get(passType);
22326
- return subs.length > 0;
22327
- }
22328
- getDefaultShaders() {
22329
- return this.passShader.get(PassType.COLOR);
22330
- }
22331
- getDefaultColorShader() {
22332
- return this.passShader.get(PassType.COLOR)[0];
22333
- }
22334
- setDefine(arg0, arg1) {
22335
- for (const pass of this.passShader) {
22336
- for (const rd of pass[1]) {
22337
- rd.setDefine(arg0, arg1);
22338
- }
22339
- }
22340
- }
22341
- hasDefine(arg0) {
22342
- for (const pass of this.passShader) {
22343
- for (const rd of pass[1]) {
22344
- let has = rd.hasDefine(arg0);
22345
- if (has) return has;
22346
- }
22347
- }
22348
- return false;
22349
- }
22350
- deleteDefine(arg0) {
22351
- for (const pass of this.passShader) {
22352
- for (const rd of pass[1]) {
22353
- rd.deleteDefine(arg0);
22354
- }
22355
- }
22356
- }
22357
- setUniform(arg0, arg1) {
22358
- for (const pass of this.passShader) {
22359
- for (const rd of pass[1]) {
22360
- rd.setUniform(arg0, arg1);
22361
- }
22362
- }
22363
- }
22364
- setUniformFloat(arg0, arg1) {
22365
- for (const pass of this.passShader) {
22366
- for (const rd of pass[1]) {
22367
- rd.setUniformFloat(arg0, arg1);
22368
- }
22369
- }
22370
- }
22371
- setUniformVector2(arg0, arg1) {
22372
- for (const pass of this.passShader) {
22373
- for (const rd of pass[1]) {
22374
- rd.setUniformVector2(arg0, arg1);
22375
- }
22376
- }
22377
- }
22378
- setUniformVector3(arg0, arg1) {
22379
- for (const pass of this.passShader) {
22380
- for (const rd of pass[1]) {
22381
- rd.setUniformVector3(arg0, arg1);
22382
- }
22383
- }
22384
- }
22385
- setUniformVector4(arg0, arg1) {
22386
- for (const pass of this.passShader) {
22387
- for (const rd of pass[1]) {
22388
- rd.setUniformVector4(arg0, arg1);
22389
- }
22390
- }
22391
- }
22392
- setUniformColor(arg0, arg1) {
22393
- for (const pass of this.passShader) {
22394
- for (const rd of pass[1]) {
22395
- rd.setUniformColor(arg0, arg1);
22396
- }
22397
- }
22398
- }
22399
- getUniform(arg0) {
22400
- return this.getDefaultColorShader().getUniform(arg0);
22401
- }
22402
- getUniformFloat(arg0) {
22403
- return this.getDefaultColorShader().getUniformFloat(arg0);
22404
- }
22405
- getUniformVector2(arg0) {
22406
- return this.getDefaultColorShader().getUniformVector2(arg0);
22407
- }
22408
- getUniformVector3(arg0) {
22409
- return this.getDefaultColorShader().getUniformVector3(arg0);
22410
- }
22411
- getUniformVector4(arg0) {
22412
- return this.getDefaultColorShader().getUniformVector4(arg0);
22413
- }
22414
- getUniformColor(arg0) {
22415
- return this.getDefaultColorShader().getUniformColor(arg0);
22416
- }
22417
- setTexture(arg0, arg1) {
22418
- for (const pass of this.passShader) {
22419
- for (const rd of pass[1]) {
22420
- rd.setTexture(arg0, arg1);
22421
- }
22422
- }
22423
- this.setDefine(`USE_${arg0.toLocaleUpperCase()}`, true);
22424
- }
22425
- getTexture(arg0) {
22426
- return this.getDefaultColorShader().textures[arg0];
22427
- }
22428
- setUniformBuffer(arg0, arg1) {
22429
- for (const pass of this.passShader) {
22430
- for (const rd of pass[1]) {
22431
- rd.setUniformBuffer(arg0, arg1);
22432
- }
22433
- }
22434
- }
22435
- getUniformBuffer(arg0) {
22436
- return this.getDefaultColorShader().getBuffer(arg0);
22437
- }
22438
- setStorageBuffer(arg0, arg1) {
22439
- for (const pass of this.passShader) {
22440
- for (const rd of pass[1]) {
22441
- rd.setStorageBuffer(arg0, arg1);
22442
- }
22443
- }
22444
- }
22445
- getStorageBuffer(arg0) {
22446
- return this.getDefaultColorShader().getBuffer(arg0);
22447
- }
22448
- setStructStorageBuffer(arg0, arg1) {
22449
- for (const pass of this.passShader) {
22450
- for (const rd of pass[1]) {
22451
- rd.setStructStorageBuffer(arg0, arg1);
22452
- }
22453
- }
22454
- }
22455
- getStructStorageBuffer(arg0) {
22456
- return this.getDefaultColorShader().getBuffer(arg0);
22457
- }
22458
- noticeValueChange() {
22459
- for (const pass of this.passShader) {
22460
- for (const rd of pass[1]) {
22461
- rd.noticeValueChange();
22462
- }
22463
- }
22464
- }
22465
- destroy() {
22466
- this.getDefaultColorShader().destroy();
22467
- }
22468
- clone() {
22469
- let newShader = new Shader();
22470
- let sourceShaderPassList = this.getDefaultShaders();
22471
- for (const shadePass of sourceShaderPassList) {
22472
- newShader.addRenderPass(shadePass);
22473
- }
22474
- return newShader;
22475
- }
22476
- applyUniform() {
22477
- for (const pass of this.passShader) {
22478
- for (const rd of pass[1]) {
22479
- rd.applyUniform();
22480
- }
22481
- }
22482
- }
22483
- }
22484
-
22485
22493
  class Material {
22486
22494
  instanceID;
22487
22495
  name;
@@ -22670,61 +22678,35 @@ const GSplat_VS = (
22670
22678
  /* wgsl */
22671
22679
  `
22672
22680
  #include "GlobalUniform"
22673
-
22674
- struct VSOut {
22675
- @location(auto) vColor : vec4f,
22676
- @location(auto) vTexCoord : vec2f,
22677
- @builtin(position) member : vec4f
22678
- };
22679
-
22680
- // ===== SPLAT CORE VS (from PlayCanvas shader-generator-gsplat.js) =====
22681
-
22682
- // Uniforms (mapped to WebGPU bindings)
22683
- // matrix_model, matrix_view, matrix_projection -> GlobalUniform + MaterialUniform
22684
- // viewport -> calculated from globalUniform.windowWidth/Height
22685
- // tex_params -> materialUniform.tex_params
22686
-
22687
- @group(1) @binding(0) var splatColor : texture_2d<f32>;
22688
- @group(1) @binding(1) var transformA : texture_2d<u32>;
22689
- @group(1) @binding(2) var transformB : texture_2d<f32>;
22690
- @group(1) @binding(4) var splatOrder : texture_2d<u32>;
22691
22681
 
22692
22682
  struct MaterialUniform {
22693
- tex_params: vec4f, // numSplats, textureWidth, validCount, visBoost
22694
22683
  modelMatrix: mat4x4<f32>,
22695
- pixelCull: vec4f, // minPixels, maxPixels, maxPixelCullDistance, reserved
22684
+ tex_params: vec4<f32>, // [numSplats, texWidth, validCount, visBoost]
22685
+ pixelCull: vec4<f32>, // [minPixels, maxPixels, maxPixelCullDistance, batchSize]
22696
22686
  };
22697
- @group(1) @binding(3) var<uniform> materialUniform : MaterialUniform;
22687
+ @group(1) @binding(0) var<uniform> materialUniform: MaterialUniform;
22698
22688
 
22699
- // Global variables (like PlayCanvas)
22700
- var<private> orderId: u32;
22701
- var<private> splatId: u32;
22689
+ struct VSOut {
22690
+ @builtin(position) member: vec4<f32>,
22691
+ @location(0) vColor: vec4<f32>,
22692
+ @location(1) vTexCoord: vec2<f32>,
22693
+ };
22694
+
22695
+ // Textures (like PlayCanvas)
22696
+ @group(1) @binding(1) var splatColor: texture_2d<f32>;
22697
+ @group(1) @binding(2) var transformA: texture_2d<u32>;
22698
+ @group(1) @binding(3) var transformB: texture_2d<f32>;
22699
+ @group(1) @binding(4) var splatOrder: texture_2d<u32>;
22700
+
22701
+ // Global variables for texture lookups
22702
22702
  var<private> splatUV: vec2<i32>;
22703
+ var<private> splatId: u32;
22703
22704
  var<private> tA: vec4<u32>;
22704
22705
 
22705
- // Helper: decode 16-bit half float
22706
- fn unpackHalf(h: u32) -> f32 {
22707
- let s = (h >> 15u) & 0x1u;
22708
- let e = (h >> 10u) & 0x1fu;
22709
- let m = h & 0x3ffu;
22710
- let sign = select(1.0, -1.0, s == 1u);
22711
- if (e == 0u) {
22712
- if (m == 0u) { return 0.0; }
22713
- return sign * (f32(m) * exp2(-24.0));
22714
- } else if (e == 31u) {
22715
- return sign * 65504.0;
22716
- } else {
22717
- return sign * (1.0 + f32(m) / 1024.0) * exp2(f32(i32(e) - 15));
22718
- }
22719
- }
22720
-
22721
22706
  // === calcSplatUV() - returns bool ===
22722
- fn calcSplatUV(instance_id: u32) -> bool {
22723
- let numSplats = u32(materialUniform.tex_params.x);
22707
+ fn calcSplatUV(orderId: u32) -> bool {
22724
22708
  let textureWidth = u32(materialUniform.tex_params.y);
22725
-
22726
- // calculate splat index
22727
- orderId = instance_id;
22709
+ let numSplats = u32(materialUniform.tex_params.x);
22728
22710
 
22729
22711
  if (orderId >= numSplats) {
22730
22712
  return false;
@@ -22771,6 +22753,19 @@ const GSplat_VS = (
22771
22753
  return result;
22772
22754
  }
22773
22755
 
22756
+ // === getRotationMatrix() - returns mat3x3 ===
22757
+ fn getRotationMatrix() -> mat3x3f {
22758
+ let cov_data = getCovariance();
22759
+ let covA = cov_data.covA;
22760
+ let covB = cov_data.covB;
22761
+
22762
+ return mat3x3f(
22763
+ vec3f(1.0 - 2.0 * (covA.z * covA.z + covB.x * covB.x), 2.0 * (covA.y * covA.z + covB.y * covB.x), 2.0 * (covA.y * covB.x - covB.y * covA.z)),
22764
+ vec3f(2.0 * (covA.y * covA.z - covB.y * covB.x), 1.0 - 2.0 * (covA.y * covA.y + covB.x * covB.x), 2.0 * (covA.z * covB.x + covA.y * covB.y)),
22765
+ vec3f(2.0 * (covA.y * covB.x + covB.y * covA.z), 2.0 * (covA.z * covB.x - covA.y * covB.y), 1.0 - 2.0 * (covA.y * covA.y + covA.z * covA.z))
22766
+ );
22767
+ }
22768
+
22774
22769
  // === calcV1V2() - returns vec4 ===
22775
22770
  fn calcV1V2(splat_cam: vec3f, covA: vec3f, covB: vec3f, W: mat3x3f, viewport: vec2f, projMat: mat4x4f) -> vec4f {
22776
22771
  let Vrk = mat3x3f(
@@ -22814,22 +22809,25 @@ const GSplat_VS = (
22814
22809
  @vertex
22815
22810
  fn VertMain(
22816
22811
  @builtin(vertex_index) vid : u32,
22817
- @builtin(instance_index) iid : u32
22812
+ @builtin(instance_index) iid : u32,
22813
+ @location(0) position: vec3<f32> // vertex_position from mesh (x, y, local_index)
22818
22814
  ) -> VSOut {
22819
22815
  var o: VSOut;
22820
22816
  let discardVec = vec4f(0.0, 0.0, 2.0, 1.0);
22821
22817
 
22822
- // Vertex position array (PlayCanvas uses attribute vec3 with x,y in [-1,1])
22823
- let vertex_position = array<vec2f, 4>(
22824
- vec2f(-2.0, -2.0),
22825
- vec2f( 2.0, -2.0),
22826
- vec2f(-2.0, 2.0),
22827
- vec2f( 2.0, 2.0)
22828
- );
22829
- let vertex_pos = vertex_position[vid & 3u];
22818
+ // Calculate splat ID
22819
+ // orderId = vertex_id_attrib + uint(vertex_position.z)
22820
+ // In our case: vertex_id_attrib = iid * batchSize
22821
+ let batchSize = u32(materialUniform.pixelCull.w);
22822
+ let base_splat_index = iid * batchSize;
22823
+ let local_splat_index = u32(position.z);
22824
+ let orderId = base_splat_index + local_splat_index;
22825
+
22826
+ // Use vertex position from mesh
22827
+ let vertex_pos = position.xy;
22830
22828
 
22831
22829
  // calculate splat uv
22832
- if (!calcSplatUV(iid)) {
22830
+ if (!calcSplatUV(orderId)) {
22833
22831
  o.member = discardVec;
22834
22832
  o.vColor = vec4f(0.0);
22835
22833
  o.vTexCoord = vec2f(0.0);
@@ -22857,9 +22855,8 @@ const GSplat_VS = (
22857
22855
  }
22858
22856
 
22859
22857
  // Frustum culling: cull splats outside screen bounds
22860
- // Add margin for splat radius (conservative: ~2x max splat size)
22861
22858
  let ndc = splat_proj.xyz / splat_proj.w;
22862
- let margin = 0.5; // Allow splats near edges to be visible
22859
+ let margin = 0.0;
22863
22860
  if (ndc.x < -1.0 - margin || ndc.x > 1.0 + margin ||
22864
22861
  ndc.y < -1.0 - margin || ndc.y > 1.0 + margin ||
22865
22862
  ndc.z < 0.0 || ndc.z > 1.0) {
@@ -22877,6 +22874,12 @@ const GSplat_VS = (
22877
22874
 
22878
22875
  // get color
22879
22876
  let color = textureLoad(splatColor, splatUV, 0);
22877
+ if (color.a < 1.0 / 255.0) {
22878
+ o.member = discardVec;
22879
+ o.vColor = vec4f(0.0);
22880
+ o.vTexCoord = vec2f(0.0);
22881
+ return o;
22882
+ }
22880
22883
 
22881
22884
  // calculate scale based on alpha
22882
22885
  let scale = min(1.0, sqrt(-log(1.0 / 255.0 / color.a)) / 2.0);
@@ -22885,7 +22888,7 @@ const GSplat_VS = (
22885
22888
  let visBoost = materialUniform.tex_params.w;
22886
22889
  var v1v2_scaled = v1v2 * scale * visBoost;
22887
22890
 
22888
- // Pixel coverage culling (min and max thresholds)
22891
+ // Pixel coverage culling
22889
22892
  let v1_len_sq = dot(v1v2_scaled.xy, v1v2_scaled.xy);
22890
22893
  let v2_len_sq = dot(v1v2_scaled.zw, v1v2_scaled.zw);
22891
22894
 
@@ -22893,7 +22896,7 @@ const GSplat_VS = (
22893
22896
  let maxPixels = materialUniform.pixelCull.y;
22894
22897
  let maxPixelCullDistance = materialUniform.pixelCull.z;
22895
22898
 
22896
- // Early out tiny splats (below minimum pixel coverage)
22899
+ // Early out tiny splats
22897
22900
  if (v1_len_sq < minPixels && v2_len_sq < minPixels) {
22898
22901
  o.member = discardVec;
22899
22902
  o.vColor = vec4f(0.0);
@@ -22901,13 +22904,9 @@ const GSplat_VS = (
22901
22904
  return o;
22902
22905
  }
22903
22906
 
22904
- // Cull oversized splats (above maximum pixel coverage)
22905
- // Only apply to splats close to camera (distance-based condition)
22907
+ // Cull oversized splats
22906
22908
  if (maxPixels > 0.0) {
22907
- // Calculate distance from splat to camera
22908
22909
  let splatDistance = length(splat_cam.xyz);
22909
-
22910
- // Only cull oversized splats if they are close to camera
22911
22910
  if (maxPixelCullDistance <= 0.0 || splatDistance < maxPixelCullDistance) {
22912
22911
  let maxAxisSq = maxPixels * maxPixels;
22913
22912
  if (v1_len_sq > maxAxisSq || v2_len_sq > maxAxisSq) {
@@ -22919,12 +22918,9 @@ const GSplat_VS = (
22919
22918
  }
22920
22919
  }
22921
22920
 
22922
- // gl_Position = splat_proj + vec4((vertex_position.x * v1v2.xy + vertex_position.y * v1v2.zw) / viewport * splat_proj.w, 0, 0);
22921
+ // Final position
22923
22922
  o.member = splat_proj + vec4f((vertex_pos.x * v1v2_scaled.xy + vertex_pos.y * v1v2_scaled.zw) / viewport * splat_proj.w, 0.0, 0.0);
22924
-
22925
- // texCoord = vertex_position.xy * scale / 2.0;
22926
22923
  o.vTexCoord = vertex_pos * scale / 2.0;
22927
-
22928
22924
  o.vColor = color;
22929
22925
 
22930
22926
  return o;
@@ -22939,49 +22935,279 @@ const GSplat_FS = (
22939
22935
  // === evalSplat() - like PlayCanvas splatCoreFS ===
22940
22936
  fn evalSplat(texCoord: vec2f, color: vec4f) -> vec4f {
22941
22937
  let A = dot(texCoord, texCoord);
22938
+ var B = exp(-A * 4.0) * color.a;
22942
22939
  if (A > 1.0) {
22943
- discard;
22940
+ B = 0.0;
22944
22941
  }
22945
22942
 
22946
- let B = exp(-A * 4.0) * color.a;
22947
22943
  if (B < 1.0 / 255.0) {
22948
- discard;
22944
+ B = 0.0;
22949
22945
  }
22950
22946
 
22951
- // TONEMAP_ENABLED branch not implemented (would call toneMap() and gammaCorrectOutput())
22952
22947
  return vec4f(color.rgb, B);
22953
22948
  }
22954
-
22955
- // === main() - like PlayCanvas splatMainFS ===
22949
+
22956
22950
  @fragment
22957
- fn FragMain(@location(auto) vColor: vec4f, @location(auto) vTexCoord: vec2f) -> FragmentOutput {
22958
- let result = evalSplat(vTexCoord, vColor);
22959
-
22951
+ fn FragMain(
22952
+ @location(0) vColor: vec4<f32>,
22953
+ @location(1) vTexCoord: vec2<f32>
22954
+ ) -> FragmentOutput {
22960
22955
  var o: FragmentOutput;
22961
- o.color = result;
22962
- o.gBuffer = vec4f(0.0);
22956
+ o.color = evalSplat(vTexCoord, vColor);
22963
22957
  return o;
22964
22958
  }
22965
22959
  `
22966
22960
  );
22967
22961
 
22968
- class GSplatMaterial extends Material {
22962
+ class Shader {
22963
+ computes;
22964
+ passShader;
22965
+ constructor() {
22966
+ this.computes = [];
22967
+ this.passShader = /* @__PURE__ */ new Map();
22968
+ }
22969
+ addRenderPass(renderShader, index = -1) {
22970
+ let subShader = this.passShader.get(renderShader.passType) || [];
22971
+ if (index == -1) {
22972
+ subShader.push(renderShader);
22973
+ } else {
22974
+ subShader.splice(index, -1, renderShader);
22975
+ }
22976
+ this.passShader.set(renderShader.passType, subShader);
22977
+ }
22978
+ removeShader(renderShader, index = -1) {
22979
+ let subShader = this.passShader.get(
22980
+ renderShader.passType
22981
+ );
22982
+ if (subShader) {
22983
+ if (index == -1) {
22984
+ let index2 = subShader.indexOf(renderShader);
22985
+ if (index2 != -1) {
22986
+ subShader.splice(index2);
22987
+ }
22988
+ } else {
22989
+ subShader.splice(index, 1);
22990
+ }
22991
+ }
22992
+ }
22993
+ removeShaderByIndex(passType, index = -1) {
22994
+ let subShader = this.passShader.get(passType);
22995
+ if (subShader) {
22996
+ if (index == -1) {
22997
+ this.passShader.delete(passType);
22998
+ } else {
22999
+ subShader.splice(index, 1);
23000
+ }
23001
+ }
23002
+ }
23003
+ getSubShaders(passType) {
23004
+ return this.passShader.get(passType) || [];
23005
+ }
23006
+ hasSubShaders(passType) {
23007
+ let subs = this.passShader.get(passType);
23008
+ return subs.length > 0;
23009
+ }
23010
+ getDefaultShaders() {
23011
+ return this.passShader.get(PassType.COLOR);
23012
+ }
23013
+ getDefaultColorShader() {
23014
+ return this.passShader.get(PassType.COLOR)[0];
23015
+ }
23016
+ setDefine(arg0, arg1) {
23017
+ for (const pass of this.passShader) {
23018
+ for (const rd of pass[1]) {
23019
+ rd.setDefine(arg0, arg1);
23020
+ }
23021
+ }
23022
+ }
23023
+ hasDefine(arg0) {
23024
+ for (const pass of this.passShader) {
23025
+ for (const rd of pass[1]) {
23026
+ let has = rd.hasDefine(arg0);
23027
+ if (has) return has;
23028
+ }
23029
+ }
23030
+ return false;
23031
+ }
23032
+ deleteDefine(arg0) {
23033
+ for (const pass of this.passShader) {
23034
+ for (const rd of pass[1]) {
23035
+ rd.deleteDefine(arg0);
23036
+ }
23037
+ }
23038
+ }
23039
+ setUniform(arg0, arg1) {
23040
+ for (const pass of this.passShader) {
23041
+ for (const rd of pass[1]) {
23042
+ rd.setUniform(arg0, arg1);
23043
+ }
23044
+ }
23045
+ }
23046
+ setUniformFloat(arg0, arg1) {
23047
+ for (const pass of this.passShader) {
23048
+ for (const rd of pass[1]) {
23049
+ rd.setUniformFloat(arg0, arg1);
23050
+ }
23051
+ }
23052
+ }
23053
+ setUniformVector2(arg0, arg1) {
23054
+ for (const pass of this.passShader) {
23055
+ for (const rd of pass[1]) {
23056
+ rd.setUniformVector2(arg0, arg1);
23057
+ }
23058
+ }
23059
+ }
23060
+ setUniformVector3(arg0, arg1) {
23061
+ for (const pass of this.passShader) {
23062
+ for (const rd of pass[1]) {
23063
+ rd.setUniformVector3(arg0, arg1);
23064
+ }
23065
+ }
23066
+ }
23067
+ setUniformVector4(arg0, arg1) {
23068
+ for (const pass of this.passShader) {
23069
+ for (const rd of pass[1]) {
23070
+ rd.setUniformVector4(arg0, arg1);
23071
+ }
23072
+ }
23073
+ }
23074
+ setUniformColor(arg0, arg1) {
23075
+ for (const pass of this.passShader) {
23076
+ for (const rd of pass[1]) {
23077
+ rd.setUniformColor(arg0, arg1);
23078
+ }
23079
+ }
23080
+ }
23081
+ getUniform(arg0) {
23082
+ return this.getDefaultColorShader().getUniform(arg0);
23083
+ }
23084
+ getUniformFloat(arg0) {
23085
+ return this.getDefaultColorShader().getUniformFloat(arg0);
23086
+ }
23087
+ getUniformVector2(arg0) {
23088
+ return this.getDefaultColorShader().getUniformVector2(arg0);
23089
+ }
23090
+ getUniformVector3(arg0) {
23091
+ return this.getDefaultColorShader().getUniformVector3(arg0);
23092
+ }
23093
+ getUniformVector4(arg0) {
23094
+ return this.getDefaultColorShader().getUniformVector4(arg0);
23095
+ }
23096
+ getUniformColor(arg0) {
23097
+ return this.getDefaultColorShader().getUniformColor(arg0);
23098
+ }
23099
+ setTexture(arg0, arg1) {
23100
+ for (const pass of this.passShader) {
23101
+ for (const rd of pass[1]) {
23102
+ rd.setTexture(arg0, arg1);
23103
+ }
23104
+ }
23105
+ this.setDefine(`USE_${arg0.toLocaleUpperCase()}`, true);
23106
+ }
23107
+ getTexture(arg0) {
23108
+ return this.getDefaultColorShader().textures[arg0];
23109
+ }
23110
+ setUniformBuffer(arg0, arg1) {
23111
+ for (const pass of this.passShader) {
23112
+ for (const rd of pass[1]) {
23113
+ rd.setUniformBuffer(arg0, arg1);
23114
+ }
23115
+ }
23116
+ }
23117
+ getUniformBuffer(arg0) {
23118
+ return this.getDefaultColorShader().getBuffer(arg0);
23119
+ }
23120
+ setStorageBuffer(arg0, arg1) {
23121
+ for (const pass of this.passShader) {
23122
+ for (const rd of pass[1]) {
23123
+ rd.setStorageBuffer(arg0, arg1);
23124
+ }
23125
+ }
23126
+ }
23127
+ getStorageBuffer(arg0) {
23128
+ return this.getDefaultColorShader().getBuffer(arg0);
23129
+ }
23130
+ setStructStorageBuffer(arg0, arg1) {
23131
+ for (const pass of this.passShader) {
23132
+ for (const rd of pass[1]) {
23133
+ rd.setStructStorageBuffer(arg0, arg1);
23134
+ }
23135
+ }
23136
+ }
23137
+ getStructStorageBuffer(arg0) {
23138
+ return this.getDefaultColorShader().getBuffer(arg0);
23139
+ }
23140
+ noticeValueChange() {
23141
+ for (const pass of this.passShader) {
23142
+ for (const rd of pass[1]) {
23143
+ rd.noticeValueChange();
23144
+ }
23145
+ }
23146
+ }
23147
+ destroy() {
23148
+ this.getDefaultColorShader().destroy();
23149
+ }
23150
+ clone() {
23151
+ let newShader = new Shader();
23152
+ let sourceShaderPassList = this.getDefaultShaders();
23153
+ for (const shadePass of sourceShaderPassList) {
23154
+ newShader.addRenderPass(shadePass);
23155
+ }
23156
+ return newShader;
23157
+ }
23158
+ applyUniform() {
23159
+ for (const pass of this.passShader) {
23160
+ for (const rd of pass[1]) {
23161
+ rd.applyUniform();
23162
+ }
23163
+ }
23164
+ }
23165
+ }
23166
+
23167
+ var __getOwnPropDesc$k = Object.getOwnPropertyDescriptor;
23168
+ var __decorateClass$k = (decorators, target, key, kind) => {
23169
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$k(target, key) : target;
23170
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
23171
+ if (decorator = decorators[i])
23172
+ result = (decorator(result)) || result;
23173
+ return result;
23174
+ };
23175
+ let GSplatShader = class extends Shader {
22969
23176
  constructor() {
22970
23177
  super();
22971
- ShaderLib.register("gsplat_vs_dc", GSplat_VS);
22972
- ShaderLib.register("gsplat_fs_dc", GSplat_FS);
22973
23178
  const pass = new RenderShaderPass("gsplat_vs_dc", "gsplat_fs_dc");
22974
23179
  pass.passType = PassType.COLOR;
22975
23180
  pass.setShaderEntry("VertMain", "FragMain");
22976
- pass.topology = GPUPrimitiveTopology.triangle_strip;
23181
+ pass.topology = GPUPrimitiveTopology.triangle_list;
22977
23182
  pass.depthWriteEnabled = false;
22978
- pass.cullMode = "none";
23183
+ pass.cullMode = GPUCullMode.none;
22979
23184
  pass.shaderState.transparent = true;
22980
23185
  pass.shaderState.blendMode = BlendMode.NORMAL;
22981
23186
  pass.shaderState.writeMasks = [15, 15];
22982
- const shader = new Shader();
22983
- shader.addRenderPass(pass);
22984
- this.shader = shader;
23187
+ this.addRenderPass(pass);
23188
+ this.setDefault();
23189
+ }
23190
+ /**
23191
+ * Set default uniform values
23192
+ */
23193
+ setDefault() {
23194
+ const pass = this.getDefaultColorShader();
23195
+ const identityMatrix = new Matrix4();
23196
+ pass.setUniform("modelMatrix", identityMatrix.rawData);
23197
+ pass.setUniform("pixelCull", new Float32Array([2, 0, 0, 0]));
23198
+ }
23199
+ };
23200
+ GSplatShader = __decorateClass$k([
23201
+ RegisterShader(GSplatShader, "GSplatShader")
23202
+ ], GSplatShader);
23203
+
23204
+ class GSplatMaterial extends Material {
23205
+ _pixelCullArray = new Float32Array(4);
23206
+ constructor() {
23207
+ super();
23208
+ ShaderLib.register("gsplat_vs_dc", GSplat_VS);
23209
+ ShaderLib.register("gsplat_fs_dc", GSplat_FS);
23210
+ this.shader = new GSplatShader();
22985
23211
  }
22986
23212
  setSplatTextures(splatColor, transformA, transformB, texParams, splatOrder) {
22987
23213
  const pass = this.shader.getDefaultColorShader();
@@ -22992,6 +23218,7 @@ class GSplatMaterial extends Material {
22992
23218
  if (splatOrder) {
22993
23219
  pass.setTexture("splatOrder", splatOrder);
22994
23220
  }
23221
+ pass.shaderState.depthCompare = GPUCompareFunction.less;
22995
23222
  }
22996
23223
  /**
22997
23224
  * Set the model matrix for transforming splats to world space
@@ -23006,9 +23233,13 @@ class GSplatMaterial extends Material {
23006
23233
  * @param maxPixels Maximum pixel coverage (cull oversized splats), default: 0 (disabled)
23007
23234
  * @param maxPixelCullDistance Only cull oversized splats within this distance, 0 = always cull
23008
23235
  */
23009
- setPixelCulling(minPixels, maxPixels, maxPixelCullDistance = 0) {
23236
+ setPixelCulling(minPixels, maxPixels, maxPixelCullDistance = 0, batchSize = 128) {
23237
+ this._pixelCullArray[0] = minPixels;
23238
+ this._pixelCullArray[1] = maxPixels;
23239
+ this._pixelCullArray[2] = maxPixelCullDistance;
23240
+ this._pixelCullArray[3] = batchSize;
23010
23241
  const pass = this.shader.getDefaultColorShader();
23011
- pass.setUniform("pixelCull", new Float32Array([minPixels, maxPixels, maxPixelCullDistance, 0]));
23242
+ pass.setUniform("pixelCull", this._pixelCullArray);
23012
23243
  }
23013
23244
  }
23014
23245
 
@@ -23666,108 +23897,47 @@ class GeometryBase {
23666
23897
  }
23667
23898
  }
23668
23899
 
23669
- class PlaneGeometry extends GeometryBase {
23670
- width;
23671
- height;
23672
- segmentW;
23673
- segmentH;
23674
- up;
23675
- constructor(width, height, segmentW = 1, segmentH = 1, up = Vector3.Y_AXIS) {
23900
+ class GSplatGeometry extends GeometryBase {
23901
+ batchSize;
23902
+ constructor(batchSize = 128) {
23676
23903
  super();
23677
- this.width = width;
23678
- this.height = height;
23679
- this.segmentW = segmentW;
23680
- this.segmentH = segmentH;
23681
- this.up = up;
23682
- this.buildGeometry(this.up);
23683
- }
23684
- buildGeometry(axis) {
23685
- var x, y;
23686
- var numIndices;
23687
- var base;
23688
- var tw = this.segmentW + 1;
23689
- (this.segmentH + 1) * tw;
23690
- this.bounds = new BoundingBox(
23691
- Vector3.ZERO.clone(),
23692
- new Vector3(this.width, 1, this.height)
23693
- );
23694
- numIndices = this.segmentH * this.segmentW * 6;
23695
- let vertexCount = (this.segmentW + 1) * (this.segmentH + 1);
23696
- let position_arr = new Float32Array(vertexCount * 3);
23697
- let normal_arr = new Float32Array(vertexCount * 3);
23698
- let uv_arr = new Float32Array(vertexCount * 2);
23699
- let indices_arr;
23700
- let totalIndexCount = this.segmentW * this.segmentH * 2 * 3;
23701
- if (totalIndexCount >= Uint16Array.length) {
23702
- indices_arr = new Uint32Array(this.segmentW * this.segmentH * 2 * 3);
23703
- } else {
23704
- indices_arr = new Uint16Array(this.segmentW * this.segmentH * 2 * 3);
23705
- }
23706
- numIndices = 0;
23707
- var indexP = 0;
23708
- var indexN = 0;
23709
- var indexU = 0;
23710
- for (var yi = 0; yi <= this.segmentH; ++yi) {
23711
- for (var xi = 0; xi <= this.segmentW; ++xi) {
23712
- x = (xi / this.segmentW - 0.5) * this.width;
23713
- y = (yi / this.segmentH - 0.5) * this.height;
23714
- switch (axis) {
23715
- case Vector3.Y_AXIS:
23716
- position_arr[indexP++] = x;
23717
- position_arr[indexP++] = 0;
23718
- position_arr[indexP++] = y;
23719
- normal_arr[indexN++] = 0;
23720
- normal_arr[indexN++] = 1;
23721
- normal_arr[indexN++] = 0;
23722
- break;
23723
- case Vector3.Z_AXIS:
23724
- position_arr[indexP++] = x;
23725
- position_arr[indexP++] = -y;
23726
- position_arr[indexP++] = 0;
23727
- normal_arr[indexN++] = 0;
23728
- normal_arr[indexN++] = 0;
23729
- normal_arr[indexN++] = 1;
23730
- break;
23731
- case Vector3.X_AXIS:
23732
- position_arr[indexP++] = 0;
23733
- position_arr[indexP++] = x;
23734
- position_arr[indexP++] = y;
23735
- normal_arr[indexN++] = 1;
23736
- normal_arr[indexN++] = 0;
23737
- normal_arr[indexN++] = 0;
23738
- break;
23739
- default:
23740
- position_arr[indexP++] = x;
23741
- position_arr[indexP++] = 0;
23742
- position_arr[indexP++] = y;
23743
- normal_arr[indexN++] = 0;
23744
- normal_arr[indexN++] = 1;
23745
- normal_arr[indexN++] = 0;
23746
- break;
23747
- }
23748
- uv_arr[indexU++] = xi / this.segmentW;
23749
- uv_arr[indexU++] = yi / this.segmentH;
23750
- if (xi != this.segmentW && yi != this.segmentH) {
23751
- base = xi + yi * tw;
23752
- indices_arr[numIndices++] = base + 1;
23753
- indices_arr[numIndices++] = base;
23754
- indices_arr[numIndices++] = base + tw;
23755
- indices_arr[numIndices++] = base + 1;
23756
- indices_arr[numIndices++] = base + tw;
23757
- indices_arr[numIndices++] = base + tw + 1;
23758
- }
23759
- }
23760
- }
23761
- this.setIndices(indices_arr);
23762
- this.setAttribute(VertexAttributeName.position, position_arr);
23763
- this.setAttribute(VertexAttributeName.normal, normal_arr);
23764
- this.setAttribute(VertexAttributeName.uv, uv_arr);
23765
- this.setAttribute(VertexAttributeName.TEXCOORD_1, uv_arr);
23904
+ this.batchSize = batchSize;
23905
+ const meshPositions = new Float32Array(12 * batchSize);
23906
+ for (let i = 0; i < batchSize; ++i) {
23907
+ meshPositions.set([
23908
+ -2,
23909
+ -2,
23910
+ i,
23911
+ 2,
23912
+ -2,
23913
+ i,
23914
+ 2,
23915
+ 2,
23916
+ i,
23917
+ -2,
23918
+ 2,
23919
+ i
23920
+ ], i * 12);
23921
+ }
23922
+ const meshIndices = new Uint32Array(6 * batchSize);
23923
+ for (let i = 0; i < batchSize; ++i) {
23924
+ const b = i * 4;
23925
+ meshIndices.set([
23926
+ 0 + b,
23927
+ 1 + b,
23928
+ 2 + b,
23929
+ 0 + b,
23930
+ 2 + b,
23931
+ 3 + b
23932
+ ], i * 6);
23933
+ }
23934
+ this.setAttribute(VertexAttributeName.position, meshPositions);
23935
+ this.setIndices(meshIndices);
23766
23936
  this.addSubGeometry({
23767
23937
  indexStart: 0,
23768
- indexCount: indices_arr.length,
23938
+ indexCount: meshIndices.length,
23769
23939
  vertexStart: 0,
23770
- vertexCount: 0,
23940
+ vertexCount: meshPositions.length / 3,
23771
23941
  firstStart: 0,
23772
23942
  index: 0,
23773
23943
  topology: 0
@@ -23871,18 +24041,49 @@ class Uint32ArrayTexture extends Texture {
23871
24041
  updateTexture(width, height, data) {
23872
24042
  let device = webGPUContext.device;
23873
24043
  const bytesPerRow = width * 4 * 4;
23874
- const staging = device.createBuffer({
24044
+ device.queue.writeTexture(
24045
+ { texture: this.getGPUTexture() },
24046
+ data.buffer,
24047
+ { bytesPerRow },
24048
+ { width, height, depthOrArrayLayers: 1 }
24049
+ );
24050
+ }
24051
+ }
24052
+
24053
+ class R32UintTexture extends Texture {
24054
+ _dataBuffer;
24055
+ create(width, height, data) {
24056
+ let device = webGPUContext.device;
24057
+ const bytesPerRow = width * 4;
24058
+ this.format = GPUTextureFormat.r32uint;
24059
+ const mipmapCount = 1;
24060
+ this.createTextureDescriptor(width, height, mipmapCount, this.format);
24061
+ const textureDataBuffer = this._dataBuffer = device.createBuffer({
23875
24062
  size: data.byteLength,
23876
24063
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC
23877
24064
  });
23878
- device.queue.writeBuffer(staging, 0, data.buffer);
24065
+ device.queue.writeBuffer(textureDataBuffer, 0, data.buffer);
23879
24066
  const encoder = device.createCommandEncoder();
23880
24067
  encoder.copyBufferToTexture(
23881
- { buffer: staging, bytesPerRow },
24068
+ { buffer: textureDataBuffer, bytesPerRow },
23882
24069
  { texture: this.getGPUTexture() },
23883
24070
  { width, height, depthOrArrayLayers: 1 }
23884
24071
  );
23885
24072
  device.queue.submit([encoder.finish()]);
24073
+ this.samplerBindingLayout.type = `non-filtering`;
24074
+ this.textureBindingLayout.sampleType = `uint`;
24075
+ this.gpuSampler = device.createSampler({});
24076
+ return this;
24077
+ }
24078
+ updateTexture(width, height, data) {
24079
+ let device = webGPUContext.device;
24080
+ const bytesPerRow = width * 4;
24081
+ device.queue.writeTexture(
24082
+ { texture: this.getGPUTexture() },
24083
+ data.buffer,
24084
+ { bytesPerRow },
24085
+ { width, height, depthOrArrayLayers: 1 }
24086
+ );
23886
24087
  }
23887
24088
  }
23888
24089
 
@@ -23990,9 +24191,9 @@ class Float16ArrayTexture extends Texture {
23990
24191
  }
23991
24192
  }
23992
24193
 
23993
- var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
23994
- var __decorateClass$h = (decorators, target, key, kind) => {
23995
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
24194
+ var __getOwnPropDesc$j = Object.getOwnPropertyDescriptor;
24195
+ var __decorateClass$j = (decorators, target, key, kind) => {
24196
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$j(target, key) : target;
23996
24197
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
23997
24198
  if (decorator = decorators[i])
23998
24199
  result = (decorator(result)) || result;
@@ -24024,14 +24225,15 @@ let GSplatRenderer = class extends RenderNode {
24024
24225
  // Web Worker for sorting
24025
24226
  _sortWorker;
24026
24227
  _lastSentTime = 0;
24027
- _minIntervalMs = 0;
24028
- // No throttle for immediate sorting
24228
+ _minIntervalMs = 16;
24029
24229
  _centersSent = false;
24030
24230
  _lastViewMatrixHash = 0;
24031
24231
  // Adaptive sorting optimization
24032
24232
  _lastCameraSpeed = 0;
24033
24233
  _adaptiveSorting = true;
24034
24234
  // Enable adaptive sorting by default
24235
+ _lastPixelCullParams = "";
24236
+ _texturesInitialized = false;
24035
24237
  // LOD (Level of Detail) system
24036
24238
  _lodEnabled = false;
24037
24239
  _lodDistances = [5, 10, 20, 40];
@@ -24053,6 +24255,11 @@ let GSplatRenderer = class extends RenderNode {
24053
24255
  get fullCount() {
24054
24256
  return this._fullCount;
24055
24257
  }
24258
+ // Batched rendering
24259
+ _batchSize = 128;
24260
+ // Splats per draw call
24261
+ instanceCount = 0;
24262
+ // For InstanceDrawComponent compatibility
24056
24263
  constructor() {
24057
24264
  super();
24058
24265
  }
@@ -24068,24 +24275,20 @@ let GSplatRenderer = class extends RenderNode {
24068
24275
  this.texParams = new Float32Array([this.count, this.size.x, this.count, 1]);
24069
24276
  this._positions = asset.position;
24070
24277
  const total = this.size.x * this.size.y;
24071
- this._orderData = new Uint32Array(total * 4);
24278
+ this._orderData = new Uint32Array(total);
24072
24279
  for (let i = 0; i < total; i++) {
24073
- const src = i < this.count ? i : this.count > 0 ? this.count - 1 : 0;
24074
- const base = i * 4;
24075
- this._orderData[base + 0] = src;
24076
- this._orderData[base + 1] = 0;
24077
- this._orderData[base + 2] = 0;
24078
- this._orderData[base + 3] = 0;
24079
- }
24080
- this.splatOrder = new Uint32ArrayTexture().create(this.size.x, this.size.y, this._orderData);
24280
+ this._orderData[i] = i < this.count ? i : this.count > 0 ? this.count - 1 : 0;
24281
+ }
24282
+ this.splatOrder = new R32UintTexture().create(this.size.x, this.size.y, this._orderData);
24081
24283
  this.splatOrder.name = "splatOrder";
24082
24284
  this.splatOrder.minFilter = "nearest";
24083
24285
  this.splatOrder.magFilter = "nearest";
24084
24286
  this.splatOrder.addressModeU = "clamp-to-edge";
24085
24287
  this.splatOrder.addressModeV = "clamp-to-edge";
24086
24288
  this.gsplatMaterial = new GSplatMaterial();
24087
- this.geometry = new PlaneGeometry(1, 1, 1, 1);
24289
+ this.geometry = new GSplatGeometry(this._batchSize);
24088
24290
  this.materials = [this.gsplatMaterial];
24291
+ this.instanceCount = 0;
24089
24292
  }
24090
24293
  /**
24091
24294
  * Update splat sorting before rendering
@@ -24162,12 +24365,7 @@ let GSplatRenderer = class extends RenderNode {
24162
24365
  this.texParams[2] = Math.min(this.texParams[0], this.count);
24163
24366
  const total = this.size.x * this.size.y;
24164
24367
  for (let i = 0; i < total; i++) {
24165
- const src = i < this.count ? i : this.count > 0 ? this.count - 1 : 0;
24166
- const base = i * 4;
24167
- this._orderData[base + 0] = src;
24168
- this._orderData[base + 1] = 0;
24169
- this._orderData[base + 2] = 0;
24170
- this._orderData[base + 3] = 0;
24368
+ this._orderData[i] = i < this.count ? i : this.count > 0 ? this.count - 1 : 0;
24171
24369
  }
24172
24370
  this.splatOrder.updateTexture(this.size.x, this.size.y, this._orderData);
24173
24371
  if (this._sortWorker) {
@@ -24194,6 +24392,7 @@ let GSplatRenderer = class extends RenderNode {
24194
24392
  } else {
24195
24393
  this._centersSent = false;
24196
24394
  }
24395
+ this.instanceCount = 0;
24197
24396
  }
24198
24397
  /**
24199
24398
  * Set visibility boost factor (material uniform tex_params.w)
@@ -24257,6 +24456,18 @@ let GSplatRenderer = class extends RenderNode {
24257
24456
  distanceEnabled: this._maxPixelCullDistance > 0
24258
24457
  };
24259
24458
  }
24459
+ /**
24460
+ * Get batching statistics
24461
+ */
24462
+ getBatchingStats() {
24463
+ return {
24464
+ enabled: true,
24465
+ batchSize: this._batchSize,
24466
+ instanceCount: this.instanceCount,
24467
+ splatCount: this.count,
24468
+ reduction: this.count > 0 ? (1 - this.instanceCount / this.count) * 100 : 0
24469
+ };
24470
+ }
24260
24471
  /**
24261
24472
  * Calculate texture size for given splat count
24262
24473
  */
@@ -24479,18 +24690,20 @@ let GSplatRenderer = class extends RenderNode {
24479
24690
  const indices = new Uint32Array(newOrder);
24480
24691
  const total = this.size.x * this.size.y;
24481
24692
  const count = this.count;
24482
- this._orderData = new Uint32Array(total * 4);
24483
- for (let i = 0; i < total; i++) {
24484
- const src = i < count ? indices[i] : count > 0 ? count - 1 : 0;
24485
- const base = i * 4;
24486
- this._orderData[base + 0] = src;
24487
- this._orderData[base + 1] = 0;
24488
- this._orderData[base + 2] = 0;
24489
- this._orderData[base + 3] = 0;
24693
+ if (!this._orderData || this._orderData.length !== total) {
24694
+ this._orderData = new Uint32Array(total);
24695
+ }
24696
+ const validCount = Math.min(count, indices.length);
24697
+ this._orderData.set(indices.subarray(0, validCount), 0);
24698
+ if (validCount < total) {
24699
+ const lastIndex = count > 0 ? count - 1 : 0;
24700
+ this._orderData.fill(lastIndex, validCount, total);
24490
24701
  }
24491
24702
  this.splatOrder.updateTexture(this.size.x, this.size.y, this._orderData);
24492
24703
  const valid = Math.max(0, Math.min(this.count, ev.data.count | 0));
24493
24704
  this.texParams[2] = valid;
24705
+ const newInstanceCount = Math.ceil(valid / this._batchSize);
24706
+ this.instanceCount = newInstanceCount;
24494
24707
  };
24495
24708
  const worldPos = this._worldPositions || this._positions;
24496
24709
  const centers = this._mapping ? new Float32Array(this._mapping.length * 3) : new Float32Array(worldPos);
@@ -24693,30 +24906,22 @@ let GSplatRenderer = class extends RenderNode {
24693
24906
  nodeUpdate(view, passType, renderPassState, clusterLightingBuffer) {
24694
24907
  const worldMatrix = this.object3D.transform.worldMatrix;
24695
24908
  this.gsplatMaterial.setTransformMatrix(worldMatrix);
24696
- this.gsplatMaterial.setPixelCulling(this._minPixelCoverage, this._maxPixelCoverage, this._maxPixelCullDistance);
24697
- this.gsplatMaterial.setSplatTextures(
24698
- this.splatColor,
24699
- this.transformA,
24700
- this.transformB,
24701
- this.texParams,
24702
- this.splatOrder
24703
- );
24704
- super.nodeUpdate(view, passType, renderPassState, clusterLightingBuffer);
24705
- }
24706
- /**
24707
- * Render pass
24708
- */
24709
- renderPass2(view, passType, rendererPassState, clusterLightingBuffer, encoder, useBundle = false) {
24710
- for (let mat of this.materials) {
24711
- const passes = mat.getPass(passType);
24712
- if (!passes || passes.length === 0) continue;
24713
- for (const pass of passes) {
24714
- if (!pass.pipeline) continue;
24715
- pass.apply(this.geometry, rendererPassState);
24716
- GPUContext.bindPipeline(encoder, pass);
24717
- GPUContext.draw(encoder, 4, this.count, 0, 0);
24718
- }
24909
+ const currentParams = `${this._minPixelCoverage},${this._maxPixelCoverage},${this._maxPixelCullDistance},${this._batchSize}`;
24910
+ if (currentParams !== this._lastPixelCullParams) {
24911
+ this.gsplatMaterial.setPixelCulling(this._minPixelCoverage, this._maxPixelCoverage, this._maxPixelCullDistance, this._batchSize);
24912
+ this._lastPixelCullParams = currentParams;
24913
+ }
24914
+ if (!this._texturesInitialized) {
24915
+ this.gsplatMaterial.setSplatTextures(
24916
+ this.splatColor,
24917
+ this.transformA,
24918
+ this.transformB,
24919
+ this.texParams,
24920
+ this.splatOrder
24921
+ );
24922
+ this._texturesInitialized = true;
24719
24923
  }
24924
+ super.nodeUpdate(view, passType, renderPassState, clusterLightingBuffer);
24720
24925
  }
24721
24926
  /**
24722
24927
  * Render pass (fallback)
@@ -24730,7 +24935,28 @@ let GSplatRenderer = class extends RenderNode {
24730
24935
  if (!pass.pipeline) continue;
24731
24936
  pass.apply(this.geometry, renderContext.rendererPassState || renderContext);
24732
24937
  GPUContext.bindPipeline(encoder, pass);
24733
- GPUContext.draw(encoder, 4, this.count, 0, 0);
24938
+ GPUContext.bindGeometryBuffer(encoder, this.geometry);
24939
+ const subGeometry = this.geometry.subGeometries[0];
24940
+ const lodInfo = subGeometry.lodLevels[0];
24941
+ if (this.instanceCount > 0) {
24942
+ GPUContext.drawIndexed(
24943
+ encoder,
24944
+ lodInfo.indexCount,
24945
+ this.instanceCount,
24946
+ lodInfo.indexStart,
24947
+ 0,
24948
+ 0
24949
+ );
24950
+ } else {
24951
+ GPUContext.drawIndexed(
24952
+ encoder,
24953
+ lodInfo.indexCount,
24954
+ 1,
24955
+ lodInfo.indexStart,
24956
+ 0,
24957
+ 0
24958
+ );
24959
+ }
24734
24960
  }
24735
24961
  }
24736
24962
  }
@@ -24745,7 +24971,7 @@ let GSplatRenderer = class extends RenderNode {
24745
24971
  super.destroy(force);
24746
24972
  }
24747
24973
  };
24748
- GSplatRenderer = __decorateClass$h([
24974
+ GSplatRenderer = __decorateClass$j([
24749
24975
  RegisterComponent(GSplatRenderer, "GSplatRenderer")
24750
24976
  ], GSplatRenderer);
24751
24977
 
@@ -25056,9 +25282,9 @@ class Entity extends CEventDispatcher {
25056
25282
  }
25057
25283
  }
25058
25284
 
25059
- var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
25060
- var __decorateClass$g = (decorators, target, key, kind) => {
25061
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
25285
+ var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
25286
+ var __decorateClass$i = (decorators, target, key, kind) => {
25287
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
25062
25288
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
25063
25289
  if (decorator = decorators[i])
25064
25290
  result = (decorator(result)) || result;
@@ -25323,7 +25549,7 @@ let Object3D = class extends Entity {
25323
25549
  super.destroy(force);
25324
25550
  }
25325
25551
  };
25326
- Object3D = __decorateClass$g([
25552
+ Object3D = __decorateClass$i([
25327
25553
  DecorateObject3D
25328
25554
  ], Object3D);
25329
25555
  function DecorateObject3D(ctor, _) {
@@ -26652,9 +26878,9 @@ class MorphTargetData {
26652
26878
  }
26653
26879
 
26654
26880
  var __defProp = Object.defineProperty;
26655
- var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
26656
- var __decorateClass$f = (decorators, target, key, kind) => {
26657
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
26881
+ var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
26882
+ var __decorateClass$h = (decorators, target, key, kind) => {
26883
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
26658
26884
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
26659
26885
  if (decorator = decorators[i])
26660
26886
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
@@ -26763,13 +26989,13 @@ let MeshRenderer = class extends RenderNode {
26763
26989
  super.destroy(force);
26764
26990
  }
26765
26991
  };
26766
- __decorateClass$f([
26992
+ __decorateClass$h([
26767
26993
  EditorInspector
26768
26994
  ], MeshRenderer.prototype, "geometry", 1);
26769
- __decorateClass$f([
26995
+ __decorateClass$h([
26770
26996
  EditorInspector
26771
26997
  ], MeshRenderer.prototype, "material", 1);
26772
- MeshRenderer = __decorateClass$f([
26998
+ MeshRenderer = __decorateClass$h([
26773
26999
  RegisterComponent(MeshRenderer, "MeshRenderer")
26774
27000
  ], MeshRenderer);
26775
27001
 
@@ -27266,9 +27492,118 @@ class WebGPUDescriptorCreator {
27266
27492
  }
27267
27493
  }
27268
27494
 
27269
- var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
27270
- var __decorateClass$e = (decorators, target, key, kind) => {
27271
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
27495
+ class PlaneGeometry extends GeometryBase {
27496
+ width;
27497
+ height;
27498
+ segmentW;
27499
+ segmentH;
27500
+ up;
27501
+ constructor(width, height, segmentW = 1, segmentH = 1, up = Vector3.Y_AXIS) {
27502
+ super();
27503
+ this.width = width;
27504
+ this.height = height;
27505
+ this.segmentW = segmentW;
27506
+ this.segmentH = segmentH;
27507
+ this.up = up;
27508
+ this.buildGeometry(this.up);
27509
+ }
27510
+ buildGeometry(axis) {
27511
+ var x, y;
27512
+ var numIndices;
27513
+ var base;
27514
+ var tw = this.segmentW + 1;
27515
+ (this.segmentH + 1) * tw;
27516
+ this.bounds = new BoundingBox(
27517
+ Vector3.ZERO.clone(),
27518
+ new Vector3(this.width, 1, this.height)
27519
+ );
27520
+ numIndices = this.segmentH * this.segmentW * 6;
27521
+ let vertexCount = (this.segmentW + 1) * (this.segmentH + 1);
27522
+ let position_arr = new Float32Array(vertexCount * 3);
27523
+ let normal_arr = new Float32Array(vertexCount * 3);
27524
+ let uv_arr = new Float32Array(vertexCount * 2);
27525
+ let indices_arr;
27526
+ let totalIndexCount = this.segmentW * this.segmentH * 2 * 3;
27527
+ if (totalIndexCount >= Uint16Array.length) {
27528
+ indices_arr = new Uint32Array(this.segmentW * this.segmentH * 2 * 3);
27529
+ } else {
27530
+ indices_arr = new Uint16Array(this.segmentW * this.segmentH * 2 * 3);
27531
+ }
27532
+ numIndices = 0;
27533
+ var indexP = 0;
27534
+ var indexN = 0;
27535
+ var indexU = 0;
27536
+ for (var yi = 0; yi <= this.segmentH; ++yi) {
27537
+ for (var xi = 0; xi <= this.segmentW; ++xi) {
27538
+ x = (xi / this.segmentW - 0.5) * this.width;
27539
+ y = (yi / this.segmentH - 0.5) * this.height;
27540
+ switch (axis) {
27541
+ case Vector3.Y_AXIS:
27542
+ position_arr[indexP++] = x;
27543
+ position_arr[indexP++] = 0;
27544
+ position_arr[indexP++] = y;
27545
+ normal_arr[indexN++] = 0;
27546
+ normal_arr[indexN++] = 1;
27547
+ normal_arr[indexN++] = 0;
27548
+ break;
27549
+ case Vector3.Z_AXIS:
27550
+ position_arr[indexP++] = x;
27551
+ position_arr[indexP++] = -y;
27552
+ position_arr[indexP++] = 0;
27553
+ normal_arr[indexN++] = 0;
27554
+ normal_arr[indexN++] = 0;
27555
+ normal_arr[indexN++] = 1;
27556
+ break;
27557
+ case Vector3.X_AXIS:
27558
+ position_arr[indexP++] = 0;
27559
+ position_arr[indexP++] = x;
27560
+ position_arr[indexP++] = y;
27561
+ normal_arr[indexN++] = 1;
27562
+ normal_arr[indexN++] = 0;
27563
+ normal_arr[indexN++] = 0;
27564
+ break;
27565
+ default:
27566
+ position_arr[indexP++] = x;
27567
+ position_arr[indexP++] = 0;
27568
+ position_arr[indexP++] = y;
27569
+ normal_arr[indexN++] = 0;
27570
+ normal_arr[indexN++] = 1;
27571
+ normal_arr[indexN++] = 0;
27572
+ break;
27573
+ }
27574
+ uv_arr[indexU++] = xi / this.segmentW;
27575
+ uv_arr[indexU++] = yi / this.segmentH;
27576
+ if (xi != this.segmentW && yi != this.segmentH) {
27577
+ base = xi + yi * tw;
27578
+ indices_arr[numIndices++] = base + 1;
27579
+ indices_arr[numIndices++] = base;
27580
+ indices_arr[numIndices++] = base + tw;
27581
+ indices_arr[numIndices++] = base + 1;
27582
+ indices_arr[numIndices++] = base + tw;
27583
+ indices_arr[numIndices++] = base + tw + 1;
27584
+ }
27585
+ }
27586
+ }
27587
+ this.setIndices(indices_arr);
27588
+ this.setAttribute(VertexAttributeName.position, position_arr);
27589
+ this.setAttribute(VertexAttributeName.normal, normal_arr);
27590
+ this.setAttribute(VertexAttributeName.uv, uv_arr);
27591
+ this.setAttribute(VertexAttributeName.TEXCOORD_1, uv_arr);
27592
+ this.addSubGeometry({
27593
+ indexStart: 0,
27594
+ indexCount: indices_arr.length,
27595
+ vertexStart: 0,
27596
+ vertexCount: 0,
27597
+ firstStart: 0,
27598
+ index: 0,
27599
+ topology: 0
27600
+ });
27601
+ }
27602
+ }
27603
+
27604
+ var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
27605
+ var __decorateClass$g = (decorators, target, key, kind) => {
27606
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
27272
27607
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
27273
27608
  if (decorator = decorators[i])
27274
27609
  result = (decorator(result)) || result;
@@ -27292,7 +27627,7 @@ let QuadShader = class extends Shader {
27292
27627
  this.setUniformFloat(`height`, 100);
27293
27628
  }
27294
27629
  };
27295
- QuadShader = __decorateClass$e([
27630
+ QuadShader = __decorateClass$g([
27296
27631
  RegisterShader(QuadShader, "QuadShader")
27297
27632
  ], QuadShader);
27298
27633
 
@@ -30240,7 +30575,15 @@ class RendererJob {
30240
30575
  shadowMapPassRenderer;
30241
30576
  pointLightShadowRenderer;
30242
30577
  ddgiProbeRenderer;
30243
- postRenderer;
30578
+ _postRenderer;
30579
+ get postRenderer() {
30580
+ if (!this._postRenderer) {
30581
+ let gbufferFrame = GBufferFrame.getGBufferFrame("ColorPassGBuffer");
30582
+ this._postRenderer = this.addRenderer(PostRenderer);
30583
+ this._postRenderer.setRenderStates(gbufferFrame);
30584
+ }
30585
+ return this._postRenderer;
30586
+ }
30244
30587
  clusterLightingRender;
30245
30588
  reflectionRenderer;
30246
30589
  occlusionSystem;
@@ -30264,7 +30607,9 @@ class RendererJob {
30264
30607
  }
30265
30608
  this.shadowMapPassRenderer = new ShadowMapPassRenderer();
30266
30609
  this.pointLightShadowRenderer = new PointLightShadowRenderer();
30267
- this.addPost(new FXAAPost());
30610
+ if (Engine3D.setting.render.postProcessing.fxaa.enable) {
30611
+ this.addPost(new FXAAPost());
30612
+ }
30268
30613
  }
30269
30614
  addRenderer(c, param) {
30270
30615
  let renderer;
@@ -30294,11 +30639,6 @@ class RendererJob {
30294
30639
  this.pauseRender = false;
30295
30640
  }
30296
30641
  addPost(post) {
30297
- if (!this.postRenderer) {
30298
- let gbufferFrame = GBufferFrame.getGBufferFrame("ColorPassGBuffer");
30299
- this.postRenderer = this.addRenderer(PostRenderer);
30300
- this.postRenderer.setRenderStates(gbufferFrame);
30301
- }
30302
30642
  if (post instanceof PostBase) {
30303
30643
  this.postRenderer.attachPost(this.view, post);
30304
30644
  }
@@ -30316,15 +30656,21 @@ class RendererJob {
30316
30656
  renderFrame() {
30317
30657
  let view = this._view;
30318
30658
  ProfilerUtil.startView(view);
30319
- GlobalBindGroup.getLightEntries(view.scene).update(view);
30320
- GlobalBindGroup.getReflectionEntries(view.scene).update(view);
30321
- this.occlusionSystem.update(view.camera, view.scene);
30322
- this.clusterLightingRender.render(view, this.occlusionSystem);
30323
- if (this.shadowMapPassRenderer) {
30659
+ if (this.clusterLightingRender) {
30660
+ GlobalBindGroup.getLightEntries(view.scene).update(view);
30661
+ GlobalBindGroup.getReflectionEntries(view.scene).update(view);
30662
+ }
30663
+ if (Engine3D.setting.occlusionQuery.enable && this.occlusionSystem) {
30664
+ this.occlusionSystem.update(view.camera, view.scene);
30665
+ }
30666
+ if (this.clusterLightingRender) {
30667
+ this.clusterLightingRender.render(view, this.occlusionSystem);
30668
+ }
30669
+ if (Engine3D.setting.shadow.enable && this.shadowMapPassRenderer) {
30324
30670
  ShadowLightsCollect.update(view);
30325
30671
  this.shadowMapPassRenderer.render(view, this.occlusionSystem);
30326
30672
  }
30327
- if (this.pointLightShadowRenderer) {
30673
+ if (Engine3D.setting.shadow.enable && this.pointLightShadowRenderer) {
30328
30674
  this.pointLightShadowRenderer.render(view, this.occlusionSystem);
30329
30675
  }
30330
30676
  if (this.depthPassRenderer) {
@@ -34566,9 +34912,9 @@ class LightBase extends ComponentBase {
34566
34912
  }
34567
34913
  }
34568
34914
 
34569
- var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
34570
- var __decorateClass$d = (decorators, target, key, kind) => {
34571
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
34915
+ var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
34916
+ var __decorateClass$f = (decorators, target, key, kind) => {
34917
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
34572
34918
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
34573
34919
  if (decorator = decorators[i])
34574
34920
  result = (decorator(result)) || result;
@@ -34610,13 +34956,13 @@ let DirectLight = class extends LightBase {
34610
34956
  debug() {
34611
34957
  }
34612
34958
  };
34613
- DirectLight = __decorateClass$d([
34959
+ DirectLight = __decorateClass$f([
34614
34960
  RegisterComponent(DirectLight, "DirectLight")
34615
34961
  ], DirectLight);
34616
34962
 
34617
- var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
34618
- var __decorateClass$c = (decorators, target, key, kind) => {
34619
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
34963
+ var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
34964
+ var __decorateClass$e = (decorators, target, key, kind) => {
34965
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
34620
34966
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
34621
34967
  if (decorator = decorators[i])
34622
34968
  result = (decorator(result)) || result;
@@ -34674,13 +35020,13 @@ let PointLight = class extends LightBase {
34674
35020
  debugDraw(show) {
34675
35021
  }
34676
35022
  };
34677
- PointLight = __decorateClass$c([
35023
+ PointLight = __decorateClass$e([
34678
35024
  RegisterComponent(PointLight, "PointLight")
34679
35025
  ], PointLight);
34680
35026
 
34681
- var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
34682
- var __decorateClass$b = (decorators, target, key, kind) => {
34683
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
35027
+ var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
35028
+ var __decorateClass$d = (decorators, target, key, kind) => {
35029
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
34684
35030
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
34685
35031
  if (decorator = decorators[i])
34686
35032
  result = (decorator(result)) || result;
@@ -34745,7 +35091,7 @@ let SpotLight = class extends LightBase {
34745
35091
  debugDraw(show) {
34746
35092
  }
34747
35093
  };
34748
- SpotLight = __decorateClass$b([
35094
+ SpotLight = __decorateClass$d([
34749
35095
  RegisterComponent(SpotLight, "SpotLight")
34750
35096
  ], SpotLight);
34751
35097
 
@@ -39298,483 +39644,483 @@ class AtlasParser extends ParserBase {
39298
39644
  }
39299
39645
  }
39300
39646
 
39301
- // DEFLATE is a complex format; to read this code, you should probably check the RFC first:
39302
- // https://tools.ietf.org/html/rfc1951
39303
- // You may also wish to take a look at the guide I made about this program:
39304
- // https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad
39305
- // Some of the following code is similar to that of UZIP.js:
39306
- // https://github.com/photopea/UZIP.js
39307
- // However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.
39308
- // Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint
39309
- // is better for memory in most engines (I *think*).
39310
-
39311
- // aliases for shorter compressed code (most minifers don't do this)
39312
- var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;
39313
- // fixed length extra bits
39314
- var fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);
39315
- // fixed distance extra bits
39316
- var fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);
39317
- // code length index map
39318
- var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
39319
- // get base, reverse index map from extra bits
39320
- var freb = function (eb, start) {
39321
- var b = new u16(31);
39322
- for (var i = 0; i < 31; ++i) {
39323
- b[i] = start += 1 << eb[i - 1];
39324
- }
39325
- // numbers here are at max 18 bits
39326
- var r = new i32(b[30]);
39327
- for (var i = 1; i < 30; ++i) {
39328
- for (var j = b[i]; j < b[i + 1]; ++j) {
39329
- r[j] = ((j - b[i]) << 5) | i;
39330
- }
39331
- }
39332
- return { b: b, r: r };
39333
- };
39334
- var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;
39335
- // we can ignore the fact that the other numbers are wrong; they never happen anyway
39336
- fl[28] = 258, revfl[258] = 28;
39337
- var _b = freb(fdeb, 0), fd = _b.b;
39338
- // map of value to reverse (assuming 16 bits)
39339
- var rev = new u16(32768);
39340
- for (var i = 0; i < 32768; ++i) {
39341
- // reverse table algorithm from SO
39342
- var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);
39343
- x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);
39344
- x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);
39345
- rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;
39346
- }
39347
- // create huffman tree from u8 "map": index -> code length for code index
39348
- // mb (max bits) must be at most 15
39349
- // TODO: optimize/split up?
39350
- var hMap = (function (cd, mb, r) {
39351
- var s = cd.length;
39352
- // index
39353
- var i = 0;
39354
- // u16 "map": index -> # of codes with bit length = index
39355
- var l = new u16(mb);
39356
- // length of cd must be 288 (total # of codes)
39357
- for (; i < s; ++i) {
39358
- if (cd[i])
39359
- ++l[cd[i] - 1];
39360
- }
39361
- // u16 "map": index -> minimum code for bit length = index
39362
- var le = new u16(mb);
39363
- for (i = 1; i < mb; ++i) {
39364
- le[i] = (le[i - 1] + l[i - 1]) << 1;
39365
- }
39366
- var co;
39367
- if (r) {
39368
- // u16 "map": index -> number of actual bits, symbol for code
39369
- co = new u16(1 << mb);
39370
- // bits to remove for reverser
39371
- var rvb = 15 - mb;
39372
- for (i = 0; i < s; ++i) {
39373
- // ignore 0 lengths
39374
- if (cd[i]) {
39375
- // num encoding both symbol and bits read
39376
- var sv = (i << 4) | cd[i];
39377
- // free bits
39378
- var r_1 = mb - cd[i];
39379
- // start value
39380
- var v = le[cd[i] - 1]++ << r_1;
39381
- // m is end value
39382
- for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {
39383
- // every 16 bit value starting with the code yields the same result
39384
- co[rev[v] >> rvb] = sv;
39385
- }
39386
- }
39387
- }
39388
- }
39389
- else {
39390
- co = new u16(s);
39391
- for (i = 0; i < s; ++i) {
39392
- if (cd[i]) {
39393
- co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);
39394
- }
39395
- }
39396
- }
39397
- return co;
39398
- });
39399
- // fixed length tree
39400
- var flt = new u8(288);
39401
- for (var i = 0; i < 144; ++i)
39402
- flt[i] = 8;
39403
- for (var i = 144; i < 256; ++i)
39404
- flt[i] = 9;
39405
- for (var i = 256; i < 280; ++i)
39406
- flt[i] = 7;
39407
- for (var i = 280; i < 288; ++i)
39408
- flt[i] = 8;
39409
- // fixed distance tree
39410
- var fdt = new u8(32);
39411
- for (var i = 0; i < 32; ++i)
39412
- fdt[i] = 5;
39413
- // fixed length map
39414
- var flrm = /*#__PURE__*/ hMap(flt, 9, 1);
39415
- // fixed distance map
39416
- var fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);
39417
- // find max of array
39418
- var max = function (a) {
39419
- var m = a[0];
39420
- for (var i = 1; i < a.length; ++i) {
39421
- if (a[i] > m)
39422
- m = a[i];
39423
- }
39424
- return m;
39425
- };
39426
- // read d, starting at bit p and mask with m
39427
- var bits = function (d, p, m) {
39428
- var o = (p / 8) | 0;
39429
- return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;
39430
- };
39431
- // read d, starting at bit p continuing for at least 16 bits
39432
- var bits16 = function (d, p) {
39433
- var o = (p / 8) | 0;
39434
- return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));
39435
- };
39436
- // get end of byte
39437
- var shft = function (p) { return ((p + 7) / 8) | 0; };
39438
- // typed array slice - allows garbage collector to free original reference,
39439
- // while being more compatible than .slice
39440
- var slc = function (v, s, e) {
39441
- if (s == null || s < 0)
39442
- s = 0;
39443
- if (e == null || e > v.length)
39444
- e = v.length;
39445
- // can't use .constructor in case user-supplied
39446
- return new u8(v.subarray(s, e));
39447
- };
39448
- // error codes
39449
- var ec = [
39450
- 'unexpected EOF',
39451
- 'invalid block type',
39452
- 'invalid length/literal',
39453
- 'invalid distance',
39454
- 'stream finished',
39455
- 'no stream handler',
39456
- ,
39457
- 'no callback',
39458
- 'invalid UTF-8 data',
39459
- 'extra field too long',
39460
- 'date not in range 1980-2099',
39461
- 'filename too long',
39462
- 'stream finishing',
39463
- 'invalid zip data'
39464
- // determined by unknown compression method
39465
- ];
39466
- var err = function (ind, msg, nt) {
39467
- var e = new Error(msg || ec[ind]);
39468
- e.code = ind;
39469
- if (Error.captureStackTrace)
39470
- Error.captureStackTrace(e, err);
39471
- if (!nt)
39472
- throw e;
39473
- return e;
39474
- };
39475
- // expands raw DEFLATE data
39476
- var inflt = function (dat, st, buf, dict) {
39477
- // source length dict length
39478
- var sl = dat.length, dl = dict ? dict.length : 0;
39479
- if (!sl || st.f && !st.l)
39480
- return buf || new u8(0);
39481
- var noBuf = !buf;
39482
- // have to estimate size
39483
- var resize = noBuf || st.i != 2;
39484
- // no state
39485
- var noSt = st.i;
39486
- // Assumes roughly 33% compression ratio average
39487
- if (noBuf)
39488
- buf = new u8(sl * 3);
39489
- // ensure buffer can fit at least l elements
39490
- var cbuf = function (l) {
39491
- var bl = buf.length;
39492
- // need to increase size to fit
39493
- if (l > bl) {
39494
- // Double or set to necessary, whichever is greater
39495
- var nbuf = new u8(Math.max(bl * 2, l));
39496
- nbuf.set(buf);
39497
- buf = nbuf;
39498
- }
39499
- };
39500
- // last chunk bitpos bytes
39501
- var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
39502
- // total bits
39503
- var tbts = sl * 8;
39504
- do {
39505
- if (!lm) {
39506
- // BFINAL - this is only 1 when last chunk is next
39507
- final = bits(dat, pos, 1);
39508
- // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman
39509
- var type = bits(dat, pos + 1, 3);
39510
- pos += 3;
39511
- if (!type) {
39512
- // go to end of byte boundary
39513
- var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;
39514
- if (t > sl) {
39515
- if (noSt)
39516
- err(0);
39517
- break;
39518
- }
39519
- // ensure size
39520
- if (resize)
39521
- cbuf(bt + l);
39522
- // Copy over uncompressed data
39523
- buf.set(dat.subarray(s, t), bt);
39524
- // Get new bitpos, update byte count
39525
- st.b = bt += l, st.p = pos = t * 8, st.f = final;
39526
- continue;
39527
- }
39528
- else if (type == 1)
39529
- lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
39530
- else if (type == 2) {
39531
- // literal lengths
39532
- var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
39533
- var tl = hLit + bits(dat, pos + 5, 31) + 1;
39534
- pos += 14;
39535
- // length+distance tree
39536
- var ldt = new u8(tl);
39537
- // code length tree
39538
- var clt = new u8(19);
39539
- for (var i = 0; i < hcLen; ++i) {
39540
- // use index map to get real code
39541
- clt[clim[i]] = bits(dat, pos + i * 3, 7);
39542
- }
39543
- pos += hcLen * 3;
39544
- // code lengths bits
39545
- var clb = max(clt), clbmsk = (1 << clb) - 1;
39546
- // code lengths map
39547
- var clm = hMap(clt, clb, 1);
39548
- for (var i = 0; i < tl;) {
39549
- var r = clm[bits(dat, pos, clbmsk)];
39550
- // bits read
39551
- pos += r & 15;
39552
- // symbol
39553
- var s = r >> 4;
39554
- // code length to copy
39555
- if (s < 16) {
39556
- ldt[i++] = s;
39557
- }
39558
- else {
39559
- // copy count
39560
- var c = 0, n = 0;
39561
- if (s == 16)
39562
- n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
39563
- else if (s == 17)
39564
- n = 3 + bits(dat, pos, 7), pos += 3;
39565
- else if (s == 18)
39566
- n = 11 + bits(dat, pos, 127), pos += 7;
39567
- while (n--)
39568
- ldt[i++] = c;
39569
- }
39570
- }
39571
- // length tree distance tree
39572
- var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
39573
- // max length bits
39574
- lbt = max(lt);
39575
- // max dist bits
39576
- dbt = max(dt);
39577
- lm = hMap(lt, lbt, 1);
39578
- dm = hMap(dt, dbt, 1);
39579
- }
39580
- else
39581
- err(1);
39582
- if (pos > tbts) {
39583
- if (noSt)
39584
- err(0);
39585
- break;
39586
- }
39587
- }
39588
- // Make sure the buffer can hold this + the largest possible addition
39589
- // Maximum chunk size (practically, theoretically infinite) is 2^17
39590
- if (resize)
39591
- cbuf(bt + 131072);
39592
- var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
39593
- var lpos = pos;
39594
- for (;; lpos = pos) {
39595
- // bits read, code
39596
- var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
39597
- pos += c & 15;
39598
- if (pos > tbts) {
39599
- if (noSt)
39600
- err(0);
39601
- break;
39602
- }
39603
- if (!c)
39604
- err(2);
39605
- if (sym < 256)
39606
- buf[bt++] = sym;
39607
- else if (sym == 256) {
39608
- lpos = pos, lm = null;
39609
- break;
39610
- }
39611
- else {
39612
- var add = sym - 254;
39613
- // no extra bits needed if less
39614
- if (sym > 264) {
39615
- // index
39616
- var i = sym - 257, b = fleb[i];
39617
- add = bits(dat, pos, (1 << b) - 1) + fl[i];
39618
- pos += b;
39619
- }
39620
- // dist
39621
- var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
39622
- if (!d)
39623
- err(3);
39624
- pos += d & 15;
39625
- var dt = fd[dsym];
39626
- if (dsym > 3) {
39627
- var b = fdeb[dsym];
39628
- dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
39629
- }
39630
- if (pos > tbts) {
39631
- if (noSt)
39632
- err(0);
39633
- break;
39634
- }
39635
- if (resize)
39636
- cbuf(bt + 131072);
39637
- var end = bt + add;
39638
- if (bt < dt) {
39639
- var shift = dl - dt, dend = Math.min(dt, end);
39640
- if (shift + bt < 0)
39641
- err(3);
39642
- for (; bt < dend; ++bt)
39643
- buf[bt] = dict[shift + bt];
39644
- }
39645
- for (; bt < end; ++bt)
39646
- buf[bt] = buf[bt - dt];
39647
- }
39648
- }
39649
- st.l = lm, st.p = lpos, st.b = bt, st.f = final;
39650
- if (lm)
39651
- final = 1, st.m = lbt, st.d = dm, st.n = dbt;
39652
- } while (!final);
39653
- // don't reallocate for streams or user buffers
39654
- return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
39655
- };
39656
- // empty
39657
- var et = /*#__PURE__*/ new u8(0);
39658
- // read 2 bytes
39659
- var b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };
39660
- // read 4 bytes
39661
- var b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };
39662
- var b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };
39663
- /**
39664
- * Expands DEFLATE data with no wrapper
39665
- * @param data The data to decompress
39666
- * @param opts The decompression options
39667
- * @returns The decompressed version of the data
39668
- */
39669
- function inflateSync(data, opts) {
39670
- return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
39671
- }
39672
- // text decoder
39673
- var td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();
39674
- // text decoder stream
39675
- var tds = 0;
39676
- try {
39677
- td.decode(et, { stream: true });
39678
- tds = 1;
39679
- }
39680
- catch (e) { }
39681
- // decode UTF8
39682
- var dutf8 = function (d) {
39683
- for (var r = '', i = 0;;) {
39684
- var c = d[i++];
39685
- var eb = (c > 127) + (c > 223) + (c > 239);
39686
- if (i + eb > d.length)
39687
- return { s: r, r: slc(d, i - 1) };
39688
- if (!eb)
39689
- r += String.fromCharCode(c);
39690
- else if (eb == 3) {
39691
- c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,
39692
- r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));
39693
- }
39694
- else if (eb & 1)
39695
- r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));
39696
- else
39697
- r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));
39698
- }
39699
- };
39700
- /**
39701
- * Converts a Uint8Array to a string
39702
- * @param dat The data to decode to string
39703
- * @param latin1 Whether or not to interpret the data as Latin-1. This should
39704
- * not need to be true unless encoding to binary string.
39705
- * @returns The original UTF-8/Latin-1 string
39706
- */
39707
- function strFromU8(dat, latin1) {
39708
- if (latin1) {
39709
- var r = '';
39710
- for (var i = 0; i < dat.length; i += 16384)
39711
- r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));
39712
- return r;
39713
- }
39714
- else if (td) {
39715
- return td.decode(dat);
39716
- }
39717
- else {
39718
- var _a = dutf8(dat), s = _a.s, r = _a.r;
39719
- if (r.length)
39720
- err(8);
39721
- return s;
39722
- }
39723
- }
39724
- // skip local zip header
39725
- var slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };
39726
- // read zip header
39727
- var zh = function (d, b, z) {
39728
- var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);
39729
- var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];
39730
- return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];
39731
- };
39732
- // read zip64 extra field
39733
- var z64e = function (d, b) {
39734
- for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))
39735
- ;
39736
- return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];
39737
- };
39738
- /**
39739
- * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better
39740
- * performance with more than one file.
39741
- * @param data The raw compressed ZIP file
39742
- * @param opts The ZIP extraction options
39743
- * @returns The decompressed files
39744
- */
39745
- function unzipSync(data, opts) {
39746
- var files = {};
39747
- var e = data.length - 22;
39748
- for (; b4(data, e) != 0x6054B50; --e) {
39749
- if (!e || data.length - e > 65558)
39750
- err(13);
39751
- }
39752
- var c = b2(data, e + 8);
39753
- if (!c)
39754
- return {};
39755
- var o = b4(data, e + 16);
39756
- var z = o == 4294967295 || c == 65535;
39757
- if (z) {
39758
- var ze = b4(data, e - 12);
39759
- z = b4(data, ze) == 0x6064B50;
39760
- if (z) {
39761
- c = b4(data, ze + 32);
39762
- o = b4(data, ze + 48);
39763
- }
39764
- }
39765
- for (var i = 0; i < c; ++i) {
39766
- var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);
39767
- o = no;
39768
- {
39769
- if (!c_2)
39770
- files[fn] = slc(data, b, b + sc);
39771
- else if (c_2 == 8)
39772
- files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });
39773
- else
39774
- err(14, 'unknown compression type ' + c_2);
39775
- }
39776
- }
39777
- return files;
39647
+ // DEFLATE is a complex format; to read this code, you should probably check the RFC first:
39648
+ // https://tools.ietf.org/html/rfc1951
39649
+ // You may also wish to take a look at the guide I made about this program:
39650
+ // https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad
39651
+ // Some of the following code is similar to that of UZIP.js:
39652
+ // https://github.com/photopea/UZIP.js
39653
+ // However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.
39654
+ // Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint
39655
+ // is better for memory in most engines (I *think*).
39656
+
39657
+ // aliases for shorter compressed code (most minifers don't do this)
39658
+ var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;
39659
+ // fixed length extra bits
39660
+ var fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);
39661
+ // fixed distance extra bits
39662
+ var fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);
39663
+ // code length index map
39664
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
39665
+ // get base, reverse index map from extra bits
39666
+ var freb = function (eb, start) {
39667
+ var b = new u16(31);
39668
+ for (var i = 0; i < 31; ++i) {
39669
+ b[i] = start += 1 << eb[i - 1];
39670
+ }
39671
+ // numbers here are at max 18 bits
39672
+ var r = new i32(b[30]);
39673
+ for (var i = 1; i < 30; ++i) {
39674
+ for (var j = b[i]; j < b[i + 1]; ++j) {
39675
+ r[j] = ((j - b[i]) << 5) | i;
39676
+ }
39677
+ }
39678
+ return { b: b, r: r };
39679
+ };
39680
+ var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;
39681
+ // we can ignore the fact that the other numbers are wrong; they never happen anyway
39682
+ fl[28] = 258, revfl[258] = 28;
39683
+ var _b = freb(fdeb, 0), fd = _b.b;
39684
+ // map of value to reverse (assuming 16 bits)
39685
+ var rev = new u16(32768);
39686
+ for (var i = 0; i < 32768; ++i) {
39687
+ // reverse table algorithm from SO
39688
+ var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);
39689
+ x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);
39690
+ x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);
39691
+ rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;
39692
+ }
39693
+ // create huffman tree from u8 "map": index -> code length for code index
39694
+ // mb (max bits) must be at most 15
39695
+ // TODO: optimize/split up?
39696
+ var hMap = (function (cd, mb, r) {
39697
+ var s = cd.length;
39698
+ // index
39699
+ var i = 0;
39700
+ // u16 "map": index -> # of codes with bit length = index
39701
+ var l = new u16(mb);
39702
+ // length of cd must be 288 (total # of codes)
39703
+ for (; i < s; ++i) {
39704
+ if (cd[i])
39705
+ ++l[cd[i] - 1];
39706
+ }
39707
+ // u16 "map": index -> minimum code for bit length = index
39708
+ var le = new u16(mb);
39709
+ for (i = 1; i < mb; ++i) {
39710
+ le[i] = (le[i - 1] + l[i - 1]) << 1;
39711
+ }
39712
+ var co;
39713
+ if (r) {
39714
+ // u16 "map": index -> number of actual bits, symbol for code
39715
+ co = new u16(1 << mb);
39716
+ // bits to remove for reverser
39717
+ var rvb = 15 - mb;
39718
+ for (i = 0; i < s; ++i) {
39719
+ // ignore 0 lengths
39720
+ if (cd[i]) {
39721
+ // num encoding both symbol and bits read
39722
+ var sv = (i << 4) | cd[i];
39723
+ // free bits
39724
+ var r_1 = mb - cd[i];
39725
+ // start value
39726
+ var v = le[cd[i] - 1]++ << r_1;
39727
+ // m is end value
39728
+ for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {
39729
+ // every 16 bit value starting with the code yields the same result
39730
+ co[rev[v] >> rvb] = sv;
39731
+ }
39732
+ }
39733
+ }
39734
+ }
39735
+ else {
39736
+ co = new u16(s);
39737
+ for (i = 0; i < s; ++i) {
39738
+ if (cd[i]) {
39739
+ co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);
39740
+ }
39741
+ }
39742
+ }
39743
+ return co;
39744
+ });
39745
+ // fixed length tree
39746
+ var flt = new u8(288);
39747
+ for (var i = 0; i < 144; ++i)
39748
+ flt[i] = 8;
39749
+ for (var i = 144; i < 256; ++i)
39750
+ flt[i] = 9;
39751
+ for (var i = 256; i < 280; ++i)
39752
+ flt[i] = 7;
39753
+ for (var i = 280; i < 288; ++i)
39754
+ flt[i] = 8;
39755
+ // fixed distance tree
39756
+ var fdt = new u8(32);
39757
+ for (var i = 0; i < 32; ++i)
39758
+ fdt[i] = 5;
39759
+ // fixed length map
39760
+ var flrm = /*#__PURE__*/ hMap(flt, 9, 1);
39761
+ // fixed distance map
39762
+ var fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);
39763
+ // find max of array
39764
+ var max = function (a) {
39765
+ var m = a[0];
39766
+ for (var i = 1; i < a.length; ++i) {
39767
+ if (a[i] > m)
39768
+ m = a[i];
39769
+ }
39770
+ return m;
39771
+ };
39772
+ // read d, starting at bit p and mask with m
39773
+ var bits = function (d, p, m) {
39774
+ var o = (p / 8) | 0;
39775
+ return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;
39776
+ };
39777
+ // read d, starting at bit p continuing for at least 16 bits
39778
+ var bits16 = function (d, p) {
39779
+ var o = (p / 8) | 0;
39780
+ return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));
39781
+ };
39782
+ // get end of byte
39783
+ var shft = function (p) { return ((p + 7) / 8) | 0; };
39784
+ // typed array slice - allows garbage collector to free original reference,
39785
+ // while being more compatible than .slice
39786
+ var slc = function (v, s, e) {
39787
+ if (s == null || s < 0)
39788
+ s = 0;
39789
+ if (e == null || e > v.length)
39790
+ e = v.length;
39791
+ // can't use .constructor in case user-supplied
39792
+ return new u8(v.subarray(s, e));
39793
+ };
39794
+ // error codes
39795
+ var ec = [
39796
+ 'unexpected EOF',
39797
+ 'invalid block type',
39798
+ 'invalid length/literal',
39799
+ 'invalid distance',
39800
+ 'stream finished',
39801
+ 'no stream handler',
39802
+ ,
39803
+ 'no callback',
39804
+ 'invalid UTF-8 data',
39805
+ 'extra field too long',
39806
+ 'date not in range 1980-2099',
39807
+ 'filename too long',
39808
+ 'stream finishing',
39809
+ 'invalid zip data'
39810
+ // determined by unknown compression method
39811
+ ];
39812
+ var err = function (ind, msg, nt) {
39813
+ var e = new Error(msg || ec[ind]);
39814
+ e.code = ind;
39815
+ if (Error.captureStackTrace)
39816
+ Error.captureStackTrace(e, err);
39817
+ if (!nt)
39818
+ throw e;
39819
+ return e;
39820
+ };
39821
+ // expands raw DEFLATE data
39822
+ var inflt = function (dat, st, buf, dict) {
39823
+ // source length dict length
39824
+ var sl = dat.length, dl = dict ? dict.length : 0;
39825
+ if (!sl || st.f && !st.l)
39826
+ return buf || new u8(0);
39827
+ var noBuf = !buf;
39828
+ // have to estimate size
39829
+ var resize = noBuf || st.i != 2;
39830
+ // no state
39831
+ var noSt = st.i;
39832
+ // Assumes roughly 33% compression ratio average
39833
+ if (noBuf)
39834
+ buf = new u8(sl * 3);
39835
+ // ensure buffer can fit at least l elements
39836
+ var cbuf = function (l) {
39837
+ var bl = buf.length;
39838
+ // need to increase size to fit
39839
+ if (l > bl) {
39840
+ // Double or set to necessary, whichever is greater
39841
+ var nbuf = new u8(Math.max(bl * 2, l));
39842
+ nbuf.set(buf);
39843
+ buf = nbuf;
39844
+ }
39845
+ };
39846
+ // last chunk bitpos bytes
39847
+ var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
39848
+ // total bits
39849
+ var tbts = sl * 8;
39850
+ do {
39851
+ if (!lm) {
39852
+ // BFINAL - this is only 1 when last chunk is next
39853
+ final = bits(dat, pos, 1);
39854
+ // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman
39855
+ var type = bits(dat, pos + 1, 3);
39856
+ pos += 3;
39857
+ if (!type) {
39858
+ // go to end of byte boundary
39859
+ var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;
39860
+ if (t > sl) {
39861
+ if (noSt)
39862
+ err(0);
39863
+ break;
39864
+ }
39865
+ // ensure size
39866
+ if (resize)
39867
+ cbuf(bt + l);
39868
+ // Copy over uncompressed data
39869
+ buf.set(dat.subarray(s, t), bt);
39870
+ // Get new bitpos, update byte count
39871
+ st.b = bt += l, st.p = pos = t * 8, st.f = final;
39872
+ continue;
39873
+ }
39874
+ else if (type == 1)
39875
+ lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
39876
+ else if (type == 2) {
39877
+ // literal lengths
39878
+ var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
39879
+ var tl = hLit + bits(dat, pos + 5, 31) + 1;
39880
+ pos += 14;
39881
+ // length+distance tree
39882
+ var ldt = new u8(tl);
39883
+ // code length tree
39884
+ var clt = new u8(19);
39885
+ for (var i = 0; i < hcLen; ++i) {
39886
+ // use index map to get real code
39887
+ clt[clim[i]] = bits(dat, pos + i * 3, 7);
39888
+ }
39889
+ pos += hcLen * 3;
39890
+ // code lengths bits
39891
+ var clb = max(clt), clbmsk = (1 << clb) - 1;
39892
+ // code lengths map
39893
+ var clm = hMap(clt, clb, 1);
39894
+ for (var i = 0; i < tl;) {
39895
+ var r = clm[bits(dat, pos, clbmsk)];
39896
+ // bits read
39897
+ pos += r & 15;
39898
+ // symbol
39899
+ var s = r >> 4;
39900
+ // code length to copy
39901
+ if (s < 16) {
39902
+ ldt[i++] = s;
39903
+ }
39904
+ else {
39905
+ // copy count
39906
+ var c = 0, n = 0;
39907
+ if (s == 16)
39908
+ n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
39909
+ else if (s == 17)
39910
+ n = 3 + bits(dat, pos, 7), pos += 3;
39911
+ else if (s == 18)
39912
+ n = 11 + bits(dat, pos, 127), pos += 7;
39913
+ while (n--)
39914
+ ldt[i++] = c;
39915
+ }
39916
+ }
39917
+ // length tree distance tree
39918
+ var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
39919
+ // max length bits
39920
+ lbt = max(lt);
39921
+ // max dist bits
39922
+ dbt = max(dt);
39923
+ lm = hMap(lt, lbt, 1);
39924
+ dm = hMap(dt, dbt, 1);
39925
+ }
39926
+ else
39927
+ err(1);
39928
+ if (pos > tbts) {
39929
+ if (noSt)
39930
+ err(0);
39931
+ break;
39932
+ }
39933
+ }
39934
+ // Make sure the buffer can hold this + the largest possible addition
39935
+ // Maximum chunk size (practically, theoretically infinite) is 2^17
39936
+ if (resize)
39937
+ cbuf(bt + 131072);
39938
+ var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
39939
+ var lpos = pos;
39940
+ for (;; lpos = pos) {
39941
+ // bits read, code
39942
+ var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
39943
+ pos += c & 15;
39944
+ if (pos > tbts) {
39945
+ if (noSt)
39946
+ err(0);
39947
+ break;
39948
+ }
39949
+ if (!c)
39950
+ err(2);
39951
+ if (sym < 256)
39952
+ buf[bt++] = sym;
39953
+ else if (sym == 256) {
39954
+ lpos = pos, lm = null;
39955
+ break;
39956
+ }
39957
+ else {
39958
+ var add = sym - 254;
39959
+ // no extra bits needed if less
39960
+ if (sym > 264) {
39961
+ // index
39962
+ var i = sym - 257, b = fleb[i];
39963
+ add = bits(dat, pos, (1 << b) - 1) + fl[i];
39964
+ pos += b;
39965
+ }
39966
+ // dist
39967
+ var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
39968
+ if (!d)
39969
+ err(3);
39970
+ pos += d & 15;
39971
+ var dt = fd[dsym];
39972
+ if (dsym > 3) {
39973
+ var b = fdeb[dsym];
39974
+ dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
39975
+ }
39976
+ if (pos > tbts) {
39977
+ if (noSt)
39978
+ err(0);
39979
+ break;
39980
+ }
39981
+ if (resize)
39982
+ cbuf(bt + 131072);
39983
+ var end = bt + add;
39984
+ if (bt < dt) {
39985
+ var shift = dl - dt, dend = Math.min(dt, end);
39986
+ if (shift + bt < 0)
39987
+ err(3);
39988
+ for (; bt < dend; ++bt)
39989
+ buf[bt] = dict[shift + bt];
39990
+ }
39991
+ for (; bt < end; ++bt)
39992
+ buf[bt] = buf[bt - dt];
39993
+ }
39994
+ }
39995
+ st.l = lm, st.p = lpos, st.b = bt, st.f = final;
39996
+ if (lm)
39997
+ final = 1, st.m = lbt, st.d = dm, st.n = dbt;
39998
+ } while (!final);
39999
+ // don't reallocate for streams or user buffers
40000
+ return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
40001
+ };
40002
+ // empty
40003
+ var et = /*#__PURE__*/ new u8(0);
40004
+ // read 2 bytes
40005
+ var b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };
40006
+ // read 4 bytes
40007
+ var b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };
40008
+ var b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };
40009
+ /**
40010
+ * Expands DEFLATE data with no wrapper
40011
+ * @param data The data to decompress
40012
+ * @param opts The decompression options
40013
+ * @returns The decompressed version of the data
40014
+ */
40015
+ function inflateSync(data, opts) {
40016
+ return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
40017
+ }
40018
+ // text decoder
40019
+ var td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();
40020
+ // text decoder stream
40021
+ var tds = 0;
40022
+ try {
40023
+ td.decode(et, { stream: true });
40024
+ tds = 1;
40025
+ }
40026
+ catch (e) { }
40027
+ // decode UTF8
40028
+ var dutf8 = function (d) {
40029
+ for (var r = '', i = 0;;) {
40030
+ var c = d[i++];
40031
+ var eb = (c > 127) + (c > 223) + (c > 239);
40032
+ if (i + eb > d.length)
40033
+ return { s: r, r: slc(d, i - 1) };
40034
+ if (!eb)
40035
+ r += String.fromCharCode(c);
40036
+ else if (eb == 3) {
40037
+ c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,
40038
+ r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));
40039
+ }
40040
+ else if (eb & 1)
40041
+ r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));
40042
+ else
40043
+ r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));
40044
+ }
40045
+ };
40046
+ /**
40047
+ * Converts a Uint8Array to a string
40048
+ * @param dat The data to decode to string
40049
+ * @param latin1 Whether or not to interpret the data as Latin-1. This should
40050
+ * not need to be true unless encoding to binary string.
40051
+ * @returns The original UTF-8/Latin-1 string
40052
+ */
40053
+ function strFromU8(dat, latin1) {
40054
+ if (latin1) {
40055
+ var r = '';
40056
+ for (var i = 0; i < dat.length; i += 16384)
40057
+ r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));
40058
+ return r;
40059
+ }
40060
+ else if (td) {
40061
+ return td.decode(dat);
40062
+ }
40063
+ else {
40064
+ var _a = dutf8(dat), s = _a.s, r = _a.r;
40065
+ if (r.length)
40066
+ err(8);
40067
+ return s;
40068
+ }
40069
+ }
40070
+ // skip local zip header
40071
+ var slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };
40072
+ // read zip header
40073
+ var zh = function (d, b, z) {
40074
+ var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);
40075
+ var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];
40076
+ return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];
40077
+ };
40078
+ // read zip64 extra field
40079
+ var z64e = function (d, b) {
40080
+ for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))
40081
+ ;
40082
+ return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];
40083
+ };
40084
+ /**
40085
+ * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better
40086
+ * performance with more than one file.
40087
+ * @param data The raw compressed ZIP file
40088
+ * @param opts The ZIP extraction options
40089
+ * @returns The decompressed files
40090
+ */
40091
+ function unzipSync(data, opts) {
40092
+ var files = {};
40093
+ var e = data.length - 22;
40094
+ for (; b4(data, e) != 0x6054B50; --e) {
40095
+ if (!e || data.length - e > 65558)
40096
+ err(13);
40097
+ }
40098
+ var c = b2(data, e + 8);
40099
+ if (!c)
40100
+ return {};
40101
+ var o = b4(data, e + 16);
40102
+ var z = o == 4294967295 || c == 65535;
40103
+ if (z) {
40104
+ var ze = b4(data, e - 12);
40105
+ z = b4(data, ze) == 0x6064B50;
40106
+ if (z) {
40107
+ c = b4(data, ze + 32);
40108
+ o = b4(data, ze + 48);
40109
+ }
40110
+ }
40111
+ for (var i = 0; i < c; ++i) {
40112
+ var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);
40113
+ o = no;
40114
+ {
40115
+ if (!c_2)
40116
+ files[fn] = slc(data, b, b + sc);
40117
+ else if (c_2 == 8)
40118
+ files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });
40119
+ else
40120
+ err(14, 'unknown compression type ' + c_2);
40121
+ }
40122
+ }
40123
+ return files;
39778
40124
  }
39779
40125
 
39780
40126
  class UnLitMaterial extends Material {
@@ -40545,7 +40891,7 @@ class PostProcessingComponent extends ComponentBase {
40545
40891
  }
40546
40892
  }
40547
40893
 
40548
- const version = "1.0.11";
40894
+ const version = "1.0.13";
40549
40895
 
40550
40896
  class Engine3D {
40551
40897
  /**
@@ -45058,9 +45404,9 @@ class AtmosphericTexture2D extends VirtualTexture {
45058
45404
  }
45059
45405
  }
45060
45406
 
45061
- var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
45062
- var __decorateClass$a = (decorators, target, key, kind) => {
45063
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
45407
+ var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
45408
+ var __decorateClass$c = (decorators, target, key, kind) => {
45409
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
45064
45410
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
45065
45411
  if (decorator = decorators[i])
45066
45412
  result = (decorator(result)) || result;
@@ -45084,7 +45430,7 @@ let SkyShader = class extends Shader {
45084
45430
  shaderState.depthCompare = GPUCompareFunction.less;
45085
45431
  }
45086
45432
  };
45087
- SkyShader = __decorateClass$a([
45433
+ SkyShader = __decorateClass$c([
45088
45434
  RegisterShader(SkyShader, "SkyShader")
45089
45435
  ], SkyShader);
45090
45436
 
@@ -45882,9 +46228,9 @@ class SkeletonAnimationClipState {
45882
46228
  }
45883
46229
  }
45884
46230
 
45885
- var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
45886
- var __decorateClass$9 = (decorators, target, key, kind) => {
45887
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
46231
+ var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
46232
+ var __decorateClass$b = (decorators, target, key, kind) => {
46233
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
45888
46234
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
45889
46235
  if (decorator = decorators[i])
45890
46236
  result = (decorator(result)) || result;
@@ -46088,7 +46434,7 @@ let SkeletonAnimationComponent = class extends ComponentBase {
46088
46434
  this._currentClipState.weight = 1;
46089
46435
  }
46090
46436
  };
46091
- SkeletonAnimationComponent = __decorateClass$9([
46437
+ SkeletonAnimationComponent = __decorateClass$b([
46092
46438
  RegisterComponent(SkeletonAnimationComponent, "SkeletonAnimationComponent")
46093
46439
  ], SkeletonAnimationComponent);
46094
46440
  class SkeletonAnimationCrossFadeState {
@@ -46124,9 +46470,9 @@ class SkeletonAnimationCrossFadeState {
46124
46470
  }
46125
46471
  }
46126
46472
 
46127
- var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
46128
- var __decorateClass$8 = (decorators, target, key, kind) => {
46129
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
46473
+ var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
46474
+ var __decorateClass$a = (decorators, target, key, kind) => {
46475
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
46130
46476
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
46131
46477
  if (decorator = decorators[i])
46132
46478
  result = (decorator(result)) || result;
@@ -46537,7 +46883,7 @@ let AnimatorComponent = class extends ComponentBase {
46537
46883
  return dst;
46538
46884
  }
46539
46885
  };
46540
- AnimatorComponent = __decorateClass$8([
46886
+ AnimatorComponent = __decorateClass$a([
46541
46887
  RegisterComponent(AnimatorComponent, "AnimatorComponent")
46542
46888
  ], AnimatorComponent);
46543
46889
  class PropertyAnimationClipState {
@@ -47294,9 +47640,9 @@ class PropertyAnimation extends ComponentBase {
47294
47640
  }
47295
47641
  }
47296
47642
 
47297
- var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
47298
- var __decorateClass$7 = (decorators, target, key, kind) => {
47299
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
47643
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
47644
+ var __decorateClass$9 = (decorators, target, key, kind) => {
47645
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
47300
47646
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
47301
47647
  if (decorator = decorators[i])
47302
47648
  result = (decorator(result)) || result;
@@ -47445,7 +47791,7 @@ let SkinnedMeshRenderer2 = class extends MeshRenderer {
47445
47791
  super.nodeUpdate(view, passType, renderPassState, clusterLightingBuffer);
47446
47792
  }
47447
47793
  };
47448
- SkinnedMeshRenderer2 = __decorateClass$7([
47794
+ SkinnedMeshRenderer2 = __decorateClass$9([
47449
47795
  RegisterComponent(SkinnedMeshRenderer2, "SkinnedMeshRenderer2")
47450
47796
  ], SkinnedMeshRenderer2);
47451
47797
 
@@ -52578,9 +52924,9 @@ class UITextField extends UIRenderAble {
52578
52924
  }
52579
52925
  }
52580
52926
 
52581
- var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
52582
- var __decorateClass$6 = (decorators, target, key, kind) => {
52583
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
52927
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
52928
+ var __decorateClass$8 = (decorators, target, key, kind) => {
52929
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
52584
52930
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
52585
52931
  if (decorator = decorators[i])
52586
52932
  result = (decorator(result)) || result;
@@ -52657,10 +53003,86 @@ let Light = class extends LightBase {
52657
53003
  debugDraw(show) {
52658
53004
  }
52659
53005
  };
52660
- Light = __decorateClass$6([
53006
+ Light = __decorateClass$8([
52661
53007
  RegisterComponent(Light, "Light")
52662
53008
  ], Light);
52663
53009
 
53010
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
53011
+ var __decorateClass$7 = (decorators, target, key, kind) => {
53012
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
53013
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
53014
+ if (decorator = decorators[i])
53015
+ result = (decorator(result)) || result;
53016
+ return result;
53017
+ };
53018
+ let FatLineRenderer = class extends RenderNode {
53019
+ _fatLineMaterial = null;
53020
+ _fatLineGeometry = null;
53021
+ constructor() {
53022
+ super();
53023
+ }
53024
+ onEnable() {
53025
+ super.onEnable();
53026
+ }
53027
+ onDisable() {
53028
+ super.onDisable();
53029
+ }
53030
+ cloneTo(obj) {
53031
+ const component = obj.addComponent(FatLineRenderer);
53032
+ component.copyComponent(this);
53033
+ }
53034
+ copyComponent(from) {
53035
+ super.copyComponent(from);
53036
+ return this;
53037
+ }
53038
+ /**
53039
+ * Set FatLine geometry
53040
+ */
53041
+ set geometry(value) {
53042
+ super.geometry = value;
53043
+ this._fatLineGeometry = value;
53044
+ if (value) {
53045
+ this.instanceCount = value.instanceCount;
53046
+ if (this._fatLineMaterial && value.instanceBuffer) {
53047
+ this._fatLineMaterial.setInstanceBuffer(value.instanceBuffer);
53048
+ }
53049
+ }
53050
+ }
53051
+ get geometry() {
53052
+ return this._fatLineGeometry;
53053
+ }
53054
+ /**
53055
+ * Set FatLine material
53056
+ */
53057
+ set material(value) {
53058
+ this.materials = [value];
53059
+ this._fatLineMaterial = value;
53060
+ if (this._fatLineGeometry && this._fatLineGeometry.instanceBuffer) {
53061
+ value.setInstanceBuffer(this._fatLineGeometry.instanceBuffer);
53062
+ }
53063
+ }
53064
+ get material() {
53065
+ return this._fatLineMaterial;
53066
+ }
53067
+ /**
53068
+ * Override nodeUpdate to automatically update FatLine-specific uniforms
53069
+ */
53070
+ nodeUpdate(view, passType, renderPassState, clusterLightingBuffer) {
53071
+ if (this._fatLineMaterial && this.object3D) {
53072
+ this._fatLineMaterial.setModelMatrix(this.object3D.transform.worldMatrix);
53073
+ const width = webGPUContext.presentationSize[0];
53074
+ const height = webGPUContext.presentationSize[1];
53075
+ if (width > 0 && height > 0) {
53076
+ this._fatLineMaterial.resolution = new Vector2(width, height);
53077
+ }
53078
+ }
53079
+ super.nodeUpdate(view, passType, renderPassState, clusterLightingBuffer);
53080
+ }
53081
+ };
53082
+ FatLineRenderer = __decorateClass$7([
53083
+ RegisterComponent(FatLineRenderer, "FatLineRenderer")
53084
+ ], FatLineRenderer);
53085
+
52664
53086
  class Probe extends Object3D {
52665
53087
  index = 0;
52666
53088
  drawCallFrame = -1;
@@ -52959,9 +53381,9 @@ class InstanceDrawComponent extends RenderNode {
52959
53381
  }
52960
53382
  }
52961
53383
 
52962
- var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
52963
- var __decorateClass$5 = (decorators, target, key, kind) => {
52964
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
53384
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
53385
+ var __decorateClass$6 = (decorators, target, key, kind) => {
53386
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
52965
53387
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
52966
53388
  if (decorator = decorators[i])
52967
53389
  result = (decorator(result)) || result;
@@ -52987,13 +53409,13 @@ let MeshFilter = class extends MeshRenderer {
52987
53409
  }
52988
53410
  }
52989
53411
  };
52990
- MeshFilter = __decorateClass$5([
53412
+ MeshFilter = __decorateClass$6([
52991
53413
  RegisterComponent(MeshFilter, "MeshFilter")
52992
53414
  ], MeshFilter);
52993
53415
 
52994
- var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
52995
- var __decorateClass$4 = (decorators, target, key, kind) => {
52996
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
53416
+ var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
53417
+ var __decorateClass$5 = (decorators, target, key, kind) => {
53418
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
52997
53419
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
52998
53420
  if (decorator = decorators[i])
52999
53421
  result = (decorator(result)) || result;
@@ -53119,7 +53541,7 @@ let SkinnedMeshRenderer = class extends MeshRenderer {
53119
53541
  super.nodeUpdate(view, passType, renderPassState, clusterLightingBuffer);
53120
53542
  }
53121
53543
  };
53122
- SkinnedMeshRenderer = __decorateClass$4([
53544
+ SkinnedMeshRenderer = __decorateClass$5([
53123
53545
  RegisterComponent(SkinnedMeshRenderer, "SkinnedMeshRenderer")
53124
53546
  ], SkinnedMeshRenderer);
53125
53547
 
@@ -53951,6 +54373,230 @@ class ExtrudeGeometry extends GeometryBase {
53951
54373
  }
53952
54374
  }
53953
54375
 
54376
+ class FatLineGeometry extends GeometryBase {
54377
+ _instanceBuffer;
54378
+ _instanceData;
54379
+ _instanceCount = 0;
54380
+ constructor() {
54381
+ super();
54382
+ this.initBaseGeometry();
54383
+ }
54384
+ /**
54385
+ * Initialize base quad geometry (shared by all line segments)
54386
+ * This is similar to ThreeJS LineSegmentsGeometry base geometry
54387
+ */
54388
+ initBaseGeometry() {
54389
+ const positions = new Float32Array([
54390
+ -1,
54391
+ 2,
54392
+ 0,
54393
+ 1,
54394
+ 2,
54395
+ 0,
54396
+ // Top endcap
54397
+ -1,
54398
+ 1,
54399
+ 0,
54400
+ 1,
54401
+ 1,
54402
+ 0,
54403
+ // Top of line segment
54404
+ -1,
54405
+ 0,
54406
+ 0,
54407
+ 1,
54408
+ 0,
54409
+ 0,
54410
+ // Bottom of line segment
54411
+ -1,
54412
+ -1,
54413
+ 0,
54414
+ 1,
54415
+ -1,
54416
+ 0
54417
+ // Bottom endcap
54418
+ ]);
54419
+ const uvs = new Float32Array([
54420
+ -1,
54421
+ 2,
54422
+ 1,
54423
+ 2,
54424
+ -1,
54425
+ 1,
54426
+ 1,
54427
+ 1,
54428
+ -1,
54429
+ -1,
54430
+ 1,
54431
+ -1,
54432
+ -1,
54433
+ -2,
54434
+ 1,
54435
+ -2
54436
+ ]);
54437
+ const indices = new Uint16Array([
54438
+ 0,
54439
+ 2,
54440
+ 1,
54441
+ 2,
54442
+ 3,
54443
+ 1,
54444
+ // First quad
54445
+ 2,
54446
+ 4,
54447
+ 3,
54448
+ 4,
54449
+ 5,
54450
+ 3,
54451
+ // Second quad
54452
+ 4,
54453
+ 6,
54454
+ 5,
54455
+ 6,
54456
+ 7,
54457
+ 5
54458
+ // Third quad
54459
+ ]);
54460
+ this.setIndices(indices);
54461
+ this.setAttribute(VertexAttributeName.position, positions);
54462
+ this.setAttribute(VertexAttributeName.uv, uvs);
54463
+ this.addSubGeometry({
54464
+ indexStart: 0,
54465
+ indexCount: indices.length,
54466
+ vertexStart: 0,
54467
+ vertexCount: positions.length / 3,
54468
+ firstStart: 0,
54469
+ index: 0,
54470
+ topology: 0
54471
+ });
54472
+ }
54473
+ /**
54474
+ * Set line positions from continuous points array
54475
+ * @param positions Array of positions [x1,y1,z1, x2,y2,z2, ...]
54476
+ */
54477
+ setPositions(positions) {
54478
+ const posArray = positions instanceof Float32Array ? positions : new Float32Array(positions);
54479
+ const numPoints = posArray.length / 3;
54480
+ const numSegments = numPoints - 1;
54481
+ if (numSegments <= 0) {
54482
+ console.warn("FatLineGeometry: Need at least 2 points");
54483
+ return this;
54484
+ }
54485
+ const instanceData = new Float32Array(numSegments * 16);
54486
+ for (let i = 0; i < numSegments; i++) {
54487
+ const i0 = i * 3;
54488
+ const i1 = (i + 1) * 3;
54489
+ instanceData[i * 16 + 0] = posArray[i0 + 0];
54490
+ instanceData[i * 16 + 1] = posArray[i0 + 1];
54491
+ instanceData[i * 16 + 2] = posArray[i0 + 2];
54492
+ instanceData[i * 16 + 3] = 0;
54493
+ instanceData[i * 16 + 4] = posArray[i1 + 0];
54494
+ instanceData[i * 16 + 5] = posArray[i1 + 1];
54495
+ instanceData[i * 16 + 6] = posArray[i1 + 2];
54496
+ instanceData[i * 16 + 7] = 0;
54497
+ instanceData[i * 16 + 8] = 1;
54498
+ instanceData[i * 16 + 9] = 1;
54499
+ instanceData[i * 16 + 10] = 1;
54500
+ instanceData[i * 16 + 11] = 0;
54501
+ instanceData[i * 16 + 12] = 1;
54502
+ instanceData[i * 16 + 13] = 1;
54503
+ instanceData[i * 16 + 14] = 1;
54504
+ instanceData[i * 16 + 15] = 0;
54505
+ }
54506
+ this._instanceData = instanceData;
54507
+ this._instanceCount = numSegments;
54508
+ this.computeBoundingBox(posArray);
54509
+ return this;
54510
+ }
54511
+ /**
54512
+ * Set colors for line segments
54513
+ * @param colors Array of colors [r1,g1,b1, r2,g2,b2, ...] for each point
54514
+ */
54515
+ setColors(colors) {
54516
+ const colorArray = colors instanceof Float32Array ? colors : new Float32Array(colors);
54517
+ if (!this._instanceData) {
54518
+ console.warn(
54519
+ "FatLineGeometry: Must call setPositions() before setColors()"
54520
+ );
54521
+ return this;
54522
+ }
54523
+ const numPoints = colorArray.length / 3;
54524
+ const numSegments = numPoints - 1;
54525
+ if (numSegments !== this._instanceCount) {
54526
+ console.warn(
54527
+ "FatLineGeometry: Color array length doesn't match segment count"
54528
+ );
54529
+ return this;
54530
+ }
54531
+ for (let i = 0; i < numSegments; i++) {
54532
+ const i0 = i * 3;
54533
+ const i1 = (i + 1) * 3;
54534
+ this._instanceData[i * 16 + 8] = colorArray[i0 + 0];
54535
+ this._instanceData[i * 16 + 9] = colorArray[i0 + 1];
54536
+ this._instanceData[i * 16 + 10] = colorArray[i0 + 2];
54537
+ this._instanceData[i * 16 + 12] = colorArray[i1 + 0];
54538
+ this._instanceData[i * 16 + 13] = colorArray[i1 + 1];
54539
+ this._instanceData[i * 16 + 14] = colorArray[i1 + 2];
54540
+ }
54541
+ return this;
54542
+ }
54543
+ /**
54544
+ * Compute bounding box from positions
54545
+ */
54546
+ computeBoundingBox(positions) {
54547
+ const min = new Vector3(Infinity, Infinity, Infinity);
54548
+ const max = new Vector3(-Infinity, -Infinity, -Infinity);
54549
+ for (let i = 0; i < positions.length; i += 3) {
54550
+ const x = positions[i];
54551
+ const y = positions[i + 1];
54552
+ const z = positions[i + 2];
54553
+ min.x = Math.min(min.x, x);
54554
+ min.y = Math.min(min.y, y);
54555
+ min.z = Math.min(min.z, z);
54556
+ max.x = Math.max(max.x, x);
54557
+ max.y = Math.max(max.y, y);
54558
+ max.z = Math.max(max.z, z);
54559
+ }
54560
+ const size = Vector3.sub(max, min);
54561
+ this.bounds = new BoundingBox(Vector3.ZERO.clone(), size);
54562
+ this.bounds.setFromMinMax(min, max);
54563
+ }
54564
+ /**
54565
+ * Get instance data for GPU upload
54566
+ */
54567
+ get instanceData() {
54568
+ return this._instanceData;
54569
+ }
54570
+ /**
54571
+ * Get number of line segments (instances)
54572
+ */
54573
+ get instanceCount() {
54574
+ return this._instanceCount;
54575
+ }
54576
+ /**
54577
+ * Get or create instance buffer
54578
+ */
54579
+ get instanceBuffer() {
54580
+ if (!this._instanceBuffer && this._instanceData) {
54581
+ this._instanceBuffer = new StorageGPUBuffer(
54582
+ this._instanceData.byteLength
54583
+ );
54584
+ this._instanceBuffer.setFloat32Array("", this._instanceData);
54585
+ this._instanceBuffer.apply();
54586
+ }
54587
+ return this._instanceBuffer;
54588
+ }
54589
+ /**
54590
+ * Update instance buffer with new data
54591
+ */
54592
+ updateInstanceBuffer() {
54593
+ if (this._instanceBuffer && this._instanceData) {
54594
+ this._instanceBuffer.setFloat32Array("", this._instanceData);
54595
+ this._instanceBuffer.apply();
54596
+ }
54597
+ }
54598
+ }
54599
+
53954
54600
  class VertexBufferLayout {
53955
54601
  name;
53956
54602
  offset;
@@ -59221,9 +59867,9 @@ class PrefabTextureParser extends ParserBase {
59221
59867
  }
59222
59868
  }
59223
59869
 
59224
- var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
59225
- var __decorateClass$3 = (decorators, target, key, kind) => {
59226
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
59870
+ var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
59871
+ var __decorateClass$4 = (decorators, target, key, kind) => {
59872
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
59227
59873
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
59228
59874
  if (decorator = decorators[i])
59229
59875
  result = (decorator(result)) || result;
@@ -59342,13 +59988,13 @@ let LitSSSShader = class extends Shader {
59342
59988
  }
59343
59989
  }
59344
59990
  };
59345
- LitSSSShader = __decorateClass$3([
59991
+ LitSSSShader = __decorateClass$4([
59346
59992
  RegisterShader(LitSSSShader, "LitSSSShader")
59347
59993
  ], LitSSSShader);
59348
59994
 
59349
- var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
59350
- var __decorateClass$2 = (decorators, target, key, kind) => {
59351
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
59995
+ var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
59996
+ var __decorateClass$3 = (decorators, target, key, kind) => {
59997
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
59352
59998
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
59353
59999
  if (decorator = decorators[i])
59354
60000
  result = (decorator(result)) || result;
@@ -59444,7 +60090,7 @@ let LitShader = class extends Shader {
59444
60090
  }
59445
60091
  }
59446
60092
  };
59447
- LitShader = __decorateClass$2([
60093
+ LitShader = __decorateClass$3([
59448
60094
  RegisterShader(LitShader, "LitShader")
59449
60095
  ], LitShader);
59450
60096
 
@@ -59603,6 +60249,47 @@ class PrefabStringUtil {
59603
60249
  }
59604
60250
  }
59605
60251
 
60252
+ var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
60253
+ var __decorateClass$2 = (decorators, target, key, kind) => {
60254
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
60255
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
60256
+ if (decorator = decorators[i])
60257
+ result = (decorator(result)) || result;
60258
+ return result;
60259
+ };
60260
+ let FatLineShader = class extends Shader {
60261
+ constructor() {
60262
+ super();
60263
+ const colorShader = new RenderShaderPass("FatLine_VS", "FatLine_FS");
60264
+ colorShader.setShaderEntry(`VertMain`, `FragMain`);
60265
+ this.addRenderPass(colorShader);
60266
+ const shaderState = colorShader.shaderState;
60267
+ shaderState.acceptShadow = false;
60268
+ shaderState.castShadow = false;
60269
+ shaderState.receiveEnv = false;
60270
+ shaderState.acceptGI = false;
60271
+ shaderState.useLight = false;
60272
+ shaderState.cullMode = GPUCullMode.none;
60273
+ shaderState.depthWriteEnabled = true;
60274
+ this.setDefault();
60275
+ }
60276
+ /**
60277
+ * Set default uniform values
60278
+ */
60279
+ setDefault() {
60280
+ this.setUniformColor(`baseColor`, new Color(1, 1, 1, 1));
60281
+ this.setUniformFloat(`lineWidth`, 1);
60282
+ this.setUniformFloat(`opacity`, 1);
60283
+ this.setUniformVector2(`resolution`, new Vector2(1920, 1080));
60284
+ const identityMatrix = new Matrix4();
60285
+ const pass = this.getDefaultColorShader();
60286
+ pass.setUniform(`modelMatrix`, identityMatrix.rawData);
60287
+ }
60288
+ };
60289
+ FatLineShader = __decorateClass$2([
60290
+ RegisterShader(FatLineShader, "FatLineShader")
60291
+ ], FatLineShader);
60292
+
59606
60293
  var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
59607
60294
  var __decorateClass$1 = (decorators, target, key, kind) => {
59608
60295
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
@@ -59939,6 +60626,78 @@ class ColorLitMaterial extends Material {
59939
60626
  }
59940
60627
  }
59941
60628
 
60629
+ class FatLineMaterial extends Material {
60630
+ constructor() {
60631
+ super();
60632
+ this.shader = new FatLineShader();
60633
+ this.transparent = true;
60634
+ }
60635
+ /**
60636
+ * Set instance buffer for line segments
60637
+ * This should be called after setting the geometry
60638
+ */
60639
+ setInstanceBuffer(buffer) {
60640
+ this.shader.setStorageBuffer("instances", buffer);
60641
+ }
60642
+ /**
60643
+ * Set model matrix for transforming line segments
60644
+ * This should be updated each frame if the object moves
60645
+ */
60646
+ setModelMatrix(matrix) {
60647
+ const pass = this.shader.getDefaultColorShader();
60648
+ pass.setUniform("modelMatrix", matrix.rawData);
60649
+ }
60650
+ /**
60651
+ * Set base color (tint color)
60652
+ */
60653
+ set baseColor(color) {
60654
+ this.shader.setUniformColor(`baseColor`, color);
60655
+ }
60656
+ /**
60657
+ * Get base color (tint color)
60658
+ */
60659
+ get baseColor() {
60660
+ return this.shader.getUniformColor("baseColor");
60661
+ }
60662
+ /**
60663
+ * Set line width in pixels
60664
+ */
60665
+ set lineWidth(value) {
60666
+ this.shader.setUniformFloat(`lineWidth`, value);
60667
+ }
60668
+ /**
60669
+ * Get line width in pixels
60670
+ */
60671
+ get lineWidth() {
60672
+ return this.shader.getUniformFloat("lineWidth");
60673
+ }
60674
+ /**
60675
+ * Set opacity (0-1)
60676
+ */
60677
+ set opacity(value) {
60678
+ this.shader.setUniformFloat(`opacity`, value);
60679
+ }
60680
+ /**
60681
+ * Get opacity (0-1)
60682
+ */
60683
+ get opacity() {
60684
+ return this.shader.getUniformFloat("opacity");
60685
+ }
60686
+ /**
60687
+ * Set viewport resolution for correct pixel-space calculations
60688
+ * This should be set automatically by the renderer
60689
+ */
60690
+ set resolution(value) {
60691
+ this.shader.setUniformVector2(`resolution`, value);
60692
+ }
60693
+ /**
60694
+ * Get viewport resolution
60695
+ */
60696
+ get resolution() {
60697
+ return this.shader.getUniformVector2("resolution");
60698
+ }
60699
+ }
60700
+
59942
60701
  class LambertMaterial extends Material {
59943
60702
  /**
59944
60703
  * @constructor
@@ -65718,4 +66477,4 @@ const __viteBrowserExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.def
65718
66477
  __proto__: null
65719
66478
  }, Symbol.toStringTag, { value: 'Module' }));
65720
66479
 
65721
- export { AccelerateDecelerateInterpolator, AccelerateInterpolator, AnimationCurve, AnimationCurveT, AnimationMonitor, AnimatorComponent, AnimatorEventKeyframe, AnticipateInterpolator, AnticipateOvershootInterpolator, ArrayHas, ArrayItemIndex, AtlasParser, AtmosphericComponent, AtmosphericScatteringSky, AtmosphericScatteringSkySetting, AtmosphericScatteringSky_shader, AttributeAnimCurve, AxisObject, B3DMLoader, B3DMLoaderBase, B3DMParseUtil, B3DMParser, BRDFLUT, BRDFLUTGenerate, BRDF_frag, BatchTable, BiMap, BillboardComponent, BillboardType, BitUtil, BitmapTexture2D, BitmapTexture2DArray, BitmapTextureCube, Blend, BlendFactor, BlendMode, BlendShapeData, BlendShapePropertyData, BloomPost, BlurEffectCreatorBlur_cs, BlurEffectCreatorSample_cs, BlurTexture2DBufferCreator, BounceInterpolator, BoundUtil, BoundingBox, BoundingSphere, BoxColliderShape, BoxGeometry, BrdfLut_frag, BsDF_frag, BxDF_frag, BxdfDebug_frag, BytesArray, CEvent, CEventDispatcher, CEventListener, CResizeEvent, CSM, Camera3D, CameraControllerBase, CameraType, CameraUtil, CapsuleColliderShape, CastPointShadowMaterialPass, CastShadowMaterialPass, Clearcoat_frag, ClusterBoundsSource_cs, ClusterConfig, ClusterDebug_frag, ClusterLight, ClusterLightingBuffer, ClusterLightingRender, ClusterLighting_cs, CollectInfo, ColliderComponent, ColliderShape, ColliderShapeType, Color, ColorGradient, ColorLitMaterial, ColorLitShader, ColorPassFragmentOutput, ColorPassRenderer, ColorUtil, ComData, Combine_cs, Common_frag, Common_vert, ComponentBase, ComponentCollect, ComputeGPUBuffer, ComputeShader, Context3D, CubeCamera, CubeMapFaceEnum, CubeSky_Shader, CubicBezierCurve, CubicBezierPath, CubicBezierType, CycleInterpolator, CylinderGeometry, DDGIIrradianceComputePass, DDGIIrradianceGPUBufferReader, DDGIIrradianceVolume, DDGIIrradiance_shader, DDGILightingPass, DDGILighting_shader, DDGIMultiBouncePass, DDGIProbeRenderer, DEGREES_TO_RADIANS, DecelerateInterpolator, Denoising_cs, Depth2DTextureArray, DepthCubeArrayTexture, DepthMaterialPass, DepthOfFieldPost, DepthOfView_cs, DirectLight, DoubleArray, EditorInspector, Engine3D, Entity, EntityBatchCollect, EntityCollect, EnvMap_frag, ErpImage2CubeMap, ErpImage2CubeMapCreateCube_cs, ErpImage2CubeMapRgbe2rgba_cs, ExtrudeGeometry, FASTFLOOR, FXAAPost, FXAAShader, FastMathShader, FeatureTable, FileLoader, FirstPersonCameraController, Float16ArrayTexture, Float32ArrayTexture, FlyCameraController, FontChar, FontInfo, FontPage, FontParser, ForwardRenderJob, FragmentOutput, FragmentVarying, FrameCache, Frustum, FrustumCSM, FrustumCulling_cs, FullQuad_vert_wgsl, GBufferFrame, GBufferPass, GBufferPost, GBufferStand, GBuffer_pass, GILighting, GIProbeMaterial, GIProbeMaterialType, GIProbeShader, GIRenderCompleteEvent, GIRenderStartEvent, GLBChunk, GLBHeader, GLBParser, GLSLLexer, GLSLLexerToken, GLSLPreprocessor, GLSLSyntax, GLTFBinaryExtension, GLTFMaterial, GLTFParser, GLTFSubParser, GLTFSubParserCamera, GLTFSubParserConverter, GLTFSubParserMaterial, GLTFSubParserMesh, GLTFSubParserSkeleton, GLTFSubParserSkin, GLTFType, GLTF_Accessors, GLTF_Info, GLTF_Light, GLTF_Mesh, GLTF_Node, GLTF_Primitives, GLTF_Scene, GPUAddressMode, GPUBlendFactor, GPUBufferBase, GPUBufferType, GPUCompareFunction, GPUContext, GPUCullMode, GPUFilterMode, GPUPrimitiveTopology, GPUTextureFormat, GPUVertexFormat, GPUVertexStepMode, GSplatFormat, GSplatMaterial, GSplatRenderer, GSplat_FS, GSplat_VS, GTAOPost, GTAO_cs, GUIAtlasTexture, GUICanvas, GUIConfig, GUIGeometry, GUIGeometryRebuild, GUIMaterial, GUIPassRenderer, GUIPick, GUIPickHelper, GUIQuad, GUIQuadAttrEnum, GUIRenderer, GUIShader, GUISpace, GUISprite, GUITexture, GaussianSplatParser, GenerayRandomDir, GeoJsonParser, GeoJsonUtil, GeoType, GeometryBase, GeometryIndicesBuffer, GeometryUtil, GeometryVertexBuffer, GeometryVertexType, GetComponentClass, GetCountInstanceID, GetRepeat, GetShader, GlassShader, GlobalBindGroup, GlobalBindGroupLayout, GlobalFog, GlobalFog_shader, GlobalIlluminationComponent, GlobalUniform, GlobalUniformGroup, GodRayPost, GodRay_cs, GridObject, HDRTexture, HDRTextureCube, Hair_frag, Hair_shader_op, Hair_shader_tr, HaltonSeq, Horizontal, HoverCameraController, I3DMLoader, I3DMLoaderBase, I3DMParser, IBLEnvMapCreator, IBLEnvMapCreator_cs, IESProfiles, IESProfiles_frag, IKDTreeUserData, ImageType, IndicesGPUBuffer, Inline_vert, InputSystem, InstanceDrawComponent, InstanceUniform, InstancedMesh, Interpolator, InterpolatorEnum, IrradianceDataReaderCompleteEvent, IrradianceVolumeData_frag, Irradiance_frag, IsEditorInspector, IsNonSerialize, Joint, JointPose, JumperInterpolator, KDTreeEntity, KDTreeNode, KDTreeRange, KDTreeSpace, KDTreeUUID, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_clearcoat, KHR_materials_emissive_strength, KHR_materials_ior, KHR_materials_unlit, KMZParser, KV, KelvinUtil, KeyCode, KeyEvent, Keyframe, KeyframeT, LDRTextureCube, LambertMaterial, Lambert_shader, Light, LightBase, LightData, LightEntries, LightType, LightingFunction_frag, Line, LineClassification, LinearInterpolator, LitMaterial, LitSSSShader, LitShader, Lit_shader, LoaderBase, LoaderEvent, LoaderManager, MAX_VALUE, MIN_VALUE, Material, MaterialDataUniformGPUBuffer, MaterialUtilities, MathShader, MathUtil, Matrix3, Matrix4, MatrixBindGroup, MatrixGPUBuffer, MatrixShader, MemoryDO, MemoryInfo, MergeRGBACreator, MergeRGBA_cs, MeshColliderShape, MeshFilter, MeshRenderer, MinMaxAnimationCurves, MinMaxCurve, MinMaxCurveState, MinMaxPolyCurves, MorePassParser, MorePassShader, MorphTargetBlender, MorphTargetData, MorphTargetFrame, MorphTargetTransformKey, MorphTarget_shader, MouseCode, MultiBouncePass_cs, Navi3DAstar, Navi3DConst, Navi3DEdge, Navi3DFunnel, Navi3DMaskType, Navi3DMesh, Navi3DPoint, Navi3DPoint2D, Navi3DPointFat, Navi3DRouter, Navi3DTriangle, NonSerialize, NormalMap_frag, OAnimationEvent, OBJParser, Object3D, Object3DEvent, Object3DTransformTools, Object3DUtil, ObjectAnimClip, OcclusionSystem, Octree, OctreeEntity, OrbitController, OrderMap, Orientation3D, OutLineBlendColor_cs, OutlineCalcOutline_cs, OutlinePass, OutlinePost, OutlinePostData, OutlinePostManager, OutlinePostSlot, Outline_cs, OvershootInterpolator, PBRLItShader, PBRLitSSSShader, ParserBase, ParserFormat, ParticleSystemCurveEvalMode, ParticleSystemRandomnessIds, PassGenerate, PassShader, PassType, PhysicMaterialUniform_frag, PickCompute, PickFire, PickGUIEvent3D, PickResult, Picker_cs, PingPong, PipelinePool, Plane3D, PlaneClassification, PlaneGeometry, PointClassification, PointLight, PointLightShadowRenderer, PointShadowCubeCamera, PointerEvent3D, Polynomial, PolynomialCurve, Polynomials, PoolNode, PostBase, PostProcessingComponent, PostRenderer, PreDepthPassRenderer, PreFilteredEnvironment_cs, PreFilteredEnvironment_cs2, PreIntegratedLut, PreIntegratedLutCompute, PrefabAvatarData, PrefabAvatarParser, PrefabBoneData, PrefabMaterialParser, PrefabMeshData, PrefabMeshParser, PrefabNode, PrefabParser, PrefabStringUtil, PrefabTextureData, PrefabTextureParser, Preprocessor, Probe, ProbeEntries, ProbeGBufferFrame, ProfilerUtil, PropertyAnimClip, PropertyAnimTag, PropertyAnimation, PropertyAnimationClip, PropertyAnimationClipState, PropertyAnimationEvent, PropertyHelp, QuadAABB, QuadGlsl_fs, QuadGlsl_vs, QuadRoot, QuadShader, QuadTree, QuadTreeCell, Quad_depth2dArray_frag_wgsl, Quad_depth2d_frag_wgsl, Quad_depthCube_frag_wgsl, Quad_frag_wgsl, Quad_vert_wgsl, Quaternion, RADIANS_TO_DEGREES, RGBEErrorCode, RGBEHeader, RGBEParser, RTDescriptor, RTFrame, RTResourceConfig, RTResourceMap, Rand, RandomSeed, Ray, RayCastMeshDetail, Reader, Rect, Reference, Reflection, ReflectionCG, ReflectionEntries, ReflectionMaterial, ReflectionRenderer, ReflectionShader, ReflectionShader_shader, RegisterComponent, RegisterShader, RenderContext, RenderLayer, RenderLayerUtil, RenderNode, RenderShaderCollect, RenderShaderCompute, RenderShaderPass, RenderTexture, RendererBase, RendererJob, RendererMap, RendererMask, RendererMaskUtil, RendererPassState, RepeatSE, Res, RotationControlComponents, SHCommon_frag, SN_ArrayConstant, SN_BinaryOperation, SN_Break, SN_CodeBlock, SN_Constant, SN_Continue, SN_Declaration, SN_Discard, SN_DoWhileLoop, SN_Expression, SN_ForLoop, SN_Function, SN_FunctionArgs, SN_FunctionCall, SN_IFBranch, SN_Identifier, SN_IndexOperation, SN_Layout, SN_ParenExpression, SN_Precision, SN_Return, SN_SelectOperation, SN_Struct, SN_TernaryOperation, SN_UnaryOperation, SN_WhileLoop, SSAO_cs, SSGI2_cs, SSGIPost, SSRPost, SSR_BlendColor_cs, SSR_IS_Kernel, SSR_IS_cs, SSR_RayTrace_cs, ScaleControlComponents, Scene3D, Shader, ShaderAttributeInfo, ShaderConverter, ShaderConverterResult, ShaderLib, ShaderPassBase, ShaderReflection, ShaderStage, ShaderState, ShaderUniformInfo, ShaderUtil, ShadingInput, ShadowLightsCollect, ShadowMapPassRenderer, ShadowMapping_frag, Skeleton, SkeletonAnimationClip, SkeletonAnimationClipState, SkeletonAnimationComponent, SkeletonAnimationCompute, SkeletonAnimation_shader, SkeletonBlendComputeArgs, SkeletonPose, SkeletonTransformComputeArgs, SkinnedMeshRenderer, SkinnedMeshRenderer2, SkyGBufferPass, SkyGBuffer_pass, SkyMaterial, SkyRenderer, SkyShader, SolidColorSky, SphereColliderShape, SphereGeometry, SphereReflection, SpotLight, StandShader, StatementNode, StorageGPUBuffer, StringUtil, Struct, StructStorageGPUBuffer, SubGeometry, TAACopyTex_cs, TAAPost, TAASharpTex_cs, TAA_cs, TestComputeLoadBuffer, TextAnchor, TextFieldLayout, TextFieldLine, Texture, TextureCube, TextureCubeFaceData, TextureCubeStdCreator, TextureCubeUtils, TextureMipmapCompute, TextureMipmapGenerator, TextureScaleCompute, ThirdPersonCameraController, TileSet, TileSetChild, TileSetChildContent, TileSetChildContentMetaData, TileSetRoot, TilesRenderer, Time, TokenType, TorusGeometry, TouchData, TrailGeometry, Transform, TransformAxisEnum, TransformControllerBaseComponent, TransformMode, TransformSpaceMode, TranslationControlComponents, TranslatorContext, TriGeometry, Triangle, UIButton, UIButtonTransition, UIComponentBase, UIEvent, UIImage, UIImageGroup, UIInteractive, UIInteractiveStyle, UIPanel, UIRenderAble, UIShadow, UITextField, UITransform, UUID, UV, Uint32ArrayTexture, Uint8ArrayTexture, UnLit, UnLitMaterial, UnLitMaterialUniform_frag, UnLitShader, UnLitTexArrayMaterial, UnLitTexArrayShader, UnLitTextureArray, UnLit_frag, UniformGPUBuffer, UniformNode, UniformType, ValueEnumType, ValueOp, ValueParser, ValueSpread, Vector2, Vector3, Vector3Ex, Vector4, VertexAttribute, VertexAttributeIndexShader, VertexAttributeName, VertexAttributeSize, VertexAttributeStride, VertexAttributes_vert, VertexBufferLayout, VertexFormat, VertexGPUBuffer, Vertical, VideoUniform_frag, View3D, ViewPanel, ViewQuad, VirtualTexture, WGSLTranslator, WayLines3D, WayPoint3D, WebGPUDescriptorCreator, WorldMatrixUniform, WorldPanel, WrapMode, WrapTimeMode, ZCullingCompute, ZPassShader_cs, ZPassShader_fs, ZPassShader_vs, ZSorterUtil, append, arrayToString, blendComponent, buildCurves, byteSizeOfType, calculateCurveRangesValue, calculateMinMax, castPointShadowMap_vert, clamp, clampRepeat, computeAABBFromPositions, cos, crossProduct, cubicPolynomialRoot, cubicPolynomialRootsGeneric, curvesSupportProcedural, deg2Rad, detectGSplatFormat, directionShadowCastMap_frag, dot, doubleIntegrateSegment, downSample, fastInvSqrt, floorfToIntPos, fonts, generateRandom, generateRandom3, getFloatFromInt, getGLTypeFromTypedArray, getGLTypeFromTypedArrayType, getGlobalRandomSeed, getTypedArray, getTypedArrayTypeFromGLType, grad1, grad2, grad3, grad4, inferSHOrder, integrateSegment, irradianceDataReader, kPI, lerp, lerpByte, lerpColor, lerpVector3, magnitude, makeAloneSprite, makeGUISprite, makeMatrix44, matrixMultiply, matrixRotate, matrixRotateY, mergeFunctions, multiplyMatrices4x4REF, normal_distribution, normalizeFast, normalizeSafe, normalizedToByte, normalizedToWord, outlinePostData, outlinePostManager, parsePlyGaussianSplat, parsePlyHeader, perm, post, quadraticPolynomialRootsGeneric, rad2Deg, random01, randomBarycentricCoord, randomPointBetweenEllipsoid, randomPointBetweenSphere, randomPointInsideCube, randomPointInsideEllipsoid, randomPointInsideUnitCircle, randomPointInsideUnitSphere, randomQuaternion, randomQuaternionUniformDistribution, randomSeed, randomUnitVector, randomUnitVector2, rangedRandomFloat, rangedRandomInt, readByType, readMagicBytes, registerMaterial, repeat, rotMatrix, rotateVectorByQuat, roundfToIntPos, scale, shadowCastMap_frag, shadowCastMap_vert, simplex, sin, snoise1, snoise2, snoise3, snoise4, sqrMagnitude, sqrtImpl, stencilStateFace, swap, textureCompress, threshold, toHalfFloat, tw, uniform_real_distribution, uniform_real_distribution2, upSample$1 as upSample, webGPUContext, zSorterUtil };
66480
+ export { AccelerateDecelerateInterpolator, AccelerateInterpolator, AnimationCurve, AnimationCurveT, AnimationMonitor, AnimatorComponent, AnimatorEventKeyframe, AnticipateInterpolator, AnticipateOvershootInterpolator, ArrayHas, ArrayItemIndex, AtlasParser, AtmosphericComponent, AtmosphericScatteringSky, AtmosphericScatteringSkySetting, AtmosphericScatteringSky_shader, AttributeAnimCurve, AxisObject, B3DMLoader, B3DMLoaderBase, B3DMParseUtil, B3DMParser, BRDFLUT, BRDFLUTGenerate, BRDF_frag, BatchTable, BiMap, BillboardComponent, BillboardType, BitUtil, BitmapTexture2D, BitmapTexture2DArray, BitmapTextureCube, Blend, BlendFactor, BlendMode, BlendShapeData, BlendShapePropertyData, BloomPost, BlurEffectCreatorBlur_cs, BlurEffectCreatorSample_cs, BlurTexture2DBufferCreator, BounceInterpolator, BoundUtil, BoundingBox, BoundingSphere, BoxColliderShape, BoxGeometry, BrdfLut_frag, BsDF_frag, BxDF_frag, BxdfDebug_frag, BytesArray, CEvent, CEventDispatcher, CEventListener, CResizeEvent, CSM, Camera3D, CameraControllerBase, CameraType, CameraUtil, CapsuleColliderShape, CastPointShadowMaterialPass, CastShadowMaterialPass, Clearcoat_frag, ClusterBoundsSource_cs, ClusterConfig, ClusterDebug_frag, ClusterLight, ClusterLightingBuffer, ClusterLightingRender, ClusterLighting_cs, CollectInfo, ColliderComponent, ColliderShape, ColliderShapeType, Color, ColorGradient, ColorLitMaterial, ColorLitShader, ColorPassFragmentOutput, ColorPassRenderer, ColorUtil, ComData, Combine_cs, Common_frag, Common_vert, ComponentBase, ComponentCollect, ComputeGPUBuffer, ComputeShader, Context3D, CubeCamera, CubeMapFaceEnum, CubeSky_Shader, CubicBezierCurve, CubicBezierPath, CubicBezierType, CycleInterpolator, CylinderGeometry, DDGIIrradianceComputePass, DDGIIrradianceGPUBufferReader, DDGIIrradianceVolume, DDGIIrradiance_shader, DDGILightingPass, DDGILighting_shader, DDGIMultiBouncePass, DDGIProbeRenderer, DEGREES_TO_RADIANS, DecelerateInterpolator, Denoising_cs, Depth2DTextureArray, DepthCubeArrayTexture, DepthMaterialPass, DepthOfFieldPost, DepthOfView_cs, DirectLight, DoubleArray, EditorInspector, Engine3D, Entity, EntityBatchCollect, EntityCollect, EnvMap_frag, ErpImage2CubeMap, ErpImage2CubeMapCreateCube_cs, ErpImage2CubeMapRgbe2rgba_cs, ExtrudeGeometry, FASTFLOOR, FXAAPost, FXAAShader, FastMathShader, FatLineGeometry, FatLineMaterial, FatLineRenderer, FatLineShader, FatLine_FS, FatLine_VS, FeatureTable, FileLoader, FirstPersonCameraController, Float16ArrayTexture, Float32ArrayTexture, FlyCameraController, FontChar, FontInfo, FontPage, FontParser, ForwardRenderJob, FragmentOutput, FragmentVarying, FrameCache, Frustum, FrustumCSM, FrustumCulling_cs, FullQuad_vert_wgsl, GBufferFrame, GBufferPass, GBufferPost, GBufferStand, GBuffer_pass, GILighting, GIProbeMaterial, GIProbeMaterialType, GIProbeShader, GIRenderCompleteEvent, GIRenderStartEvent, GLBChunk, GLBHeader, GLBParser, GLSLLexer, GLSLLexerToken, GLSLPreprocessor, GLSLSyntax, GLTFBinaryExtension, GLTFMaterial, GLTFParser, GLTFSubParser, GLTFSubParserCamera, GLTFSubParserConverter, GLTFSubParserMaterial, GLTFSubParserMesh, GLTFSubParserSkeleton, GLTFSubParserSkin, GLTFType, GLTF_Accessors, GLTF_Info, GLTF_Light, GLTF_Mesh, GLTF_Node, GLTF_Primitives, GLTF_Scene, GPUAddressMode, GPUBlendFactor, GPUBufferBase, GPUBufferType, GPUCompareFunction, GPUContext, GPUCullMode, GPUFilterMode, GPUPrimitiveTopology, GPUTextureFormat, GPUVertexFormat, GPUVertexStepMode, GSplatFormat, GSplatGeometry, GSplatMaterial, GSplatRenderer, GSplatShader, GSplat_FS, GSplat_VS, GTAOPost, GTAO_cs, GUIAtlasTexture, GUICanvas, GUIConfig, GUIGeometry, GUIGeometryRebuild, GUIMaterial, GUIPassRenderer, GUIPick, GUIPickHelper, GUIQuad, GUIQuadAttrEnum, GUIRenderer, GUIShader, GUISpace, GUISprite, GUITexture, GaussianSplatParser, GenerayRandomDir, GeoJsonParser, GeoJsonUtil, GeoType, GeometryBase, GeometryIndicesBuffer, GeometryUtil, GeometryVertexBuffer, GeometryVertexType, GetComponentClass, GetCountInstanceID, GetRepeat, GetShader, GlassShader, GlobalBindGroup, GlobalBindGroupLayout, GlobalFog, GlobalFog_shader, GlobalIlluminationComponent, GlobalUniform, GlobalUniformGroup, GodRayPost, GodRay_cs, GridObject, HDRTexture, HDRTextureCube, Hair_frag, Hair_shader_op, Hair_shader_tr, HaltonSeq, Horizontal, HoverCameraController, I3DMLoader, I3DMLoaderBase, I3DMParser, IBLEnvMapCreator, IBLEnvMapCreator_cs, IESProfiles, IESProfiles_frag, IKDTreeUserData, ImageType, IndicesGPUBuffer, Inline_vert, InputSystem, InstanceDrawComponent, InstanceUniform, InstancedMesh, Interpolator, InterpolatorEnum, IrradianceDataReaderCompleteEvent, IrradianceVolumeData_frag, Irradiance_frag, IsEditorInspector, IsNonSerialize, Joint, JointPose, JumperInterpolator, KDTreeEntity, KDTreeNode, KDTreeRange, KDTreeSpace, KDTreeUUID, KHR_draco_mesh_compression, KHR_lights_punctual, KHR_materials_clearcoat, KHR_materials_emissive_strength, KHR_materials_ior, KHR_materials_unlit, KMZParser, KV, KelvinUtil, KeyCode, KeyEvent, Keyframe, KeyframeT, LDRTextureCube, LambertMaterial, Lambert_shader, Light, LightBase, LightData, LightEntries, LightType, LightingFunction_frag, Line, LineClassification, LinearInterpolator, LitMaterial, LitSSSShader, LitShader, Lit_shader, LoaderBase, LoaderEvent, LoaderManager, MAX_VALUE, MIN_VALUE, Material, MaterialDataUniformGPUBuffer, MaterialUtilities, MathShader, MathUtil, Matrix3, Matrix4, MatrixBindGroup, MatrixGPUBuffer, MatrixShader, MemoryDO, MemoryInfo, MergeRGBACreator, MergeRGBA_cs, MeshColliderShape, MeshFilter, MeshRenderer, MinMaxAnimationCurves, MinMaxCurve, MinMaxCurveState, MinMaxPolyCurves, MorePassParser, MorePassShader, MorphTargetBlender, MorphTargetData, MorphTargetFrame, MorphTargetTransformKey, MorphTarget_shader, MouseCode, MultiBouncePass_cs, Navi3DAstar, Navi3DConst, Navi3DEdge, Navi3DFunnel, Navi3DMaskType, Navi3DMesh, Navi3DPoint, Navi3DPoint2D, Navi3DPointFat, Navi3DRouter, Navi3DTriangle, NonSerialize, NormalMap_frag, OAnimationEvent, OBJParser, Object3D, Object3DEvent, Object3DTransformTools, Object3DUtil, ObjectAnimClip, OcclusionSystem, Octree, OctreeEntity, OrbitController, OrderMap, Orientation3D, OutLineBlendColor_cs, OutlineCalcOutline_cs, OutlinePass, OutlinePost, OutlinePostData, OutlinePostManager, OutlinePostSlot, Outline_cs, OvershootInterpolator, PBRLItShader, PBRLitSSSShader, ParserBase, ParserFormat, ParticleSystemCurveEvalMode, ParticleSystemRandomnessIds, PassGenerate, PassShader, PassType, PhysicMaterialUniform_frag, PickCompute, PickFire, PickGUIEvent3D, PickResult, Picker_cs, PingPong, PipelinePool, Plane3D, PlaneClassification, PlaneGeometry, PointClassification, PointLight, PointLightShadowRenderer, PointShadowCubeCamera, PointerEvent3D, Polynomial, PolynomialCurve, Polynomials, PoolNode, PostBase, PostProcessingComponent, PostRenderer, PreDepthPassRenderer, PreFilteredEnvironment_cs, PreFilteredEnvironment_cs2, PreIntegratedLut, PreIntegratedLutCompute, PrefabAvatarData, PrefabAvatarParser, PrefabBoneData, PrefabMaterialParser, PrefabMeshData, PrefabMeshParser, PrefabNode, PrefabParser, PrefabStringUtil, PrefabTextureData, PrefabTextureParser, Preprocessor, Probe, ProbeEntries, ProbeGBufferFrame, ProfilerUtil, PropertyAnimClip, PropertyAnimTag, PropertyAnimation, PropertyAnimationClip, PropertyAnimationClipState, PropertyAnimationEvent, PropertyHelp, QuadAABB, QuadGlsl_fs, QuadGlsl_vs, QuadRoot, QuadShader, QuadTree, QuadTreeCell, Quad_depth2dArray_frag_wgsl, Quad_depth2d_frag_wgsl, Quad_depthCube_frag_wgsl, Quad_frag_wgsl, Quad_vert_wgsl, Quaternion, R32UintTexture, RADIANS_TO_DEGREES, RGBEErrorCode, RGBEHeader, RGBEParser, RTDescriptor, RTFrame, RTResourceConfig, RTResourceMap, Rand, RandomSeed, Ray, RayCastMeshDetail, Reader, Rect, Reference, Reflection, ReflectionCG, ReflectionEntries, ReflectionMaterial, ReflectionRenderer, ReflectionShader, ReflectionShader_shader, RegisterComponent, RegisterShader, RenderContext, RenderLayer, RenderLayerUtil, RenderNode, RenderShaderCollect, RenderShaderCompute, RenderShaderPass, RenderTexture, RendererBase, RendererJob, RendererMap, RendererMask, RendererMaskUtil, RendererPassState, RepeatSE, Res, RotationControlComponents, SHCommon_frag, SN_ArrayConstant, SN_BinaryOperation, SN_Break, SN_CodeBlock, SN_Constant, SN_Continue, SN_Declaration, SN_Discard, SN_DoWhileLoop, SN_Expression, SN_ForLoop, SN_Function, SN_FunctionArgs, SN_FunctionCall, SN_IFBranch, SN_Identifier, SN_IndexOperation, SN_Layout, SN_ParenExpression, SN_Precision, SN_Return, SN_SelectOperation, SN_Struct, SN_TernaryOperation, SN_UnaryOperation, SN_WhileLoop, SSAO_cs, SSGI2_cs, SSGIPost, SSRPost, SSR_BlendColor_cs, SSR_IS_Kernel, SSR_IS_cs, SSR_RayTrace_cs, ScaleControlComponents, Scene3D, Shader, ShaderAttributeInfo, ShaderConverter, ShaderConverterResult, ShaderLib, ShaderPassBase, ShaderReflection, ShaderStage, ShaderState, ShaderUniformInfo, ShaderUtil, ShadingInput, ShadowLightsCollect, ShadowMapPassRenderer, ShadowMapping_frag, Skeleton, SkeletonAnimationClip, SkeletonAnimationClipState, SkeletonAnimationComponent, SkeletonAnimationCompute, SkeletonAnimation_shader, SkeletonBlendComputeArgs, SkeletonPose, SkeletonTransformComputeArgs, SkinnedMeshRenderer, SkinnedMeshRenderer2, SkyGBufferPass, SkyGBuffer_pass, SkyMaterial, SkyRenderer, SkyShader, SolidColorSky, SphereColliderShape, SphereGeometry, SphereReflection, SpotLight, StandShader, StatementNode, StorageGPUBuffer, StringUtil, Struct, StructStorageGPUBuffer, SubGeometry, TAACopyTex_cs, TAAPost, TAASharpTex_cs, TAA_cs, TestComputeLoadBuffer, TextAnchor, TextFieldLayout, TextFieldLine, Texture, TextureCube, TextureCubeFaceData, TextureCubeStdCreator, TextureCubeUtils, TextureMipmapCompute, TextureMipmapGenerator, TextureScaleCompute, ThirdPersonCameraController, TileSet, TileSetChild, TileSetChildContent, TileSetChildContentMetaData, TileSetRoot, TilesRenderer, Time, TokenType, TorusGeometry, TouchData, TrailGeometry, Transform, TransformAxisEnum, TransformControllerBaseComponent, TransformMode, TransformSpaceMode, TranslationControlComponents, TranslatorContext, TriGeometry, Triangle, UIButton, UIButtonTransition, UIComponentBase, UIEvent, UIImage, UIImageGroup, UIInteractive, UIInteractiveStyle, UIPanel, UIRenderAble, UIShadow, UITextField, UITransform, UUID, UV, Uint32ArrayTexture, Uint8ArrayTexture, UnLit, UnLitMaterial, UnLitMaterialUniform_frag, UnLitShader, UnLitTexArrayMaterial, UnLitTexArrayShader, UnLitTextureArray, UnLit_frag, UniformGPUBuffer, UniformNode, UniformType, ValueEnumType, ValueOp, ValueParser, ValueSpread, Vector2, Vector3, Vector3Ex, Vector4, VertexAttribute, VertexAttributeIndexShader, VertexAttributeName, VertexAttributeSize, VertexAttributeStride, VertexAttributes_vert, VertexBufferLayout, VertexFormat, VertexGPUBuffer, Vertical, VideoUniform_frag, View3D, ViewPanel, ViewQuad, VirtualTexture, WGSLTranslator, WayLines3D, WayPoint3D, WebGPUDescriptorCreator, WorldMatrixUniform, WorldPanel, WrapMode, WrapTimeMode, ZCullingCompute, ZPassShader_cs, ZPassShader_fs, ZPassShader_vs, ZSorterUtil, append, arrayToString, blendComponent, buildCurves, byteSizeOfType, calculateCurveRangesValue, calculateMinMax, castPointShadowMap_vert, clamp, clampRepeat, computeAABBFromPositions, cos, crossProduct, cubicPolynomialRoot, cubicPolynomialRootsGeneric, curvesSupportProcedural, deg2Rad, detectGSplatFormat, directionShadowCastMap_frag, dot, doubleIntegrateSegment, downSample, fastInvSqrt, floorfToIntPos, fonts, generateRandom, generateRandom3, getFloatFromInt, getGLTypeFromTypedArray, getGLTypeFromTypedArrayType, getGlobalRandomSeed, getTypedArray, getTypedArrayTypeFromGLType, grad1, grad2, grad3, grad4, inferSHOrder, integrateSegment, irradianceDataReader, kPI, lerp, lerpByte, lerpColor, lerpVector3, magnitude, makeAloneSprite, makeGUISprite, makeMatrix44, matrixMultiply, matrixRotate, matrixRotateY, mergeFunctions, multiplyMatrices4x4REF, normal_distribution, normalizeFast, normalizeSafe, normalizedToByte, normalizedToWord, outlinePostData, outlinePostManager, parsePlyGaussianSplat, parsePlyHeader, perm, post, quadraticPolynomialRootsGeneric, rad2Deg, random01, randomBarycentricCoord, randomPointBetweenEllipsoid, randomPointBetweenSphere, randomPointInsideCube, randomPointInsideEllipsoid, randomPointInsideUnitCircle, randomPointInsideUnitSphere, randomQuaternion, randomQuaternionUniformDistribution, randomSeed, randomUnitVector, randomUnitVector2, rangedRandomFloat, rangedRandomInt, readByType, readMagicBytes, registerMaterial, repeat, rotMatrix, rotateVectorByQuat, roundfToIntPos, scale, shadowCastMap_frag, shadowCastMap_vert, simplex, sin, snoise1, snoise2, snoise3, snoise4, sqrMagnitude, sqrtImpl, stencilStateFace, swap, textureCompress, threshold, toHalfFloat, tw, uniform_real_distribution, uniform_real_distribution2, upSample$1 as upSample, webGPUContext, zSorterUtil };