rayzee 7.27.0 → 7.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/rayzee.es.js CHANGED
@@ -10488,19 +10488,19 @@ function ef(e) {
10488
10488
  ie.assign(I(le, e.w, P(e.w, D.w, u)));
10489
10489
  });
10490
10490
  }), p(ue, () => {
10491
- let e = Pa(D.xyz), t = P(E.element(T).toVar(), e.mul(e), u).toVar();
10492
- E.element(T).assign(t);
10493
- let n = Pa(k).toVar(), r = t.sub(n.mul(n)).max(A(0)).div(A(s).add(1)).sqrt().toVar(), i = r.div(n.add(A(1e-4))), a = I(n.lessThan(A(1)), n.sqrt(), n), o = r.div(a.add(A(1e-4))).lessThan(O);
10491
+ let e = Pa(D.xyz), t = E.element(T).toVar(), n = I(le, t, P(t, e.mul(e), u)).toVar();
10492
+ E.element(T).assign(n);
10493
+ let r = Pa(k).toVar(), i = n.sub(r.mul(r)).max(A(0)).div(A(s).add(1)).sqrt().toVar(), a = i.div(r.add(A(1e-4))), o = I(r.lessThan(A(1)), r.sqrt(), r), c = i.div(o.add(A(1e-4))).lessThan(O);
10494
10494
  p(oe.or(ce), () => {
10495
- let e = oe.and(s.greaterThanEqual(R(ee))).and(o), t = ne.element(T).toVar(), r = t.bitAnd(R(1073741823)).toVar(), a = r.toVar(), c = D.w.greaterThan(A(.5)), l = t.bitAnd(R(1073741824)).notEqual(R(0)), u = I(s.equal(R(0)), I(c, R(1073741824), R(0)), I(c.or(l), R(1073741824), R(0))).toVar();
10495
+ let e = oe.and(s.greaterThanEqual(R(ee))).and(c), t = ne.element(T).toVar(), n = t.bitAnd(R(1073741823)).toVar(), i = n.toVar(), o = D.w.greaterThan(A(.5)), l = t.bitAnd(R(1073741824)).notEqual(R(0)), u = I(s.equal(R(0)), I(o, R(1073741824), R(0)), I(o.or(l), R(1073741824), R(0))).toVar();
10496
10496
  p(ce, () => {
10497
10497
  p(s.equal(R(0)), () => {
10498
- a.assign(R(0));
10498
+ i.assign(R(0));
10499
10499
  }), p(le.not().and(s.greaterThan(R(0))), () => {
10500
- let e = s.greaterThanEqual(R(ee)).and(i.lessThan(te)).and(n.greaterThan(A(0)));
10501
- a.assign(I(e, r.add(R(1)), R(0)));
10500
+ let e = s.greaterThanEqual(R(ee)).and(a.lessThan(te)).and(r.greaterThan(A(0)));
10501
+ i.assign(I(e, n.add(R(1)), R(0)));
10502
10502
  });
10503
- }), ne.element(T).assign(a.bitOr(I(e, R(2147483648), R(0))).bitOr(u));
10503
+ }), ne.element(T).assign(i.bitOr(I(e, R(2147483648), R(0))).bitOr(u));
10504
10504
  });
