UNPKG

@dill-pixel/plugin-rive

Version:

Rive

1 lines 32.3 kB
{"version":3,"file":"dill-pixel-plugin-rive.mjs","sources":["../src/version.ts","../src/RivePlugin.ts","../src/RiveEntity.ts"],"sourcesContent":["export const version = '6.2.3';\nexport const riveVersion = '2.30.1';","import Rive, { RiveCanvas } from '@rive-app/canvas-advanced-lite';\nimport { IPlugin, Plugin } from 'dill-pixel';\nimport { BrowserAdapter, checkExtension, extensions, ExtensionType, LoaderParserPriority } from 'pixi.js';\nimport { riveVersion, version } from './version';\n\nexport interface IRivePlugin extends IPlugin<RivePluginOptions> {\n rive: RiveCanvas;\n cleanup(): void;\n}\n\n/**\n * Defines the options for the Rive plugin.\n * @property {string} wasmPath - The URL path to the Rive WASM file.\n */\nexport type RivePluginOptions = {\n wasmPath: string;\n};\n\nconst defaultOptions = {\n wasmPath: 'https://unpkg.com/@rive-app/canvas-advanced-lite@2.26.1/rive.wasm',\n};\n\nexport class RivePlugin extends Plugin<RivePluginOptions> implements IRivePlugin {\n public static ID: string;\n public readonly id = 'rive';\n public rive: RiveCanvas;\n protected _options: RivePluginOptions = defaultOptions;\n\n private _addedExtensions: boolean = false;\n\n private hello() {\n const hello = `%c Dill Pixel Rive Plugin v${version} | %cRive v${riveVersion} (@rive-app/canvas-advanced-lite)`;\n console.log(\n hello,\n 'background: rgba(31, 41, 55, 1);color: #74b64c',\n 'background: rgba(31, 41, 55, 1);color: #e91e63',\n );\n }\n\n async initialize(options: RivePluginOptions): Promise<void> {\n this._options = { ...defaultOptions, ...options };\n this.hello();\n RivePlugin.ID = this.id;\n this._addLoaderExtensions();\n if (!this.rive) {\n this.rive = await Rive({ locateFile: () => this._options.wasmPath });\n }\n }\n\n cleanup() {\n // TODO investigate why this causes the browser to freeze\n // this.rive.cleanup();\n }\n\n destroy() {\n this.cleanup();\n super.destroy();\n }\n\n private _addLoaderExtensions() {\n if (!this._addedExtensions) {\n extensions.add({\n name: 'loadRive',\n extension: {\n type: ExtensionType.LoadParser,\n priority: LoaderParserPriority.High,\n },\n test(url: string) {\n return checkExtension(url, '.riv');\n },\n async load(url: string) {\n const response = await BrowserAdapter.fetch(url);\n return new Uint8Array(await response.arrayBuffer());\n },\n });\n this._addedExtensions = true;\n }\n }\n}\n","import {\n Artboard,\n File,\n LinearAnimationInstance,\n Mat2D,\n RiveCanvas,\n SMIInput,\n StateMachineInstance,\n WrappedRenderer,\n} from '@rive-app/canvas-advanced-lite';\nimport { Container, destroyCanvas, Logger, Signal, WithSignals } from 'dill-pixel';\nimport { Assets, FederatedPointerEvent, Sprite, Texture, Ticker } from 'pixi.js';\nimport { RivePlugin } from './RivePlugin';\nimport { Alignment, Fit, RiveOptions } from './types';\n\n/**\n * @see https://www.npmjs.com/package/pixi-rive\n * RiveEntity component extended from Dill Pixel Container\n * PIXI.Assets.add({ alias: 'vehicles', src: 'https://cdn.rive.app/animations/vehicles.riv' });\n * const vehicles = new RiveEntity({ asset: 'vehicles', autoPlay: true });\n * app.stage.addChild(vehicles);\n *\n * @param {Artboard} artboard current Rive Artboard instance\n * @param {LinearAnimationInstance} animations current Animation instances\n * @param {StateMachineInstance} stateMachines current Rive State Machine instances\n * @param {Map<string, SMIInput>} inputFields current artboard input fields from all state machines\n * @param {Function} onStateChange callback method for catching state machines changes\n * @param {Fit} fit fit Rive component into container sizes (Contain by default)\n * @param {Alignment} align align Rive component in container (Center by default)\n * @param {number} maxWidth max width of sprite (original Rive artboard size will be used if maxWidth is not set)\n * @param {number} maxHeight max height of sprite (original Rive artboard size will be used if maxHeight is not set)\n */\nexport class RiveEntity extends WithSignals(Container) {\n // signals\n onStateChange: Signal<(states?: any) => void> = new Signal();\n onReady: Signal<(rive?: RiveCanvas) => void> = new Signal();\n onPlay: Signal<(animations: string | string[]) => void> = new Signal();\n onStop: Signal<(animations: string | string[]) => void> = new Signal();\n onPause: Signal<() => void> = new Signal();\n onResume: Signal<() => void> = new Signal();\n // TODO: Can't figure out how to implement this yet\n // can't seem to get animation duration or loop values\n // perhaps it's a bug?\n // onLoop: Signal<() => void> = new Signal();\n //\n animations: LinearAnimationInstance[] = [];\n stateMachines: StateMachineInstance[] = [];\n inputFields: Map<string, SMIInput> = new Map();\n artboard?: Artboard;\n private _debug: boolean = false;\n private _file?: File;\n private _aligned?: Mat2D;\n private _renderer?: WrappedRenderer;\n private _canvas?: OffscreenCanvas | HTMLCanvasElement;\n private _paused: boolean;\n private _enabled: boolean = false;\n\n /**\n * Constructor will load Rive wasm if it not loaded yet\n * and create instances of Rive scene components (artboard, animation, stateMachine)\n * after initialize will call onReady method and run animation if autoPlay was setted\n * @param {RiveOptions} options initial component options\n */\n constructor(public options: RiveOptions) {\n super({ autoResize: false, autoUpdate: false, priority: -1 });\n this._debug = options.debug ?? false;\n this.initEvents(options!.interactive ?? false);\n if (options.autoInit !== false) {\n void this.initialize();\n }\n }\n\n private _align: Alignment = 'center';\n\n get align(): Alignment {\n return this._align;\n }\n\n set align(value: Alignment) {\n this._align = value;\n }\n\n private _fit: Fit = 'contain';\n\n get fit(): Fit {\n return this._fit;\n }\n\n set fit(value: Fit) {\n this._fit = value;\n this.updateSize();\n }\n\n private _maxWidth: number = 0;\n\n get maxWidth(): number {\n return this._maxWidth;\n }\n\n set maxWidth(value: number) {\n this._maxWidth = value;\n this.updateSize();\n }\n\n private _maxHeight: number = 0;\n\n get maxHeight(): number {\n return this._maxHeight;\n }\n\n set maxHeight(value: number) {\n this._maxHeight = value;\n this.updateSize();\n }\n\n private _rive?: RiveCanvas;\n\n get rive(): RiveCanvas {\n return this.plugin.rive;\n }\n\n private _view: Sprite;\n\n get view(): Sprite {\n return this._view;\n }\n\n get plugin(): RivePlugin {\n return this.app.getPlugin(RivePlugin.ID);\n }\n\n async initialize() {\n await this.initRive(this.options.asset).then(() => {\n try {\n this.loadArtboard(this.options.artboard);\n this.loadStateMachine(this.options.stateMachine);\n this.playAnimation(this.options.animation);\n\n if (this.options.fit) {\n this.fit = this.options.fit;\n }\n if (this.options.align) {\n this.align = this.options.align;\n }\n if (this.options.maxWidth) {\n this.maxWidth = this.options.maxWidth;\n }\n if (this.options.maxHeight) {\n this.maxHeight = this.options.maxHeight;\n }\n if (this.options.maxHeight !== undefined || this.options.maxWidth !== undefined) {\n this.updateSize();\n }\n\n if (this.options.autoPlay) {\n this.enable();\n } else this.update();\n this.onReady.emit(this.rive);\n } catch (error) {\n console.error(error);\n }\n });\n }\n\n /**\n * Enable rive scene animation\n */\n enable(): void {\n this._enabled = true;\n if (this.rive) {\n this.app.ticker.add(this.update);\n }\n }\n\n /**\n * Disable rive scene animation\n */\n disable(): void {\n this._enabled = false;\n if (this.rive) {\n this.app.ticker.remove(this.update);\n }\n }\n\n /**\n * Load Rive scene artboard by name or load default artboard if name is not set\n * Rive should be initialized before (RiveOptions.onReady was emited)\n * @param {string|number} artboard name of the loading artboard\n */\n loadArtboard(artboard: string | undefined): void | Promise<void> {\n if (this.artboard) {\n this._destroyInternals();\n this.options.artboard = artboard;\n return this.initialize();\n }\n if (this._file && this._canvas) {\n this.artboard = artboard ? this._file.artboardByName(artboard) : this._file.defaultArtboard();\n if (!this._view) {\n this._view = this.add.sprite({\n asset: Texture.from(this._canvas, false),\n anchor: this.options?.anchor ?? 0,\n scale: this.options?.scale ?? 1,\n layout: false,\n });\n } else {\n this._view.texture.source.update();\n }\n }\n this.updateSize();\n }\n\n /**\n * Load Rive state machines by names or load first state machine\n * Artbaord should be loaded before\n * Will load first state machine if name is empty\n * @param {string|number} machines name or names of the loading state machines\n */\n loadStateMachine(machines: string | string[] = []): void {\n if (!this.artboard || !this.rive) return;\n if (typeof machines === 'string') machines = [machines];\n else if (!machines.length) {\n const defaultMachine = this.artboard!.stateMachineByIndex(0);\n machines = defaultMachine ? [defaultMachine.name] : [];\n }\n machines.map((name) => {\n const machine = this.artboard!.stateMachineByName(name);\n this.unloadStateMachine(name);\n this.stateMachines.push(new this.rive!.StateMachineInstance(machine, this.artboard!));\n });\n this.initInputFields();\n }\n\n /**\n * Unload state machine and destroy instance\n * @param {string} name name of the state machine\n */\n unloadStateMachine(name: string): void {\n this.stateMachines = this.stateMachines.filter((machine) => {\n if (machine.name === name) {\n machine.delete();\n return false;\n } else return true;\n });\n }\n\n /**\n * Play Rive animation by name (artbaord should be loaded before)\n * You can play only one timeline animation at the same time.\n * If animation is looped or it's a pingpong, it will be repeated endlessly\n * otherwise it plays only once\n *\n * TODO: add onStart/onEnd/onLoop methods for animation\n *\n * @param {string|number} animations animation name or array of nmaes\n */\n playAnimation(animations: string | string[] = []): void {\n if (!this.artboard && !this.rive) return;\n if (typeof animations === 'string') animations = [animations];\n else if (!animations.length && !this.stateMachines.length) {\n const defaultAnimation = this.artboard!.animationByIndex(0);\n animations = defaultAnimation ? [defaultAnimation.name] : [];\n }\n animations.map((name) => {\n const animation = this.artboard!.animationByName(name);\n this.stopAnimation(name);\n\n const anim = new this.rive!.LinearAnimationInstance(animation, this.artboard!);\n\n this.animations.push(anim);\n });\n\n this.onPlay.emit(animations);\n }\n\n /**\n * Stop current animation and destroy Rive animation instance\n */\n stopAnimation(animations: string | string[]): void {\n const animationsToStop = Array.isArray(animations) ? animations : [animations];\n this.animations = this.animations.filter((animation) => {\n if (animationsToStop.includes(animation.name)) {\n animation.delete();\n return false;\n } else return true;\n });\n\n this.onStop.emit(animations);\n }\n\n pause() {\n this._paused = true;\n this.onPause.emit();\n }\n\n resume() {\n this._paused = false;\n this.onResume.emit();\n }\n\n /**\n * Get list of available artboards in current Rive file\n */\n getAvailableArtboards(): string[] {\n const available: string[] = [];\n if (this._file) {\n for (let i = 0; i < this._file.artboardCount(); i++) {\n available[i] = this._file.artboardByIndex(i).name;\n }\n }\n return available;\n }\n\n /**\n * Get list of available state machines in current artboard\n */\n getAvailableStateMachines(): string[] {\n const available: string[] = [];\n if (this.artboard) {\n for (let i = 0; i < this.artboard.stateMachineCount(); i++) {\n available[i] = this.artboard.stateMachineByIndex(i).name;\n }\n }\n return available;\n }\n\n /**\n * Get list of available animations in current artboard\n */\n getAvailableAnimations(): string[] {\n const available: string[] = [];\n if (this.artboard) {\n for (let i = 0; i < this.artboard.animationCount(); i++) {\n available[i] = this.artboard.animationByIndex(i).name;\n }\n }\n return available;\n }\n\n /**\n * Recalculate and update sizes of ofscreencanvas due to artboard size\n * Artboard should be loaded before\n */\n updateSize(): void {\n if (this.artboard && this.rive && this._renderer && this._canvas) {\n const bounds = this.artboard.bounds;\n const { minX, minY, maxX, maxY } = bounds;\n const width = maxX - minX;\n const height = maxY - minY;\n const maxWidth = this._maxWidth || width;\n const maxHeight = this._maxHeight || height;\n const fit = this.rive.Fit[this._fit];\n const align = this.rive.Alignment[this._align];\n const frame = { minX: 0, minY: 0, maxX: maxWidth, maxY: maxHeight };\n\n this._canvas.width = maxWidth;\n this._canvas.height = maxHeight;\n this._aligned = this.rive?.computeAlignment(fit, align, frame, bounds);\n this._renderer.align(fit, align, frame, bounds);\n this._view.texture.source.update();\n }\n }\n\n /**\n * Receive input fields from all active state machines\n */\n initInputFields(): void {\n const { bool, trigger } = this.rive!.SMIInput;\n this.inputFields.clear();\n this.stateMachines.forEach((m) => {\n for (let i = 0; i < m.inputCount(); i++) {\n let field: SMIInput;\n const input = m.input(i);\n if (input.type == bool) field = input.asBool();\n else if (input.type == trigger) field = input.asTrigger();\n else field = input.asNumber();\n this.inputFields.set(input.name, field);\n }\n });\n }\n\n /**\n * Get state machine input field by name\n * @param {string} name input field name\n * @returns {number|boolean} value of the input field\n */\n getInputValue(name: string): number | boolean | undefined {\n const input = this.inputFields.get(name);\n return input && input.value;\n }\n\n /**\n * Set state machine input field value by name\n * @param {string} name of the input field\n * @param {number|boolean} value of the input field\n */\n setInput(name: string, value: number | boolean): void {\n const input = this.inputFields.get(name);\n if (input && input.type !== this.rive?.SMIInput.trigger) {\n input.value = value;\n }\n }\n\n /**\n * Trigger state machine input field\n * @param {string} name of the trigger field\n */\n fireTrigger(name: string): void {\n const input = this.inputFields.get(name);\n if (input && input.type === this.rive?.SMIInput.trigger) {\n input.fire();\n }\n }\n\n /**\n * Destroy all component resources\n */\n destroy() {\n this._destroyInternals();\n try {\n this._renderer?.delete();\n } catch (e) {\n // nothing\n }\n try {\n this._file?.delete();\n } catch (e) {\n // nothing\n }\n super.destroy();\n }\n\n public update(ticker: Ticker = this.app.ticker) {\n if (this._paused || !this.artboard || !this._renderer || !this.rive) {\n return;\n }\n const elapsedTime = ticker.elapsedMS / 1000;\n this.advanceStateMachines(elapsedTime);\n this.advanceAnimations(elapsedTime);\n this.artboard.advance(elapsedTime);\n this._renderer.clear();\n this._renderer.save();\n this.artboard.draw(this._renderer);\n this._renderer.restore();\n this._renderer.flush();\n this.view.texture.source.update();\n\n /**\n * https://rive.app/community/doc/low-level-api-usage/doctAfBY6v3P#integrating-rive-into-existing-raf-loop\n */\n this.rive.resolveAnimationFrame();\n }\n\n protected handlePointerdown(e: FederatedPointerEvent) {\n const point = this.translatePoint(e.global);\n this.stateMachines.map((m) => m.pointerDown(...point));\n }\n\n protected handlePointerup(e: FederatedPointerEvent) {\n const point = this.translatePoint(e.global);\n this.stateMachines.map((m) => m.pointerUp(...point));\n }\n\n protected handlePointermove(e: FederatedPointerEvent) {\n const point = this.translatePoint(e.global);\n this.stateMachines.map((m) => m.pointerMove(...point));\n }\n\n private _destroyInternals() {\n this.disable();\n this.off('pointerdown', this.handlePointerdown);\n this.off('pointerup', this.handlePointerup);\n this.off('pointermove', this.handlePointermove);\n\n try {\n this.stateMachines.map((machine) => machine.delete());\n } catch (e) {\n // nothing\n }\n try {\n this.animations.map((animation) => animation.delete());\n } catch (e) {\n // nothing\n }\n try {\n this.artboard?.delete();\n } catch (e) {\n // nothing\n }\n\n this.animations = [];\n this.stateMachines = [];\n\n this.view.texture.destroy(true);\n this.view.destroy();\n\n // @ts-expect-error artboard can't be null\n this.artboard = null;\n\n // @ts-expect-error view can't be null\n this._view = null;\n\n if (this._canvas) {\n destroyCanvas(this._canvas);\n }\n // @ts-expect-error canvas can't be null\n this._canvas = null;\n }\n\n /**\n * Will load wasm and rive sprite asset from assets library\n * also create offscreen canvas and rive renderer\n * @param riv\n */\n private async initRive(riv: string | Uint8Array): Promise<void> {\n const asset = typeof riv === 'string' ? await Assets.load(riv) : riv;\n this._file = await this.rive.load(asset);\n this._canvas = this.createCanvas();\n this._renderer = this.rive.makeRenderer(this._canvas, true);\n }\n\n /**\n * Attach pointer events to the pixi sprite and pass them to the Rive state machine\n * @param {boolean} interactive true if we need to attach pointer events to sprite\n */\n private initEvents(interactive: boolean): void {\n if (!interactive) return;\n if (this.options.cursor) {\n this.cursor = this.options.cursor;\n }\n this.eventMode = 'static';\n this.on('pointerdown', this.handlePointerdown);\n this.on('onpointerup', this.handlePointerup);\n this.on('onpointermove', this.handlePointermove);\n }\n\n /**\n * Convert global Pixi.js coordinates to Rive point coordinates\n * @param {{x:number,y:number}} global point coordinates\n * @returns\n */\n private translatePoint(global: { x: number; y: number }): [number, number] {\n const { x, y } = this.toLocal(global);\n const { tx, ty, xx, yy } = this._aligned || { tx: 0, ty: 0, xx: 1, yy: 1 };\n return [(x - tx) / xx, (y - ty) / yy];\n }\n\n /**\n * Will create offscreen canvas\n * In debug mode will create a regular canvas and display it over the page\n */\n private createCanvas(): OffscreenCanvas | HTMLCanvasElement {\n if (this._debug) {\n const canvas = document.createElement('canvas');\n canvas.style.position = 'absolute';\n canvas.style.right = '0';\n canvas.style.top = '0';\n canvas.style.width = 'auto';\n canvas.style.height = 'auto';\n document.body.appendChild(canvas);\n return canvas;\n }\n return new OffscreenCanvas(100, 100);\n }\n\n /**\n * Play all state machines animations\n * @param {number} elapsed time from last update\n */\n private advanceStateMachines(elapsed: number): void {\n this.stateMachines.map((m) => {\n const numFiredEvents = m.reportedEventCount();\n if (numFiredEvents) {\n Logger.log(`state machine ${m.name} reported ${numFiredEvents} events`);\n for (let i = 0; i < numFiredEvents; i++) {\n const event = m.reportedEventAt(i);\n if (event) {\n Logger.log(`event ${event.name} fired`);\n }\n }\n }\n m.advance(elapsed);\n\n if (m.stateChangedCount()) {\n const states = [];\n for (let i = 0; i < m.stateChangedCount(); i++) {\n states.push(m.stateChangedNameByIndex(i));\n }\n if (states.length) {\n this.onStateChange.emit(states);\n }\n }\n });\n }\n\n /**\n * Play all scene animations\n * @param {number} elapsed time from last update\n */\n private advanceAnimations(elapsed: number): void {\n this.animations.map((a) => {\n a.advance(elapsed);\n a.apply(1);\n });\n }\n}\n"],"names":["version","riveVersion","defaultOptions","RivePlugin","Plugin","hello","options","Rive","extensions","ExtensionType","LoaderParserPriority","url","checkExtension","response","BrowserAdapter","RiveEntity","WithSignals","Container","Signal","value","error","artboard","Texture","_a","_b","machines","defaultMachine","name","machine","animations","defaultAnimation","animation","anim","animationsToStop","available","bounds","minX","minY","maxX","maxY","width","height","maxWidth","maxHeight","fit","align","frame","bool","trigger","m","i","field","input","ticker","elapsedTime","e","point","destroyCanvas","riv","asset","Assets","interactive","global","x","y","tx","ty","xx","yy","canvas","elapsed","numFiredEvents","Logger","event","states","a"],"mappings":"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"}