import { createSimpleSchema, list, object, serializable } from "serializr"; import { Scripting } from "../client/util/Scripting"; import { Deserializable } from "../client/util/SerializationHelper"; import { Copy, ToScriptString, ToString } from "./FieldSymbols"; import { ObjectField } from "./ObjectField"; // Helps keep track of the current ink tool in use. export enum InkTool { None = "none", Pen = "pen", Highlighter = "highlighter", Eraser = "eraser", Stamp = "stamp" } // Defines a point in an ink as a pair of x- and y-coordinates. export interface PointData { X: number; Y: number; } // Defines an ink as an array of points. export type InkData = Array; export interface ControlPoint { X: number; Y: number; I: number; } export interface HandlePoint { X: number; Y: number; I: number; dot1: number; dot2: number; } export interface HandleLine { X1: number; Y1: number; X2: number; Y2: number; X3: number; Y3: number; dot1: number; dot2: number; } const pointSchema = createSimpleSchema({ X: true, Y: true }); const strokeDataSchema = createSimpleSchema({ pathData: list(object(pointSchema)), "*": true }); @Deserializable("ink") export class InkField extends ObjectField { @serializable(list(object(strokeDataSchema))) readonly inkData: InkData; constructor(data: InkData) { super(); this.inkData = data; } [Copy]() { return new InkField(this.inkData); } [ToScriptString]() { return "new InkField([" + this.inkData.map(i => `{X: ${i.X}, Y: ${i.Y}} `) + "])"; } [ToString]() { return "InkField"; } } Scripting.addGlobal("InkField", InkField);