react-native-cesium 1.2.18 → 1.2.19

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.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/android/CMakeLists.txt +1 -0
  3. package/android/build.gradle +1 -1
  4. package/android/gradle.properties +4 -4
  5. package/android/src/main/cpp/CesiumBridgeAndroid.cpp +5 -15
  6. package/android/src/main/cpp/CesiumBridgeAndroid.h +2 -0
  7. package/cpp/engine/CameraIntegrator.cpp +82 -47
  8. package/cpp/engine/CameraIntegrator.hpp +27 -8
  9. package/cpp/engine/CesiumEngine.cpp +152 -304
  10. package/cpp/engine/CesiumEngine.hpp +38 -28
  11. package/cpp/engine/EngineTunables.hpp +6 -5
  12. package/cpp/engine/GltfToMesh.cpp +14 -5
  13. package/cpp/engine/ResourcePreparer.cpp +3 -3
  14. package/cpp/engine/ResourcePreparer.hpp +1 -1
  15. package/cpp/engine/TerrainFloor.hpp +70 -0
  16. package/cpp/engine/TerrainHeight.hpp +113 -0
  17. package/cpp/engine/test/CameraIntegratorTest.cpp +264 -0
  18. package/ios/CesiumBridge.mm +7 -27
  19. package/lib/typescript/src/specs/cesium-view.nitro.d.ts +7 -6
  20. package/lib/typescript/src/specs/cesium-view.nitro.d.ts.map +1 -1
  21. package/nitrogen/generated/android/ReactNativeCesiumOnLoad.cpp +1 -1
  22. package/nitrogen/generated/android/c++/JCameraState.hpp +1 -1
  23. package/nitrogen/generated/android/c++/JCesiumMetrics.hpp +1 -1
  24. package/nitrogen/generated/android/c++/JQuaternion.hpp +1 -1
  25. package/nitrogen/generated/android/c++/views/JHybridCesiumViewStateUpdater.cpp +177 -131
  26. package/nitrogen/generated/android/c++/views/JHybridCesiumViewStateUpdater.hpp +6 -1
  27. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/CameraState.kt +1 -1
  28. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/CesiumMetrics.kt +1 -1
  29. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/Func_void_CameraState.kt +0 -2
  30. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/Func_void_CesiumMetrics.kt +0 -2
  31. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/HybridCesiumViewSpec.kt +2 -0
  32. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/Quaternion.kt +1 -1
  33. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/views/HybridCesiumViewManager.kt +26 -10
  34. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativecesium/views/HybridCesiumViewStateUpdater.kt +2 -2
  35. package/nitrogen/generated/ios/c++/views/HybridCesiumViewComponent.mm +211 -161
  36. package/nitrogen/generated/shared/c++/views/HybridCesiumViewComponent.cpp +34 -335
  37. package/nitrogen/generated/shared/c++/views/HybridCesiumViewComponent.hpp +107 -77
  38. package/package.json +12 -12
  39. package/scripts/cesium/config.mjs +1 -1
  40. package/scripts/cesium/vcpkg-triplets/arm64-ios-simulator.cmake +3 -0
  41. package/scripts/cesium/vcpkg-triplets/arm64-ios.cmake +4 -0
  42. package/src/specs/cesium-view.nitro.ts +7 -6
@@ -37,6 +37,7 @@ using namespace margelo::nitro::reactnativecesium::views;
37
37
 
38
38
  @implementation HybridCesiumViewComponent {
39
39
  std::shared_ptr<HybridCesiumViewSpecSwift> _hybridView;
40
+ BOOL _didDropView;
40
41
  }
41
42
 
