Genies iOS SDK v0.1.23
Updated: May 22, 2026
What's New
- Toon preset wiring
- Shared C++
ToonPresetDecoderreplaces the Swift JSON decoder. Fixes per-mesh alpha-only overrides (e.g.LightAAlphawithoutLightAColornow combines with the base scope's RGB instead of silently dropping). InvertsLightA/B/CSoftnessat decode time so authors set the intuitive value. - 9 new toon JSON keys wired in
ToonUniforms+ shader:shadowIntensity,shadowSoftness,shadowAlbedoDarken,shadowCartoonInfluence,shadowNormalLightsInfluence,alphaCutoff,alphaOpacity,enabled,outlineThicknessMultiplier. All no-op at default values. twoSided— per-mesh cull mode override at encode time.MTLCullMode.nonewhen set.alphaEnabled— per-mesh routes to the blended pipeline variant (sourceAlpha+oneMinusSourceAlpha). Cross-group order is iteration order — no back-to-front depth sort.
- Shared C++
- Colour grading LUT
NAFView.setColorGradingLUT(_:strength:)— 3D LUT applied in toon fragments after tone-map. Overloads accept rawMTLTexture, strip-layoutUIImage, or Adobe.cubefile URL.NAFView.colorGradingLUTStrength: Float— toggle the effect 0/1 without re-loading.ColorGradingLUTLoaderin NAFKitUI:.makeCubeFileTexture(url:device:)parses Adobe.cube;.makeStripLayoutTexture(image:device:)acceptsside² × sidestrip PNGs.
- Depth-Sobel outline pass
NAFView.postOutline: PostOutlineSettings— depth-based Sobel edge detection + 32-sample disk dilation. Auto-driven from presetppOutline*keys viaapply(preset:). Knobs:enabled,depthEnabled,depthThreshold,thickness,color,cameraNear/Far. Allocates extra shader-readable depth resolve + (HDR-off) intermediate scene-colour target only when enabled.
- Power / thermal knobs on
NAFViewrenderScale: CGFloat(default1.0, clamped0.25…1.0). Multiplies the MTKView's content scale —0.5quarters fragment cost.rendersOnDemand: Bool(defaultfalse). Display link paused; draws only when state changes.preferredFramesPerSecond: Int(default60). Hard FPS cap; also capsadaptiveFrameRate's active tier.adaptiveFrameRate: Bool(defaultfalse) plusadaptiveActiveFPS: Int(default60) andadaptiveIdleFPS: Int(default24). Auto-modulates FPS based onisAnimationActive.preferredFramesPerSecondcaps the active tier.NAFAvatarSession.isAnimationActive: Bool— OR-aggregate of every motion weight> 0.01. Drives the adaptive governor; readable if you want your own throttling.
What's Updated
- Behaviour changes
ToneMappingSettings.modedefault flipped from.acesFilmicto.linear— matches the cartoon pipeline. ACES is opt-in.