Refactor RigidBodyBehaviors
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
286a5e9c00
commit
82eae4971e
1 changed files with 74 additions and 62 deletions
|
@ -181,6 +181,17 @@ export function constraintBodyInsideUnallocatedWidth(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a container can fit inside a size space
|
||||||
|
* @param container Container to check
|
||||||
|
* @param sizePointer Size space to check
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const isFitting = (
|
||||||
|
container: IContainerModel,
|
||||||
|
sizePointer: ISizePointer
|
||||||
|
): boolean => container.properties.width <= sizePointer.width;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the unallocated widths inside a container
|
* Get the unallocated widths inside a container
|
||||||
* An allocated width is defined by its the widths of the children that are rigid bodies.
|
* An allocated width is defined by its the widths of the children that are rigid bodies.
|
||||||
|
@ -222,10 +233,9 @@ function getAvailableWidths(
|
||||||
// We need to calculate the overlap between the two containers
|
// We need to calculate the overlap between the two containers
|
||||||
// We only works with widths meaning in 1D (with lines)
|
// We only works with widths meaning in 1D (with lines)
|
||||||
const newUnallocatedWidths = getAvailableWidthsTwoLines(
|
const newUnallocatedWidths = getAvailableWidthsTwoLines(
|
||||||
unallocatedSpace.x,
|
unallocatedSpace,
|
||||||
unallocatedSpace.x + unallocatedSpace.width,
|
|
||||||
childX,
|
childX,
|
||||||
childX + childWidth
|
childWidth
|
||||||
);
|
);
|
||||||
|
|
||||||
// Concat the new list of SizePointer pointing to availables spaces
|
// Concat the new list of SizePointer pointing to availables spaces
|
||||||
|
@ -240,88 +250,90 @@ function getAvailableWidths(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the unallocated widths between two lines in 1D
|
* Returns the unallocated widths between two lines in 1D
|
||||||
* @param unalloctedSpaceLeft left of the first line
|
* @param unalloctedSpace unallocated space
|
||||||
* @param unallocatedSpaceRight rigth of the first line
|
* @param rectX left of the second line
|
||||||
* @param rectLeft left of the second line
|
* @param rectWidth width of the second line
|
||||||
* @param rectRight right of the second line
|
|
||||||
* @returns Available widths
|
* @returns Available widths
|
||||||
*/
|
*/
|
||||||
function getAvailableWidthsTwoLines(
|
function getAvailableWidthsTwoLines(
|
||||||
unalloctedSpaceLeft: number,
|
unallocatedSpace: ISizePointer,
|
||||||
unallocatedSpaceRight: number,
|
rectX: number,
|
||||||
rectLeft: number,
|
rectWidth: number
|
||||||
rectRight: number
|
|
||||||
): ISizePointer[] {
|
): ISizePointer[] {
|
||||||
// let object 1 be the unallocated space
|
const unallocatedSpaceRight = unallocatedSpace.x + unallocatedSpace.width;
|
||||||
// and object 2 be the rect
|
const rectRight = rectX + rectWidth;
|
||||||
|
|
||||||
if (unallocatedSpaceRight < rectLeft ||
|
const isNotOverlapping = unallocatedSpaceRight < rectX ||
|
||||||
unalloctedSpaceLeft > rectRight
|
unallocatedSpace.x > rectRight;
|
||||||
) {
|
if (isNotOverlapping) {
|
||||||
// object 1 and 2 are not overlapping
|
return [unallocatedSpace];
|
||||||
return [{
|
|
||||||
x: unalloctedSpaceLeft,
|
|
||||||
width: unallocatedSpaceRight - unalloctedSpaceLeft
|
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rectLeft < unalloctedSpaceLeft && rectRight > unallocatedSpaceRight) {
|
const isOverlappingFullWidth = rectX < unallocatedSpace.x && rectRight > unallocatedSpaceRight;
|
||||||
// object 2 is overlapping full width
|
if (isOverlappingFullWidth) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unalloctedSpaceLeft >= rectLeft) {
|
const isOverlappingOnTheLeft = unallocatedSpace.x >= rectX;
|
||||||
// object 2 is partially overlapping on the left
|
if (isOverlappingOnTheLeft) {
|
||||||
if (unallocatedSpaceRight - rectRight <= 0) {
|
return getAvailableWidthsLeft(unallocatedSpaceRight, rectRight);
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
x: rectRight,
|
|
||||||
width: unallocatedSpaceRight - rectRight
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rectRight >= unallocatedSpaceRight) {
|
const isOverlappingOnTheRight = rectRight >= unallocatedSpaceRight;
|
||||||
// object 2 is partially overlapping on the right
|
if (isOverlappingOnTheRight) {
|
||||||
if (unalloctedSpaceLeft - rectRight <= 0) {
|
return getAvailableWidthsRight(unallocatedSpace.x, rectRight);
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
x: unalloctedSpaceLeft,
|
|
||||||
width: rectRight - unalloctedSpaceLeft
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// object 2 is overlapping in the middle
|
return getAvailableWidthsMiddle(unallocatedSpace.x, unallocatedSpaceRight, rectX, rectRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAvailableWidthsLeft(unallocatedSpaceRight: number, rectRight: number): ISizePointer[] {
|
||||||
|
if (unallocatedSpaceRight - rectRight <= 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
x: rectRight,
|
||||||
|
width: unallocatedSpaceRight - rectRight
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAvailableWidthsRight(unalloctedSpaceX: number, rectRight: number): ISizePointer[] {
|
||||||
|
if (rectRight - unalloctedSpaceX <= 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
x: unalloctedSpaceX,
|
||||||
|
width: rectRight - unalloctedSpaceX
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAvailableWidthsMiddle(
|
||||||
|
unalloctedSpaceX: number,
|
||||||
|
unallocatedSpaceRight: number,
|
||||||
|
rectX: number,
|
||||||
|
rectRight: number
|
||||||
|
): ISizePointer[] {
|
||||||
const sizePointers: ISizePointer[] = [];
|
const sizePointers: ISizePointer[] = [];
|
||||||
if (rectLeft - unalloctedSpaceLeft > 0) {
|
|
||||||
|
if (rectX - unalloctedSpaceX > 0) {
|
||||||
sizePointers.push({
|
sizePointers.push({
|
||||||
x: unalloctedSpaceLeft,
|
x: unalloctedSpaceX,
|
||||||
width: rectLeft - unalloctedSpaceLeft
|
width: rectX - unalloctedSpaceX
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unallocatedSpaceRight - rectRight > 0) {
|
if (unallocatedSpaceRight - rectRight > 0) {
|
||||||
sizePointers.push({
|
sizePointers.push({
|
||||||
x: rectRight,
|
x: rectRight,
|
||||||
width: unallocatedSpaceRight - rectRight
|
width: unallocatedSpaceRight - rectRight
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return sizePointers;
|
return sizePointers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a container can fit inside a size space
|
|
||||||
* @param container Container to check
|
|
||||||
* @param sizePointer Size space to check
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
const isFitting = (
|
|
||||||
container: IContainerModel,
|
|
||||||
sizePointer: ISizePointer
|
|
||||||
): boolean => container.properties.width <= sizePointer.width;
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue