Skip to content

v0.9.5

Latest

Choose a tag to compare

@lslzl3000 lslzl3000 released this 06 Nov 15:37

0.9.5 (2026-11-06)

Features

  • water: WaterRenderer with Gerstner / FFT ocean waves, interactive ripples, sunlight caustics and an underwater view (opt-in via setting.render.water); pool, lake and ocean samples (#511) (69ae653)
  • fluid: FluidRenderer and FluidPass screen-space fluid rendering (opt-in via setting.render.fluid) — depth smoothing, optional anisotropic particles, thickness, refraction and absorption; FLIP and CPU particle samples (#512) (1cffd8a)
  • light: RectLight — analytic rectangular area light (Lambert polygon form factor diffuse + representative-point GGX specular) (#525) (d5b3e12)
  • light: the first DirectLight in a scene enables CSM by default; an explicit enableCSM assignment still wins (#526) (b2d5e6e)
  • material: KHR_materials_sheen — sheen lobe on LitMaterial + glTF extension (#513) (671bbd1)
  • material: KHR_materials_iridescence — thin-film interference on LitMaterial + glTF extension (#520) (9659cdd)
  • material: KHR_materials_anisotropy — anisotropic specular on LitMaterial + glTF extension (#521) (bdb6c0c)
  • material: KHR extension textures — sheen, iridescence (+ thickness), specular / specular color and anisotropy maps on LitMaterial, bound by the glTF loader (#526) (b2d5e6e)
  • gltf: KHR_mesh_quantization, KHR_materials_specular and KHR_materials_variants (new MaterialVariants component with selectVariant) (#516) (76dc157)
  • post: tonemap modes — Reinhard, Uncharted2, AgX, Khronos PBR Neutral (TonemapSetting.mode, whitePoint) with a CPU mirror TonemapUtil (#510) (01128b0)
  • post: LensPost — vignette, chromatic aberration, film grain (#514) (c44cd00)
  • post: MotionBlurPost — camera motion blur with resetHistory() (#517) (fa46b16)
  • post: ColorGradingPost — exposure, white balance, contrast, saturation, ASC-CDL and strip LUTs, with CPU mirror ColorGradingUtil (#522) (bef7b47)
  • render: per-object motion vectors for motion blur (objectMotionVectors render setting, velocity sub-pass written into _MotionVector) (#527) (2f44234)
  • lod: LODGroup component with screen-relative-height / distance metrics, bias, hysteresis and forceLevel (#519) (f5bda99)
  • pick: MeshBVH triangle BVH for CPU raycasts (closest / all / any-hit queries, sub-geometries, compose_bin geometry, auto refit) (#509) (2e4be97)
    • new three.js-style Raycaster — CPU ray picking against mesh triangles without a collider (#501)
    • PickFire event data with face / uv / all hits and collider filters; auto mesh collider geometry
    • picking of skinned and morph-target meshes as drawn (CPU deformation)
    • BoundingBox.intersectsRay and BoundingSphere.updateBound implemented
  • math: Spherical, Cylindrical, Box2, CatmullRomCurve3 (#515) (f2d4944)
  • atmosphere: new @orillusion/atmosphere package (#444) (18cd142), ported to the multi-instance engine API with a limb-darkened sun disc and useAsEnvMap toggle (37e55d8)

Bug Fixes

  • geometry: SphereGeometry / TorusGeometry / CylinderGeometry / StripeGeometry switch to 32-bit indices past 65535 vertices; PlaneGeometry index type check fixed (#528) (643632b)
  • pick: Raycaster skips sky spheres unless includeSky is set (#528) (643632b)
  • pick: world-space hits for every collider shape, nearest hit for MeshColliderShape, inverse-transpose normals, and screenPointToRay canvas-offset fix (#509) (2e4be97)
  • post: MotionBlurPost.resetHistory() also resets object motion vectors; first frame writes zero motion (#528) (643632b)
  • gltf: non-indexed primitives no longer overflow a Uint8Array fallback index buffer (meshes over 85 triangles were scrambled) (#516) (76dc157)
  • texture: base64 data-URI textures no longer hang forever in background tabs (#518) (aaf06d7)
  • shader: pooled reflection no longer overwritten when a pass changes variant (#511) (69ae653)
  • shader: bind group entries get only the shader stages that reach them (ShaderStageUsage, nested calls included); texture bind group regenerated when layouts rebuild (#526) (b2d5e6e)
  • engine: first frame and post-resume frame use a nominal 1/60 s Time.delta; GPUBufferBase.mapAsyncWrite staging-buffer pool leak (#519) (f5bda99)
  • physics-rapier: adapt to Rapier 0.19 API changes (#519) (f5bda99)
  • atmosphere: fix multi-scattering / sky-view LUT dispatch sizes, uniform padding and a compute shader leak (37e55d8)
  • sprite: stabilize BillboardY at vertical view angles (#503) (c477ae0)
  • math: Plane.intersectsRay hit for parallel rays (#507) (1172ba1)
  • math: correct Vector2.lerp endpoint order (#508) (5cdec3c)
  • test: wait for rendered frames instead of wall-clock delays before GPU readbacks (#524) (f90b4d5); fail the running test on GPU device loss or uncaptured GPU errors (#526) (b2d5e6e)