42
43
  + (void) load {
@@ -50,6 +51,7 @@ using namespace margelo::nitro::reactnativecesium::views;
50
51
 
51
52
  - (instancetype) init {
52
53
  if (self = [super init]) {
54
+ _props = HybridCesiumViewShadowNode::defaultSharedProps();
53
55
  std::shared_ptr<HybridCesiumViewSpec> hybridView = ReactNativeCesium::ReactNativeCesiumAutolinking::createCesiumView();
54
56
  _hybridView = std::dynamic_pointer_cast<HybridCesiumViewSpecSwift>(hybridView);
55
57
  [self updateView];
@@ -69,175 +71,223 @@ using namespace margelo::nitro::reactnativecesium::views;
69
71
  [self setContentView:view];
70
72
  }
71
73
 
74
+ - (void) notifyOnDropView {
75
+ // A recycled component can later be invalidated. Notify only once per mount.
76
+ if (_didDropView) {
77
+ return;
78
+ }
79
+ ReactNativeCesium::HybridCesiumViewSpec_cxx& swiftPart = _hybridView->getSwiftPart();
80
+ swiftPart.onDropView();
81
+ _didDropView = YES;
82
+ }
83
+
72
84
  - (void) updateProps:(const std::shared_ptr<const react::Props>&)props
73
85
  oldProps:(const std::shared_ptr<const react::Props>&)oldProps {
86
+ // A props update marks a newly mounted or still-active component.
87
+ _didDropView = NO;
88
+
74
89
  // 1. Downcast props
75
- const auto& newViewPropsConst = *std::static_pointer_cast<HybridCesiumViewProps const>(props);
76
- auto& newViewProps = const_cast<HybridCesiumViewProps&>(newViewPropsConst);
90
+ const auto& newViewProps = *std::static_pointer_cast<const HybridCesiumViewProps>(props);
91
+ const auto* oldViewProps = static_cast<const HybridCesiumViewProps*>(oldProps.get());
77
92
  ReactNativeCesium::HybridCesiumViewSpec_cxx& swiftPart = _hybridView->getSwiftPart();
78
93
 
79
- // 2. Update each prop individually
80
- swiftPart.beforeUpdate();
81
-
82
- // ionAccessToken: string
83
- if (newViewProps.ionAccessToken.isDirty) {
84
- swiftPart.setIonAccessToken(newViewProps.ionAccessToken.value);
85
- newViewProps.ionAccessToken.isDirty = false;
86
- }
87
- // ionAssetId: number
88
- if (newViewProps.ionAssetId.isDirty) {
89
- swiftPart.setIonAssetId(newViewProps.ionAssetId.value);
90
- newViewProps.ionAssetId.isDirty = false;
91
- }
92
- // initialCamera: struct
93
- if (newViewProps.initialCamera.isDirty) {
94
- swiftPart.setInitialCamera(newViewProps.initialCamera.value);
95
- newViewProps.initialCamera.isDirty = false;
96
- }
97
- // pauseRendering: boolean
98
- if (newViewProps.pauseRendering.isDirty) {
99
- swiftPart.setPauseRendering(newViewProps.pauseRendering.value);
100
- newViewProps.pauseRendering.isDirty = false;
101
- }
102
- // maximumScreenSpaceError: number
103
- if (newViewProps.maximumScreenSpaceError.isDirty) {
104
- swiftPart.setMaximumScreenSpaceError(newViewProps.maximumScreenSpaceError.value);
105
- newViewProps.maximumScreenSpaceError.isDirty = false;
106
- }
107
- // maximumSimultaneousTileLoads: number
108
- if (newViewProps.maximumSimultaneousTileLoads.isDirty) {
109
- swiftPart.setMaximumSimultaneousTileLoads(newViewProps.maximumSimultaneousTileLoads.value);
110
- newViewProps.maximumSimultaneousTileLoads.isDirty = false;
111
- }
112
- // loadingDescendantLimit: number
113
- if (newViewProps.loadingDescendantLimit.isDirty) {
114
- swiftPart.setLoadingDescendantLimit(newViewProps.loadingDescendantLimit.value);
115
- newViewProps.loadingDescendantLimit.isDirty = false;
116
- }
117
- // msaaSampleCount: number
118
- if (newViewProps.msaaSampleCount.isDirty) {
119
- swiftPart.setMsaaSampleCount(newViewProps.msaaSampleCount.value);
120
- newViewProps.msaaSampleCount.isDirty = false;
121
- }
122
- // ionImageryAssetId: number
123
- if (newViewProps.ionImageryAssetId.isDirty) {
124
- swiftPart.setIonImageryAssetId(newViewProps.ionImageryAssetId.value);
125
- newViewProps.ionImageryAssetId.isDirty = false;
126
- }
127
- // maximumCachedMiB: optional
128
- if (newViewProps.maximumCachedMiB.isDirty) {
129
- swiftPart.setMaximumCachedMiB(newViewProps.maximumCachedMiB.value);
130
- newViewProps.maximumCachedMiB.isDirty = false;
131
- }
132
- // preloadAncestors: optional
133
- if (newViewProps.preloadAncestors.isDirty) {
134
- swiftPart.setPreloadAncestors(newViewProps.preloadAncestors.value);
135
- newViewProps.preloadAncestors.isDirty = false;
136
- }
137
- // preloadSiblings: optional
138
- if (newViewProps.preloadSiblings.isDirty) {
139
- swiftPart.setPreloadSiblings(newViewProps.preloadSiblings.value);
140
- newViewProps.preloadSiblings.isDirty = false;
141
- }
142
- // forbidHoles: optional
143
- if (newViewProps.forbidHoles.isDirty) {
144
- swiftPart.setForbidHoles(newViewProps.forbidHoles.value);
145
- newViewProps.forbidHoles.isDirty = false;
146
- }
147
- // enableWaterMask: optional
148
- if (newViewProps.enableWaterMask.isDirty) {
149
- swiftPart.setEnableWaterMask(newViewProps.enableWaterMask.value);
150
- newViewProps.enableWaterMask.isDirty = false;
151
- }
152
- // enableFogCulling: optional
153
- if (newViewProps.enableFogCulling.isDirty) {
154
- swiftPart.setEnableFogCulling(newViewProps.enableFogCulling.value);
155
- newViewProps.enableFogCulling.isDirty = false;
156
- }
157
- // enforceCulledScreenSpaceError: optional
158
- if (newViewProps.enforceCulledScreenSpaceError.isDirty) {
159
- swiftPart.setEnforceCulledScreenSpaceError(newViewProps.enforceCulledScreenSpaceError.value);
160
- newViewProps.enforceCulledScreenSpaceError.isDirty = false;
161
- }
162
- // culledScreenSpaceError: optional
163
- if (newViewProps.culledScreenSpaceError.isDirty) {
164
- swiftPart.setCulledScreenSpaceError(newViewProps.culledScreenSpaceError.value);
165
- newViewProps.culledScreenSpaceError.isDirty = false;
166
- }
167
- // enableLodTransitionPeriod: optional
168
- if (newViewProps.enableLodTransitionPeriod.isDirty) {
169
- swiftPart.setEnableLodTransitionPeriod(newViewProps.enableLodTransitionPeriod.value);
170
- newViewProps.enableLodTransitionPeriod.isDirty = false;
171
- }
172
- // lodTransitionLength: optional
173
- if (newViewProps.lodTransitionLength.isDirty) {
174
- swiftPart.setLodTransitionLength(newViewProps.lodTransitionLength.value);
175
- newViewProps.lodTransitionLength.isDirty = false;
176
- }
177
- // sqliteCacheMaxRows: optional
178
- if (newViewProps.sqliteCacheMaxRows.isDirty) {
179
- swiftPart.setSqliteCacheMaxRows(newViewProps.sqliteCacheMaxRows.value);
180
- newViewProps.sqliteCacheMaxRows.isDirty = false;
181
- }
182
- // taskProcessorThreads: optional
183
- if (newViewProps.taskProcessorThreads.isDirty) {
184
- swiftPart.setTaskProcessorThreads(newViewProps.taskProcessorThreads.value);
185
- newViewProps.taskProcessorThreads.isDirty = false;
186
- }
187
- // minAltitudeAboveTerrain: optional
188
- if (newViewProps.minAltitudeAboveTerrain.isDirty) {
189
- swiftPart.setMinAltitudeAboveTerrain(newViewProps.minAltitudeAboveTerrain.value);
190
- newViewProps.minAltitudeAboveTerrain.isDirty = false;
191
- }
192
- // maxYawRateDegSec: optional
193
- if (newViewProps.maxYawRateDegSec.isDirty) {
194
- swiftPart.setMaxYawRateDegSec(newViewProps.maxYawRateDegSec.value);
195
- newViewProps.maxYawRateDegSec.isDirty = false;
196
- }
197
- // maxPitchRateDegSec: optional
198
- if (newViewProps.maxPitchRateDegSec.isDirty) {
199
- swiftPart.setMaxPitchRateDegSec(newViewProps.maxPitchRateDegSec.value);
200
- newViewProps.maxPitchRateDegSec.isDirty = false;
201
- }
202
- // maxRollRateDegSec: optional
203
- if (newViewProps.maxRollRateDegSec.isDirty) {
204
- swiftPart.setMaxRollRateDegSec(newViewProps.maxRollRateDegSec.value);
205
- newViewProps.maxRollRateDegSec.isDirty = false;
206
- }
207
- // maxClimbRateMps: optional
208
- if (newViewProps.maxClimbRateMps.isDirty) {
209
- swiftPart.setMaxClimbRateMps(newViewProps.maxClimbRateMps.value);
210
- newViewProps.maxClimbRateMps.isDirty = false;
211
- }
212
- // maxGroundSpeedMps: optional
213
- if (newViewProps.maxGroundSpeedMps.isDirty) {
214
- swiftPart.setMaxGroundSpeedMps(newViewProps.maxGroundSpeedMps.value);
215
- newViewProps.maxGroundSpeedMps.isDirty = false;
216
- }
217
- // onMetrics: optional
218
- if (newViewProps.onMetrics.isDirty) {
219
- swiftPart.setOnMetrics(newViewProps.onMetrics.value);
220
- newViewProps.onMetrics.isDirty = false;
221
- }
222
- // onActualCamera: optional
223
- if (newViewProps.onActualCamera.isDirty) {
224
- swiftPart.setOnActualCamera(newViewProps.onActualCamera.value);
225
- newViewProps.onActualCamera.isDirty = false;
226
- }
94
+ // 2. Update only props that differ from the previous Props snapshot.
95
+ const bool hasTransactionPropChanges = oldViewProps == nullptr
96
+ ? newViewProps.hasAnyProvidedProps()
97
+ : !newViewProps.hasSameProps(*oldViewProps);
98
+ if (hasTransactionPropChanges) {
99
+ swiftPart.beforeUpdate();
227
100
 
228
- swiftPart.afterUpdate();
101
+ // ionAccessToken: string
102
+ if (oldViewProps == nullptr
103
+ ? newViewProps.ionAccessToken.isProvided()
104
+ : !newViewProps.ionAccessToken.hasSameValue(oldViewProps->ionAccessToken)) {
105
+ swiftPart.setIonAccessToken(newViewProps.ionAccessToken.get());
106
+ }
107
+ // ionAssetId: number
108
+ if (oldViewProps == nullptr
109
+ ? newViewProps.ionAssetId.isProvided()
110
+ : !newViewProps.ionAssetId.hasSameValue(oldViewProps->ionAssetId)) {
111
+ swiftPart.setIonAssetId(newViewProps.ionAssetId.get());
112
+ }
113
+ // initialCamera: struct
114
+ if (oldViewProps == nullptr
115
+ ? newViewProps.initialCamera.isProvided()
116
+ : !newViewProps.initialCamera.hasSameValue(oldViewProps->initialCamera)) {
117
+ swiftPart.setInitialCamera(newViewProps.initialCamera.get());
118
+ }
119
+ // pauseRendering: boolean
120
+ if (oldViewProps == nullptr
121
+ ? newViewProps.pauseRendering.isProvided()
122
+ : !newViewProps.pauseRendering.hasSameValue(oldViewProps->pauseRendering)) {
123
+ swiftPart.setPauseRendering(newViewProps.pauseRendering.get());
124
+ }
125
+ // maximumScreenSpaceError: number
126
+ if (oldViewProps == nullptr
127
+ ? newViewProps.maximumScreenSpaceError.isProvided()
128
+ : !newViewProps.maximumScreenSpaceError.hasSameValue(oldViewProps->maximumScreenSpaceError)) {
129
+ swiftPart.setMaximumScreenSpaceError(newViewProps.maximumScreenSpaceError.get());
130
+ }
131
+ // maximumSimultaneousTileLoads: number
132
+ if (oldViewProps == nullptr
133
+ ? newViewProps.maximumSimultaneousTileLoads.isProvided()
134
+ : !newViewProps.maximumSimultaneousTileLoads.hasSameValue(oldViewProps->maximumSimultaneousTileLoads)) {
135
+ swiftPart.setMaximumSimultaneousTileLoads(newViewProps.maximumSimultaneousTileLoads.get());
136
+ }
137
+ // loadingDescendantLimit: number
138
+ if (oldViewProps == nullptr
139
+ ? newViewProps.loadingDescendantLimit.isProvided()
140
+ : !newViewProps.loadingDescendantLimit.hasSameValue(oldViewProps->loadingDescendantLimit)) {
141
+ swiftPart.setLoadingDescendantLimit(newViewProps.loadingDescendantLimit.get());
142
+ }
143
+ // msaaSampleCount: number
144
+ if (oldViewProps == nullptr
145
+ ? newViewProps.msaaSampleCount.isProvided()
146
+ : !newViewProps.msaaSampleCount.hasSameValue(oldViewProps->msaaSampleCount)) {
147
+ swiftPart.setMsaaSampleCount(newViewProps.msaaSampleCount.get());
148
+ }
149
+ // ionImageryAssetId: number
150
+ if (oldViewProps == nullptr
151
+ ? newViewProps.ionImageryAssetId.isProvided()
152
+ : !newViewProps.ionImageryAssetId.hasSameValue(oldViewProps->ionImageryAssetId)) {
153
+ swiftPart.setIonImageryAssetId(newViewProps.ionImageryAssetId.get());
154
+ }
155
+ // maximumCachedMiB: optional
156
+ if (oldViewProps == nullptr
157
+ ? newViewProps.maximumCachedMiB.isProvided()
158
+ : !newViewProps.maximumCachedMiB.hasSameValue(oldViewProps->maximumCachedMiB)) {
159
+ swiftPart.setMaximumCachedMiB(newViewProps.maximumCachedMiB.get());
160
+ }
161
+ // preloadAncestors: optional
162
+ if (oldViewProps == nullptr
163
+ ? newViewProps.preloadAncestors.isProvided()
164
+ : !newViewProps.preloadAncestors.hasSameValue(oldViewProps->preloadAncestors)) {
165
+ swiftPart.setPreloadAncestors(newViewProps.preloadAncestors.get());
166
+ }
167
+ // preloadSiblings: optional
168
+ if (oldViewProps == nullptr
169
+ ? newViewProps.preloadSiblings.isProvided()
170
+ : !newViewProps.preloadSiblings.hasSameValue(oldViewProps->preloadSiblings)) {
171
+ swiftPart.setPreloadSiblings(newViewProps.preloadSiblings.get());
172
+ }
173
+ // forbidHoles: optional
174
+ if (oldViewProps == nullptr
175
+ ? newViewProps.forbidHoles.isProvided()
176
+ : !newViewProps.forbidHoles.hasSameValue(oldViewProps->forbidHoles)) {
177
+ swiftPart.setForbidHoles(newViewProps.forbidHoles.get());
178
+ }
179
+ // enableWaterMask: optional
180
+ if (oldViewProps == nullptr
181
+ ? newViewProps.enableWaterMask.isProvided()
182
+ : !newViewProps.enableWaterMask.hasSameValue(oldViewProps->enableWaterMask)) {
183
+ swiftPart.setEnableWaterMask(newViewProps.enableWaterMask.get());
184
+ }
185
+ // enableFogCulling: optional
186
+ if (oldViewProps == nullptr
187
+ ? newViewProps.enableFogCulling.isProvided()
188
+ : !newViewProps.enableFogCulling.hasSameValue(oldViewProps->enableFogCulling)) {
189
+ swiftPart.setEnableFogCulling(newViewProps.enableFogCulling.get());
190
+ }
191
+ // enforceCulledScreenSpaceError: optional
192
+ if (oldViewProps == nullptr
193
+ ? newViewProps.enforceCulledScreenSpaceError.isProvided()
194
+ : !newViewProps.enforceCulledScreenSpaceError.hasSameValue(oldViewProps->enforceCulledScreenSpaceError)) {
195
+ swiftPart.setEnforceCulledScreenSpaceError(newViewProps.enforceCulledScreenSpaceError.get());
196
+ }
197
+ // culledScreenSpaceError: optional
198
+ if (oldViewProps == nullptr
199
+ ? newViewProps.culledScreenSpaceError.isProvided()
200
+ : !newViewProps.culledScreenSpaceError.hasSameValue(oldViewProps->culledScreenSpaceError)) {
201
+ swiftPart.setCulledScreenSpaceError(newViewProps.culledScreenSpaceError.get());
202
+ }
203
+ // enableLodTransitionPeriod: optional
204
+ if (oldViewProps == nullptr
205
+ ? newViewProps.enableLodTransitionPeriod.isProvided()
206
+ : !newViewProps.enableLodTransitionPeriod.hasSameValue(oldViewProps->enableLodTransitionPeriod)) {
207
+ swiftPart.setEnableLodTransitionPeriod(newViewProps.enableLodTransitionPeriod.get());
208
+ }
209
+ // lodTransitionLength: optional
210
+ if (oldViewProps == nullptr
211
+ ? newViewProps.lodTransitionLength.isProvided()
212
+ : !newViewProps.lodTransitionLength.hasSameValue(oldViewProps->lodTransitionLength)) {
213
+ swiftPart.setLodTransitionLength(newViewProps.lodTransitionLength.get());
214
+ }
215
+ // sqliteCacheMaxRows: optional
216
+ if (oldViewProps == nullptr
217
+ ? newViewProps.sqliteCacheMaxRows.isProvided()
218
+ : !newViewProps.sqliteCacheMaxRows.hasSameValue(oldViewProps->sqliteCacheMaxRows)) {
219
+ swiftPart.setSqliteCacheMaxRows(newViewProps.sqliteCacheMaxRows.get());
220
+ }
221
+ // taskProcessorThreads: optional
222
+ if (oldViewProps == nullptr
223
+ ? newViewProps.taskProcessorThreads.isProvided()
224
+ : !newViewProps.taskProcessorThreads.hasSameValue(oldViewProps->taskProcessorThreads)) {
225
+ swiftPart.setTaskProcessorThreads(newViewProps.taskProcessorThreads.get());
226
+ }
227
+ // minAltitudeAboveTerrain: optional
228
+ if (oldViewProps == nullptr
229
+ ? newViewProps.minAltitudeAboveTerrain.isProvided()
230
+ : !newViewProps.minAltitudeAboveTerrain.hasSameValue(oldViewProps->minAltitudeAboveTerrain)) {
231
+ swiftPart.setMinAltitudeAboveTerrain(newViewProps.minAltitudeAboveTerrain.get());
232
+ }
233
+ // maxYawRateDegSec: optional
234
+ if (oldViewProps == nullptr
235
+ ? newViewProps.maxYawRateDegSec.isProvided()
236
+ : !newViewProps.maxYawRateDegSec.hasSameValue(oldViewProps->maxYawRateDegSec)) {
237
+ swiftPart.setMaxYawRateDegSec(newViewProps.maxYawRateDegSec.get());
238
+ }
239
+ // maxPitchRateDegSec: optional
240
+ if (oldViewProps == nullptr
241
+ ? newViewProps.maxPitchRateDegSec.isProvided()
242
+ : !newViewProps.maxPitchRateDegSec.hasSameValue(oldViewProps->maxPitchRateDegSec)) {
243
+ swiftPart.setMaxPitchRateDegSec(newViewProps.maxPitchRateDegSec.get());
244
+ }
245
+ // maxRollRateDegSec: optional
246
+ if (oldViewProps == nullptr
247
+ ? newViewProps.maxRollRateDegSec.isProvided()
248
+ : !newViewProps.maxRollRateDegSec.hasSameValue(oldViewProps->maxRollRateDegSec)) {
249
+ swiftPart.setMaxRollRateDegSec(newViewProps.maxRollRateDegSec.get());
250
+ }
251
+ // maxClimbRateMps: optional
252
+ if (oldViewProps == nullptr
253
+ ? newViewProps.maxClimbRateMps.isProvided()
254
+ : !newViewProps.maxClimbRateMps.hasSameValue(oldViewProps->maxClimbRateMps)) {
255
+ swiftPart.setMaxClimbRateMps(newViewProps.maxClimbRateMps.get());
256
+ }
257
+ // maxGroundSpeedMps: optional
258
+ if (oldViewProps == nullptr
259
+ ? newViewProps.maxGroundSpeedMps.isProvided()
260
+ : !newViewProps.maxGroundSpeedMps.hasSameValue(oldViewProps->maxGroundSpeedMps)) {
261
+ swiftPart.setMaxGroundSpeedMps(newViewProps.maxGroundSpeedMps.get());
262
+ }
263
+ // onMetrics: optional
264
+ if (oldViewProps == nullptr
265
+ ? newViewProps.onMetrics.isProvided()
266
+ : !newViewProps.onMetrics.hasSameValue(oldViewProps->onMetrics)) {
267
+ swiftPart.setOnMetrics(newViewProps.onMetrics.get());
268
+ }
269
+ // onActualCamera: optional
270
+ if (oldViewProps == nullptr
271
+ ? newViewProps.onActualCamera.isProvided()
272
+ : !newViewProps.onActualCamera.hasSameValue(oldViewProps->onActualCamera)) {
273
+ swiftPart.setOnActualCamera(newViewProps.onActualCamera.get());
274
+ }
229
275
 
230
- // 3. Update hybridRef if it changed
231
- if (newViewProps.hybridRef.isDirty) {
232
- // hybridRef changed - call it with new this
233
- const auto& maybeFunc = newViewProps.hybridRef.value;
234
- if (maybeFunc.has_value()) {
235
- maybeFunc.value()(_hybridView);
276
+ // Update hybridRef if it changed
277
+ if (oldViewProps == nullptr
278
+ ? newViewProps.hybridRef.isProvided()
279
+ : !newViewProps.hybridRef.hasSameValue(oldViewProps->hybridRef)) {
280
+ // hybridRef changed - call it with new this
281
+ const auto& maybeFunc = newViewProps.hybridRef.get();
282
+ if (maybeFunc.has_value()) {
283
+ maybeFunc.value()(_hybridView);
284
+ }
236
285
  }
237
- newViewProps.hybridRef.isDirty = false;
286
+
287
+ swiftPart.afterUpdate();
238
288
  }
239
289
 
240
- // 4. Continue in base class
290
+ // 3. Continue in base class
241
291
  [super updateProps:props oldProps:oldProps];
242
292
  }
243
293
 
@@ -246,6 +296,7 @@ using namespace margelo::nitro::reactnativecesium::views;
246
296
  }
247
297
 
248
298
  - (void)prepareForRecycle {
299
+ [self notifyOnDropView];
249
300
  [super prepareForRecycle];
250
301
  ReactNativeCesium::HybridCesiumViewSpec_cxx& swiftPart = _hybridView->getSwiftPart();
251
302
  swiftPart.maybePrepareForRecycle();
@@ -253,8 +304,7 @@ using namespace margelo::nitro::reactnativecesium::views;
253
304
 
254
305
  #ifdef ENABLE_RCT_COMPONENT_VIEW_INVALIDATE
255
306
  - (void)invalidate {
256
- ReactNativeCesium::HybridCesiumViewSpec_cxx& swiftPart = _hybridView->getSwiftPart();
257
- swiftPart.onDropView();
307
+ [self notifyOnDropView];
258
308
  [super invalidate];
259
309
  }
260
310
  #endif