10505
10505
  }), p(C.equal(M(11)), () => {
10506
10506
  k.assign($d(k));
@@ -635,7 +635,7 @@
635
635
  if ( isNan || isInf ) { return vec3f( 1.0f, 0.0f, 0.0f ); }
636
636
  return vec3f( 0.0f );
637
637
  }
638
- `);function tl(e){let{rayBufferRO:t,gBufferRO:r,writeColorTex:i,writeNDTex:a,writeAlbedoTex:o,resolution:s,frame:c,enableAccumulation:l,hasPreviousAccumulated:u,accumulationAlpha:d,cameraIsMoving:f,hasPreviousAux:p,auxAccumulationAlpha:m,transparentBackground:h,prevAccumTexture:g,prevAlbedoTexture:_,prevNormalDepthTexture:v,renderWidth:y,chunkRowBase:b,chunkRows:x,visMode:S,auxGBufferEnabled:C,cleanAuxNormalEnabled:w,m2BufferRW:T,useAdaptiveSampling:E,noiseThreshold:D,adaptiveMinSamples:O,usePixelFreeze:k,pixelFreezeThreshold:A,streakBufferRW:j,frozenMaskRO:M,convergenceOverlay:N}=e,P=C.greaterThan((0,n.uint)(0)),F=w.greaterThan((0,n.uint)(0)),I=E.greaterThan((0,n.int)(0)),ee=k.greaterThan((0,n.int)(0)),te=I.or(ee).or(N.greaterThan((0,n.int)(0)));return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(y).and(C.lessThan(x)),()=>{let x=C.add(b),w=(0,n.uint)(C.mul(y).add(e)),E=(0,n.uint)(x.mul(y).add(e)),k=Io(t,w),N=k.xyz.toVar(),ne=(0,n.select)(h,k.w,(0,n.float)(1)).toVar(),re=ee.and(c.greaterThan((0,n.uint)(0))).and(M.element(E).equal((0,n.uint)(1))).toVar(),ie=(0,n.vec4)(0).toVar(),ae=(0,n.vec4)(0).xyz.toVar();(0,n.If)(P,()=>{let e=zo(r,w);ie.assign(Bo(e)),ae.assign((0,n.vec4)(Vo(e),0).xyz)});let oe=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(x).add(.5)).div(s);(0,n.If)(l.and(f.not()).and(c.greaterThan((0,n.uint)(0))).and(u).and(S.notEqual((0,n.int)(11))),()=>{let e=(0,n.texture)(g,oe,0).toVar();N.assign((0,n.select)(re,e.xyz,(0,n.mix)(e.xyz,k.xyz,d))),(0,n.If)(P.and(p),()=>{ae.assign((0,n.mix)((0,n.texture)(_,oe,0).xyz,ae,m)),(0,n.If)(F,()=>{let e=(0,n.texture)(v,oe,0).xyz.mul(2).sub(1),t=ie.xyz.mul(2).sub(1).toVar(),r=(0,n.mix)(e,t,m).toVar(),i=(0,n.length)(r),a=(0,n.select)(i.greaterThan(1e-4),r.div(i),t);ie.assign((0,n.vec4)(a.mul(.5).add(.5),ie.w))})}),(0,n.If)(h,()=>{ne.assign((0,n.select)(re,e.w,(0,n.mix)(e.w,k.w,d)))})}),(0,n.If)(te,()=>{let e=Rn(k.xyz),t=(0,n.mix)(T.element(E).toVar(),e.mul(e),d).toVar();T.element(E).assign(t);let r=Rn(N).toVar(),i=t.sub(r.mul(r)).max((0,n.float)(0)).div((0,n.float)(c).add(1)).sqrt().toVar(),a=i.div(r.add((0,n.float)(1e-4))),o=(0,n.select)(r.lessThan((0,n.float)(1)),r.sqrt(),r),s=i.div(o.add((0,n.float)(1e-4))).lessThan(D);(0,n.If)(I.or(ee),()=>{let e=I.and(c.greaterThanEqual((0,n.uint)(O))).and(s),t=j.element(E).toVar(),i=t.bitAnd((0,n.uint)(1073741823)).toVar(),o=i.toVar(),l=k.w.greaterThan((0,n.float)(.5)),u=t.bitAnd((0,n.uint)(1073741824)).notEqual((0,n.uint)(0)),d=(0,n.select)(c.equal((0,n.uint)(0)),(0,n.select)(l,(0,n.uint)(1073741824),(0,n.uint)(0)),(0,n.select)(l.or(u),(0,n.uint)(1073741824),(0,n.uint)(0))).toVar();(0,n.If)(ee,()=>{(0,n.If)(c.equal((0,n.uint)(0)),()=>{o.assign((0,n.uint)(0))}),(0,n.If)(re.not().and(c.greaterThan((0,n.uint)(0))),()=>{let e=c.greaterThanEqual((0,n.uint)(O)).and(a.lessThan(A)).and(r.greaterThan((0,n.float)(0)));o.assign((0,n.select)(e,i.add((0,n.uint)(1)),(0,n.uint)(0)))})}),j.element(E).assign(o.bitOr((0,n.select)(e,(0,n.uint)(2147483648),(0,n.uint)(0))).bitOr(d))})}),(0,n.If)(S.equal((0,n.int)(11)),()=>{N.assign(el(N))});let se=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(x));(0,n.textureStore)(i,se,(0,n.vec4)(N,ne)).toWriteOnly(),(0,n.If)(P,()=>{(0,n.textureStore)(a,se,ie).toWriteOnly(),(0,n.textureStore)(o,se,(0,n.vec4)(ae,1)).toWriteOnly()})})})}var nl=(0,n.wgslFn)(`
638
+ `);function tl(e){let{rayBufferRO:t,gBufferRO:r,writeColorTex:i,writeNDTex:a,writeAlbedoTex:o,resolution:s,frame:c,enableAccumulation:l,hasPreviousAccumulated:u,accumulationAlpha:d,cameraIsMoving:f,hasPreviousAux:p,auxAccumulationAlpha:m,transparentBackground:h,prevAccumTexture:g,prevAlbedoTexture:_,prevNormalDepthTexture:v,renderWidth:y,chunkRowBase:b,chunkRows:x,visMode:S,auxGBufferEnabled:C,cleanAuxNormalEnabled:w,m2BufferRW:T,useAdaptiveSampling:E,noiseThreshold:D,adaptiveMinSamples:O,usePixelFreeze:k,pixelFreezeThreshold:A,streakBufferRW:j,frozenMaskRO:M,convergenceOverlay:N}=e,P=C.greaterThan((0,n.uint)(0)),F=w.greaterThan((0,n.uint)(0)),I=E.greaterThan((0,n.int)(0)),ee=k.greaterThan((0,n.int)(0)),te=I.or(ee).or(N.greaterThan((0,n.int)(0)));return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(y).and(C.lessThan(x)),()=>{let x=C.add(b),w=(0,n.uint)(C.mul(y).add(e)),E=(0,n.uint)(x.mul(y).add(e)),k=Io(t,w),N=k.xyz.toVar(),ne=(0,n.select)(h,k.w,(0,n.float)(1)).toVar(),re=ee.and(c.greaterThan((0,n.uint)(0))).and(M.element(E).equal((0,n.uint)(1))).toVar(),ie=(0,n.vec4)(0).toVar(),ae=(0,n.vec4)(0).xyz.toVar();(0,n.If)(P,()=>{let e=zo(r,w);ie.assign(Bo(e)),ae.assign((0,n.vec4)(Vo(e),0).xyz)});let oe=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(x).add(.5)).div(s);(0,n.If)(l.and(f.not()).and(c.greaterThan((0,n.uint)(0))).and(u).and(S.notEqual((0,n.int)(11))),()=>{let e=(0,n.texture)(g,oe,0).toVar();N.assign((0,n.select)(re,e.xyz,(0,n.mix)(e.xyz,k.xyz,d))),(0,n.If)(P.and(p),()=>{ae.assign((0,n.mix)((0,n.texture)(_,oe,0).xyz,ae,m)),(0,n.If)(F,()=>{let e=(0,n.texture)(v,oe,0).xyz.mul(2).sub(1),t=ie.xyz.mul(2).sub(1).toVar(),r=(0,n.mix)(e,t,m).toVar(),i=(0,n.length)(r),a=(0,n.select)(i.greaterThan(1e-4),r.div(i),t);ie.assign((0,n.vec4)(a.mul(.5).add(.5),ie.w))})}),(0,n.If)(h,()=>{ne.assign((0,n.select)(re,e.w,(0,n.mix)(e.w,k.w,d)))})}),(0,n.If)(te,()=>{let e=Rn(k.xyz),t=T.element(E).toVar(),r=(0,n.select)(re,t,(0,n.mix)(t,e.mul(e),d)).toVar();T.element(E).assign(r);let i=Rn(N).toVar(),a=r.sub(i.mul(i)).max((0,n.float)(0)).div((0,n.float)(c).add(1)).sqrt().toVar(),o=a.div(i.add((0,n.float)(1e-4))),s=(0,n.select)(i.lessThan((0,n.float)(1)),i.sqrt(),i),l=a.div(s.add((0,n.float)(1e-4))).lessThan(D);(0,n.If)(I.or(ee),()=>{let e=I.and(c.greaterThanEqual((0,n.uint)(O))).and(l),t=j.element(E).toVar(),r=t.bitAnd((0,n.uint)(1073741823)).toVar(),a=r.toVar(),s=k.w.greaterThan((0,n.float)(.5)),u=t.bitAnd((0,n.uint)(1073741824)).notEqual((0,n.uint)(0)),d=(0,n.select)(c.equal((0,n.uint)(0)),(0,n.select)(s,(0,n.uint)(1073741824),(0,n.uint)(0)),(0,n.select)(s.or(u),(0,n.uint)(1073741824),(0,n.uint)(0))).toVar();(0,n.If)(ee,()=>{(0,n.If)(c.equal((0,n.uint)(0)),()=>{a.assign((0,n.uint)(0))}),(0,n.If)(re.not().and(c.greaterThan((0,n.uint)(0))),()=>{let e=c.greaterThanEqual((0,n.uint)(O)).and(o.lessThan(A)).and(i.greaterThan((0,n.float)(0)));a.assign((0,n.select)(e,r.add((0,n.uint)(1)),(0,n.uint)(0)))})}),j.element(E).assign(a.bitOr((0,n.select)(e,(0,n.uint)(2147483648),(0,n.uint)(0))).bitOr(d))})}),(0,n.If)(S.equal((0,n.int)(11)),()=>{N.assign(el(N))});let se=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(x));(0,n.textureStore)(i,se,(0,n.vec4)(N,ne)).toWriteOnly(),(0,n.If)(P,()=>{(0,n.textureStore)(a,se,ie).toWriteOnly(),(0,n.textureStore)(o,se,(0,n.vec4)(ae,1)).toWriteOnly()})})})}var nl=(0,n.wgslFn)(`
639
639
  fn visualizeDepth( depth: f32 ) -> vec3f {
640
640
  return vec3f( 1.0f - depth );
641
641
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rayzee",
3
- "version": "7.27.0",
3
+ "version": "7.27.1",
4
4
  "type": "module",
5
5
  "description": "Real-time WebGPU path tracing engine built on Three.js",
6
6
  "main": "dist/rayzee.umd.js",
@@ -153,9 +153,22 @@ export function buildFinalWriteKernel( params ) {
153
153
  // and before the visMode-11 mutation. Frame 0 self-inits m2 via alpha==1 — no explicit clear.
154
154
  If( statsOn, () => {
155
155
 
156
+ // Frozen pixels hold m2, for the same reason they hold finalColor above: Generate skipped
157
+ // them, so rayBuffer still holds whatever they last traced. Folding that in every frame drove
158
+ // m2 toward the stale sample while meanLum stayed put, so sampleVar decayed to an artefact
159
+ // of one old sample. The `converged` flag below is built from it and counted into
160
+ // CONVERGED_COUNT, so the corruption reached the whole-frame early stop, not just this pixel.
161
+ //
162
+ // Editing this kernel at all costs 11 quality goldens their bit-identical status at
163
+ // rmse ~1e-4 — measured identical for select() and for an If() branch, so it is compiler
164
+ // scheduling, not the extra arm. Goldens re-blessed with the change.
156
165
  const sampleLum = luminance( sampleColor.xyz );
157
166
  const prevM2 = m2BufferRW.element( pixelId ).toVar();
158
- const m2 = mix( prevM2, sampleLum.mul( sampleLum ), accumulationAlpha ).toVar();
167
+ const m2 = select(
168
+ wasFrozen,
169
+ prevM2,
170
+ mix( prevM2, sampleLum.mul( sampleLum ), accumulationAlpha )
171
+ ).toVar();
159
172
  m2BufferRW.element( pixelId ).assign( m2 );
160
173
 
161
174
  const meanLum = luminance( finalColor ).toVar();