Skip to content

Commit 8657f53

Browse files
Chau TranChau Tran
Chau Tran
authored and
Chau Tran
committed
feat(soba): migrate float
1 parent f38281f commit 8657f53

File tree

4 files changed

+81
-11
lines changed

4 files changed

+81
-11
lines changed

libs/soba/src/abstractions/text-3d.stories.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core';
22
import { Meta, moduleMetadata, StoryObj } from '@storybook/angular';
33
import { NgtsText3D } from 'angular-three-soba/abstractions';
44
import { NgtsCenter, NgtsFloat } from 'angular-three-soba/staging';
5-
import { makeCanvasOptions, StorybookSetup } from '../setup-canvas';
5+
import { makeRenderFunction, StorybookSetup } from '../setup-canvas';
66

77
@Component({
88
standalone: true,
@@ -33,15 +33,6 @@ export default {
3333
} as Meta;
3434

3535
export const Default: StoryObj = {
36-
render: (args) => ({
37-
props: {
38-
options: makeCanvasOptions({ camera: { position: [0, 0, 10] } }),
39-
story: DefaultText3DStory,
40-
inputs: args,
41-
},
42-
template: `
43-
<storybook-setup [options]="options" [story]="story" [inputs]="inputs" />
44-
`,
45-
}),
36+
render: makeRenderFunction(DefaultText3DStory, { camera: { position: [0, 0, 10] } }),
4637
args: { text: 'Angular Three' },
4738
};

libs/soba/staging/src/center/center.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export class NgtsCenter extends NgtSignalStore<NgtsCenterState> implements OnIni
142142
effect(
143143
() => {
144144
const { center: centerGroup, outer, inner } = trigger();
145+
if (!outer || !inner) return;
145146
const { precise, top, left, front, disable, disableX, disableY, disableZ, back, bottom, right } =
146147
this.get();
147148
outer.matrixWorld.identity();

libs/soba/staging/src/float/float.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core';
2+
import { extend, injectBeforeRender, injectNgtRef, NgtRenderState, NgtSignalStore, type NgtGroup } from 'angular-three';
3+
import * as THREE from 'three';
4+
import { Group } from 'three';
5+
6+
extend({ Group });
7+
8+
export type NgtsFloatState = {
9+
enabled: boolean;
10+
speed: number;
11+
floatIntensity: number;
12+
rotationIntensity: number;
13+
floatingRange: [number?, number?];
14+
};
15+
16+
declare global {
17+
interface HTMLElementTagNameMap {
18+
'ngts-float': NgtsFloatState & NgtGroup;
19+
}
20+
}
21+
22+
@Component({
23+
selector: 'ngts-float',
24+
standalone: true,
25+
template: `
26+
<ngt-group ngtCompound>
27+
<ngt-group [ref]="floatRef">
28+
<ng-content />
29+
</ngt-group>
30+
</ngt-group>
31+
`,
32+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
33+
})
34+
export class NgtsFloat extends NgtSignalStore<NgtsFloatState> {
35+
readonly #offset = Math.random() * 10000;
36+
37+
@Input() floatRef = injectNgtRef<THREE.Group>();
38+
39+
@Input() set enabled(enabled: boolean) {
40+
this.set({ enabled });
41+
}
42+
43+
@Input() set speed(speed: number) {
44+
this.set({ speed });
45+
}
46+
47+
@Input() set rotationIntensity(rotationIntensity: number) {
48+
this.set({ rotationIntensity });
49+
}
50+
51+
@Input() set floatIntensity(floatIntensity: number) {
52+
this.set({ floatIntensity });
53+
}
54+
55+
@Input() set floatingRange(floatingRange: [number?, number?]) {
56+
this.set({ floatingRange });
57+
}
58+
59+
constructor() {
60+
super({ speed: 1, rotationIntensity: 1, floatIntensity: 1, floatingRange: [-0.1, 0.1], enabled: true });
61+
injectBeforeRender(this.onBeforeRender.bind(this));
62+
}
63+
64+
private onBeforeRender({ clock }: NgtRenderState) {
65+
if (!this.floatRef.untracked) return;
66+
const { enabled, speed, floatingRange, floatIntensity, rotationIntensity } = this.get();
67+
if (!enabled || speed === 0) return;
68+
69+
const t = this.#offset + clock.getElapsedTime();
70+
this.floatRef.untracked.rotation.x = (Math.cos((t / 4) * speed) / 8) * rotationIntensity;
71+
this.floatRef.untracked.rotation.y = (Math.sin((t / 4) * speed) / 8) * rotationIntensity;
72+
this.floatRef.untracked.rotation.z = (Math.sin((t / 4) * speed) / 20) * rotationIntensity;
73+
let yPosition = Math.sin((t / 4) * speed) / 10;
74+
yPosition = THREE.MathUtils.mapLinear(yPosition, -0.1, 0.1, floatingRange[0] ?? -0.1, floatingRange[1] ?? 0.1);
75+
this.floatRef.untracked.position.y = yPosition * floatIntensity;
76+
}
77+
}

libs/soba/staging/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './center/center';
2+
export * from './float/float';

0 commit comments

Comments
 (0)