| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | import {
  CodeControl,
  ControlType,
  NumberCodeControl,
  VectorCodeControl,
} from "types"
import { v4 as uuid } from "uuid"
import Vector from "./vector"
export const controls: Record<string, any> = {}
export const codeControls = new Set<CodeControl>([])
export class Control<T extends CodeControl> {
  control: T
  constructor(control: Omit<T, "id">) {
    this.control = { ...control, id: uuid() } as T
    codeControls.add(this.control)
    // Could there be a better way to prevent this?
    // When updating, constructor should just bind to
    // the existing control rather than creating a new one?
    if (!(window as any).isUpdatingCode) {
      controls[this.control.label] = this.control.value
    }
  }
  destroy() {
    codeControls.delete(this.control)
    delete controls[this.control.label]
  }
}
export class NumberControl extends Control<NumberCodeControl> {
  constructor(options: Omit<NumberCodeControl, "id" | "type">) {
    const { value = 0, step = 1 } = options
    super({
      type: ControlType.Number,
      ...options,
      value,
      step,
    })
  }
}
export class VectorControl extends Control<VectorCodeControl> {
  constructor(options: Omit<VectorCodeControl, "id" | "type">) {
    const { value = [0, 0], isNormalized = false } = options
    super({
      type: ControlType.Vector,
      ...options,
      value,
      isNormalized,
    })
  }
}
 |