Skip to content

Commit 5f40d89

Browse files
committed
refactor(soba): clean up abstractions
1 parent c56b03e commit 5f40d89

File tree

13 files changed

+125
-110
lines changed

13 files changed

+125
-110
lines changed

libs/soba/abstractions/src/lib/billboard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import {
66
input,
77
viewChild,
88
} from '@angular/core';
9-
import { extend, injectBeforeRender, NgtGroup, omit } from 'angular-three';
9+
import { extend, injectBeforeRender, NgtThreeElements, omit } from 'angular-three';
1010
import { mergeInputs } from 'ngxtension/inject-inputs';
1111
import { Group, Quaternion } from 'three';
1212

13-
export interface NgtsBillboardOptions extends Partial<NgtGroup> {
13+
export interface NgtsBillboardOptions extends Partial<NgtThreeElements['ngt-group']> {
1414
follow?: boolean;
1515
lockX?: boolean;
1616
lockY?: boolean;

libs/soba/abstractions/src/lib/catmull-rom-line.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ChangeDetectionStrategy, Component, computed, input, untracked, viewChild } from '@angular/core';
22
import { omit, pick } from 'angular-three';
33
import { mergeInputs } from 'ngxtension/inject-inputs';
4-
import { CatmullRomCurve3, Color, Vector3 } from 'three';
4+
import * as THREE from 'three';
55
import { NgtsLine, NgtsLineOptions } from './line';
66

77
export interface NgtsCatmullRomLineOptions extends Omit<NgtsLineOptions, 'segments'> {
@@ -30,7 +30,7 @@ const defaultOptions: NgtsCatmullRomLineOptions = {
3030
imports: [NgtsLine],
3131
})
3232
export class NgtsCatmullRomLine {
33-
points = input.required<Array<Vector3 | [number, number, number]>>();
33+
points = input.required<Array<THREE.Vector3 | [number, number, number]>>();
3434
options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
3535
parameters = omit(this.options, ['curveType', 'tension', 'segments', 'closed', 'vertexColors']);
3636

@@ -46,10 +46,10 @@ export class NgtsCatmullRomLine {
4646
const [points, closed, curveType, tension] = [this.points(), this.closed(), this.curveType(), this.tension()];
4747

4848
const mappedPoints = points.map((pt) =>
49-
pt instanceof Vector3 ? pt : new Vector3(...(pt as [number, number, number])),
49+
(pt as THREE.Vector3).isVector3 ? (pt as THREE.Vector3) : new THREE.Vector3(...(pt as [number, number, number])),
5050
);
5151

52-
return new CatmullRomCurve3(mappedPoints, closed, curveType, tension);
52+
return new THREE.CatmullRomCurve3(mappedPoints, closed, curveType, tension);
5353
});
5454

5555
segmentedPoints = computed(() => {
@@ -64,11 +64,11 @@ export class NgtsCatmullRomLine {
6464
if (vertexColors.length === segments + 1) return vertexColors;
6565

6666
const mappedColors = vertexColors.map((color) =>
67-
color instanceof Color ? color : new Color(...(color as [number, number, number])),
67+
(color as THREE.Color).isColor ? (color as THREE.Color) : new THREE.Color(...(color as [number, number, number])),
6868
);
6969
if (untracked(this.closed)) mappedColors.push(mappedColors[0].clone());
7070

71-
const iColors: Color[] = [mappedColors[0]];
71+
const iColors: THREE.Color[] = [mappedColors[0]];
7272
const divisions = segments / (mappedColors.length - 1);
7373
for (let i = 1; i < segments; i++) {
7474
const alpha = (i % divisions) / divisions;

libs/soba/abstractions/src/lib/cubic-bezier-line.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ChangeDetectionStrategy, Component, computed, input, viewChild } from '@angular/core';
2-
import { omit, pick } from 'angular-three';
2+
import { is, omit, pick } from 'angular-three';
33
import { mergeInputs } from 'ngxtension/inject-inputs';
4-
import { CubicBezierCurve3, Vector3 } from 'three';
4+
import * as THREE from 'three';
55
import { NgtsLine, NgtsLineOptions } from './line';
66

77
export interface NgtsCubicBezierLineOptions extends Omit<NgtsLineOptions, 'segments'> {
@@ -24,10 +24,10 @@ const defaultOptions: NgtsCubicBezierLineOptions = {
2424
imports: [NgtsLine],
2525
})
2626
export class NgtsCubicBezierLine {
27-
start = input.required<Vector3 | [number, number, number]>();
28-
end = input.required<Vector3 | [number, number, number]>();
29-
midA = input.required<Vector3 | [number, number, number]>();
30-
midB = input.required<Vector3 | [number, number, number]>();
27+
start = input.required<THREE.Vector3 | [number, number, number]>();
28+
end = input.required<THREE.Vector3 | [number, number, number]>();
29+
midA = input.required<THREE.Vector3 | [number, number, number]>();
30+
midB = input.required<THREE.Vector3 | [number, number, number]>();
3131
options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
3232
parameters = omit(this.options, ['segments']);
3333

@@ -37,10 +37,10 @@ export class NgtsCubicBezierLine {
3737

3838
points = computed(() => {
3939
const [start, end, midA, midB, segments] = [this.start(), this.end(), this.midA(), this.midB(), this.segments()];
40-
const startV = start instanceof Vector3 ? start : new Vector3(...start);
41-
const endV = end instanceof Vector3 ? end : new Vector3(...end);
42-
const midAV = midA instanceof Vector3 ? midA : new Vector3(...midA);
43-
const midBV = midB instanceof Vector3 ? midB : new Vector3(...midB);
44-
return new CubicBezierCurve3(startV, midAV, midBV, endV).getPoints(segments);
40+
const startV = is.three<THREE.Vector3>(start, 'isVector3') ? start : new THREE.Vector3(...start);
41+
const endV = is.three<THREE.Vector3>(end, 'isVector3') ? end : new THREE.Vector3(...end);
42+
const midAV = is.three<THREE.Vector3>(midA, 'isVector3') ? midA : new THREE.Vector3(...midA);
43+
const midBV = is.three<THREE.Vector3>(midB, 'isVector3') ? midB : new THREE.Vector3(...midB);
44+
return new THREE.CubicBezierCurve3(startV, midAV, midBV, endV).getPoints(segments);
4545
});
4646
}

libs/soba/abstractions/src/lib/edges.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import { ChangeDetectionStrategy, Component, computed, effect, input, viewChild } from '@angular/core';
2-
import { checkNeedsUpdate, getLocalState, NgtMesh, omit } from 'angular-three';
2+
import { checkNeedsUpdate, getInstanceState, NgtThreeElements, omit } from 'angular-three';
33
import { mergeInputs } from 'ngxtension/inject-inputs';
4-
import { BufferAttribute, BufferGeometry, ColorRepresentation, EdgesGeometry, Mesh } from 'three';
4+
import * as THREE from 'three';
55
import { LineMaterialParameters } from 'three-stdlib';
66
import { NgtLine2, NgtLineMaterial, NgtsLine } from './line';
77

8-
export type NgtsEdgesOptions = Partial<NgtMesh> & {
8+
export type NgtsEdgesOptions = Partial<NgtThreeElements['ngt-mesh']> & {
99
threshold?: number;
1010
lineWidth?: number;
1111
} & Omit<LineMaterialParameters, 'vertexColors' | 'color'> &
1212
Omit<Partial<NgtLine2>, 'geometry'> &
1313
Omit<Partial<NgtLineMaterial>, 'color' | 'vertexColors'> & {
14-
geometry?: BufferGeometry;
15-
color?: ColorRepresentation;
14+
geometry?: THREE.BufferGeometry;
15+
color?: THREE.ColorRepresentation;
1616
};
1717

1818
const defaultOptions: NgtsEdgesOptions = {
@@ -39,18 +39,18 @@ export class NgtsEdges {
3939

4040
line = viewChild.required(NgtsLine);
4141

42-
private memoizedGeometry?: BufferGeometry;
42+
private memoizedGeometry?: THREE.BufferGeometry;
4343
private memoizedThreshold?: number;
4444

4545
constructor() {
4646
effect(() => {
4747
const line = this.line().lineRef()?.nativeElement;
4848
if (!line) return;
4949

50-
const lS = getLocalState(line);
50+
const lS = getInstanceState(line);
5151
if (!lS) return;
5252

53-
const parent = lS.parent() as Mesh;
53+
const parent = lS.parent() as unknown as THREE.Mesh;
5454
if (!parent) return;
5555

5656
const { geometry: explicitGeometry, threshold } = this.options();
@@ -63,7 +63,7 @@ export class NgtsEdges {
6363
this.memoizedGeometry = geometry;
6464
this.memoizedThreshold = threshold;
6565

66-
const points = (new EdgesGeometry(geometry, threshold).attributes['position'] as BufferAttribute)
66+
const points = (new THREE.EdgesGeometry(geometry, threshold).attributes['position'] as THREE.BufferAttribute)
6767
.array as Float32Array;
6868
line.geometry.setPositions(points);
6969
checkNeedsUpdate(line.geometry.attributes['instanceStart']);

libs/soba/abstractions/src/lib/gradient-texture.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import {
88
input,
99
untracked,
1010
} from '@angular/core';
11-
import { extend, injectStore, NgtArgs, NgtAttachable, NgtTexture, omit } from 'angular-three';
11+
import { extend, injectStore, NgtArgs, NgtAttachable, NgtThreeElements, omit } from 'angular-three';
1212
import { mergeInputs } from 'ngxtension/inject-inputs';
13-
import { CanvasTexture, Color, ColorRepresentation } from 'three';
13+
import * as THREE from 'three';
14+
import { CanvasTexture } from 'three';
1415

15-
export interface NgtsGradientTextureOptions extends Partial<Omit<NgtTexture, 'type'>> {
16+
export interface NgtsGradientTextureOptions extends Partial<Omit<NgtThreeElements['ngt-texture'], 'type'>> {
1617
size: number;
1718
width: number;
1819
type: 'linear' | 'radial';
@@ -47,12 +48,12 @@ const defaultOptions: NgtsGradientTextureOptions = {
4748
export class NgtsGradientTexture {
4849
attach = input<NgtAttachable>('map');
4950
stops = input.required<Array<number>>();
50-
colors = input.required<Array<ColorRepresentation>>();
51+
colors = input.required<Array<THREE.ColorRepresentation>>();
5152
options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
5253
parameters = omit(this.options, ['size', 'width', 'type', 'innerCircleRadius', 'outerCircleRadius']);
5354

5455
private store = injectStore();
55-
outputColorSpace = this.store.select('gl', 'outputColorSpace');
56+
outputColorSpace = this.store.gl.outputColorSpace;
5657
private document = inject(DOCUMENT);
5758

5859
canvas = computed(() => {
@@ -87,7 +88,7 @@ export class NgtsGradientTexture {
8788
);
8889
}
8990

90-
const tempColor = new Color(); // reuse instance for performance
91+
const tempColor = new THREE.Color(); // reuse instance for performance
9192

9293
let i = stops.length;
9394
while (i--) {

libs/soba/abstractions/src/lib/grid.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import {
77
input,
88
viewChild,
99
} from '@angular/core';
10-
import { extend, injectBeforeRender, NgtArgs, NgtMesh, omit, pick } from 'angular-three';
10+
import { extend, injectBeforeRender, NgtArgs, NgtThreeElements, omit, pick } from 'angular-three';
1111
import { GridMaterial, GridMaterialOptions } from 'angular-three-soba/shaders';
1212
import { mergeInputs } from 'ngxtension/inject-inputs';
13-
import { BackSide, Mesh, Plane, PlaneGeometry, ShaderMaterial, Uniform, Vector3 } from 'three';
13+
import * as THREE from 'three';
14+
import { Mesh, PlaneGeometry } from 'three';
1415

15-
const defaultOptions: Partial<NgtMesh> &
16-
GridMaterialOptions & { planeArgs: ConstructorParameters<typeof PlaneGeometry> } = {
16+
const defaultOptions: Partial<NgtThreeElements['ngt-mesh']> &
17+
GridMaterialOptions & { planeArgs: ConstructorParameters<typeof THREE.PlaneGeometry> } = {
1718
planeArgs: [],
1819
cellSize: 0.5,
1920
cellThickness: 0.5,
@@ -26,7 +27,7 @@ const defaultOptions: Partial<NgtMesh> &
2627
fadeDistance: 100,
2728
fadeStrength: 1,
2829
fadeFrom: 1,
29-
side: BackSide,
30+
side: THREE.BackSide,
3031
};
3132

3233
@Component({
@@ -62,11 +63,11 @@ export class NgtsGrid {
6263
'side',
6364
]);
6465

65-
meshRef = viewChild.required<ElementRef<Mesh>>('mesh');
66+
meshRef = viewChild.required<ElementRef<THREE.Mesh>>('mesh');
6667

67-
private plane = new Plane();
68-
private upVector = new Vector3(0, 1, 0);
69-
private zeroVector = new Vector3(0, 0, 0);
68+
private plane = new THREE.Plane();
69+
private upVector = new THREE.Vector3(0, 1, 0);
70+
private zeroVector = new THREE.Vector3(0, 0, 0);
7071

7172
planeArgs = pick(this.options, 'planeArgs');
7273
side = pick(this.options, 'side');
@@ -107,9 +108,9 @@ export class NgtsGrid {
107108

108109
this.plane.setFromNormalAndCoplanarPoint(this.upVector, this.zeroVector).applyMatrix4(mesh.matrixWorld);
109110

110-
const gridMaterial = mesh.material as ShaderMaterial;
111-
const worldCamProjPosition = gridMaterial.uniforms['worldCamProjPosition'] as Uniform<Vector3>;
112-
const worldPlanePosition = gridMaterial.uniforms['worldPlanePosition'] as Uniform<Vector3>;
111+
const gridMaterial = mesh.material as THREE.ShaderMaterial;
112+
const worldCamProjPosition = gridMaterial.uniforms['worldCamProjPosition'] as THREE.Uniform<THREE.Vector3>;
113+
const worldPlanePosition = gridMaterial.uniforms['worldPlanePosition'] as THREE.Uniform<THREE.Vector3>;
113114

114115
this.plane.projectPoint(camera.position, worldCamProjPosition.value);
115116
worldPlanePosition.value.set(0, 0, 0).applyMatrix4(mesh.matrixWorld);

libs/soba/abstractions/src/lib/helper.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@ import {
99
input,
1010
viewChild,
1111
} from '@angular/core';
12-
import { extend, getLocalState, injectBeforeRender, injectStore, resolveRef } from 'angular-three';
12+
import { extend, getInstanceState, injectBeforeRender, injectStore, resolveRef } from 'angular-three';
1313
import { assertInjector } from 'ngxtension/assert-injector';
14+
import * as THREE from 'three';
1415
import { Object3D } from 'three';
1516

1617
type HelperArgs<T> = T extends [infer _, ...infer R] ? R : never;
1718

1819
export function injectHelper<
19-
TConstructor extends new (...args: any[]) => Object3D,
20+
TConstructor extends new (...args: any[]) => THREE.Object3D,
2021
THelperInstance extends InstanceType<TConstructor> & { update: () => void; dispose: () => void },
2122
>(
22-
object: () => ElementRef<Object3D> | Object3D | undefined | null,
23+
object: () => ElementRef<THREE.Object3D> | THREE.Object3D | undefined | null,
2324
helperConstructor: () => TConstructor,
2425
{
2526
injector,
@@ -28,7 +29,6 @@ export function injectHelper<
2829
) {
2930
return assertInjector(injectHelper, injector, () => {
3031
const store = injectStore();
31-
const scene = store.select('scene');
3232

3333
const helper = computed(() => {
3434
const maybeObject3D = object();
@@ -46,12 +46,12 @@ export function injectHelper<
4646
const currentHelper = helper();
4747
if (!currentHelper) return;
4848

49-
const _scene = scene();
49+
const scene = store.scene();
5050

51-
_scene.add(currentHelper);
51+
scene.add(currentHelper);
5252

5353
onCleanup(() => {
54-
_scene.remove(currentHelper);
54+
scene.remove(currentHelper);
5555
currentHelper.dispose?.();
5656
});
5757
});
@@ -73,20 +73,20 @@ export function injectHelper<
7373
schemas: [CUSTOM_ELEMENTS_SCHEMA],
7474
changeDetection: ChangeDetectionStrategy.OnPush,
7575
})
76-
export class NgtsHelper<TConstructor extends new (...args: any[]) => Object3D> {
76+
export class NgtsHelper<TConstructor extends new (...args: any[]) => THREE.Object3D> {
7777
type = input.required<TConstructor>();
7878
options = input<HelperArgs<ConstructorParameters<TConstructor>>>(
7979
[] as unknown as HelperArgs<ConstructorParameters<TConstructor>>,
8080
);
8181

82-
helperRef = viewChild.required<ElementRef<Object3D>>('helper');
82+
helperRef = viewChild.required<ElementRef<THREE.Object3D>>('helper');
8383

8484
private parent = computed(() => {
8585
const helper = this.helperRef().nativeElement;
8686
if (!helper) return;
87-
const localState = getLocalState(helper);
87+
const localState = getInstanceState(helper);
8888
if (!localState) return;
89-
return localState.parent();
89+
return localState.parent() as unknown as THREE.Object3D;
9090
});
9191

9292
helper = injectHelper(this.parent, this.type, { args: this.options });

0 commit comments

Comments
 (0)