This commit is contained in:
Akko
2025-08-04 18:57:35 +02:00
parent 8cf6e78a79
commit 9495868c2e
5030 changed files with 518594 additions and 17609 deletions

View File

@@ -0,0 +1,6 @@
import type { UboLayout, UNIFORM_TYPES, UniformData } from '../../../shared/shader/types';
export declare const WGSL_ALIGN_SIZE_DATA: Record<UNIFORM_TYPES | string, {
align: number;
size: number;
}>;
export declare function createUboElementsWGSL(uniformData: UniformData[]): UboLayout;

View File

@@ -0,0 +1,68 @@
'use strict';
"use strict";
const WGSL_ALIGN_SIZE_DATA = {
i32: { align: 4, size: 4 },
u32: { align: 4, size: 4 },
f32: { align: 4, size: 4 },
f16: { align: 2, size: 2 },
"vec2<i32>": { align: 8, size: 8 },
"vec2<u32>": { align: 8, size: 8 },
"vec2<f32>": { align: 8, size: 8 },
"vec2<f16>": { align: 4, size: 4 },
"vec3<i32>": { align: 16, size: 12 },
"vec3<u32>": { align: 16, size: 12 },
"vec3<f32>": { align: 16, size: 12 },
"vec3<f16>": { align: 8, size: 6 },
"vec4<i32>": { align: 16, size: 16 },
"vec4<u32>": { align: 16, size: 16 },
"vec4<f32>": { align: 16, size: 16 },
"vec4<f16>": { align: 8, size: 8 },
"mat2x2<f32>": { align: 8, size: 16 },
"mat2x2<f16>": { align: 4, size: 8 },
"mat3x2<f32>": { align: 8, size: 24 },
"mat3x2<f16>": { align: 4, size: 12 },
"mat4x2<f32>": { align: 8, size: 32 },
"mat4x2<f16>": { align: 4, size: 16 },
"mat2x3<f32>": { align: 16, size: 32 },
"mat2x3<f16>": { align: 8, size: 16 },
"mat3x3<f32>": { align: 16, size: 48 },
"mat3x3<f16>": { align: 8, size: 24 },
"mat4x3<f32>": { align: 16, size: 64 },
"mat4x3<f16>": { align: 8, size: 32 },
"mat2x4<f32>": { align: 16, size: 32 },
"mat2x4<f16>": { align: 8, size: 16 },
"mat3x4<f32>": { align: 16, size: 48 },
"mat3x4<f16>": { align: 8, size: 24 },
"mat4x4<f32>": { align: 16, size: 64 },
"mat4x4<f16>": { align: 8, size: 32 }
};
function createUboElementsWGSL(uniformData) {
const uboElements = uniformData.map((data) => ({
data,
offset: 0,
size: 0
}));
let offset = 0;
for (let i = 0; i < uboElements.length; i++) {
const uboElement = uboElements[i];
let size = WGSL_ALIGN_SIZE_DATA[uboElement.data.type].size;
const align = WGSL_ALIGN_SIZE_DATA[uboElement.data.type].align;
if (!WGSL_ALIGN_SIZE_DATA[uboElement.data.type]) {
throw new Error(`[Pixi.js] WebGPU UniformBuffer: Unknown type ${uboElement.data.type}`);
}
if (uboElement.data.size > 1) {
size = Math.max(size, align) * uboElement.data.size;
}
offset = Math.ceil(offset / align) * align;
uboElement.size = size;
uboElement.offset = offset;
offset += size;
}
offset = Math.ceil(offset / 16) * 16;
return { uboElements, size: offset };
}
exports.WGSL_ALIGN_SIZE_DATA = WGSL_ALIGN_SIZE_DATA;
exports.createUboElementsWGSL = createUboElementsWGSL;
//# sourceMappingURL=createUboElementsWGSL.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,65 @@
"use strict";
const WGSL_ALIGN_SIZE_DATA = {
i32: { align: 4, size: 4 },
u32: { align: 4, size: 4 },
f32: { align: 4, size: 4 },
f16: { align: 2, size: 2 },
"vec2<i32>": { align: 8, size: 8 },
"vec2<u32>": { align: 8, size: 8 },
"vec2<f32>": { align: 8, size: 8 },
"vec2<f16>": { align: 4, size: 4 },
"vec3<i32>": { align: 16, size: 12 },
"vec3<u32>": { align: 16, size: 12 },
"vec3<f32>": { align: 16, size: 12 },
"vec3<f16>": { align: 8, size: 6 },
"vec4<i32>": { align: 16, size: 16 },
"vec4<u32>": { align: 16, size: 16 },
"vec4<f32>": { align: 16, size: 16 },
"vec4<f16>": { align: 8, size: 8 },
"mat2x2<f32>": { align: 8, size: 16 },
"mat2x2<f16>": { align: 4, size: 8 },
"mat3x2<f32>": { align: 8, size: 24 },
"mat3x2<f16>": { align: 4, size: 12 },
"mat4x2<f32>": { align: 8, size: 32 },
"mat4x2<f16>": { align: 4, size: 16 },
"mat2x3<f32>": { align: 16, size: 32 },
"mat2x3<f16>": { align: 8, size: 16 },
"mat3x3<f32>": { align: 16, size: 48 },
"mat3x3<f16>": { align: 8, size: 24 },
"mat4x3<f32>": { align: 16, size: 64 },
"mat4x3<f16>": { align: 8, size: 32 },
"mat2x4<f32>": { align: 16, size: 32 },
"mat2x4<f16>": { align: 8, size: 16 },
"mat3x4<f32>": { align: 16, size: 48 },
"mat3x4<f16>": { align: 8, size: 24 },
"mat4x4<f32>": { align: 16, size: 64 },
"mat4x4<f16>": { align: 8, size: 32 }
};
function createUboElementsWGSL(uniformData) {
const uboElements = uniformData.map((data) => ({
data,
offset: 0,
size: 0
}));
let offset = 0;
for (let i = 0; i < uboElements.length; i++) {
const uboElement = uboElements[i];
let size = WGSL_ALIGN_SIZE_DATA[uboElement.data.type].size;
const align = WGSL_ALIGN_SIZE_DATA[uboElement.data.type].align;
if (!WGSL_ALIGN_SIZE_DATA[uboElement.data.type]) {
throw new Error(`[Pixi.js] WebGPU UniformBuffer: Unknown type ${uboElement.data.type}`);
}
if (uboElement.data.size > 1) {
size = Math.max(size, align) * uboElement.data.size;
}
offset = Math.ceil(offset / align) * align;
uboElement.size = size;
uboElement.offset = offset;
offset += size;
}
offset = Math.ceil(offset / 16) * 16;
return { uboElements, size: offset };
}
export { WGSL_ALIGN_SIZE_DATA, createUboElementsWGSL };
//# sourceMappingURL=createUboElementsWGSL.mjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
import type { UboElement, UniformsSyncCallback } from '../../../shared/shader/types';
export declare function createUboSyncFunctionWGSL(uboElements: UboElement[]): UniformsSyncCallback;

View File

@@ -0,0 +1,18 @@
'use strict';
var createUboSyncFunction = require('../../../shared/shader/utils/createUboSyncFunction.js');
var uboSyncFunctions = require('../../../shared/shader/utils/uboSyncFunctions.js');
var generateArraySyncWGSL = require('./generateArraySyncWGSL.js');
"use strict";
function createUboSyncFunctionWGSL(uboElements) {
return createUboSyncFunction.createUboSyncFunction(
uboElements,
"uboWgsl",
generateArraySyncWGSL.generateArraySyncWGSL,
uboSyncFunctions.uboSyncFunctionsWGSL
);
}
exports.createUboSyncFunctionWGSL = createUboSyncFunctionWGSL;
//# sourceMappingURL=createUboSyncFunctionWGSL.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"createUboSyncFunctionWGSL.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/createUboSyncFunctionWGSL.ts"],"sourcesContent":["/* eslint-disable quote-props */\nimport { createUboSyncFunction } from '../../../shared/shader/utils/createUboSyncFunction';\nimport { uboSyncFunctionsWGSL } from '../../../shared/shader/utils/uboSyncFunctions';\nimport { generateArraySyncWGSL } from './generateArraySyncWGSL';\n\nimport type { UboElement, UniformsSyncCallback } from '../../../shared/shader/types';\n\nexport function createUboSyncFunctionWGSL(\n uboElements: UboElement[],\n): UniformsSyncCallback\n{\n return createUboSyncFunction(\n uboElements,\n 'uboWgsl',\n generateArraySyncWGSL,\n uboSyncFunctionsWGSL,\n );\n}\n"],"names":["createUboSyncFunction","generateArraySyncWGSL","uboSyncFunctionsWGSL"],"mappings":";;;;;;;AAOO,SAAS,0BACZ,WAEJ,EAAA;AACI,EAAO,OAAAA,2CAAA;AAAA,IACH,WAAA;AAAA,IACA,SAAA;AAAA,IACAC,2CAAA;AAAA,IACAC,qCAAA;AAAA,GACJ,CAAA;AACJ;;;;"}

