38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
export const NANOVDB_PROGRESSIVE_REDRAW_MAX_FRAMES = 32;
|
|
export const NANOVDB_PROGRESSIVE_REDRAW_LIMIT_CODE = "NANOVDB_PROGRESSIVE_REDRAW_LIMIT" as const;
|
|
|
|
export interface NanoVDBProgressiveRedrawBudgetResult {
|
|
allowed: boolean;
|
|
redrawCount: number;
|
|
capped: boolean;
|
|
errorCode: typeof NANOVDB_PROGRESSIVE_REDRAW_LIMIT_CODE | null;
|
|
}
|
|
|
|
export function validateNanoVDBProgressiveRedrawLimit(value: number): number {
|
|
if (!Number.isSafeInteger(value) || value < 1 || value > 1024) {
|
|
throw new Error("NANOVDB_INVALID_ARGUMENT: progressive redraw limit must be an integer from 1 to 1024");
|
|
}
|
|
return value;
|
|
}
|
|
|
|
export function consumeNanoVDBProgressiveRedrawBudget(
|
|
redrawCount: number,
|
|
maxRedraws: number,
|
|
): NanoVDBProgressiveRedrawBudgetResult {
|
|
if (!Number.isSafeInteger(redrawCount) || redrawCount < 0) {
|
|
throw new Error("NANOVDB_INVALID_ARGUMENT: progressive redraw count must be a non-negative integer");
|
|
}
|
|
const limit = validateNanoVDBProgressiveRedrawLimit(maxRedraws);
|
|
if (redrawCount >= limit) {
|
|
return { allowed: false, redrawCount, capped: true, errorCode: NANOVDB_PROGRESSIVE_REDRAW_LIMIT_CODE };
|
|
}
|
|
const nextCount = redrawCount + 1;
|
|
const capped = nextCount >= limit;
|
|
return {
|
|
allowed: true,
|
|
redrawCount: nextCount,
|
|
capped,
|
|
errorCode: capped ? NANOVDB_PROGRESSIVE_REDRAW_LIMIT_CODE : null,
|
|
};
|
|
}
|