Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
3ae7077
Move some files to PointNMap package and import accordingly
himanshunaidu Apr 29, 2026
2e6b600
Attempt first set of source code movement into package
himanshunaidu Apr 30, 2026
926bf28
Move back main files to main app
himanshunaidu Apr 30, 2026
a24b626
Create new framework and start adding files as added to spm package
himanshunaidu Apr 30, 2026
b27ec8f
First solution attempt at creating a common ShaderTypes file
himanshunaidu Apr 30, 2026
9e34904
Start moving computer vision folder to framework
himanshunaidu Apr 30, 2026
5a7ae7a
Adding more files to PointNMap framework
himanshunaidu Apr 30, 2026
27aa3fe
Add more files for ComputerVision and MachineLearning into the framework
himanshunaidu Apr 30, 2026
ab15a85
Add attribute estimation related code to frameworks
himanshunaidu Apr 30, 2026
0fab840
Modularize the accessibility feature class config by adding feature k…
himanshunaidu May 1, 2026
bd6cd1c
Additional file transfers
himanshunaidu May 1, 2026
6db1595
Add Capture and Annotation based files to framework
himanshunaidu May 1, 2026
643cb78
Major movements and updates of ARCameraView, AnnotationView and relat…
himanshunaidu May 1, 2026
c2a3d7f
Complete the first version of shared framework and fix relevant bugs
himanshunaidu May 1, 2026
837c6cd
Add two additional sub-attributes for surface integrity
himanshunaidu May 2, 2026
71a29f0
Add placeholder code for the additional sub-attributes in Attribute E…
himanshunaidu May 2, 2026
d5b47d6
Add first version of surface integrity sub-attribute implementations
himanshunaidu May 2, 2026
b9adde9
Fix detail view for surface disruption value
himanshunaidu May 2, 2026
f45762a
Merge pull request #501 from TaskarCenterAtUW/scratch/surface_integri…
himanshunaidu May 5, 2026
51e6766
Remove live segmentation of mesh in ar view controller and allow only…
himanshunaidu May 5, 2026
7712393
Add in-progress icon to the capture button if the camera manager has …
himanshunaidu May 5, 2026
b87117b
Merge pull request #503 from TaskarCenterAtUW/scratch/mesh_mode_run_i…
himanshunaidu May 5, 2026
4a07a13
Fix some issues with layout constraints and real time image generatio…
himanshunaidu May 6, 2026
cc9d1d4
Update location manager to check for precise location permission
himanshunaidu May 6, 2026
6cf38a1
Add alerts to request location permission from user
himanshunaidu May 6, 2026
3af8473
Merge pull request #504 from TaskarCenterAtUW/scratch/location_permis…
himanshunaidu May 6, 2026
e272f02
More changes to location permission alerts and add first version of c…
himanshunaidu May 6, 2026
2d25dea
Add fixes to the camera permission alerts
himanshunaidu May 6, 2026
8b969ed
Merge pull request #505 from TaskarCenterAtUW/scratch/camera_permission
himanshunaidu May 6, 2026
5b4537c
Update dependency-based build settings
himanshunaidu May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions ARCHITECTURE_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Architecture Notes

## Overview

### Main App: iOSAccessAssessment

### Shared Code: PointNMapShared

Framework.
1,310 changes: 613 additions & 697 deletions IOSAccessAssessment.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@
ReferencedContainer = "container:IOSAccessAssessment.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A312FD842FA3391C0044808E"
BuildableName = "PointNMapSharedTests.xctest"
BlueprintName = "PointNMapSharedTests"
ReferencedContainer = "container:IOSAccessAssessment.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,19 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A312FD842FA3391C0044808E"
BuildableName = "PointNMapSharedTests.xctest"
BlueprintName = "PointNMapSharedTests"
ReferencedContainer = "container:IOSAccessAssessment.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
Expand Down
5 changes: 3 additions & 2 deletions IOSAccessAssessment/ARCamera/TestCameraManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import ARKit
import RealityKit
import Combine
import simd
import PointNMapShared

