Skip to content
This repository was archived by the owner on Jun 12, 2024. It is now read-only.

Conversation

@philipturner
Copy link
Owner

@philipturner philipturner commented Jul 1, 2023

Add an experimental API for serializing and exporting ARHeadsetKit's internal data. It only supports a geometry + color format now, but is extendable to the lidar-scanning-app format (geometry only).

Example of usage:

import ARHeadsetKit
import Metal
import QuartzCore

class MyRenderer: CustomRenderer {
  unowned let renderer: MainRenderer
  var startTime: Double?
  var endTime: Double?
  
  required init(renderer: MainRenderer, library: MTLLibrary!) {
    self.renderer = renderer
  }
  
  func updateResources() {
    guard let startTime = self.startTime else {
      self.startTime = CACurrentMediaTime()
      return
    }
    if self.endTime != nil {
      // Already exported once; don't do it again.
      return
    }
    
    // Automatically export after 30 seconds (you can adjust the duration).
    let timerDuration: Double = 30.0
    let currentTime = CACurrentMediaTime()
    guard currentTime - startTime > timerDuration else { return }
    self.endTime = currentTime
    
    let exporter = ARDataExporter(renderer: self.renderer)
    let data = exporter.exportMesh(includeColor: true)
    
    // Do something with the `Data` object, like inspecting it in some Swift
    // code you write. You don't have to export it via 'ActivityViewController'
    // (ref: https://github.com/philipturner/lidar-scanning-app/blob/main/LiDARScanningApp/ActivityViewController.swift)
    // just to debug the exporter.
    print("Number of bytes: \(data.count)")
    
    let rawMemory = malloc(data.count)!
    defer { free(rawMemory) }
    data.copyBytes(
      to: rawMemory.assumingMemoryBound(to: UInt8.self), count: data.count)
    
    let header = rawMemory.assumingMemoryBound(to: UInt32.self)
    let numSmallTriangles = Int(header[0])
    let numLargeTriangles = Int(header[1])
    print("Number of small triangles: \(numSmallTriangles)")
    print("Number of large triangles: \(numLargeTriangles)")
    
    if numSmallTriangles > 0 {
      let smallTriangles = rawMemory + 64
      for i in 0..<min(numSmallTriangles, 10) {
        // Address of the i-th triangle.
        _ = smallTriangles + i * 320
      }
    }
  }
  
  func drawGeometry(renderEncoder: ARMetalRenderCommandEncoder) { }
}

Resolves #91

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API for exporting mesh and color data

1 participant