replate-camera 0.14.2 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/replatecamera/ReplateCameraView.kt +291 -34
- package/ios/ReplateCameraViewManager.m +6 -0
- package/ios/ReplateCameraViewManager.swift +179 -11
- package/lib/commonjs/index.js +12 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +9 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +12 -0
- package/ios/FocusEntity/FocusEntity-Example/FocusEntity-Example.xcodeproj/project.pbxproj +0 -383
|
@@ -10,6 +10,8 @@ import android.os.Build
|
|
|
10
10
|
import android.os.Environment
|
|
11
11
|
import android.os.Handler
|
|
12
12
|
import android.os.Looper
|
|
13
|
+
import android.os.PowerManager
|
|
14
|
+
import android.os.SystemClock
|
|
13
15
|
import android.util.AttributeSet
|
|
14
16
|
import android.util.Log
|
|
15
17
|
import android.view.GestureDetector
|
|
@@ -22,7 +24,11 @@ import androidx.core.app.ActivityCompat
|
|
|
22
24
|
import androidx.core.content.ContextCompat
|
|
23
25
|
import androidx.exifinterface.media.ExifInterface
|
|
24
26
|
import androidx.fragment.app.FragmentActivity
|
|
27
|
+
import androidx.lifecycle.DefaultLifecycleObserver
|
|
28
|
+
import androidx.lifecycle.LifecycleOwner
|
|
29
|
+
import androidx.lifecycle.ProcessLifecycleOwner
|
|
25
30
|
import com.google.ar.core.Anchor
|
|
31
|
+
import com.google.ar.core.Session
|
|
26
32
|
import com.google.ar.core.HitResult
|
|
27
33
|
import com.google.ar.core.Plane
|
|
28
34
|
import com.google.ar.core.TrackingState
|
|
@@ -63,7 +69,7 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
63
69
|
attrs: AttributeSet? = null,
|
|
64
70
|
defStyleAttr: Int = 0
|
|
65
71
|
) : FrameLayout(context, attrs, defStyleAttr), Scene.OnUpdateListener,
|
|
66
|
-
android.hardware.SensorEventListener {
|
|
72
|
+
android.hardware.SensorEventListener, DefaultLifecycleObserver {
|
|
67
73
|
|
|
68
74
|
companion object {
|
|
69
75
|
private const val TAG = "ReplateCameraView"
|
|
@@ -95,6 +101,20 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
95
101
|
// AR Sceneform stuff
|
|
96
102
|
private lateinit var arFragment: ArFragment
|
|
97
103
|
private var anchorNode: AnchorNode? = null
|
|
104
|
+
private var isSessionPaused = false
|
|
105
|
+
private var isViewAttached = false
|
|
106
|
+
private var sensorManager: android.hardware.SensorManager? = null
|
|
107
|
+
private var gravitySensor: android.hardware.Sensor? = null
|
|
108
|
+
private var powerManager: PowerManager? = null
|
|
109
|
+
private var lastSessionStartTime = 0L
|
|
110
|
+
private var sessionTimeoutHandler: Handler? = null
|
|
111
|
+
private var sessionTimeoutRunnable: Runnable? = null
|
|
112
|
+
|
|
113
|
+
// Overheating prevention constants
|
|
114
|
+
private companion object {
|
|
115
|
+
const val MAX_CONTINUOUS_SESSION_TIME = 30 * 60 * 1000L // 30 minutes
|
|
116
|
+
const val THERMAL_BREAK_DURATION = 5 * 60 * 1000L // 5 minutes
|
|
117
|
+
}
|
|
98
118
|
|
|
99
119
|
// Spheres and a "focus node"
|
|
100
120
|
private val spheresModels = mutableListOf<TransformableNode>()
|
|
@@ -127,11 +147,28 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
127
147
|
scaleDetector = ScaleGestureDetector(context, ScaleListener())
|
|
128
148
|
|
|
129
149
|
// Register a gravity sensor to replicate iOS's CMMotionManager
|
|
130
|
-
|
|
150
|
+
sensorManager = context.getSystemService(Context.SENSOR_SERVICE)
|
|
131
151
|
as? android.hardware.SensorManager
|
|
132
|
-
sensorManager?.getDefaultSensor(android.hardware.Sensor.TYPE_GRAVITY)
|
|
133
|
-
|
|
134
|
-
|
|
152
|
+
gravitySensor = sensorManager?.getDefaultSensor(android.hardware.Sensor.TYPE_GRAVITY)
|
|
153
|
+
|
|
154
|
+
// Register for lifecycle events
|
|
155
|
+
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
|
|
156
|
+
|
|
157
|
+
// Initialize power manager for thermal monitoring
|
|
158
|
+
powerManager = context.getSystemService(Context.POWER_SERVICE) as? PowerManager
|
|
159
|
+
|
|
160
|
+
// Initialize session timeout handler
|
|
161
|
+
sessionTimeoutHandler = Handler(Looper.getMainLooper())
|
|
162
|
+
|
|
163
|
+
// Register sensor when view is ready
|
|
164
|
+
registerSensorListener()
|
|
165
|
+
isViewAttached = true
|
|
166
|
+
|
|
167
|
+
// Record session start time
|
|
168
|
+
lastSessionStartTime = SystemClock.elapsedRealtime()
|
|
169
|
+
|
|
170
|
+
// Start session timeout monitoring
|
|
171
|
+
startSessionTimeoutMonitoring()
|
|
135
172
|
}
|
|
136
173
|
|
|
137
174
|
/**
|
|
@@ -189,6 +226,9 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
189
226
|
val frame = arFragment.arSceneView.arFrame ?: return
|
|
190
227
|
if (frame.camera.trackingState != TrackingState.TRACKING) return
|
|
191
228
|
|
|
229
|
+
// Check thermal state periodically to prevent overheating
|
|
230
|
+
checkThermalState()
|
|
231
|
+
|
|
192
232
|
// If you need per-frame logic, do it here.
|
|
193
233
|
// Example: check lighting, or do real-time distance checks, etc.
|
|
194
234
|
}
|
|
@@ -428,6 +468,213 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
428
468
|
// Not used
|
|
429
469
|
}
|
|
430
470
|
|
|
471
|
+
// ------------------------------------------------------------------------
|
|
472
|
+
// Lifecycle Management
|
|
473
|
+
// ------------------------------------------------------------------------
|
|
474
|
+
|
|
475
|
+
override fun onAttachedToWindow() {
|
|
476
|
+
super.onAttachedToWindow()
|
|
477
|
+
isViewAttached = true
|
|
478
|
+
if (isSessionPaused) {
|
|
479
|
+
resumeSession()
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
override fun onDetachedFromWindow() {
|
|
484
|
+
super.onDetachedFromWindow()
|
|
485
|
+
isViewAttached = false
|
|
486
|
+
pauseSession()
|
|
487
|
+
cleanupResources()
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
override fun onStart(owner: LifecycleOwner) {
|
|
491
|
+
super.onStart(owner)
|
|
492
|
+
if (isViewAttached) {
|
|
493
|
+
resumeSession()
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
override fun onStop(owner: LifecycleOwner) {
|
|
498
|
+
super.onStop(owner)
|
|
499
|
+
pauseSession()
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
override fun onDestroy(owner: LifecycleOwner) {
|
|
503
|
+
super.onDestroy(owner)
|
|
504
|
+
cleanupResources()
|
|
505
|
+
ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Pauses the AR session and unregisters sensors to prevent overheating
|
|
510
|
+
*/
|
|
511
|
+
private fun pauseSession() {
|
|
512
|
+
if (isSessionPaused) return
|
|
513
|
+
|
|
514
|
+
try {
|
|
515
|
+
// Pause AR session
|
|
516
|
+
arFragment.arSceneView.session?.pause()
|
|
517
|
+
|
|
518
|
+
// Unregister sensor listener
|
|
519
|
+
unregisterSensorListener()
|
|
520
|
+
|
|
521
|
+
// Remove scene update listener
|
|
522
|
+
arFragment.arSceneView.scene.removeOnUpdateListener(this)
|
|
523
|
+
|
|
524
|
+
isSessionPaused = true
|
|
525
|
+
Log.d(TAG, "AR session paused")
|
|
526
|
+
} catch (e: Exception) {
|
|
527
|
+
Log.e(TAG, "Error pausing AR session: ${e.message}")
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Resumes the AR session and re-registers sensors
|
|
533
|
+
*/
|
|
534
|
+
private fun resumeSession() {
|
|
535
|
+
if (!isSessionPaused) return
|
|
536
|
+
|
|
537
|
+
try {
|
|
538
|
+
// Resume AR session
|
|
539
|
+
arFragment.arSceneView.session?.resume()
|
|
540
|
+
|
|
541
|
+
// Re-register sensor listener
|
|
542
|
+
registerSensorListener()
|
|
543
|
+
|
|
544
|
+
// Re-add scene update listener
|
|
545
|
+
arFragment.arSceneView.scene.addOnUpdateListener(this)
|
|
546
|
+
|
|
547
|
+
isSessionPaused = false
|
|
548
|
+
Log.d(TAG, "AR session resumed")
|
|
549
|
+
} catch (e: Exception) {
|
|
550
|
+
Log.e(TAG, "Error resuming AR session: ${e.message}")
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Registers the gravity sensor listener
|
|
556
|
+
*/
|
|
557
|
+
private fun registerSensorListener() {
|
|
558
|
+
try {
|
|
559
|
+
gravitySensor?.let { sensor ->
|
|
560
|
+
sensorManager?.registerListener(
|
|
561
|
+
this,
|
|
562
|
+
sensor,
|
|
563
|
+
android.hardware.SensorManager.SENSOR_DELAY_GAME
|
|
564
|
+
)
|
|
565
|
+
}
|
|
566
|
+
} catch (e: Exception) {
|
|
567
|
+
Log.e(TAG, "Error registering sensor listener: ${e.message}")
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Unregisters the gravity sensor listener
|
|
573
|
+
*/
|
|
574
|
+
private fun unregisterSensorListener() {
|
|
575
|
+
try {
|
|
576
|
+
sensorManager?.unregisterListener(this)
|
|
577
|
+
} catch (e: Exception) {
|
|
578
|
+
Log.e(TAG, "Error unregistering sensor listener: ${e.message}")
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Cleans up all resources including AR session, sensors, and nodes
|
|
584
|
+
*/
|
|
585
|
+
private fun cleanupResources() {
|
|
586
|
+
try {
|
|
587
|
+
// Stop session timeout monitoring
|
|
588
|
+
stopSessionTimeoutMonitoring()
|
|
589
|
+
|
|
590
|
+
// Clean up AR session
|
|
591
|
+
arFragment.arSceneView.session?.close()
|
|
592
|
+
|
|
593
|
+
// Unregister sensor listener
|
|
594
|
+
unregisterSensorListener()
|
|
595
|
+
|
|
596
|
+
// Remove scene listener
|
|
597
|
+
arFragment.arSceneView.scene.removeOnUpdateListener(this)
|
|
598
|
+
|
|
599
|
+
// Clean up nodes
|
|
600
|
+
anchorNode?.let { node ->
|
|
601
|
+
node.children.forEach { child ->
|
|
602
|
+
node.removeChild(child)
|
|
603
|
+
}
|
|
604
|
+
arFragment.arSceneView.scene.removeChild(node)
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// Clear references
|
|
608
|
+
anchorNode = null
|
|
609
|
+
spheresModels.clear()
|
|
610
|
+
focusNode = null
|
|
611
|
+
|
|
612
|
+
Log.d(TAG, "Resources cleaned up")
|
|
613
|
+
} catch (e: Exception) {
|
|
614
|
+
Log.e(TAG, "Error cleaning up resources: ${e.message}")
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* Starts monitoring session timeout to prevent overheating
|
|
620
|
+
*/
|
|
621
|
+
private fun startSessionTimeoutMonitoring() {
|
|
622
|
+
sessionTimeoutRunnable = Runnable {
|
|
623
|
+
Log.w(TAG, "Session timeout reached, pausing to prevent overheating")
|
|
624
|
+
pauseSession()
|
|
625
|
+
|
|
626
|
+
// Schedule resume after thermal break
|
|
627
|
+
sessionTimeoutHandler?.postDelayed({
|
|
628
|
+
Log.i(TAG, "Thermal break complete, resuming session")
|
|
629
|
+
lastSessionStartTime = SystemClock.elapsedRealtime()
|
|
630
|
+
resumeSession()
|
|
631
|
+
startSessionTimeoutMonitoring()
|
|
632
|
+
}, THERMAL_BREAK_DURATION)
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
sessionTimeoutHandler?.postDelayed(
|
|
636
|
+
sessionTimeoutRunnable!!,
|
|
637
|
+
MAX_CONTINUOUS_SESSION_TIME
|
|
638
|
+
)
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Stops session timeout monitoring
|
|
643
|
+
*/
|
|
644
|
+
private fun stopSessionTimeoutMonitoring() {
|
|
645
|
+
sessionTimeoutRunnable?.let { runnable ->
|
|
646
|
+
sessionTimeoutHandler?.removeCallbacks(runnable)
|
|
647
|
+
}
|
|
648
|
+
sessionTimeoutRunnable = null
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* Checks if device is in thermal state and pauses session if needed
|
|
653
|
+
*/
|
|
654
|
+
private fun checkThermalState() {
|
|
655
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
656
|
+
powerManager?.let { pm ->
|
|
657
|
+
val thermalStatus = pm.thermalStatus
|
|
658
|
+
when (thermalStatus) {
|
|
659
|
+
PowerManager.THERMAL_STATUS_MODERATE,
|
|
660
|
+
PowerManager.THERMAL_STATUS_SEVERE,
|
|
661
|
+
PowerManager.THERMAL_STATUS_CRITICAL,
|
|
662
|
+
PowerManager.THERMAL_STATUS_EMERGENCY,
|
|
663
|
+
PowerManager.THERMAL_STATUS_SHUTDOWN -> {
|
|
664
|
+
Log.w(TAG, "Device thermal status: $thermalStatus, pausing AR session")
|
|
665
|
+
pauseSession()
|
|
666
|
+
}
|
|
667
|
+
else -> {
|
|
668
|
+
// Device is cool, safe to continue
|
|
669
|
+
if (isSessionPaused && isViewAttached) {
|
|
670
|
+
resumeSession()
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
431
678
|
// ------------------------------------------------------------------------
|
|
432
679
|
// Reset Logic
|
|
433
680
|
// ------------------------------------------------------------------------
|
|
@@ -435,36 +682,46 @@ class ReplateCameraView @JvmOverloads constructor(
|
|
|
435
682
|
* Resets the AR session, removing anchors and restoring default geometry.
|
|
436
683
|
*/
|
|
437
684
|
fun resetSession() {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
685
|
+
try {
|
|
686
|
+
// Clean up existing nodes
|
|
687
|
+
anchorNode?.let { node ->
|
|
688
|
+
node.children.forEach { child ->
|
|
689
|
+
node.removeChild(child)
|
|
690
|
+
}
|
|
691
|
+
arFragment.arSceneView.scene.removeChild(node)
|
|
441
692
|
}
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
693
|
+
anchorNode = null
|
|
694
|
+
spheresModels.clear()
|
|
695
|
+
focusNode = null
|
|
696
|
+
|
|
697
|
+
// Reset booleans
|
|
698
|
+
for (i in upperSpheresSet.indices) {
|
|
699
|
+
upperSpheresSet[i] = false
|
|
700
|
+
lowerSpheresSet[i] = false
|
|
701
|
+
}
|
|
702
|
+
totalPhotosTaken = 0
|
|
703
|
+
photosFromDifferentAnglesTaken = 0
|
|
704
|
+
|
|
705
|
+
// Reset geometry
|
|
706
|
+
sphereRadius = DEFAULT_SPHERE_RADIUS
|
|
707
|
+
spheresRadius = DEFAULT_SPHERES_RADIUS
|
|
708
|
+
sphereAngle = ANGLE_INCREMENT_DEGREES
|
|
709
|
+
spheresHeight = DEFAULT_SPHERES_HEIGHT
|
|
710
|
+
distanceBetweenCircles = DEFAULT_DISTANCE_BETWEEN_CIRCLES
|
|
711
|
+
circleInFocus = 0
|
|
712
|
+
dragSpeed = DEFAULT_DRAG_SPEED
|
|
713
|
+
|
|
714
|
+
// Properly reset AR session
|
|
715
|
+
arFragment.arSceneView.session?.close()
|
|
716
|
+
setupArFragment()
|
|
717
|
+
|
|
718
|
+
// Restart session timeout monitoring after reset
|
|
719
|
+
lastSessionStartTime = SystemClock.elapsedRealtime()
|
|
720
|
+
startSessionTimeoutMonitoring()
|
|
721
|
+
|
|
722
|
+
Log.d(TAG, "AR session reset successfully")
|
|
723
|
+
} catch (e: Exception) {
|
|
724
|
+
Log.e(TAG, "Error resetting AR session: ${e.message}")
|
|
452
725
|
}
|
|
453
|
-
totalPhotosTaken = 0
|
|
454
|
-
photosFromDifferentAnglesTaken = 0
|
|
455
|
-
|
|
456
|
-
// Reset geometry
|
|
457
|
-
sphereRadius = DEFAULT_SPHERE_RADIUS
|
|
458
|
-
spheresRadius = DEFAULT_SPHERES_RADIUS
|
|
459
|
-
sphereAngle = ANGLE_INCREMENT_DEGREES
|
|
460
|
-
spheresHeight = DEFAULT_SPHERES_HEIGHT
|
|
461
|
-
distanceBetweenCircles = DEFAULT_DISTANCE_BETWEEN_CIRCLES
|
|
462
|
-
circleInFocus = 0
|
|
463
|
-
dragSpeed = DEFAULT_DRAG_SPEED
|
|
464
|
-
|
|
465
|
-
// If you want to fully re-init the AR session, you could do:
|
|
466
|
-
// arFragment.arSceneView.session?.close()
|
|
467
|
-
// setupArFragment()
|
|
468
|
-
// But that may require re-attaching the fragment, so it depends on your usage.
|
|
469
726
|
}
|
|
470
727
|
}
|
|
@@ -46,6 +46,12 @@ RCT_EXTERN_METHOD(getMemoryUsage:(RCTPromiseResolveBlock*)resolve
|
|
|
46
46
|
|
|
47
47
|
RCT_EXTERN_METHOD(reset)
|
|
48
48
|
|
|
49
|
+
RCT_EXTERN_METHOD(pauseSession)
|
|
50
|
+
|
|
51
|
+
RCT_EXTERN_METHOD(resumeSession)
|
|
52
|
+
|
|
53
|
+
RCT_EXTERN_METHOD(stopSession)
|
|
54
|
+
|
|
49
55
|
+ (BOOL)requiresMainQueueSetup
|
|
50
56
|
{
|
|
51
57
|
return NO;
|
|
@@ -70,6 +70,11 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
70
70
|
static var sessionId: UUID!
|
|
71
71
|
static var motionManager: CMMotionManager!
|
|
72
72
|
static var gravityVector: [String : Double] = [:]
|
|
73
|
+
|
|
74
|
+
// Tap handling state
|
|
75
|
+
private static var isProcessingTap = false
|
|
76
|
+
private static var lastTapTime: TimeInterval = 0
|
|
77
|
+
private static let tapDebounceInterval: TimeInterval = 0.5
|
|
73
78
|
/// Core Image context for rendering CIImages
|
|
74
79
|
static let ciContext = CIContext()
|
|
75
80
|
/// AR focus indicator
|
|
@@ -104,6 +109,7 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
104
109
|
|
|
105
110
|
// Thread Safety
|
|
106
111
|
private static var isResetting = false
|
|
112
|
+
private static var isSessionActive = false
|
|
107
113
|
|
|
108
114
|
// MARK: - Initialization
|
|
109
115
|
override init(frame: CGRect) {
|
|
@@ -119,6 +125,7 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
119
125
|
private func setupInitialState() {
|
|
120
126
|
requestCameraPermissions()
|
|
121
127
|
ReplateCameraView.INSTANCE = self
|
|
128
|
+
setupAppStateObservers()
|
|
122
129
|
}
|
|
123
130
|
|
|
124
131
|
// MARK: - Layout
|
|
@@ -130,6 +137,12 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
130
137
|
ReplateCameraView.width = frame.width
|
|
131
138
|
ReplateCameraView.height = frame.height
|
|
132
139
|
}
|
|
140
|
+
|
|
141
|
+
override func removeFromSuperview() {
|
|
142
|
+
print("[ReplateCameraView] View being removed from superview - cleaning up AR session")
|
|
143
|
+
pauseSession()
|
|
144
|
+
super.removeFromSuperview()
|
|
145
|
+
}
|
|
133
146
|
|
|
134
147
|
// MARK: - AR Setup and Configuration
|
|
135
148
|
static func setupAR() {
|
|
@@ -143,6 +156,8 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
143
156
|
DispatchQueue.main.async {
|
|
144
157
|
configureARView(configuration)
|
|
145
158
|
addRecognizers()
|
|
159
|
+
isSessionActive = true
|
|
160
|
+
print("[ReplateCameraView] AR session started")
|
|
146
161
|
}
|
|
147
162
|
}
|
|
148
163
|
}
|
|
@@ -202,26 +217,67 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
202
217
|
|
|
203
218
|
@objc func viewTapped(_ recognizer: UITapGestureRecognizer) {
|
|
204
219
|
print("VIEW TAPPED")
|
|
220
|
+
|
|
221
|
+
// Thread-safe tap handling with debouncing
|
|
222
|
+
Self.lock.lock()
|
|
223
|
+
defer { Self.lock.unlock() }
|
|
224
|
+
|
|
225
|
+
// Check if we're already processing a tap
|
|
226
|
+
if ReplateCameraView.isProcessingTap {
|
|
227
|
+
print("Tap ignored - already processing")
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Debounce rapid taps
|
|
232
|
+
let currentTime = Date().timeIntervalSince1970
|
|
233
|
+
if currentTime - ReplateCameraView.lastTapTime < ReplateCameraView.tapDebounceInterval {
|
|
234
|
+
print("Tap ignored - too soon after last tap")
|
|
235
|
+
return
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Check if anchor already exists (simplified condition)
|
|
239
|
+
if ReplateCameraView.anchorEntity != nil {
|
|
240
|
+
print("Tap ignored - anchor already set")
|
|
241
|
+
return
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Set processing flags
|
|
245
|
+
ReplateCameraView.isProcessingTap = true
|
|
246
|
+
ReplateCameraView.lastTapTime = currentTime
|
|
247
|
+
|
|
205
248
|
// Place anchor at the focus entity's current transform
|
|
206
|
-
guard let focus = ReplateCameraView.focusEntity else {
|
|
249
|
+
guard let focus = ReplateCameraView.focusEntity else {
|
|
250
|
+
ReplateCameraView.isProcessingTap = false
|
|
251
|
+
return
|
|
252
|
+
}
|
|
253
|
+
|
|
207
254
|
let focusTransform = focus.transformMatrix(relativeTo: nil)
|
|
208
255
|
let anchor = AnchorEntity(world: focusTransform)
|
|
209
256
|
print("ANCHOR FOUND\n", anchor.transform)
|
|
257
|
+
|
|
258
|
+
// Fire callback
|
|
210
259
|
let callback = ReplateCameraController.anchorSetCallback
|
|
211
260
|
if (callback != nil) {
|
|
212
261
|
callback!([])
|
|
213
262
|
ReplateCameraController.anchorSetCallback = nil
|
|
214
263
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
264
|
+
|
|
265
|
+
// Set the anchor
|
|
266
|
+
ReplateCameraView.anchorEntity = anchor
|
|
267
|
+
createSpheres(y: ReplateCameraView.spheresHeight)
|
|
268
|
+
createSpheres(y: ReplateCameraView.distanceBetweenCircles + ReplateCameraView.spheresHeight)
|
|
269
|
+
createFocusSphere()
|
|
270
|
+
guard let anchorEntity = ReplateCameraView.anchorEntity else {
|
|
271
|
+
ReplateCameraView.isProcessingTap = false
|
|
272
|
+
return
|
|
224
273
|
}
|
|
274
|
+
ReplateCameraView.arView.scene.anchors.append(anchorEntity)
|
|
275
|
+
|
|
276
|
+
// Hide the focus reticle once an anchor is set
|
|
277
|
+
ReplateCameraView.focusEntity?.isEnabled = false
|
|
278
|
+
|
|
279
|
+
// Reset processing flag
|
|
280
|
+
ReplateCameraView.isProcessingTap = false
|
|
225
281
|
}
|
|
226
282
|
|
|
227
283
|
@objc private func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
|
|
@@ -406,11 +462,28 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
406
462
|
}
|
|
407
463
|
|
|
408
464
|
private static func tearDownARSession() {
|
|
465
|
+
guard isSessionActive else { return }
|
|
466
|
+
|
|
409
467
|
arView?.session.pause()
|
|
410
468
|
arView?.session.delegate = nil
|
|
411
469
|
arView?.scene.anchors.removeAll()
|
|
412
470
|
arView?.removeFromSuperview()
|
|
413
471
|
arView?.window?.resignKey()
|
|
472
|
+
|
|
473
|
+
// Properly terminate the session
|
|
474
|
+
if let session = arView?.session {
|
|
475
|
+
session.pause()
|
|
476
|
+
// Clear all session data
|
|
477
|
+
arView?.session.delegate = nil
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Stop motion manager
|
|
481
|
+
motionManager?.stopDeviceMotionUpdates()
|
|
482
|
+
|
|
483
|
+
// Mark session as inactive
|
|
484
|
+
isSessionActive = false
|
|
485
|
+
|
|
486
|
+
print("[ReplateCameraView] AR session properly terminated")
|
|
414
487
|
}
|
|
415
488
|
|
|
416
489
|
private static func resetProperties() {
|
|
@@ -429,6 +502,13 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
429
502
|
gravityVector = [:]
|
|
430
503
|
ReplateCameraView.spherePrototype = nil
|
|
431
504
|
ReplateCameraController.wasOutOfRange = false
|
|
505
|
+
|
|
506
|
+
// Reset tap handling state
|
|
507
|
+
isProcessingTap = false
|
|
508
|
+
lastTapTime = 0
|
|
509
|
+
|
|
510
|
+
// Reset session state
|
|
511
|
+
isSessionActive = false
|
|
432
512
|
|
|
433
513
|
// Clean up temporary files to free disk space
|
|
434
514
|
cleanupTemporaryFiles()
|
|
@@ -537,11 +617,22 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
537
617
|
func sessionWasInterrupted(_ session: ARSession) {
|
|
538
618
|
print("SESSION INTERRUPTED")
|
|
539
619
|
ReplateCameraView.motionManager.stopDeviceMotionUpdates()
|
|
620
|
+
|
|
621
|
+
// Properly pause the session to save resources
|
|
622
|
+
session.pause()
|
|
623
|
+
ReplateCameraView.isSessionActive = false
|
|
624
|
+
print("[ReplateCameraView] AR session paused due to interruption")
|
|
540
625
|
}
|
|
541
626
|
|
|
542
627
|
func sessionInterruptionEnded(_ session: ARSession) {
|
|
543
628
|
print("SESSION RESUMED")
|
|
544
|
-
|
|
629
|
+
|
|
630
|
+
// Only resume if we should still be active
|
|
631
|
+
if !ReplateCameraView.isResetting && ReplateCameraView.INSTANCE != nil {
|
|
632
|
+
ReplateCameraView.INSTANCE.startDeviceMotionUpdates()
|
|
633
|
+
ReplateCameraView.isSessionActive = true
|
|
634
|
+
print("[ReplateCameraView] AR session resumed after interruption")
|
|
635
|
+
}
|
|
545
636
|
}
|
|
546
637
|
|
|
547
638
|
func generateImpactFeedback(strength: UIImpactFeedbackGenerator.FeedbackStyle) {
|
|
@@ -568,6 +659,62 @@ class ReplateCameraView: UIView, ARSessionDelegate {
|
|
|
568
659
|
}
|
|
569
660
|
}
|
|
570
661
|
}
|
|
662
|
+
|
|
663
|
+
// MARK: - Lifecycle Management
|
|
664
|
+
private func setupAppStateObservers() {
|
|
665
|
+
NotificationCenter.default.addObserver(
|
|
666
|
+
self,
|
|
667
|
+
selector: #selector(appDidEnterBackground),
|
|
668
|
+
name: UIApplication.didEnterBackgroundNotification,
|
|
669
|
+
object: nil
|
|
670
|
+
)
|
|
671
|
+
|
|
672
|
+
NotificationCenter.default.addObserver(
|
|
673
|
+
self,
|
|
674
|
+
selector: #selector(appWillEnterForeground),
|
|
675
|
+
name: UIApplication.willEnterForegroundNotification,
|
|
676
|
+
object: nil
|
|
677
|
+
)
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
@objc private func appDidEnterBackground() {
|
|
681
|
+
print("[ReplateCameraView] App entered background - pausing AR session")
|
|
682
|
+
pauseSession()
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
@objc private func appWillEnterForeground() {
|
|
686
|
+
print("[ReplateCameraView] App entering foreground - resuming AR session")
|
|
687
|
+
resumeSession()
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
private func pauseSession() {
|
|
691
|
+
guard ReplateCameraView.isSessionActive else { return }
|
|
692
|
+
|
|
693
|
+
ReplateCameraView.arView?.session.pause()
|
|
694
|
+
ReplateCameraView.motionManager?.stopDeviceMotionUpdates()
|
|
695
|
+
ReplateCameraView.isSessionActive = false
|
|
696
|
+
print("[ReplateCameraView] AR session paused")
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
private func resumeSession() {
|
|
700
|
+
guard !ReplateCameraView.isSessionActive && !ReplateCameraView.isResetting else { return }
|
|
701
|
+
guard ReplateCameraView.arView != nil else { return }
|
|
702
|
+
|
|
703
|
+
let configuration = ARWorldTrackingConfiguration()
|
|
704
|
+
configuration.isLightEstimationEnabled = true
|
|
705
|
+
configuration.planeDetection = .horizontal
|
|
706
|
+
|
|
707
|
+
ReplateCameraView.arView?.session.run(configuration)
|
|
708
|
+
startDeviceMotionUpdates()
|
|
709
|
+
ReplateCameraView.isSessionActive = true
|
|
710
|
+
print("[ReplateCameraView] AR session resumed")
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
deinit {
|
|
714
|
+
NotificationCenter.default.removeObserver(self)
|
|
715
|
+
pauseSession()
|
|
716
|
+
print("[ReplateCameraView] Component deinit - AR session cleaned up")
|
|
717
|
+
}
|
|
571
718
|
|
|
572
719
|
}
|
|
573
720
|
|
|
@@ -771,6 +918,27 @@ class ReplateCameraController: NSObject {
|
|
|
771
918
|
ReplateCameraView.reset()
|
|
772
919
|
}
|
|
773
920
|
}
|
|
921
|
+
|
|
922
|
+
@objc
|
|
923
|
+
func pauseSession() {
|
|
924
|
+
DispatchQueue.main.async {
|
|
925
|
+
ReplateCameraView.INSTANCE?.pauseSession()
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
@objc
|
|
930
|
+
func resumeSession() {
|
|
931
|
+
DispatchQueue.main.async {
|
|
932
|
+
ReplateCameraView.INSTANCE?.resumeSession()
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
@objc
|
|
937
|
+
func stopSession() {
|
|
938
|
+
DispatchQueue.main.async {
|
|
939
|
+
ReplateCameraView.tearDownARSession()
|
|
940
|
+
}
|
|
941
|
+
}
|
|
774
942
|
|
|
775
943
|
@objc(getMemoryUsage:rejecter:)
|
|
776
944
|
func getMemoryUsage(_ resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) {
|
package/lib/commonjs/index.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.getMemoryUsage = getMemoryUsage;
|
|
|
8
8
|
exports.getPhotosCount = getPhotosCount;
|
|
9
9
|
exports.getRemainingAnglesToScan = getRemainingAnglesToScan;
|
|
10
10
|
exports.isScanComplete = isScanComplete;
|
|
11
|
+
exports.pauseSession = pauseSession;
|
|
11
12
|
exports.registerAnchorSetCallback = registerAnchorSetCallback;
|
|
12
13
|
exports.registerBackInRangeCallback = registerBackInRangeCallback;
|
|
13
14
|
exports.registerCompletedLowerSpheresCallback = registerCompletedLowerSpheresCallback;
|
|
@@ -17,6 +18,8 @@ exports.registerOpenedTutorialCallback = registerOpenedTutorialCallback;
|
|
|
17
18
|
exports.registerTooCloseCallback = registerTooCloseCallback;
|
|
18
19
|
exports.registerTooFarCallback = registerTooFarCallback;
|
|
19
20
|
exports.reset = reset;
|
|
21
|
+
exports.resumeSession = resumeSession;
|
|
22
|
+
exports.stopSession = stopSession;
|
|
20
23
|
exports.takePhoto = takePhoto;
|
|
21
24
|
var _reactNative = require("react-native");
|
|
22
25
|
const LINKING_ERROR = `The package 'replate-camera' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
@@ -74,4 +77,13 @@ function getMemoryUsage() {
|
|
|
74
77
|
function reset() {
|
|
75
78
|
ReplateCameraModule.reset();
|
|
76
79
|
}
|
|
80
|
+
function pauseSession() {
|
|
81
|
+
ReplateCameraModule.pauseSession();
|
|
82
|
+
}
|
|
83
|
+
function resumeSession() {
|
|
84
|
+
ReplateCameraModule.resumeSession();
|
|
85
|
+
}
|
|
86
|
+
function stopSession() {
|
|
87
|
+
ReplateCameraModule.stopSession();
|
|
88
|
+
}
|
|
77
89
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","ComponentName","ReplateCameraView","exports","UIManager","getViewManagerConfig","requireNativeComponent","Error","ReplateCameraModule","NativeModules","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","ComponentName","ReplateCameraView","exports","UIManager","getViewManagerConfig","requireNativeComponent","Error","ReplateCameraModule","NativeModules","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset","pauseSession","resumeSession","stopSession"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAQA,MAAMC,aAAa,GAChB,yEAAwE,GACzEC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAElC,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5BE,sBAAS,CAACC,oBAAoB,CAACJ,aAAa,CAAC,IAAI,IAAI,GACjD,IAAAK,mCAAsB,EAAqBL,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIM,KAAK,CAACX,aAAa,CAAC;AAChC,CAAC;AAEA,MAAMY,mBAAmB,GAAAL,OAAA,CAAAK,mBAAA,GAAGC,0BAAa,CAACC,uBAAuB,GACpED,0BAAa,CAACC,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIL,KAAK,CAACX,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEE,SAASiB,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAON,mBAAmB,CAACK,SAAS,CAACC,SAAS,CAAC;AACjD;AAEO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOP,mBAAmB,CAACO,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOR,mBAAmB,CAACQ,wBAAwB,CAAC,CAAC;AACvD;AAEO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOT,mBAAmB,CAACS,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEX,mBAAmB,CAACU,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DX,mBAAmB,CAACY,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EX,mBAAmB,CAACa,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EX,mBAAmB,CAACc,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEX,mBAAmB,CAACe,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DX,mBAAmB,CAACgB,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DX,mBAAmB,CAACiB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEX,mBAAmB,CAACkB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOnB,mBAAmB,CAACmB,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,KAAKA,CAAA,EAAG;EACtBpB,mBAAmB,CAACoB,KAAK,CAAC,CAAC;AAC7B;AAEO,SAASC,YAAYA,CAAA,EAAG;EAC7BrB,mBAAmB,CAACqB,YAAY,CAAC,CAAC;AACpC;AAEO,SAASC,aAAaA,CAAA,EAAG;EAC9BtB,mBAAmB,CAACsB,aAAa,CAAC,CAAC;AACrC;AAEO,SAASC,WAAWA,CAAA,EAAG;EAC5BvB,mBAAmB,CAACuB,WAAW,CAAC,CAAC;AACnC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -54,4 +54,13 @@ export function getMemoryUsage() {
|
|
|
54
54
|
export function reset() {
|
|
55
55
|
ReplateCameraModule.reset();
|
|
56
56
|
}
|
|
57
|
+
export function pauseSession() {
|
|
58
|
+
ReplateCameraModule.pauseSession();
|
|
59
|
+
}
|
|
60
|
+
export function resumeSession() {
|
|
61
|
+
ReplateCameraModule.resumeSession();
|
|
62
|
+
}
|
|
63
|
+
export function stopSession() {
|
|
64
|
+
ReplateCameraModule.stopSession();
|
|
65
|
+
}
|
|
57
66
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["requireNativeComponent","UIManager","Platform","NativeModules","LINKING_ERROR","select","ios","default","ComponentName","ReplateCameraView","getViewManagerConfig","Error","ReplateCameraModule","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,SAAS,EACTC,QAAQ,EAERC,aAAa,QACR,cAAc;AAErB,MAAMC,aAAa,GAChB,yEAAwE,GACzEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAEzC,OAAO,MAAMC,iBAAiB,GAC5BR,SAAS,CAACS,oBAAoB,CAACF,aAAa,CAAC,IAAI,IAAI,GACjDR,sBAAsB,CAAqBQ,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIG,KAAK,CAACP,aAAa,CAAC;AAChC,CAAC;AAEP,OAAO,MAAMQ,mBAAmB,GAAGT,aAAa,CAACU,uBAAuB,GACpEV,aAAa,CAACU,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIJ,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,OAAO,SAASY,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAOL,mBAAmB,CAACI,SAAS,CAACC,SAAS,CAAC;AACjD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAON,mBAAmB,CAACM,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOP,mBAAmB,CAACO,wBAAwB,CAAC,CAAC;AACvD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOR,mBAAmB,CAACQ,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEV,mBAAmB,CAACS,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEA,OAAO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DV,mBAAmB,CAACW,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEA,OAAO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EV,mBAAmB,CAACY,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EV,mBAAmB,CAACa,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEV,mBAAmB,CAACc,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEA,OAAO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DV,mBAAmB,CAACe,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEA,OAAO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DV,mBAAmB,CAACgB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEA,OAAO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEV,mBAAmB,CAACiB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEA,OAAO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOlB,mBAAmB,CAACkB,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,KAAKA,CAAA,EAAG;EACtBnB,mBAAmB,CAACmB,KAAK,CAAC,CAAC;AAC7B","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["requireNativeComponent","UIManager","Platform","NativeModules","LINKING_ERROR","select","ios","default","ComponentName","ReplateCameraView","getViewManagerConfig","Error","ReplateCameraModule","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset","pauseSession","resumeSession","stopSession"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,SAAS,EACTC,QAAQ,EAERC,aAAa,QACR,cAAc;AAErB,MAAMC,aAAa,GAChB,yEAAwE,GACzEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAEzC,OAAO,MAAMC,iBAAiB,GAC5BR,SAAS,CAACS,oBAAoB,CAACF,aAAa,CAAC,IAAI,IAAI,GACjDR,sBAAsB,CAAqBQ,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIG,KAAK,CAACP,aAAa,CAAC;AAChC,CAAC;AAEP,OAAO,MAAMQ,mBAAmB,GAAGT,aAAa,CAACU,uBAAuB,GACpEV,aAAa,CAACU,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIJ,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,OAAO,SAASY,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAOL,mBAAmB,CAACI,SAAS,CAACC,SAAS,CAAC;AACjD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAON,mBAAmB,CAACM,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOP,mBAAmB,CAACO,wBAAwB,CAAC,CAAC;AACvD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOR,mBAAmB,CAACQ,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEV,mBAAmB,CAACS,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEA,OAAO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DV,mBAAmB,CAACW,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEA,OAAO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EV,mBAAmB,CAACY,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EV,mBAAmB,CAACa,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEV,mBAAmB,CAACc,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEA,OAAO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DV,mBAAmB,CAACe,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEA,OAAO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DV,mBAAmB,CAACgB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEA,OAAO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEV,mBAAmB,CAACiB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEA,OAAO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOlB,mBAAmB,CAACkB,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,KAAKA,CAAA,EAAG;EACtBnB,mBAAmB,CAACmB,KAAK,CAAC,CAAC;AAC7B;AAEA,OAAO,SAASC,YAAYA,CAAA,EAAG;EAC7BpB,mBAAmB,CAACoB,YAAY,CAAC,CAAC;AACpC;AAEA,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9BrB,mBAAmB,CAACqB,aAAa,CAAC,CAAC;AACrC;AAEA,OAAO,SAASC,WAAWA,CAAA,EAAG;EAC5BtB,mBAAmB,CAACsB,WAAW,CAAC,CAAC;AACnC","ignoreList":[]}
|
|
@@ -21,5 +21,8 @@ export declare function getMemoryUsage(): Promise<{
|
|
|
21
21
|
memoryUsageMB: number;
|
|
22
22
|
}>;
|
|
23
23
|
export declare function reset(): void;
|
|
24
|
+
export declare function pauseSession(): void;
|
|
25
|
+
export declare function resumeSession(): void;
|
|
26
|
+
export declare function stopSession(): void;
|
|
24
27
|
export {};
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,cAAc,CAAC;AAQtB,KAAK,kBAAkB,GAAG;IAExB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,iBAAiB,0EAKvB,CAAC;AAER,eAAO,MAAM,mBAAmB,KAS3B,CAAC;AAEN,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjD;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAErE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE7D;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAElE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE1D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE5D;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE/D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAAC,CAEjE;AAED,wBAAgB,KAAK,SAEpB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,cAAc,CAAC;AAQtB,KAAK,kBAAkB,GAAG;IAExB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,iBAAiB,0EAKvB,CAAC;AAER,eAAO,MAAM,mBAAmB,KAS3B,CAAC;AAEN,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjD;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAErE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE7D;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAElE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE1D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE5D;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE/D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAAC,CAEjE;AAED,wBAAgB,KAAK,SAEpB;AAED,wBAAgB,YAAY,SAE3B;AAED,wBAAgB,aAAa,SAE5B;AAED,wBAAgB,WAAW,SAE1B"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -93,3 +93,15 @@ export function getMemoryUsage(): Promise<{memoryUsageMB: number}> {
|
|
|
93
93
|
export function reset() {
|
|
94
94
|
ReplateCameraModule.reset();
|
|
95
95
|
}
|
|
96
|
+
|
|
97
|
+
export function pauseSession() {
|
|
98
|
+
ReplateCameraModule.pauseSession();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function resumeSession() {
|
|
102
|
+
ReplateCameraModule.resumeSession();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function stopSession() {
|
|
106
|
+
ReplateCameraModule.stopSession();
|
|
107
|
+
}
|
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
// !$*UTF8*$!
|
|
2
|
-
{
|
|
3
|
-
archiveVersion = 1;
|
|
4
|
-
classes = {
|
|
5
|
-
};
|
|
6
|
-
objectVersion = 52;
|
|
7
|
-
objects = {
|
|
8
|
-
|
|
9
|
-
/* Begin PBXBuildFile section */
|
|
10
|
-
F301E0D1231462A90028AAF1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0D0231462A90028AAF1 /* AppDelegate.swift */; };
|
|
11
|
-
F301E0D3231462A90028AAF1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0D2231462A90028AAF1 /* ContentView.swift */; };
|
|
12
|
-
F301E0D7231462AB0028AAF1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F301E0D6231462AB0028AAF1 /* Assets.xcassets */; };
|
|
13
|
-
F301E0DA231462AB0028AAF1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */; };
|
|
14
|
-
F301E0DD231462AB0028AAF1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */; };
|
|
15
|
-
F301E0E5231462D90028AAF1 /* FocusARView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0E4231462D90028AAF1 /* FocusARView.swift */; };
|
|
16
|
-
F339DB65275013C700D9A2B2 /* FocusEntity in Frameworks */ = {isa = PBXBuildFile; productRef = F339DB64275013C700D9A2B2 /* FocusEntity */; };
|
|
17
|
-
F385E0D229E74E97007CF478 /* BasicARView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F385E0D129E74E97007CF478 /* BasicARView.swift */; };
|
|
18
|
-
/* End PBXBuildFile section */
|
|
19
|
-
|
|
20
|
-
/* Begin PBXFileReference section */
|
|
21
|
-
F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FocusEntity-Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
22
|
-
F301E0D0231462A90028AAF1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
|
23
|
-
F301E0D2231462A90028AAF1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
|
24
|
-
F301E0D6231462AB0028AAF1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
25
|
-
F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
|
|
26
|
-
F301E0DC231462AB0028AAF1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
|
27
|
-
F301E0DE231462AB0028AAF1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
28
|
-
F301E0E4231462D90028AAF1 /* FocusARView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusARView.swift; sourceTree = "<group>"; };
|
|
29
|
-
F339DB622750138A00D9A2B2 /* FocusEntity */ = {isa = PBXFileReference; lastKnownFileType = folder; name = FocusEntity; path = ..; sourceTree = "<group>"; };
|
|
30
|
-
F385E0D129E74E97007CF478 /* BasicARView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicARView.swift; sourceTree = "<group>"; };
|
|
31
|
-
/* End PBXFileReference section */
|
|
32
|
-
|
|
33
|
-
/* Begin PBXFrameworksBuildPhase section */
|
|
34
|
-
F301E0CA231462A90028AAF1 /* Frameworks */ = {
|
|
35
|
-
isa = PBXFrameworksBuildPhase;
|
|
36
|
-
buildActionMask = 2147483647;
|
|
37
|
-
files = (
|
|
38
|
-
F339DB65275013C700D9A2B2 /* FocusEntity in Frameworks */,
|
|
39
|
-
);
|
|
40
|
-
runOnlyForDeploymentPostprocessing = 0;
|
|
41
|
-
};
|
|
42
|
-
/* End PBXFrameworksBuildPhase section */
|
|
43
|
-
|
|
44
|
-
/* Begin PBXGroup section */
|
|
45
|
-
F301E0C4231462A90028AAF1 = {
|
|
46
|
-
isa = PBXGroup;
|
|
47
|
-
children = (
|
|
48
|
-
F339DB612750138A00D9A2B2 /* Packages */,
|
|
49
|
-
F301E0CF231462A90028AAF1 /* FocusEntity-Example */,
|
|
50
|
-
F301E0CE231462A90028AAF1 /* Products */,
|
|
51
|
-
F339DB63275013C700D9A2B2 /* Frameworks */,
|
|
52
|
-
);
|
|
53
|
-
sourceTree = "<group>";
|
|
54
|
-
};
|
|
55
|
-
F301E0CE231462A90028AAF1 /* Products */ = {
|
|
56
|
-
isa = PBXGroup;
|
|
57
|
-
children = (
|
|
58
|
-
F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */,
|
|
59
|
-
);
|
|
60
|
-
name = Products;
|
|
61
|
-
sourceTree = "<group>";
|
|
62
|
-
};
|
|
63
|
-
F301E0CF231462A90028AAF1 /* FocusEntity-Example */ = {
|
|
64
|
-
isa = PBXGroup;
|
|
65
|
-
children = (
|
|
66
|
-
F301E0D0231462A90028AAF1 /* AppDelegate.swift */,
|
|
67
|
-
F301E0D2231462A90028AAF1 /* ContentView.swift */,
|
|
68
|
-
F385E0D129E74E97007CF478 /* BasicARView.swift */,
|
|
69
|
-
F301E0E4231462D90028AAF1 /* FocusARView.swift */,
|
|
70
|
-
F301E0D6231462AB0028AAF1 /* Assets.xcassets */,
|
|
71
|
-
F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */,
|
|
72
|
-
F301E0DE231462AB0028AAF1 /* Info.plist */,
|
|
73
|
-
F301E0D8231462AB0028AAF1 /* Preview Content */,
|
|
74
|
-
);
|
|
75
|
-
path = "FocusEntity-Example";
|
|
76
|
-
sourceTree = "<group>";
|
|
77
|
-
};
|
|
78
|
-
F301E0D8231462AB0028AAF1 /* Preview Content */ = {
|
|
79
|
-
isa = PBXGroup;
|
|
80
|
-
children = (
|
|
81
|
-
F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */,
|
|
82
|
-
);
|
|
83
|
-
path = "Preview Content";
|
|
84
|
-
sourceTree = "<group>";
|
|
85
|
-
};
|
|
86
|
-
F339DB612750138A00D9A2B2 /* Packages */ = {
|
|
87
|
-
isa = PBXGroup;
|
|
88
|
-
children = (
|
|
89
|
-
F339DB622750138A00D9A2B2 /* FocusEntity */,
|
|
90
|
-
);
|
|
91
|
-
name = Packages;
|
|
92
|
-
sourceTree = "<group>";
|
|
93
|
-
};
|
|
94
|
-
F339DB63275013C700D9A2B2 /* Frameworks */ = {
|
|
95
|
-
isa = PBXGroup;
|
|
96
|
-
children = (
|
|
97
|
-
);
|
|
98
|
-
name = Frameworks;
|
|
99
|
-
sourceTree = "<group>";
|
|
100
|
-
};
|
|
101
|
-
/* End PBXGroup section */
|
|
102
|
-
|
|
103
|
-
/* Begin PBXNativeTarget section */
|
|
104
|
-
F301E0CC231462A90028AAF1 /* FocusEntity-Example */ = {
|
|
105
|
-
isa = PBXNativeTarget;
|
|
106
|
-
buildConfigurationList = F301E0E1231462AB0028AAF1 /* Build configuration list for PBXNativeTarget "FocusEntity-Example" */;
|
|
107
|
-
buildPhases = (
|
|
108
|
-
F301E0C9231462A90028AAF1 /* Sources */,
|
|
109
|
-
F301E0CA231462A90028AAF1 /* Frameworks */,
|
|
110
|
-
F301E0CB231462A90028AAF1 /* Resources */,
|
|
111
|
-
);
|
|
112
|
-
buildRules = (
|
|
113
|
-
);
|
|
114
|
-
dependencies = (
|
|
115
|
-
);
|
|
116
|
-
name = "FocusEntity-Example";
|
|
117
|
-
packageProductDependencies = (
|
|
118
|
-
F339DB64275013C700D9A2B2 /* FocusEntity */,
|
|
119
|
-
);
|
|
120
|
-
productName = "FocusEntity-Example";
|
|
121
|
-
productReference = F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */;
|
|
122
|
-
productType = "com.apple.product-type.application";
|
|
123
|
-
};
|
|
124
|
-
/* End PBXNativeTarget section */
|
|
125
|
-
|
|
126
|
-
/* Begin PBXProject section */
|
|
127
|
-
F301E0C5231462A90028AAF1 /* Project object */ = {
|
|
128
|
-
isa = PBXProject;
|
|
129
|
-
attributes = {
|
|
130
|
-
LastSwiftUpdateCheck = 1100;
|
|
131
|
-
LastUpgradeCheck = 1100;
|
|
132
|
-
ORGANIZATIONNAME = "Max Cobb";
|
|
133
|
-
TargetAttributes = {
|
|
134
|
-
F301E0CC231462A90028AAF1 = {
|
|
135
|
-
CreatedOnToolsVersion = 11.0;
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
};
|
|
139
|
-
buildConfigurationList = F301E0C8231462A90028AAF1 /* Build configuration list for PBXProject "FocusEntity-Example" */;
|
|
140
|
-
compatibilityVersion = "Xcode 9.3";
|
|
141
|
-
developmentRegion = en;
|
|
142
|
-
hasScannedForEncodings = 0;
|
|
143
|
-
knownRegions = (
|
|
144
|
-
en,
|
|
145
|
-
Base,
|
|
146
|
-
);
|
|
147
|
-
mainGroup = F301E0C4231462A90028AAF1;
|
|
148
|
-
packageReferences = (
|
|
149
|
-
);
|
|
150
|
-
productRefGroup = F301E0CE231462A90028AAF1 /* Products */;
|
|
151
|
-
projectDirPath = "";
|
|
152
|
-
projectRoot = "";
|
|
153
|
-
targets = (
|
|
154
|
-
F301E0CC231462A90028AAF1 /* FocusEntity-Example */,
|
|
155
|
-
);
|
|
156
|
-
};
|
|
157
|
-
/* End PBXProject section */
|
|
158
|
-
|
|
159
|
-
/* Begin PBXResourcesBuildPhase section */
|
|
160
|
-
F301E0CB231462A90028AAF1 /* Resources */ = {
|
|
161
|
-
isa = PBXResourcesBuildPhase;
|
|
162
|
-
buildActionMask = 2147483647;
|
|
163
|
-
files = (
|
|
164
|
-
F301E0DD231462AB0028AAF1 /* LaunchScreen.storyboard in Resources */,
|
|
165
|
-
F301E0DA231462AB0028AAF1 /* Preview Assets.xcassets in Resources */,
|
|
166
|
-
F301E0D7231462AB0028AAF1 /* Assets.xcassets in Resources */,
|
|
167
|
-
);
|
|
168
|
-
runOnlyForDeploymentPostprocessing = 0;
|
|
169
|
-
};
|
|
170
|
-
/* End PBXResourcesBuildPhase section */
|
|
171
|
-
|
|
172
|
-
/* Begin PBXSourcesBuildPhase section */
|
|
173
|
-
F301E0C9231462A90028AAF1 /* Sources */ = {
|
|
174
|
-
isa = PBXSourcesBuildPhase;
|
|
175
|
-
buildActionMask = 2147483647;
|
|
176
|
-
files = (
|
|
177
|
-
F385E0D229E74E97007CF478 /* BasicARView.swift in Sources */,
|
|
178
|
-
F301E0D3231462A90028AAF1 /* ContentView.swift in Sources */,
|
|
179
|
-
F301E0D1231462A90028AAF1 /* AppDelegate.swift in Sources */,
|
|
180
|
-
F301E0E5231462D90028AAF1 /* FocusARView.swift in Sources */,
|
|
181
|
-
);
|
|
182
|
-
runOnlyForDeploymentPostprocessing = 0;
|
|
183
|
-
};
|
|
184
|
-
/* End PBXSourcesBuildPhase section */
|
|
185
|
-
|
|
186
|
-
/* Begin PBXVariantGroup section */
|
|
187
|
-
F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */ = {
|
|
188
|
-
isa = PBXVariantGroup;
|
|
189
|
-
children = (
|
|
190
|
-
F301E0DC231462AB0028AAF1 /* Base */,
|
|
191
|
-
);
|
|
192
|
-
name = LaunchScreen.storyboard;
|
|
193
|
-
sourceTree = "<group>";
|
|
194
|
-
};
|
|
195
|
-
/* End PBXVariantGroup section */
|
|
196
|
-
|
|
197
|
-
/* Begin XCBuildConfiguration section */
|
|
198
|
-
F301E0DF231462AB0028AAF1 /* Debug */ = {
|
|
199
|
-
isa = XCBuildConfiguration;
|
|
200
|
-
buildSettings = {
|
|
201
|
-
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
202
|
-
CLANG_ANALYZER_NONNULL = YES;
|
|
203
|
-
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
204
|
-
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
205
|
-
CLANG_CXX_LIBRARY = "libc++";
|
|
206
|
-
CLANG_ENABLE_MODULES = YES;
|
|
207
|
-
CLANG_ENABLE_OBJC_ARC = YES;
|
|
208
|
-
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
209
|
-
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
210
|
-
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
211
|
-
CLANG_WARN_COMMA = YES;
|
|
212
|
-
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
213
|
-
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
214
|
-
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
215
|
-
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
216
|
-
CLANG_WARN_EMPTY_BODY = YES;
|
|
217
|
-
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
218
|
-
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
219
|
-
CLANG_WARN_INT_CONVERSION = YES;
|
|
220
|
-
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
221
|
-
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
222
|
-
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
223
|
-
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
224
|
-
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
225
|
-
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
226
|
-
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
227
|
-
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
|
228
|
-
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
229
|
-
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
230
|
-
COPY_PHASE_STRIP = NO;
|
|
231
|
-
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
232
|
-
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
233
|
-
ENABLE_TESTABILITY = YES;
|
|
234
|
-
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
235
|
-
GCC_DYNAMIC_NO_PIC = NO;
|
|
236
|
-
GCC_NO_COMMON_BLOCKS = YES;
|
|
237
|
-
GCC_OPTIMIZATION_LEVEL = 0;
|
|
238
|
-
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
239
|
-
"DEBUG=1",
|
|
240
|
-
"$(inherited)",
|
|
241
|
-
);
|
|
242
|
-
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
243
|
-
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
244
|
-
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
245
|
-
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
246
|
-
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
247
|
-
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
248
|
-
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
249
|
-
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
|
250
|
-
MTL_FAST_MATH = YES;
|
|
251
|
-
ONLY_ACTIVE_ARCH = YES;
|
|
252
|
-
SDKROOT = iphoneos;
|
|
253
|
-
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
254
|
-
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
255
|
-
};
|
|
256
|
-
name = Debug;
|
|
257
|
-
};
|
|
258
|
-
F301E0E0231462AB0028AAF1 /* Release */ = {
|
|
259
|
-
isa = XCBuildConfiguration;
|
|
260
|
-
buildSettings = {
|
|
261
|
-
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
262
|
-
CLANG_ANALYZER_NONNULL = YES;
|
|
263
|
-
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
264
|
-
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
265
|
-
CLANG_CXX_LIBRARY = "libc++";
|
|
266
|
-
CLANG_ENABLE_MODULES = YES;
|
|
267
|
-
CLANG_ENABLE_OBJC_ARC = YES;
|
|
268
|
-
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
269
|
-
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
270
|
-
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
271
|
-
CLANG_WARN_COMMA = YES;
|
|
272
|
-
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
273
|
-
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
274
|
-
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
275
|
-
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
276
|
-
CLANG_WARN_EMPTY_BODY = YES;
|
|
277
|
-
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
278
|
-
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
279
|
-
CLANG_WARN_INT_CONVERSION = YES;
|
|
280
|
-
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
281
|
-
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
282
|
-
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
283
|
-
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
284
|
-
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
285
|
-
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
286
|
-
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
287
|
-
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
|
288
|
-
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
289
|
-
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
290
|
-
COPY_PHASE_STRIP = NO;
|
|
291
|
-
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
292
|
-
ENABLE_NS_ASSERTIONS = NO;
|
|
293
|
-
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
294
|
-
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
295
|
-
GCC_NO_COMMON_BLOCKS = YES;
|
|
296
|
-
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
297
|
-
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
298
|
-
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
299
|
-
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
300
|
-
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
301
|
-
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
302
|
-
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
|
303
|
-
MTL_ENABLE_DEBUG_INFO = NO;
|
|
304
|
-
MTL_FAST_MATH = YES;
|
|
305
|
-
SDKROOT = iphoneos;
|
|
306
|
-
SWIFT_COMPILATION_MODE = wholemodule;
|
|
307
|
-
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
308
|
-
VALIDATE_PRODUCT = YES;
|
|
309
|
-
};
|
|
310
|
-
name = Release;
|
|
311
|
-
};
|
|
312
|
-
F301E0E2231462AB0028AAF1 /* Debug */ = {
|
|
313
|
-
isa = XCBuildConfiguration;
|
|
314
|
-
buildSettings = {
|
|
315
|
-
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
316
|
-
CODE_SIGN_STYLE = Automatic;
|
|
317
|
-
DEVELOPMENT_ASSET_PATHS = "\"FocusEntity-Example/Preview Content\"";
|
|
318
|
-
DEVELOPMENT_TEAM = 278494H572;
|
|
319
|
-
ENABLE_PREVIEWS = YES;
|
|
320
|
-
INFOPLIST_FILE = "FocusEntity-Example/Info.plist";
|
|
321
|
-
LD_RUNPATH_SEARCH_PATHS = (
|
|
322
|
-
"$(inherited)",
|
|
323
|
-
"@executable_path/Frameworks",
|
|
324
|
-
);
|
|
325
|
-
PRODUCT_BUNDLE_IDENTIFIER = uk.rocketar.focusentity.example;
|
|
326
|
-
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
327
|
-
SWIFT_VERSION = 5.0;
|
|
328
|
-
TARGETED_DEVICE_FAMILY = "1,2";
|
|
329
|
-
};
|
|
330
|
-
name = Debug;
|
|
331
|
-
};
|
|
332
|
-
F301E0E3231462AB0028AAF1 /* Release */ = {
|
|
333
|
-
isa = XCBuildConfiguration;
|
|
334
|
-
buildSettings = {
|
|
335
|
-
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
336
|
-
CODE_SIGN_STYLE = Automatic;
|
|
337
|
-
DEVELOPMENT_ASSET_PATHS = "\"FocusEntity-Example/Preview Content\"";
|
|
338
|
-
DEVELOPMENT_TEAM = 278494H572;
|
|
339
|
-
ENABLE_PREVIEWS = YES;
|
|
340
|
-
INFOPLIST_FILE = "FocusEntity-Example/Info.plist";
|
|
341
|
-
LD_RUNPATH_SEARCH_PATHS = (
|
|
342
|
-
"$(inherited)",
|
|
343
|
-
"@executable_path/Frameworks",
|
|
344
|
-
);
|
|
345
|
-
PRODUCT_BUNDLE_IDENTIFIER = uk.rocketar.focusentity.example;
|
|
346
|
-
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
347
|
-
SWIFT_VERSION = 5.0;
|
|
348
|
-
TARGETED_DEVICE_FAMILY = "1,2";
|
|
349
|
-
};
|
|
350
|
-
name = Release;
|
|
351
|
-
};
|
|
352
|
-
/* End XCBuildConfiguration section */
|
|
353
|
-
|
|
354
|
-
/* Begin XCConfigurationList section */
|
|
355
|
-
F301E0C8231462A90028AAF1 /* Build configuration list for PBXProject "FocusEntity-Example" */ = {
|
|
356
|
-
isa = XCConfigurationList;
|
|
357
|
-
buildConfigurations = (
|
|
358
|
-
F301E0DF231462AB0028AAF1 /* Debug */,
|
|
359
|
-
F301E0E0231462AB0028AAF1 /* Release */,
|
|
360
|
-
);
|
|
361
|
-
defaultConfigurationIsVisible = 0;
|
|
362
|
-
defaultConfigurationName = Release;
|
|
363
|
-
};
|
|
364
|
-
F301E0E1231462AB0028AAF1 /* Build configuration list for PBXNativeTarget "FocusEntity-Example" */ = {
|
|
365
|
-
isa = XCConfigurationList;
|
|
366
|
-
buildConfigurations = (
|
|
367
|
-
F301E0E2231462AB0028AAF1 /* Debug */,
|
|
368
|
-
F301E0E3231462AB0028AAF1 /* Release */,
|
|
369
|
-
);
|
|
370
|
-
defaultConfigurationIsVisible = 0;
|
|
371
|
-
defaultConfigurationName = Release;
|
|
372
|
-
};
|
|
373
|
-
/* End XCConfigurationList section */
|
|
374
|
-
|
|
375
|
-
/* Begin XCSwiftPackageProductDependency section */
|
|
376
|
-
F339DB64275013C700D9A2B2 /* FocusEntity */ = {
|
|
377
|
-
isa = XCSwiftPackageProductDependency;
|
|
378
|
-
productName = FocusEntity;
|
|
379
|
-
};
|
|
380
|
-
/* End XCSwiftPackageProductDependency section */
|
|
381
|
-
};
|
|
382
|
-
rootObject = F301E0C5231462A90028AAF1 /* Project object */;
|
|
383
|
-
}
|