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.

40 lines (31 loc) 1.79 kB
import collectDeclaredIdentifiersAndEntryPoints from "./collect-declared-identifiers-and-entry-points"; import collectStructNames from "./collect-struct-names"; import Token from "../../tokenization/token"; import tokenizeWgsl from "../../tokenization/tokenize-wgsl"; import replaceIdentifiers from "./replace-identifiers"; import reconstructObfuscatedCode from "./reconstruct-obfuscated-code"; import { resetNameIndex } from "./next-name"; /** * Obfuscates WGSL code by renaming explicitly declared functions, variables, structs, and function parameters, * as well as struct members, while preserving vector swizzles and entry point names. * @param code The WGSL source code to obfuscate. * @returns The obfuscated and minified code with binding comments. */ export default function obfuscate(code: string): string { resetNameIndex(); // Get all the tokens. const tokens = tokenizeWgsl(code).filter(token => token.type !== "comment"); // Preliminary pass: Collect struct member names let structMemberMap = collectStructNames(tokens); // First pass: Collect declared identifiers and entry points let {identifierMap, bindingMap} = collectDeclaredIdentifiersAndEntryPoints(tokens); // Second pass: Replace identifiers with context-aware logic const obfuscatedTokens: Token[] = replaceIdentifiers(tokens, identifierMap, structMemberMap); // Reconstruct the obfuscated code with corrected spacing let obfuscatedCode = reconstructObfuscatedCode(obfuscatedTokens, tokens); // Generate binding mapping comments const bindingComments = Array.from(bindingMap.entries()) .map(([oldName, newName]) => `//#!binding ${oldName} ${newName}`) .join("\n"); return bindingComments ? `${bindingComments}\n${obfuscatedCode}` : obfuscatedCode; }