This secondary entry point includes various loaders for files such as GLTF, FBX, textures, and fonts.
These functions use Angular's resource API and are the recommended approach for loading assets.
Creates a resource for loading font files for use with Three.js TextGeometry. Supports loading from URLs (typeface.js JSON format) or pre-loaded font data. Results are cached for efficient reuse.
import { fontResource } from 'angular-three-soba/loaders';
@Component({...})
class MyComponent {
font = fontResource(() => '/fonts/helvetiker_regular.typeface.json');
// Use in template or effect
constructor() {
effect(() => {
const f = this.font.value();
if (f) {
const geometry = new TextGeometry('Hello', { font: f, size: 1 });
}
});
}
}Static methods:
fontResource.preload(input: NgtsFontInput): void: Preloads a font into the cache.fontResource.clear(input?: NgtsFontInput): void: Clears a specific font or all fonts from the cache.
Creates a resource for loading GLTF/GLB 3D models. Supports Draco compression and Meshopt optimization out of the box. Returns a resource with a scene computed signal for direct access to the loaded scene(s).
import { gltfResource } from 'angular-three-soba/loaders';
@Component({
selector: 'app-suzi',
template: `
@if (gltf.value(); as gltf) {
<ngt-primitive *args="[gltf.scene]" [rotation]="[-0.63, 0, 0]" [scale]="2" />
}
`,
imports: [NgtArgs],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
changeDetection: ChangeDetectionStrategy.OnPush,
})
class Suzi {
gltf = gltfResource(() => './suzanne-high-poly.gltf');
// Or access scene directly via computed signal
scene = this.gltf.scene;
}Options:
| Option | Type | Default | Description |
|---|---|---|---|
useDraco |
boolean | string |
true |
Enable Draco compression. Pass string for custom path. |
useMeshOpt |
boolean |
true |
Enable Meshopt optimization. |
extensions |
(loader: GLTFLoader) => void |
- | Custom extensions callback for GLTFLoader. |
onLoad |
(data) => void |
- | Callback fired when loading completes. |
injector |
Injector |
- | Optional injector for DI context. |
Static methods:
gltfResource.preload(input, options?): void: Preloads a GLTF model into the cache.gltfResource.setDecoderPath(path: string): void: Sets the global Draco decoder path.
Creates a resource for loading texture images. Loaded textures are automatically initialized with the WebGL renderer for optimal performance.
import { textureResource } from 'angular-three-soba/loaders';
@Component({
template: `
@if (textures.value(); as textures) {
<ngt-mesh>
<ngt-mesh-physical-material [normalMap]="textures.normalMap" [roughnessMap]="textures.roughnessMap" />
</ngt-mesh>
}
`,
})
export class MyCmp {
textures = textureResource(() => ({
roughnessMap: 'roughness_floor.jpeg',
normalMap: 'NORM.jpg',
}));
}Static methods:
textureResource.preload(input): void: Preloads textures into the cache.
Creates a resource for loading FBX 3D models. Supports loading single files, arrays of files, or record objects mapping keys to URLs.
import { fbxResource } from 'angular-three-soba/loaders';
@Component({...})
class MyComponent {
// Single file
fbx = fbxResource(() => '/models/character.fbx');
// Multiple files
fbxs = fbxResource(() => ['/models/a.fbx', '/models/b.fbx']);
// Named files
models = fbxResource(() => ({ hero: '/models/hero.fbx', enemy: '/models/enemy.fbx' }));
}Static methods:
fbxResource.preload(input): void: Preloads FBX models into the cache.
Creates a reactive state object that tracks Three.js asset loading progress. Hooks into THREE.DefaultLoadingManager to monitor all asset loading operations.
import { progress } from 'angular-three-soba/loaders';
@Component({...})
class MyComponent {
loadingState = progress();
constructor() {
effect(() => {
if (this.loadingState.active()) {
console.log(`Loading: ${this.loadingState.progress()}%`);
}
});
// Check for errors
effect(() => {
const errors = this.loadingState.errors();
if (errors.length > 0) {
console.error('Failed to load:', errors);
}
});
}
}Returns a signal state object with the following properties:
| Property | Type | Description |
|---|---|---|
errors |
string[] |
Array of URLs that failed to load |
active |
boolean |
Whether loading is in progress |
progress |
number |
Loading progress percentage (0-100) |
item |
string |
URL of the currently loading item |
loaded |
number |
Number of items loaded |
total |
number |
Total number of items to load |
A component that renders a loading screen while THREE.js assets are being loaded.
| Property | Description | Default value |
|---|---|---|
containerClass |
Additional CSS classes for the loader's container. | '' |
innerClass |
Additional CSS classes for the inner loader element. | '' |
barClass |
Additional CSS classes for the loader bar element. | '' |
dataClass |
Additional CSS classes for the text element displaying loading progress. | '' |
dataInterpolation |
A function that formats the displayed loading progress. | (value: number) => 'Loading ${value.toFixed(2)}%' |
initialState |
A function that determines the initial visibility of the loader. | (value: boolean) => value |
NgtsLoader is a normal Angular component that renders HTML so it must be put on the same level of ngt-canvas, not within.
<ngt-canvas />
<ngts-loader [options]="loaderOptions" />Note: These functions are deprecated and will be removed in v5.0.0. Use the resource-based APIs instead.
Deprecated: Use
fontResourceinstead.
Provides a way to inject and load fonts into your Angular component. Returns a signal that holds the loaded Font object or null if not yet loaded.
Static methods:
injectFont.preload(input: () => NgtsFontInput): void: Preloads a font into the cache.injectFont.clear(input?: () => NgtsFontInput): void: Clears a specific font or all fonts from the cache.
Deprecated: Use
gltfResourceinstead.
Injects and loads GLTF models into your Angular component. Supports Draco and Meshopt compression.
@Component({
selector: 'app-suzi',
template: `
<ngt-primitive *args="[scene()]" [rotation]="[-0.63, 0, 0]" [scale]="2" [position]="[0, -1.175, 0]" />
`,
imports: [NgtArgs],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
changeDetection: ChangeDetectionStrategy.OnPush,
})
class Suzi {
gltf = injectGLTF(() => './suzanne-high-poly.gltf');
scene = computed(() => {
const gltf = this.gltf();
if (!gltf) return null;
return gltf.scene;
});
}Static methods:
injectGLTF.preload(path: () => TUrl, options): void: Preloads a GLTF model into the cache.injectGLTF.setDecoderPath(path: string): void: Sets the decoder path for Draco.
Deprecated: Use
textureResourceinstead.
Injects and loads textures into your Angular component. Returns a signal that holds the loading results.
@Component({
template: `
<ngt-mesh>
<ngt-mesh-physical-material [normalMap]="normalMap()" [roughnessMap]="roughnessMap()" />
</ngt-mesh>
`,
})
export class MyCmp {
private textures = injectTexture(() => ({
roughnessMap: 'roughness_floor.jpeg',
normalMap: 'NORM.jpg',
}));
roughnessMap = computed(() => this.textures()?.roughnessMap || null);
normalMap = computed(() => this.textures()?.normalMap || null);
}Static methods:
injectTexture.preload(input: () => TInput): void: Preloads a texture into the cache.
Deprecated: Use
fbxResourceinstead.
Injects and loads FBX models into your Angular component.
// Single file
const fbx = injectFBX(() => '/models/character.fbx');
// Multiple files
const fbxs = injectFBX(() => ['/models/a.fbx', '/models/b.fbx']);
// Preload
injectFBX.preload(() => '/models/character.fbx');Deprecated: Use
progressinstead.
Alias for the progress function.
function injectProgress(injector?: Injector): Signal<{
errors: string[];
active: boolean;
progress: number;
item: string;
loaded: number;
total: number;
}>;