View File

@@ -0,0 +1,16 @@
import { createUboSyncFunction } from '../../../shared/shader/utils/createUboSyncFunction.mjs';
import { uboSyncFunctionsWGSL } from '../../../shared/shader/utils/uboSyncFunctions.mjs';
import { generateArraySyncWGSL } from './generateArraySyncWGSL.mjs';
"use strict";
function createUboSyncFunctionWGSL(uboElements) {
return createUboSyncFunction(
uboElements,
"uboWgsl",
generateArraySyncWGSL,
uboSyncFunctionsWGSL
);
}
export { createUboSyncFunctionWGSL };
//# sourceMappingURL=createUboSyncFunctionWGSL.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"createUboSyncFunctionWGSL.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/createUboSyncFunctionWGSL.ts"],"sourcesContent":["/* eslint-disable quote-props */\nimport { createUboSyncFunction } from '../../../shared/shader/utils/createUboSyncFunction';\nimport { uboSyncFunctionsWGSL } from '../../../shared/shader/utils/uboSyncFunctions';\nimport { generateArraySyncWGSL } from './generateArraySyncWGSL';\n\nimport type { UboElement, UniformsSyncCallback } from '../../../shared/shader/types';\n\nexport function createUboSyncFunctionWGSL(\n uboElements: UboElement[],\n): UniformsSyncCallback\n{\n return createUboSyncFunction(\n uboElements,\n 'uboWgsl',\n generateArraySyncWGSL,\n uboSyncFunctionsWGSL,\n );\n}\n"],"names":[],"mappings":";;;;;AAOO,SAAS,0BACZ,WAEJ,EAAA;AACI,EAAO,OAAA,qBAAA;AAAA,IACH,WAAA;AAAA,IACA,SAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,GACJ,CAAA;AACJ;;;;"}

View File

@@ -0,0 +1,3 @@
import type { ExtractedAttributeData } from '../../../gl/shader/program/extractAttributesFromGlProgram';
import type { ProgramSource } from '../GpuProgram';
export declare function extractAttributesFromGpuProgram({ source, entryPoint }: ProgramSource): Record<string, ExtractedAttributeData>;

View File

