@viji-dev/core 0.3.37 → 0.3.38
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-p5.js +1 -1
- package/dist/artist-dts.js +1 -1
- package/dist/artist-global-p5.d.ts +24 -1
- package/dist/artist-global.d.ts +24 -1
- package/dist/artist-jsdoc.d.ts +22 -0
- package/dist/assets/{viji.worker-DR0jmwBv.js → viji.worker-BoI8e3NI.js} +68 -2
- package/dist/assets/viji.worker-BoI8e3NI.js.map +1 -0
- package/dist/docs-api.js +95 -17
- package/dist/{essentia-wasm.web-Ck3Tig5D.js → essentia-wasm.web-CdUmKTbm.js} +2 -2
- package/dist/{essentia-wasm.web-Ck3Tig5D.js.map → essentia-wasm.web-CdUmKTbm.js.map} +1 -1
- package/dist/{index-BmeV_yOg.js → index-DZzYWg7c.js} +29 -9
- package/dist/index-DZzYWg7c.js.map +1 -0
- package/dist/index.d.ts +36 -9
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/assets/viji.worker-DR0jmwBv.js.map +0 -1
- package/dist/index-BmeV_yOg.js.map +0 -1
package/dist/artist-dts.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const artistDts = "// Viji Artist API - Global Type Definitions\n// All types are placed inside declare global {} because this file uses export {}\n// for top-level await support, which makes it a module (where top-level declarations\n// would otherwise be module-scoped, not global).\n\ndeclare global {\n interface AudioAPI {\r\n isConnected: boolean;\r\n volume: {\r\n current: number;\r\n peak: number;\r\n smoothed: number;\r\n };\r\n bands: {\r\n low: number;\r\n lowMid: number;\r\n mid: number;\r\n highMid: number;\r\n high: number;\r\n lowSmoothed: number;\r\n lowMidSmoothed: number;\r\n midSmoothed: number;\r\n highMidSmoothed: number;\r\n highSmoothed: number;\r\n };\r\n beat: {\r\n kick: number;\r\n snare: number;\r\n hat: number;\r\n any: number;\r\n kickSmoothed: number;\r\n snareSmoothed: number;\r\n hatSmoothed: number;\r\n anySmoothed: number;\r\n triggers: {\r\n any: boolean;\r\n kick: boolean;\r\n snare: boolean;\r\n hat: boolean;\r\n };\r\n events: Array<{\r\n type: 'kick' | 'snare' | 'hat';\r\n time: number;\r\n strength: number;\r\n }>;\r\n bpm: number;\r\n confidence: number;\r\n isLocked: boolean;\r\n };\r\n spectral: {\r\n brightness: number;\r\n flatness: number;\r\n };\r\n getFrequencyData: () => Uint8Array;\r\n getWaveform: () => Float32Array;\r\n }\r\n\n interface AudioStreamAPI {\r\n isConnected: boolean;\r\n volume: {\r\n current: number;\r\n peak: number;\r\n smoothed: number;\r\n };\r\n bands: {\r\n low: number;\r\n lowMid: number;\r\n mid: number;\r\n highMid: number;\r\n high: number;\r\n lowSmoothed: number;\r\n lowMidSmoothed: number;\r\n midSmoothed: number;\r\n highMidSmoothed: number;\r\n highSmoothed: number;\r\n };\r\n spectral: {\r\n brightness: number;\r\n flatness: number;\r\n };\r\n getFrequencyData: () => Uint8Array;\r\n getWaveform: () => Float32Array;\r\n }\r\n\n interface ButtonConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n interface ButtonParameter {\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 interface CaptureFrameOptions {\r\n /** Output format: 'blob' for encoded image, 'bitmap' for GPU-friendly ImageBitmap */\r\n format?: 'blob' | 'bitmap';\r\n /** MIME type for blob output (ignored for bitmap), 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 interface ColorConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n 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 type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation' | 'emotionDetection';\r\n\n type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';\r\n\n interface DeviceMotionData {\r\n /** Acceleration without gravity (m/s²) */\r\n acceleration: {\r\n x: number | null;\r\n y: number | null;\r\n z: number | null;\r\n } | null;\r\n /** Acceleration including gravity (m/s²) */\r\n accelerationIncludingGravity: {\r\n x: number | null;\r\n y: number | null;\r\n z: number | null;\r\n } | null;\r\n /** Rotation rate (degrees/second) */\r\n rotationRate: {\r\n alpha: number | null;\r\n beta: number | null;\r\n gamma: number | null;\r\n } | null;\r\n /** Interval between updates (milliseconds) */\r\n interval: number;\r\n }\r\n\n interface DeviceOrientationData {\r\n /** Rotation around Z-axis (0-360 degrees, compass heading) */\r\n alpha: number | null;\r\n /** Rotation around X-axis (-180 to 180 degrees, front-to-back tilt) */\r\n beta: number | null;\r\n /** Rotation around Y-axis (-90 to 90 degrees, left-to-right tilt) */\r\n gamma: number | null;\r\n /** True if using magnetometer (compass) for absolute orientation */\r\n absolute: boolean;\r\n }\r\n\n interface DeviceSensorState {\r\n motion: DeviceMotionData | null;\r\n orientation: DeviceOrientationData | null;\r\n }\r\n\n interface DeviceState extends DeviceSensorState {\r\n /** Unique device identifier */\r\n id: string;\r\n /** User-friendly device name */\r\n name: string;\r\n /** Device camera video (null if not available) */\r\n video: VideoAPI | null;\r\n /** Device audio stream (null if not available) */\r\n audio: AudioStreamAPI | null;\r\n }\r\n\n interface FaceBlendshapes {\r\n browDownLeft: number;\r\n browDownRight: number;\r\n browInnerUp: number;\r\n browOuterUpLeft: number;\r\n browOuterUpRight: number;\r\n cheekPuff: number;\r\n cheekSquintLeft: number;\r\n cheekSquintRight: number;\r\n eyeBlinkLeft: number;\r\n eyeBlinkRight: number;\r\n eyeLookDownLeft: number;\r\n eyeLookDownRight: number;\r\n eyeLookInLeft: number;\r\n eyeLookInRight: number;\r\n eyeLookOutLeft: number;\r\n eyeLookOutRight: number;\r\n eyeLookUpLeft: number;\r\n eyeLookUpRight: number;\r\n eyeSquintLeft: number;\r\n eyeSquintRight: number;\r\n eyeWideLeft: number;\r\n eyeWideRight: number;\r\n jawForward: number;\r\n jawLeft: number;\r\n jawOpen: number;\r\n jawRight: number;\r\n mouthClose: number;\r\n mouthDimpleLeft: number;\r\n mouthDimpleRight: number;\r\n mouthFrownLeft: number;\r\n mouthFrownRight: number;\r\n mouthFunnel: number;\r\n mouthLeft: number;\r\n mouthLowerDownLeft: number;\r\n mouthLowerDownRight: number;\r\n mouthPressLeft: number;\r\n mouthPressRight: number;\r\n mouthPucker: number;\r\n mouthRight: number;\r\n mouthRollLower: number;\r\n mouthRollUpper: number;\r\n mouthShrugLower: number;\r\n mouthShrugUpper: number;\r\n mouthSmileLeft: number;\r\n mouthSmileRight: number;\r\n mouthStretchLeft: number;\r\n mouthStretchRight: number;\r\n mouthUpperUpLeft: number;\r\n mouthUpperUpRight: number;\r\n noseSneerLeft: number;\r\n noseSneerRight: number;\r\n tongueOut: number;\r\n }\r\n\n 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 center: {\r\n x: number;\r\n y: 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 blendshapes: FaceBlendshapes;\r\n }\r\n\n type FrameRateMode = 'full' | 'half';\r\n\n interface FrequencyBand {\r\n name: string;\r\n min: number;\r\n max: number;\r\n }\r\n\n 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 gestures: {\r\n fist: number;\r\n openPalm: number;\r\n peace: number;\r\n thumbsUp: number;\r\n thumbsDown: number;\r\n pointing: number;\r\n iLoveYou: number;\r\n };\r\n }\r\n\n interface ImageConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n interface ImageParameter {\r\n value: ImageBitmap | null;\r\n /** P5-compatible image wrapper. Only available in the P5 renderer — added at runtime by the P5 adapter. */\r\n readonly p5?: any;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n 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 textureData: Uint8Array;\r\n }\r\n\n 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 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 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 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 type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';\r\n\n interface PointerAPI {\r\n x: number;\r\n y: number;\r\n deltaX: number;\r\n deltaY: number;\r\n isDown: boolean;\r\n wasPressed: boolean;\r\n wasReleased: boolean;\r\n isInCanvas: boolean;\r\n type: 'mouse' | 'touch' | 'none';\r\n }\r\n\n 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 type Resolution = {\r\n width: number;\r\n height: number;\r\n };\r\n\n interface SegmentationData {\r\n mask: Uint8Array;\r\n width: number;\r\n height: number;\r\n }\r\n\n 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 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 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 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 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 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 interface ToggleConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n 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 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 }\r\n\n 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 isInCanvas: boolean;\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 const VERSION = \"0.3.36\";\r\n\n interface VideoAPI {\r\n isConnected: boolean;\r\n currentFrame: OffscreenCanvas | ImageBitmap | 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 enableEmotionDetection(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 interface VijiAPI {\r\n canvas: OffscreenCanvas;\r\n ctx?: OffscreenCanvasRenderingContext2D;\r\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\r\n width: number;\r\n height: 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 videoStreams: VideoAPI[];\r\n audioStreams: AudioStreamAPI[];\r\n mouse: MouseAPI;\r\n keyboard: KeyboardAPI;\r\n touches: TouchAPI;\r\n pointer: PointerAPI;\r\n device: DeviceSensorState;\r\n devices: DeviceState[];\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 button: (config: ButtonConfig) => ButtonParameter;\r\n useContext(type: '2d'): OffscreenCanvasRenderingContext2D;\r\n useContext(type: 'webgl'): WebGLRenderingContext;\r\n useContext(type: 'webgl2'): WebGL2RenderingContext;\r\n }\r\n\n // Runtime global - the main viji object\n const viji: VijiAPI;\n \n // Function type aliases (artists define their own render/setup functions)\n type Render = (viji: VijiAPI) => void;\n type Setup = (viji: VijiAPI) => void;\n}\n\n// Module marker (enables top-level await in artist code)\nexport {};\n";
|
|
1
|
+
export const artistDts = "// Viji Artist API - Global Type Definitions\n// All types are placed inside declare global {} because this file uses export {}\n// for top-level await support, which makes it a module (where top-level declarations\n// would otherwise be module-scoped, not global).\n\ndeclare global {\n interface AudioAPI {\r\n isConnected: boolean;\r\n volume: {\r\n current: number;\r\n peak: number;\r\n smoothed: number;\r\n };\r\n bands: {\r\n low: number;\r\n lowMid: number;\r\n mid: number;\r\n highMid: number;\r\n high: number;\r\n lowSmoothed: number;\r\n lowMidSmoothed: number;\r\n midSmoothed: number;\r\n highMidSmoothed: number;\r\n highSmoothed: number;\r\n };\r\n beat: {\r\n kick: number;\r\n snare: number;\r\n hat: number;\r\n any: number;\r\n kickSmoothed: number;\r\n snareSmoothed: number;\r\n hatSmoothed: number;\r\n anySmoothed: number;\r\n triggers: {\r\n any: boolean;\r\n kick: boolean;\r\n snare: boolean;\r\n hat: boolean;\r\n };\r\n events: Array<{\r\n type: 'kick' | 'snare' | 'hat';\r\n time: number;\r\n strength: number;\r\n }>;\r\n bpm: number;\r\n confidence: number;\r\n isLocked: boolean;\r\n };\r\n spectral: {\r\n brightness: number;\r\n flatness: number;\r\n };\r\n getFrequencyData: () => Uint8Array;\r\n getWaveform: () => Float32Array;\r\n }\r\n\n interface AudioStreamAPI {\r\n isConnected: boolean;\r\n volume: {\r\n current: number;\r\n peak: number;\r\n smoothed: number;\r\n };\r\n bands: {\r\n low: number;\r\n lowMid: number;\r\n mid: number;\r\n highMid: number;\r\n high: number;\r\n lowSmoothed: number;\r\n lowMidSmoothed: number;\r\n midSmoothed: number;\r\n highMidSmoothed: number;\r\n highSmoothed: number;\r\n };\r\n spectral: {\r\n brightness: number;\r\n flatness: number;\r\n };\r\n getFrequencyData: () => Uint8Array;\r\n getWaveform: () => Float32Array;\r\n }\r\n\n interface ButtonConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n interface ButtonParameter {\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 interface CaptureFrameOptions {\r\n /** Output format: 'blob' for encoded image, 'bitmap' for GPU-friendly ImageBitmap */\r\n format?: 'blob' | 'bitmap';\r\n /** MIME type for blob output (ignored for bitmap), 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 interface ColorConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n 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 interface CoordinateConfig {\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 interface CoordinateParameter {\r\n value: CoordinateValue;\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 type CoordinateValue = {\r\n x: number;\r\n y: number;\r\n };\r\n\n type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation' | 'emotionDetection';\r\n\n type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';\r\n\n interface DeviceMotionData {\r\n /** Acceleration without gravity (m/s²) */\r\n acceleration: {\r\n x: number | null;\r\n y: number | null;\r\n z: number | null;\r\n } | null;\r\n /** Acceleration including gravity (m/s²) */\r\n accelerationIncludingGravity: {\r\n x: number | null;\r\n y: number | null;\r\n z: number | null;\r\n } | null;\r\n /** Rotation rate (degrees/second) */\r\n rotationRate: {\r\n alpha: number | null;\r\n beta: number | null;\r\n gamma: number | null;\r\n } | null;\r\n /** Interval between updates (milliseconds) */\r\n interval: number;\r\n }\r\n\n interface DeviceOrientationData {\r\n /** Rotation around Z-axis (0-360 degrees, compass heading) */\r\n alpha: number | null;\r\n /** Rotation around X-axis (-180 to 180 degrees, front-to-back tilt) */\r\n beta: number | null;\r\n /** Rotation around Y-axis (-90 to 90 degrees, left-to-right tilt) */\r\n gamma: number | null;\r\n /** True if using magnetometer (compass) for absolute orientation */\r\n absolute: boolean;\r\n }\r\n\n interface DeviceSensorState {\r\n motion: DeviceMotionData | null;\r\n orientation: DeviceOrientationData | null;\r\n }\r\n\n interface DeviceState extends DeviceSensorState {\r\n /** Unique device identifier */\r\n id: string;\r\n /** User-friendly device name */\r\n name: string;\r\n /** Device camera video (null if not available) */\r\n video: VideoAPI | null;\r\n /** Device audio stream (null if not available) */\r\n audio: AudioStreamAPI | null;\r\n }\r\n\n interface FaceBlendshapes {\r\n browDownLeft: number;\r\n browDownRight: number;\r\n browInnerUp: number;\r\n browOuterUpLeft: number;\r\n browOuterUpRight: number;\r\n cheekPuff: number;\r\n cheekSquintLeft: number;\r\n cheekSquintRight: number;\r\n eyeBlinkLeft: number;\r\n eyeBlinkRight: number;\r\n eyeLookDownLeft: number;\r\n eyeLookDownRight: number;\r\n eyeLookInLeft: number;\r\n eyeLookInRight: number;\r\n eyeLookOutLeft: number;\r\n eyeLookOutRight: number;\r\n eyeLookUpLeft: number;\r\n eyeLookUpRight: number;\r\n eyeSquintLeft: number;\r\n eyeSquintRight: number;\r\n eyeWideLeft: number;\r\n eyeWideRight: number;\r\n jawForward: number;\r\n jawLeft: number;\r\n jawOpen: number;\r\n jawRight: number;\r\n mouthClose: number;\r\n mouthDimpleLeft: number;\r\n mouthDimpleRight: number;\r\n mouthFrownLeft: number;\r\n mouthFrownRight: number;\r\n mouthFunnel: number;\r\n mouthLeft: number;\r\n mouthLowerDownLeft: number;\r\n mouthLowerDownRight: number;\r\n mouthPressLeft: number;\r\n mouthPressRight: number;\r\n mouthPucker: number;\r\n mouthRight: number;\r\n mouthRollLower: number;\r\n mouthRollUpper: number;\r\n mouthShrugLower: number;\r\n mouthShrugUpper: number;\r\n mouthSmileLeft: number;\r\n mouthSmileRight: number;\r\n mouthStretchLeft: number;\r\n mouthStretchRight: number;\r\n mouthUpperUpLeft: number;\r\n mouthUpperUpRight: number;\r\n noseSneerLeft: number;\r\n noseSneerRight: number;\r\n tongueOut: number;\r\n }\r\n\n 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 center: {\r\n x: number;\r\n y: 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 blendshapes: FaceBlendshapes;\r\n }\r\n\n type FrameRateMode = 'full' | 'half';\r\n\n interface FrequencyBand {\r\n name: string;\r\n min: number;\r\n max: number;\r\n }\r\n\n 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 gestures: {\r\n fist: number;\r\n openPalm: number;\r\n peace: number;\r\n thumbsUp: number;\r\n thumbsDown: number;\r\n pointing: number;\r\n iLoveYou: number;\r\n };\r\n }\r\n\n interface ImageConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n interface ImageParameter {\r\n value: ImageBitmap | null;\r\n /** P5-compatible image wrapper. Only available in the P5 renderer — added at runtime by the P5 adapter. */\r\n readonly p5?: any;\r\n label: string;\r\n description?: string;\r\n group: string;\r\n category: ParameterCategory;\r\n }\r\n\n 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 textureData: Uint8Array;\r\n }\r\n\n 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 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 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 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 type ParameterCategory = 'audio' | 'video' | 'interaction' | 'general';\r\n\n interface PointerAPI {\r\n x: number;\r\n y: number;\r\n deltaX: number;\r\n deltaY: number;\r\n isDown: boolean;\r\n wasPressed: boolean;\r\n wasReleased: boolean;\r\n isInCanvas: boolean;\r\n type: 'mouse' | 'touch' | 'none';\r\n }\r\n\n 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 type Resolution = {\r\n width: number;\r\n height: number;\r\n };\r\n\n interface SegmentationData {\r\n mask: Uint8Array;\r\n width: number;\r\n height: number;\r\n }\r\n\n 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 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 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 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 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 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 interface ToggleConfig {\r\n label: string;\r\n description?: string;\r\n group?: string;\r\n category?: ParameterCategory;\r\n }\r\n\n 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 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 }\r\n\n 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 isInCanvas: boolean;\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 const VERSION = \"0.3.37\";\r\n\n interface VideoAPI {\r\n isConnected: boolean;\r\n currentFrame: OffscreenCanvas | ImageBitmap | 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 enableEmotionDetection(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 interface VijiAPI {\r\n canvas: OffscreenCanvas;\r\n ctx?: OffscreenCanvasRenderingContext2D;\r\n gl?: WebGLRenderingContext | WebGL2RenderingContext;\r\n width: number;\r\n height: 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 videoStreams: VideoAPI[];\r\n audioStreams: AudioStreamAPI[];\r\n mouse: MouseAPI;\r\n keyboard: KeyboardAPI;\r\n touches: TouchAPI;\r\n pointer: PointerAPI;\r\n device: DeviceSensorState;\r\n devices: DeviceState[];\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 button: (config: ButtonConfig) => ButtonParameter;\r\n coordinate: (defaultValue: CoordinateValue, config: CoordinateConfig) => CoordinateParameter;\r\n useContext(type: '2d'): OffscreenCanvasRenderingContext2D;\r\n useContext(type: 'webgl'): WebGLRenderingContext;\r\n useContext(type: 'webgl2'): WebGL2RenderingContext;\r\n }\r\n\n // Runtime global - the main viji object\n const viji: VijiAPI;\n \n // Function type aliases (artists define their own render/setup functions)\n type Render = (viji: VijiAPI) => void;\n type Setup = (viji: VijiAPI) => void;\n}\n\n// Module marker (enables top-level await in artist code)\nexport {};\n";
|
|
@@ -129,6 +129,28 @@ declare global {
|
|
|
129
129
|
category: ParameterCategory;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
interface CoordinateConfig {
|
|
133
|
+
step?: number;
|
|
134
|
+
label: string;
|
|
135
|
+
description?: string;
|
|
136
|
+
group?: string;
|
|
137
|
+
category?: ParameterCategory;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
interface CoordinateParameter {
|
|
141
|
+
value: CoordinateValue;
|
|
142
|
+
step: number;
|
|
143
|
+
label: string;
|
|
144
|
+
description?: string;
|
|
145
|
+
group: string;
|
|
146
|
+
category: ParameterCategory;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
type CoordinateValue = {
|
|
150
|
+
x: number;
|
|
151
|
+
y: number;
|
|
152
|
+
};
|
|
153
|
+
|
|
132
154
|
type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation' | 'emotionDetection';
|
|
133
155
|
|
|
134
156
|
type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';
|
|
@@ -555,7 +577,7 @@ declare global {
|
|
|
555
577
|
isEnding: boolean;
|
|
556
578
|
}
|
|
557
579
|
|
|
558
|
-
const VERSION = "0.3.
|
|
580
|
+
const VERSION = "0.3.37";
|
|
559
581
|
|
|
560
582
|
interface VideoAPI {
|
|
561
583
|
isConnected: boolean;
|
|
@@ -608,6 +630,7 @@ declare global {
|
|
|
608
630
|
number: (defaultValue: number, config: NumberConfig) => NumberParameter;
|
|
609
631
|
image: (defaultValue: null, config: ImageConfig) => ImageParameter;
|
|
610
632
|
button: (config: ButtonConfig) => ButtonParameter;
|
|
633
|
+
coordinate: (defaultValue: CoordinateValue, config: CoordinateConfig) => CoordinateParameter;
|
|
611
634
|
useContext(type: '2d'): OffscreenCanvasRenderingContext2D;
|
|
612
635
|
useContext(type: 'webgl'): WebGLRenderingContext;
|
|
613
636
|
useContext(type: 'webgl2'): WebGL2RenderingContext;
|
package/dist/artist-global.d.ts
CHANGED
|
@@ -129,6 +129,28 @@ declare global {
|
|
|
129
129
|
category: ParameterCategory;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
interface CoordinateConfig {
|
|
133
|
+
step?: number;
|
|
134
|
+
label: string;
|
|
135
|
+
description?: string;
|
|
136
|
+
group?: string;
|
|
137
|
+
category?: ParameterCategory;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
interface CoordinateParameter {
|
|
141
|
+
value: CoordinateValue;
|
|
142
|
+
step: number;
|
|
143
|
+
label: string;
|
|
144
|
+
description?: string;
|
|
145
|
+
group: string;
|
|
146
|
+
category: ParameterCategory;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
type CoordinateValue = {
|
|
150
|
+
x: number;
|
|
151
|
+
y: number;
|
|
152
|
+
};
|
|
153
|
+
|
|
132
154
|
type CVFeature = 'faceDetection' | 'faceMesh' | 'handTracking' | 'poseDetection' | 'bodySegmentation' | 'emotionDetection';
|
|
133
155
|
|
|
134
156
|
type CVFrameRateMode = 'full' | 'half' | 'quarter' | 'eighth';
|
|
@@ -544,7 +566,7 @@ declare global {
|
|
|
544
566
|
isEnding: boolean;
|
|
545
567
|
}
|
|
546
568
|
|
|
547
|
-
const VERSION = "0.3.
|
|
569
|
+
const VERSION = "0.3.37";
|
|
548
570
|
|
|
549
571
|
interface VideoAPI {
|
|
550
572
|
isConnected: boolean;
|
|
@@ -597,6 +619,7 @@ declare global {
|
|
|
597
619
|
number: (defaultValue: number, config: NumberConfig) => NumberParameter;
|
|
598
620
|
image: (defaultValue: null, config: ImageConfig) => ImageParameter;
|
|
599
621
|
button: (config: ButtonConfig) => ButtonParameter;
|
|
622
|
+
coordinate: (defaultValue: CoordinateValue, config: CoordinateConfig) => CoordinateParameter;
|
|
600
623
|
useContext(type: '2d'): OffscreenCanvasRenderingContext2D;
|
|
601
624
|
useContext(type: 'webgl'): WebGLRenderingContext;
|
|
602
625
|
useContext(type: 'webgl2'): WebGL2RenderingContext;
|
package/dist/artist-jsdoc.d.ts
CHANGED
|
@@ -83,6 +83,16 @@
|
|
|
83
83
|
* @property {ParameterCategory} [category] - category property
|
|
84
84
|
*/
|
|
85
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Configuration for coordinate parameters
|
|
88
|
+
* @typedef {Object} CoordinateConfig
|
|
89
|
+
* @property {number} [step] - step property
|
|
90
|
+
* @property {string} label - label property
|
|
91
|
+
* @property {string} [description] - description property
|
|
92
|
+
* @property {string} [group] - group property
|
|
93
|
+
* @property {ParameterCategory} [category] - category property
|
|
94
|
+
*/
|
|
95
|
+
|
|
86
96
|
/**
|
|
87
97
|
* Parameter object for slider parameters
|
|
88
98
|
* @typedef {Object} SliderParameter
|
|
@@ -171,6 +181,17 @@
|
|
|
171
181
|
* @property {ParameterCategory} category - category property
|
|
172
182
|
*/
|
|
173
183
|
|
|
184
|
+
/**
|
|
185
|
+
* Parameter object for coordinate parameters
|
|
186
|
+
* @typedef {Object} CoordinateParameter
|
|
187
|
+
* @property {CoordinateValue} value - value property
|
|
188
|
+
* @property {number} step - step property
|
|
189
|
+
* @property {string} label - label property
|
|
190
|
+
* @property {string} [description] - description property
|
|
191
|
+
* @property {string} group - group property
|
|
192
|
+
* @property {ParameterCategory} category - category property
|
|
193
|
+
*/
|
|
194
|
+
|
|
174
195
|
/**
|
|
175
196
|
* Audio analysis API - provides real-time audio data and frequency analysis
|
|
176
197
|
* @typedef {Object} AudioAPI
|
|
@@ -330,6 +351,7 @@
|
|
|
330
351
|
* @property {(defaultValue: number, config: NumberConfig) => NumberParameter} number - number property
|
|
331
352
|
* @property {(defaultValue: null, config: ImageConfig) => ImageParameter} image - image property
|
|
332
353
|
* @property {(config: ButtonConfig) => ButtonParameter} button - button property
|
|
354
|
+
* @property {(defaultValue: CoordinateValue, config: CoordinateConfig) => CoordinateParameter} coordinate - coordinate property
|
|
333
355
|
* @property {(type: '2d') => OffscreenCanvasRenderingContext2D} useContext - useContext property
|
|
334
356
|
* @property {(type: 'webgl') => WebGLRenderingContext} useContext - useContext property
|
|
335
357
|
* @property {(type: 'webgl2') => WebGL2RenderingContext} useContext - useContext property
|
|
@@ -222,6 +222,33 @@ class ParameterSystem {
|
|
|
222
222
|
this.parameterObjects.set(paramName, buttonObject);
|
|
223
223
|
return buttonObject;
|
|
224
224
|
}
|
|
225
|
+
createCoordinateParameter(defaultValue, config) {
|
|
226
|
+
const paramName = config.label;
|
|
227
|
+
const coordinateObject = {
|
|
228
|
+
value: { x: defaultValue.x, y: defaultValue.y },
|
|
229
|
+
step: config.step ?? 0.01,
|
|
230
|
+
label: config.label,
|
|
231
|
+
description: config.description ?? "",
|
|
232
|
+
group: config.group ?? "general",
|
|
233
|
+
category: config.category ?? "general"
|
|
234
|
+
};
|
|
235
|
+
const definition = {
|
|
236
|
+
type: "coordinate",
|
|
237
|
+
defaultValue: { x: defaultValue.x, y: defaultValue.y },
|
|
238
|
+
label: coordinateObject.label,
|
|
239
|
+
description: coordinateObject.description,
|
|
240
|
+
group: coordinateObject.group,
|
|
241
|
+
category: coordinateObject.category,
|
|
242
|
+
config: {
|
|
243
|
+
min: -1,
|
|
244
|
+
max: 1,
|
|
245
|
+
step: coordinateObject.step
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
this.storeParameterDefinition(paramName, definition);
|
|
249
|
+
this.parameterObjects.set(paramName, coordinateObject);
|
|
250
|
+
return coordinateObject;
|
|
251
|
+
}
|
|
225
252
|
storeParameterDefinition(name, definition) {
|
|
226
253
|
this.parameterDefinitions.set(name, definition);
|
|
227
254
|
this.parameterValues.set(name, definition.defaultValue);
|
|
@@ -238,7 +265,8 @@ class ParameterSystem {
|
|
|
238
265
|
}
|
|
239
266
|
const currentValue = this.parameterValues.get(name);
|
|
240
267
|
const isInitialSync = !this.initialValuesSynced;
|
|
241
|
-
|
|
268
|
+
const isEqual = definition.type === "coordinate" ? currentValue && value && typeof currentValue === "object" && typeof value === "object" && "x" in currentValue && "x" in value && currentValue.x === value.x && currentValue.y === value.y : currentValue === value;
|
|
269
|
+
if (isEqual && !isInitialSync) {
|
|
242
270
|
return false;
|
|
243
271
|
}
|
|
244
272
|
this.parameterValues.set(name, value);
|
|
@@ -309,6 +337,21 @@ class ParameterSystem {
|
|
|
309
337
|
return false;
|
|
310
338
|
}
|
|
311
339
|
break;
|
|
340
|
+
case "coordinate":
|
|
341
|
+
if (!value || typeof value !== "object" || !("x" in value) || !("y" in value)) {
|
|
342
|
+
console.error(`Parameter '${name}' must be an object with x and y properties, got: ${value}`);
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
const coord = value;
|
|
346
|
+
if (typeof coord.x !== "number" || isNaN(coord.x) || typeof coord.y !== "number" || isNaN(coord.y)) {
|
|
347
|
+
console.error(`Parameter '${name}' x and y must be numbers, got: x=${coord.x}, y=${coord.y}`);
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
if (coord.x < -1 || coord.x > 1 || coord.y < -1 || coord.y > 1) {
|
|
351
|
+
console.error(`Parameter '${name}' x and y must be between -1 and 1, got: x=${coord.x}, y=${coord.y}`);
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
312
355
|
}
|
|
313
356
|
return true;
|
|
314
357
|
}
|
|
@@ -2344,6 +2387,14 @@ class ShaderParameterParser {
|
|
|
2344
2387
|
console.warn(`Parameter ${param.uniformName} of type 'button' ignores 'default' — buttons always start as false`);
|
|
2345
2388
|
}
|
|
2346
2389
|
break;
|
|
2390
|
+
case "coordinate":
|
|
2391
|
+
if (param.config.default === void 0) {
|
|
2392
|
+
throw new Error(`Parameter ${param.uniformName} of type 'coordinate' missing required 'default' key (e.g., default:[0,0])`);
|
|
2393
|
+
}
|
|
2394
|
+
if (!Array.isArray(param.config.default) || param.config.default.length !== 2 || typeof param.config.default[0] !== "number" || typeof param.config.default[1] !== "number") {
|
|
2395
|
+
throw new Error(`Parameter ${param.uniformName} of type 'coordinate' default must be an array of 2 numbers (e.g., [0,0])`);
|
|
2396
|
+
}
|
|
2397
|
+
break;
|
|
2347
2398
|
case "accumulator":
|
|
2348
2399
|
if (param.config.rate === void 0) {
|
|
2349
2400
|
throw new Error(`Accumulator '${param.uniformName}' requires a 'rate' config key (parameter name or numeric constant)`);
|
|
@@ -2377,6 +2428,8 @@ class ShaderParameterParser {
|
|
|
2377
2428
|
return `uniform sampler2D ${param.uniformName};`;
|
|
2378
2429
|
case "button":
|
|
2379
2430
|
return `uniform bool ${param.uniformName};`;
|
|
2431
|
+
case "coordinate":
|
|
2432
|
+
return `uniform vec2 ${param.uniformName};`;
|
|
2380
2433
|
case "accumulator":
|
|
2381
2434
|
return `uniform float ${param.uniformName}; // accumulator (rate: ${param.config.rate})`;
|
|
2382
2435
|
default:
|
|
@@ -3712,6 +3765,11 @@ ${error}`);
|
|
|
3712
3765
|
case "button":
|
|
3713
3766
|
this.setUniform(param.uniformName, "bool", value);
|
|
3714
3767
|
break;
|
|
3768
|
+
case "coordinate":
|
|
3769
|
+
if (value && typeof value === "object" && "x" in value && "y" in value) {
|
|
3770
|
+
this.setUniform(param.uniformName, "vec2", [value.x, value.y]);
|
|
3771
|
+
}
|
|
3772
|
+
break;
|
|
3715
3773
|
}
|
|
3716
3774
|
}
|
|
3717
3775
|
}
|
|
@@ -4722,6 +4780,9 @@ class VijiWorkerRuntime {
|
|
|
4722
4780
|
button: (config) => {
|
|
4723
4781
|
return this.parameterSystem.createButtonParameter(config);
|
|
4724
4782
|
},
|
|
4783
|
+
coordinate: (defaultValue, config) => {
|
|
4784
|
+
return this.parameterSystem.createCoordinateParameter(defaultValue, config);
|
|
4785
|
+
},
|
|
4725
4786
|
// Context selection
|
|
4726
4787
|
useContext: (type) => {
|
|
4727
4788
|
if (type === "2d") {
|
|
@@ -4848,6 +4909,11 @@ class VijiWorkerRuntime {
|
|
|
4848
4909
|
case "button":
|
|
4849
4910
|
this.viji.button(paramConfig);
|
|
4850
4911
|
break;
|
|
4912
|
+
case "coordinate": {
|
|
4913
|
+
const def = Array.isArray(config.default) ? config.default : [0, 0];
|
|
4914
|
+
this.viji.coordinate({ x: def[0], y: def[1] }, paramConfig);
|
|
4915
|
+
break;
|
|
4916
|
+
}
|
|
4851
4917
|
}
|
|
4852
4918
|
}
|
|
4853
4919
|
// Reset parameter state (called when loading new scene)
|
|
@@ -27062,4 +27128,4 @@ async function setSceneCode(sceneCode) {
|
|
|
27062
27128
|
}
|
|
27063
27129
|
}
|
|
27064
27130
|
self.setSceneCode = setSceneCode;
|
|
27065
|
-
//# sourceMappingURL=viji.worker-
|
|
27131
|
+
//# sourceMappingURL=viji.worker-BoI8e3NI.js.map
|