Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sleitnick/rbxts-octo-tree
Octree implementation
https://github.com/sleitnick/rbxts-octo-tree
octree roblox
Last synced: about 2 months ago
JSON representation
Octree implementation
- Host: GitHub
- URL: https://github.com/sleitnick/rbxts-octo-tree
- Owner: Sleitnick
- Created: 2022-07-01T19:42:05.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-02-27T20:50:49.000Z (almost 2 years ago)
- Last Synced: 2024-04-27T03:03:48.412Z (8 months ago)
- Topics: octree, roblox
- Language: Lua
- Homepage: https://www.npmjs.com/package/@rbxts/octo-tree
- Size: 93.8 KB
- Stars: 14
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# OctoTree
Octree implementation for Roblox game development. Octrees are useful data structure for performing fast spatial queries for objects within a 3D space.
Roblox also provides some generalized spatial query methods, such as [`GetPartBoundsInRadius`](https://developer.roblox.com/en-us/api-reference/function/WorldRoot/GetPartBoundsInRadius). These methods are useful for general purposes, but a special Octree can still be much faster for specific use-cases. For instance, having a bunch of collectables in the world.
## Types
```ts
interface Node {
readonly Position: Vector3;
readonly Object: T;
}
```## Constructor
```ts
Octree.new();
Octree.new(topRegionSize: number);
```
In most cases, it is preferred to leave out the `topRegionSize` and use the default. The `topRegionSize` represents the cubic size of the top-level regions. By default, this is set to `512`, which means the top-level regions have a 3D size of `512x512x512`. Type `T` represents the arbitrary object that is held within each node.## Methods
### `CreateNode`
```ts
CreateNode(position: Vector3, object: T): Node;const node = octree.CreateNode(someVector3, someObject);
```
Creates a `Node` within the octree at the given position. An arbitrary object can be given to the node as well.### `RemoveNode`
```ts
RemoveNode(node: Node): void;octree.RemoveNode(node);
```
Removes the node from the octree. If the desire is to remove all nodes from the octree, use `ClearAllNodes()` instead.### `ChangeNodePosition`
```ts
ChangeNodePosition(node: Node, position: Vector3): void;octree.ChangeNodePosition(node, someNewVector3);
print(node.Position);
```
Change the position of the given node to the new `position`. Due to the internal workings of the octree, this is can be a fairly expensive operation. It is usually beneficial to keep most nodes as static as possible. Only change the position if necessary. **Note:** This is still faster than removing the node and creating a new one at a different position.### `GetAllNodes`
```ts
GetAllNodes(): Array>;const nodes = octree.GetAllNodes();
for (const node of nodes) {}
```
Get an array of all the nodes in the octree. This can be an expensive operation, as all regions and subregions in the octree must be traversed.### `ForEachNode`
```ts
ForEachNode(): IterableFunction>;for (const node of octree.ForEachNode()) {}
```
Iterate over each node in the octree. This is useful if the desire is to scan through each node, but perhaps have a break within the loop, which will keep it from having to scan all nodes.### `CountNodes`
```ts
CountNodes(): number;const numNodes = octree.CountNodes();
```
Count the number of nodes in the octree. Similar to `GetAllNodes()`, this can be an expensive operation.### `ClearAllNodes`
```ts
ClearAllNodes(): void;octree.ClearAllNodes();
```
Removes all nodes from the octree. This is a very quick operation and should be used instead of calling `RemoveNode()` on all nodes.### `FindFirstNode`
```ts
FindFirstNode(object: T): Node | undefined;const node = octree.FindFirstNode(someObject);
if (node !== undefined) {}
```
Finds the first node in the octree that has the same object. If no object is found, `undefined` is returned instead.### `SearchRadius`
```ts
SearchRadius(position: Vector3, radius: number): Array>;const nearbyNodes = octree.SearchRadius(somePosition, 200);
for (const node of nearbyNodes) {}
```
Performs a search for all nodes within the given radius. An array of all the nodes found is returned.### `ForEachInRadius`
```ts
ForEachInRadius(position: Vector3, radius: number): IterableFunction>;for (const node of octree.ForEachInRadius(somePosition, 200)) {}
```
Same as `SearchRadius`, except an iterator function is returned instead of a table. Unless a table of nodes is needed, `ForEachInRadius` will be faster than `SearchRadius` (because no table allocations are needed).### `GetNearest`
```ts
GetNearest(position: Vector3, radius: number, maxNodes?: number): Array>;const topTenNearest = octree.GetNearest(somePosition, 200, 10);
for (const node of topTenNearest) {}
```
Performs a radius search (same as the `SearchRadius()` method), but sorts the nodes by distance. If the `maxNodes` parameter is used, the amount of nodes returned will be limited to that number.