Add 6-flag to mob layout
parent
f1fc46e45c
commit
96c2150bf6
|
@ -31,9 +31,10 @@ export function getLayout(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Binary flags
|
// Binary flags
|
||||||
const FLAG_USE = 1;
|
const FLAG_USE = 1 << 0;
|
||||||
const FLAG_USED = 2;
|
const FLAG_USED = 1 << 1;
|
||||||
const FLAG_USE4 = 4;
|
const FLAG_USE4 = 1 << 2;
|
||||||
|
const FLAG_USE6 = 1 << 3;
|
||||||
|
|
||||||
// Create 2d matrix to work in
|
// Create 2d matrix to work in
|
||||||
const origRowLen = Math.ceil(input.length / opts.numCols);
|
const origRowLen = Math.ceil(input.length / opts.numCols);
|
||||||
|
@ -59,31 +60,51 @@ export function getLayout(
|
||||||
|
|
||||||
// Use this slot
|
// Use this slot
|
||||||
matrix[row][col] |= FLAG_USE;
|
matrix[row][col] |= FLAG_USE;
|
||||||
photoId++;
|
|
||||||
|
|
||||||
// Check if previous row has something used
|
// Check if previous row has something used
|
||||||
// or something beside this is used
|
// or something beside this is used
|
||||||
// We don't do these one after another
|
// We don't do these one after another
|
||||||
if ((row > 0 && matrix[row-1].some(v => v & FLAG_USED)) ||
|
if ((row > 0 && matrix[row-1].some(v => v & FLAG_USED)) ||
|
||||||
(col > 0 && matrix[row][col-1] & FLAG_USED) ||
|
(col > 0 && matrix[row][col-1] & FLAG_USED)
|
||||||
(col < opts.numCols-1 && matrix[row][col+1] & FLAG_USED)
|
|
||||||
) {
|
) {
|
||||||
col++; continue;
|
photoId++; col++; continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Number of photos left
|
||||||
|
const numLeft = input.length-photoId-1;
|
||||||
|
// Number of photos needed for perfect fill after using n
|
||||||
|
const needFill = (n: number) => ((opts.numCols-col-2) + (n/2-1)*(opts.numCols-2));
|
||||||
|
|
||||||
// Check if we can use 4 blocks
|
// Check if we can use 4 blocks
|
||||||
let canUse4 =
|
let canUse4 =
|
||||||
// We have enough space
|
// We have enough space
|
||||||
(row + 1 < matrix.length && col+1 < opts.numCols) &&
|
(row + 1 < matrix.length && col+1 < opts.numCols) &&
|
||||||
// Nothing used in vicinity (redundant check)
|
|
||||||
!(matrix[row+1][col] & FLAG_USED) &&
|
|
||||||
!(matrix[row][col+1] & FLAG_USED) &&
|
|
||||||
!(matrix[row+1][col+1] & FLAG_USED) &&
|
|
||||||
// This cannot end up being a widow (conservative)
|
// This cannot end up being a widow (conservative)
|
||||||
(input.length-photoId-1 >= ((opts.numCols-col-2) + (opts.numCols-2)));
|
// Also make sure the next row gets fully filled, otherwise looks weird
|
||||||
|
(numLeft === needFill(4) || numLeft >= needFill(4)+opts.numCols);
|
||||||
|
|
||||||
|
let canUse6 =
|
||||||
|
// Image is portrait
|
||||||
|
input[photoId].height > input[photoId].width &&
|
||||||
|
// We have enough space
|
||||||
|
(row + 2 < matrix.length && col+1 < opts.numCols) &&
|
||||||
|
// This cannot end up being a widow (conservative)
|
||||||
|
// Also make sure the next row gets fully filled, otherwise looks weird
|
||||||
|
(numLeft === needFill(6) || numLeft >= needFill(6)+2*opts.numCols);
|
||||||
|
|
||||||
|
if (canUse6 && Math.random() < 0.2) {
|
||||||
|
// Use 6
|
||||||
|
matrix[row][col] |= FLAG_USE6;
|
||||||
|
matrix[row+1][col] |= FLAG_USED;
|
||||||
|
matrix[row+2][col] |= FLAG_USED;
|
||||||
|
matrix[row][col+1] |= FLAG_USED;
|
||||||
|
matrix[row+1][col+1] |= FLAG_USED;
|
||||||
|
matrix[row+2][col+1] |= FLAG_USED;
|
||||||
|
}
|
||||||
|
|
||||||
// Use four with 60% probability
|
// Use four with 60% probability
|
||||||
if (canUse4 && Math.random() < 0.6) {
|
else if (canUse4 && Math.random() < 0.5) {
|
||||||
|
// Use 4
|
||||||
matrix[row][col] |= FLAG_USE4;
|
matrix[row][col] |= FLAG_USE4;
|
||||||
matrix[row+1][col] |= FLAG_USED;
|
matrix[row+1][col] |= FLAG_USED;
|
||||||
matrix[row][col+1] |= FLAG_USED;
|
matrix[row][col+1] |= FLAG_USED;
|
||||||
|
@ -91,13 +112,9 @@ export function getLayout(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go ahead
|
// Go ahead
|
||||||
col++;
|
photoId++; col++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// REMOVE BEFORE PUSH
|
|
||||||
if (input.length == 10)
|
|
||||||
console.log(flagMatrixStr(matrix, 3));
|
|
||||||
|
|
||||||
// Square layout matrix
|
// Square layout matrix
|
||||||
const absMatrix: {
|
const absMatrix: {
|
||||||
top: number,
|
top: number,
|
||||||
|
@ -131,10 +148,15 @@ export function getLayout(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use twice the space
|
// Use twice the space
|
||||||
if (matrix[row][col] & FLAG_USE4) {
|
const v = matrix[row][col];
|
||||||
|
if (v & FLAG_USE4) {
|
||||||
p.width *= 2;
|
p.width *= 2;
|
||||||
p.height *= 2;
|
p.height *= 2;
|
||||||
col += 2;
|
col += 2;
|
||||||
|
} else if (v & FLAG_USE6) {
|
||||||
|
p.width *= 2;
|
||||||
|
p.height *= 3;
|
||||||
|
col += 2;
|
||||||
} else {
|
} else {
|
||||||
col += 1;
|
col += 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue