@viji-dev/core 0.2.9 → 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.map +1 -0
- package/dist/assets/{viji.worker-Cbdf1a6N.js → viji.worker-kGDstU5X.js} +3 -3
- package/dist/assets/{viji.worker-Cbdf1a6N.js.map → viji.worker-kGDstU5X.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- 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/ShaderWorkerAdapter-Cn60jh9g.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/{ShaderWorkerAdapter-Cn60jh9g.js → renderers/ShaderWorkerAdapter-Cn60jh9g.js} +0 -0
package/dist/artist-dts.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const artistDts = "declare namespace VijiCore {\n declare interface AnalysisConfiguration {\r\n fftSize?: number;\r\n smoothing?: number;\r\n frequencyBands?: FrequencyBand[];\r\n beatDetection?: boolean;\r\n onsetDetection?: boolean;\r\n }\r\n\n declare interface AudioAPI {\r\n isConnected: boolean;\r\n volume: {\r\n rms: number;\r\n peak: number;\r\n };\r\n beat?: {\r\n isKick: boolean;\r\n confidence: number;\r\n };\r\n bands: Record<string, number>;\r\n getFrequencyData: () => Uint8Array;\r\n }\r\n\n declare interface CaptureFrameOptions {\r\n /** MIME type for output, e.g., 'image/png', 'image/jpeg', 'image/webp' */\r\n type?: string;\r\n /**\r\n * Target resolution.\r\n * - number: scale factor relative to current canvas size (e.g., 0.5 = 50%)\r\n * - { width, height }: exact output size; if aspect ratio differs from canvas,\r\n * the source is center-cropped to match the target aspect ratio before scaling\r\n */\r\n resolution?: number | {\r\n width: number;\r\n height: number;\r\n };\r\n }\r\n\n declare interface ColorConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ColorParameter {\r\n value: string;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation';\r\n\n declare type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';\r\n\n declare interface FaceData {\r\n id: number;\r\n bounds: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n confidence: number;\r\n landmarks?: {\r\n x: number;\r\n y: number;\r\n z?: number;\r\n }[];\r\n expressions: {\r\n neutral: number;\r\n happy: number;\r\n sad: number;\r\n angry: number;\r\n surprised: number;\r\n disgusted: number;\r\n fearful: number;\r\n };\r\n headPose: {\r\n pitch: number;\r\n yaw: number;\r\n roll: number;\r\n };\r\n }\r\n\n declare type FrameRateMode = 'full' | 'half';\r\n\n declare interface FrequencyBand {\r\n name: string;\r\n min: number;\r\n max: number;\r\n }\r\n\n declare interface HandData {\r\n id: number;\r\n handedness: 'left' | 'right';\r\n confidence: number;\r\n bounds: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n landmarks: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n }[];\r\n palm: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n fingers: {\r\n thumb: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n index: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n middle: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n ring: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n pinky: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n };\r\n gestures: {\r\n fist: number;\r\n openPalm: number;\r\n peace: number;\r\n thumbsUp: number;\r\n pointing: number;\r\n };\r\n }\r\n\n declare interface ImageConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ImageParameter {\r\n value: ImageBitmap | OffscreenCanvas | null;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface KeyboardAPI {\r\n isPressed(key: string): boolean;\r\n wasPressed(key: string): boolean;\r\n wasReleased(key: string): boolean;\r\n activeKeys: Set<string>;\r\n pressedThisFrame: Set<string>;\r\n releasedThisFrame: Set<string>;\r\n lastKeyPressed: string;\r\n lastKeyReleased: string;\r\n shift: boolean;\r\n ctrl: boolean;\r\n alt: boolean;\r\n meta: boolean;\r\n }\r\n\n declare interface MouseAPI {\r\n x: number;\r\n y: number;\r\n isInCanvas: boolean;\r\n isPressed: boolean;\r\n leftButton: boolean;\r\n rightButton: boolean;\r\n middleButton: boolean;\r\n velocity: {\r\n x: number;\r\n y: number;\r\n };\r\n deltaX: number;\r\n deltaY: number;\r\n wheelDelta: number;\r\n wheelX: number;\r\n wheelY: number;\r\n wasPressed: boolean;\r\n wasReleased: boolean;\r\n wasMoved: boolean;\r\n }\r\n\n declare interface NumberConfig {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface NumberParameter {\r\n value: number;\r\n min: number;\r\n max: number;\r\n step: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';\r\n\n declare interface PoseData {\r\n confidence: number;\r\n landmarks: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n visibility: number;\r\n }[];\r\n face: {\r\n x: number;\r\n y: number;\r\n }[];\r\n torso: {\r\n x: number;\r\n y: number;\r\n }[];\r\n leftArm: {\r\n x: number;\r\n y: number;\r\n }[];\r\n rightArm: {\r\n x: number;\r\n y: number;\r\n }[];\r\n leftLeg: {\r\n x: number;\r\n y: number;\r\n }[];\r\n rightLeg: {\r\n x: number;\r\n y: number;\r\n }[];\r\n }\r\n\n declare type Resolution = {\r\n width: number;\r\n height: number;\r\n };\r\n\n declare interface SegmentationData {\r\n mask: Uint8Array;\r\n width: number;\r\n height: number;\r\n }\r\n\n declare interface SelectConfig {\r\n options: string[] | number[];\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface SelectParameter {\r\n value: string | number;\r\n options: string[] | number[];\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface SliderConfig {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface SliderParameter {\r\n value: number;\r\n min: number;\r\n max: number;\r\n step: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface TextConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n maxLength?: number;\r\n }\r\n\n declare interface TextParameter {\r\n value: string;\r\n maxLength?: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface ToggleConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ToggleParameter {\r\n value: boolean;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface TouchAPI {\r\n points: TouchPoint[];\r\n count: number;\r\n started: TouchPoint[];\r\n moved: TouchPoint[];\r\n ended: TouchPoint[];\r\n primary: TouchPoint | null;\r\n gestures: TouchGestureAPI;\r\n }\r\n\n declare interface TouchGestureAPI {\r\n isPinching: boolean;\r\n isRotating: boolean;\r\n isPanning: boolean;\r\n isTapping: boolean;\r\n pinchScale: number;\r\n pinchDelta: number;\r\n rotationAngle: number;\r\n rotationDelta: number;\r\n panDelta: {\r\n x: number;\r\n y: number;\r\n };\r\n tapCount: number;\r\n lastTapTime: number;\r\n tapPosition: {\r\n x: number;\r\n y: number;\r\n } | null;\r\n }\r\n\n declare interface TouchPoint {\r\n id: number;\r\n x: number;\r\n y: number;\r\n pressure: number;\r\n radius: number;\r\n radiusX: number;\r\n radiusY: number;\r\n rotationAngle: number;\r\n force: number;\r\n deltaX: number;\r\n deltaY: number;\r\n velocity: {\r\n x: number;\r\n y: number;\r\n };\r\n isNew: boolean;\r\n isActive: boolean;\r\n isEnding: boolean;\r\n }\r\n\n declare const VERSION = \"0.2.9\";\r\n\n declare interface VideoAPI {\r\n isConnected: boolean;\r\n currentFrame: OffscreenCanvas | null;\r\n frameWidth: number;\r\n frameHeight: number;\r\n frameRate: number;\r\n getFrameData: () => ImageData | null;\r\n faces: FaceData[];\r\n hands: HandData[];\r\n pose: PoseData | null;\r\n segmentation: SegmentationData | null;\r\n cv: {\r\n enableFaceDetection(enabled: boolean): Promise<void>;\r\n enableFaceMesh(enabled: boolean): Promise<void>;\r\n enableHandTracking(enabled: boolean): Promise<void>;\r\n enablePoseDetection(enabled: boolean): Promise<void>;\r\n enableBodySegmentation(enabled: boolean): Promise<void>;\r\n getActiveFeatures(): CVFeature[];\r\n isProcessing(): boolean;\r\n };\r\n }\r\n\n declare interface VijiAPI {\r\n canvas: OffscreenCanvas;\r\n ctx?: OffscreenCanvasRenderingContext2D;\r\n gl?: WebGL2RenderingContext;\r\n width: number;\r\n height: number;\r\n pixelRatio: number;\r\n time: number;\r\n deltaTime: number;\r\n frameCount: number;\r\n fps: number;\r\n audio: AudioAPI;\r\n video: VideoAPI;\r\n mouse: MouseAPI;\r\n keyboard: KeyboardAPI;\r\n touches: TouchAPI;\r\n slider: (defaultValue: number, config: SliderConfig) => SliderParameter;\r\n color: (defaultValue: string, config: ColorConfig) => ColorParameter;\r\n toggle: (defaultValue: boolean, config: ToggleConfig) => ToggleParameter;\r\n select: (defaultValue: string | number, config: SelectConfig) => SelectParameter;\r\n text: (defaultValue: string, config: TextConfig) => TextParameter;\r\n number: (defaultValue: number, config: NumberConfig) => NumberParameter;\r\n image: (defaultValue: null, config: ImageConfig) => ImageParameter;\r\n useContext(type: '2d'): OffscreenCanvasRenderingContext2D;\n useContext(type: 'webgl'): WebGLRenderingContext | WebGL2RenderingContext;\r\n }\r\n}\n\ndeclare const viji: VijiCore.VijiAPI;\ndeclare function render(viji: VijiCore.VijiAPI): void;\n";
|
|
1
|
+
export const artistDts = "declare namespace VijiCore {\n declare interface AnalysisConfiguration {\r\n fftSize?: number;\r\n smoothing?: number;\r\n frequencyBands?: FrequencyBand[];\r\n beatDetection?: boolean;\r\n onsetDetection?: boolean;\r\n }\r\n\n declare interface AudioAPI {\r\n isConnected: boolean;\r\n volume: {\r\n rms: number;\r\n peak: number;\r\n };\r\n beat?: {\r\n isKick: boolean;\r\n confidence: number;\r\n };\r\n bands: Record<string, number>;\r\n getFrequencyData: () => Uint8Array;\r\n }\r\n\n declare interface CaptureFrameOptions {\r\n /** MIME type for output, e.g., 'image/png', 'image/jpeg', 'image/webp' */\r\n type?: string;\r\n /**\r\n * Target resolution.\r\n * - number: scale factor relative to current canvas size (e.g., 0.5 = 50%)\r\n * - { width, height }: exact output size; if aspect ratio differs from canvas,\r\n * the source is center-cropped to match the target aspect ratio before scaling\r\n */\r\n resolution?: number | {\r\n width: number;\r\n height: number;\r\n };\r\n }\r\n\n declare interface ColorConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ColorParameter {\r\n value: string;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation';\r\n\n declare type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';\r\n\n declare interface FaceData {\r\n id: number;\r\n bounds: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n confidence: number;\r\n landmarks?: {\r\n x: number;\r\n y: number;\r\n z?: number;\r\n }[];\r\n expressions: {\r\n neutral: number;\r\n happy: number;\r\n sad: number;\r\n angry: number;\r\n surprised: number;\r\n disgusted: number;\r\n fearful: number;\r\n };\r\n headPose: {\r\n pitch: number;\r\n yaw: number;\r\n roll: number;\r\n };\r\n }\r\n\n declare type FrameRateMode = 'full' | 'half';\r\n\n declare interface FrequencyBand {\r\n name: string;\r\n min: number;\r\n max: number;\r\n }\r\n\n declare interface HandData {\r\n id: number;\r\n handedness: 'left' | 'right';\r\n confidence: number;\r\n bounds: {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n };\r\n landmarks: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n }[];\r\n palm: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n fingers: {\r\n thumb: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n index: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n middle: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n ring: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n pinky: {\r\n tip: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n };\r\n extended: boolean;\r\n };\r\n };\r\n gestures: {\r\n fist: number;\r\n openPalm: number;\r\n peace: number;\r\n thumbsUp: number;\r\n pointing: number;\r\n };\r\n }\r\n\n declare interface ImageConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ImageParameter {\r\n value: ImageBitmap | OffscreenCanvas | null;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface KeyboardAPI {\r\n isPressed(key: string): boolean;\r\n wasPressed(key: string): boolean;\r\n wasReleased(key: string): boolean;\r\n activeKeys: Set<string>;\r\n pressedThisFrame: Set<string>;\r\n releasedThisFrame: Set<string>;\r\n lastKeyPressed: string;\r\n lastKeyReleased: string;\r\n shift: boolean;\r\n ctrl: boolean;\r\n alt: boolean;\r\n meta: boolean;\r\n }\r\n\n declare interface MouseAPI {\r\n x: number;\r\n y: number;\r\n isInCanvas: boolean;\r\n isPressed: boolean;\r\n leftButton: boolean;\r\n rightButton: boolean;\r\n middleButton: boolean;\r\n velocity: {\r\n x: number;\r\n y: number;\r\n };\r\n deltaX: number;\r\n deltaY: number;\r\n wheelDelta: number;\r\n wheelX: number;\r\n wheelY: number;\r\n wasPressed: boolean;\r\n wasReleased: boolean;\r\n wasMoved: boolean;\r\n }\r\n\n declare interface NumberConfig {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface NumberParameter {\r\n value: number;\r\n min: number;\r\n max: number;\r\n step: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';\r\n\n declare interface PoseData {\r\n confidence: number;\r\n landmarks: {\r\n x: number;\r\n y: number;\r\n z: number;\r\n visibility: number;\r\n }[];\r\n face: {\r\n x: number;\r\n y: number;\r\n }[];\r\n torso: {\r\n x: number;\r\n y: number;\r\n }[];\r\n leftArm: {\r\n x: number;\r\n y: number;\r\n }[];\r\n rightArm: {\r\n x: number;\r\n y: number;\r\n }[];\r\n leftLeg: {\r\n x: number;\r\n y: number;\r\n }[];\r\n rightLeg: {\r\n x: number;\r\n y: number;\r\n }[];\r\n }\r\n\n declare type Resolution = {\r\n width: number;\r\n height: number;\r\n };\r\n\n declare interface SegmentationData {\r\n mask: Uint8Array;\r\n width: number;\r\n height: number;\r\n }\r\n\n declare interface SelectConfig {\r\n options: string[] | number[];\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface SelectParameter {\r\n value: string | number;\r\n options: string[] | number[];\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface SliderConfig {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface SliderParameter {\r\n value: number;\r\n min: number;\r\n max: number;\r\n step: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface TextConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n maxLength?: number;\r\n }\r\n\n declare interface TextParameter {\r\n value: string;\r\n maxLength?: number;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface ToggleConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n declare interface ToggleParameter {\r\n value: boolean;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n declare interface TouchAPI {\r\n points: TouchPoint[];\r\n count: number;\r\n started: TouchPoint[];\r\n moved: TouchPoint[];\r\n ended: TouchPoint[];\r\n primary: TouchPoint | null;\r\n gestures: TouchGestureAPI;\r\n }\r\n\n declare interface TouchGestureAPI {\r\n isPinching: boolean;\r\n isRotating: boolean;\r\n isPanning: boolean;\r\n isTapping: boolean;\r\n pinchScale: number;\r\n pinchDelta: number;\r\n rotationAngle: number;\r\n rotationDelta: number;\r\n panDelta: {\r\n x: number;\r\n y: number;\r\n };\r\n tapCount: number;\r\n lastTapTime: number;\r\n tapPosition: {\r\n x: number;\r\n y: number;\r\n } | null;\r\n }\r\n\n declare interface TouchPoint {\r\n id: number;\r\n x: number;\r\n y: number;\r\n pressure: number;\r\n radius: number;\r\n radiusX: number;\r\n radiusY: number;\r\n rotationAngle: number;\r\n force: number;\r\n deltaX: number;\r\n deltaY: number;\r\n velocity: {\r\n x: number;\r\n y: number;\r\n };\r\n isNew: boolean;\r\n isActive: boolean;\r\n isEnding: boolean;\r\n }\r\n\n declare const VERSION = \"0.2.10\";\r\n\n declare interface VideoAPI {\r\n isConnected: boolean;\r\n currentFrame: OffscreenCanvas | null;\r\n frameWidth: number;\r\n frameHeight: number;\r\n frameRate: number;\r\n getFrameData: () => ImageData | null;\r\n faces: FaceData[];\r\n hands: HandData[];\r\n pose: PoseData | null;\r\n segmentation: SegmentationData | null;\r\n cv: {\r\n enableFaceDetection(enabled: boolean): Promise<void>;\r\n enableFaceMesh(enabled: boolean): Promise<void>;\r\n enableHandTracking(enabled: boolean): Promise<void>;\r\n enablePoseDetection(enabled: boolean): Promise<void>;\r\n enableBodySegmentation(enabled: boolean): Promise<void>;\r\n getActiveFeatures(): CVFeature[];\r\n isProcessing(): boolean;\r\n };\r\n }\r\n\n declare interface VijiAPI {\r\n canvas: OffscreenCanvas;\r\n ctx?: OffscreenCanvasRenderingContext2D;\r\n gl?: WebGL2RenderingContext;\r\n width: number;\r\n height: number;\r\n pixelRatio: number;\r\n time: number;\r\n deltaTime: number;\r\n frameCount: number;\r\n fps: number;\r\n audio: AudioAPI;\r\n video: VideoAPI;\r\n mouse: MouseAPI;\r\n keyboard: KeyboardAPI;\r\n touches: TouchAPI;\r\n slider: (defaultValue: number, config: SliderConfig) => SliderParameter;\r\n color: (defaultValue: string, config: ColorConfig) => ColorParameter;\r\n toggle: (defaultValue: boolean, config: ToggleConfig) => ToggleParameter;\r\n select: (defaultValue: string | number, config: SelectConfig) => SelectParameter;\r\n text: (defaultValue: string, config: TextConfig) => TextParameter;\r\n number: (defaultValue: number, config: NumberConfig) => NumberParameter;\r\n image: (defaultValue: null, config: ImageConfig) => ImageParameter;\r\n useContext(type: '2d'): OffscreenCanvasRenderingContext2D;\n useContext(type: 'webgl'): WebGLRenderingContext | WebGL2RenderingContext;\r\n }\r\n}\n\ndeclare const viji: VijiCore.VijiAPI;\ndeclare function render(viji: VijiCore.VijiAPI): void;\n";
|
package/dist/artist-global.d.ts
CHANGED
|
@@ -21,9 +21,7 @@ class P5WorkerAdapter {
|
|
|
21
21
|
*/
|
|
22
22
|
async init() {
|
|
23
23
|
try {
|
|
24
|
-
const p5Module = await import("
|
|
25
|
-
return n.p;
|
|
26
|
-
});
|
|
24
|
+
const p5Module = await import("https://esm.sh/p5@1.9.4");
|
|
27
25
|
this.p5Class = p5Module.default || p5Module;
|
|
28
26
|
const setupPromise = new Promise((resolve) => {
|
|
29
27
|
new this.p5Class((p) => {
|
|
@@ -342,4 +340,4 @@ class P5WorkerAdapter {
|
|
|
342
340
|
export {
|
|
343
341
|
P5WorkerAdapter
|
|
344
342
|
};
|
|
345
|
-
//# sourceMappingURL=P5WorkerAdapter-
|
|
343
|
+
//# sourceMappingURL=P5WorkerAdapter-B4koBeZd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"P5WorkerAdapter-B4koBeZd.js","sources":["../../src/worker/renderers/P5WorkerAdapter.ts"],"sourcesContent":["/**\n * P5.js Worker Adapter\n * \n * Integrates P5.js into Viji's worker-based rendering system.\n * Provides minimal DOM shimming and manages P5 instance lifecycle.\n */\n\n/**\n * Scene code structure for P5 mode\n */\ninterface P5SceneCode {\n setup?: ((viji: any, p5: any) => void) | null;\n render: (viji: any, p5: any) => void;\n}\n\nexport class P5WorkerAdapter {\n private p5Instance: any = null;\n private setupFn: ((viji: any, p5: any) => void) | null = null;\n private renderFn: ((viji: any, p5: any) => void) | null = null;\n private p5InternalSetupComplete = false;\n private artistSetupComplete = false;\n private p5Class: any = null;\n \n // Cache for converted P5.Image objects\n private imageParameterCache = new Map<string, { source: any, p5Image: any }>();\n \n // Track if P5.js's main canvas has been created\n private mainCanvasCreated = false;\n \n constructor(\n private offscreenCanvas: OffscreenCanvas,\n _vijiAPI: any,\n sceneCode: P5SceneCode\n ) {\n this.setupFn = sceneCode.setup || null;\n this.renderFn = sceneCode.render;\n \n // Install minimal DOM shims before loading P5\n this.installMinimalShims();\n \n // Note: P5 will be loaded dynamically when this adapter is created\n // We'll initialize it after P5 is imported\n }\n \n /**\n * Initialize P5 instance after P5.js library is loaded\n * This must be called after the P5 class is available\n */\n public async init(): Promise<void> {\n try {\n // Dynamically import P5.js from ESM-compatible CDN (lazy-loaded, not bundled)\n // esm.sh provides proper ES module versions of npm packages\n // @ts-expect-error - CDN URL import, types provided by @types/p5\n const p5Module = await import('https://esm.sh/p5@1.9.4');\n this.p5Class = p5Module.default || p5Module;\n \n // Create a promise that resolves when P5's setup completes\n const setupPromise = new Promise<void>((resolve) => {\n // Create P5 instance in instance mode\n new this.p5Class((p: any) => {\n // Capture the P5 instance from the callback parameter\n this.p5Instance = p;\n \n // P5 sketch setup\n p.setup = () => {\n // Initialize P5 renderer using our OffscreenCanvas via the shimmed document\n p.createCanvas(this.offscreenCanvas.width, this.offscreenCanvas.height);\n \n // Disable P5's automatic loop (Viji controls the render loop)\n p.noLoop();\n \n // Mark that P5's internal setup is complete\n this.p5InternalSetupComplete = true;\n \n // Resolve the promise\n resolve();\n };\n \n // Empty draw - we'll call the artist's render function manually\n p.draw = () => {};\n \n // IMPORTANT: In worker environment, P5 doesn't auto-call setup\n // We need to manually trigger it\n setTimeout(() => {\n if (p.setup && typeof p.setup === 'function') {\n try {\n p.setup();\n } catch (setupError) {\n console.error('P5 setup failed:', setupError);\n resolve(); // Resolve anyway to prevent hanging\n }\n }\n }, 0);\n });\n });\n \n // Wait for P5's setup to actually complete\n await setupPromise;\n } catch (error) {\n console.error('Failed to initialize P5.js:', error);\n throw error;\n }\n }\n \n /**\n * Install minimal DOM shims that P5.js needs for rendering\n */\n private installMinimalShims(): void {\n const self = globalThis as any;\n \n // Only install if not already present\n if (typeof self.document === 'undefined') {\n // Create flexible style proxy that accepts any property\n const createStyleProxy = () => new Proxy({}, {\n get: () => '',\n set: () => true\n });\n\n // Create body element first so canvas can reference it\n const bodyElement: any = {\n style: createStyleProxy(),\n appendChild: () => {},\n removeChild: () => {},\n children: [],\n childNodes: [],\n firstChild: null,\n lastChild: null,\n parentNode: null,\n ownerDocument: undefined, // Will be set after document is created\n setAttribute: () => {},\n getAttribute: () => null,\n addEventListener: () => {},\n removeEventListener: () => {},\n tagName: 'BODY'\n };\n\n // Minimal document shim\n self.document = {\n createElement: (tag: string) => {\n if (tag === 'canvas') {\n // For the FIRST canvas (P5.js's main canvas), return our provided OffscreenCanvas\n // For subsequent canvases (e.g., tint operations), create new ones\n let canvas: OffscreenCanvas;\n if (!this.mainCanvasCreated) {\n canvas = this.offscreenCanvas;\n this.mainCanvasCreated = true;\n } else {\n canvas = new OffscreenCanvas(300, 300); // Default size, P5.js will resize as needed\n }\n \n // Add DOM-like properties that P5.js may check for\n // @ts-ignore - Adding properties to OffscreenCanvas\n canvas.style = createStyleProxy();\n // @ts-ignore\n canvas.dataset = new Proxy({}, {\n get: () => undefined,\n set: () => true\n });\n // @ts-ignore\n canvas.classList = {\n add: () => {},\n remove: () => {},\n contains: () => false,\n toggle: () => false\n };\n // @ts-ignore\n canvas.getBoundingClientRect = () => ({ \n left: 0, \n top: 0, \n width: canvas.width, \n height: canvas.height \n });\n // Return the actual OffscreenCanvas (now with extra properties)\n // This allows it to be used directly with drawImage()\n return canvas;\n }\n // Return stub for other elements\n return {\n style: createStyleProxy(),\n appendChild: () => {},\n removeChild: () => {},\n setAttribute: () => {},\n getAttribute: () => null,\n tagName: tag.toUpperCase(),\n addEventListener: () => {},\n removeEventListener: () => {}\n };\n },\n createElementNS: (_ns: string, tag: string) => {\n return self.document.createElement(tag);\n },\n body: bodyElement,\n documentElement: {\n style: createStyleProxy(),\n children: [],\n childNodes: []\n },\n getElementById: () => null,\n querySelector: () => null,\n querySelectorAll: () => [],\n getElementsByTagName: (tagName: string) => {\n // P5.js looks for 'main' elements to append canvas\n if (tagName.toLowerCase() === 'main') {\n return [bodyElement]; // Return body as main container\n }\n return [];\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n hasFocus: () => true // P5.js checks this for accessibility features\n };\n \n // Set bodyElement.ownerDocument now that document exists\n bodyElement.ownerDocument = self.document;\n }\n \n if (typeof self.window === 'undefined') {\n // Minimal window shim\n self.window = {\n devicePixelRatio: 1,\n innerWidth: this.offscreenCanvas.width,\n innerHeight: this.offscreenCanvas.height,\n addEventListener: () => {},\n removeEventListener: () => {},\n requestAnimationFrame: (_callback: Function) => {\n // We control the loop, so this should not be called\n return 0;\n },\n cancelAnimationFrame: () => {},\n setTimeout: self.setTimeout.bind(self),\n clearTimeout: self.clearTimeout.bind(self),\n setInterval: self.setInterval.bind(self),\n clearInterval: self.clearInterval.bind(self),\n performance: self.performance,\n console: self.console,\n Math: self.Math,\n Date: self.Date,\n Array: self.Array,\n Object: self.Object\n };\n }\n \n if (typeof self.navigator === 'undefined') {\n // Minimal navigator shim\n self.navigator = {\n userAgent: 'Viji-Worker-P5',\n platform: 'Worker',\n language: 'en-US'\n };\n }\n \n if (typeof self.screen === 'undefined') {\n // Minimal screen shim for P5.js display metrics\n self.screen = {\n width: this.offscreenCanvas.width,\n height: this.offscreenCanvas.height,\n availWidth: this.offscreenCanvas.width,\n availHeight: this.offscreenCanvas.height,\n colorDepth: 24,\n pixelDepth: 24\n };\n }\n \n if (typeof self.HTMLCanvasElement === 'undefined') {\n // P5.js checks instanceof HTMLCanvasElement\n // Create a minimal constructor that OffscreenCanvas \"instanceof\" will pass\n self.HTMLCanvasElement = function() {} as any;\n // Make OffscreenCanvas instances appear to be HTMLCanvasElement instances\n Object.setPrototypeOf(OffscreenCanvas.prototype, self.HTMLCanvasElement.prototype);\n }\n }\n \n /**\n * Convert ImageBitmap to a P5.js-compatible image object (with caching)\n * Returns an object that mimics P5.Image structure for P5.js's image() function\n */\n private getOrCreateP5Image(cacheKey: string, source: any): any {\n if (!this.p5Instance) return null;\n \n // Check cache first\n const cached = this.imageParameterCache.get(cacheKey);\n if (cached && cached.source === source) {\n return cached.p5Image;\n }\n \n try {\n // Create an OffscreenCanvas and draw the ImageBitmap to it\n const offscreenCanvas = new OffscreenCanvas(source.width, source.height);\n const ctx = offscreenCanvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2d context from OffscreenCanvas');\n }\n ctx.drawImage(source, 0, 0);\n \n // Wrap the OffscreenCanvas in a P5.Image-like object\n // P5.js expects: img.canvas or img.elt (the actual canvas), and img.width/img.height (logical dimensions)\n const p5ImageWrapper = {\n canvas: offscreenCanvas, // P5.js looks for img.canvas || img.elt\n elt: offscreenCanvas, // Fallback for compatibility\n width: source.width, // Logical width\n height: source.height // Logical height\n };\n \n // Cache the conversion\n this.imageParameterCache.set(cacheKey, { source, p5Image: p5ImageWrapper });\n \n return p5ImageWrapper;\n } catch (error) {\n console.warn('Failed to convert image to P5-compatible object:', error);\n return null;\n }\n }\n \n /**\n * Add .p5 property to image parameters for P5.js-specific rendering\n * This allows artists to use p5.image() while keeping .value for native canvas API\n * @param parameterObjects Map of parameter name to parameter object from ParameterSystem\n */\n private addP5PropertyToImageParameters(parameterObjects: Map<string, any>): void {\n if (!this.p5Instance) return;\n \n // Function to check if a value is an image-like object\n const isImageLike = (value: any): boolean => {\n return value instanceof ImageBitmap || \n value instanceof OffscreenCanvas ||\n (value && typeof value === 'object' && 'width' in value && 'height' in value);\n };\n \n // Iterate through parameter objects provided by ParameterSystem\n for (const [name, param] of parameterObjects) {\n try {\n // Check if this parameter has an image value\n if (param && typeof param === 'object' && 'value' in param) {\n const value = param.value;\n \n // If the value is an image-like object and doesn't have .p5 yet\n if (value && isImageLike(value) && !('p5' in param)) {\n // Add lazy .p5 getter that converts on-demand\n Object.defineProperty(param, 'p5', {\n get: () => this.getOrCreateP5Image(name, param.value),\n enumerable: true,\n configurable: true\n });\n }\n }\n } catch (error) {\n console.warn(`Failed to add .p5 property to parameter '${name}':`, error);\n continue;\n }\n }\n }\n \n /**\n * Execute one frame of the P5 scene\n * Called by Viji's render loop\n * @param vijiAPI The Viji API object passed to artist code\n * @param parameterObjects Map of parameter objects from ParameterSystem\n */\n public tick(vijiAPI: any, parameterObjects: Map<string, any>): void {\n if (!this.p5Instance || !this.p5InternalSetupComplete) {\n // P5 not ready yet, skip this frame\n return;\n }\n \n try {\n // Add .p5 property to image parameters (lazy, cached conversion)\n this.addP5PropertyToImageParameters(parameterObjects);\n \n // Run artist's setup once\n if (!this.artistSetupComplete && this.setupFn) {\n this.setupFn(vijiAPI, this.p5Instance);\n this.artistSetupComplete = true;\n }\n \n // Update P5's internal frame count\n if (this.p5Instance._setProperty) {\n this.p5Instance._setProperty('frameCount', this.p5Instance.frameCount + 1);\n }\n \n // Call artist's render function with both Viji and P5 APIs\n if (this.renderFn) {\n this.renderFn(vijiAPI, this.p5Instance);\n }\n } catch (error) {\n console.error('P5 render error:', error);\n throw error;\n }\n }\n \n /**\n * Handle canvas resize\n */\n public resize(width: number, height: number): void {\n if (!this.p5Instance) return;\n \n // Update P5's internal dimensions\n this.p5Instance._setProperty('width', width);\n this.p5Instance._setProperty('height', height);\n this.p5Instance._setProperty('_width', width);\n this.p5Instance._setProperty('_height', height);\n \n // Update renderer dimensions if available\n if (this.p5Instance._renderer) {\n this.p5Instance._renderer.width = width;\n this.p5Instance._renderer.height = height;\n }\n \n // Call P5's resizeCanvas if available\n if (typeof this.p5Instance.resizeCanvas === 'function') {\n try {\n this.p5Instance.resizeCanvas(width, height, true);\n } catch (error) {\n // Ignore resize errors, they're often not critical\n console.warn('P5 resize warning:', error);\n }\n }\n }\n \n /**\n * Cleanup P5 instance\n */\n public destroy(): void {\n if (this.p5Instance) {\n try {\n if (typeof this.p5Instance.remove === 'function') {\n this.p5Instance.remove();\n }\n } catch (error) {\n console.warn('P5 cleanup warning:', error);\n }\n this.p5Instance = null;\n }\n \n this.setupFn = null;\n this.renderFn = null;\n this.p5InternalSetupComplete = false;\n this.artistSetupComplete = false;\n }\n}\n\n"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
|
@@ -1690,7 +1690,7 @@ class VijiWorkerRuntime {
|
|
|
1690
1690
|
try {
|
|
1691
1691
|
this.rendererType = "p5";
|
|
1692
1692
|
this.debugLog("🎨 Initializing P5.js mode...");
|
|
1693
|
-
const { P5WorkerAdapter } = await import("./P5WorkerAdapter-
|
|
1693
|
+
const { P5WorkerAdapter } = await import("./renderers/P5WorkerAdapter-B4koBeZd.js");
|
|
1694
1694
|
this.p5Adapter = new P5WorkerAdapter(
|
|
1695
1695
|
this.canvas,
|
|
1696
1696
|
this.viji,
|
|
@@ -1719,7 +1719,7 @@ class VijiWorkerRuntime {
|
|
|
1719
1719
|
try {
|
|
1720
1720
|
this.rendererType = "shader";
|
|
1721
1721
|
this.debugLog("🎨 Initializing Shader mode...");
|
|
1722
|
-
const { ShaderWorkerAdapter } = await import("./ShaderWorkerAdapter-Cn60jh9g.js");
|
|
1722
|
+
const { ShaderWorkerAdapter } = await import("./renderers/ShaderWorkerAdapter-Cn60jh9g.js");
|
|
1723
1723
|
this.shaderAdapter = new ShaderWorkerAdapter(
|
|
1724
1724
|
this.canvas,
|
|
1725
1725
|
this.viji,
|
|
@@ -2232,4 +2232,4 @@ async function setSceneCode(sceneCode) {
|
|
|
2232
2232
|
}
|
|
2233
2233
|
}
|
|
2234
2234
|
self.setSceneCode = setSceneCode;
|
|
2235
|
-
//# sourceMappingURL=viji.worker-
|
|
2235
|
+
//# sourceMappingURL=viji.worker-kGDstU5X.js.map
|