diff --git a/source/Model/Clip.ts b/source/Model/Clip.ts new file mode 100644 index 0000000..3c4df89 --- /dev/null +++ b/source/Model/Clip.ts @@ -0,0 +1,88 @@ +import { IAnyObject, Model } from "@Model/Model"; +import { Group } from "@Model/Group"; +import { Range } from "@Model/Range"; + +interface IDrawCommand { + type: "points" | "cube"; + id: string; + data?: Float32Array; + position?: number[]; + radius?: number[]; + parameter?: IAnyObject; +} + +interface IFrame { + commands: IDrawCommand[]; + duration: number; +} + +/** + * 剪辑片段 + */ +class Clip { + + /** + * 用户自定义名称 + */ + public name: string = ""; + + /** + * 模型 + */ + public model: Model; + + /** + * 全部帧 + */ + public frames: IFrame[] = []; + + /** + * 录制一帧 + */ + public record(t: number): IFrame { + const commands: IDrawCommand[] = []; + + for (let i = 0; i < this.model.objectPool.length; i++) { + + let object = this.model.objectPool[i]; + object.renderParameter.color = object.color; + + if (object.display && object instanceof Group) { + commands.push({ + type: "points", + id: object.id, + data: object.exportPositionData(), + parameter: object.renderParameter + }); + } + + + if (object.display && object instanceof Range) { + commands.push({ + type: "cube", + id: object.id, + position: object.position, + radius: object.radius, + parameter: object.renderParameter + }); + } + } + + const frame: IFrame = { + commands: commands, + duration: t + }; + + this.frames.push(frame); + + return frame; + } + + + + public constructor(model: Model) { + this.model = model; + } +} + +export { Clip }; \ No newline at end of file diff --git a/source/Model/Model.ts b/source/Model/Model.ts index 1ac2e2a..281aea0 100644 --- a/source/Model/Model.ts +++ b/source/Model/Model.ts @@ -5,6 +5,7 @@ import { IParamValue } from "@Model/Parameter"; import { CtrlObject } from "@Model/CtrlObject"; import { Emitter } from "@Model/Emitter"; import { AbstractRenderer } from "@Model/Renderer"; +import { Clip } from "@Model/Clip"; import { Behavior, IAnyBehavior, IAnyBehaviorRecorder } from "@Model/Behavior"; /** @@ -330,6 +331,8 @@ class Model extends Emitter { } } + public clipPool: Clip[] = []; + /** * 渲染器 */ @@ -347,7 +350,7 @@ class Model extends Emitter { /** * 更新渲染数据 */ - public update(t: number) { + public update(t: number, skipDraw: boolean = false) { // 第一轮更新 for (let i = 0; i < this.objectPool.length; i++) { @@ -373,7 +376,9 @@ class Model extends Emitter { } } - this.draw(); + if (!skipDraw) { + this.draw(); + } } public draw() {