--- name: tresjs-core-skilld description: Declarative Three.js using Vue components. ALWAYS use when writing code that imports "@tresjs/core" or touches TresCanvas, Tres components, useLoop, useLoader, useTres, useTresContext, TresPortal, pointer events, render modes, or TresJS debugging, upgrades, and performance work. --- # @tresjs/core 5.9.0 Vue custom renderer for Three.js: any `THREE` class becomes a component by prefixing `Tres` (``, ``). Prepared source: `package.json`, `dist/tres.d.ts` (public types), `dist/tres.js`. npm dist-tags at generation time: `latest` 5.9.0, `rc` 5.0.0-rc.0, `next` 5.0.0-next.6, `beta` 2.0.0-beta.13, `alpha` 5.0.0-alpha.2. ## Environment limits - ESM-only since v5. No UMD, no `require()`. `import { TresCanvas } from '@tresjs/core'`. - Peer deps: `vue >=3.4`, `three >=0.133` (package.json:44-46). Built against three `^0.184`. - Time source: three `Timer` on r179+, falls back to `Clock` on older three (dist/tres.d.ts:962-970). - WebGPU is experimental; requires the `renderer` prop with a `three/webgpu` `Renderer` (see [references/webgpu.md](./references/webgpu.md)). ## Setup ```bash pnpm i @tresjs/core three pnpm i @types/three -D # TypeScript ``` Vite: spread `templateCompilerOptions` into the Vue plugin, or Tres components warn as unknown custom elements (README.md:36-50): ```ts import { templateCompilerOptions } from '@tresjs/core' import vue from '@vitejs/plugin-vue' import { defineConfig } from 'vite' export default defineConfig({ plugins: [vue({ ...templateCompilerOptions })], }) ``` A separate subpath export `@tresjs/core/template-compiler-options` exists for hosts that only need compiler options (package.json:21-25). For Nuxt use `@tresjs/nuxt` instead of manual setup. ## Core model - Component catalogue is autogenerated from the `THREE` namespace: `Tres` + capitalized class name, also available kebab-case (``, supported since v5.1.0) (dist/tres.d.ts:497-509). - `args` passes constructor arguments: ``. Changing reactive `args` recreates the whole instance; use props for everything settable after construction (dist/tres.d.ts:405-411). - Props map to instance properties. Math types accept shorthand: `:position="[1, 2, 3]"`, `:rotation="[0, Math.PI, 0]"`, `color="#00ff00"` (dist/tres.d.ts:457-485). - Child material/geometry auto-attach via `attach`: `` works without explicit `attach`. - `extend({ MyObject })` before using non-THREE classes as `` (dist/tres.d.ts:872-874). - `` mounts an object you created in JS. It does not own disposal; dispose manually (see [references/performance.md](./references/performance.md)). Minimal scene: ```vue ``` Without an explicit camera, a default `PerspectiveCamera` is created (dist/tres.d.ts:682-685). ## API changes to know v5 breaking (migrate with [references/migration-v4-v5.md](./references/migration-v4-v5.md)): - `useLoader` returns reactive state `{ state, isLoading, error, progress, load }`, no longer a Promise (dist/tres.d.ts:40-65). - Pointer events use native DOM names: `@pointerdown`, not `@pointer-down`. Only the first intersected object fires. - `useTexture` moved to `@tresjs/cientos`. `useRenderLoop`, `useCamera`, `useSeek`, `useRaycaster`, `useTresReady`, `useTresEventManager`, `useLogger` were removed. Replacements: `useLoop`, `useTres`, `useGraph`, `@ready` event. - `useTresContext().camera` is a camera manager; use `useTres().camera` for the active camera instance (dist/tres.d.ts:574-606). - WebGL context props (`alpha`, `antialias`, `depth`, `stencil`, `powerPreference`, `logarithmicDepthBuffer`, `preserveDrawingBuffer`, `failIfMajorPerformanceCaveat`) are readonly; set once at mount (dist/tres.d.ts:141-206). Recent additions: - 5.9.0: `TresPortal` component reparents children into any `Object3D`/`Scene` target (dist/tres.d.ts:853-858), https://docs.tresjs.org/api/components/tres-portal - 5.9.0: `isWebGPURenderer` guard and reactive `context.isWebGPU` flag (dist/tres.d.ts:350-367, 1204-1222) - 5.9.0: `shadowMapType` defaults to `PCFShadowMap` on WebGL, `PCFSoftShadowMap` on WebGPU (dist/tres.d.ts:250-255) - 5.8.0: `fpsLimit` prop caps render FPS (dist/tres.d.ts:692-696) - 5.7.0: three `` (dist/tres.d.ts:680-708) - 5.3.0: `customRendererOptions.primitivePrefix` renames `` (dist/tres.d.ts:622-625) - 5.2.0: `TresCanvasProps` / `TresCanvasEmits` types exported (dist/tres.d.ts:776-781) - Full history: https://github.com/Tresjs/tres/blob/main/packages/core/CHANGELOG.md ## Common tasks Animate with frame-rate independence (`delta` in seconds): ```vue ``` `useLoop` only works inside child components of `TresCanvas`; on the canvas itself use `@before-loop` / `@loop` events (https://docs.tresjs.org/api/composables/use-loop). Load a model: ```ts import { useLoader } from '@tresjs/core' import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js' const { state: model, isLoading, error, progress } = useLoader( GLTFLoader, '/models/duck.gltf', // MaybeRef: changing the ref reloads { extensions: (loader) => loader.setDRACOLoader(dracoLoader) }, ) // template: ``` Click a mesh: ```vue ``` Event payloads carry `point`, `object`, `distance`, `face`, `uv`, `xy`. `@pointermissed` on `TresCanvas` catches clicks on empty space. Details: [references/pointer-events.md](./references/pointer-events.md). ## Best practices - Use `shallowRef` for template refs to Three.js instances and for any object passed to ``; deep `ref` proxies cost real frame time. https://docs.tresjs.org/api/advanced/performance - Prefer `renderMode="on-demand"` plus `invalidate()` for non-game scenes; `renderMode="manual"` plus `advance()` for full control (dist/tres.d.ts:134-139). - In `on-demand` mode, call `invalidate()` after mutating objects through refs, since those mutations bypass Vue reactivity. - Take over rendering with `useLoop().render(fn)` only for post-processing or multi-pass; the fn must call `notifySuccess()` or render modes break (https://docs.tresjs.org/api/composables/use-loop). - Register ordered updates via the `priority` argument of `onBeforeRender`/`onRender` (default 0, higher runs later). - `useGraph(object)` gives named `nodes`, `materials`, `meshes` maps for loaded GLTF scenes instead of manual traversal (dist/tres.d.ts:565). - Call `dispose()` (exported from `@tresjs/core`) on programmatically created objects used via ``; template-created objects are disposed automatically. - Keep `args` static unless you intend instance recreation; animate via props or refs instead. - Debug with `v-log` / `v-log:material`, `v-light-helper`, `v-distance-to` directives (dist/tres.d.ts:934-952), https://docs.tresjs.org/api/utils/directives ## References - [references/components.md](./references/components.md): TresCanvas props and events, TresCanvasContext, TresPortal, UseLoader component - [references/composables.md](./references/composables.md): useTres vs useTresContext, useLoop, useLoader, useGraph, manager composables - [references/performance.md](./references/performance.md): render modes, reactivity, disposal, dpr, fpsLimit - [references/pointer-events.md](./references/pointer-events.md): event names, hit rules, payloads, propagation - [references/webgpu.md](./references/webgpu.md): custom renderer factory, isWebGPU, capability branching - [references/migration-v4-v5.md](./references/migration-v4-v5.md): v4 to v5 migration detail Official docs: https://docs.tresjs.org