Skip to main content

Genies iOS SDK v0.1.9

Updated: May 2, 2026

What's New

  • Talking / Breath / Look weights. NAFAvatarSession is ObservableObject with three @Published weights (0–1). SDK auto-loads breathing + runs gaze internally; NAFView wires it all so consumers just set view.session.lookWeight = 1. BYO consumers register cameraPositionProvider + avatarModelTransform once.
  • Blendshape GPU rendering. NAFView now applies per-frame morph weights from the C++ animation graph — talking, blinks, emotions, base demeanor become visible on iOS instead of being silently discarded. New surface: NAFAvatarController.morphTargetNames + NAFAvatarSession.morphTargetWeights(forMeshAt:) for BYO consumers.
  • NAFAvatarRenderer protocol + NAFAvatarSession.uploadAnimationState(to:). BYO consumers conform their renderer (two methods) and pump bone matrices + morph weights with one call per frame.
  • NAFMeshData.makeMorphPositionDeltaBuffer(device:) + makeMorphWeightsBuffer(device:) (NAFKitUITools) — one-call helpers that pack morph deltas into the canonical morphIdx * vertexCount + vid layout. Return a placeholder buffer for no-morph meshes so the renderer's bind path stays branch-free.
  • NAFEventBridge — Obj-C wrapper over the unified C++ GnUtils::EventBus. String-keyed subscribe / fire / sendRequest, RAII tokens, optional dispatch queue. Sits alongside NAFEventBus.
  • SceneInteractionController (NAFKitUITools) — public UIKit glue around AvatarPicker + TransformGizmo. Owns the tap + gizmo-pan recognizers + axis overlay; consumers wire candidates / frame context / gizmo centre via closures and call attach(to:) + requireFailure(for:). NAFView now uses it internally.
  • NAFAvatarSession.loadAvatarProgressive(behavior:) is optional — pass nil for test definitions. NAFView.loadAvatarProgressive(behavior:) mirrors.

What's Fixed

  • equip / unequip now work incrementally on definition-loaded assets. Session reconciles its builder with the native handle's per-asset entity map after the first LOD lands.
  • LOD upgrade composition order is stable — batches apply in NAFAvatarDefinition.assets order instead of arrival order.
  • NAFAvatarSession.onError now logs alongside the UI message