@@ -72,23 +72,6 @@ const wgslTypeLib = {
7272 bmat4 : 'mat4x4<bool>'
7373} ;
7474
75- const wgslMethods = {
76- dFdx : 'dpdx' ,
77- dFdy : '- dpdy' ,
78- mod_float : 'threejs_mod_float' ,
79- mod_vec2 : 'threejs_mod_vec2' ,
80- mod_vec3 : 'threejs_mod_vec3' ,
81- mod_vec4 : 'threejs_mod_vec4' ,
82- equals_bool : 'threejs_equals_bool' ,
83- equals_bvec2 : 'threejs_equals_bvec2' ,
84- equals_bvec3 : 'threejs_equals_bvec3' ,
85- equals_bvec4 : 'threejs_equals_bvec4' ,
86- lessThanEqual : 'threejs_lessThanEqual' ,
87- greaterThan : 'threejs_greaterThan' ,
88- inversesqrt : 'inverseSqrt' ,
89- bitcast : 'bitcast<f32>'
90- } ;
91-
9275const wgslPolyfill = {
9376 threejs_xor : new CodeNode ( `
9477fn threejs_xor( a : bool, b : bool ) -> bool {
@@ -153,6 +136,41 @@ fn threejs_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, level : i32
153136` )
154137} ;
155138
139+ const wgslMethods = {
140+ dFdx : 'dpdx' ,
141+ dFdy : '- dpdy' ,
142+ mod_float : 'threejs_mod_float' ,
143+ mod_vec2 : 'threejs_mod_vec2' ,
144+ mod_vec3 : 'threejs_mod_vec3' ,
145+ mod_vec4 : 'threejs_mod_vec4' ,
146+ equals_bool : 'threejs_equals_bool' ,
147+ equals_bvec2 : 'threejs_equals_bvec2' ,
148+ equals_bvec3 : 'threejs_equals_bvec3' ,
149+ equals_bvec4 : 'threejs_equals_bvec4' ,
150+ lessThanEqual : 'threejs_lessThanEqual' ,
151+ greaterThan : 'threejs_greaterThan' ,
152+ inversesqrt : 'inverseSqrt' ,
153+ bitcast : 'bitcast<f32>'
154+ } ;
155+
156+ // WebGPU issue: does not support pow() with negative base on Windows
157+
158+ if ( / W i n d o w s / g. test ( navigator . userAgent ) ) {
159+
160+ wgslPolyfill . pow_float = new CodeNode ( 'fn threejs_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }' ) ;
161+ wgslPolyfill . pow_vec2 = new CodeNode ( 'fn threejs_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( threejs_pow_float( a.x, b.x ), threejs_pow_float( a.y, b.y ) ); }' , [ wgslPolyfill . pow_float ] ) ;
162+ wgslPolyfill . pow_vec3 = new CodeNode ( 'fn threejs_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( threejs_pow_float( a.x, b.x ), threejs_pow_float( a.y, b.y ), threejs_pow_float( a.z, b.z ) ); }' , [ wgslPolyfill . pow_float ] ) ;
163+ wgslPolyfill . pow_vec4 = new CodeNode ( 'fn threejs_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( threejs_pow_float( a.x, b.x ), threejs_pow_float( a.y, b.y ), threejs_pow_float( a.z, b.z ), threejs_pow_float( a.w, b.w ) ); }' , [ wgslPolyfill . pow_float ] ) ;
164+
165+ wgslMethods . pow_float = 'threejs_pow_float' ;
166+ wgslMethods . pow_vec2 = 'threejs_pow_vec2' ;
167+ wgslMethods . pow_vec3 = 'threejs_pow_vec3' ;
168+ wgslMethods . pow_vec4 = 'threejs_pow_vec4' ;
169+
170+ }
171+
172+ //
173+
156174class WGSLNodeBuilder extends NodeBuilder {
157175
158176 constructor ( object , renderer ) {
0 commit comments