@sceneview-sdk/react-native 4.27.0 → 4.29.0
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/README.md +73 -26
- package/android/build.gradle.kts +9 -0
- package/android/src/main/java/io/github/sceneview/reactnative/SceneViewManager.kt +53 -4
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +16 -4
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/react-native-sceneview.podspec +26 -8
- package/src/index.tsx +16 -4
package/README.md
CHANGED
|
@@ -50,30 +50,59 @@ Requires iOS 18+ and Xcode 16+ — `SceneViewSwift`'s own floor is iOS 18.0
|
|
|
50
50
|
`platform :ios, '18.0'` rather than React Native's `min_ios_version_supported`
|
|
51
51
|
(13.4), or `pod install` fails to resolve this module.
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
>
|
|
72
|
-
> `SceneViewSwift`
|
|
73
|
-
>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
53
|
+
**`SceneViewSwift` must arrive as a pod, and your `Podfile` must give it a
|
|
54
|
+
coordinate.** This module's podspec declares `s.dependency "SceneViewSwift",
|
|
55
|
+
"~> 4.27"`, but `SceneViewSwift` is **not published on the CocoaPods trunk**,
|
|
56
|
+
so CocoaPods cannot resolve that name on its own. Add one of these lines to
|
|
57
|
+
your `Podfile`:
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
# Released consumers — no monorepo clone
|
|
61
|
+
pod 'SceneViewSwift',
|
|
62
|
+
:podspec => 'https://raw.githubusercontent.com/sceneview/sceneview/main/SceneViewSwift.podspec'
|
|
63
|
+
|
|
64
|
+
# In-repo consumers — resolve from a local checkout
|
|
65
|
+
pod 'SceneViewSwift', :path => '<repo-root>'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`samples/react-native-demo/ios/Podfile` takes the `:path` route, exactly as
|
|
69
|
+
`samples/flutter-demo/ios/Podfile` does.
|
|
70
|
+
|
|
71
|
+
> **`main`, not a tag — for now.** A tagged coordinate would be the
|
|
72
|
+
> reproducible one, but `SceneViewSwift.podspec` lives at the repo *root* and
|
|
73
|
+
> landed after `v4.26.0` was cut, so no tag that currently exists carries it:
|
|
74
|
+
> `pod install` against `.../v4.27.0/SceneViewSwift.podspec` is a 404, verified
|
|
75
|
+
> with `git cat-file -e v4.27.0:SceneViewSwift.podspec`. The Flutter plugin
|
|
76
|
+
> documents `main` for the same reason. Both move to
|
|
77
|
+
> `:git => …, :tag => 'vX.Y.Z'` the first time a release is cut with that file
|
|
78
|
+
> in it.
|
|
79
|
+
|
|
80
|
+
> **Always supply the coordinate.** The `SceneViewSwift` name is unclaimed on
|
|
81
|
+
> the CocoaPods trunk, so a `Podfile` that omits the line does not fail closed
|
|
82
|
+
> forever — it would resolve to whatever someone else publishes under that
|
|
83
|
+
> name. The explicit `:podspec` / `:path` line is what makes the source
|
|
84
|
+
> unambiguous.
|
|
85
|
+
|
|
86
|
+
> **Swift Package Manager does not work for this module.** Adding
|
|
87
|
+
> `SceneViewSwift` to the host *project* in Xcode (*File ▸ Add Package
|
|
88
|
+
> Dependencies…*) leaves it invisible here: this module's `ios/*.swift`
|
|
89
|
+
> compiles inside the generated `Pods.xcodeproj`, which does not see the host
|
|
90
|
+
> project's SwiftPM packages, and `import SceneViewSwift` fails with *"Unable
|
|
91
|
+
> to find module dependency: 'SceneViewSwift'"*. The README used to document
|
|
92
|
+
> the SwiftPM route as the supported one; it had never been built, and the
|
|
93
|
+
> first real `xcodebuild` against it failed exactly that way. This closes the
|
|
94
|
+
> React Native half of
|
|
95
|
+
> [#3072](https://github.com/sceneview/sceneview/issues/3072).
|
|
96
|
+
|
|
97
|
+
> **Keep the two versions in step.** npm `4.27.0`'s Swift requires
|
|
98
|
+
> `SceneViewSwift` at tag `v4.27.0` or newer: this module's `ios/*.swift`
|
|
99
|
+
> builds on `SceneViewerHostView` — which landed *after* `v4.26.0`, so no
|
|
100
|
+
> `SceneViewer*` type exists at that tag or any earlier one — and it calls the
|
|
101
|
+
> two-parameter `onTapEntity` (the tapped model root is the second parameter).
|
|
102
|
+
> A mismatch is a loud Swift compile error at build time, not a runtime
|
|
103
|
+
> surprise, but no CI job here will catch it for you: `rn-ios-compile.yml`
|
|
104
|
+
> type-checks against the `SceneViewSwift` sources *in this repo*, not against
|
|
105
|
+
> the tag your app resolves.
|
|
77
106
|
|
|
78
107
|
### Android
|
|
79
108
|
|
|
@@ -220,9 +249,27 @@ coverage map (tracked in [#909](https://github.com/sceneview/sceneview/issues/90
|
|
|
220
249
|
configured natively** on either platform. Setting them has no effect today.
|
|
221
250
|
- **`onPlaneDetected`** — dispatched on **Android** only; SceneViewSwift's
|
|
222
251
|
`ARSceneView` exposes no plane-detection callback, so it never fires on iOS.
|
|
223
|
-
- **`onTap`** — dispatched on
|
|
252
|
+
- **`onTap`** — dispatched on **Android and iOS** on both views. On `SceneView`
|
|
224
253
|
(3D) it carries the tapped model's world position and its file base name
|
|
225
|
-
without extension as `nodeName
|
|
254
|
+
without extension as `nodeName`.
|
|
255
|
+
> **Measured, not inferred ([#3086](https://github.com/sceneview/sceneview/issues/3086)).**
|
|
256
|
+
> The iOS 3D tap was run on an iPhone 17 Pro Max simulator with the Fox USDZ
|
|
257
|
+
> rendering: 5 taps on the model, 5 dispatches, `nodeName` `khronos_fox` every
|
|
258
|
+
> time; a tap on empty space dispatched nothing, as documented below. The path
|
|
259
|
+
> was instrumented at all four stages — gesture arrival, entity resolution,
|
|
260
|
+
> `SceneViewerHostView.reportTap`, and this module's `onTapEntity` block — and
|
|
261
|
+
> every stage fired.
|
|
262
|
+
>
|
|
263
|
+
> This does **not** clear the sibling bridge: Flutter's 3D `onTap` still never
|
|
264
|
+
> fires on iOS ([#3045](https://github.com/sceneview/sceneview/issues/3045)).
|
|
265
|
+
> The same run measured both hosts back to back against the *same*
|
|
266
|
+
> SceneViewSwift build and the same entity graph (11 entities, 1 collision
|
|
267
|
+
> shape, 9 input targets in each): 6 taps on the model under Flutter resolved
|
|
268
|
+
> no entity at all, while the plain, untargeted gesture arrived every time. So
|
|
269
|
+
> #3045 is a property of Flutter's platform-view touch delivery, not of
|
|
270
|
+
> RealityKit's entity-targeted hit test — which is what its write-up claims.
|
|
271
|
+
|
|
272
|
+
On
|
|
226
273
|
`ARSceneView` *what a hit reports* differs: **Android** hit-tests the AR
|
|
227
274
|
scene, so a tap on a model reports that model's file base name just as
|
|
228
275
|
`SceneView` does and a plane hit or a miss reports `null`; **iOS** always
|
package/android/build.gradle.kts
CHANGED
|
@@ -64,4 +64,13 @@ dependencies {
|
|
|
64
64
|
implementation("androidx.compose.ui:ui")
|
|
65
65
|
implementation("androidx.compose.foundation:foundation")
|
|
66
66
|
implementation("androidx.compose.runtime:runtime")
|
|
67
|
+
|
|
68
|
+
// Local JVM unit tests (#3062). Until this existed, the bridge's pure-Kotlin
|
|
69
|
+
// derivations — the tap payload's `nodeName` above all — were exercised by
|
|
70
|
+
// NOTHING: `tools/rn-android-compile` is a compile gate, and the RN demo has
|
|
71
|
+
// never been built end-to-end. A string derivation that silently reports the
|
|
72
|
+
// wrong value is exactly the class a compiler cannot catch, and #3071 was one.
|
|
73
|
+
// These run on the JVM with no device and no emulator, in the same standalone
|
|
74
|
+
// harness that already compiles the module.
|
|
75
|
+
testImplementation("junit:junit:4.13.2")
|
|
67
76
|
}
|
|
@@ -404,13 +404,62 @@ data class ModelNodeData(
|
|
|
404
404
|
* `robot.glb?sig=SIG&v=1` — a CDN signature leaking into a payload that
|
|
405
405
|
* apps routinely put in a label or an analytics event.
|
|
406
406
|
*
|
|
407
|
+
* [urlPathOf] then drops the authority, which carries the other half of the
|
|
408
|
+
* same exposure: the last `/`-separated segment of a path-less URL IS the
|
|
409
|
+
* authority, and an authority may carry userinfo, so
|
|
410
|
+
* `https://user:pa55w0rd@cdn.example` would report `user:pa55w0rd@cdn`
|
|
411
|
+
* (#3071).
|
|
412
|
+
*
|
|
407
413
|
* `null` for a path with no usable base name, so the payload stays
|
|
408
414
|
* `nodeName: null` rather than an empty string.
|
|
409
415
|
*/
|
|
410
|
-
fun nodeName(): String? =
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
416
|
+
fun nodeName(): String? = modelNodeName(src)
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* [ModelNodeData.nodeName]'s derivation, as a top-level function.
|
|
421
|
+
*
|
|
422
|
+
* Split out so it can be unit-tested without constructing a [ModelNodeData]:
|
|
423
|
+
* that data class defaults `position`/`rotation` to `Position`/`Rotation` from
|
|
424
|
+
* the **published** SceneView artifacts, which are compiled for JVM 21, while
|
|
425
|
+
* this module targets JVM 17 and its CI gate runs on a JDK 17. Compiling
|
|
426
|
+
* against a newer class file is fine; *loading* one is not, so instantiating
|
|
427
|
+
* the data class in a JVM unit test throws `UnsupportedClassVersionError`.
|
|
428
|
+
*
|
|
429
|
+
* That mismatch is harmless on a device — D8 re-compiles everything to DEX and
|
|
430
|
+
* the class-file version stops existing — so the fix belongs in the test's
|
|
431
|
+
* reach, not in the module's or the gate's toolchain.
|
|
432
|
+
*
|
|
433
|
+
* This also puts the derivation at the same level as the Flutter bridge's
|
|
434
|
+
* `tapNodeName`, which the shared case table already assumed.
|
|
435
|
+
*/
|
|
436
|
+
internal fun modelNodeName(src: String): String? =
|
|
437
|
+
urlPathOf(src.substringBefore('?').substringBefore('#'))
|
|
438
|
+
.substringAfterLast('/').substringBeforeLast('.')
|
|
439
|
+
.takeIf { it.isNotEmpty() }
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* The path part of [source] when it is a URL, [source] unchanged otherwise.
|
|
443
|
+
*
|
|
444
|
+
* Returns `""` for a path-less URL: there is no file name in
|
|
445
|
+
* `https://cdn.example` to report, and `null` is the honest payload.
|
|
446
|
+
*
|
|
447
|
+
* Mirrored verbatim in the Flutter bridge's `SceneViewPlugin.kt`. The two
|
|
448
|
+
* bridges are separately published packages with no shared Kotlin, so the
|
|
449
|
+
* duplication is the seam, not an oversight — both sides are pinned by their
|
|
450
|
+
* own unit tests.
|
|
451
|
+
*/
|
|
452
|
+
internal fun urlPathOf(source: String): String {
|
|
453
|
+
val schemeEnd = source.indexOf("://")
|
|
454
|
+
if (schemeEnd < 0) return source
|
|
455
|
+
// A "://" that appears after a slash is not a scheme delimiter — the string
|
|
456
|
+
// is already a path (`models/odd://name.glb`) and cutting at it would drop
|
|
457
|
+
// real path segments.
|
|
458
|
+
val firstSlash = source.indexOf('/')
|
|
459
|
+
if (firstSlash in 0 until schemeEnd) return source
|
|
460
|
+
val afterScheme = source.substring(schemeEnd + 3)
|
|
461
|
+
val pathStart = afterScheme.indexOf('/')
|
|
462
|
+
return if (pathStart < 0) "" else afterScheme.substring(pathStart)
|
|
414
463
|
}
|
|
415
464
|
|
|
416
465
|
data class GeometryNodeData(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","e","__esModule","default","isNativeAvailable","Platform","OS","NativeSceneView","requireNativeComponent","NativeARSceneView","UnsupportedView","name","createElement","View","style","fallbackStyles","container","Text","text","StyleSheet","create","flex","justifyContent","alignItems","backgroundColor","color","fontSize","SceneView","props","exports","ARSceneView","NativeARRecorder","NativeModules","RNARRecorder","ARRecorder","isSupported","rejectUnsupported","Promise","reject","Error","start","stop","outputPath","saveToPhotoLibrary","movPath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAMA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AASsB,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAhBtB;AACA;AACA;AACA;AACA;AACA;;AAaA;AACA;AACA;;AAEA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","e","__esModule","default","isNativeAvailable","Platform","OS","NativeSceneView","requireNativeComponent","NativeARSceneView","UnsupportedView","name","createElement","View","style","fallbackStyles","container","Text","text","StyleSheet","create","flex","justifyContent","alignItems","backgroundColor","color","fontSize","SceneView","props","exports","ARSceneView","NativeARRecorder","NativeModules","RNARRecorder","ARRecorder","isSupported","rejectUnsupported","Promise","reject","Error","start","stop","outputPath","saveToPhotoLibrary","movPath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAMA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AASsB,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAhBtB;AACA;AACA;AACA;AACA;AACA;;AAaA;AACA;AACA;;AAEA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;;AAkCA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiIA;AACA;AACA;;AAEA,MAAMG,iBAAiB,GAAGC,qBAAQ,CAACC,EAAE,KAAK,SAAS,IAAID,qBAAQ,CAACC,EAAE,KAAK,KAAK;AAE5E,MAAMC,eAAe,GAAGH,iBAAiB,GACrC,IAAAI,mCAAsB,EAAiB,aAAa,CAAC,GACrD,IAAI;AAER,MAAMC,iBAAiB,GAAGL,iBAAiB,GACvC,IAAAI,mCAAsB,EAAmB,eAAe,CAAC,GACzD,IAAI;;AAER;AACA;AACA;;AAEA,MAAME,eAA2C,GAAGA,CAAC;EAAEC;AAAK,CAAC,kBAC3Dd,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACZ,YAAA,CAAAa,IAAI;EAACC,KAAK,EAAEC,cAAc,CAACC;AAAU,gBACpCnB,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACZ,YAAA,CAAAiB,IAAI;EAACH,KAAK,EAAEC,cAAc,CAACG;AAAK,GAAEP,IAAI,EAAC,oCAAwC,CAC5E,CACP;AAED,MAAMI,cAAc,GAAGI,uBAAU,CAACC,MAAM,CAAC;EACvCJ,SAAS,EAAE;IACTK,IAAI,EAAE,CAAC;IACPC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,eAAe,EAAE;EACnB,CAAC;EACDN,IAAI,EAAE;IACJO,KAAK,EAAE,MAAM;IACbC,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,SAAmC,GAAIC,KAAK,IAAK;EAC5D,IAAI,CAACrB,eAAe,EAAE;IACpB,oBAAOV,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACF,eAAe;MAACC,IAAI,EAAC;IAAW,CAAE,CAAC;EAC7C;EACA,oBAAOd,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACL,eAAe,EAAKqB,KAAQ,CAAC;AACvC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATAC,OAAA,CAAAF,SAAA,GAAAA,SAAA;AAUO,MAAMG,WAAuC,GAAIF,KAAK,IAAK;EAChE,IAAI,CAACnB,iBAAiB,EAAE;IACtB,oBAAOZ,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACF,eAAe;MAACC,IAAI,EAAC;IAAa,CAAE,CAAC;EAC/C;EACA,oBAAOd,MAAA,CAAAM,OAAA,CAAAS,aAAA,CAACH,iBAAiB,EAAKmB,KAAQ,CAAC;AACzC,CAAC;;AAED;AACA;AACA;;AAEA;AAAAC,OAAA,CAAAC,WAAA,GAAAA,WAAA;AAOA,MAAMC,gBAAgD,GAAGC,0BAAa,CAACC,YAAY;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,UAAU,CAAC;EACtB;EACA,WAAWC,WAAWA,CAAA,EAAY;IAChC,OAAO9B,qBAAQ,CAACC,EAAE,KAAK,KAAK,IAAIyB,gBAAgB,IAAI,IAAI;EAC1D;EAEQK,iBAAiBA,CAAA,EAAmB;IAC1C,OAAOC,OAAO,CAACC,MAAM,CACnB,IAAIC,KAAK,CACP,oEAAoE,GAClE,sCACJ,CACF,CAAC;EACH;;EAEA;EACAC,KAAKA,CAAA,EAAkB;IACrB,IAAI,CAACN,UAAU,CAACC,WAAW,IAAI,CAACJ,gBAAgB,EAAE;MAChD,OAAO,IAAI,CAACK,iBAAiB,CAAC,CAAC;IACjC;IACA,OAAOL,gBAAgB,CAACS,KAAK,CAAC,CAAC;EACjC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,IAAIA,CAACC,UAAmB,EAAmB;IACzC,IAAI,CAACR,UAAU,CAACC,WAAW,IAAI,CAACJ,gBAAgB,EAAE;MAChD,OAAO,IAAI,CAACK,iBAAiB,CAAC,CAAC;IACjC;IACA,OAAOL,gBAAgB,CAACU,IAAI,CAACC,UAAU,IAAI,IAAI,CAAC;EAClD;;EAEA;EACAC,kBAAkBA,CAACC,OAAe,EAAiB;IACjD,IAAI,CAACV,UAAU,CAACC,WAAW,IAAI,CAACJ,gBAAgB,EAAE;MAChD,OAAO,IAAI,CAACK,iBAAiB,CAAC,CAAC;IACjC;IACA,OAAOL,gBAAgB,CAACY,kBAAkB,CAACC,OAAO,CAAC;EACrD;AACF;AAACf,OAAA,CAAAK,UAAA,GAAAA,UAAA","ignoreList":[]}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","NativeModules","Platform","requireNativeComponent","StyleSheet","Text","View","isNativeAvailable","OS","NativeSceneView","NativeARSceneView","UnsupportedView","name","createElement","style","fallbackStyles","container","text","create","flex","justifyContent","alignItems","backgroundColor","color","fontSize","SceneView","props","ARSceneView","NativeARRecorder","RNARRecorder","ARRecorder","isSupported","rejectUnsupported","Promise","reject","Error","start","stop","outputPath","saveToPhotoLibrary","movPath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,aAAa,EAEbC,QAAQ,EACRC,sBAAsB,EACtBC,UAAU,EACVC,IAAI,EACJC,IAAI,QAEC,cAAc;;AAErB;AACA;AACA;;AAEA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["React","NativeModules","Platform","requireNativeComponent","StyleSheet","Text","View","isNativeAvailable","OS","NativeSceneView","NativeARSceneView","UnsupportedView","name","createElement","style","fallbackStyles","container","text","create","flex","justifyContent","alignItems","backgroundColor","color","fontSize","SceneView","props","ARSceneView","NativeARRecorder","RNARRecorder","ARRecorder","isSupported","rejectUnsupported","Promise","reject","Error","start","stop","outputPath","saveToPhotoLibrary","movPath"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -65,8 +65,11 @@ export interface TapEvent {
|
|
|
65
65
|
z: number;
|
|
66
66
|
/**
|
|
67
67
|
* Name of the tapped model: its file's base name without extension
|
|
68
|
-
* (`models/robot.glb` → `robot`)
|
|
69
|
-
*
|
|
68
|
+
* (`models/robot.glb` → `robot`). Never an asset-internal mesh name — a tap
|
|
69
|
+
* inside a model always reports the model.
|
|
70
|
+
*
|
|
71
|
+
* **Measured on Android and iOS** (#3086) — the iOS run named the
|
|
72
|
+
* tapped model on every dispatch; see {@link SceneViewProps.onTap | `onTap`}.
|
|
70
73
|
*
|
|
71
74
|
* `null` — never `undefined` — when the tap hit no model: an untitled
|
|
72
75
|
* geometry node or nothing at all on Android, a plane or a miss in Android
|
|
@@ -141,9 +144,18 @@ export interface SceneViewProps {
|
|
|
141
144
|
/**
|
|
142
145
|
* Called when the user taps inside the scene.
|
|
143
146
|
*
|
|
147
|
+
* Dispatched on **Android and iOS**. The iOS half was measured on an iPhone
|
|
148
|
+
* 17 Pro Max simulator — 5 taps on a rendering model, 5 dispatches, the
|
|
149
|
+
* model's name every time
|
|
150
|
+
* ({@link https://github.com/sceneview/sceneview/issues/3086 | #3086}).
|
|
151
|
+
* The sibling Flutter bridge still never fires its 3D `onTap` on iOS
|
|
152
|
+
* ({@link https://github.com/sceneview/sceneview/issues/3045 | #3045}); the
|
|
153
|
+
* same run showed that is Flutter's platform-view touch delivery, not this
|
|
154
|
+
* shared RealityKit path, so it does not apply here.
|
|
155
|
+
*
|
|
144
156
|
* The event payload carries the world-space position of the tapped model and
|
|
145
|
-
* its `nodeName` (the model file's base name without extension)
|
|
146
|
-
*
|
|
157
|
+
* its `nodeName` (the model file's base name without extension). A tap that
|
|
158
|
+
* hits no model reports `nodeName: null` — with
|
|
147
159
|
* the tapped node's real world position on Android when it landed on an
|
|
148
160
|
* (unnamed) geometry node, and `0, 0, 0` when it hit nothing at all. That
|
|
149
161
|
* `0, 0, 0` miss is **in practice Android-only**: iOS resolves the tap
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,EAMzB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAMtB,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAMD,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sceneview-sdk/react-native",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.29.0",
|
|
4
4
|
"description": "React Native bindings for SceneView — 3D and AR scenes powered by Filament (Android) and RealityKit (iOS)",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"android",
|
|
14
14
|
"ios",
|
|
15
15
|
"react-native-sceneview.podspec",
|
|
16
|
-
"!**/__tests__"
|
|
16
|
+
"!**/__tests__",
|
|
17
|
+
"!android/src/test"
|
|
17
18
|
],
|
|
18
19
|
"scripts": {
|
|
19
20
|
"typescript": "tsc --noEmit",
|
|
@@ -23,14 +23,32 @@ Pod::Spec.new do |s|
|
|
|
23
23
|
|
|
24
24
|
s.dependency "React-Core"
|
|
25
25
|
|
|
26
|
-
# `
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
26
|
+
# This module's `ios/*.swift` files `import SceneViewSwift`, so the module has
|
|
27
|
+
# to arrive as a POD, not as a Swift package on the host app's project: this
|
|
28
|
+
# source compiles inside the generated `Pods.xcodeproj`, which does not see
|
|
29
|
+
# the host project's SwiftPM packages ("Unable to find module dependency:
|
|
30
|
+
# 'SceneViewSwift'"). The SwiftPM route this spec used to document was never
|
|
31
|
+
# measured — the demo app was scaffolded and never built — and the first real
|
|
32
|
+
# `xcodebuild` against it failed exactly that way. Closes the RN half of #3072.
|
|
33
|
+
#
|
|
34
|
+
# `SceneViewSwift` is NOT on the CocoaPods trunk, so a host app must give the
|
|
35
|
+
# dependency a coordinate of its own — one of:
|
|
36
|
+
# pod 'SceneViewSwift',
|
|
37
|
+
# :podspec => 'https://raw.githubusercontent.com/sceneview/sceneview/main/SceneViewSwift.podspec'
|
|
38
|
+
# pod 'SceneViewSwift', :path => '<repo-root>' # in-repo consumers
|
|
39
|
+
# `main`, not a tag, and not `:git =>, :tag =>`: the root podspec landed after
|
|
40
|
+
# v4.26.0 was cut, so no existing tag carries it and a tagged coordinate 404s
|
|
41
|
+
# (`git cat-file -e v4.27.0:SceneViewSwift.podspec`). `flutter_sceneview.podspec`
|
|
42
|
+
# says `main` for the same reason; both move to a tag once a release carries
|
|
43
|
+
# the file. Supply the coordinate always — the name is unclaimed on the trunk,
|
|
44
|
+
# so a Podfile that leaves it out does not fail closed, it resolves to
|
|
45
|
+
# whatever someone else publishes under that name.
|
|
46
|
+
# `samples/react-native-demo/ios/Podfile` takes the `:path` route, exactly as
|
|
47
|
+
# `samples/flutter-demo/ios/Podfile` does. See this module's README "iOS".
|
|
48
|
+
#
|
|
49
|
+
# Loose `~> 4.27` rather than `= s.version`: an app pinned to an older
|
|
50
|
+
# SceneViewSwift still resolves, mirroring `flutter_sceneview.podspec`.
|
|
51
|
+
s.dependency "SceneViewSwift", "~> 4.29"
|
|
34
52
|
|
|
35
53
|
s.swift_version = "5.9"
|
|
36
54
|
end
|
package/src/index.tsx
CHANGED
|
@@ -92,8 +92,11 @@ export interface TapEvent {
|
|
|
92
92
|
z: number;
|
|
93
93
|
/**
|
|
94
94
|
* Name of the tapped model: its file's base name without extension
|
|
95
|
-
* (`models/robot.glb` → `robot`)
|
|
96
|
-
*
|
|
95
|
+
* (`models/robot.glb` → `robot`). Never an asset-internal mesh name — a tap
|
|
96
|
+
* inside a model always reports the model.
|
|
97
|
+
*
|
|
98
|
+
* **Measured on Android and iOS** (#3086) — the iOS run named the
|
|
99
|
+
* tapped model on every dispatch; see {@link SceneViewProps.onTap | `onTap`}.
|
|
97
100
|
*
|
|
98
101
|
* `null` — never `undefined` — when the tap hit no model: an untitled
|
|
99
102
|
* geometry node or nothing at all on Android, a plane or a miss in Android
|
|
@@ -181,9 +184,18 @@ export interface SceneViewProps {
|
|
|
181
184
|
/**
|
|
182
185
|
* Called when the user taps inside the scene.
|
|
183
186
|
*
|
|
187
|
+
* Dispatched on **Android and iOS**. The iOS half was measured on an iPhone
|
|
188
|
+
* 17 Pro Max simulator — 5 taps on a rendering model, 5 dispatches, the
|
|
189
|
+
* model's name every time
|
|
190
|
+
* ({@link https://github.com/sceneview/sceneview/issues/3086 | #3086}).
|
|
191
|
+
* The sibling Flutter bridge still never fires its 3D `onTap` on iOS
|
|
192
|
+
* ({@link https://github.com/sceneview/sceneview/issues/3045 | #3045}); the
|
|
193
|
+
* same run showed that is Flutter's platform-view touch delivery, not this
|
|
194
|
+
* shared RealityKit path, so it does not apply here.
|
|
195
|
+
*
|
|
184
196
|
* The event payload carries the world-space position of the tapped model and
|
|
185
|
-
* its `nodeName` (the model file's base name without extension)
|
|
186
|
-
*
|
|
197
|
+
* its `nodeName` (the model file's base name without extension). A tap that
|
|
198
|
+
* hits no model reports `nodeName: null` — with
|
|
187
199
|
* the tapped node's real world position on Android when it landed on an
|
|
188
200
|
* (unnamed) geometry node, and `0, 0, 0` when it hit nothing at all. That
|
|
189
201
|
* `0, 0, 0` miss is **in practice Android-only**: iOS resolves the tap
|