Refining gpu-uniforms warnings, which are now only emitted if requested. Hypothetically a user could call write() on the ArrayBuffer to update only some of its values.

This commit is contained in:
Rezmason
2021-11-08 03:08:25 -08:00
parent 415ffa77ee
commit a4e08c0ceb

View File

@@ -93,7 +93,7 @@ const getTypeData = (type, attributes, otherStructLayouts) => {
.map((_) => innerTypeData.defaultValue()), .map((_) => innerTypeData.defaultValue()),
}; };
} else { } else {
console.warn(`Unsupported type: ${type}`); console.warn(`Unrecognized type ${type}.`);
return null; return null;
} }
}; };
@@ -165,19 +165,21 @@ const parseStructLayoutsFromShader = (wgsl) => {
const makeDataForLayout = (structLayouts, layout) => Object.fromEntries(layout.fields.map((field) => [field.identifier, field.defaultValue()])); const makeDataForLayout = (structLayouts, layout) => Object.fromEntries(layout.fields.map((field) => [field.identifier, field.defaultValue()]));
const writeField = (allLayouts, field, value, views, byteOffset) => { const writeField = (allLayouts, field, value, views, byteOffset, warnMissingFields) => {
if (value == null) { if (value == null) {
console.warn(`Property missing: ${field.identifier}`); if (warnMissingFields) {
console.warn(`Property missing from data: ${field.identifier}`);
}
return; return;
} }
if (field.isArray) { if (field.isArray) {
const count = field.isFixedSize ? field.mult : value.length; const count = field.isFixedSize ? field.mult : value.length;
for (let i = 0; i < field.mult; i++) { for (let i = 0; i < field.mult; i++) {
writeField(allLayouts, field.innerTypeData, value[i], views, byteOffset + field.innerTypeData.byteOffset * i); writeField(allLayouts, field.innerTypeData, value[i], views, byteOffset + field.innerTypeData.byteOffset * i, warnMissingFields);
} }
} else if (field.isStruct) { } else if (field.isStruct) {
for (const innerField of field.innerLayout.fields) { for (const innerField of field.innerLayout.fields) {
writeField(allLayouts, innerField, value[innerField.identifier], views, byteOffset + field.byteOffset); writeField(allLayouts, innerField, value[innerField.identifier], views, byteOffset + field.byteOffset, warnMissingFields);
} }
} else { } else {
const view = views[field.baseType]; const view = views[field.baseType];
@@ -191,7 +193,7 @@ const makeGenerator = (layout, structLayouts) => {
return Object.freeze({ return Object.freeze({
minSize, minSize,
create: () => makeDataForLayout(structLayouts, layout), create: () => makeDataForLayout(structLayouts, layout),
write: (object, destination) => { write: (object, destination, warnMissingFields = false) => {
destination ??= new ArrayBuffer(layout.sizeInBytes); // TODO: expand to support runtime-sized arrays, via the length of the array on the data object destination ??= new ArrayBuffer(layout.sizeInBytes); // TODO: expand to support runtime-sized arrays, via the length of the array on the data object
const views = { const views = {
@@ -201,7 +203,7 @@ const makeGenerator = (layout, structLayouts) => {
}; };
for (const field of layout.fields) { for (const field of layout.fields) {
writeField(structLayouts, field, object[field.identifier], views, 0); writeField(structLayouts, field, object[field.identifier], views, 0, warnMissingFields);
} }
return destination; return destination;