Skip to content

Drei catalogue audit

Drei at bf6f4ad (drei-main/src/core, drei-main/src/web), against effect-three 0.1.0, 2026-10-18. Each component is one of:

  • ✅ covered: effect-three has it, by the API named;
  • 🔁 a Model pattern: no API needed, because the Model already does it (the pattern named);
  • 📋 candidate: worth adding to the typed catalogue, sized S, M or L;
  • — out of scope: specialised, React-specific, or against the closed, Model-driven catalogue (reasons given).

Covered (✅)

Dreieffect-three
OrbitControls, MapControlsorbit (with orbitOptions, screenSpacePanning), damping, autoRotate
CameraControls (smooth moves)camera damping eases any Model change
PerspectiveCamera, OrthographicCameraperspectiveCamera, orthographicCamera
Bounds, useAspect, Resize (framing)scene({ measure }), fitCamera, clipCamera, centerOffset
CentercenterOffset on a measured box
Floatbehave('float')
Instancesinstances, diffed per instance key
Gltf/useGLTF, useAnimationsenvironment.assets.loadModel, borrowed({ animation: play(…) })
Texture/useTextureenvironment.assets.loadTexture, map: id
Environment, useEnvironmentenvironment(), presets via environmentPresetUrl, loadEnvironment
ContactShadows, Sky, Grid, StagecontactShadows(), sky(), shaderGrid(), stage()
Text, Text3D, useFontlabel() (troika), text(), loadFont
RenderTexture, FborenderTextures
Viewviews
Hudhud({ alignment, margin, children }), drawn over the scene, picked first
GizmoHelper, GizmoViewportviewportGizmoNodes, cameraAlong; Foldkit’s ViewportGizmo submodel
PivotControlspivotNodes, pressPivot, dragPivot; Foldkit’s PivotControls submodel
Htmloverlays
EffectsrenderSettings({ effects: [bloom(), vignette(), film()] })
PerformanceMonitor, AdaptiveDprPerformanceChanged, renderSettings({ resolution })
web/DragControlsDrag/DragEnd with pointer capture, pointOnPlane
shapes (Box, Sphere, Plane, …)the nine shape builders
Wireframe (plain)any material’s wireframe
SpotLight (plain)spotLight (not the volumetric cone: see candidates)
Billboardrotation: billboard({ lockX, lockY, lockZ })
RoundedBox, BackdroproundedBox(), backdrop() shapes, with Drei’s defaults
Detailedgroup({ detail: detailed({ distances, hysteresis }) })
CameraShakea camera’s shake: cameraShake({ intensity, decay, … })
Cloneborrowed shown under several keys (skinned models get their own bones)
Line, Segmentsline({ points, width, dashed, vertexColors, segments }), drawn by the kit
CatmullRomLine, *BezierLinecatmullRomPoints, cubicBezierPoints, quadraticBezierPoints for line
Edgesmesh({ edges: edges({ threshold, color, width }) }), never picked
Trailtrail({ width, length, decay, taper, fade }) on a group or mesh
Points, PointMaterialpoints({ positions, colors, sizes, size, round }), drawn by the kit
Sparkles, Starssparkles() and stars(), seeded, moving in scene time
TransformControlsgizmoNodes, pressGizmo, dragGizmo; Foldkit’s TransformGizmo submodel
web/Select (its box)boxSelect over a GestureEnd; Foldkit’s BoxSelect submodel

A Model pattern (🔁)

DreiThe pattern
useCursorhover in the Model; the scene element’s className sets the cursor
web/KeyboardControlsFoldkit key subscriptions as Messages; orbitKey for the camera
web/Select (clicks), web/CycleRaycastselection in the Model from click and hover Messages
Preload, Progress, web/LoaderAsyncData in the Model while asset Commands run
Stats, StatsGlPerformanceChanged; onReconciled for what each update did
BBAnchoroverlays at a point from a measured box
VideoTexture, web/WebcamVideoTexturelend a three VideoTexture with store.lendTexture
Imagea plane with a lent or loaded map
useIntersect (the canvas)scenes already pause when off screen

Candidates (📋)

DreiSizeNotes
DecalMA projected geometry on a target mesh, by key
Cloud, OutlinesMInstanced cloud sprites; inverted-hull outlines (a render-kit part)
LightformerMEnvironments made from emissive shapes, rendered to an environment map
FlyControls, FirstPersonControls, PointerLockControlsS–MPure functions from gestures and keys, as orbit is
web/PresentationControls, web/ScrollControlsS–MGesture- and scroll-driven Model updates
MotionPathControlsMA camera or node behaviour along a curve
GizmoViewcubeMA Foldkit submodel, as the viewport gizmo is
CubeCameraMDynamic reflections: a render texture into a cube map
meshBounds, BvhS–MCheaper or accelerated picking for large meshes
GradientTexture, MatcapTexture, Ktx2SGenerated and compressed textures; a matcap material kind
SpotLight (volumetric), MaskMRender-kit parts

Out of scope (—)

DreiWhy
shaderMaterial, MeshDistortMaterial, MeshWobbleMaterial, MeshDiscardMaterialArbitrary shaders: the catalogue is closed and renderer-neutral (ADR-003)
MeshTransmissionMaterial, MeshReflectorMaterial, MeshRefractionMaterial, MeshPortalMaterialWebGL shader effects; reconsider per renderer kit, after TSL parity
AccumulativeShadows, softShadows, Caustics, BakeShadowsShader-patching shadow techniques; shadows: 'soft' and contact shadows cover the common case
MarchingCubes, Splat, Sampler, ComputedAttribute, CurveModifier, SvgSpecialised geometry pipelines
PositionalAudioAudio belongs to the application, not the scene graph
ScreenQuad, ScreenSpace, ScreenSizer, Fisheye, AsciiRendererSpecialised rendering
SpriteAnimator, useSpriteLoader, Fbx, DetectGPU, Helper, MultiMaterialNiche, or application-level
web/FaceControls, web/FaceLandmarker, web/Facemesh, DeviceOrientationControlsDevice and vision input: an application’s own subscriptions
useContextBridge, useCamera, useDepthBuffer, useBoxProjectedEnv, AdaptiveEventsReact-specific, or internal to effects not taken

Recommendation

Done (2026-10-19): Billboard, RoundedBox and Backdrop, Detailed, CameraShake and Clone, the S candidates; then the line and points families: line with its curves, Edges, Trail, Points, Sparkles and Stars; and TransformControls as a pure gizmo with a Foldkit submodel, Select’s box the same way, and Hud with GizmoHelper’s viewport gizmo in it, and PivotControls. The promo’s scene editor uses them together. Next: the remaining M candidates above, as the roadmap reaches them.