@@ -0,0 +1,53 @@
'use strict';
var getAttributeInfoFromFormat = require('../../../shared/geometry/utils/getAttributeInfoFromFormat.js');
"use strict";
const WGSL_TO_VERTEX_TYPES = {
f32: "float32",
"vec2<f32>": "float32x2",
"vec3<f32>": "float32x3",
"vec4<f32>": "float32x4",
vec2f: "float32x2",
vec3f: "float32x3",
vec4f: "float32x4",
i32: "sint32",
"vec2<i32>": "sint32x2",
"vec3<i32>": "sint32x3",
"vec4<i32>": "sint32x4",
u32: "uint32",
"vec2<u32>": "uint32x2",
"vec3<u32>": "uint32x3",
"vec4<u32>": "uint32x4",
bool: "uint32",
"vec2<bool>": "uint32x2",
"vec3<bool>": "uint32x3",
"vec4<bool>": "uint32x4"
};
function extractAttributesFromGpuProgram({ source, entryPoint }) {
const results = {};
const mainVertStart = source.indexOf(`fn ${entryPoint}`);
if (mainVertStart !== -1) {
const arrowFunctionStart = source.indexOf("->", mainVertStart);
if (arrowFunctionStart !== -1) {
const functionArgsSubstring = source.substring(mainVertStart, arrowFunctionStart);
const inputsRegex = /@location\((\d+)\)\s+([a-zA-Z0-9_]+)\s*:\s*([a-zA-Z0-9_<>]+)(?:,|\s|$)/g;
let match;
while ((match = inputsRegex.exec(functionArgsSubstring)) !== null) {
const format = WGSL_TO_VERTEX_TYPES[match[3]] ?? "float32";
results[match[2]] = {
location: parseInt(match[1], 10),
format,
stride: getAttributeInfoFromFormat.getAttributeInfoFromFormat(format).stride,
offset: 0,
instance: false,
start: 0
};
}
}
}
return results;
}
exports.extractAttributesFromGpuProgram = extractAttributesFromGpuProgram;
//# sourceMappingURL=extractAttributesFromGpuProgram.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extractAttributesFromGpuProgram.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/extractAttributesFromGpuProgram.ts"],"sourcesContent":["import { getAttributeInfoFromFormat } from '../../../shared/geometry/utils/getAttributeInfoFromFormat';\n\nimport type { ExtractedAttributeData } from '../../../gl/shader/program/extractAttributesFromGlProgram';\nimport type { VertexFormat } from '../../../shared/geometry/const';\nimport type { ProgramSource } from '../GpuProgram';\n\nconst WGSL_TO_VERTEX_TYPES: Record<string, VertexFormat> = {\n\n f32: 'float32',\n 'vec2<f32>': 'float32x2',\n 'vec3<f32>': 'float32x3',\n 'vec4<f32>': 'float32x4',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n\n i32: 'sint32',\n 'vec2<i32>': 'sint32x2',\n 'vec3<i32>': 'sint32x3',\n 'vec4<i32>': 'sint32x4',\n\n u32: 'uint32',\n 'vec2<u32>': 'uint32x2',\n 'vec3<u32>': 'uint32x3',\n 'vec4<u32>': 'uint32x4',\n\n bool: 'uint32',\n 'vec2<bool>': 'uint32x2',\n 'vec3<bool>': 'uint32x3',\n 'vec4<bool>': 'uint32x4',\n};\n\nexport function extractAttributesFromGpuProgram(\n { source, entryPoint }: ProgramSource\n): Record<string, ExtractedAttributeData>\n{\n const results: Record<string, ExtractedAttributeData> = {};\n\n // Step 1: Find the start of the mainVert function using string methods\n const mainVertStart = source.indexOf(`fn ${entryPoint}`);\n\n if (mainVertStart !== -1)\n {\n // Step 2: Find the index of the next '->' after the start of the mainVert function\n const arrowFunctionStart = source.indexOf('->', mainVertStart);\n\n if (arrowFunctionStart !== -1)\n {\n const functionArgsSubstring = source.substring(mainVertStart, arrowFunctionStart);\n\n // Apply the inputs regex directly to the trimmed string\n const inputsRegex = /@location\\((\\d+)\\)\\s+([a-zA-Z0-9_]+)\\s*:\\s*([a-zA-Z0-9_<>]+)(?:,|\\s|$)/g;\n let match;\n\n while ((match = inputsRegex.exec(functionArgsSubstring)) !== null)\n {\n const format = WGSL_TO_VERTEX_TYPES[match[3] as VertexFormat] ?? 'float32';\n\n results[match[2]] = {\n location: parseInt(match[1], 10),\n format,\n stride: getAttributeInfoFromFormat(format).stride,\n offset: 0,\n instance: false,\n start: 0,\n };\n }\n }\n }\n\n return results;\n}\n"],"names":["getAttributeInfoFromFormat"],"mappings":";;;;;AAMA,MAAM,oBAAqD,GAAA;AAAA,EAEvD,GAAM,EAAA,SAAA;AAAA,EACN,WAAa,EAAA,WAAA;AAAA,EACb,WAAa,EAAA,WAAA;AAAA,EACb,WAAa,EAAA,WAAA;AAAA,EACb,KAAO,EAAA,WAAA;AAAA,EACP,KAAO,EAAA,WAAA;AAAA,EACP,KAAO,EAAA,WAAA;AAAA,EAEP,GAAK,EAAA,QAAA;AAAA,EACL,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EAEb,GAAK,EAAA,QAAA;AAAA,EACL,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EAEb,IAAM,EAAA,QAAA;AAAA,EACN,YAAc,EAAA,UAAA;AAAA,EACd,YAAc,EAAA,UAAA;AAAA,EACd,YAAc,EAAA,UAAA;AAClB,CAAA,CAAA;AAEO,SAAS,+BACZ,CAAA,EAAE,MAAQ,EAAA,UAAA,EAEd,EAAA;AACI,EAAA,MAAM,UAAkD,EAAC,CAAA;AAGzD,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,CAAA,GAAA,EAAM,UAAU,CAAE,CAAA,CAAA,CAAA;AAEvD,EAAA,IAAI,kBAAkB,CACtB,CAAA,EAAA;AAEI,IAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAE7D,IAAA,IAAI,uBAAuB,CAC3B,CAAA,EAAA;AACI,MAAA,MAAM,qBAAwB,GAAA,MAAA,CAAO,SAAU,CAAA,aAAA,EAAe,kBAAkB,CAAA,CAAA;AAGhF,MAAA,MAAM,WAAc,GAAA,yEAAA,CAAA;AACpB,MAAI,IAAA,KAAA,CAAA;AAEJ,MAAA,OAAA,CAAQ,KAAQ,GAAA,WAAA,CAAY,IAAK,CAAA,qBAAqB,OAAO,IAC7D,EAAA;AACI,QAAA,MAAM,MAAS,GAAA,oBAAA,CAAqB,KAAM,CAAA,CAAC,CAAiB,CAAK,IAAA,SAAA,CAAA;AAEjE,QAAQ,OAAA,CAAA,KAAA,CAAM,CAAC,CAAC,CAAI,GAAA;AAAA,UAChB,QAAU,EAAA,QAAA,CAAS,KAAM,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,UAC/B,MAAA;AAAA,UACA,MAAA,EAAQA,qDAA2B,CAAA,MAAM,CAAE,CAAA,MAAA;AAAA,UAC3C,MAAQ,EAAA,CAAA;AAAA,UACR,QAAU,EAAA,KAAA;AAAA,UACV,KAAO,EAAA,CAAA;AAAA,SACX,CAAA;AAAA,OACJ;AAAA,KACJ;AAAA,GACJ;AAEA,EAAO,OAAA,OAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,51 @@
import { getAttributeInfoFromFormat } from '../../../shared/geometry/utils/getAttributeInfoFromFormat.mjs';
"use strict";
const WGSL_TO_VERTEX_TYPES = {
f32: "float32",
"vec2<f32>": "float32x2",
"vec3<f32>": "float32x3",
"vec4<f32>": "float32x4",
vec2f: "float32x2",
vec3f: "float32x3",
vec4f: "float32x4",
i32: "sint32",
"vec2<i32>": "sint32x2",
"vec3<i32>": "sint32x3",
"vec4<i32>": "sint32x4",
u32: "uint32",
"vec2<u32>": "uint32x2",
"vec3<u32>": "uint32x3",
"vec4<u32>": "uint32x4",
bool: "uint32",
"vec2<bool>": "uint32x2",
"vec3<bool>": "uint32x3",
"vec4<bool>": "uint32x4"
};
function extractAttributesFromGpuProgram({ source, entryPoint }) {
const results = {};
const mainVertStart = source.indexOf(`fn ${entryPoint}`);
if (mainVertStart !== -1) {
const arrowFunctionStart = source.indexOf("->", mainVertStart);
if (arrowFunctionStart !== -1) {
const functionArgsSubstring = source.substring(mainVertStart, arrowFunctionStart);
const inputsRegex = /@location\((\d+)\)\s+([a-zA-Z0-9_]+)\s*:\s*([a-zA-Z0-9_<>]+)(?:,|\s|$)/g;
let match;
while ((match = inputsRegex.exec(functionArgsSubstring)) !== null) {
const format = WGSL_TO_VERTEX_TYPES[match[3]] ?? "float32";
results[match[2]] = {
location: parseInt(match[1], 10),
format,
stride: getAttributeInfoFromFormat(format).stride,
offset: 0,
instance: false,
start: 0
};
}
}
}
return results;
}
export { extractAttributesFromGpuProgram };
//# sourceMappingURL=extractAttributesFromGpuProgram.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extractAttributesFromGpuProgram.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/extractAttributesFromGpuProgram.ts"],"sourcesContent":["import { getAttributeInfoFromFormat } from '../../../shared/geometry/utils/getAttributeInfoFromFormat';\n\nimport type { ExtractedAttributeData } from '../../../gl/shader/program/extractAttributesFromGlProgram';\nimport type { VertexFormat } from '../../../shared/geometry/const';\nimport type { ProgramSource } from '../GpuProgram';\n\nconst WGSL_TO_VERTEX_TYPES: Record<string, VertexFormat> = {\n\n f32: 'float32',\n 'vec2<f32>': 'float32x2',\n 'vec3<f32>': 'float32x3',\n 'vec4<f32>': 'float32x4',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n\n i32: 'sint32',\n 'vec2<i32>': 'sint32x2',\n 'vec3<i32>': 'sint32x3',\n 'vec4<i32>': 'sint32x4',\n\n u32: 'uint32',\n 'vec2<u32>': 'uint32x2',\n 'vec3<u32>': 'uint32x3',\n 'vec4<u32>': 'uint32x4',\n\n bool: 'uint32',\n 'vec2<bool>': 'uint32x2',\n 'vec3<bool>': 'uint32x3',\n 'vec4<bool>': 'uint32x4',\n};\n\nexport function extractAttributesFromGpuProgram(\n { source, entryPoint }: ProgramSource\n): Record<string, ExtractedAttributeData>\n{\n const results: Record<string, ExtractedAttributeData> = {};\n\n // Step 1: Find the start of the mainVert function using string methods\n const mainVertStart = source.indexOf(`fn ${entryPoint}`);\n\n if (mainVertStart !== -1)\n {\n // Step 2: Find the index of the next '->' after the start of the mainVert function\n const arrowFunctionStart = source.indexOf('->', mainVertStart);\n\n if (arrowFunctionStart !== -1)\n {\n const functionArgsSubstring = source.substring(mainVertStart, arrowFunctionStart);\n\n // Apply the inputs regex directly to the trimmed string\n const inputsRegex = /@location\\((\\d+)\\)\\s+([a-zA-Z0-9_]+)\\s*:\\s*([a-zA-Z0-9_<>]+)(?:,|\\s|$)/g;\n let match;\n\n while ((match = inputsRegex.exec(functionArgsSubstring)) !== null)\n {\n const format = WGSL_TO_VERTEX_TYPES[match[3] as VertexFormat] ?? 'float32';\n\n results[match[2]] = {\n location: parseInt(match[1], 10),\n format,\n stride: getAttributeInfoFromFormat(format).stride,\n offset: 0,\n instance: false,\n start: 0,\n };\n }\n }\n }\n\n return results;\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,oBAAqD,GAAA;AAAA,EAEvD,GAAM,EAAA,SAAA;AAAA,EACN,WAAa,EAAA,WAAA;AAAA,EACb,WAAa,EAAA,WAAA;AAAA,EACb,WAAa,EAAA,WAAA;AAAA,EACb,KAAO,EAAA,WAAA;AAAA,EACP,KAAO,EAAA,WAAA;AAAA,EACP,KAAO,EAAA,WAAA;AAAA,EAEP,GAAK,EAAA,QAAA;AAAA,EACL,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EAEb,GAAK,EAAA,QAAA;AAAA,EACL,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EACb,WAAa,EAAA,UAAA;AAAA,EAEb,IAAM,EAAA,QAAA;AAAA,EACN,YAAc,EAAA,UAAA;AAAA,EACd,YAAc,EAAA,UAAA;AAAA,EACd,YAAc,EAAA,UAAA;AAClB,CAAA,CAAA;AAEO,SAAS,+BACZ,CAAA,EAAE,MAAQ,EAAA,UAAA,EAEd,EAAA;AACI,EAAA,MAAM,UAAkD,EAAC,CAAA;AAGzD,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,CAAA,GAAA,EAAM,UAAU,CAAE,CAAA,CAAA,CAAA;AAEvD,EAAA,IAAI,kBAAkB,CACtB,CAAA,EAAA;AAEI,IAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,EAAM,aAAa,CAAA,CAAA;AAE7D,IAAA,IAAI,uBAAuB,CAC3B,CAAA,EAAA;AACI,MAAA,MAAM,qBAAwB,GAAA,MAAA,CAAO,SAAU,CAAA,aAAA,EAAe,kBAAkB,CAAA,CAAA;AAGhF,MAAA,MAAM,WAAc,GAAA,yEAAA,CAAA;AACpB,MAAI,IAAA,KAAA,CAAA;AAEJ,MAAA,OAAA,CAAQ,KAAQ,GAAA,WAAA,CAAY,IAAK,CAAA,qBAAqB,OAAO,IAC7D,EAAA;AACI,QAAA,MAAM,MAAS,GAAA,oBAAA,CAAqB,KAAM,CAAA,CAAC,CAAiB,CAAK,IAAA,SAAA,CAAA;AAEjE,QAAQ,OAAA,CAAA,KAAA,CAAM,CAAC,CAAC,CAAI,GAAA;AAAA,UAChB,QAAU,EAAA,QAAA,CAAS,KAAM,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,UAC/B,MAAA;AAAA,UACA,MAAA,EAAQ,0BAA2B,CAAA,MAAM,CAAE,CAAA,MAAA;AAAA,UAC3C,MAAQ,EAAA,CAAA;AAAA,UACR,QAAU,EAAA,KAAA;AAAA,UACV,KAAO,EAAA,CAAA;AAAA,SACX,CAAA;AAAA,OACJ;AAAA,KACJ;AAAA,GACJ;AAEA,EAAO,OAAA,OAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,14 @@
export interface StructsAndGroups {
groups: {
group: number;
binding: number;
name: string;
isUniform: boolean;
type: string;
}[];
structs: {
name: string;
members: Record<string, string>;
}[];
}
export declare function extractStructAndGroups(wgsl: string): StructsAndGroups;

