export interface Vec2<T> {
    x: T;
    y: T;
}
export interface Vec3<T> {
    x: T;
    y: T;
    z: T;
}
export type GlobalConfig<T> = {
    bottom: T;
    common: T;
};
export type LiftRetract<T> = {
    lift: T;
    retract: T;
};
export type Motions<T> = {
    first: T;
    second: T;
};
/**
 * Motion timings, in seconds
 */
export interface MotionTimes {
    before: {
        lift: number;
    };
    after: {
        lift: number;
        retract: number;
    };
}
export type LayerTimings = GlobalConfig<MotionTimes>;
export type MotionConfig = {
    distance: number;
    speed: number;
};
export type GlobalLiftRetract = LiftRetract<GlobalConfig<MotionConfig>>;
export type GlobalLayerMotions = Motions<GlobalLiftRetract>;
export type LayerMotions = LiftRetract<Motions<MotionConfig>>;
export type PWM = GlobalConfig<number>;
export type GooLayersConfig = {
    thickness: number;
    commonExposure: number;
    exposureDelay: boolean;
    turnOffTime: number;
    timings: LayerTimings;
    bottomExposure: number;
    bottomLayers: number;
    transitionLayers: number;
    advance: boolean;
    motions: GlobalLayerMotions;
    pwm: PWM;
};
export type GooSummary = {
    time: number;
    volume: number;
    weight: number;
    price: number;
    currency: string;
};
export type SliceTransform = {
    invert: boolean;
    translate: Vec2<number>;
    scale: Vec2<number>;
    rotate: {
        angle: number;
        origin: Vec2<number>;
    };
};
export type PrinterDefinition = {
    name: string;
    type: string;
    resolution: Vec2<number>;
    mirror: Vec2<boolean>;
    platform: Vec3<number>;
    resinProfile: string;
    grayscale: boolean;
    antialiasing: number;
    gray: number;
    blur: number;
};
export type ImageChannels = 1 | 2 | 3 | 4;
export type ImageDescriptor = string | {
    buffer: Buffer;
    channels: ImageChannels;
};
export type GooPreview = {
    dimensions: Vec2<number>;
    input: ImageDescriptor;
};
export type GooHeader = {
    date: Date;
    generator?: {
        description: string;
        version: string;
    };
    printer: PrinterDefinition;
    previews: GooPreview[];
    layers: number;
    layerConfig: GooLayersConfig;
    summary: GooSummary;
    next?: number;
};
export type LayerDefinition = {
    pause: {
        mode: number;
        z: number;
    };
    z: number;
    exposure: number;
    offTime: number;
    times: MotionTimes;
    motions: LayerMotions;
    pwm: number;
};
export type ChunkData = {
    type: number;
    length: number;
} | {
    type: number;
    diff: number;
};
export type GooLayer = {
    definition: LayerDefinition;
    slice: ImageDescriptor;
    transform?: SliceTransform;
};
export type Goo = {
    header: GooHeader;
    layers: GooLayer[];
};
