Skip to content

Commit 951543e

Browse files
authored
introduce component count (#2161)
1 parent 5e75248 commit 951543e

3 files changed

Lines changed: 21 additions & 10 deletions

File tree

packages/typegpu/src/data/compiledIO.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,8 @@ export function buildWriter(
204204
let code = '';
205205
const writeFunc = primitiveToWriteFunction[primitive];
206206
const components = ['x', 'y', 'z', 'w'];
207-
const count = wgsl.isVec2(node) ? 2 : wgsl.isVec3(node) ? 3 : 4;
208207

209-
for (let i = 0; i < count; i++) {
208+
for (let i = 0; i < node.componentCount; i++) {
210209
code += `output.${writeFunc}((${offsetExpr} + ${i * 4}), ${valueExpr}.${
211210
components[i]
212211
}, littleEndian);\n`;
@@ -251,13 +250,7 @@ export function buildWriter(
251250
];
252251
const writeFunc = primitiveToWriteFunction[primitive];
253252
const wgslType = formatToWGSLType[formatName];
254-
const componentCount = wgsl.isVec4(wgslType)
255-
? 4
256-
: wgsl.isVec3(wgslType)
257-
? 3
258-
: wgsl.isVec2(wgslType)
259-
? 2
260-
: 1;
253+
const componentCount = wgsl.isVec(wgslType) ? wgslType.componentCount : 1;
261254
const componentSize = primitive === 'u8' || primitive === 'i8'
262255
? 1
263256
: primitive === 'u16' || primitive === 'i16' || primitive === 'f16'

packages/typegpu/src/data/vector.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,16 @@ export const vecTypeToConstructor = {
275275

276276
type VecSchemaBase<TValue> = {
277277
readonly type: string;
278+
readonly componentCount: 2 | 3 | 4;
278279
readonly [$repr]: TValue;
279280
};
280281

281282
function makeVecSchema<TValue, S extends number | boolean>(
282283
VecImpl: new (...args: S[]) => VecBase<S>,
283284
primitive: F32 | F16 | I32 | U32 | Bool,
284285
): VecSchemaBase<TValue> & ((...args: (S | AnyVecInstance)[]) => TValue) {
285-
const { kind: type, length: componentCount } = new VecImpl();
286+
const { kind: type, length } = new VecImpl();
287+
const componentCount = length as 2 | 3 | 4;
286288

287289
const cpuConstruct = (...args: (S | AnyVecInstance)[]): TValue => {
288290
const values = new Array(args.length);
@@ -331,6 +333,7 @@ function makeVecSchema<TValue, S extends number | boolean>(
331333
[$internal]: {},
332334
type,
333335
primitive,
336+
componentCount,
334337
[$repr]: undefined as TValue,
335338
});
336339

packages/typegpu/src/data/wgslTypes.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ export interface Vec2f extends
878878
> {
879879
readonly type: 'vec2f';
880880
readonly primitive: F32;
881+
readonly componentCount: 2;
881882

882883
// Type-tokens, not available at runtime
883884
readonly [$repr]: v2f;
@@ -900,6 +901,7 @@ export interface Vec2h extends
900901
> {
901902
readonly type: 'vec2h';
902903
readonly primitive: F16;
904+
readonly componentCount: 2;
903905

904906
// Type-tokens, not available at runtime
905907
readonly [$repr]: v2h;
@@ -922,6 +924,7 @@ export interface Vec2i extends
922924
> {
923925
readonly type: 'vec2i';
924926
readonly primitive: I32;
927+
readonly componentCount: 2;
925928

926929
// Type-tokens, not available at runtime
927930
readonly [$repr]: v2i;
@@ -944,6 +947,7 @@ export interface Vec2u extends
944947
> {
945948
readonly type: 'vec2u';
946949
readonly primitive: U32;
950+
readonly componentCount: 2;
947951

948952
// Type-tokens, not available at runtime
949953
readonly [$repr]: v2u;
@@ -967,6 +971,7 @@ export interface Vec2b extends
967971
> {
968972
readonly type: 'vec2<bool>';
969973
readonly primitive: Bool;
974+
readonly componentCount: 2;
970975

971976
// Type-tokens, not available at runtime
972977
readonly [$repr]: v2b;
@@ -990,6 +995,7 @@ export interface Vec3f extends
990995
> {
991996
readonly type: 'vec3f';
992997
readonly primitive: F32;
998+
readonly componentCount: 3;
993999

9941000
// Type-tokens, not available at runtime
9951001
readonly [$repr]: v3f;
@@ -1014,6 +1020,7 @@ export interface Vec3h extends
10141020
> {
10151021
readonly type: 'vec3h';
10161022
readonly primitive: F16;
1023+
readonly componentCount: 3;
10171024

10181025
// Type-tokens, not available at runtime
10191026
readonly [$repr]: v3h;
@@ -1038,6 +1045,7 @@ export interface Vec3i extends
10381045
> {
10391046
readonly type: 'vec3i';
10401047
readonly primitive: I32;
1048+
readonly componentCount: 3;
10411049

10421050
// Type-tokens, not available at runtime
10431051
readonly [$repr]: v3i;
@@ -1062,6 +1070,7 @@ export interface Vec3u extends
10621070
> {
10631071
readonly type: 'vec3u';
10641072
readonly primitive: U32;
1073+
readonly componentCount: 3;
10651074

10661075
// Type-tokens, not available at runtime
10671076
readonly [$repr]: v3u;
@@ -1087,6 +1096,7 @@ export interface Vec3b extends
10871096
> {
10881097
readonly type: 'vec3<bool>';
10891098
readonly primitive: Bool;
1099+
readonly componentCount: 3;
10901100

10911101
// Type-tokens, not available at runtime
10921102
readonly [$repr]: v3b;
@@ -1114,6 +1124,7 @@ export interface Vec4f extends
11141124
> {
11151125
readonly type: 'vec4f';
11161126
readonly primitive: F32;
1127+
readonly componentCount: 4;
11171128

11181129
// Type-tokens, not available at runtime
11191130
readonly [$repr]: v4f;
@@ -1142,6 +1153,7 @@ export interface Vec4h extends
11421153
> {
11431154
readonly type: 'vec4h';
11441155
readonly primitive: F16;
1156+
readonly componentCount: 4;
11451157

11461158
// Type-tokens, not available at runtime
11471159
readonly [$repr]: v4h;
@@ -1170,6 +1182,7 @@ export interface Vec4i extends
11701182
> {
11711183
readonly type: 'vec4i';
11721184
readonly primitive: I32;
1185+
readonly componentCount: 4;
11731186

11741187
// Type-tokens, not available at runtime
11751188
readonly [$repr]: v4i;
@@ -1198,6 +1211,7 @@ export interface Vec4u extends
11981211
> {
11991212
readonly type: 'vec4u';
12001213
readonly primitive: U32;
1214+
readonly componentCount: 4;
12011215

12021216
// Type-tokens, not available at runtime
12031217
readonly [$repr]: v4u;
@@ -1227,6 +1241,7 @@ export interface Vec4b extends
12271241
> {
12281242
readonly type: 'vec4<bool>';
12291243
readonly primitive: Bool;
1244+
readonly componentCount: 4;
12301245

12311246
// Type-tokens, not available at runtime
12321247
readonly [$repr]: v4b;

0 commit comments

Comments
 (0)