diff --git a/src/shared/dmxUtil.ts b/src/shared/dmxUtil.ts index ef00951e..c4cfc920 100644 --- a/src/shared/dmxUtil.ts +++ b/src/shared/dmxUtil.ts @@ -1,4 +1,4 @@ -import { Window, Window2D_t } from '../shared/window' +import { Window, Window2D_t, window2DToParentCoords } from '../shared/window' import { DmxValue, DMX_MAX_VALUE, @@ -291,7 +291,7 @@ export function flatten_fixture( let flattened: FlattenedFixture[] = fixture_type.subFixtures.map((sub) => { return { intensity: sub.intensity ?? fixture_type.intensity, - window: sub.relative_window ?? fixture.window, + window: sub.relative_window ? window2DToParentCoords(sub.relative_window, fixture.window) : fixture.window, channels: sub.channels.map((ch_index) => { subfixture_ch_indexes.add(ch_index) return [base_channel + ch_index, fixture_type.channels[ch_index]] diff --git a/src/shared/window.ts b/src/shared/window.ts index 37fcfcec..aa7d4a88 100644 --- a/src/shared/window.ts +++ b/src/shared/window.ts @@ -9,3 +9,17 @@ export type Window2D_t = { x?: Window y?: Window } + +export function windowToParentCoords(relative: Window, parent: Window): Window { + return { + pos: parent.pos + (relative.pos - 0.5) * parent.width, + width: relative.width * parent.width + } +} + +export function window2DToParentCoords(relative: Window2D_t, parent: Window2D_t): Window2D_t { + return { + x: relative.x && parent.x ? windowToParentCoords(relative.x, parent.x) : undefined, + y: relative.y && parent.y ? windowToParentCoords(relative.y, parent.y) : undefined + } +}