wgsl-plus
Version:
A WGSL preprocessor, prettifier, minifier, obfuscator, and compiler with C-style macros, conditional compilation, file linking, and multi-format output for WebGPU shaders.
66 lines (65 loc) • 2.83 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = replaceIdentifiers;
const swizzles_1 = __importDefault(require("./swizzles"));
function replaceIdentifiers(tokens, identifierMap, structMemberMap) {
const obfuscatedTokens = [];
let inStructDefinition = false;
// Common vector swizzle patterns to preserve
// const swizzles = new Set(["x", "y", "z", "w", "xy", "xz", "yz", "xyz", "xyzw"]);
for (let i = 0; i < tokens.length; i++) {
const token = tokens[i];
if (token.type === "keyword" && token.value === "struct") {
inStructDefinition = true;
obfuscatedTokens.push(token);
continue;
}
if (inStructDefinition && token.value === "}") {
inStructDefinition = false;
obfuscatedTokens.push(token);
continue;
}
if (token.type === "identifier") {
// Inside struct definition, before a colon
if (inStructDefinition && i + 1 < tokens.length && tokens[i + 1].value === ":") {
const newValue = structMemberMap.get(token.value);
if (newValue) {
obfuscatedTokens.push(Object.assign(Object.assign({}, token), { value: newValue }));
}
else {
obfuscatedTokens.push(token);
}
}
// After a dot, preserve swizzles unless explicitly a struct member in a known struct context
else if (i > 0 && tokens[i - 1].value === ".") {
if (structMemberMap.has(token.value) && !swizzles_1.default.has(token.value)) {
obfuscatedTokens.push(Object.assign(Object.assign({}, token), { value: structMemberMap.get(token.value) }));
}
else {
obfuscatedTokens.push(token); // Preserve swizzles or unmapped identifiers
}
}
// Top-level identifier
else {
const newValue = identifierMap.get(token.value);
if (newValue) {
obfuscatedTokens.push(Object.assign(Object.assign({}, token), { value: newValue }));
}
else {
obfuscatedTokens.push(token);
}
}
}
else if (token.type === "builtin" || token.type !== "directive") {
// Preserve builtins and pass through non-directive tokens
obfuscatedTokens.push(token);
}
else if (token.type !== "directive") {
obfuscatedTokens.push(token);
}
}
return obfuscatedTokens;
}
;