Skip to content

Commit ce1fec9

Browse files
committed
Use more generic types
to avoid breakage
1 parent de0f1cb commit ce1fec9

5 files changed

Lines changed: 34 additions & 38 deletions

File tree

src/core/Octree.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { Box3, Raycaster, Vector3 } from "three";
22
import { OctreeRaycaster } from "../raycasting/index.js";
33
import { BoxIntersector } from "./BoxIntersector.js";
44
import { Node } from "./Node.js";
5-
import { Octant } from "./Octant.js";
65
import { OctreeIterator } from "./OctreeIterator.js";
76
import { Tree } from "./Tree.js";
87

@@ -110,24 +109,24 @@ function findNodesByLevel(node: Node, level: number, depth: number, result: Node
110109
/**
111110
* A pointer-based octree that subdivides space for fast spatial searches.
112111
*
113-
* @param T - The type of the data stored in the octants.
112+
* @param T - The type of the octants.
114113
*/
115114

116-
export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
115+
export class Octree<T extends Node = Node> implements Tree<T>, Iterable<T> {
117116

118117
/**
119118
* The root octant.
120119
*/
121120

122-
protected root: Octant<T>;
121+
protected root: T;
123122

124123
/**
125124
* Constructs a new octree.
126125
*
127126
* @param root - The root node. See {@link Octant} or {@link CubicOctant}.
128127
*/
129128

130-
constructor(root: Octant<T>) {
129+
constructor(root: T) {
131130

132131
this.root = root;
133132

@@ -145,9 +144,9 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
145144

146145
}
147146

148-
get children(): Octant<T>[] | null {
147+
get children(): T[] | null {
149148

150-
return this.root.children ?? null;
149+
return (this.root.children ?? null) as T[] | null;
151150

152151
}
153152

@@ -170,9 +169,9 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
170169
* @return The nodes.
171170
*/
172171

173-
cull(region: BoxIntersector): Octant<T>[] {
172+
cull(region: BoxIntersector): T[] {
174173

175-
const result: Octant<T>[] = [];
174+
const result: T[] = [];
176175
cull(this.root, region, result);
177176
return result;
178177

@@ -197,9 +196,9 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
197196
* @return The nodes.
198197
*/
199198

200-
findNodesByLevel(level: number): Octant<T>[] {
199+
findNodesByLevel(level: number): T[] {
201200

202-
const result: Octant<T>[] = [];
201+
const result: T[] = [];
203202
findNodesByLevel(this.root, level, 0, result);
204203
return result;
205204

@@ -212,9 +211,9 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
212211
* @return The intersecting nodes.
213212
*/
214213

215-
getIntersectingNodes(raycaster: Raycaster): Octant<T>[] {
214+
getIntersectingNodes(raycaster: Raycaster): T[] {
216215

217-
return OctreeRaycaster.intersectOctree(this.root, raycaster.ray) as Octant<T>[];
216+
return OctreeRaycaster.intersectOctree(this.root, raycaster.ray) as T[];
218217

219218
}
220219

@@ -229,7 +228,7 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
229228

230229
leaves(region: BoxIntersector | null = null): OctreeIterator<T> {
231230

232-
return new OctreeIterator(this.root, region);
231+
return new OctreeIterator<T>(this.root, region);
233232

234233
}
235234

@@ -239,7 +238,7 @@ export class Octree<T = unknown> implements Tree, Iterable<Octant<T>> {
239238
* @return An iterator.
240239
*/
241240

242-
[Symbol.iterator](): Iterator<Octant<T>> {
241+
[Symbol.iterator](): Iterator<T> {
243242

244243
return new OctreeIterator<T>(this.root);
245244

src/core/OctreeIterator.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
import { Box3 } from "three";
22
import { Node } from "./Node.js";
3-
import { Octant } from "./Octant.js";
43
import { BoxIntersector } from "./BoxIntersector.js";
54

65
const b = /* @__PURE__ */ new Box3();
76

87
/**
98
* An octree iterator.
109
*
11-
* @param T - The type of the data stored in the octants.
10+
* @param T - The type of the octants.
1211
*/
1312

14-
export class OctreeIterator<T = unknown> implements Iterator<Octant<T>>, Iterable<Octant<T>> {
13+
export class OctreeIterator<T extends Node = Node> implements Iterator<T>, Iterable<T> {
1514

1615
/**
1716
* The root node.
1817
*/
1918

20-
private root: Node;
19+
private root: T;
2120

2221
/**
2322
* A region used for octree culling.
@@ -29,7 +28,7 @@ export class OctreeIterator<T = unknown> implements Iterator<Octant<T>>, Iterabl
2928
* An iterator result.
3029
*/
3130

32-
private result!: IteratorResult<Octant<T>>;
31+
private result!: IteratorResult<T>;
3332

3433
/**
3534
* A node trace.
@@ -50,7 +49,7 @@ export class OctreeIterator<T = unknown> implements Iterator<Octant<T>>, Iterabl
5049
* @param region - A cull region.
5150
*/
5251

53-
constructor(root: Node, region: BoxIntersector | null = null) {
52+
constructor(root: T, region: BoxIntersector | null = null) {
5453

5554
this.root = root;
5655
this.region = region;
@@ -87,13 +86,13 @@ export class OctreeIterator<T = unknown> implements Iterator<Octant<T>>, Iterabl
8786

8887
this.result = {
8988
done: false
90-
} as IteratorResult<Octant<T>>;
89+
} as IteratorResult<T>;
9190

9291
return this;
9392

9493
}
9594

96-
next(): IteratorResult<Octant<T>> {
95+
next(): IteratorResult<T> {
9796

9897
const region = this.region;
9998
const indices = this.indices;
@@ -157,7 +156,7 @@ export class OctreeIterator<T = unknown> implements Iterator<Octant<T>>, Iterabl
157156

158157
}
159158

160-
[Symbol.iterator](): Iterator<Octant<T>> {
159+
[Symbol.iterator](): Iterator<T> {
161160

162161
return this;
163162

src/core/Tree.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Node } from "./Node.js";
44
* A tree data structure.
55
*/
66

7-
export interface Tree extends Node {
7+
export interface Tree<T extends Node = Node> extends Node {
88

99
/**
1010
* Calculates the depth of this tree.
@@ -21,6 +21,6 @@ export interface Tree extends Node {
2121
* @return The nodes.
2222
*/
2323

24-
findNodesByLevel(level: number): Node[];
24+
findNodesByLevel(level: number): T[];
2525

2626
}

src/points/PointOctant.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ export class PointOctant<T = unknown> extends Octant<PointData<T>> {
147147

148148
for(let i = 0, l = children.length; i < l; ++i) {
149149

150-
const child = children[i] as PointOctant<T>;
151-
const childData = child.data;
150+
const childData = children[i].data;
152151

153152
if(childData !== null) {
154153

src/points/PointOctree.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ function findPoints<T>(point: Vector3, radius: number, skipSelf: boolean,
497497
* @param T - The type of the data.
498498
*/
499499

500-
export class PointOctree<T = unknown> extends Octree<PointData<T>> {
500+
export class PointOctree<T = unknown> extends Octree<PointOctant<T>> {
501501

502502
/**
503503
* An octant boundary bias.
@@ -585,7 +585,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
585585
* @return The amount of points.
586586
*/
587587

588-
countPoints(octant: PointOctant<T> = this.root as PointOctant<T>): number {
588+
countPoints(octant: PointOctant<T> = this.root): number {
589589

590590
return countPoints(octant);
591591

@@ -603,7 +603,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
603603

604604
set(point: Vector3, data: T): boolean {
605605

606-
return set(point, data, this, this.root as PointOctant<T>, 0);
606+
return set(point, data, this, this.root, 0);
607607

608608
}
609609

@@ -616,7 +616,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
616616

617617
remove(point: Vector3): T | null {
618618

619-
return remove(point, this, this.root as PointOctant<T>, null);
619+
return remove(point, this, this.root, null);
620620

621621
}
622622

@@ -629,7 +629,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
629629

630630
get(point: Vector3): T | null {
631631

632-
return get(point, this, this.root as PointOctant<T>);
632+
return get(point, this, this.root);
633633

634634
}
635635

@@ -643,7 +643,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
643643

644644
move(point: Vector3, position: Vector3): T | null {
645645

646-
return move(point, position, this, this.root as PointOctant<T>, null, 0);
646+
return move(point, position, this, this.root, null, 0);
647647

648648
}
649649

@@ -658,8 +658,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
658658

659659
findNearestPoint(point: Vector3, maxDistance = Number.POSITIVE_INFINITY, skipSelf = false): PointContainer<T> | null {
660660

661-
const root = this.root as PointOctant<T>;
662-
const result = findNearestPoint(point, maxDistance, skipSelf, root);
661+
const result = findNearestPoint(point, maxDistance, skipSelf, this.root);
663662

664663
if(result !== null && result.point !== null) {
665664

@@ -683,7 +682,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
683682
findPoints(point: Vector3, radius: number, skipSelf = false): PointContainer<T>[] {
684683

685684
const result: PointContainer<T>[] = [];
686-
findPoints(point, radius, skipSelf, this.root as PointOctant<T>, result);
685+
findPoints(point, radius, skipSelf, this.root, result);
687686
return result;
688687

689688
}
@@ -698,7 +697,7 @@ export class PointOctree<T = unknown> extends Octree<PointData<T>> {
698697
raycast(raycaster: Raycaster): RayPointIntersection<T>[] {
699698

700699
const result: RayPointIntersection<T>[] = [];
701-
const octants = super.getIntersectingNodes(raycaster) as PointOctant<T>[];
700+
const octants = super.getIntersectingNodes(raycaster);
702701

703702
if(octants.length > 0) {
704703

0 commit comments

Comments
 (0)