@sceneview-sdk/react-native 3.6.1
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/LICENSE +201 -0
- package/README.md +139 -0
- package/android/build.gradle.kts +36 -0
- package/android/src/main/AndroidManifest.xml +6 -0
- package/android/src/main/java/io/github/sceneview/reactnative/ARSceneViewManager.kt +125 -0
- package/android/src/main/java/io/github/sceneview/reactnative/SceneViewManager.kt +137 -0
- package/android/src/main/java/io/github/sceneview/reactnative/SceneViewModule.kt +31 -0
- package/ios/RNSceneViewManager.m +24 -0
- package/ios/SceneViewModule.swift +259 -0
- package/lib/commonjs/index.js +103 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/module/index.js +95 -0
- package/lib/module/index.js.map +1 -0
- package/lib/typescript/src/index.d.ts +98 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +71 -0
- package/react-native-sceneview.podspec +21 -0
- package/src/index.tsx +184 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "react-native-sceneview"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["repository"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = "SceneView contributors"
|
|
12
|
+
|
|
13
|
+
s.platforms = { :ios => "17.0" }
|
|
14
|
+
s.source = { :git => "https://github.com/sceneview/sceneview.git", :tag => s.version }
|
|
15
|
+
s.source_files = "ios/**/*.{swift,m}"
|
|
16
|
+
|
|
17
|
+
s.dependency "React-Core"
|
|
18
|
+
s.dependency "SceneViewSwift", "~> 3.4"
|
|
19
|
+
|
|
20
|
+
s.swift_version = "5.9"
|
|
21
|
+
end
|
package/src/index.tsx
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
requireNativeComponent,
|
|
4
|
+
Platform,
|
|
5
|
+
type ViewStyle,
|
|
6
|
+
type NativeSyntheticEvent,
|
|
7
|
+
View,
|
|
8
|
+
Text,
|
|
9
|
+
StyleSheet,
|
|
10
|
+
} from 'react-native';
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Node type interfaces
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
/** A 3D model loaded from a .glb / .gltf file. */
|
|
17
|
+
export interface ModelNode {
|
|
18
|
+
/** Asset path or URL to the glTF/GLB model. */
|
|
19
|
+
src: string;
|
|
20
|
+
/** World-space position [x, y, z]. Default: [0, 0, 0]. */
|
|
21
|
+
position?: [number, number, number];
|
|
22
|
+
/** Euler rotation in degrees [x, y, z]. Default: [0, 0, 0]. */
|
|
23
|
+
rotation?: [number, number, number];
|
|
24
|
+
/** Scale factor. Can be uniform (number) or per-axis [x, y, z]. */
|
|
25
|
+
scale?: number | [number, number, number];
|
|
26
|
+
/**
|
|
27
|
+
* Animation name to play automatically.
|
|
28
|
+
* If provided (non-null), auto-animate is enabled on the native side.
|
|
29
|
+
*/
|
|
30
|
+
animation?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A procedural geometry node (box, sphere, cylinder, plane). */
|
|
34
|
+
export interface GeometryNode {
|
|
35
|
+
type: 'box' | 'sphere' | 'cylinder' | 'plane';
|
|
36
|
+
size?: [number, number, number];
|
|
37
|
+
position?: [number, number, number];
|
|
38
|
+
rotation?: [number, number, number];
|
|
39
|
+
scale?: number | [number, number, number];
|
|
40
|
+
/** Hex color string, e.g. "#FF5500". */
|
|
41
|
+
color?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** A light source in the scene. */
|
|
45
|
+
export interface LightNode {
|
|
46
|
+
type: 'directional' | 'point' | 'spot';
|
|
47
|
+
intensity?: number;
|
|
48
|
+
color?: string;
|
|
49
|
+
position?: [number, number, number];
|
|
50
|
+
direction?: [number, number, number];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Event payloads
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
export interface TapEvent {
|
|
58
|
+
/** World-space coordinates of the tap. */
|
|
59
|
+
x: number;
|
|
60
|
+
y: number;
|
|
61
|
+
z: number;
|
|
62
|
+
/** Name of the tapped node, if any. */
|
|
63
|
+
nodeName?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface PlaneDetectedEvent {
|
|
67
|
+
id: string;
|
|
68
|
+
type: 'horizontal' | 'vertical';
|
|
69
|
+
center: [number, number, number];
|
|
70
|
+
extent: [number, number];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Props
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
export interface SceneViewProps {
|
|
78
|
+
style?: ViewStyle;
|
|
79
|
+
|
|
80
|
+
/** HDR environment asset path (e.g. "environments/studio.hdr"). */
|
|
81
|
+
environment?: string;
|
|
82
|
+
|
|
83
|
+
/** Model nodes to render in the scene. */
|
|
84
|
+
modelNodes?: ModelNode[];
|
|
85
|
+
/** Geometry nodes to render in the scene. */
|
|
86
|
+
geometryNodes?: GeometryNode[];
|
|
87
|
+
/** Light nodes in the scene. */
|
|
88
|
+
lightNodes?: LightNode[];
|
|
89
|
+
|
|
90
|
+
/** Enable default orbit camera controls. Default: true. */
|
|
91
|
+
cameraOrbit?: boolean;
|
|
92
|
+
|
|
93
|
+
/** Called when the user taps inside the scene. */
|
|
94
|
+
onTap?: (event: NativeSyntheticEvent<TapEvent>) => void;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface ARSceneViewProps extends SceneViewProps {
|
|
98
|
+
/** Enable plane detection. Default: true. */
|
|
99
|
+
planeDetection?: boolean;
|
|
100
|
+
|
|
101
|
+
/** Enable depth occlusion (ARCore Depth API / LiDAR). Default: false. */
|
|
102
|
+
depthOcclusion?: boolean;
|
|
103
|
+
|
|
104
|
+
/** Enable instant placement (approximate hit-test before tracking). Default: false. */
|
|
105
|
+
instantPlacement?: boolean;
|
|
106
|
+
|
|
107
|
+
/** Called when a new plane is detected. */
|
|
108
|
+
onPlaneDetected?: (event: NativeSyntheticEvent<PlaneDetectedEvent>) => void;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Native components (only available on Android and iOS)
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
|
|
115
|
+
const isNativeAvailable = Platform.OS === 'android' || Platform.OS === 'ios';
|
|
116
|
+
|
|
117
|
+
const NativeSceneView = isNativeAvailable
|
|
118
|
+
? requireNativeComponent<SceneViewProps>('RNSceneView')
|
|
119
|
+
: null;
|
|
120
|
+
|
|
121
|
+
const NativeARSceneView = isNativeAvailable
|
|
122
|
+
? requireNativeComponent<ARSceneViewProps>('RNARSceneView')
|
|
123
|
+
: null;
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Fallback for unsupported platforms
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
const UnsupportedView: React.FC<{ name: string }> = ({ name }) => (
|
|
130
|
+
<View style={fallbackStyles.container}>
|
|
131
|
+
<Text style={fallbackStyles.text}>{name} is not supported on this platform</Text>
|
|
132
|
+
</View>
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const fallbackStyles = StyleSheet.create({
|
|
136
|
+
container: {
|
|
137
|
+
flex: 1,
|
|
138
|
+
justifyContent: 'center',
|
|
139
|
+
alignItems: 'center',
|
|
140
|
+
backgroundColor: '#1a1a2e',
|
|
141
|
+
},
|
|
142
|
+
text: {
|
|
143
|
+
color: '#aaa',
|
|
144
|
+
fontSize: 16,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Public components
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A 3D scene rendered with Filament (Android) or RealityKit (iOS).
|
|
154
|
+
*
|
|
155
|
+
* ```tsx
|
|
156
|
+
* <SceneView
|
|
157
|
+
* environment="environments/studio.hdr"
|
|
158
|
+
* modelNodes={[{ src: "models/robot.glb" }]}
|
|
159
|
+
* />
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export const SceneView: React.FC<SceneViewProps> = (props) => {
|
|
163
|
+
if (!NativeSceneView) {
|
|
164
|
+
return <UnsupportedView name="SceneView" />;
|
|
165
|
+
}
|
|
166
|
+
return <NativeSceneView {...props} />;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* An augmented-reality scene using ARCore (Android) or ARKit (iOS).
|
|
171
|
+
*
|
|
172
|
+
* ```tsx
|
|
173
|
+
* <ARSceneView
|
|
174
|
+
* planeDetection
|
|
175
|
+
* modelNodes={[{ src: "models/chair.glb", position: [0, 0, -1] }]}
|
|
176
|
+
* />
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export const ARSceneView: React.FC<ARSceneViewProps> = (props) => {
|
|
180
|
+
if (!NativeARSceneView) {
|
|
181
|
+
return <UnsupportedView name="ARSceneView" />;
|
|
182
|
+
}
|
|
183
|
+
return <NativeARSceneView {...props} />;
|
|
184
|
+
};
|