UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

296 lines • 7.39 kB
export const COLUMN_PARENT: 4; export const COLUMN_CHILD_1: 5; export const COLUMN_CHILD_2: 6; export const COLUMN_HEIGHT: 7; /** * A non-leaf node have both CHILD_1 and CHILD_2 set, when CHILD_1 is not set - it's a leaf node * So we can utilize space of CHILD_2 to store USER_DATA, hence there is overlap in schema * @readonly * @type {number} */ export const COLUMN_USER_DATA: number; /** * * @type {number} */ export const NULL_NODE: number; /** * How many words are used for a single NODE in the tree * One "word" is 4 bytes for the sake of alignment * @readonly * @type {number} */ export const ELEMENT_WORD_COUNT: number; /** * 2D Bounding Volume Hierarchy implementation. * Based on BVH (3D) implementation * @class */ export class BVH2D { /** * * @type {ArrayBuffer} * @private */ private __data_buffer; /** * * @type {Float32Array} * @private */ private __data_float32; /** * * @type {Uint32Array} * @private */ private __data_uint32; /** * How many nodes are currently reserved, this will grow automatically through {@link #allocate_node} method usage * @type {number} * @private */ private __capacity; /** * Number of used nodes. These are either live nodes, or node sitting in the {@link #__free} pool * @type {number} * @private */ private __size; /** * Indices of released nodes. Nodes are pulled from here first if available, before the whole tree gets resized * @type {number[]} * @private */ private __free; /** * Pointer into __free array that's used as a stack, so this pointer represents top of the stack * @type {number} * @private */ private __free_pointer; /** * Root node of the hierarchy * @type {number} * @private */ private __root; /** * * @returns {number} */ get root(): number; /** * * @param {number} v */ set node_capacity(v: number); /** * * @returns {number} */ get node_capacity(): number; __grow_capacity(): void; /** * * @param {number} new_capacity in number of nodes * @private */ private __set_capacity; /** * Trim allocated memory region to only contain allocated nodes */ trim(): void; /** * * @returns {number} */ allocate_node(): number; /** * Release memory used by the node back into the pool * NOTE: Make sure that the node is not "live" (not attached to the hierarchy), otherwise this operation may corrupt the tree * @param {number} id */ release_node(id: number): void; /** * * @param {number} id * @returns {boolean} */ node_is_leaf(id: number): boolean; /** * * @param {number} id * @returns {number} */ node_get_user_data(id: number): number; /** * * @param {number} id * @param {number} value */ node_set_user_data(id: number, value: number): void; /** * * @param {number} id * @returns {number} */ node_get_child1(id: number): number; /** * * @param {number} node * @param {number} child1 */ node_set_child1(node: number, child1: number): void; /** * * @param {number} id * @returns {number} */ node_get_child2(id: number): number; /** * * @param {number} node * @param {number} child2 */ node_set_child2(node: number, child2: number): void; /** * * @param {number} id * @returns {number} */ node_get_parent(id: number): number; /** * * @param {number} node * @param {number} parent */ node_set_parent(node: number, parent: number): void; /** * * @param {number} id * @returns {number} */ node_get_height(id: number): number; /** * * @param {number} id * @param {number} height */ node_set_height(id: number, height: number): void; /** * * @param {number} id * @param {number[]|Float32Array} result */ node_get_aabb(id: number, result: number[] | Float32Array): void; /** * * @param {number} id * @param {number[]|ArrayLike<number>} aabb */ node_set_aabb(id: number, aabb: number[] | ArrayLike<number>): void; /** * * @param {number} id * @param {number[]} aabb */ node_move_aabb(id: number, aabb: number[]): void; /** * * @param {number} id * @param {number} x0 * @param {number} y0 * @param {number} z0 * @param {number} x1 * @param {number} y1 * @param {number} z1 */ node_set_aabb_primitive(id: number, x0: number, y0: number, x1: number, y1: number): void; /** * * @param {number} id * @returns {number} */ node_get_surface_area(id: number): number; /** * * @param {number} index_a * @param {number} index_b * @returns {number} */ node_get_combined_surface_area(index_a: number, index_b: number): number; /** * * @param {number} destination * @param {number} index_a * @param {number} index_b */ node_set_combined_aabb(destination: number, index_a: number, index_b: number): void; /** * * @param {number} leaf * @returns {void} */ insert_leaf(leaf: number): void; /** * refit and update nodes up the tree. Only updates bounds * NOTE: Does not update "height" * @param {number} parent * @private */ private bubble_up_refit; /** * refit and update nodes up the tree * @param {number} parent * @private */ private bubble_up_update; /** * NOTE: Leaf node is not released, make sure to call {@link #release_node} separately when you no longer need the leaf node * @param {number} leaf * @returns {void} */ remove_leaf(leaf: number): void; /** * Perform a left or right rotation if node A is imbalanced. * Returns the new root index. * @param {number} iA * @returns {number} * @private */ private balance; /** * Release all nodes, this essentially resets the tree to empty state * NOTE: For performance reasons, released memory is not reset, this means that attempting to access cleared nodes' memory will yield garbage data */ release_all(): void; /** * * @param {function(node:number, tree:BVH):void} callback * @param {*} [ctx] */ traverse(callback: any, ctx?: any): void; /** * * @param {number[]} destination * @param {number} destination_offset * @returns {number} */ collect_nodes_all(destination: number[], destination_offset: number): number; /** * Update parent and child links of a given node to point to a new location, useful for re-locating nodes * @param {number} node node to update * @param {number} destination Where updated links should point to * @private */ private __move_node_links; /** * Swap two nodes in memory * @param {number} a * @param {number} b * @returns {boolean} */ swap_nodes(a: number, b: number): boolean; } //# sourceMappingURL=BVH2D.d.ts.map