@viji-dev/core 0.2.8 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artist-dts.js +1 -1
- package/dist/artist-global.d.ts +1 -1
- package/dist/assets/{P5WorkerAdapter-bO_02bv6.js → renderers/P5WorkerAdapter-B4koBeZd.js} +2 -4
- package/dist/assets/renderers/P5WorkerAdapter-B4koBeZd.js.map +1 -0
- package/dist/assets/renderers/ShaderWorkerAdapter-Cn60jh9g.js +939 -0
- package/dist/assets/renderers/ShaderWorkerAdapter-Cn60jh9g.js.map +1 -0
- package/dist/assets/{viji.worker-BjMgRS7D.js → viji.worker-kGDstU5X.js} +91 -6
- package/dist/assets/viji.worker-kGDstU5X.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/dist/assets/P5WorkerAdapter-bO_02bv6.js.map +0 -1
- package/dist/assets/p5.min-BBA6UiVb.js +0 -16810
- package/dist/assets/p5.min-BBA6UiVb.js.map +0 -1
- package/dist/assets/viji.worker-BjMgRS7D.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderWorkerAdapter-Cn60jh9g.js","sources":["../../src/worker/renderers/ShaderParameterParser.ts","../../src/worker/renderers/ShaderWorkerAdapter.ts"],"sourcesContent":["/**\r\n * Shader Parameter Parser\r\n * \r\n * Parses parameter declarations from GLSL shader code comments.\r\n * Supports syntax: // @viji-TYPE:uniformName key:value key:value ...\r\n */\r\n\r\nexport interface ShaderParameterDefinition {\r\n type: string;\r\n uniformName: string;\r\n label: string;\r\n default: any;\r\n config: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Parses shader parameter declarations from GLSL comments\r\n */\r\nexport class ShaderParameterParser {\r\n /**\r\n * Parse all parameter declarations from shader code\r\n */\r\n static parseParameters(shaderCode: string): ShaderParameterDefinition[] {\r\n const parameters: ShaderParameterDefinition[] = [];\r\n const lines = shaderCode.split('\\n');\r\n \r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n \r\n // Match: // @viji-TYPE:uniformName key:value ...\r\n const match = trimmed.match(/\\/\\/\\s*@viji-(\\w+):(\\w+)\\s+(.+)/);\r\n \r\n if (match) {\r\n const [, type, uniformName, configStr] = match;\r\n \r\n try {\r\n const config = this.parseKeyValuePairs(configStr);\r\n \r\n const param: ShaderParameterDefinition = {\r\n type,\r\n uniformName,\r\n label: config.label || uniformName,\r\n default: config.default,\r\n config\r\n };\r\n \r\n this.validateParameter(param);\r\n parameters.push(param);\r\n } catch (error) {\r\n console.warn(`Failed to parse shader parameter: ${line}`, error);\r\n }\r\n }\r\n }\r\n \r\n return parameters;\r\n }\r\n \r\n /**\r\n * Parse key:value pairs from configuration string\r\n */\r\n static parseKeyValuePairs(configStr: string): Record<string, any> {\r\n const config: Record<string, any> = {};\r\n \r\n // Regex to match key:\"value\" or key:value or key:[\"a\",\"b\",\"c\"] or key:#hexcolor\r\n const keyValueRegex = /(\\w+):((?:\"[^\"]*\"|\\[[^\\]]*\\]|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|[^\\s]+))/g;\r\n \r\n let match;\r\n while ((match = keyValueRegex.exec(configStr)) !== null) {\r\n const [, key, value] = match;\r\n config[key] = this.parseValue(value);\r\n }\r\n \r\n return config;\r\n }\r\n \r\n /**\r\n * Parse individual value from string\r\n */\r\n private static parseValue(value: string): any {\r\n // Handle quoted strings: \"Hello World\"\r\n if (value.startsWith('\"') && value.endsWith('\"')) {\r\n return value.slice(1, -1);\r\n }\r\n \r\n // Handle arrays: [\"Option1\",\"Option2\"]\r\n if (value.startsWith('[') && value.endsWith(']')) {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n // If JSON parse fails, try manual parsing\r\n const items = value.slice(1, -1).split(',').map(s => s.trim());\r\n return items.map(item => {\r\n if (item.startsWith('\"') && item.endsWith('\"')) {\r\n return item.slice(1, -1);\r\n }\r\n const num = parseFloat(item);\r\n return isNaN(num) ? item : num;\r\n });\r\n }\r\n }\r\n \r\n // Handle hex colors: #ff0000 or #fff\r\n if (value.startsWith('#')) {\r\n return value;\r\n }\r\n \r\n // Handle booleans\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n \r\n // Handle numbers\r\n const num = parseFloat(value);\r\n if (!isNaN(num)) return num;\r\n \r\n // Return as string\r\n return value;\r\n }\r\n \r\n /**\r\n * Validate parameter definition\r\n */\r\n static validateParameter(param: ShaderParameterDefinition): void {\r\n // Required fields\r\n if (!param.type) {\r\n throw new Error('Parameter type is required');\r\n }\r\n \r\n if (!param.uniformName) {\r\n throw new Error('Parameter uniformName is required');\r\n }\r\n \r\n if (!param.config.label) {\r\n throw new Error(`Parameter ${param.uniformName} missing required 'label' key`);\r\n }\r\n \r\n // Validate by type\r\n switch (param.type) {\r\n case 'slider':\r\n case 'number':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type ${param.type} missing required 'default' key`);\r\n }\r\n break;\r\n \r\n case 'color':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'color' missing required 'default' key`);\r\n }\r\n if (!param.config.default.startsWith('#')) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'color' default must be hex color (e.g., #ff0000)`);\r\n }\r\n break;\r\n \r\n case 'toggle':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'toggle' missing required 'default' key`);\r\n }\r\n if (typeof param.config.default !== 'boolean') {\r\n throw new Error(`Parameter ${param.uniformName} of type 'toggle' default must be boolean (true or false)`);\r\n }\r\n break;\r\n \r\n case 'select':\r\n if (param.config.default === undefined) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'select' missing required 'default' key`);\r\n }\r\n if (!param.config.options || !Array.isArray(param.config.options)) {\r\n throw new Error(`Parameter ${param.uniformName} of type 'select' missing required 'options' key (array)`);\r\n }\r\n break;\r\n \r\n case 'image':\r\n // Image parameters don't require default (always starts as null)\r\n break;\r\n \r\n default:\r\n console.warn(`Unknown parameter type: ${param.type}`);\r\n }\r\n \r\n // Warn if using reserved u_ prefix\r\n if (param.uniformName.startsWith('u_')) {\r\n console.warn(`Parameter name \"${param.uniformName}\" uses reserved prefix \"u_\". Consider renaming to avoid conflicts with built-in uniforms.`);\r\n }\r\n }\r\n \r\n /**\r\n * Generate uniform declaration for a parameter\r\n */\r\n static generateUniformDeclaration(param: ShaderParameterDefinition): string {\r\n switch (param.type) {\r\n case 'slider':\r\n case 'number':\r\n return `uniform float ${param.uniformName};`;\r\n \r\n case 'color':\r\n return `uniform vec3 ${param.uniformName};`;\r\n \r\n case 'toggle':\r\n return `uniform bool ${param.uniformName};`;\r\n \r\n case 'select':\r\n return `uniform int ${param.uniformName};`;\r\n \r\n case 'image':\r\n return `uniform sampler2D ${param.uniformName};`;\r\n \r\n default:\r\n return `// Unknown parameter type: ${param.type}`;\r\n }\r\n }\r\n}\r\n\r\n","/**\n * Shader Worker Adapter\n * \n * Integrates GLSL shaders into Viji's worker-based rendering system.\n * Provides automatic uniform injection and parameter management.\n */\n\nimport { ShaderParameterParser, ShaderParameterDefinition } from './ShaderParameterParser.js';\n\nexport class ShaderWorkerAdapter {\n private gl: WebGLRenderingContext | WebGL2RenderingContext;\n private program: WebGLProgram | null = null;\n private uniformLocations = new Map<string, WebGLUniformLocation | null>();\n private textureUnits = new Map<string, number>();\n private nextTextureUnit = 0;\n private textures = new Map<string, WebGLTexture>();\n \n // Fullscreen quad\n private quadBuffer: WebGLBuffer | null = null;\n \n // Parameter definitions\n private parameters: ShaderParameterDefinition[] = [];\n \n // GLSL version detection\n private glslVersion: 'glsl100' | 'glsl300' = 'glsl100';\n \n // Audio FFT texture\n private audioFFTTexture: WebGLTexture | null = null;\n private videoTexture: WebGLTexture | null = null;\n private segmentationTexture: WebGLTexture | null = null;\n \n // Backbuffer support (ping-pong framebuffers)\n private backbufferFramebuffer: WebGLFramebuffer | null = null;\n private backbufferTexture: WebGLTexture | null = null;\n private currentFramebuffer: WebGLFramebuffer | null = null;\n private currentTexture: WebGLTexture | null = null;\n private backbufferEnabled: boolean = false;\n \n constructor(\n offscreenCanvas: OffscreenCanvas,\n _vijiAPI: any,\n private shaderCode: string\n ) {\n // Detect GLSL version\n this.glslVersion = this.detectGLSLVersion(shaderCode);\n \n // Detect if shader uses backbuffer\n this.backbufferEnabled = shaderCode.includes('backbuffer');\n \n // Get appropriate WebGL context\n if (this.glslVersion === 'glsl300') {\n const gl = offscreenCanvas.getContext('webgl2');\n if (!gl) {\n throw new Error('WebGL 2 not supported. Use GLSL ES 1.00 syntax instead.');\n }\n this.gl = gl;\n } else {\n const gl = offscreenCanvas.getContext('webgl');\n if (!gl) {\n throw new Error('WebGL not supported');\n }\n this.gl = gl;\n }\n }\n \n /**\n * Initialize the shader adapter\n */\n public async init(): Promise<void> {\n try {\n // Parse parameters from shader code\n this.parameters = ShaderParameterParser.parseParameters(this.shaderCode);\n \n // Create fullscreen quad\n this.createFullscreenQuad();\n \n // Inject uniforms and compile shader\n const processedCode = this.injectUniforms(this.shaderCode);\n this.compileAndLinkShader(processedCode);\n \n // Get all uniform locations\n this.cacheUniformLocations();\n \n // Reserve texture units for special textures\n this.reserveTextureUnits();\n \n // Create backbuffer framebuffers if needed\n if (this.backbufferEnabled) {\n this.createBackbufferFramebuffers();\n }\n \n } catch (error) {\n console.error('Failed to initialize ShaderWorkerAdapter:', error);\n throw error;\n }\n }\n \n /**\n * Detect GLSL version from shader code\n */\n private detectGLSLVersion(code: string): 'glsl100' | 'glsl300' {\n return code.includes('#version 300') ? 'glsl300' : 'glsl100';\n }\n \n /**\n * Create fullscreen quad geometry\n */\n private createFullscreenQuad(): void {\n // Two triangles covering the full screen\n const vertices = new Float32Array([\n -1, -1, // Bottom-left\n 1, -1, // Bottom-right\n -1, 1, // Top-left\n 1, 1 // Top-right\n ]);\n \n this.quadBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.quadBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, vertices, this.gl.STATIC_DRAW);\n }\n \n /**\n * Inject built-in and parameter uniforms into shader code\n */\n private injectUniforms(artistCode: string): string {\n // Extract #version directive if present (MUST be first line in GLSL ES 3.00)\n let versionLine = '';\n let codeWithoutVersion = artistCode;\n \n const lines = artistCode.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (trimmed.startsWith('#version')) {\n versionLine = trimmed;\n // Remove this line from the code\n lines[i] = '';\n codeWithoutVersion = lines.join('\\n');\n break;\n }\n }\n \n // Find injection point in code (without #version)\n const injectionPoint = this.findInjectionPoint(codeWithoutVersion);\n \n // Build uniform declarations\n const builtInUniforms = this.getBuiltInUniforms();\n const parameterUniforms = this.parameters\n .map(p => ShaderParameterParser.generateUniformDeclaration(p))\n .join('\\n');\n \n // Check if shader uses fwidth (requires extension in WebGL 1)\n const usesFwidth = artistCode.includes('fwidth');\n \n // Check if extension is supported (for WebGL 1)\n if (usesFwidth && this.glslVersion === 'glsl100') {\n const ext = this.gl.getExtension('OES_standard_derivatives');\n if (!ext) {\n console.warn('Shader uses fwidth() but OES_standard_derivatives extension is not supported. Shader may not compile.');\n }\n }\n \n // Build injection parts\n const parts: string[] = [];\n \n // 1. Extensions MUST come first (before precision) - only for GLSL 1.00\n if (usesFwidth && this.glslVersion === 'glsl100') {\n parts.push('#extension GL_OES_standard_derivatives : enable');\n }\n \n // 2. Precision MUST come before uniforms (only for GLSL 1.00, ES 3.00 has it by default)\n if (this.glslVersion === 'glsl100') {\n parts.push('');\n parts.push('#ifdef GL_ES');\n parts.push('precision mediump float;');\n parts.push('#endif');\n } else {\n // For GLSL 3.00, just add precision\n parts.push('');\n parts.push('precision mediump float;');\n }\n \n // 3. Uniforms\n parts.push('');\n parts.push('// ===== VIJI AUTO-INJECTED UNIFORMS =====');\n parts.push('// Built-in uniforms (auto-provided)');\n parts.push(builtInUniforms);\n parts.push('');\n parts.push('// Parameter uniforms (from @viji-* declarations)');\n parts.push(parameterUniforms);\n parts.push('');\n parts.push('// ===== ARTIST CODE =====');\n \n const uniformBlock = parts.join('\\n');\n \n // Insert uniform block at injection point\n const codeWithUniforms = (\n codeWithoutVersion.slice(0, injectionPoint) +\n '\\n' + uniformBlock + '\\n' +\n codeWithoutVersion.slice(injectionPoint)\n );\n \n // Reconstruct: #version MUST be first line, then uniforms, then artist code\n const finalCode = versionLine\n ? versionLine + '\\n' + codeWithUniforms\n : codeWithUniforms;\n \n // Debug: Log the injected code (first 50 lines)\n console.log('=== INJECTED SHADER CODE (first 50 lines) ===');\n console.log(finalCode.split('\\n').slice(0, 50).join('\\n'));\n console.log('=== END INJECTED CODE ===');\n \n return finalCode;\n }\n \n /**\n * Find where to inject extensions and uniforms\n * Extensions must come after #version but before any code\n * \n * Strategy: \n * 1. If #version exists, inject right after it\n * 2. Otherwise, skip ALL comments (single and multi-line) and inject before first code\n */\n private findInjectionPoint(code: string): number {\n const lines = code.split('\\n');\n \n // Find #version line (if present) - inject right after\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line.startsWith('#version')) {\n return this.getLineEndPosition(code, i);\n }\n }\n \n // No #version - skip ALL comments (single-line and multi-line blocks)\n let inMultiLineComment = false;\n let firstCodeLine = 0;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Track multi-line comment state\n if (line.includes('/*')) {\n inMultiLineComment = true;\n }\n if (line.includes('*/')) {\n inMultiLineComment = false;\n firstCodeLine = i + 1; // Next line after comment closes\n continue;\n }\n \n // Skip if in multi-line comment\n if (inMultiLineComment) {\n continue;\n }\n \n // Skip empty lines and single-line comments\n if (line === '' || line.startsWith('//')) {\n firstCodeLine = i + 1;\n continue;\n }\n \n // Found first non-comment line - inject before it\n break;\n }\n \n // Get position at start of first code line\n if (firstCodeLine > 0 && firstCodeLine < lines.length) {\n return this.getLineEndPosition(code, firstCodeLine - 1);\n }\n \n return 0;\n }\n \n /**\n * Get byte position of end of line N\n */\n private getLineEndPosition(code: string, lineNumber: number): number {\n const lines = code.split('\\n');\n let position = 0;\n \n for (let i = 0; i <= lineNumber && i < lines.length; i++) {\n position += lines[i].length + 1; // +1 for newline\n }\n \n return position;\n }\n \n /**\n * Get built-in uniform declarations\n */\n private getBuiltInUniforms(): string {\n return `// Core - Canvas & Timing\nuniform vec2 u_resolution;\nuniform float u_time;\nuniform float u_deltaTime;\nuniform int u_frame;\nuniform float u_pixelRatio;\nuniform float u_fps;\n\n// Mouse API\nuniform vec2 u_mouse;\nuniform bool u_mouseInCanvas;\nuniform bool u_mousePressed;\nuniform bool u_mouseLeft;\nuniform bool u_mouseRight;\nuniform bool u_mouseMiddle;\nuniform vec2 u_mouseVelocity;\n\n// Keyboard API - Common keys\nuniform bool u_keySpace;\nuniform bool u_keyShift;\nuniform bool u_keyCtrl;\nuniform bool u_keyAlt;\nuniform bool u_keyW;\nuniform bool u_keyA;\nuniform bool u_keyS;\nuniform bool u_keyD;\nuniform bool u_keyUp;\nuniform bool u_keyDown;\nuniform bool u_keyLeft;\nuniform bool u_keyRight;\n\n// Touch API\nuniform int u_touchCount;\nuniform vec2 u_touch0;\nuniform vec2 u_touch1;\nuniform vec2 u_touch2;\nuniform vec2 u_touch3;\nuniform vec2 u_touch4;\n\n// Audio\nuniform float u_audioVolume;\nuniform float u_audioPeak;\nuniform float u_audioBass;\nuniform float u_audioMid;\nuniform float u_audioTreble;\nuniform float u_audioSubBass;\nuniform float u_audioLowMid;\nuniform float u_audioHighMid;\nuniform float u_audioPresence;\nuniform float u_audioBrilliance;\nuniform sampler2D u_audioFFT;\n\n// Video\nuniform sampler2D u_video;\nuniform vec2 u_videoResolution;\nuniform float u_videoFrameRate;\n\n// CV - Face Detection\nuniform int u_faceCount;\nuniform vec4 u_face0Bounds;\nuniform vec3 u_face0HeadPose;\nuniform float u_face0Confidence;\nuniform float u_face0Happy;\nuniform float u_face0Sad;\nuniform float u_face0Angry;\nuniform float u_face0Surprised;\n\n// CV - Hand Tracking\nuniform int u_handCount;\nuniform vec3 u_leftHandPalm;\nuniform vec3 u_rightHandPalm;\nuniform float u_leftHandFist;\nuniform float u_leftHandOpen;\nuniform float u_rightHandFist;\nuniform float u_rightHandOpen;\n\n// CV - Pose Detection\nuniform bool u_poseDetected;\nuniform vec2 u_nosePosition;\nuniform vec2 u_leftWristPosition;\nuniform vec2 u_rightWristPosition;\nuniform vec2 u_leftAnklePosition;\nuniform vec2 u_rightAnklePosition;\n\n// CV - Segmentation\nuniform sampler2D u_segmentationMask;\nuniform vec2 u_segmentationRes;\n\n// Backbuffer (previous frame feedback)\n${this.backbufferEnabled ? 'uniform sampler2D backbuffer;' : '// backbuffer not enabled'}\n`;\n }\n \n /**\n * Compile and link shader program\n */\n private compileAndLinkShader(fragmentShaderCode: string): void {\n const gl = this.gl;\n \n // Generate vertex shader matching GLSL version\n const vertexShaderCode = this.glslVersion === 'glsl300'\n ? `#version 300 es\n precision mediump float;\n in vec2 a_position;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }`\n : `attribute vec2 a_position;\n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n }`;\n \n // Compile vertex shader\n const vertexShader = this.compileShader(gl.VERTEX_SHADER, vertexShaderCode);\n \n // Compile fragment shader\n const fragmentShader = this.compileShader(gl.FRAGMENT_SHADER, fragmentShaderCode);\n \n // Link program\n const program = gl.createProgram();\n if (!program) {\n throw new Error('Failed to create WebGL program');\n }\n \n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n \n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Shader program link failed: ${error}`);\n }\n \n this.program = program;\n gl.useProgram(program);\n \n // Clean up shaders (no longer needed after linking)\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n }\n \n /**\n * Compile a shader\n */\n private compileShader(type: number, source: string): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(type);\n \n if (!shader) {\n throw new Error('Failed to create shader');\n }\n \n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n \n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n const shaderType = type === gl.VERTEX_SHADER ? 'vertex' : 'fragment';\n throw new Error(`${shaderType} shader compilation failed:\\n${error}`);\n }\n \n return shader;\n }\n \n /**\n * Cache uniform locations for fast access\n */\n private cacheUniformLocations(): void {\n if (!this.program) return;\n \n const gl = this.gl;\n const numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n \n for (let i = 0; i < numUniforms; i++) {\n const info = gl.getActiveUniform(this.program, i);\n if (info) {\n const location = gl.getUniformLocation(this.program, info.name);\n this.uniformLocations.set(info.name, location);\n }\n }\n }\n \n /**\n * Reserve texture units for special textures\n */\n private reserveTextureUnits(): void {\n // Reserve texture units for built-in textures\n this.textureUnits.set('u_audioFFT', this.nextTextureUnit++);\n this.textureUnits.set('u_video', this.nextTextureUnit++);\n this.textureUnits.set('u_segmentationMask', this.nextTextureUnit++);\n if (this.backbufferEnabled) {\n this.textureUnits.set('backbuffer', this.nextTextureUnit++);\n }\n }\n \n /**\n * Create ping-pong framebuffers for backbuffer support\n */\n private createBackbufferFramebuffers(): void {\n const gl = this.gl;\n const width = gl.canvas.width;\n const height = gl.canvas.height;\n \n // Create two framebuffer/texture pairs for ping-pong\n const createFBOTexture = () => {\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n \n return { framebuffer, texture };\n };\n \n const fbo1 = createFBOTexture();\n const fbo2 = createFBOTexture();\n \n this.backbufferFramebuffer = fbo1.framebuffer;\n this.backbufferTexture = fbo1.texture;\n this.currentFramebuffer = fbo2.framebuffer;\n this.currentTexture = fbo2.texture;\n \n // Unbind\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n \n /**\n * Main render method\n */\n public render(viji: any, parameterObjects: Map<string, any>): void {\n const gl = this.gl;\n \n if (!this.program || !this.quadBuffer) {\n console.warn('Shader not initialized');\n return;\n }\n \n gl.useProgram(this.program);\n \n // Update all built-in uniforms\n this.updateBuiltInUniforms(viji);\n \n // Update parameter uniforms\n this.updateParameterUniforms(parameterObjects);\n \n // If backbuffer enabled, bind backbuffer texture and render to current framebuffer\n if (this.backbufferEnabled && this.backbufferTexture) {\n // Bind the backbuffer (previous frame) as a texture\n const backbufferUnit = this.textureUnits.get('backbuffer');\n if (backbufferUnit !== undefined) {\n gl.activeTexture(gl.TEXTURE0 + backbufferUnit);\n gl.bindTexture(gl.TEXTURE_2D, this.backbufferTexture);\n this.setUniform('backbuffer', 'sampler2D', backbufferUnit);\n }\n \n // Render to current framebuffer\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.currentFramebuffer);\n }\n \n // Bind attribute\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n \n // Draw fullscreen quad\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n \n // If backbuffer enabled, copy to screen and swap buffers\n if (this.backbufferEnabled) {\n // Unbind framebuffer (render to screen)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n \n // Draw the current texture to screen\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.currentTexture);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n \n // Swap framebuffers for next frame\n const tempFB = this.backbufferFramebuffer;\n const tempTex = this.backbufferTexture;\n this.backbufferFramebuffer = this.currentFramebuffer;\n this.backbufferTexture = this.currentTexture;\n this.currentFramebuffer = tempFB;\n this.currentTexture = tempTex;\n }\n }\n \n /**\n * Update built-in uniforms from viji object\n */\n private updateBuiltInUniforms(viji: any): void {\n // Core\n this.setUniform('u_resolution', 'vec2', [viji.width, viji.height]);\n this.setUniform('u_time', 'float', viji.time);\n this.setUniform('u_deltaTime', 'float', viji.deltaTime);\n this.setUniform('u_frame', 'int', viji.frameCount);\n this.setUniform('u_pixelRatio', 'float', viji.pixelRatio);\n this.setUniform('u_fps', 'float', viji.fps);\n \n // Mouse (flip Y from DOM coords to WebGL coords)\n this.setUniform('u_mouse', 'vec2', [viji.mouse.x, viji.height - viji.mouse.y]);\n this.setUniform('u_mouseInCanvas', 'bool', viji.mouse.isInCanvas);\n this.setUniform('u_mousePressed', 'bool', viji.mouse.isPressed);\n this.setUniform('u_mouseLeft', 'bool', viji.mouse.leftButton);\n this.setUniform('u_mouseRight', 'bool', viji.mouse.rightButton);\n this.setUniform('u_mouseMiddle', 'bool', viji.mouse.middleButton);\n this.setUniform('u_mouseVelocity', 'vec2', [viji.mouse.velocity.x, -viji.mouse.velocity.y]);\n \n // Keyboard - Common keys\n this.setUniform('u_keySpace', 'bool', viji.keyboard.isPressed(' ') || viji.keyboard.isPressed('space'));\n this.setUniform('u_keyShift', 'bool', viji.keyboard.shift);\n this.setUniform('u_keyCtrl', 'bool', viji.keyboard.ctrl);\n this.setUniform('u_keyAlt', 'bool', viji.keyboard.alt);\n this.setUniform('u_keyW', 'bool', viji.keyboard.isPressed('w') || viji.keyboard.isPressed('W'));\n this.setUniform('u_keyA', 'bool', viji.keyboard.isPressed('a') || viji.keyboard.isPressed('A'));\n this.setUniform('u_keyS', 'bool', viji.keyboard.isPressed('s') || viji.keyboard.isPressed('S'));\n this.setUniform('u_keyD', 'bool', viji.keyboard.isPressed('d') || viji.keyboard.isPressed('D'));\n this.setUniform('u_keyUp', 'bool', viji.keyboard.isPressed('ArrowUp'));\n this.setUniform('u_keyDown', 'bool', viji.keyboard.isPressed('ArrowDown'));\n this.setUniform('u_keyLeft', 'bool', viji.keyboard.isPressed('ArrowLeft'));\n this.setUniform('u_keyRight', 'bool', viji.keyboard.isPressed('ArrowRight'));\n \n // Touch (flip Y from DOM coords to WebGL coords)\n this.setUniform('u_touchCount', 'int', viji.touches.count);\n for (let i = 0; i < 5; i++) {\n const touch = viji.touches.points[i];\n if (touch) {\n this.setUniform(`u_touch${i}`, 'vec2', [touch.x, viji.height - touch.y]);\n } else {\n this.setUniform(`u_touch${i}`, 'vec2', [0, 0]);\n }\n }\n \n // Audio\n const audio = viji.audio;\n this.setUniform('u_audioVolume', 'float', audio.volume?.rms || 0);\n this.setUniform('u_audioPeak', 'float', audio.volume?.peak || 0);\n this.setUniform('u_audioBass', 'float', audio.bands?.bass || 0);\n this.setUniform('u_audioMid', 'float', audio.bands?.mid || 0);\n this.setUniform('u_audioTreble', 'float', audio.bands?.treble || 0);\n this.setUniform('u_audioSubBass', 'float', audio.bands?.subBass || 0);\n this.setUniform('u_audioLowMid', 'float', audio.bands?.lowMid || 0);\n this.setUniform('u_audioHighMid', 'float', audio.bands?.highMid || 0);\n this.setUniform('u_audioPresence', 'float', audio.bands?.presence || 0);\n this.setUniform('u_audioBrilliance', 'float', audio.bands?.brilliance || 0);\n \n // Audio FFT texture\n if (audio.isConnected) {\n this.updateAudioFFTTexture(audio.getFrequencyData());\n }\n \n // Video\n const video = viji.video;\n if (video.isConnected && video.currentFrame) {\n this.updateVideoTexture(video.currentFrame);\n this.setUniform('u_videoResolution', 'vec2', [video.frameWidth, video.frameHeight]);\n this.setUniform('u_videoFrameRate', 'float', video.frameRate);\n } else {\n this.setUniform('u_videoResolution', 'vec2', [0, 0]);\n this.setUniform('u_videoFrameRate', 'float', 0);\n }\n \n // CV - Faces\n const faces = video.faces || [];\n this.setUniform('u_faceCount', 'int', faces.length);\n if (faces.length > 0) {\n const face = faces[0];\n this.setUniform('u_face0Bounds', 'vec4', [face.bounds.x, face.bounds.y, face.bounds.width, face.bounds.height]);\n this.setUniform('u_face0HeadPose', 'vec3', [face.headPose.pitch, face.headPose.yaw, face.headPose.roll]);\n this.setUniform('u_face0Confidence', 'float', face.confidence);\n this.setUniform('u_face0Happy', 'float', face.expressions.happy);\n this.setUniform('u_face0Sad', 'float', face.expressions.sad);\n this.setUniform('u_face0Angry', 'float', face.expressions.angry);\n this.setUniform('u_face0Surprised', 'float', face.expressions.surprised);\n } else {\n this.setUniform('u_face0Bounds', 'vec4', [0, 0, 0, 0]);\n this.setUniform('u_face0HeadPose', 'vec3', [0, 0, 0]);\n this.setUniform('u_face0Confidence', 'float', 0);\n this.setUniform('u_face0Happy', 'float', 0);\n this.setUniform('u_face0Sad', 'float', 0);\n this.setUniform('u_face0Angry', 'float', 0);\n this.setUniform('u_face0Surprised', 'float', 0);\n }\n \n // CV - Hands\n const hands = video.hands || [];\n this.setUniform('u_handCount', 'int', hands.length);\n \n const leftHand = hands.find((h: any) => h.handedness === 'left');\n const rightHand = hands.find((h: any) => h.handedness === 'right');\n \n if (leftHand) {\n this.setUniform('u_leftHandPalm', 'vec3', [leftHand.palm.x, leftHand.palm.y, leftHand.palm.z]);\n this.setUniform('u_leftHandFist', 'float', leftHand.gestures?.fist || 0);\n this.setUniform('u_leftHandOpen', 'float', leftHand.gestures?.openPalm || 0);\n } else {\n this.setUniform('u_leftHandPalm', 'vec3', [0, 0, 0]);\n this.setUniform('u_leftHandFist', 'float', 0);\n this.setUniform('u_leftHandOpen', 'float', 0);\n }\n \n if (rightHand) {\n this.setUniform('u_rightHandPalm', 'vec3', [rightHand.palm.x, rightHand.palm.y, rightHand.palm.z]);\n this.setUniform('u_rightHandFist', 'float', rightHand.gestures?.fist || 0);\n this.setUniform('u_rightHandOpen', 'float', rightHand.gestures?.openPalm || 0);\n } else {\n this.setUniform('u_rightHandPalm', 'vec3', [0, 0, 0]);\n this.setUniform('u_rightHandFist', 'float', 0);\n this.setUniform('u_rightHandOpen', 'float', 0);\n }\n \n // CV - Pose\n const pose = video.pose;\n this.setUniform('u_poseDetected', 'bool', pose !== null);\n if (pose) {\n // Simplified - just provide key landmarks\n // Nose (landmark 0), wrists (landmarks 15, 16), ankles (landmarks 27, 28)\n const nose = pose.landmarks[0];\n const leftWrist = pose.landmarks[15];\n const rightWrist = pose.landmarks[16];\n const leftAnkle = pose.landmarks[27];\n const rightAnkle = pose.landmarks[28];\n \n this.setUniform('u_nosePosition', 'vec2', [nose?.x || 0, nose?.y || 0]);\n this.setUniform('u_leftWristPosition', 'vec2', [leftWrist?.x || 0, leftWrist?.y || 0]);\n this.setUniform('u_rightWristPosition', 'vec2', [rightWrist?.x || 0, rightWrist?.y || 0]);\n this.setUniform('u_leftAnklePosition', 'vec2', [leftAnkle?.x || 0, leftAnkle?.y || 0]);\n this.setUniform('u_rightAnklePosition', 'vec2', [rightAnkle?.x || 0, rightAnkle?.y || 0]);\n } else {\n this.setUniform('u_nosePosition', 'vec2', [0, 0]);\n this.setUniform('u_leftWristPosition', 'vec2', [0, 0]);\n this.setUniform('u_rightWristPosition', 'vec2', [0, 0]);\n this.setUniform('u_leftAnklePosition', 'vec2', [0, 0]);\n this.setUniform('u_rightAnklePosition', 'vec2', [0, 0]);\n }\n \n // CV - Segmentation\n const segmentation = video.segmentation;\n if (segmentation) {\n this.updateSegmentationTexture(segmentation.mask, segmentation.width, segmentation.height);\n this.setUniform('u_segmentationRes', 'vec2', [segmentation.width, segmentation.height]);\n } else {\n this.setUniform('u_segmentationRes', 'vec2', [0, 0]);\n }\n }\n \n /**\n * Update parameter uniforms from parameter objects\n */\n private updateParameterUniforms(parameterObjects: Map<string, any>): void {\n for (const param of this.parameters) {\n const paramObj = parameterObjects.get(param.uniformName);\n if (!paramObj) continue;\n \n const value = paramObj.value;\n \n switch (param.type) {\n case 'slider':\n case 'number':\n this.setUniform(param.uniformName, 'float', value);\n break;\n \n case 'color':\n // Convert hex color to RGB vec3\n const rgb = this.hexToRgb(value);\n this.setUniform(param.uniformName, 'vec3', rgb);\n break;\n \n case 'toggle':\n this.setUniform(param.uniformName, 'bool', value);\n break;\n \n case 'select':\n // Select uses index\n const index = param.config.options?.indexOf(value) || 0;\n this.setUniform(param.uniformName, 'int', index);\n break;\n \n case 'image':\n // Image parameters are handled separately as textures\n if (value) {\n this.updateImageTexture(param.uniformName, value);\n }\n break;\n }\n }\n }\n \n /**\n * Set uniform value\n */\n private setUniform(name: string, type: string, value: any): void {\n const location = this.uniformLocations.get(name);\n if (location === null || location === undefined) {\n return; // Uniform not used in shader (optimized away)\n }\n \n const gl = this.gl;\n \n switch (type) {\n case 'float':\n gl.uniform1f(location, value);\n break;\n case 'int':\n gl.uniform1i(location, value);\n break;\n case 'bool':\n gl.uniform1i(location, value ? 1 : 0);\n break;\n case 'vec2':\n gl.uniform2f(location, value[0], value[1]);\n break;\n case 'vec3':\n gl.uniform3f(location, value[0], value[1], value[2]);\n break;\n case 'vec4':\n gl.uniform4f(location, value[0], value[1], value[2], value[3]);\n break;\n }\n }\n \n /**\n * Convert hex color to RGB [0-1]\n */\n private hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (result) {\n return [\n parseInt(result[1], 16) / 255,\n parseInt(result[2], 16) / 255,\n parseInt(result[3], 16) / 255\n ];\n }\n return [0, 0, 0];\n }\n \n /**\n * Update audio FFT texture\n */\n private updateAudioFFTTexture(frequencyData: Uint8Array): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_audioFFT')!;\n \n if (!this.audioFFTTexture) {\n this.audioFFTTexture = gl.createTexture();\n }\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.audioFFTTexture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.LUMINANCE,\n frequencyData.length, 1, 0,\n gl.LUMINANCE, gl.UNSIGNED_BYTE,\n frequencyData\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get('u_audioFFT');\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Update video texture\n */\n private updateVideoTexture(videoFrame: OffscreenCanvas): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_video')!;\n \n if (!this.videoTexture) {\n this.videoTexture = gl.createTexture();\n }\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.videoTexture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n videoFrame\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get('u_video');\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Update segmentation mask texture\n */\n private updateSegmentationTexture(mask: Uint8Array, width: number, height: number): void {\n const gl = this.gl;\n const unit = this.textureUnits.get('u_segmentationMask')!;\n \n if (!this.segmentationTexture) {\n this.segmentationTexture = gl.createTexture();\n }\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, this.segmentationTexture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.LUMINANCE,\n width, height, 0,\n gl.LUMINANCE, gl.UNSIGNED_BYTE,\n mask\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get('u_segmentationMask');\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Update image parameter texture\n */\n private updateImageTexture(name: string, imageBitmap: ImageBitmap | OffscreenCanvas): void {\n const gl = this.gl;\n \n // Assign texture unit if not already assigned\n if (!this.textureUnits.has(name)) {\n this.textureUnits.set(name, this.nextTextureUnit++);\n }\n \n const unit = this.textureUnits.get(name)!;\n \n // Create texture if needed\n if (!this.textures.has(name)) {\n const texture = gl.createTexture();\n if (texture) {\n this.textures.set(name, texture);\n }\n }\n \n const texture = this.textures.get(name);\n if (!texture) return;\n \n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n \n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n gl.RGBA, gl.UNSIGNED_BYTE,\n imageBitmap\n );\n \n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n \n const location = this.uniformLocations.get(name);\n if (location) {\n gl.uniform1i(location, unit);\n }\n }\n \n /**\n * Handle canvas resize\n */\n public resize(width: number, height: number): void {\n const gl = this.gl;\n gl.viewport(0, 0, width, height);\n \n // Recreate backbuffer framebuffers if enabled to match new canvas size\n if (this.backbufferEnabled) {\n this.createBackbufferFramebuffers();\n }\n }\n \n /**\n * Get parameter definitions for host\n */\n public getParameterDefinitions(): ShaderParameterDefinition[] {\n return this.parameters;\n }\n}\n\n"],"names":["num","texture"],"mappings":"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"}
|
|
@@ -1543,6 +1543,8 @@ class VijiWorkerRuntime {
|
|
|
1543
1543
|
debugMode = false;
|
|
1544
1544
|
// P5.js adapter for P5 mode
|
|
1545
1545
|
p5Adapter = null;
|
|
1546
|
+
// Shader adapter for shader mode
|
|
1547
|
+
shaderAdapter = null;
|
|
1546
1548
|
rendererType = "native";
|
|
1547
1549
|
/**
|
|
1548
1550
|
* Enable or disable debug logging
|
|
@@ -1688,7 +1690,7 @@ class VijiWorkerRuntime {
|
|
|
1688
1690
|
try {
|
|
1689
1691
|
this.rendererType = "p5";
|
|
1690
1692
|
this.debugLog("🎨 Initializing P5.js mode...");
|
|
1691
|
-
const { P5WorkerAdapter } = await import("./P5WorkerAdapter-
|
|
1693
|
+
const { P5WorkerAdapter } = await import("./renderers/P5WorkerAdapter-B4koBeZd.js");
|
|
1692
1694
|
this.p5Adapter = new P5WorkerAdapter(
|
|
1693
1695
|
this.canvas,
|
|
1694
1696
|
this.viji,
|
|
@@ -1709,6 +1711,72 @@ class VijiWorkerRuntime {
|
|
|
1709
1711
|
this.p5Adapter = null;
|
|
1710
1712
|
}
|
|
1711
1713
|
}
|
|
1714
|
+
/**
|
|
1715
|
+
* Initialize shader rendering mode
|
|
1716
|
+
* Used when artist code includes // @renderer shader
|
|
1717
|
+
*/
|
|
1718
|
+
async initShaderMode(shaderCode) {
|
|
1719
|
+
try {
|
|
1720
|
+
this.rendererType = "shader";
|
|
1721
|
+
this.debugLog("🎨 Initializing Shader mode...");
|
|
1722
|
+
const { ShaderWorkerAdapter } = await import("./renderers/ShaderWorkerAdapter-Cn60jh9g.js");
|
|
1723
|
+
this.shaderAdapter = new ShaderWorkerAdapter(
|
|
1724
|
+
this.canvas,
|
|
1725
|
+
this.viji,
|
|
1726
|
+
shaderCode
|
|
1727
|
+
);
|
|
1728
|
+
await this.shaderAdapter.init();
|
|
1729
|
+
const parameterDefinitions = this.shaderAdapter.getParameterDefinitions();
|
|
1730
|
+
for (const param of parameterDefinitions) {
|
|
1731
|
+
this.registerShaderParameter(param);
|
|
1732
|
+
}
|
|
1733
|
+
this.debugLog("✅ Shader mode initialized successfully");
|
|
1734
|
+
} catch (error) {
|
|
1735
|
+
console.error("❌ Failed to initialize Shader mode:", error);
|
|
1736
|
+
this.postMessage("error", {
|
|
1737
|
+
message: `Shader initialization failed: ${error.message}`,
|
|
1738
|
+
code: "SHADER_INIT_ERROR"
|
|
1739
|
+
});
|
|
1740
|
+
this.rendererType = "native";
|
|
1741
|
+
this.shaderAdapter = null;
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
/**
|
|
1745
|
+
* Register a shader parameter with the parameter system
|
|
1746
|
+
* In the parameter system, the 'label' serves as the parameter name/key
|
|
1747
|
+
*/
|
|
1748
|
+
registerShaderParameter(param) {
|
|
1749
|
+
const config = param.config;
|
|
1750
|
+
const paramConfig = {
|
|
1751
|
+
...config,
|
|
1752
|
+
label: param.uniformName,
|
|
1753
|
+
// uniformName becomes the parameter key
|
|
1754
|
+
description: config.label ? `${config.label}${config.description ? ": " + config.description : ""}` : config.description
|
|
1755
|
+
};
|
|
1756
|
+
switch (param.type) {
|
|
1757
|
+
case "slider":
|
|
1758
|
+
this.viji.slider(config.default, paramConfig);
|
|
1759
|
+
break;
|
|
1760
|
+
case "number":
|
|
1761
|
+
this.viji.number(config.default, paramConfig);
|
|
1762
|
+
break;
|
|
1763
|
+
case "color":
|
|
1764
|
+
this.viji.color(config.default, paramConfig);
|
|
1765
|
+
break;
|
|
1766
|
+
case "toggle":
|
|
1767
|
+
this.viji.toggle(config.default, paramConfig);
|
|
1768
|
+
break;
|
|
1769
|
+
case "select":
|
|
1770
|
+
this.viji.select(config.default, {
|
|
1771
|
+
...paramConfig,
|
|
1772
|
+
options: config.options
|
|
1773
|
+
});
|
|
1774
|
+
break;
|
|
1775
|
+
case "image":
|
|
1776
|
+
this.viji.image(null, paramConfig);
|
|
1777
|
+
break;
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1712
1780
|
// Reset parameter state (called when loading new scene)
|
|
1713
1781
|
resetParameterState() {
|
|
1714
1782
|
this.parameterSystem.resetParameterState();
|
|
@@ -1901,6 +1969,9 @@ class VijiWorkerRuntime {
|
|
|
1901
1969
|
if (this.p5Adapter && this.rendererType === "p5") {
|
|
1902
1970
|
this.p5Adapter.resize(this.viji.width, this.viji.height);
|
|
1903
1971
|
}
|
|
1972
|
+
if (this.shaderAdapter && this.rendererType === "shader") {
|
|
1973
|
+
this.shaderAdapter.resize(this.viji.width, this.viji.height);
|
|
1974
|
+
}
|
|
1904
1975
|
this.debugLog("Canvas resolution updated to:", this.viji.width + "x" + this.viji.height);
|
|
1905
1976
|
}
|
|
1906
1977
|
}
|
|
@@ -2053,7 +2124,10 @@ class VijiWorkerRuntime {
|
|
|
2053
2124
|
this.trackEffectiveFrameTime(currentTime);
|
|
2054
2125
|
this.lastTime = currentTime;
|
|
2055
2126
|
try {
|
|
2056
|
-
if (this.
|
|
2127
|
+
if (this.shaderAdapter && this.rendererType === "shader") {
|
|
2128
|
+
const parameterObjects = this.parameterSystem.getAllParameterObjects();
|
|
2129
|
+
this.shaderAdapter.render(this.viji, parameterObjects);
|
|
2130
|
+
} else if (this.p5Adapter && this.rendererType === "p5") {
|
|
2057
2131
|
const parameterObjects = this.parameterSystem.getAllParameterObjects();
|
|
2058
2132
|
this.p5Adapter.tick(this.viji, parameterObjects);
|
|
2059
2133
|
} else {
|
|
@@ -2101,14 +2175,22 @@ class SceneAnalyzer {
|
|
|
2101
2175
|
* Detects the renderer type from scene code comments
|
|
2102
2176
|
*
|
|
2103
2177
|
* Looks for:
|
|
2178
|
+
* - // @renderer shader
|
|
2179
|
+
* - /* @renderer shader *\/
|
|
2104
2180
|
* - // @renderer p5
|
|
2105
2181
|
* - /* @renderer p5 *\/
|
|
2106
2182
|
*
|
|
2107
2183
|
* @param sceneCode - The artist's scene code to analyze
|
|
2108
|
-
* @returns The detected renderer type ('p5' or 'native')
|
|
2184
|
+
* @returns The detected renderer type ('shader', 'p5', or 'native')
|
|
2109
2185
|
*/
|
|
2110
2186
|
static detectRendererType(sceneCode) {
|
|
2111
|
-
|
|
2187
|
+
if (/\/\/\s*@renderer\s+shader|\/\*\s*@renderer\s+shader\s*\*\//.test(sceneCode)) {
|
|
2188
|
+
return "shader";
|
|
2189
|
+
}
|
|
2190
|
+
if (/\/\/\s*@renderer\s+p5|\/\*\s*@renderer\s+p5\s*\*\//.test(sceneCode)) {
|
|
2191
|
+
return "p5";
|
|
2192
|
+
}
|
|
2193
|
+
return "native";
|
|
2112
2194
|
}
|
|
2113
2195
|
}
|
|
2114
2196
|
const runtime = new VijiWorkerRuntime();
|
|
@@ -2117,7 +2199,10 @@ async function setSceneCode(sceneCode) {
|
|
|
2117
2199
|
try {
|
|
2118
2200
|
runtime.resetParameterState();
|
|
2119
2201
|
const rendererType = SceneAnalyzer.detectRendererType(sceneCode);
|
|
2120
|
-
if (rendererType === "
|
|
2202
|
+
if (rendererType === "shader") {
|
|
2203
|
+
await runtime.initShaderMode(sceneCode);
|
|
2204
|
+
runtime.sendAllParametersToHost();
|
|
2205
|
+
} else if (rendererType === "p5") {
|
|
2121
2206
|
const functionBody = sceneCode + '\nreturn { setup: typeof setup !== "undefined" ? setup : null, render: typeof render !== "undefined" ? render : null };';
|
|
2122
2207
|
const sceneFunction = new Function("viji", "p5", functionBody);
|
|
2123
2208
|
const { setup, render } = sceneFunction(runtime.viji, null);
|
|
@@ -2147,4 +2232,4 @@ async function setSceneCode(sceneCode) {
|
|
|
2147
2232
|
}
|
|
2148
2233
|
}
|
|
2149
2234
|
self.setSceneCode = setSceneCode;
|
|
2150
|
-
//# sourceMappingURL=viji.worker-
|
|
2235
|
+
//# sourceMappingURL=viji.worker-kGDstU5X.js.map
|