View File

@@ -0,0 +1,45 @@
'use strict';
"use strict";
function extractStructAndGroups(wgsl) {
const linePattern = /(^|[^/])@(group|binding)\(\d+\)[^;]+;/g;
const groupPattern = /@group\((\d+)\)/;
const bindingPattern = /@binding\((\d+)\)/;
const namePattern = /var(<[^>]+>)? (\w+)/;
const typePattern = /:\s*(\w+)/;
const structPattern = /struct\s+(\w+)\s*{([^}]+)}/g;
const structMemberPattern = /(\w+)\s*:\s*([\w\<\>]+)/g;
const structName = /struct\s+(\w+)/;
const groups = wgsl.match(linePattern)?.map((item) => ({
group: parseInt(item.match(groupPattern)[1], 10),
binding: parseInt(item.match(bindingPattern)[1], 10),
name: item.match(namePattern)[2],
isUniform: item.match(namePattern)[1] === "<uniform>",
type: item.match(typePattern)[1]
}));
if (!groups) {
return {
groups: [],
structs: []
};
}
const structs = wgsl.match(structPattern)?.map((struct) => {
const name = struct.match(structName)[1];
const members = struct.match(structMemberPattern).reduce((acc, member) => {
const [name2, type] = member.split(":");
acc[name2.trim()] = type.trim();
return acc;
}, {});
if (!members) {
return null;
}
return { name, members };
}).filter(({ name }) => groups.some((group) => group.type === name)) ?? [];
return {
groups,
structs
};
}
exports.extractStructAndGroups = extractStructAndGroups;
//# sourceMappingURL=extractStructAndGroups.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extractStructAndGroups.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/extractStructAndGroups.ts"],"sourcesContent":["export interface StructsAndGroups\n{\n groups: {\n group: number;\n binding: number;\n name: string;\n isUniform: boolean;\n type: string;\n }[];\n structs: {\n name: string;\n members: Record<string, string>;\n }[];\n}\n\nexport function extractStructAndGroups(wgsl: string): StructsAndGroups\n{\n // Patterns for parsing the WGSL file\n const linePattern = /(^|[^/])@(group|binding)\\(\\d+\\)[^;]+;/g;\n const groupPattern = /@group\\((\\d+)\\)/;\n const bindingPattern = /@binding\\((\\d+)\\)/;\n const namePattern = /var(<[^>]+>)? (\\w+)/;\n const typePattern = /:\\s*(\\w+)/;\n const structPattern = /struct\\s+(\\w+)\\s*{([^}]+)}/g;\n const structMemberPattern = /(\\w+)\\s*:\\s*([\\w\\<\\>]+)/g;\n const structName = /struct\\s+(\\w+)/;\n\n // Find the @group and @binding annotations\n const groups = wgsl.match(linePattern)?.map((item) => ({\n group: parseInt(item.match(groupPattern)[1], 10),\n binding: parseInt(item.match(bindingPattern)[1], 10),\n name: item.match(namePattern)[2],\n isUniform: item.match(namePattern)[1] === '<uniform>',\n type: item.match(typePattern)[1],\n }));\n\n if (!groups)\n {\n return {\n groups: [],\n structs: [],\n };\n }\n\n // Find the structs\n const structs = wgsl\n .match(structPattern)\n ?.map((struct) =>\n {\n const name = struct.match(structName)[1];\n const members = struct.match(structMemberPattern).reduce((acc: Record<string, string>, member) =>\n {\n const [name, type] = member.split(':');\n\n acc[name.trim()] = type.trim();\n\n return acc;\n }, {});\n\n if (!members)\n {\n return null;\n }\n\n return { name, members };\n // Only include the structs mentioned in the @group/@binding annotations\n })\n .filter(({ name }) => groups.some((group) => group.type === name)) ?? [];\n\n return {\n groups,\n structs,\n };\n}\n"],"names":["name"],"mappings":";;;AAeO,SAAS,uBAAuB,IACvC,EAAA;AAEI,EAAA,MAAM,WAAc,GAAA,wCAAA,CAAA;AACpB,EAAA,MAAM,YAAe,GAAA,iBAAA,CAAA;AACrB,EAAA,MAAM,cAAiB,GAAA,mBAAA,CAAA;AACvB,EAAA,MAAM,WAAc,GAAA,qBAAA,CAAA;AACpB,EAAA,MAAM,WAAc,GAAA,WAAA,CAAA;AACpB,EAAA,MAAM,aAAgB,GAAA,6BAAA,CAAA;AACtB,EAAA,MAAM,mBAAsB,GAAA,0BAAA,CAAA;AAC5B,EAAA,MAAM,UAAa,GAAA,gBAAA,CAAA;AAGnB,EAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,WAAW,CAAG,EAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,IACnD,KAAA,EAAO,SAAS,IAAK,CAAA,KAAA,CAAM,YAAY,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,IAC/C,OAAA,EAAS,SAAS,IAAK,CAAA,KAAA,CAAM,cAAc,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,IACnD,IAAM,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,EAAE,CAAC,CAAA;AAAA,IAC/B,WAAW,IAAK,CAAA,KAAA,CAAM,WAAW,CAAA,CAAE,CAAC,CAAM,KAAA,WAAA;AAAA,IAC1C,IAAM,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,EAAE,CAAC,CAAA;AAAA,GACjC,CAAA,CAAA,CAAA;AAEF,EAAA,IAAI,CAAC,MACL,EAAA;AACI,IAAO,OAAA;AAAA,MACH,QAAQ,EAAC;AAAA,MACT,SAAS,EAAC;AAAA,KACd,CAAA;AAAA,GACJ;AAGA,EAAA,MAAM,UAAU,IACX,CAAA,KAAA,CAAM,aAAa,CAClB,EAAA,GAAA,CAAI,CAAC,MACP,KAAA;AACI,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,KAAM,CAAA,UAAU,EAAE,CAAC,CAAA,CAAA;AACvC,IAAM,MAAA,OAAA,GAAU,OAAO,KAAM,CAAA,mBAAmB,EAAE,MAAO,CAAA,CAAC,KAA6B,MACvF,KAAA;AACI,MAAA,MAAM,CAACA,KAAM,EAAA,IAAI,CAAI,GAAA,MAAA,CAAO,MAAM,GAAG,CAAA,CAAA;AAErC,MAAA,GAAA,CAAIA,KAAK,CAAA,IAAA,EAAM,CAAA,GAAI,KAAK,IAAK,EAAA,CAAA;AAE7B,MAAO,OAAA,GAAA,CAAA;AAAA,KACX,EAAG,EAAE,CAAA,CAAA;AAEL,IAAA,IAAI,CAAC,OACL,EAAA;AACI,MAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAEA,IAAO,OAAA,EAAE,MAAM,OAAQ,EAAA,CAAA;AAAA,GAE1B,CACA,CAAA,MAAA,CAAO,CAAC,EAAE,MAAW,KAAA,MAAA,CAAO,IAAK,CAAA,CAAC,UAAU,KAAM,CAAA,IAAA,KAAS,IAAI,CAAC,KAAK,EAAC,CAAA;AAE3E,EAAO,OAAA;AAAA,IACH,MAAA;AAAA,IACA,OAAA;AAAA,GACJ,CAAA;AACJ;;;;"}