final class TestCameraManager: NSObject, ObservableObject, TestCameraProcessingDelegate {
var selectedClasses: [AccessibilityFeatureClass] = []
Expand Down Expand Up @@ -77,7 +78,7 @@ final class TestCameraManager: NSObject, ObservableObject, TestCameraProcessingD
self.metalContext = metalContext
self.isEnhancedAnalysisEnabled = isEnhancedAnalysisEnabled
self.meshGPUSnapshotGenerator = MeshGPUSnapshotGenerator(device: metalContext.device)
// try setUpPreAllocatedPixelBufferPools(size: Constants.SelectedAccessibilityFeatureConfig.inputSize)
// try setUpPreAllocatedPixelBufferPools(size: SharedAppConstants.SelectedAccessibilityFeatureConfig.inputSize)
self.cameraOutputImageCallback = cameraOutputImageCallback
self.isConfigured = true

Expand Down Expand Up @@ -206,7 +207,7 @@ extension TestCameraManager {
guard let segmentationPipeline = segmentationPipeline else {
throw ARCameraManagerError.segmentationNotConfigured
}
let croppedSize = Constants.SelectedAccessibilityFeatureConfig.inputSize
let croppedSize = SharedAppConstants.SelectedAccessibilityFeatureConfig.inputSize
let imageOrientation: CGImagePropertyOrientation = CameraOrientation.getCGImageOrientationForInterface(
currentInterfaceOrientation: interfaceOrientation
)
Expand Down
3 changes: 2 additions & 1 deletion IOSAccessAssessment/ARCamera/TestCameraViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import ARKit
import CoreImage
import CoreImage.CIFilterBuiltins
import simd
import PointNMapShared

@MainActor
protocol TestCameraProcessingOutputConsumer: AnyObject {
Expand Down Expand Up @@ -331,7 +332,7 @@ final class TestCameraViewController: UIViewController, TestCameraProcessingOutp
) {
var totalVertexCount = 0
for accessibilityFeatureClass in accessibilityFeatureClasses {
guard Constants.SelectedAccessibilityFeatureConfig.classes.contains(accessibilityFeatureClass) else {
guard SharedAppConstants.SelectedAccessibilityFeatureConfig.classes.contains(accessibilityFeatureClass) else {
print("Invalid segmentation class: \(accessibilityFeatureClass)")
continue
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// IsExistingExtension.swift
// IOSAccessAssessment
//
// Created by Himanshu on 4/30/26.
//
import PointNMapShared
import CoreLocation
import MapKit

extension AttributeEstimationPipeline {
func processIsExistingRequest(
deviceLocation: CLLocationCoordinate2D,
mappingData: CurrentMappingData,
accessibilityFeature: MappedEditableAccessibilityFeature
) {
/// Threshold needs to be in Map Units
let distanceThreshold = PointNMapConstants.WorkspaceConstants.fetchUpdateRadiusThresholdInMeters * MKMapPointsPerMeterAtLatitude(deviceLocation.latitude)
guard let LocationDetails = accessibilityFeature.locationDetails else {
accessibilityFeature.setIsExisting(false)
return
}
let matchedElement: (any OSWElement)? = mappingData.getMatchedFeature(
to: LocationDetails, featureClass: accessibilityFeature.accessibilityFeatureClass,
captureId: self.captureImageData?.id,
distanceThreshold: distanceThreshold
)
guard let matchedElement = matchedElement else {
accessibilityFeature.setIsExisting(false)
return
}
let isExisting = accessibilityFeature.accessibilityFeatureClass.kind.oswPolicy.isExistingFirst
accessibilityFeature.setIsExisting(isExisting)
accessibilityFeature.setOSWElement(oswElement: matchedElement)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// AccessibilityFeatureAttribute.swift
// IOSAccessAssessment
//
// Created by Himanshu on 11/9/25.
//

import Foundation
import PointNMapShared

/**
Enumeration defining various accessibility feature attributes, along with their metadata and value types.

- Note: One needs to be aware of the value types associated with each attribute. The valueType property is only meant for reference.
*/
extension AccessibilityFeatureAttribute {
/// TODO: Verify these OSM tag keys
public var osmTagKey: String {
switch self {
case .width: return "width"
case .runningSlope: return "incline"
case .crossSlope: return "cross_slope"
case .surfaceIntegrity: return "surface_integrity"
case .lidarDepth: return APIConstants.TagKeys.lidarDepthKey
case .latitudeDelta: return APIConstants.TagKeys.latitudeDeltaKey
case .longitudeDelta: return APIConstants.TagKeys.longitudeDeltaKey
case .widthLegacy: return "width_legacy"
case .runningSlopeLegacy: return "incline_legacy"
case .crossSlopeLegacy: return "cross_slope_legacy"
case .widthFromImage: return "width_from_image"
case .runningSlopeFromImage: return "running_slope_from_image"
case .crossSlopeFromImage: return "cross_slope_from_image"
default: return ""
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// AccessibilityFeatureKindExtension.swift
// IOSAccessAssessment
//
// Created by Himanshu on 4/30/26.
//

import PointNMapShared

/**
Extension to add mapping-related logic to AccessibilityFeatureKind.
*/
extension AccessibilityFeatureKind {
var oswPolicy: OSWPolicy {
switch self {
case .sidewalk: return OSWPolicy(oswElementClass: .Sidewalk, isExistingFirst: true)
case .building: return OSWPolicy(oswElementClass: .Building, isExistingFirst: false)
case .pole: return OSWPolicy(oswElementClass: .Pole, isExistingFirst: false)
case .trafficLight: return OSWPolicy(oswElementClass: .TrafficLight, isExistingFirst: false)
case .trafficSign: return OSWPolicy(oswElementClass: .TrafficSign, isExistingFirst: false)
case .vegetation: return OSWPolicy(oswElementClass: .Vegetation, isExistingFirst: false)
default: return OSWPolicy.default
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
//
import Foundation
import CoreImage

import PointNMapShared

extension AccessibilityFeatureConfig {
static let cityscapes: AccessibilityFeatureClassConfig = AccessibilityFeatureClassConfig(
Expand All @@ -33,14 +33,12 @@ extension AccessibilityFeatureConfig {
AccessibilityFeatureClass(
id: "road", name: "Road", grayscaleValue: 7.0 / 255.0, labelValue: 7,
color: CIColor(red: 0.502, green: 0.251, blue: 0.502),
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4),
oswPolicy: OSWPolicy(oswElementClass: .Sidewalk, isExistingFirst: true), // Temporarily set for testing
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4)
),
AccessibilityFeatureClass(
id: "sidewalk", name: "Sidewalk", grayscaleValue: 8.0 / 255.0, labelValue: 8,
color: CIColor(red: 0.957, green: 0.137, blue: 0.910),
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4),
oswPolicy: OSWPolicy(oswElementClass: .Sidewalk, isExistingFirst: true), // Temporarily set for testing
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4)
),
AccessibilityFeatureClass(
id: "parking", name: "Parking", grayscaleValue: 9.0 / 255.0, labelValue: 9,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
//
import Foundation
import CoreImage

import PointNMapShared

extension AccessibilityFeatureConfig {
static let cityscapesSubset: AccessibilityFeatureClassConfig = AccessibilityFeatureClassConfig(
Expand All @@ -16,13 +16,11 @@ extension AccessibilityFeatureConfig {
id: "road", name: "Road", grayscaleValue: 0.0 / 255.0, labelValue: 0,
color: CIColor(red: 0.502, green: 0.251, blue: 0.502),
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4),
oswPolicy: OSWPolicy(oswElementClass: .Sidewalk, isExistingFirst: true), // Temporarily set for testing
),
AccessibilityFeatureClass(
id: "sidewalk", name: "Sidewalk", grayscaleValue: 1.0 / 255.0, labelValue: 1,
color: CIColor(red: 0.957, green: 0.137, blue: 0.910),
bounds: CGRect(x: 0.0, y: 0.1, width: 1.0, height: 0.4),
oswPolicy: OSWPolicy(oswElementClass: .Sidewalk, isExistingFirst: true), // Temporarily set for testing
),
AccessibilityFeatureClass(
id: "building", name: "Building", grayscaleValue: 2.0 / 255.0, labelValue: 2,
Expand Down
Loading