cube-parameters
Version:
A sophisticated 3D model viewer built with React, TypeScript, and Three.js, featuring advanced visualization tools, measurement capabilities, and lighting controls.
104 lines (83 loc) • 2.16 kB
text/typescript
import * as THREE from 'three';
class Pool<T> {
private objects: T[] = [];
private createFn: () => T;
private resetFn?: (obj: T) => void;
constructor(createFn: () => T, resetFn?: (obj: T) => void, initialSize = 5) {
this.createFn = createFn;
this.resetFn = resetFn;
// Pre-populate pool
for (let i = 0; i < initialSize; i++) {
this.objects.push(this.createFn());
}
}
get(): T {
if (this.objects.length > 0) {
return this.objects.pop()!;
}
return this.createFn();
}
release(obj: T) {
if (this.resetFn) {
this.resetFn(obj);
}
this.objects.push(obj);
}
clear() {
this.objects.length = 0;
}
}
export class ObjectPool {
private static instance: ObjectPool;
private raycasterPool: Pool<THREE.Raycaster>;
private vector3Pool: Pool<THREE.Vector3>;
private vector2Pool: Pool<THREE.Vector2>;
private constructor() {
this.raycasterPool = new Pool(
() => new THREE.Raycaster(),
(raycaster) => {
raycaster.ray.origin.set(0, 0, 0);
raycaster.ray.direction.set(0, 0, -1);
raycaster.near = 0;
raycaster.far = Infinity;
}
);
this.vector3Pool = new Pool(
() => new THREE.Vector3(),
(vector) => vector.set(0, 0, 0)
);
this.vector2Pool = new Pool(
() => new THREE.Vector2(),
(vector) => vector.set(0, 0)
);
}
static getInstance(): ObjectPool {
if (!ObjectPool.instance) {
ObjectPool.instance = new ObjectPool();
}
return ObjectPool.instance;
}
getRaycaster(): THREE.Raycaster {
return this.raycasterPool.get();
}
releaseRaycaster(raycaster: THREE.Raycaster) {
this.raycasterPool.release(raycaster);
}
getVector3(): THREE.Vector3 {
return this.vector3Pool.get();
}
releaseVector3(vector: THREE.Vector3) {
this.vector3Pool.release(vector);
}
getVector2(): THREE.Vector2 {
return this.vector2Pool.get();
}
releaseVector2(vector: THREE.Vector2) {
this.vector2Pool.release(vector);
}
clear() {
this.raycasterPool.clear();
this.vector3Pool.clear();
this.vector2Pool.clear();
}
}