View File

@@ -0,0 +1,43 @@
"use strict";
function extractStructAndGroups(wgsl) {
const linePattern = /(^|[^/])@(group|binding)\(\d+\)[^;]+;/g;
const groupPattern = /@group\((\d+)\)/;
const bindingPattern = /@binding\((\d+)\)/;
const namePattern = /var(<[^>]+>)? (\w+)/;
const typePattern = /:\s*(\w+)/;
const structPattern = /struct\s+(\w+)\s*{([^}]+)}/g;
const structMemberPattern = /(\w+)\s*:\s*([\w\<\>]+)/g;
const structName = /struct\s+(\w+)/;
const groups = wgsl.match(linePattern)?.map((item) => ({
group: parseInt(item.match(groupPattern)[1], 10),
binding: parseInt(item.match(bindingPattern)[1], 10),
name: item.match(namePattern)[2],
isUniform: item.match(namePattern)[1] === "<uniform>",
type: item.match(typePattern)[1]
}));
if (!groups) {
return {
groups: [],
structs: []
};
}
const structs = wgsl.match(structPattern)?.map((struct) => {
const name = struct.match(structName)[1];
const members = struct.match(structMemberPattern).reduce((acc, member) => {
const [name2, type] = member.split(":");
acc[name2.trim()] = type.trim();
return acc;
}, {});
if (!members) {
return null;
}
return { name, members };
}).filter(({ name }) => groups.some((group) => group.type === name)) ?? [];
return {
groups,
structs
};
}
export { extractStructAndGroups };
//# sourceMappingURL=extractStructAndGroups.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"extractStructAndGroups.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/extractStructAndGroups.ts"],"sourcesContent":["export interface StructsAndGroups\n{\n groups: {\n group: number;\n binding: number;\n name: string;\n isUniform: boolean;\n type: string;\n }[];\n structs: {\n name: string;\n members: Record<string, string>;\n }[];\n}\n\nexport function extractStructAndGroups(wgsl: string): StructsAndGroups\n{\n // Patterns for parsing the WGSL file\n const linePattern = /(^|[^/])@(group|binding)\\(\\d+\\)[^;]+;/g;\n const groupPattern = /@group\\((\\d+)\\)/;\n const bindingPattern = /@binding\\((\\d+)\\)/;\n const namePattern = /var(<[^>]+>)? (\\w+)/;\n const typePattern = /:\\s*(\\w+)/;\n const structPattern = /struct\\s+(\\w+)\\s*{([^}]+)}/g;\n const structMemberPattern = /(\\w+)\\s*:\\s*([\\w\\<\\>]+)/g;\n const structName = /struct\\s+(\\w+)/;\n\n // Find the @group and @binding annotations\n const groups = wgsl.match(linePattern)?.map((item) => ({\n group: parseInt(item.match(groupPattern)[1], 10),\n binding: parseInt(item.match(bindingPattern)[1], 10),\n name: item.match(namePattern)[2],\n isUniform: item.match(namePattern)[1] === '<uniform>',\n type: item.match(typePattern)[1],\n }));\n\n if (!groups)\n {\n return {\n groups: [],\n structs: [],\n };\n }\n\n // Find the structs\n const structs = wgsl\n .match(structPattern)\n ?.map((struct) =>\n {\n const name = struct.match(structName)[1];\n const members = struct.match(structMemberPattern).reduce((acc: Record<string, string>, member) =>\n {\n const [name, type] = member.split(':');\n\n acc[name.trim()] = type.trim();\n\n return acc;\n }, {});\n\n if (!members)\n {\n return null;\n }\n\n return { name, members };\n // Only include the structs mentioned in the @group/@binding annotations\n })\n .filter(({ name }) => groups.some((group) => group.type === name)) ?? [];\n\n return {\n groups,\n structs,\n };\n}\n"],"names":["name"],"mappings":";AAeO,SAAS,uBAAuB,IACvC,EAAA;AAEI,EAAA,MAAM,WAAc,GAAA,wCAAA,CAAA;AACpB,EAAA,MAAM,YAAe,GAAA,iBAAA,CAAA;AACrB,EAAA,MAAM,cAAiB,GAAA,mBAAA,CAAA;AACvB,EAAA,MAAM,WAAc,GAAA,qBAAA,CAAA;AACpB,EAAA,MAAM,WAAc,GAAA,WAAA,CAAA;AACpB,EAAA,MAAM,aAAgB,GAAA,6BAAA,CAAA;AACtB,EAAA,MAAM,mBAAsB,GAAA,0BAAA,CAAA;AAC5B,EAAA,MAAM,UAAa,GAAA,gBAAA,CAAA;AAGnB,EAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,WAAW,CAAG,EAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,IACnD,KAAA,EAAO,SAAS,IAAK,CAAA,KAAA,CAAM,YAAY,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,IAC/C,OAAA,EAAS,SAAS,IAAK,CAAA,KAAA,CAAM,cAAc,CAAE,CAAA,CAAC,GAAG,EAAE,CAAA;AAAA,IACnD,IAAM,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,EAAE,CAAC,CAAA;AAAA,IAC/B,WAAW,IAAK,CAAA,KAAA,CAAM,WAAW,CAAA,CAAE,CAAC,CAAM,KAAA,WAAA;AAAA,IAC1C,IAAM,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,EAAE,CAAC,CAAA;AAAA,GACjC,CAAA,CAAA,CAAA;AAEF,EAAA,IAAI,CAAC,MACL,EAAA;AACI,IAAO,OAAA;AAAA,MACH,QAAQ,EAAC;AAAA,MACT,SAAS,EAAC;AAAA,KACd,CAAA;AAAA,GACJ;AAGA,EAAA,MAAM,UAAU,IACX,CAAA,KAAA,CAAM,aAAa,CAClB,EAAA,GAAA,CAAI,CAAC,MACP,KAAA;AACI,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,KAAM,CAAA,UAAU,EAAE,CAAC,CAAA,CAAA;AACvC,IAAM,MAAA,OAAA,GAAU,OAAO,KAAM,CAAA,mBAAmB,EAAE,MAAO,CAAA,CAAC,KAA6B,MACvF,KAAA;AACI,MAAA,MAAM,CAACA,KAAM,EAAA,IAAI,CAAI,GAAA,MAAA,CAAO,MAAM,GAAG,CAAA,CAAA;AAErC,MAAA,GAAA,CAAIA,KAAK,CAAA,IAAA,EAAM,CAAA,GAAI,KAAK,IAAK,EAAA,CAAA;AAE7B,MAAO,OAAA,GAAA,CAAA;AAAA,KACX,EAAG,EAAE,CAAA,CAAA;AAEL,IAAA,IAAI,CAAC,OACL,EAAA;AACI,MAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAEA,IAAO,OAAA,EAAE,MAAM,OAAQ,EAAA,CAAA;AAAA,GAE1B,CACA,CAAA,MAAA,CAAO,CAAC,EAAE,MAAW,KAAA,MAAA,CAAO,IAAK,CAAA,CAAC,UAAU,KAAM,CAAA,IAAA,KAAS,IAAI,CAAC,KAAK,EAAC,CAAA;AAE3E,EAAO,OAAA;AAAA,IACH,MAAA;AAAA,IACA,OAAA;AAAA,GACJ,CAAA;AACJ;;;;"}

View File

@@ -0,0 +1,9 @@
import type { UboElement } from '../../../shared/shader/types';
/**
* This generates a function that will sync an array to the uniform buffer
* following the wgsl layout
* @param uboElement - the element to generate the array sync for
* @param offsetToAdd - the offset to append at the start of the code
* @returns - the generated code
*/
export declare function generateArraySyncWGSL(uboElement: UboElement, offsetToAdd: number): string;

View File

