SDK inventory: public-surface map of zappar-xr/zapbox-xr-sdk v0.5.0 #2
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Zapbox XR SDK — inventory (public surface only)
Source:
zappar-xr/zapbox-xr-sdk, v0.5.0, head91b52bd(14 commits). Local reference clone:~/workspace/zapbox-xr-sdk-upstream.License: Zappar custom license (
LICENSE.md) — use only in connection with Zapbox hardware; no competitive analysis; no developing a competing product or service; no altering binary libraries; no circumventing expiry; Zappar owns IP in the Work and derivative works. This inventory is clean-room: public names, signatures, file layout, and public docs only. No code bodies, no implementation logic, no binary analysis.1. Package identity
package.json: namecom.zappar.xr.zapbox, displayName "Zapbox XR SDK", version0.5.0,unity: 2019.4. Description: "Zapbox XR SDK for Unity from Zappar. Providing rendering and controller input support for Zapbox." Keywords: zappar, zapbox, vr, xr, ar, sdk.com.unity.xr.management3.2.9,com.unity.xr.legacyinputhelpers2.1.4.Zappar.XR.Zapbox(Runtime; references Unity.XR.Management, Unity.InputSystem; include platforms Editor + iOS;UNITY_INPUT_SYSTEMversion define) andZappar.XR.Zapbox.Editor(Editor; references Unity.XR.Management.Editor, Unity.XR.Management, Zappar.XR.Zapbox;XR_MGMT_GTE_320define at xr.management 3.2.0).2. File layout (public surface)
(
*.metafiles alongside each file are Unity import metadata, not listed.)3. Subsystem manifest
Plugins/UnitySubsystemsManifest.json: nameZapbox, version0.1.0,libraryName: GfxPluginZapbox, subsystems:id: ZapboxDisplayid: ZapboxInput4. Runtime C# provider — public API shape
4.1
ApiConstants(Zappar.XR, internal static class)kPluginName:"GfxPluginZapbox"onUNITY_ANDROID,"__Internal"onUNITY_IOS,"NOT_AVAILABLE"otherwise. (Note: the Android branch exists in the constants even though no Android build is shipped.)kDeviceName:"Zapbox".kDisplayProviderId:"ZapboxDisplay";kInputProviderId:"ZapboxInput".kDeviceIdZapboxHeadset = 0,kDeviceIdControllerLeft = 1,kDeviceIdControllerRight = 2.4.2
ZapboxLoader : XRLoaderHelper(Zappar.XR)Lifecycle entry points (the XR Management loader contract — names only):
public override bool Initialize()public override bool Start()public override bool Stop()public override bool Deinitialize()State (field/property names only):
_displaySubsystemDescriptors(List<XRDisplaySubsystemDescriptor>),_inputSubsystemDescriptors(List<XRInputSubsystemDescriptor>),_isInitialized(internal static bool),_isStarted(internal static bool),_prevFramerate(int).InputLayoutLoader(static class,[InitializeOnLoad]): static constructor +public static void RegisterInputLayouts()— registers the input layouts below with Unity's Input System.4.3
ZapboxSettings : ScriptableObjectEmpty serializable settings object. Required by the XR Management package; carries no fields of its own.
4.4 Input system —
ZapboxController(Zappar,InputControlLayoutdisplayName "Zapbox Controller", commonUsagesLeftHand/RightHand)Layout class
ZapboxControllerProfile.ZapboxController : XRController. Controls (name, type, aliases) — this is the controller's public input surface:thumbsticktriggergripprimaryButtonsecondaryButtonmenuthumbstickClickedtriggerPressedgripPressedtrackingStateisTrackeddevicePositiondeviceRotationdeviceVelocityFinishSetup()binds each control by child-control name (same names as above). The layout's own comment states it follows Oculus Touch terminology (e.g.gripPressed) because those are the names the XR Interaction Toolkit defaults use.Inputs (what flows in): headset pose, per-controller pose/velocity/tracking state, thumbstick, trigger/grip analog values, button states.
Outputs (what flows out): the above as Unity Input System state, consumable by the XR Interaction Toolkit (grab interactions work out of the box per the README).
5. iOS native bridge — exported symbols only
Plugins/iOS/GfxPluginZapbox.m(37 lines) is a shim, not the implementation. Exported symbols (names only):UnityPluginLoad(IUnityInterfaces* unityInterfaces)/UnityPluginUnload()— standard Unity native-rendering-plugin entry points (UNITY_INTERFACE_EXPORT).+loadPlugin— registers the plugin viaUnityRegisterRenderingPluginV5and calls the externalZapboxDisplay_SetUnityViewController(UnityGetGLViewController()).ZapboxDisplay_SetUnityViewController(UIViewController*),UnityGetGLViewController().Plugins/iOS/GfxPluginZapbox.a(17.5 MB,current ar archive) is the native implementation — black box, not analyzed. What its.metadeclares it needs: iOS only (Android excluded), framework dependenciesCoreBluetooth,IOSurface,Metal,MetalKit. From those declared dependencies alone: controllers connect over Bluetooth; camera frames pass through IOSurface/Metal; rendering is Metal.6. Bundle payloads — names only, black box
ZapBoxMarker.zbs(7,464 bytes),ZapBoxController.zbs(1,802 bytes),ZapBoxMarker.zcs(153 bytes). File-magic only (no decoding): both.zbsfiles begin with the bytesZBSfollowed by a version byte (0x02marker,0x01controller); the.zcsbegins withZCS+0x01. Their roles, from their names and the README's marker/controller discussion: the marker payload describes the world-anchor markers; the controller payload describes the controller's trackable; the.zcsis a small companion config. Contents not read.Zapbox.bundle/ui/— pairing/calibration web UI assets (file names only):index.html,index.*.js,index.*.css,zcomponent.*.css,LatoBold/LatoRegularfonts,controller_left.*.glb/controller_right.*.glb, button/ring/tick/logo/gradient images. No contents analyzed; the asset set is consistent with an in-app controller-pairing/calibration UI (see §9).Resources/Zapbox/left.fbx+right.fbxwith per-model PNG textures: the in-app 3D controller models.7. Editor scripts — stated responsibilities
Editor/BuildPostProcessor.cs—public static class BuildPostProcessor,[PostProcessBuild] public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath), plus private helperensureKeyIsSet(PlistElementDict root, string key, string defaultValue). Runs only whenbuildTarget == BuildTarget.iOS. Stated responsibility (from names + Unity's post-process contract): after an iOS build, adjust the generated Xcode project/plist so the app is configured for the Zapbox provider. (Which keys: not recorded — that is implementation detail.)Editor/ZapboxMetadata.cs—public class ZapboxPackage : IXRPackage. Metadata values: packageName "Zapbox XR Plugin", packageIdcom.zappar.xr.zapbox, settingsTypeZappar.XR.ZapboxSettings, loaderName "Zapbox", loaderTypeZappar.XR.ZapboxLoader,supportedBuildTargets: [BuildTargetGroup.iOS](iOS only).PopulateNewSettingsInstance(ScriptableObject obj)— creates the settings instance for XR Management.8. Marker / world-anchor system (public docs: README + zappar.com)
.zbspayloads (§6) — the marker artwork/geometry is not specified in any public file in this repo.9. Controller pairing + calibration flow (public docs: README 0.4.0 / 0.5.0 notes + zappar.com)
10. Frame pacing / late-warp (public docs: README)
11. Video capture modes (public docs: README)
12. What is iOS-only by construction
GfxPluginZapbox.a(iOS, Metal/IOSurface/CoreBluetooth), the Xcode build post-processor, thesupportedBuildTargets: [iOS]metadata, the.a.metaAndroid exclusion.ApiConstants.kPluginNamehas aUNITY_ANDROIDbranch ("GfxPluginZapbox"). No Android native library, manifest entry, or build support ships.13. What Android needs instead (inventory-level, detail in the rebuild plan)
14. Load-bearing closed parts (plain statement)
The tracking core lives entirely in the closed native library + closed bundle payloads: marker detection/pose estimation, controller optical tracking, sensor fusion, late-warp, and the marker/controller definitions (
.zbs/.zcs). There is no public spec for any of them in this repo. The rebuild therefore cannot reuse Zappar's tracker — it must implement its own tracker from first principles (marker detection, pose estimation, fusion) against marker artwork it defines itself, and treat the controllers as BLE input devices whose protocol must be established with hardware in hand. See the rebuild plan's open questions.