To give an example, let’s assume you make that separate map for each object, and hey, if that’s easiest as -30…30, no problem. The map’s then normalized to 0…1 like you said.
/*
Define a bounding box for this Pixelblaze's section of an overall (x, y) = (0..1, 0..1) world
Would be set for each PB separately via websockets
E.g. If this board is driving an object in the upper right 1% square of space,
x0 = .9 // This device's sub-world starts 90% of the way right
xLen = .1 // And extends to the rightmost limit
y0 = 0 // This device's sub-world starts at the top of space
yLen = .1 // And extends down 10% of all Y space
*/
export var x0, xLen, y0, yLen
export function render2D(index, _x, _y) {
x = x0 + _x * xLen
y = y0 + _y * yLen
// (Some pattern that calculates an entire (0..1, 0..1) world in terms of x and y goes here)
}
What’s cool about this is you can give each one a separate map, but the pattern code for each can be cloned from Firestorm each time you improve it, because the exact same pattern code is being used on all the boards (though you’d need to re-initialize the individual values to each board over websockets).