@@ -0,0 +1,29 @@
'use strict';
var createUboElementsWGSL = require('./createUboElementsWGSL.js');
"use strict";
function generateArraySyncWGSL(uboElement, offsetToAdd) {
const { size, align } = createUboElementsWGSL.WGSL_ALIGN_SIZE_DATA[uboElement.data.type];
const remainder = (align - size) / 4;
return `
v = uv.${uboElement.data.name};
${offsetToAdd !== 0 ? `offset += ${offsetToAdd};` : ""}
arrayOffset = offset;
t = 0;
for(var i=0; i < ${uboElement.data.size * (size / 4)}; i++)
{
for(var j = 0; j < ${size / 4}; j++)
{
data[arrayOffset++] = v[t++];
}
${remainder !== 0 ? `arrayOffset += ${remainder};` : ""}
}
`;
}
exports.generateArraySyncWGSL = generateArraySyncWGSL;
//# sourceMappingURL=generateArraySyncWGSL.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateArraySyncWGSL.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateArraySyncWGSL.ts"],"sourcesContent":["import { WGSL_ALIGN_SIZE_DATA } from './createUboElementsWGSL';\n\nimport type { UboElement } from '../../../shared/shader/types';\n\n/**\n * This generates a function that will sync an array to the uniform buffer\n * following the wgsl layout\n * @param uboElement - the element to generate the array sync for\n * @param offsetToAdd - the offset to append at the start of the code\n * @returns - the generated code\n */\nexport function generateArraySyncWGSL(uboElement: UboElement, offsetToAdd: number): string\n{\n // this is in byte..\n const { size, align } = WGSL_ALIGN_SIZE_DATA[uboElement.data.type];\n\n const remainder = (align - size) / 4;\n\n return `\n v = uv.${uboElement.data.name};\n ${offsetToAdd !== 0 ? `offset += ${offsetToAdd};` : ''}\n\n arrayOffset = offset;\n\n t = 0;\n\n for(var i=0; i < ${uboElement.data.size * (size / 4)}; i++)\n {\n for(var j = 0; j < ${size / 4}; j++)\n {\n data[arrayOffset++] = v[t++];\n }\n ${remainder !== 0 ? `arrayOffset += ${remainder};` : ''}\n }\n `;\n}\n"],"names":["WGSL_ALIGN_SIZE_DATA"],"mappings":";;;;;AAWgB,SAAA,qBAAA,CAAsB,YAAwB,WAC9D,EAAA;AAEI,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,KAAUA,0CAAqB,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA,CAAA;AAEjE,EAAM,MAAA,SAAA,GAAA,CAAa,QAAQ,IAAQ,IAAA,CAAA,CAAA;AAEnC,EAAO,OAAA,CAAA;AAAA,gBACO,EAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,SAAA,EAC3B,WAAgB,KAAA,CAAA,GAAI,CAAa,UAAA,EAAA,WAAW,MAAM,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAMnC,UAAW,CAAA,IAAA,CAAK,IAAQ,IAAA,IAAA,GAAO,CAAE,CAAA,CAAA;AAAA;AAAA,gCAAA,EAE3B,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAI3B,SAAc,KAAA,CAAA,GAAI,CAAkB,eAAA,EAAA,SAAS,MAAM,EAAE,CAAA;AAAA;AAAA,KAAA,CAAA,CAAA;AAGpE;;;;"}

View File

@@ -0,0 +1,27 @@
import { WGSL_ALIGN_SIZE_DATA } from './createUboElementsWGSL.mjs';
"use strict";
function generateArraySyncWGSL(uboElement, offsetToAdd) {
const { size, align } = WGSL_ALIGN_SIZE_DATA[uboElement.data.type];
const remainder = (align - size) / 4;
return `
v = uv.${uboElement.data.name};
${offsetToAdd !== 0 ? `offset += ${offsetToAdd};` : ""}
arrayOffset = offset;
t = 0;
for(var i=0; i < ${uboElement.data.size * (size / 4)}; i++)
{
for(var j = 0; j < ${size / 4}; j++)
{
data[arrayOffset++] = v[t++];
}
${remainder !== 0 ? `arrayOffset += ${remainder};` : ""}
}
`;
}
export { generateArraySyncWGSL };
//# sourceMappingURL=generateArraySyncWGSL.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateArraySyncWGSL.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateArraySyncWGSL.ts"],"sourcesContent":["import { WGSL_ALIGN_SIZE_DATA } from './createUboElementsWGSL';\n\nimport type { UboElement } from '../../../shared/shader/types';\n\n/**\n * This generates a function that will sync an array to the uniform buffer\n * following the wgsl layout\n * @param uboElement - the element to generate the array sync for\n * @param offsetToAdd - the offset to append at the start of the code\n * @returns - the generated code\n */\nexport function generateArraySyncWGSL(uboElement: UboElement, offsetToAdd: number): string\n{\n // this is in byte..\n const { size, align } = WGSL_ALIGN_SIZE_DATA[uboElement.data.type];\n\n const remainder = (align - size) / 4;\n\n return `\n v = uv.${uboElement.data.name};\n ${offsetToAdd !== 0 ? `offset += ${offsetToAdd};` : ''}\n\n arrayOffset = offset;\n\n t = 0;\n\n for(var i=0; i < ${uboElement.data.size * (size / 4)}; i++)\n {\n for(var j = 0; j < ${size / 4}; j++)\n {\n data[arrayOffset++] = v[t++];\n }\n ${remainder !== 0 ? `arrayOffset += ${remainder};` : ''}\n }\n `;\n}\n"],"names":[],"mappings":";;;AAWgB,SAAA,qBAAA,CAAsB,YAAwB,WAC9D,EAAA;AAEI,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,KAAU,oBAAqB,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA,CAAA;AAEjE,EAAM,MAAA,SAAA,GAAA,CAAa,QAAQ,IAAQ,IAAA,CAAA,CAAA;AAEnC,EAAO,OAAA,CAAA;AAAA,gBACO,EAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,SAAA,EAC3B,WAAgB,KAAA,CAAA,GAAI,CAAa,UAAA,EAAA,WAAW,MAAM,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAMnC,UAAW,CAAA,IAAA,CAAK,IAAQ,IAAA,IAAA,GAAO,CAAE,CAAA,CAAA;AAAA;AAAA,gCAAA,EAE3B,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAI3B,SAAc,KAAA,CAAA,GAAI,CAAkB,eAAA,EAAA,SAAS,MAAM,EAAE,CAAA;AAAA;AAAA,KAAA,CAAA,CAAA;AAGpE;;;;"}

View File

@@ -0,0 +1,3 @@
import type { ProgramPipelineLayoutDescription } from '../GpuProgram';
import type { StructsAndGroups } from './extractStructAndGroups';
export declare function generateGpuLayoutGroups({ groups }: StructsAndGroups): ProgramPipelineLayoutDescription;

View File

