UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

55 lines (51 loc) 1.98 kB
import {Object3D, BaseEvent} from 'three'; import {AnimPropertyTarget} from '../../core/animation/PropertyTarget'; import {NodeContext} from '../poly/NodeContext'; import {ObjectNamedFunction1} from './_Base'; import {gsapTimeline} from '../../core/thirdParty/gsap/gsapFactory'; import {Object3DWithEvent} from '../../core/geometry/ObjectContent'; const EVENT_ANIMATION_STARTED: BaseEvent<'onAnimationStarted'> = {type: 'onAnimationStarted'}; const EVENT_ANIMATION_COMPLETED: BaseEvent<'onAnimationCompleted'> = {type: 'onAnimationCompleted'}; export class playAnimation extends ObjectNamedFunction1<[string]> { static override type() { return 'playAnimation'; } func(object3D: Object3D, nodePath: string): Promise<void> { return new Promise(async (resolve) => { const node = this.scene.node(nodePath); if (!node) { return; } if (node.context() != NodeContext.ANIM) { return; } const container = await node.compute(); if (!container) { return; } const timelineBuilder = container.coreContent(); if (!timelineBuilder) { return; } // previously created timeline cannot be killed, // since it most likely would have been applied to a different object // if (this._timeline && isBooleanTrue(this.pv.stopsPreviousAnim)) { // this._timeline.kill(); // } const timeline = gsapTimeline(); if (!timeline) { return; } const propertyTarget = new AnimPropertyTarget(this.scene, {object: {list: [object3D]}}); timelineBuilder.populate(timeline, {registerproperties: true, propertyTarget: propertyTarget}); timeline.vars.onStart = () => { (object3D as Object3DWithEvent<'onAnimationStarted'>).dispatchEvent(EVENT_ANIMATION_STARTED); // this._triggerAnimationStarted(context); }; timeline.vars.onComplete = () => { (object3D as Object3DWithEvent<'onAnimationCompleted'>).dispatchEvent(EVENT_ANIMATION_COMPLETED); // this._triggerAnimationCompleted(context); }; }); } }