Skip to content

Commit 1109a54

Browse files
committed
docs: add svgrenderer example
1 parent 33ba160 commit 1109a54

File tree

6 files changed

+149
-0
lines changed

6 files changed

+149
-0
lines changed

apps/kitchen-sink/src/app/app.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { filter, map } from 'rxjs';
1313
<option value="cannon">/cannon</option>
1414
<option value="postprocessing">/postprocessing</option>
1515
<option value="rapier">/rapier</option>
16+
<option value="misc">/misc</option>
1617
</select>
1718
`,
1819
imports: [RouterOutlet],

apps/kitchen-sink/src/app/app.routes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ export const appRoutes: Route[] = [
2525
loadChildren: () => import('./rapier/rapier.routes'),
2626
title: 'Rapier - Angular Three Demo',
2727
},
28+
{
29+
path: 'misc',
30+
loadComponent: () => import('./misc/misc'),
31+
loadChildren: () => import('./misc/misc.routes'),
32+
title: 'Misc - Angular Three Demo',
33+
},
2834
{
2935
path: '',
3036
// redirectTo: 'cannon',
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Routes } from '@angular/router';
2+
3+
const routes: Routes = [
4+
{
5+
path: 'svg-renderer',
6+
loadComponent: () => import('./svg-renderer/svg-renderer'),
7+
},
8+
{
9+
path: '',
10+
redirectTo: 'svg-renderer',
11+
pathMatch: 'full',
12+
},
13+
];
14+
15+
export default routes;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { ChangeDetectionStrategy, Component } from '@angular/core';
2+
import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';
3+
import { extend } from 'angular-three';
4+
import * as THREE from 'three';
5+
import routes from './misc.routes';
6+
7+
extend(THREE);
8+
9+
@Component({
10+
standalone: true,
11+
template: `
12+
<div class="h-svh">
13+
<router-outlet />
14+
</div>
15+
16+
<ul class=" absolute left-12 bottom-12 grid grid-cols-6 gap-4">
17+
@for (example of examples; track example) {
18+
<li class="h-6 w-6">
19+
<a
20+
routerLinkActive
21+
#rla="routerLinkActive"
22+
class="inline-block h-full w-full rounded-full"
23+
[class]="rla.isActive ? 'bg-red-500' : 'bg-white'"
24+
[routerLinkActiveOptions]="{ exact: true }"
25+
[routerLink]="['/misc', example]"
26+
[title]="'Navigate to ' + example"
27+
></a>
28+
</li>
29+
}
30+
</ul>
31+
`,
32+
imports: [RouterOutlet, RouterLink, RouterLinkActive],
33+
changeDetection: ChangeDetectionStrategy.OnPush,
34+
host: { class: 'misc' },
35+
})
36+
export default class Misc {
37+
protected examples = routes.filter((route) => !!route.path).map((route) => route.path);
38+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2+
import { injectBeforeRender, NgtArgs } from 'angular-three';
3+
import { BufferGeometry, Float32BufferAttribute } from 'three';
4+
5+
@Component({
6+
standalone: true,
7+
template: `
8+
<ngt-color attach="background" *args="['black']" />
9+
10+
@for (i of [1, 2, 3]; track $index) {
11+
<ngt-line [geometry]="geometry" [scale]="i / 3">
12+
<ngt-line-basic-material [color]="Math.random() * whiteHex" [linewidth]="10" />
13+
</ngt-line>
14+
}
15+
16+
<ngt-line [geometry]="geometry" [scale]="2">
17+
<ngt-line-dashed-material color="blue" [linewidth]="1" [dashSize]="10" [gapSize]="10" />
18+
</ngt-line>
19+
`,
20+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
21+
changeDetection: ChangeDetectionStrategy.OnPush,
22+
imports: [NgtArgs],
23+
})
24+
export class Experience {
25+
protected readonly Math = Math;
26+
27+
protected whiteHex = 0xffffff;
28+
protected geometry = (() => {
29+
const divisions = 50;
30+
const vertices: number[] = [];
31+
32+
for (let i = 0; i <= divisions; i++) {
33+
const v = (i / divisions) * (Math.PI * 2);
34+
35+
const x = Math.sin(v);
36+
const z = Math.cos(v);
37+
38+
vertices.push(x, 0, z);
39+
}
40+
41+
const geometry = new BufferGeometry();
42+
geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
43+
44+
return geometry;
45+
})();
46+
47+
constructor() {
48+
injectBeforeRender(({ scene, delta }) => {
49+
let count = 0;
50+
const time = performance.now() / 1000;
51+
scene.traverse((child) => {
52+
child.rotation.x = count + time / 3;
53+
child.rotation.z = count + time / 4;
54+
count++;
55+
});
56+
});
57+
}
58+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ChangeDetectionStrategy, Component } from '@angular/core';
2+
import { NgtCanvas, NgtCanvasElement } from 'angular-three';
3+
import { SVGRenderer } from 'three-stdlib';
4+
import { Experience } from './experience';
5+
6+
@Component({
7+
standalone: true,
8+
template: `
9+
<ngt-canvas
10+
[sceneGraph]="sceneGraph"
11+
[gl]="svgRendererFactory"
12+
[camera]="{ fov: 33, near: 0.1, far: 100, position: [0, 0, 10] }"
13+
/>
14+
`,
15+
imports: [NgtCanvas],
16+
changeDetection: ChangeDetectionStrategy.OnPush,
17+
})
18+
export default class SVGRendererExample {
19+
sceneGraph = Experience;
20+
21+
svgRendererFactory = (canvas: NgtCanvasElement) => {
22+
const renderer = new SVGRenderer();
23+
24+
if (canvas instanceof HTMLCanvasElement) {
25+
canvas.style.display = 'none';
26+
canvas.parentElement?.appendChild(renderer.domElement);
27+
}
28+
29+
return renderer;
30+
};
31+
}

0 commit comments

Comments
 (0)