@@ -0,0 +1,45 @@
'use strict';
var _const = require('../../../shared/shader/const.js');
"use strict";
function generateGpuLayoutGroups({ groups }) {
const layout = [];
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
if (!layout[group.group]) {
layout[group.group] = [];
}
if (group.isUniform) {
layout[group.group].push({
binding: group.binding,
visibility: _const.ShaderStage.VERTEX | _const.ShaderStage.FRAGMENT,
buffer: {
type: "uniform"
}
});
} else if (group.type === "sampler") {
layout[group.group].push({
binding: group.binding,
visibility: _const.ShaderStage.FRAGMENT,
sampler: {
type: "filtering"
}
});
} else if (group.type === "texture_2d") {
layout[group.group].push({
binding: group.binding,
visibility: _const.ShaderStage.FRAGMENT,
texture: {
sampleType: "float",
viewDimension: "2d",
multisampled: false
}
});
}
}
return layout;
}
exports.generateGpuLayoutGroups = generateGpuLayoutGroups;
//# sourceMappingURL=generateGpuLayoutGroups.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateGpuLayoutGroups.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateGpuLayoutGroups.ts"],"sourcesContent":["import { ShaderStage } from '../../../shared/shader/const';\n\nimport type { ProgramPipelineLayoutDescription } from '../GpuProgram';\nimport type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function generateGpuLayoutGroups({ groups }: StructsAndGroups): ProgramPipelineLayoutDescription\n{\n const layout: ProgramPipelineLayoutDescription = [];\n\n for (let i = 0; i < groups.length; i++)\n {\n const group = groups[i];\n\n if (!layout[group.group])\n {\n layout[group.group] = [];\n }\n\n if (group.isUniform)\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.VERTEX | ShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n });\n }\n else if (group.type === 'sampler')\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.FRAGMENT,\n sampler: {\n type: 'filtering'\n }\n });\n }\n else if (group.type === 'texture_2d')\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.FRAGMENT,\n texture: {\n sampleType: 'float',\n viewDimension: '2d',\n multisampled: false,\n }\n });\n }\n }\n\n return layout;\n}\n"],"names":["ShaderStage"],"mappings":";;;;;AAKgB,SAAA,uBAAA,CAAwB,EAAE,MAAA,EAC1C,EAAA;AACI,EAAA,MAAM,SAA2C,EAAC,CAAA;AAElD,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CACnC,EAAA,EAAA;AACI,IAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAM,CAAA,KAAK,CACvB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC,CAAA;AAAA,KAC3B;AAEA,IAAA,IAAI,MAAM,SACV,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,UAAA,EAAYA,kBAAY,CAAA,MAAA,GAASA,kBAAY,CAAA,QAAA;AAAA,QAC7C,MAAQ,EAAA;AAAA,UACJ,IAAM,EAAA,SAAA;AAAA,SACV;AAAA,OACH,CAAA,CAAA;AAAA,KACL,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,SACxB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,YAAYA,kBAAY,CAAA,QAAA;AAAA,QACxB,OAAS,EAAA;AAAA,UACL,IAAM,EAAA,WAAA;AAAA,SACV;AAAA,OACH,CAAA,CAAA;AAAA,KACL,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,YACxB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,YAAYA,kBAAY,CAAA,QAAA;AAAA,QACxB,OAAS,EAAA;AAAA,UACL,UAAY,EAAA,OAAA;AAAA,UACZ,aAAe,EAAA,IAAA;AAAA,UACf,YAAc,EAAA,KAAA;AAAA,SAClB;AAAA,OACH,CAAA,CAAA;AAAA,KACL;AAAA,GACJ;AAEA,EAAO,OAAA,MAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,43 @@
import { ShaderStage } from '../../../shared/shader/const.mjs';
"use strict";
function generateGpuLayoutGroups({ groups }) {
const layout = [];
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
if (!layout[group.group]) {
layout[group.group] = [];
}
if (group.isUniform) {
layout[group.group].push({
binding: group.binding,
visibility: ShaderStage.VERTEX | ShaderStage.FRAGMENT,
buffer: {
type: "uniform"
}
});
} else if (group.type === "sampler") {
layout[group.group].push({
binding: group.binding,
visibility: ShaderStage.FRAGMENT,
sampler: {
type: "filtering"
}
});
} else if (group.type === "texture_2d") {
layout[group.group].push({
binding: group.binding,
visibility: ShaderStage.FRAGMENT,
texture: {
sampleType: "float",
viewDimension: "2d",
multisampled: false
}
});
}
}
return layout;
}
export { generateGpuLayoutGroups };
//# sourceMappingURL=generateGpuLayoutGroups.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateGpuLayoutGroups.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateGpuLayoutGroups.ts"],"sourcesContent":["import { ShaderStage } from '../../../shared/shader/const';\n\nimport type { ProgramPipelineLayoutDescription } from '../GpuProgram';\nimport type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function generateGpuLayoutGroups({ groups }: StructsAndGroups): ProgramPipelineLayoutDescription\n{\n const layout: ProgramPipelineLayoutDescription = [];\n\n for (let i = 0; i < groups.length; i++)\n {\n const group = groups[i];\n\n if (!layout[group.group])\n {\n layout[group.group] = [];\n }\n\n if (group.isUniform)\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.VERTEX | ShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n });\n }\n else if (group.type === 'sampler')\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.FRAGMENT,\n sampler: {\n type: 'filtering'\n }\n });\n }\n else if (group.type === 'texture_2d')\n {\n layout[group.group].push({\n binding: group.binding,\n visibility: ShaderStage.FRAGMENT,\n texture: {\n sampleType: 'float',\n viewDimension: '2d',\n multisampled: false,\n }\n });\n }\n }\n\n return layout;\n}\n"],"names":[],"mappings":";;;AAKgB,SAAA,uBAAA,CAAwB,EAAE,MAAA,EAC1C,EAAA;AACI,EAAA,MAAM,SAA2C,EAAC,CAAA;AAElD,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CACnC,EAAA,EAAA;AACI,IAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAM,CAAA,KAAK,CACvB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC,CAAA;AAAA,KAC3B;AAEA,IAAA,IAAI,MAAM,SACV,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,UAAA,EAAY,WAAY,CAAA,MAAA,GAAS,WAAY,CAAA,QAAA;AAAA,QAC7C,MAAQ,EAAA;AAAA,UACJ,IAAM,EAAA,SAAA;AAAA,SACV;AAAA,OACH,CAAA,CAAA;AAAA,KACL,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,SACxB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,YAAY,WAAY,CAAA,QAAA;AAAA,QACxB,OAAS,EAAA;AAAA,UACL,IAAM,EAAA,WAAA;AAAA,SACV;AAAA,OACH,CAAA,CAAA;AAAA,KACL,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,YACxB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,IAAK,CAAA;AAAA,QACrB,SAAS,KAAM,CAAA,OAAA;AAAA,QACf,YAAY,WAAY,CAAA,QAAA;AAAA,QACxB,OAAS,EAAA;AAAA,UACL,UAAY,EAAA,OAAA;AAAA,UACZ,aAAe,EAAA,IAAA;AAAA,UACf,YAAc,EAAA,KAAA;AAAA,SAClB;AAAA,OACH,CAAA,CAAA;AAAA,KACL;AAAA,GACJ;AAEA,EAAO,OAAA,MAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,3 @@
import type { ProgramLayout } from '../GpuProgram';
import type { StructsAndGroups } from './extractStructAndGroups';
export declare function generateLayoutHash({ groups }: StructsAndGroups): ProgramLayout;

View File

@@ -0,0 +1,17 @@
'use strict';
"use strict";
function generateLayoutHash({ groups }) {
const layout = [];
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
if (!layout[group.group]) {
layout[group.group] = {};
}
layout[group.group][group.name] = group.binding;
}
return layout;
}
exports.generateLayoutHash = generateLayoutHash;
//# sourceMappingURL=generateLayoutHash.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateLayoutHash.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateLayoutHash.ts"],"sourcesContent":["import type { ProgramLayout } from '../GpuProgram';\nimport type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function generateLayoutHash({ groups }: StructsAndGroups): ProgramLayout\n{\n const layout: ProgramLayout = [];\n\n for (let i = 0; i < groups.length; i++)\n {\n const group = groups[i];\n\n if (!layout[group.group])\n {\n layout[group.group] = {};\n }\n\n layout[group.group][group.name] = group.binding;\n }\n\n return layout;\n}\n"],"names":[],"mappings":";;;AAGgB,SAAA,kBAAA,CAAmB,EAAE,MAAA,EACrC,EAAA;AACI,EAAA,MAAM,SAAwB,EAAC,CAAA;AAE/B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CACnC,EAAA,EAAA;AACI,IAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAM,CAAA,KAAK,CACvB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC,CAAA;AAAA,KAC3B;AAEA,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAE,KAAM,CAAA,IAAI,IAAI,KAAM,CAAA,OAAA,CAAA;AAAA,GAC5C;AAEA,EAAO,OAAA,MAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,15 @@
"use strict";
function generateLayoutHash({ groups }) {
const layout = [];
for (let i = 0; i < groups.length; i++) {
const group = groups[i];
if (!layout[group.group]) {
layout[group.group] = {};
}
layout[group.group][group.name] = group.binding;
}
return layout;
}
export { generateLayoutHash };
//# sourceMappingURL=generateLayoutHash.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"generateLayoutHash.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/generateLayoutHash.ts"],"sourcesContent":["import type { ProgramLayout } from '../GpuProgram';\nimport type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function generateLayoutHash({ groups }: StructsAndGroups): ProgramLayout\n{\n const layout: ProgramLayout = [];\n\n for (let i = 0; i < groups.length; i++)\n {\n const group = groups[i];\n\n if (!layout[group.group])\n {\n layout[group.group] = {};\n }\n\n layout[group.group][group.name] = group.binding;\n }\n\n return layout;\n}\n"],"names":[],"mappings":";AAGgB,SAAA,kBAAA,CAAmB,EAAE,MAAA,EACrC,EAAA;AACI,EAAA,MAAM,SAAwB,EAAC,CAAA;AAE/B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CACnC,EAAA,EAAA;AACI,IAAM,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAM,CAAA,KAAK,CACvB,EAAA;AACI,MAAO,MAAA,CAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAC,CAAA;AAAA,KAC3B;AAEA,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAE,KAAM,CAAA,IAAI,IAAI,KAAM,CAAA,OAAA,CAAA;AAAA,GAC5C;AAEA,EAAO,OAAA,MAAA,CAAA;AACX;;;;"}

