Skip to content
Snippets Groups Projects
create_window6x12.js 2.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Model creation script for more complex layout, a window display
     * made from a 6x12 grid of architectural glass blocks.
     *
     * Each block is backed by a square ring of 40 LEDs, organized
     * clockwise from the top-left. This string is connected to a
     * dedicated Fadecandy output channel.
     *
     * These blocks are organized into panels of 2x4, each controlled
     * by a separate Fadecandy board. These boards are then arranged in
     * a 3x3 grid, left-to-right top-to-bottom.
     *
     * The JSON for this layout includes multiple kinds of data about
     * each LED. Each LED has the following fields:
     *
     *        point: A 3D vector, arbitrary coordinates. Scaled to look good
     *               in the Open Pixel Control "gl_server" pre-visualizer
     *
     *       gridXY: Integer xy location of the block in the overall window grid
     *      blockXY: Location within the block, in XY coordinates within [-1, 1]
     *   blockAngle: Angle within the block, in radians. Zero is +Y.
     *
     * 2014 Micah Elizabeth Scott
     * This file is released into the public domain.
     */
    
    var model = []
    var blockSize = 0.3;
    var centerX = blockSize * 6/2;
    var centerY = blockSize * 12/2;
    
    function blockEdge(index, gridXY, angle)
    {
        // Lay out one LED strip corresponding to a block edge
    
        var count = 10;        // How many LEDs?
        var y = 0.75;          // Distance from center, in model
    
        var spacing = 2 * y / (count + 1);
        var s = Math.sin(angle);
        var c = Math.cos(angle);
    
        for (var i = 0; i < count; i++) {
            // Distance from vertical Y axis
            var x = (i - (count-1)/2.0) * spacing;
    
            // Rotated XY
            var rx = x * c - y * s;
            var ry = x * s + y * c;
    
            model[index++] = {
                point: [
                    blockSize * -(gridXY[0] + rx * 0.5 + 0.5) + centerX,
                    0,
                    blockSize * -(gridXY[1] - ry * 0.5 + 0.5) + centerY
                ],
                gridXY: gridXY,
                blockXY: [rx, ry],
                blockAngle: Math.atan2(rx, ry)
            }
        }
    }
    
    function block(index, gridXY)
    {
        for (var i = 0; i < 4; i++) {
            blockEdge(index + i * 10, gridXY, i * -Math.PI / 2);
        }
    }
    
    function blockModule(index, gridXY, width, height)
    {
        for (var y = 0; y < height; y++) {
            for (var x = 0; x < width; x++) {
                block(index, [gridXY[0] + x, gridXY[1] + y]);
                index += 64;
            }
        }
    }
    
    function moduleGrid(index, width, height, modWidth, modHeight)
    {
        for (var y = 0; y < height; y++) {
            for (var x = 0; x < width; x++) {
                blockModule(index, [x * modWidth, y * modHeight], modWidth, modHeight);
                index += 512;
            }
        }
    }
    
    moduleGrid(0, 3, 3, 2, 4);
    
    console.log(JSON.stringify(model));