UNPKG

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
"use strict"; 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; }