View File

@@ -0,0 +1,14 @@
import type { StructsAndGroups } from './extractStructAndGroups';
export declare function removeStructAndGroupDuplicates(vertexStructsAndGroups: StructsAndGroups, fragmentStructsAndGroups: StructsAndGroups): {
structs: {
name: string;
members: Record<string, string>;
}[];
groups: {
group: number;
binding: number;
name: string;
isUniform: boolean;
type: string;
}[];
};

View File

@@ -0,0 +1,26 @@
'use strict';
"use strict";
function removeStructAndGroupDuplicates(vertexStructsAndGroups, fragmentStructsAndGroups) {
const structNameSet = /* @__PURE__ */ new Set();
const dupeGroupKeySet = /* @__PURE__ */ new Set();
const structs = [...vertexStructsAndGroups.structs, ...fragmentStructsAndGroups.structs].filter((struct) => {
if (structNameSet.has(struct.name)) {
return false;
}
structNameSet.add(struct.name);
return true;
});
const groups = [...vertexStructsAndGroups.groups, ...fragmentStructsAndGroups.groups].filter((group) => {
const key = `${group.name}-${group.binding}`;
if (dupeGroupKeySet.has(key)) {
return false;
}
dupeGroupKeySet.add(key);
return true;
});
return { structs, groups };
}
exports.removeStructAndGroupDuplicates = removeStructAndGroupDuplicates;
//# sourceMappingURL=removeStructAndGroupDuplicates.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"removeStructAndGroupDuplicates.js","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/removeStructAndGroupDuplicates.ts"],"sourcesContent":["import type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function removeStructAndGroupDuplicates(\n vertexStructsAndGroups: StructsAndGroups,\n fragmentStructsAndGroups: StructsAndGroups\n)\n{\n const structNameSet = new Set();\n const dupeGroupKeySet = new Set();\n\n const structs = [...vertexStructsAndGroups.structs, ...fragmentStructsAndGroups.structs]\n .filter((struct) =>\n {\n if (structNameSet.has(struct.name))\n {\n return false;\n }\n structNameSet.add(struct.name);\n\n return true;\n });\n\n const groups = [...vertexStructsAndGroups.groups, ...fragmentStructsAndGroups.groups]\n .filter((group) =>\n {\n const key = `${group.name}-${group.binding}`;\n\n if (dupeGroupKeySet.has(key))\n {\n return false;\n }\n dupeGroupKeySet.add(key);\n\n return true;\n });\n\n return { structs, groups };\n}\n"],"names":[],"mappings":";;;AAEgB,SAAA,8BAAA,CACZ,wBACA,wBAEJ,EAAA;AACI,EAAM,MAAA,aAAA,uBAAoB,GAAI,EAAA,CAAA;AAC9B,EAAM,MAAA,eAAA,uBAAsB,GAAI,EAAA,CAAA;AAEhC,EAAM,MAAA,OAAA,GAAU,CAAC,GAAG,sBAAuB,CAAA,OAAA,EAAS,GAAG,wBAAA,CAAyB,OAAO,CAAA,CAClF,MAAO,CAAA,CAAC,MACT,KAAA;AACI,IAAA,IAAI,aAAc,CAAA,GAAA,CAAI,MAAO,CAAA,IAAI,CACjC,EAAA;AACI,MAAO,OAAA,KAAA,CAAA;AAAA,KACX;AACA,IAAc,aAAA,CAAA,GAAA,CAAI,OAAO,IAAI,CAAA,CAAA;AAE7B,IAAO,OAAA,IAAA,CAAA;AAAA,GACV,CAAA,CAAA;AAEL,EAAM,MAAA,MAAA,GAAS,CAAC,GAAG,sBAAuB,CAAA,MAAA,EAAQ,GAAG,wBAAA,CAAyB,MAAM,CAAA,CAC/E,MAAO,CAAA,CAAC,KACT,KAAA;AACI,IAAA,MAAM,MAAM,CAAG,EAAA,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA,CAAA;AAE1C,IAAI,IAAA,eAAA,CAAgB,GAAI,CAAA,GAAG,CAC3B,EAAA;AACI,MAAO,OAAA,KAAA,CAAA;AAAA,KACX;AACA,IAAA,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAA;AAEvB,IAAO,OAAA,IAAA,CAAA;AAAA,GACV,CAAA,CAAA;AAEL,EAAO,OAAA,EAAE,SAAS,MAAO,EAAA,CAAA;AAC7B;;;;"}

View File

@@ -0,0 +1,24 @@
"use strict";
function removeStructAndGroupDuplicates(vertexStructsAndGroups, fragmentStructsAndGroups) {
const structNameSet = /* @__PURE__ */ new Set();
const dupeGroupKeySet = /* @__PURE__ */ new Set();
const structs = [...vertexStructsAndGroups.structs, ...fragmentStructsAndGroups.structs].filter((struct) => {
if (structNameSet.has(struct.name)) {
return false;
}
structNameSet.add(struct.name);
return true;
});
const groups = [...vertexStructsAndGroups.groups, ...fragmentStructsAndGroups.groups].filter((group) => {
const key = `${group.name}-${group.binding}`;
if (dupeGroupKeySet.has(key)) {
return false;
}
dupeGroupKeySet.add(key);
return true;
});
return { structs, groups };
}
export { removeStructAndGroupDuplicates };
//# sourceMappingURL=removeStructAndGroupDuplicates.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"removeStructAndGroupDuplicates.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/removeStructAndGroupDuplicates.ts"],"sourcesContent":["import type { StructsAndGroups } from './extractStructAndGroups';\n\nexport function removeStructAndGroupDuplicates(\n vertexStructsAndGroups: StructsAndGroups,\n fragmentStructsAndGroups: StructsAndGroups\n)\n{\n const structNameSet = new Set();\n const dupeGroupKeySet = new Set();\n\n const structs = [...vertexStructsAndGroups.structs, ...fragmentStructsAndGroups.structs]\n .filter((struct) =>\n {\n if (structNameSet.has(struct.name))\n {\n return false;\n }\n structNameSet.add(struct.name);\n\n return true;\n });\n\n const groups = [...vertexStructsAndGroups.groups, ...fragmentStructsAndGroups.groups]\n .filter((group) =>\n {\n const key = `${group.name}-${group.binding}`;\n\n if (dupeGroupKeySet.has(key))\n {\n return false;\n }\n dupeGroupKeySet.add(key);\n\n return true;\n });\n\n return { structs, groups };\n}\n"],"names":[],"mappings":";AAEgB,SAAA,8BAAA,CACZ,wBACA,wBAEJ,EAAA;AACI,EAAM,MAAA,aAAA,uBAAoB,GAAI,EAAA,CAAA;AAC9B,EAAM,MAAA,eAAA,uBAAsB,GAAI,EAAA,CAAA;AAEhC,EAAM,MAAA,OAAA,GAAU,CAAC,GAAG,sBAAuB,CAAA,OAAA,EAAS,GAAG,wBAAA,CAAyB,OAAO,CAAA,CAClF,MAAO,CAAA,CAAC,MACT,KAAA;AACI,IAAA,IAAI,aAAc,CAAA,GAAA,CAAI,MAAO,CAAA,IAAI,CACjC,EAAA;AACI,MAAO,OAAA,KAAA,CAAA;AAAA,KACX;AACA,IAAc,aAAA,CAAA,GAAA,CAAI,OAAO,IAAI,CAAA,CAAA;AAE7B,IAAO,OAAA,IAAA,CAAA;AAAA,GACV,CAAA,CAAA;AAEL,EAAM,MAAA,MAAA,GAAS,CAAC,GAAG,sBAAuB,CAAA,MAAA,EAAQ,GAAG,wBAAA,CAAyB,MAAM,CAAA,CAC/E,MAAO,CAAA,CAAC,KACT,KAAA;AACI,IAAA,MAAM,MAAM,CAAG,EAAA,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA,CAAA;AAE1C,IAAI,IAAA,eAAA,CAAgB,GAAI,CAAA,GAAG,CAC3B,EAAA;AACI,MAAO,OAAA,KAAA,CAAA;AAAA,KACX;AACA,IAAA,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAA;AAEvB,IAAO,OAAA,IAAA,CAAA;AAAA,GACV,CAAA,CAAA;AAEL,EAAO,OAAA,EAAE,SAAS,MAAO,EAAA,CAAA;AAC7B;;;;"}