@@ -70,6 +70,17 @@ export interface vecInfixNotation<T extends vecBase> {
7070 [ Symbol . operatorPercent ] ( lhs : T | number , rhs : T | number ) : T ;
7171}
7272
73+ export type vecIToVecU < T extends AnyIntegerVecInstance > = T extends v2i | v2u
74+ ? v2u
75+ : T extends v3i | v3u
76+ ? v3u
77+ : v4u ;
78+
79+ export interface vecBitShiftNotation < T extends AnyIntegerVecInstance > {
80+ bitShiftLeft ( rhs : vecIToVecU < T > | number ) : T ;
81+ bitShiftRight ( rhs : vecIToVecU < T > | number ) : T ;
82+ }
83+
7384/**
7485 * Matrix infix notation.
7586 *
@@ -228,7 +239,8 @@ export interface v2h extends Tuple2<number>, Swizzle2<v2h, v3h, v4h>, vecInfixNo
228239 * Interface representing its WGSL vector type counterpart: vec2i or vec2<i32>.
229240 * A vector with 2 elements of type i32
230241 */
231- export interface v2i extends Tuple2 < number > , Swizzle2 < v2i , v3i , v4i > , vecInfixNotation < v2i > {
242+ export interface v2i
243+ extends Tuple2 < number > , Swizzle2 < v2i , v3i , v4i > , vecInfixNotation < v2i > , vecBitShiftNotation < v2i > {
232244 readonly [ $internal ] : true ;
233245 /** use to distinguish between vectors of the same size on the type level */
234246 readonly kind : 'vec2i' ;
@@ -242,7 +254,8 @@ export interface v2i extends Tuple2<number>, Swizzle2<v2i, v3i, v4i>, vecInfixNo
242254 * Interface representing its WGSL vector type counterpart: vec2u or vec2<u32>.
243255 * A vector with 2 elements of type u32
244256 */
245- export interface v2u extends Tuple2 < number > , Swizzle2 < v2u , v3u , v4u > , vecInfixNotation < v2u > {
257+ export interface v2u
258+ extends Tuple2 < number > , Swizzle2 < v2u , v3u , v4u > , vecInfixNotation < v2u > , vecBitShiftNotation < v2u > {
246259 readonly [ $internal ] : true ;
247260 /** use to distinguish between vectors of the same size on the type level */
248261 readonly kind : 'vec2u' ;
@@ -302,7 +315,8 @@ export interface v3h extends Tuple3<number>, Swizzle3<v2h, v3h, v4h>, vecInfixNo
302315 * Interface representing its WGSL vector type counterpart: vec3i or vec3<i32>.
303316 * A vector with 3 elements of type i32
304317 */
305- export interface v3i extends Tuple3 < number > , Swizzle3 < v2i , v3i , v4i > , vecInfixNotation < v3i > {
318+ export interface v3i
319+ extends Tuple3 < number > , Swizzle3 < v2i , v3i , v4i > , vecInfixNotation < v3i > , vecBitShiftNotation < v3i > {
306320 readonly [ $internal ] : true ;
307321 /** use to distinguish between vectors of the same size on the type level */
308322 readonly kind : 'vec3i' ;
@@ -318,7 +332,8 @@ export interface v3i extends Tuple3<number>, Swizzle3<v2i, v3i, v4i>, vecInfixNo
318332 * Interface representing its WGSL vector type counterpart: vec3u or vec3<u32>.
319333 * A vector with 3 elements of type u32
320334 */
321- export interface v3u extends Tuple3 < number > , Swizzle3 < v2u , v3u , v4u > , vecInfixNotation < v3u > {
335+ export interface v3u
336+ extends Tuple3 < number > , Swizzle3 < v2u , v3u , v4u > , vecInfixNotation < v3u > , vecBitShiftNotation < v3u > {
322337 readonly [ $internal ] : true ;
323338 /** use to distinguish between vectors of the same size on the type level */
324339 readonly kind : 'vec3u' ;
@@ -386,7 +401,8 @@ export interface v4h extends Tuple4<number>, Swizzle4<v2h, v3h, v4h>, vecInfixNo
386401 * Interface representing its WGSL vector type counterpart: vec4i or vec4<i32>.
387402 * A vector with 4 elements of type i32
388403 */
389- export interface v4i extends Tuple4 < number > , Swizzle4 < v2i , v3i , v4i > , vecInfixNotation < v4i > {
404+ export interface v4i
405+ extends Tuple4 < number > , Swizzle4 < v2i , v3i , v4i > , vecInfixNotation < v4i > , vecBitShiftNotation < v4i > {
390406 readonly [ $internal ] : true ;
391407 /** use to distinguish between vectors of the same size on the type level */
392408 readonly kind : 'vec4i' ;
@@ -404,7 +420,8 @@ export interface v4i extends Tuple4<number>, Swizzle4<v2i, v3i, v4i>, vecInfixNo
404420 * Interface representing its WGSL vector type counterpart: vec4u or vec4<u32>.
405421 * A vector with 4 elements of type u32
406422 */
407- export interface v4u extends Tuple4 < number > , Swizzle4 < v2u , v3u , v4u > , vecInfixNotation < v4u > {
423+ export interface v4u
424+ extends Tuple4 < number > , Swizzle4 < v2u , v3u , v4u > , vecInfixNotation < v4u > , vecBitShiftNotation < v4u > {
408425 readonly [ $internal ] : true ;
409426 /** use to distinguish between vectors of the same size on the type level */
410427 readonly kind : 'vec4u' ;
@@ -1528,12 +1545,18 @@ export function isMat(value: unknown): value is Mat2x2f | Mat3x3f | Mat4x4f {
15281545 return isMat2x2f ( value ) || isMat3x3f ( value ) || isMat4x4f ( value ) ;
15291546}
15301547
1531- export function isFloat32VecInstance (
1532- element : number | AnyVecInstance | AnyMatInstance ,
1533- ) : element is AnyFloat32VecInstance {
1548+ export function isFloat32VecInstance ( element : unknown ) : element is AnyFloat32VecInstance {
15341549 return isVecInstance ( element ) && [ 'vec2f' , 'vec3f' , 'vec4f' ] . includes ( element . kind ) ;
15351550}
15361551
1552+ export function isInteger32VecInstance ( value : unknown ) : value is v2u | v2i | v3u | v3i | v4u | v4i {
1553+ return isVecInstance ( value ) && / [ i u ] $ / . test ( value . kind ) ;
1554+ }
1555+
1556+ export function isUint32VecInstance ( value : unknown ) : value is v2u | v3u | v4u {
1557+ return isVecInstance ( value ) && / [ u ] $ / . test ( value . kind ) ;
1558+ }
1559+
15371560export function isWgslData ( value : unknown ) : value is AnyWgslData {
15381561 return isMarkedInternal ( value ) && wgslTypeLiterals . includes ( ( value as AnyWgslData ) ?. type ) ;
15391562}
0 commit comments