cannon-es-control
Version:
A lightweight 3D physics engine written in JavaScript with control system tools
96 lines (86 loc) • 1.88 kB
text/typescript
export class OverlapKeeper {
current: number[]
previous: number[]
/**
* @todo Remove useless constructor
*/
constructor() {
this.current = []
this.previous = []
}
/**
* getKey
*/
getKey(i: number, j: number): number {
if (j < i) {
const temp = j
j = i
i = temp
}
return (i << 16) | j
}
/**
* set
*/
set(i: number, j: number): void {
// Insertion sort. This way the diff will have linear complexity.
const key = this.getKey(i, j)
const current = this.current
let index = 0
while (key > current[index]) {
index++
}
if (key === current[index]) {
return // Pair was already added
}
for (let j = current.length - 1; j >= index; j--) {
current[j + 1] = current[j]
}
current[index] = key
}
/**
* tick
*/
tick(): void {
const tmp = this.current
this.current = this.previous
this.previous = tmp
this.current.length = 0
}
/**
* getDiff
*/
getDiff(additions: number[], removals: number[]): void {
const a = this.current
const b = this.previous
const al = a.length
const bl = b.length
let j = 0
for (let i = 0; i < al; i++) {
let found = false
const keyA = a[i]
while (keyA > b[j]) {
j++
}
found = keyA === b[j]
if (!found) {
unpackAndPush(additions, keyA)
}
}
j = 0
for (let i = 0; i < bl; i++) {
let found = false
const keyB = b[i]
while (keyB > a[j]) {
j++
}
found = a[j] === keyB
if (!found) {
unpackAndPush(removals, keyB)
}
}
}
}
function unpackAndPush(array: number[], key: number): void {
array.push((key & 0xffff0000) >> 16, key & 0x0000ffff)
}