diff --git a/.gitignore b/.gitignore index 0feef539..314491c1 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,4 @@ test/ios/fastlane/README.md test/android/fastlane/README.md test/android/fastlane/report.xml /android/viro_bridge/.cxx/Debug +/ios/dist/ViroRenderer/armv7_arm64 diff --git a/CHANGELOG.md b/CHANGELOG.md index 07b6f356..054ecc23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,521 @@ # CHANGELOG +## v2.53.0 — 06 March 2026 + +### Breaking Changes + +- **`ViroARSceneNavigator` — `provider` replaces `cloudAnchorProvider` and `geospatialAnchorProvider`** + + The two separate props are merged into a single `provider` prop that controls + both the cloud anchor and geospatial anchor backends simultaneously. + + **Before:** + ```tsx + + ``` + + **After:** + ```tsx + // provider defaults to "reactvision" — prop can be omitted entirely + + + // Or to override: + + ``` + + `ViroCloudAnchorProvider` and `ViroGeospatialAnchorProvider` types are now + deprecated aliases for the new `ViroProvider` type. Remove them from props; + use `provider` instead. The old types still compile with a deprecation warning + to ease migration. + +- **Expo plugin (`withViro`) — `provider` replaces `cloudAnchorProvider` and `geospatialAnchorProvider`** + + The two separate Expo plugin options are merged into a single `provider` option in + `app.json`. The old options are deprecated but still accepted as overrides. + + **Before:** + ```json + ["@reactvision/react-viro", { + "cloudAnchorProvider": "reactvision", + "geospatialAnchorProvider": "reactvision", + "rvApiKey": "...", + "rvProjectId": "..." + }] + ``` + + **After:** + ```json + ["@reactvision/react-viro", { + "provider": "reactvision", + "rvApiKey": "...", + "rvProjectId": "..." + }] + ``` + + Setting `provider: "arcore"` continues to inject ARCore pods on iOS and force dynamic + linkage, exactly as `cloudAnchorProvider: "arcore"` did before. + Setting `provider: "reactvision"` injects location permissions on both platforms + (previously only triggered when `geospatialAnchorProvider: "reactvision"` was explicit). + +- **ViroARPlaneSelector — new architecture (scene-event-driven)** + + The component no longer self-discovers planes through pre-allocated + `ViroARPlane` detector slots. You must forward the parent + `ViroARScene` anchor events to it via a ref: + + ```tsx + const selectorRef = useRef(null); + + selectorRef.current?.handleAnchorFound(a)} + onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)} + onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)} + > + + + + + ``` + + The old self-contained usage (no ref, no anchor wiring) no longer works. + +### Added + +- **`gpsToArWorld(devicePose, lat, lng, alt)` utility** — converts a GPS coordinate to an + AR world-space `[x, y, z]` offset from the device's current geospatial pose. Uses + Mercator projection + compass heading. Available in `@reactvision/react-viro`. +- **`latLngToMercator(lat, lng)` utility** — WGS84 Mercator projection returning metres. + Building block for `gpsToArWorld` and custom geo math. + +- **ReactVision — Cloud Anchor Provider** + + The `"reactvision"` provider routes `hostCloudAnchor` / `resolveCloudAnchor` + through the ReactVision platform — no Google Cloud configuration or API key + required. The existing `hostCloudAnchor`, `resolveCloudAnchor`, and + `onCloudAnchorStateChange` API is unchanged. + +- **ReactVision — Cloud Anchor Management API** + + 8 new methods on `arSceneNavigator` for full CRUD and analytics on cloud anchors + (available when `provider="reactvision"`, the default): + + | Method | Description | + |--------|-------------| + | `rvGetCloudAnchor(anchorId)` | Fetch a single anchor record | + | `rvListCloudAnchors(limit, offset)` | Paginated list of all project anchors | + | `rvUpdateCloudAnchor(id, name, desc, isPublic)` | Rename / re-describe an anchor | + | `rvDeleteCloudAnchor(anchorId)` | Permanently delete an anchor and its assets | + | `rvFindNearbyCloudAnchors(lat, lng, radius, limit)` | GPS proximity search | + | `rvAttachAssetToCloudAnchor(id, url, size, name, type, userId)` | Attach a hosted file | + | `rvRemoveAssetFromCloudAnchor(anchorId, assetId)` | Remove an attached asset | + | `rvTrackCloudAnchorResolution(...)` | Record resolve analytics manually | + + All calls are handled entirely inside the compiled native binary — no + API keys or endpoint URLs are present in the JS bundle. + +- **ReactVision — Geospatial Anchor Provider + Management API** + + GPS-tagged anchors are available through the ReactVision platform. + 5 new management methods on `arSceneNavigator`: + + | Method | Description | + |--------|-------------| + | `rvListGeospatialAnchors(limit, offset)` | Paginated list | + | `rvGetGeospatialAnchor(anchorId)` | Fetch a single geospatial anchor | + | `rvFindNearbyGeospatialAnchors(lat, lng, radius, limit)` | GPS proximity search | + | `rvUpdateGeospatialAnchor(id, sceneAssetId, sceneId, name)` | Update metadata | + | `rvDeleteGeospatialAnchor(anchorId)` | Permanently delete | + +- **New `ViroProvider` type** + + Canonical union type `"none" | "arcore" | "reactvision"` exported from the + package. Replaces the old `ViroCloudAnchorProvider` and `ViroGeospatialAnchorProvider` + (now deprecated aliases). + +- **ViroARPlaneSelector — tap-position object placement** + + Objects placed as `children` of `ViroARPlaneSelector` now appear at the + exact point the user tapped, not at the plane's geometric centre. + + The world-space tap position from `onClickState` is converted to the + plane's local coordinate space using the full inverse rotation matrix + (R = Rx·Ry·Rz, X-Y-Z Euler order as used by `VROMatrix4f`) and clamped + to the plane surface (Y = 0 in local space). Children retain their own + Y offset (`position={[0, 0.5, 0]}` etc.) relative to the tap point. + +- **ViroARPlaneSelector — `onPlaneSelected` receives tap position** + + ```ts + onPlaneSelected?: (plane: ViroPlaneUpdatedMap, tapPosition?: [number, number, number]) => void; + ``` + + `tapPosition` is the world-space ray–surface intersection point. + +- **ViroARPlaneSelector — `onPlaneRemoved` prop** + + Called when ARKit/ARCore removes a tracked plane. Receives the + `anchorId` string. Selection is automatically cleared if the removed + plane was selected. + +- **ViroARSceneNavigator — `depthEnabled` prop** + + Activates the depth sensor (LiDAR on supported iOS devices, monocular + depth estimator as fallback; ARCore Depth API on Android 1.18+) without + enabling occlusion rendering. Virtual objects are **not** occluded, but + depth data becomes available for: + - `performARHitTest` — returns `DepthPoint` results + - distance measurement use-cases + + When `occlusionMode="depthBased"` is set at the same time, + `occlusionMode` takes precedence and full depth-based occlusion is used + instead. + + ```tsx + + ``` + + | Platform | Requirement | + |---|---| + | iOS | LiDAR device or monocular fallback (all devices) | + | Android | ARCore Depth API — ARCore 1.18+ | + +- **ViroARSceneNavigator — `depthDebugEnabled` prop** + + Debug visualisation of the depth texture over the camera feed. Colours + represent depth values: magenta = no data, blue = near, red = far. + Useful for verifying depth coverage before relying on hit-test results. + + ```tsx + + ``` + + Default: `false`. Both iOS and Android. + +- **ViroARSceneNavigator — `preferMonocularDepth` prop (iOS only)** + + When `true`, forces iOS to use the monocular depth estimator even on + LiDAR-equipped devices. Useful for testing depth behaviour on older + hardware or when LiDAR accuracy is not required and power consumption + is a concern. + + Default: `false` (LiDAR used when available). + +- **ViroARPlaneSelector — `hideOverlayOnSelection` prop** + + Controls whether the plane overlay hides once a plane is selected. + Default `true` — the overlay disappears after selection so only your + `children` content remains visible. Pass `false` to keep the overlay + visible (e.g. to show the plane boundary while the user repositions + content). Unselected planes are always hidden after a selection + regardless of this prop. + +- **ViroARPlaneSelector — `material` prop** + + Pass a `ViroMaterials`-registered material name to customise the plane + overlay surface. Defaults to the built-in translucent blue. + +- **ViroARPlaneSelector — `handleAnchorRemoved` public method** + + New public instance method matching `handleAnchorFound` / + `handleAnchorUpdated`. Removes a plane from the visible set and + clears selection if needed. + +- **ARKit/ARCore plane detection — both orientations enabled by default** + + Previously only horizontal planes were detected unless `anchorDetectionTypes` + was set explicitly. The default is now horizontal + vertical at all layers: + + | Layer | File | + |---|---| + | C++ default | `VROARScene.h` | + | iOS native default | `VRTARScene.mm` | + | JS fallback default | `ViroARScene.tsx` | + +- **Shader modifiers — custom `sampler2D` uniforms** + + Shader modifier code can now declare and receive `uniform sampler2D` inputs. + Previously, sampler declarations in modifiers were silently ignored and the + GPU always read texture unit 0. Now each named sampler is assigned its own + texture unit and bound correctly at draw time. + + ```typescript + ViroMaterials.createMaterials({ + noisyMetal: { + lightingModel: "PBR", + shaderModifiers: { + surface: { + uniforms: "uniform sampler2D noise_tex;", + body: ` + float noise = texture(noise_tex, _surface.diffuse_texcoord * 3.0).r; + _surface.roughness = mix(0.2, 0.9, noise); + _surface.metalness = mix(0.4, 1.0, noise); + ` + } + }, + materialUniforms: [ + { name: "noise_tex", type: "sampler2D", value: require("./textures/noise.png") } + ] + } + }); + ``` + + `ViroShaderUniform.type` now accepts `"sampler2D"` and `value` accepts a + `require()` image reference. + +- **Shader modifiers — runtime texture uniform update** + + `ViroMaterials.updateShaderUniform` now accepts `"sampler2D"` as a type, + allowing any texture bound to a modifier sampler to be swapped at runtime: + + ```typescript + ViroMaterials.updateShaderUniform("colorGraded", "lut_tex", "sampler2D", + isDaytime ? require("./lut_day.png") : require("./lut_night.png")); + ``` + +- **Shader modifiers — custom varyings between vertex and fragment stages** + + A new `varyings` field on shader modifier entry points lets vertex-stage + (Geometry) modifiers pass typed data to fragment-stage (Surface / Fragment) + modifiers. Declare the same name in both stages; the engine injects `out` / + `in` declarations automatically: + + ```typescript + shaderModifiers: { + geometry: { + varyings: ["highp float displacement_amount"], + uniforms: "uniform float time;", + body: ` + float wave = sin(_geometry.position.x * 4.0 + time) * 0.1; + _geometry.position.y += wave; + displacement_amount = abs(wave) / 0.1; + ` + }, + surface: { + varyings: ["highp float displacement_amount"], + body: `_surface.roughness = mix(0.1, 0.9, displacement_amount);` + } + } + ``` + +- **Shader modifiers — scene depth buffer access** + + Fragment modifier entry points can set `requiresSceneDepth: true` to receive + `scene_depth_texture` (sampler2D) and `scene_viewport_size` (vec2) automatically. + Enables soft particles, contact edge glow, depth-based fog, and intersection + effects. On older Adreno/Mali GPUs that cannot sample the depth buffer in-pass, + the engine automatically inserts a blit to a `GL_R32F` color attachment. + + ```typescript + fragment: { + requiresSceneDepth: true, + body: ` + vec2 screenUV = gl_FragCoord.xy / scene_viewport_size; + float sceneDepth = texture(scene_depth_texture, screenUV).r; + float softFactor = clamp(abs(sceneDepth - gl_FragCoord.z) / 0.1, 0.0, 1.0); + _output_color.a *= softFactor; + ` + } + ``` + +- **Shader modifiers — live AR camera texture access** + + Fragment modifier entry points can set `requiresCameraTexture: true` to + sample the live AR camera feed on any geometry. Two uniforms are bound + automatically: `ar_camera_texture` (the camera feed) and `ar_camera_transform` + (a `mat3` correcting for device orientation and aspect ratio). The sampler + type difference between platforms (`samplerExternalOES` on Android, `sampler2D` + on iOS) is handled invisibly — developer GLSL is identical on both platforms. + + ```typescript + surface: { + requiresCameraTexture: true, + body: ` + vec2 cameraUV = (ar_camera_transform * vec3(_surface.diffuse_texcoord, 1.0)).xy; + _surface.diffuse_color = texture(ar_camera_texture, cameraUV); + ` + } + ``` + + Enables magnifying glass, portal, refraction, warp, and camera-feed-on-geometry + effects. + +- **Shader modifiers — deterministic priority ordering** + + `VROShaderModifier` now has a `priority` field (default 0). Multiple modifiers + on the same material are injected in ascending priority order. Engine-internal + modifiers (AR shadow, occlusion) use priority -100; user modifiers default to 0; + debug overlays use 100. Prevents engine modifiers from interfering with + user-defined effects regardless of attachment order. + +- **Updated `ViroShaderModifier` type** + + ```typescript + export type ViroShaderModifier = { + uniforms?: string; + body?: string; + varyings?: string[]; // pass typed data from vertex to fragment stage + requiresSceneDepth?: boolean; // auto-bind scene_depth_texture + scene_viewport_size + requiresCameraTexture?: boolean; // auto-bind ar_camera_texture + ar_camera_transform + }; + + export type ViroShaderUniform = { + name: string; + type: "float" | "vec2" | "vec3" | "vec4" | "mat4" | "sampler2D"; + value: number | number[] | ReturnType; + }; + ``` + +### Fixed + +- **GLB/3D models — washed-out / overexposed colours** (`virocore/ViroRenderer/VROMaterialShaderBinding.cpp`, `standard_fsh.glsl`) + + Models loaded from GLB files (and some OBJ/FBX assets) appeared overexposed or had their + colours washed out. Root cause: `material_emissive_color` was being added to the fragment + shader output for every material, including those with no intentional emission. GLB materials + often carry a non-zero emission value in their PBR data; added on top of the diffuse+specular + result it pushed the final colour toward white. Removed the `material_emissive_color` and + `material_alpha_cutoff` uniforms from the standard shader binding — these were incorrectly + applied to all materials instead of only emissive/masked ones. + +- **Android — physics body crash on scene close** (`virocore/ViroRenderer/capi/Node_JNI.cpp`) + + Closing a scene that contained physics-enabled nodes crashed with a null + pointer dereference at `VRONode::setTransformDelegate+56`. The GL-thread + lambdas queued by `nativeSetTransformDelegate` and + `nativeRemoveTransformDelegate` called `node->setTransformDelegate()` without + first checking whether the `std::weak_ptr` had already expired. + Added an `if (!node) { return; }` guard in both lambdas so that a node + destroyed before the lambda runs is silently skipped instead of crashing. + +- **Android — New Architecture Metro error** (`viro/android/viro_bridge/…/PerfMonitor.java`) + + "You should not use ReactNativeHost directly in the New Architecture" was + thrown during dev-menu initialisation. `PerfMonitor.setView()` called + `getReactNativeHost().getReactInstanceManager().getDevSupportManager()`, + which throws under the New Architecture. Replaced with the New-Arch API: + `getReactHost().getDevSupportManager()`. + +- **iOS — `startVideoRecording` silent failure / `stopVideoRecording` returns `{success: false, errorCode: 0}`** (`virocore/ios/ViroKit/VROViewRecorder.mm`, `VROViewAR.mm`) + + Video recording was completely non-functional after the move to the React + Native New Architecture. Several independent bugs combined to produce a + silent failure with no error callback and an empty URL on stop: + + - `[AVAssetWriter startWriting]` return value was never checked. A failed + writer still set `_isRecording = YES`, causing the stop path to hit the + `kVROViewErrorAlreadyStopped` branch and return `errorCode: 0`. + - The pixel buffer pool was never validated after `startWriting`. A nil pool + produced a null `_videoPixelBuffer` used later without a check. + - `AVAssetWriter` was created before the video dimensions were validated; a + zero-size view (not yet laid out) produced an invalid writer. + - `AVAudioSession` was configured without `mode:AVAudioSessionModeVideoRecording` + and without `[session setActive:YES]`. On iOS 17+ ARKit takes control of + the audio session, silently preventing `AVAudioRecorder` from writing data; + the resulting empty/unplayable audio file then caused `generateFinalVideoFile` + to call `handler(NO)` → `completionHandler(NO, nil, nil, kVROViewErrorUnknown)`. + - `generateFinalVideoFile` hard-failed when the audio file was missing or + unplayable, with no fallback. + + Fixes applied: + - Added dimension guard (`kVROViewErrorInitialization`) before writer creation. + - Added `startWriting` return check with cleanup and `kVROViewErrorInitialization`. + - Added pixel buffer pool nil check with writer cancellation and error callback. + - Added nil check for `AVAudioRecorder` after `initWithURL:settings:error:`. + - Added `-record` return value check with a diagnostic log. + - Set `mode:AVAudioSessionModeVideoRecording` and `[session setActive:YES]` in + `VROViewAR` so the audio session is properly activated before recording starts. + - `generateFinalVideoFile` now falls back to video-only output when the audio + file is missing or unplayable, instead of failing the entire recording. + +- **ViroARPlaneSelector — index-mapping mismatch (root cause of ghost planes)** + + The old implementation pre-allocated 25 `ViroARPlane` slots per alignment + and mapped them by JS array index. The C++ constraint matcher assigns + anchors non-deterministically, so the slot at index `i` did not reliably + hold the plane `detectedPlanes[i]` referred to. The rewrite uses one + `` per confirmed anchor — no mismatch possible. + +- **ViroARPlaneSelector — selected plane disappeared on selection** + + Opacity was computed as `isSelected ? 0 : isVisible ? 1 : 0` — the + selected plane hid itself immediately after tap. Fixed to + `selectedPlaneId === null || isSelected ? 1 : 0`. + +- **ViroARPlaneSelector — children duplicated across all plane slots** + + Children were rendered inside every one of the 50 pre-allocated slots. + Now rendered once, only on the selected plane, wrapped in a `ViroNode` + at the tap position. + +- **ViroARPlaneSelector — `onPlaneDetected` return value ignored** + + Returning `false` from `onPlaneDetected` previously had no effect. + Now correctly prevents the plane from being added to the visible set. + +- **ViroARPlaneSelector — removed planes not cleaned up** + + Disappeared planes were never removed from internal state. The new + `handleAnchorRemoved` deletes the entry from the Map and resets + selection if needed. + +- **VROARPlaneAnchor — `hasSignificantChanges` AND→OR threshold logic** + + The previous implementation required *both* the absolute (>1 cm) *and* + the relative (>5 %) extent thresholds to pass simultaneously. For large + planes (floors, walls) the relative check almost never passed once the + plane was mature, silently dropping most ARKit update notifications. + Fixed to OR: either threshold alone triggers an update. + +- **VROARPlaneAnchor — hard 100 ms update throttle suppressed early detection** + + ARKit sends rapid update bursts in the first seconds of plane detection. + A fixed 100 ms minimum interval discarded most of them. Replaced with + an adaptive throttle: 33 ms (≈30 fps) for the first 20 updates, + 66 ms (≈15 fps) thereafter. + +### Changed + +- **`createGeospatialAnchor`, `createTerrainAnchor`, `createRooftopAnchor` — supported + with `provider="reactvision"`.** + + GPS→AR placement uses Mercator projection + compass heading to compute the relative + AR-frame offset, then creates a native ARKit / ARCore local anchor. No VPS, no ARCore + Geospatial API, and no ARCore pods are required. + + | Method | ReactVision placement | + |---|---| + | `createGeospatialAnchor(lat, lng, alt, quat)` | GPS absolute altitude | + | `createTerrainAnchor(lat, lng, altAboveTerrain, quat)` | `deviceAlt + altAboveTerrain` | + | `createRooftopAnchor(lat, lng, altAboveRooftop, quat)` | `deviceAlt + altAboveRooftop` | + + The returned `anchorId` is a native AR anchor tracked by VIO for the session. + Placement accuracy matches device GPS accuracy (~3–10 m horizontally). + +- **ViroARPlaneSelector — `useActualShape` now defaults to `true`** + + Previously the bounding-rect `ViroQuad` fallback was used whenever + vertices were absent; now the polygon path is always preferred and the + quad is only used as a fallback before ARKit provides boundary vertices. + +### ViroCore Integration + +This release integrates the ReactVision native backend into ViroCore: +- Cloud anchor hosting and resolving via the ReactVision platform (Android + iOS) +- Geospatial anchor CRUD, proximity search, and GPS→AR placement +- `ReactVision` provider wired into the AR session layer on both platforms + +--- + ## v2.52.0 - 08 February 2026 ### Added diff --git a/android/react_viro/react_viro-release.aar b/android/react_viro/react_viro-release.aar index 12121870..5d5b548d 100644 Binary files a/android/react_viro/react_viro-release.aar and b/android/react_viro/react_viro-release.aar differ diff --git a/android/viro_bridge/src/main/java/com/reactvision/cca/RVHttpClient.java b/android/viro_bridge/src/main/java/com/reactvision/cca/RVHttpClient.java new file mode 100644 index 00000000..87d79531 --- /dev/null +++ b/android/viro_bridge/src/main/java/com/reactvision/cca/RVHttpClient.java @@ -0,0 +1,214 @@ +// Copyright © 2026 ReactVision. All rights reserved. +// Proprietary and Confidential +// +// Called from C++ via JNI (NetworkClient_Android.cpp). +// Handles JSON, binary, and multipart HTTP requests using +// HttpURLConnection — no extra dependencies required. + +package com.reactvision.cca; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class RVHttpClient { + + // ----------------------------------------------------------------------- + // JSON / binary request + // + // Returns String[3]: { statusCode, responseBody, errorMessage } + // statusCode = "0" means a connection-level error (not HTTP error). + // ----------------------------------------------------------------------- + public static String[] send( + String method, + String url, + String apiKey, + String contentType, + byte[] body, + int timeoutSec, + String[] headerNames, + String[] headerValues) { + + HttpURLConnection conn = null; + try { + conn = openConnection(url, method, apiKey, timeoutSec); + + if (headerNames != null) { + for (int i = 0; i < headerNames.length; i++) + conn.setRequestProperty(headerNames[i], headerValues[i]); + } + + if (body != null && body.length > 0) { + conn.setDoOutput(true); + if (contentType != null && !contentType.isEmpty()) { + conn.setRequestProperty("Content-Type", contentType); + } + conn.getOutputStream().write(body); + } + + return readResponse(conn); + + } catch (Exception e) { + return errorResult(e); + } finally { + if (conn != null) conn.disconnect(); + } + } + + // ----------------------------------------------------------------------- + // Multipart/form-data upload + // + // Text fields: textNames[i] → textValues[i] + // File fields: fileNames[i], fileData[i], filenames[i], contentTypes[i] + // + // Returns String[3]: { statusCode, responseBody, errorMessage } + // ----------------------------------------------------------------------- + public static String[] sendMultipart( + String url, + String apiKey, + int timeoutSec, + String[] textNames, + String[] textValues, + String[] fileNames, + byte[][] fileData, + String[] filenames, + String[] contentTypes) { + + HttpURLConnection conn = null; + try { + String boundary = "rvboundary" + + UUID.randomUUID().toString().replace("-", ""); + + conn = openConnection(url, "POST", apiKey, timeoutSec); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", + "multipart/form-data; boundary=" + boundary); + + try (DataOutputStream out = + new DataOutputStream(conn.getOutputStream())) { + + // Text fields + if (textNames != null) { + for (int i = 0; i < textNames.length; i++) { + writeTextPart(out, boundary, textNames[i], textValues[i]); + } + } + + // File fields + if (fileNames != null) { + for (int i = 0; i < fileNames.length; i++) { + writeFilePart(out, boundary, + fileNames[i], filenames[i], + contentTypes[i], fileData[i]); + } + } + + out.writeBytes("--" + boundary + "--\r\n"); + } + + return readResponse(conn); + + } catch (Exception e) { + return errorResult(e); + } finally { + if (conn != null) conn.disconnect(); + } + } + + // ----------------------------------------------------------------------- + // Binary download — no auth header (URL is typically pre-signed) + // + // Returns byte[] or null on error. + // ----------------------------------------------------------------------- + public static byte[] downloadBinary(String url, int timeoutSec) { + HttpURLConnection conn = null; + try { + URL u = new URL(url); + conn = (HttpURLConnection) u.openConnection(); + conn.setConnectTimeout(timeoutSec * 1000); + conn.setReadTimeout(timeoutSec * 1000); + + int status = conn.getResponseCode(); + if (status < 200 || status >= 300) return null; + + return readAllBytes(conn.getInputStream()); + + } catch (Exception e) { + return null; + } finally { + if (conn != null) conn.disconnect(); + } + } + + // ----------------------------------------------------------------------- + // Internals + // ----------------------------------------------------------------------- + + private static HttpURLConnection openConnection( + String url, String method, String apiKey, int timeoutSec) + throws IOException { + + HttpURLConnection conn = + (HttpURLConnection) new URL(url).openConnection(); + conn.setRequestMethod(method.toUpperCase()); + conn.setConnectTimeout(timeoutSec * 1000); + conn.setReadTimeout(timeoutSec * 1000); + conn.setRequestProperty("x-api-key", apiKey); + conn.setInstanceFollowRedirects(true); + return conn; + } + + private static String[] readResponse(HttpURLConnection conn) + throws IOException { + + int status = conn.getResponseCode(); + InputStream is = (status >= 200 && status < 300) + ? conn.getInputStream() + : conn.getErrorStream(); + + String body = ""; + if (is != null) { + body = new String(readAllBytes(is), StandardCharsets.UTF_8); + } + return new String[]{ String.valueOf(status), body, "" }; + } + + private static String[] errorResult(Exception e) { + String msg = e.getMessage(); + return new String[]{ "0", "", msg != null ? msg : "Unknown error" }; + } + + private static byte[] readAllBytes(InputStream is) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = is.read(buf)) != -1) baos.write(buf, 0, n); + return baos.toByteArray(); + } + + private static void writeTextPart( + DataOutputStream out, String boundary, + String name, String value) throws IOException { + out.writeBytes("--" + boundary + "\r\n"); + out.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n\r\n"); + out.write(value.getBytes(StandardCharsets.UTF_8)); + out.writeBytes("\r\n"); + } + + private static void writeFilePart( + DataOutputStream out, String boundary, + String fieldName, String filename, + String contentType, byte[] data) throws IOException { + out.writeBytes("--" + boundary + "\r\n"); + out.writeBytes("Content-Disposition: form-data; name=\"" + + fieldName + "\"; filename=\"" + filename + "\"\r\n"); + out.writeBytes("Content-Type: " + contentType + "\r\n\r\n"); + out.write(data); + out.writeBytes("\r\n"); + } +} diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigator.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigator.java index e08be8b1..dfe2188f 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigator.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigator.java @@ -21,6 +21,16 @@ package com.viromedia.bridge.component; +import android.Manifest; +import android.content.pm.PackageManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -54,6 +64,8 @@ public class VRTARSceneNavigator extends VRT3DSceneNavigator { private boolean mNeedsAutoFocusToggle = false; private ARScene.OcclusionMode mOcclusionMode = ARScene.OcclusionMode.DISABLED; private boolean mNeedsOcclusionModeToggle = false; + private boolean mDepthEnabled = false; + private boolean mNeedsDepthEnabledToggle = false; // Pending configuration for features that may be set before session is ready private boolean mSemanticModeEnabled = false; @@ -106,6 +118,12 @@ public void run() { navigator.mNeedsOcclusionModeToggle = false; } + // Apply pending depthEnabled configuration + if (navigator.mNeedsDepthEnabledToggle) { + navigator.applyOcclusionMode(); + navigator.mNeedsDepthEnabledToggle = false; + } + // Apply pending semantic mode configuration if (navigator.mNeedsSemanticModeToggle) { navigator.applySemanticModeEnabled(); @@ -168,9 +186,9 @@ public void addView(View child, int index) { } super.addView(child, index); - // Apply current occlusion mode to newly added ARScenes + // Apply current effective occlusion mode to newly added ARScenes if (child instanceof VRTARScene) { - ((VRTARScene) child).setOcclusionMode(mOcclusionMode); + ((VRTARScene) child).setOcclusionMode(computeEffectiveOcclusionMode()); } } @@ -230,6 +248,9 @@ protected void onDetachedFromWindow() { android.util.Log.i(TAG, " Rotation listener disabled"); } + // Stop GPS/sensor callbacks before disposal to avoid use-after-free in pushLocationToNative + stopRVLocationUpdates(); + // Pause AR session before disposal ViroViewARCore arView = getARView(); if (arView != null) { @@ -322,35 +343,78 @@ public void setOcclusionMode(String mode) { } } + public void setDepthEnabled(boolean enabled) { + mDepthEnabled = enabled; + android.util.Log.i(TAG, "[OCCLUSION] setDepthEnabled: " + enabled + ", mGLInitialized: " + mGLInitialized); + if (mGLInitialized) { + applyOcclusionMode(); + } else { + mNeedsDepthEnabledToggle = true; + } + } + /** - * Apply occlusion mode to all existing ARScenes. + * Compute the effective occlusion mode based on occlusionMode prop and depthEnabled prop. + * Explicit occlusionMode always takes precedence over depthEnabled. + */ + private ARScene.OcclusionMode computeEffectiveOcclusionMode() { + if (mOcclusionMode == ARScene.OcclusionMode.DEPTH_BASED) return ARScene.OcclusionMode.DEPTH_BASED; + if (mOcclusionMode == ARScene.OcclusionMode.PEOPLE_ONLY) return ARScene.OcclusionMode.PEOPLE_ONLY; + if (mDepthEnabled) return ARScene.OcclusionMode.DEPTH_ONLY; + return ARScene.OcclusionMode.DISABLED; + } + + /** + * Apply effective occlusion mode to all existing ARScenes. * Called either immediately when GL is ready, or deferred via onSuccess callback. */ private void applyOcclusionMode() { - android.util.Log.i(TAG, "[OCCLUSION] applyOcclusionMode: applying mode " + mOcclusionMode + " to " + getChildCount() + " children"); + ARScene.OcclusionMode effective = computeEffectiveOcclusionMode(); + android.util.Log.i(TAG, "[OCCLUSION] applyOcclusionMode: applying effective mode " + effective + " to " + getChildCount() + " children"); for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); if (child instanceof VRTARScene) { android.util.Log.i(TAG, "[OCCLUSION] applyOcclusionMode: applying to VRTARScene child " + i); - ((VRTARScene) child).setOcclusionMode(mOcclusionMode); + ((VRTARScene) child).setOcclusionMode(effective); } } } /** - * Get the current occlusion mode. Used when adding new scenes so they + * Get the current effective occlusion mode. Used when adding new scenes so they * inherit the navigator's occlusion setting. */ public ARScene.OcclusionMode getOcclusionMode() { - return mOcclusionMode; + return computeEffectiveOcclusionMode(); } // Cloud Anchor Support private String mCloudAnchorProvider = "none"; + private String mRvApiKey = null; + private String mRvProjectId = null; + // Improvement 5: track whether credentials have been pushed to the native session + // so setReactVisionConfig() is called exactly once per provider activation. + private boolean mRvConfigApplied = false; + private boolean mGeoProviderApplied = false; private static final String TAG = "ViroAR"; + // ReactVision GPS pose support + private LocationManager mLocationManager = null; + private LocationListener mLocationListener = null; + private SensorManager mSensorManager = null; + private SensorEventListener mSensorListener = null; + private double mLastHeading = 0.0; + private double mLastHeadingAccuracy = 0.0; + private double mLastLat = 0.0; + private double mLastLng = 0.0; + private double mLastAlt = 0.0; + private double mLastHorizAcc = 0.0; + private double mLastVertAcc = 0.0; + public void setCloudAnchorProvider(String provider) { + // Improvement 5: reset so credentials are re-applied on next host/resolve + mRvConfigApplied = false; mCloudAnchorProvider = provider != null ? provider.toLowerCase() : "none"; Log.i(TAG, "Setting cloud anchor provider: " + mCloudAnchorProvider); @@ -375,6 +439,41 @@ public void setCloudAnchorProvider(String provider) { } catch (Exception e) { Log.w(TAG, "Could not check for ARCore API key: " + e.getMessage()); } + } else if ("reactvision".equals(mCloudAnchorProvider)) { + Log.i(TAG, "ReactVision Cloud Anchors provider enabled"); + // libreactvisioncca.so is a dynamic dependency of libviro_renderer.so and is + // loaded transitively by the linker, but Android only calls JNI_OnLoad for + // libraries explicitly loaded via System.loadLibrary. Without this call g_jvm + // stays null and all JNI network calls fail with "JNI unavailable". + try { + System.loadLibrary("reactvisioncca"); + } catch (UnsatisfiedLinkError e) { + Log.w(TAG, "Could not load libreactvisioncca.so: " + e.getMessage()); + } + + // Read ReactVision credentials from AndroidManifest meta-data + try { + android.content.pm.ApplicationInfo ai = getContext().getPackageManager() + .getApplicationInfo(getContext().getPackageName(), android.content.pm.PackageManager.GET_META_DATA); + if (ai.metaData != null) { + mRvApiKey = ai.metaData.getString("com.reactvision.RVApiKey"); + mRvProjectId = ai.metaData.getString("com.reactvision.RVProjectId"); + if (mRvApiKey != null && !mRvApiKey.isEmpty()) { + Log.i(TAG, "ReactVision API key found in AndroidManifest.xml"); + } else { + Log.w(TAG, "WARNING: com.reactvision.RVApiKey not found in AndroidManifest.xml. ReactVision cloud anchors will not work!"); + } + } else { + Log.w(TAG, "WARNING: No meta-data found in AndroidManifest.xml. ReactVision cloud anchors may not work!"); + } + } catch (Exception e) { + Log.w(TAG, "Could not check for ReactVision credentials: " + e.getMessage()); + } + + // Configure the AR scene if it is already available; otherwise the credentials + // are stored in mRvApiKey/mRvProjectId and applied lazily in host/resolve. + ARScene arScene = getCurrentARScene(); + ensureRvConfigApplied(arScene); } else { Log.i(TAG, "Cloud Anchors disabled"); } @@ -398,10 +497,50 @@ private ARScene getCurrentARScene() { return null; } + /** + * Improvement 5: apply ReactVision credentials to the native AR session exactly once + * per provider activation. Subsequent calls to hostCloudAnchor / resolveCloudAnchor + * skip the JNI call because the session already has the credentials. + */ + private void ensureRvConfigApplied(ARScene arScene) { + if (mRvConfigApplied) return; + if (!"reactvision".equals(mCloudAnchorProvider)) return; + if (arScene == null) return; + if (mRvApiKey == null || mRvApiKey.isEmpty()) return; + arScene.setReactVisionConfig(mRvApiKey, mRvProjectId != null ? mRvProjectId : ""); + mRvConfigApplied = true; + } + + private void ensureGeoProviderApplied(ARScene arScene) { + if (mGeoProviderApplied) return; + if (!"reactvision".equals(mGeospatialAnchorProvider)) return; + if (arScene == null) return; + if (mRvApiKey == null || mRvApiKey.isEmpty()) return; + // setReactVisionConfig queues credentials on renderer thread first; + // setGeospatialAnchorProvider queues provider init after it (FIFO). + arScene.setReactVisionConfig(mRvApiKey, mRvProjectId != null ? mRvProjectId : ""); + arScene.setGeospatialAnchorProvider("reactvision"); + mGeoProviderApplied = true; + } + + /** + * Improvement 2: split the "message|StateString" encoding produced by the C++ layer + * (encodeError in VROCloudAnchorProviderReactVision.cpp) into a [message, state] pair. + * Falls back to [raw, "ErrorInternal"] if the separator is absent (e.g. ARCore errors). + */ + private static String[] splitErrorState(String raw) { + if (raw == null) return new String[]{"Unknown error", "ErrorInternal"}; + int sep = raw.lastIndexOf('|'); + if (sep >= 0) { + return new String[]{raw.substring(0, sep), raw.substring(sep + 1)}; + } + return new String[]{raw, "ErrorInternal"}; + } + public void hostCloudAnchor(String anchorId, int ttlDays, ARSceneNavigatorModule.CloudAnchorCallback callback) { - if (!"arcore".equals(mCloudAnchorProvider)) { - callback.onFailure("Cloud anchor provider not configured. Set cloudAnchorProvider='arcore' to enable.", + if (!"arcore".equals(mCloudAnchorProvider) && !"reactvision".equals(mCloudAnchorProvider)) { + callback.onFailure("Cloud anchor provider not configured. Set cloudAnchorProvider='arcore' or 'reactvision' to enable.", "ErrorInternal"); return; } @@ -412,26 +551,38 @@ public void hostCloudAnchor(String anchorId, int ttlDays, return; } - // Host the anchor using ARCore's cloud anchor API + // Improvement 5: apply credentials once per provider activation + ensureRvConfigApplied(arScene); + + // Host the anchor via the configured cloud anchor provider // The native layer handles anchor lookup by ID arScene.hostCloudAnchorById(anchorId, ttlDays, new ARScene.CloudAnchorHostListener() { @Override public void onSuccess(ARAnchor cloudAnchor, ARNode arNode) { - // Get the cloud anchor ID from the returned anchor - callback.onSuccess(cloudAnchor.getCloudAnchorId()); + // RVCA sets anchor.setId(cloudId) alongside setCloudAnchorId(cloudId). + // On Android, getCloudAnchorId() can be null due to VROARAnchorARCore + // field shadowing; fall back to getAnchorId() which is set to cloudId + // via the non-shadowed VROARAnchor::_id field. + String cloudId = cloudAnchor.getCloudAnchorId(); + if (cloudId == null || cloudId.isEmpty()) { + cloudId = cloudAnchor.getAnchorId(); + } + callback.onSuccess(cloudId); } @Override public void onFailure(String error) { - callback.onFailure(error, "ErrorInternal"); + // Improvement 2: split "message|StateString" encoded by C++ layer + String[] parts = splitErrorState(error); + callback.onFailure(parts[0], parts[1]); } }); } public void resolveCloudAnchor(String cloudAnchorId, ARSceneNavigatorModule.CloudAnchorResolveCallback callback) { - if (!"arcore".equals(mCloudAnchorProvider)) { - callback.onFailure("Cloud anchor provider not configured. Set cloudAnchorProvider='arcore' to enable.", + if (!"arcore".equals(mCloudAnchorProvider) && !"reactvision".equals(mCloudAnchorProvider)) { + callback.onFailure("Cloud anchor provider not configured. Set cloudAnchorProvider='arcore' or 'reactvision' to enable.", "ErrorInternal"); return; } @@ -442,18 +593,22 @@ public void resolveCloudAnchor(String cloudAnchorId, return; } - // Resolve the cloud anchor + // Improvement 5: apply credentials once per provider activation + ensureRvConfigApplied(arScene); + + // Resolve the cloud anchor via the configured provider arScene.resolveCloudAnchor(cloudAnchorId, new ARScene.CloudAnchorResolveListener() { @Override public void onSuccess(ARAnchor anchor, ARNode arNode) { - // Convert anchor to WritableMap using ARUtils WritableMap anchorData = ARUtils.mapFromARAnchor(anchor); callback.onSuccess(anchorData); } @Override public void onFailure(String error) { - callback.onFailure(error, "ErrorInternal"); + // Improvement 2: split "message|StateString" encoded by C++ layer + String[] parts = splitErrorState(error); + callback.onFailure(parts[0], parts[1]); } }); } @@ -470,12 +625,14 @@ public void cancelCloudAnchorOperations() { private String mGeospatialAnchorProvider = "none"; public void setGeospatialAnchorProvider(String provider) { + mGeoProviderApplied = false; mGeospatialAnchorProvider = provider != null ? provider.toLowerCase() : "none"; Log.i(TAG, "Setting geospatial anchor provider: " + mGeospatialAnchorProvider); if ("arcore".equals(mGeospatialAnchorProvider)) { Log.i(TAG, "ARCore Geospatial provider enabled"); + stopRVLocationUpdates(); // Check if API key is configured in AndroidManifest try { @@ -494,8 +651,43 @@ public void setGeospatialAnchorProvider(String provider) { } catch (Exception e) { Log.w(TAG, "Could not check for ARCore API key: " + e.getMessage()); } + } else if ("reactvision".equals(mGeospatialAnchorProvider)) { + Log.i(TAG, "ReactVision Geospatial provider enabled"); + + // Read ReactVision credentials from AndroidManifest meta-data + try { + android.content.pm.ApplicationInfo ai = getContext().getPackageManager() + .getApplicationInfo(getContext().getPackageName(), android.content.pm.PackageManager.GET_META_DATA); + if (ai.metaData != null) { + String rvApiKey = ai.metaData.getString("com.reactvision.RVApiKey"); + String rvProjectId = ai.metaData.getString("com.reactvision.RVProjectId"); + if (rvApiKey != null && !rvApiKey.isEmpty()) { + Log.i(TAG, "ReactVision API key found in AndroidManifest.xml"); + // Push credentials then activate the geospatial provider. + // Both calls dispatch to the renderer thread in FIFO order, so + // setGeospatialAnchorProvider always runs after setReactVisionConfig. + ARScene arScene = getCurrentARScene(); + if (arScene != null) { + arScene.setReactVisionConfig(rvApiKey, + rvProjectId != null ? rvProjectId : ""); + arScene.setGeospatialAnchorProvider("reactvision"); + } else { + // Store for lazy application once the scene becomes available. + mRvApiKey = rvApiKey; + mRvProjectId = rvProjectId != null ? rvProjectId : ""; + } + } else { + Log.w(TAG, "WARNING: com.reactvision.RVApiKey not found in AndroidManifest.xml. ReactVision Geospatial will not work!"); + } + } + } catch (Exception e) { + Log.w(TAG, "Could not check for ReactVision credentials: " + e.getMessage()); + } + // Start GPS + compass updates for getCameraGeospatialPose() + startRVLocationUpdates(); } else { Log.i(TAG, "Geospatial provider disabled"); + stopRVLocationUpdates(); } } @@ -529,6 +721,100 @@ private void applyGeospatialModeEnabled() { Log.i(TAG, "Geospatial mode applied: " + (mGeospatialModeEnabled ? "enabled" : "disabled")); } + private void startRVLocationUpdates() { + if (mLocationManager != null) return; // already started + try { + android.content.Context ctx = getContext(); + mLocationManager = (LocationManager) ctx.getSystemService(android.content.Context.LOCATION_SERVICE); + if (mLocationManager == null) return; + + mLocationListener = new LocationListener() { + @Override + public void onLocationChanged(Location location) { + mLastLat = location.getLatitude(); + mLastLng = location.getLongitude(); + mLastAlt = location.getAltitude(); + mLastHorizAcc = location.getAccuracy(); + mLastVertAcc = location.hasVerticalAccuracy() + ? location.getVerticalAccuracyMeters() : mLastHorizAcc; + pushLocationToNative(); + } + @Override public void onStatusChanged(String p, int s, Bundle e) {} + @Override public void onProviderEnabled(String p) {} + @Override public void onProviderDisabled(String p) {} + }; + + boolean hasFine = ctx.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) + == PackageManager.PERMISSION_GRANTED; + boolean hasCoarse = ctx.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + == PackageManager.PERMISSION_GRANTED; + if (hasFine) { + mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, + 1000L, 0f, mLocationListener, Looper.getMainLooper()); + } else if (hasCoarse) { + mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, + 1000L, 0f, mLocationListener, Looper.getMainLooper()); + } else { + Log.w(TAG, "No location permission — ReactVision GPS pose unavailable"); + mLocationManager = null; + mLocationListener = null; + return; + } + + // Heading from rotation vector sensor (fuses gyro + compass) + mSensorManager = (SensorManager) ctx.getSystemService(android.content.Context.SENSOR_SERVICE); + if (mSensorManager != null) { + Sensor rotSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); + if (rotSensor != null) { + mSensorListener = new SensorEventListener() { + private final float[] rotMatrix = new float[9]; + private final float[] orientation = new float[3]; + @Override + public void onSensorChanged(SensorEvent event) { + SensorManager.getRotationMatrixFromVector(rotMatrix, event.values); + SensorManager.getOrientation(rotMatrix, orientation); + double azimuthRad = orientation[0]; // radians, North=0, clockwise + double heading = Math.toDegrees(azimuthRad); + if (heading < 0) heading += 360.0; + mLastHeading = heading; + // Accuracy from sensor accuracy level (approximate degrees) + mLastHeadingAccuracy = event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_HIGH ? 5.0 + : event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM ? 15.0 : 45.0; + pushLocationToNative(); + } + @Override public void onAccuracyChanged(Sensor s, int a) {} + }; + mSensorManager.registerListener(mSensorListener, rotSensor, + SensorManager.SENSOR_DELAY_UI, new Handler(Looper.getMainLooper())); + } + } + } catch (Exception e) { + Log.w(TAG, "Failed to start location updates: " + e.getMessage()); + } + } + + private void stopRVLocationUpdates() { + if (mLocationManager != null && mLocationListener != null) { + try { mLocationManager.removeUpdates(mLocationListener); } catch (Exception ignored) {} + } + if (mSensorManager != null && mSensorListener != null) { + mSensorManager.unregisterListener(mSensorListener); + } + mLocationManager = null; + mLocationListener = null; + mSensorManager = null; + mSensorListener = null; + } + + private void pushLocationToNative() { + ARScene arScene = getCurrentARScene(); + if (arScene != null) { + arScene.setLastKnownLocation(mLastLat, mLastLng, mLastAlt, + mLastHorizAcc, mLastVertAcc, + mLastHeading, mLastHeadingAccuracy); + } + } + public String getEarthTrackingState() { ARScene arScene = getCurrentARScene(); if (arScene == null) { @@ -547,8 +833,8 @@ public String getEarthTrackingState() { } public void getCameraGeospatialPose(ARSceneNavigatorModule.GeospatialPoseCallback callback) { - if (!"arcore".equals(mGeospatialAnchorProvider)) { - callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider='arcore' to enable."); + if ("none".equals(mGeospatialAnchorProvider)) { + callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider to enable."); return; } @@ -558,6 +844,7 @@ public void getCameraGeospatialPose(ARSceneNavigatorModule.GeospatialPoseCallbac return; } + ensureGeoProviderApplied(arScene); arScene.getCameraGeospatialPose(new ARScene.GeospatialPoseListener() { @Override public void onSuccess(ARScene.GeospatialPose pose) { @@ -573,7 +860,7 @@ public void onFailure(String error) { public void checkVPSAvailability(double latitude, double longitude, ARSceneNavigatorModule.VPSAvailabilityCallback callback) { - if (!"arcore".equals(mGeospatialAnchorProvider)) { + if ("none".equals(mGeospatialAnchorProvider)) { callback.onResult("Unknown"); return; } @@ -605,8 +892,8 @@ public void onResult(ARScene.VPSAvailability availability) { public void createGeospatialAnchor(double latitude, double longitude, double altitude, float[] quaternion, ARSceneNavigatorModule.GeospatialAnchorCallback callback) { - if (!"arcore".equals(mGeospatialAnchorProvider)) { - callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider='arcore' to enable."); + if ("none".equals(mGeospatialAnchorProvider)) { + callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider prop to enable."); return; } @@ -616,6 +903,7 @@ public void createGeospatialAnchor(double latitude, double longitude, double alt return; } + ensureGeoProviderApplied(arScene); arScene.createGeospatialAnchor(latitude, longitude, altitude, quaternion, new ARScene.GeospatialAnchorListener() { @Override @@ -630,11 +918,50 @@ public void onFailure(String error) { }); } + public void hostGeospatialAnchor(double latitude, double longitude, double altitude, + String altitudeMode, + ARSceneNavigatorModule.HostGeospatialAnchorCallback callback) { + if (!"reactvision".equals(mGeospatialAnchorProvider)) { + callback.onFailure("hostGeospatialAnchor requires the ReactVision geospatial provider."); + return; + } + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + callback.onFailure("AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.hostGeospatialAnchor(latitude, longitude, altitude, altitudeMode, + new ARScene.HostGeospatialAnchorListener() { + @Override public void onSuccess(String platformUuid) { callback.onSuccess(platformUuid); } + @Override public void onFailure(String error) { callback.onFailure(error); } + }); + } + + public void resolveGeospatialAnchor(String platformUuid, float[] quaternion, + ARSceneNavigatorModule.GeospatialAnchorCallback callback) { + if (!"reactvision".equals(mGeospatialAnchorProvider)) { + callback.onFailure("resolveGeospatialAnchor requires the ReactVision geospatial provider."); + return; + } + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + callback.onFailure("AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.resolveGeospatialAnchor(platformUuid, quaternion, + new ARScene.GeospatialAnchorListener() { + @Override public void onSuccess(ARScene.GeospatialAnchor anchor) { callback.onSuccess(anchor); } + @Override public void onFailure(String error) { callback.onFailure(error); } + }); + } + public void createTerrainAnchor(double latitude, double longitude, double altitudeAboveTerrain, float[] quaternion, ARSceneNavigatorModule.GeospatialAnchorCallback callback) { - if (!"arcore".equals(mGeospatialAnchorProvider)) { - callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider='arcore' to enable."); + if ("none".equals(mGeospatialAnchorProvider)) { + callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider prop to enable."); return; } @@ -661,8 +988,8 @@ public void onFailure(String error) { public void createRooftopAnchor(double latitude, double longitude, double altitudeAboveRooftop, float[] quaternion, ARSceneNavigatorModule.GeospatialAnchorCallback callback) { - if (!"arcore".equals(mGeospatialAnchorProvider)) { - callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider='arcore' to enable."); + if ("none".equals(mGeospatialAnchorProvider)) { + callback.onFailure("Geospatial provider not configured. Set geospatialAnchorProvider prop to enable."); return; } @@ -694,6 +1021,133 @@ public void removeGeospatialAnchor(String anchorId) { arScene.removeGeospatialAnchor(anchorId); } + public void rvGetGeospatialAnchor(String anchorId, ARScene.RvGeospatialCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + if (callback != null) callback.onResult(false, "", "AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.rvGetGeospatialAnchor(anchorId, callback); + } + + public void rvFindNearbyGeospatialAnchors(double lat, double lng, double radius, int limit, + ARScene.RvGeospatialCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + if (callback != null) callback.onResult(false, "", "AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.rvFindNearbyGeospatialAnchors(lat, lng, radius, limit, callback); + } + + public void rvUpdateGeospatialAnchor(String anchorId, String sceneAssetId, String sceneId, + String name, String userAssetId, + ARScene.RvGeospatialCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + if (callback != null) callback.onResult(false, "", "AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.rvUpdateGeospatialAnchor(anchorId, sceneAssetId, sceneId, name, userAssetId, callback); + } + + public void rvUploadAsset(String filePath, String assetType, String fileName, + String appUserId, ARScene.RvUploadAssetCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + if (callback != null) callback.onResult(false, "", "", "AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.rvUploadAsset(filePath, assetType, fileName, appUserId, callback); + } + + public void rvDeleteGeospatialAnchor(String anchorId, ARScene.RvGeospatialCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { + if (callback != null) callback.onResult(false, "", "AR scene not available"); + return; + } + ensureGeoProviderApplied(arScene); + arScene.rvDeleteGeospatialAnchor(anchorId, callback); + } + + public void rvListGeospatialAnchors(int limit, int offset, ARScene.RvGeospatialCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureGeoProviderApplied(arScene); + arScene.rvListGeospatialAnchors(limit, offset, callback); + } + + // Cloud anchor management + public void rvGetCloudAnchor(String anchorId, ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvGetCloudAnchor(anchorId, callback); + } + + public void rvListCloudAnchors(int limit, int offset, ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvListCloudAnchors(limit, offset, callback); + } + + public void rvUpdateCloudAnchor(String anchorId, String name, String description, + boolean isPublic, ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvUpdateCloudAnchor(anchorId, name, description, isPublic, callback); + } + + public void rvDeleteCloudAnchor(String anchorId, ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvDeleteCloudAnchor(anchorId, callback); + } + + public void rvFindNearbyCloudAnchors(double lat, double lng, double radius, int limit, + ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvFindNearbyCloudAnchors(lat, lng, radius, limit, callback); + } + + public void rvAttachAssetToCloudAnchor(String anchorId, String fileUrl, long fileSize, + String name, String assetType, String externalUserId, + ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvAttachAssetToCloudAnchor(anchorId, fileUrl, fileSize, name, assetType, externalUserId, callback); + } + + public void rvRemoveAssetFromCloudAnchor(String anchorId, String assetId, + ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvRemoveAssetFromCloudAnchor(anchorId, assetId, callback); + } + + public void rvTrackCloudAnchorResolution(String anchorId, boolean success, double confidence, + int matchCount, int inlierCount, int processingTimeMs, + String platform, String externalUserId, + ARScene.RvCloudAnchorCallback callback) { + ARScene arScene = getCurrentARScene(); + if (arScene == null) { if (callback != null) callback.onResult(false, "", "AR scene not available"); return; } + ensureRvConfigApplied(arScene); + arScene.rvTrackCloudAnchorResolution(anchorId, success, confidence, matchCount, inlierCount, + processingTimeMs, platform, externalUserId, callback); + } + // ======================================================================== // World Mesh API Support // ======================================================================== diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigatorManager.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigatorManager.java index a1c9303c..3f695ac1 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigatorManager.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/VRTARSceneNavigatorManager.java @@ -97,6 +97,11 @@ public void setOcclusionMode(VRTARSceneNavigator navigator, String mode) { navigator.setOcclusionMode(mode); } + @ReactProp(name = "depthEnabled", defaultBoolean = false) + public void setDepthEnabled(VRTARSceneNavigator navigator, boolean enabled) { + navigator.setDepthEnabled(enabled); + } + @ReactProp(name = "cloudAnchorProvider") public void setCloudAnchorProvider(VRTARSceneNavigator navigator, String provider) { navigator.setCloudAnchorProvider(provider); diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/node/VRTNode.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/node/VRTNode.java index 920e7c22..d41c2ea1 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/component/node/VRTNode.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/component/node/VRTNode.java @@ -407,8 +407,17 @@ public void onTearDown() { mEventDelegateJni = null; } - // Clean up materials + // Clean up materials — registry must be cleaned BEFORE clearing mMaterials if (mMaterials != null) { + for (Material mat : mMaterials) { + String matName = mat.getName(); + if (matName != null) { + java.util.Set> nodes = sMaterialUsageRegistry.get(matName); + if (nodes != null) { + nodes.removeIf(ref -> ref.get() == this || ref.get() == null); + } + } + } mMaterials.clear(); mMaterials = null; } @@ -430,19 +439,6 @@ public void onTearDown() { mChildNodeOriginalMaterials = null; } - // Clean up material usage registry - if (mMaterials != null) { - for (Material mat : mMaterials) { - String matName = mat.getName(); - if (matName != null) { - java.util.Set> nodes = sMaterialUsageRegistry.get(matName); - if (nodes != null) { - nodes.removeIf(ref -> ref.get() == this); - } - } - } - } - // Clean up node if (mNodeJni != null) { mNodeJni.dispose(); diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/ARSceneNavigatorModule.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/ARSceneNavigatorModule.java index 024b5048..5b20cc02 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/ARSceneNavigatorModule.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/ARSceneNavigatorModule.java @@ -64,6 +64,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import org.json.JSONArray; +import org.json.JSONObject; @ReactModule(name = "VRTARSceneNavigatorModule") public class ARSceneNavigatorModule extends ReactContextBaseJavaModule { @@ -587,6 +589,11 @@ public interface GeospatialAnchorCallback { void onFailure(String error); } + public interface HostGeospatialAnchorCallback { + void onSuccess(String platformUuid); + void onFailure(String error); + } + // ======================================================================== // Debugging & Validation Methods // ======================================================================== @@ -1012,6 +1019,110 @@ public void onFailure(String error) { }); } + @ReactMethod + public void hostGeospatialAnchor(final int sceneNavTag, final double latitude, + final double longitude, final double altitude, + final String altitudeMode, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", "UIManager not available"); + promise.resolve(result); + return; + } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", "Invalid view type"); + promise.resolve(result); + return; + } + VRTARSceneNavigator sceneNavigator = (VRTARSceneNavigator) view; + sceneNavigator.hostGeospatialAnchor(latitude, longitude, altitude, altitudeMode, + new HostGeospatialAnchorCallback() { + @Override + public void onSuccess(String platformUuid) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", true); + result.putString("anchorId", platformUuid); + promise.resolve(result); + } + @Override + public void onFailure(String error) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", error); + promise.resolve(result); + } + }); + } catch (Exception e) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", e.getMessage()); + promise.resolve(result); + } + } + }); + } + + @ReactMethod + public void resolveGeospatialAnchor(final int sceneNavTag, final String platformUuid, + final Dynamic quaternion, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", "UIManager not available"); + promise.resolve(result); + return; + } + final float[] quat = parseQuaternion(quaternion); + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", "Invalid view type"); + promise.resolve(result); + return; + } + VRTARSceneNavigator sceneNavigator = (VRTARSceneNavigator) view; + sceneNavigator.resolveGeospatialAnchor(platformUuid, quat, + new GeospatialAnchorCallback() { + @Override + public void onSuccess(com.viro.core.ARScene.GeospatialAnchor anchor) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", true); + result.putMap("anchor", mapFromGeospatialAnchor(anchor)); + promise.resolve(result); + } + @Override + public void onFailure(String error) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", error); + promise.resolve(result); + } + }); + } catch (Exception e) { + WritableMap result = Arguments.createMap(); + result.putBoolean("success", false); + result.putString("error", e.getMessage()); + promise.resolve(result); + } + } + }); + } + @ReactMethod public void createTerrainAnchor(final int sceneNavTag, final double latitude, final double longitude, final double altitudeAboveTerrain, @@ -1149,6 +1260,425 @@ public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewRe }); } + // ======================================================================== + // ReactVision Geospatial CRUD API Methods + // ======================================================================== + + /** Convert a JSON object string into a WritableMap for React. */ + private WritableMap rvJsonObjectToMap(String json) { + WritableMap map = Arguments.createMap(); + if (json == null || json.isEmpty()) return map; + try { + JSONObject obj = new JSONObject(json); + java.util.Iterator keys = obj.keys(); + while (keys.hasNext()) { + String k = keys.next(); + Object v = obj.get(k); + if (v instanceof Boolean) map.putBoolean(k, (Boolean) v); + else if (v instanceof Integer) map.putInt(k, (Integer) v); + else if (v instanceof Double) map.putDouble(k, (Double) v); + else if (v instanceof JSONObject) map.putMap(k, rvJsonObjectToMap(v.toString())); + else map.putString(k, v.toString()); + } + } catch (Exception e) { + map.putString("parseError", e.getMessage()); + } + return map; + } + + /** Convert a JSON array string of objects into a WritableArray for React. */ + private WritableArray rvJsonArrayToArray(String json) { + WritableArray arr = Arguments.createArray(); + if (json == null || json.isEmpty()) return arr; + try { + JSONArray jArr = new JSONArray(json); + for (int i = 0; i < jArr.length(); i++) { + arr.pushMap(rvJsonObjectToMap(jArr.getJSONObject(i).toString())); + } + } catch (Exception e) { + // Return empty array on parse error + } + return arr; + } + + @ReactMethod + public void rvGetGeospatialAnchor(final int sceneNavTag, final String anchorId, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "UIManager not available"); + promise.resolve(r); return; + } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "Invalid view type"); + promise.resolve(r); return; + } + ((VRTARSceneNavigator) view).rvGetGeospatialAnchor(anchorId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (success) r.putMap("anchor", rvJsonObjectToMap(jsonData)); + else r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", e.getMessage()); + promise.resolve(r); + } + } + }); + } + + @ReactMethod + public void rvFindNearbyGeospatialAnchors(final int sceneNavTag, + final double latitude, final double longitude, + final double radius, final int limit, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "UIManager not available"); + promise.resolve(r); return; + } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "Invalid view type"); + promise.resolve(r); return; + } + ((VRTARSceneNavigator) view).rvFindNearbyGeospatialAnchors( + latitude, longitude, radius, limit, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + r.putArray("anchors", rvJsonArrayToArray(jsonData)); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", e.getMessage()); + promise.resolve(r); + } + } + }); + } + + @ReactMethod + public void rvUpdateGeospatialAnchor(final int sceneNavTag, final String anchorId, + final String sceneAssetId, final String sceneId, + final String name, final String userAssetId, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "UIManager not available"); + promise.resolve(r); return; + } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "Invalid view type"); + promise.resolve(r); return; + } + ((VRTARSceneNavigator) view).rvUpdateGeospatialAnchor( + anchorId, sceneAssetId, sceneId, name, userAssetId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (success) r.putMap("anchor", rvJsonObjectToMap(jsonData)); + else r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", e.getMessage()); + promise.resolve(r); + } + } + }); + } + + @ReactMethod + public void rvUploadAsset(final int sceneNavTag, final String filePath, + final String assetType, final String fileName, + final String appUserId, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvUploadAsset(filePath, assetType, fileName, appUserId, + (success, userAssetId, fileUrl, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (success) { + r.putString("userAssetId", userAssetId); + r.putString("fileUrl", fileUrl); + } else { + r.putString("error", error); + } + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvDeleteGeospatialAnchor(final int sceneNavTag, final String anchorId, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "UIManager not available"); + promise.resolve(r); return; + } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override + public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", "Invalid view type"); + promise.resolve(r); return; + } + ((VRTARSceneNavigator) view).rvDeleteGeospatialAnchor(anchorId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", false); r.putString("error", e.getMessage()); + promise.resolve(r); + } + } + }); + } + + @ReactMethod + public void rvListGeospatialAnchors(final int sceneNavTag, final int limit, final int offset, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvListGeospatialAnchors(limit, offset, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + r.putArray("anchors", rvJsonArrayToArray(jsonData)); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + // ── Cloud anchor management ─────────────────────────────────────────────── + + @ReactMethod + public void rvGetCloudAnchor(final int sceneNavTag, final String anchorId, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvGetCloudAnchor(anchorId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (success) r.putMap("anchor", rvJsonObjectToMap(jsonData)); + else r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvListCloudAnchors(final int sceneNavTag, final int limit, final int offset, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvListCloudAnchors(limit, offset, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + r.putArray("anchors", rvJsonArrayToArray(jsonData)); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvUpdateCloudAnchor(final int sceneNavTag, final String anchorId, + final String name, final String description, + final boolean isPublic, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvUpdateCloudAnchor(anchorId, name, description, isPublic, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (success) r.putMap("anchor", rvJsonObjectToMap(jsonData)); + else r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvDeleteCloudAnchor(final int sceneNavTag, final String anchorId, + final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvDeleteCloudAnchor(anchorId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvFindNearbyCloudAnchors(final int sceneNavTag, final double latitude, + final double longitude, final double radius, + final int limit, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvFindNearbyCloudAnchors(latitude, longitude, radius, limit, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + r.putArray("anchors", rvJsonArrayToArray(jsonData)); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvAttachAssetToCloudAnchor(final int sceneNavTag, final String anchorId, + final String fileUrl, final double fileSize, + final String name, final String assetType, + final String externalUserId, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvAttachAssetToCloudAnchor(anchorId, fileUrl, (long)fileSize, + name, assetType, externalUserId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvRemoveAssetFromCloudAnchor(final int sceneNavTag, final String anchorId, + final String assetId, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvRemoveAssetFromCloudAnchor(anchorId, assetId, (success, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", success); + if (!success) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + + @ReactMethod + public void rvTrackCloudAnchorResolution(final int sceneNavTag, final String anchorId, + final boolean success, final double confidence, + final int matchCount, final int inlierCount, + final int processingTimeMs, final String platform, + final String externalUserId, final Promise promise) { + UIManager uiManager = UIManagerHelper.getUIManager(getReactApplicationContext(), sceneNavTag); + if (uiManager == null) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "UIManager not available"); promise.resolve(r); return; } + ((FabricUIManager) uiManager).addUIBlock(new com.facebook.react.fabric.interop.UIBlock() { + @Override public void execute(com.facebook.react.fabric.interop.UIBlockViewResolver viewResolver) { + try { + View view = viewResolver.resolveView(sceneNavTag); + if (!(view instanceof VRTARSceneNavigator)) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", "Invalid view type"); promise.resolve(r); return; } + ((VRTARSceneNavigator) view).rvTrackCloudAnchorResolution(anchorId, success, confidence, + matchCount, inlierCount, processingTimeMs, platform, externalUserId, + (ok, jsonData, error) -> { + WritableMap r = Arguments.createMap(); + r.putBoolean("success", ok); + if (!ok) r.putString("error", error); + promise.resolve(r); + }); + } catch (Exception e) { WritableMap r = Arguments.createMap(); r.putBoolean("success", false); r.putString("error", e.getMessage()); promise.resolve(r); } + } + }); + } + // ======================================================================== // Scene Semantics API Methods // ======================================================================== diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/MaterialManager.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/MaterialManager.java index 7cc2c9f9..bad934b5 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/MaterialManager.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/MaterialManager.java @@ -206,6 +206,26 @@ public void updateShaderUniform(String materialName, String uniformName, String material.setShaderUniform(uniformName, matrix); uniformValue = matrix; } + } else if ("sampler2D".equalsIgnoreCase(uniformType)) { + String path = null; + ReadableType valueType = value.getType(); + if (valueType == ReadableType.String) { + path = value.asString(); + } else if (valueType == ReadableType.Map) { + ReadableMap sourceMap = value.asMap(); + if (sourceMap.hasKey("source") && sourceMap.getType("source") == ReadableType.Map) { + path = sourceMap.getMap("source").getString("uri"); + } else if (sourceMap.hasKey("uri")) { + path = sourceMap.getString("uri"); + } + } + if (path != null) { + Texture texture = loadTextureFromPath(path); + if (texture != null) { + material.setShaderUniform(uniformName, texture); + uniformValue = path; + } + } } // Propagate uniform updates to: @@ -470,6 +490,9 @@ private void parseShaderModifiers(Material material, ReadableMap materialMap) { Log.d("VRTMaterialManager", "Processing entry point: " + entryPointName + ", type: " + type); String modifierCode = null; + String[] varyings = null; + boolean requiresSceneDepth = false; + boolean requiresCameraTexture = false; // Handle both string and dictionary formats if (type == ReadableType.String) { @@ -491,6 +514,24 @@ private void parseShaderModifiers(Material material, ReadableMap materialMap) { continue; } Log.d("VRTMaterialManager", "Map format, code length: " + modifierCode.length()); + + // Extract varyings if present + if (modifierDict.hasKey("varyings") && modifierDict.getType("varyings") == ReadableType.Array) { + ReadableArray varyingsArr = modifierDict.getArray("varyings"); + varyings = new String[varyingsArr.size()]; + for (int i = 0; i < varyingsArr.size(); i++) { + varyings[i] = varyingsArr.getString(i); + } + } + + // Extract requiresSceneDepth flag + if (modifierDict.hasKey("requiresSceneDepth")) { + requiresSceneDepth = modifierDict.getBoolean("requiresSceneDepth"); + } + // Extract requiresCameraTexture flag + if (modifierDict.hasKey("requiresCameraTexture")) { + requiresCameraTexture = modifierDict.getBoolean("requiresCameraTexture"); + } } else { Log.e("VRTMaterialManager", "Shader modifier must be string or dictionary with 'body' key"); continue; @@ -498,7 +539,7 @@ private void parseShaderModifiers(Material material, ReadableMap materialMap) { if (modifierCode != null && modifierCode.length() > 0) { Log.d("VRTMaterialManager", "Calling material.addShaderModifier for entry point: " + entryPointName); - material.addShaderModifier(entryPointName, modifierCode); + material.addShaderModifier(entryPointName, modifierCode, varyings, requiresSceneDepth, requiresCameraTexture); Log.d("VRTMaterialManager", "Successfully added shader modifier"); } } @@ -596,7 +637,28 @@ private void setShaderUniform(Material material, String name, String type, Reada material.setShaderUniform(name, matrix); Log.d("VRTMaterialManager", "Set mat4 uniform: " + name); } + } else if ("sampler2D".equalsIgnoreCase(type)) { + String path = parseImagePath(uniformData, "value"); + if (path != null) { + Texture texture = loadTextureFromPath(path); + if (texture != null) { + material.setShaderUniform(name, texture); + Log.d("VRTMaterialManager", "Set sampler2D uniform: " + name); + } + } + } + } + + private Texture loadTextureFromPath(String path) { + Uri uri = Helper.parseUri(path, mContext); + ImageDownloader downloader = new ImageDownloader(mContext); + Bitmap imageBitmap = downloader.getImageSync(uri); + if (imageBitmap == null) { + Log.w("VRTMaterialManager", "loadTextureFromPath: failed to load image at: " + path); + return null; } + Image nativeImage = new Image(imageBitmap, Texture.Format.RGBA8); + return new Texture(nativeImage, true, false); } private Texture parseTexture(Image image, boolean sRGB, boolean mipmap, diff --git a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/PerfMonitor.java b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/PerfMonitor.java index 8b224579..4b1e4a9b 100644 --- a/android/viro_bridge/src/main/java/com/viromedia/bridge/module/PerfMonitor.java +++ b/android/viro_bridge/src/main/java/com/viromedia/bridge/module/PerfMonitor.java @@ -80,7 +80,7 @@ public void setView(ViroView view) { Application application = getCurrentActivity().getApplication(); if (application instanceof ReactApplication) { ReactApplication reactApplication = (ReactApplication) application; - DevSupportManager devSupport = reactApplication.getReactNativeHost().getReactInstanceManager().getDevSupportManager(); + DevSupportManager devSupport = reactApplication.getReactHost().getDevSupportManager(); devSupport.addCustomDevOption("[Viro] Toggle FPS Display", new PerfOptionHandler(this)); mIsInitialized = true; diff --git a/android/viro_renderer/viro_renderer-release.aar b/android/viro_renderer/viro_renderer-release.aar index 1355e366..b2a4ad6e 100644 Binary files a/android/viro_renderer/viro_renderer-release.aar and b/android/viro_renderer/viro_renderer-release.aar differ diff --git a/components/AR/ViroARPlaneSelector.tsx b/components/AR/ViroARPlaneSelector.tsx index f3df4b4e..940aac80 100644 --- a/components/AR/ViroARPlaneSelector.tsx +++ b/components/AR/ViroARPlaneSelector.tsx @@ -11,22 +11,7 @@ "use strict"; -import { - ViroClickStateEvent, - ViroPlaneUpdatedMap, -} from "../Types/ViroEvents"; -import { ViroARPlaneType, ViroNativeRef } from "../Types/ViroUtils"; - -type ViroARPlaneClassification = - | "None" - | "Wall" - | "Floor" - | "Ceiling" - | "Table" - | "Seat" - | "Door" - | "Window" - | "Unknown"; +import { ViroAnchor, ViroPlaneUpdatedMap } from "../Types/ViroEvents"; import * as React from "react"; import { ViroMaterials } from "../Material/ViroMaterials"; import { ViroNode } from "../ViroNode"; @@ -34,281 +19,523 @@ import { ViroQuad } from "../ViroQuad"; import { ViroPolygon } from "../ViroPolygon"; import { ViroARPlane } from "./ViroARPlane"; -var _planePrefix = "ViroARPlaneSelector_Plane_"; - type Props = { + /** + * Minimum height (meters) a detected plane must have before it is shown. + * Planes smaller than this are silently ignored. Default: 0 (no minimum). + */ minHeight?: number; + + /** + * Minimum width (meters) a detected plane must have before it is shown. + * Planes smaller than this are silently ignored. Default: 0 (no minimum). + */ minWidth?: number; + + /** + * Which plane orientations to accept. + * + * | Value | Accepted planes | + * |--------------------|----------------------------------------| + * | `"Horizontal"` | Both HorizontalUpward + HorizontalDownward | + * | `"HorizontalUpward"` | Upward-facing floors/tables only | + * | `"HorizontalDownward"` | Downward-facing ceilings only | + * | `"Vertical"` | Walls and vertical surfaces only | + * | `"Both"` (default) | All orientations | + * + * Default: `"Both"` (accept every plane ARKit/ARCore detects). + */ alignment?: | "Horizontal" | "HorizontalUpward" | "HorizontalDownward" | "Vertical" - | "Both"; // Added "Both" option to detect both horizontal and vertical - onPlaneSelected?: (updateMap: ViroPlaneUpdatedMap) => void; - onPlaneDetected?: (updateMap: ViroPlaneUpdatedMap) => boolean; // Optional validation callback - disableClickSelection?: boolean; // Disable click-based selection, only show planes visually - useActualShape?: boolean; // Use boundary vertices for accurate shape (default: true) + | "Both"; + + /** + * Called once when the user taps a plane and it becomes selected. + * + * @param plane The ViroAnchor of the selected plane. Includes + * `center` (local offset), `width`, `height`, + * `alignment`, `vertices`, and `classification`. + * @param tapPosition World-space position of the tap ray–surface + * intersection. Use this when you need to know + * the exact 3-D point the user touched (e.g. to + * spawn a particle at the contact point). + * + * Note: children are automatically placed at the tap point inside the + * plane's local coordinate space — you do NOT need to read tapPosition + * just to get the object at the right location. + */ + onPlaneSelected?: ( + plane: ViroPlaneUpdatedMap, + tapPosition?: [number, number, number] + ) => void; + + /** + * Called for every plane that passes the alignment and size filters, + * before it is added to the visible set. + * + * Return `false` to reject the plane (e.g. skip planes that are too + * far away, or have the wrong classification). Any other return value + * (including `undefined`) accepts the plane. + */ + onPlaneDetected?: (plane: ViroPlaneUpdatedMap) => boolean; + + /** + * Called when ARKit/ARCore removes a previously detected plane. + * + * If the removed plane was the selected one, the selection is + * automatically cleared and `reset()` does not need to be called. + * + * @param anchorId The ARKit/ARCore anchor ID of the removed plane. + */ + onPlaneRemoved?: (anchorId: string) => void; + + /** + * When `true` (default), the plane overlay for the selected plane is + * hidden after the user makes a selection. Only `children` remain + * visible, giving a clean look without the blue indicator underneath + * the placed content. + * + * Set to `false` to keep the overlay visible on the selected plane + * (e.g. to let the user see the plane boundary while repositioning + * content). + * + * Unselected planes are always hidden once a selection is made, + * regardless of this prop. + * + * Default: `true`. + */ + hideOverlayOnSelection?: boolean; + + /** + * When `true`, tapping a plane overlay does not trigger selection. + * Use this when you want to select planes programmatically (e.g. via + * a hit-test in `ViroARScene.performARHitTestWithPoint`) rather than + * through direct tap. + * + * Default: `false` (tap-to-select is enabled). + */ + disableClickSelection?: boolean; + + /** + * When `true` (default), the plane overlay uses ARKit/ARCore's actual + * polygon boundary vertices (`ViroPolygon`) for a precise fit. + * + * When `false`, or before ARKit has provided polygon vertices, the + * overlay falls back to an axis-aligned bounding rectangle + * (`ViroQuad` sized to `anchor.width × anchor.height`). + * + * Default: `true`. + */ + useActualShape?: boolean; + + /** + * Name of a `ViroMaterials`-registered material to use for the plane + * overlay surface. The material is applied to both the `ViroPolygon` + * (actual-shape) and the `ViroQuad` (bounding-rect) fallback. + * + * Default: `"ViroARPlaneSelector_Translucent"` — a semi-transparent + * blue material registered at the bottom of this file. + */ + material?: string; + + /** + * Content to place on the selected plane at the tap point. + * + * Children are rendered as children of `ViroARPlane` (plane-local + * coordinate space) and are wrapped in a `ViroNode` positioned at the + * tap location on the plane surface (Y = 0 in local space = on the + * surface). + * + * Children should position themselves relative to this origin: + * - `position={[0, 0.5, 0]}` — 50 cm above the tap point (typical + * for a 3-D object resting on a floor or wall). + * - `position={[0, 0, 0]}` — at the exact tap contact point. + * + * Children are NOT rendered until a plane is selected. + */ children?: React.ReactNode; }; type State = { + /** anchorId of the currently selected plane, or null if none selected. */ selectedPlaneId: string | null; - foundARPlanes: Map; + /** + * Tap point in the selected plane's local coordinate space (Y=0 on surface). + * Used to position children at the location the user tapped rather than at + * the plane's geometric center. Cleared by reset(). + */ + tapLocalPosition: [number, number, number] | null; + /** Live map of all accepted planes keyed by their ARKit/ARCore anchor ID. */ + planes: Map; }; /** - * This component wraps the logic required to enable user selection - * of an AR plane. This currently only allows for 1 plane to be selected, - * but could easily be modified to allow for more planes. + * ViroARPlaneSelector + * + * Detects AR planes reported by ARKit (iOS) or ARCore (Android), renders a + * tappable overlay on each one, and places your content on the plane the user + * selects — at the exact point they tapped. + * + * ───────────────────────────────────────────────────────────────────────────── + * REQUIRED WIRING (breaking change from the original component) + * ───────────────────────────────────────────────────────────────────────────── + * The component no longer self-discovers planes. You must forward the + * parent ViroARScene's anchor events to it via a ref: + * + * ```tsx + * const selectorRef = useRef(null); + * + * selectorRef.current?.handleAnchorFound(a)} + * onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)} + * onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)} + * > + * console.log("selected", plane, tapPos)} + * > + * + * + * + * ``` + * + * ───────────────────────────────────────────────────────────────────────────── + * BEHAVIOUR + * ───────────────────────────────────────────────────────────────────────────── + * 1. Plane discovery + * `handleAnchorFound` is called for every new ARKit/ARCore plane anchor. + * Planes are filtered by `alignment`, `minWidth`, `minHeight`, and the + * optional `onPlaneDetected` callback. Accepted planes are stored in an + * internal Map keyed by their ARKit/ARCore anchor ID — no pre-allocated + * slots, no index-mapping artefacts. + * + * 2. Plane visualisation + * Each accepted plane gets one overlay rendered as a child of + * `ViroARPlane anchorId={id}` so it is always locked to the correct + * real-world surface. The overlay is: + * - A `ViroPolygon` matching ARKit's actual boundary vertices when + * `useActualShape` is true (default) and vertices are available. + * - A `ViroQuad` (bounding rectangle) otherwise. + * All overlays are visible until one is selected; then the others hide. + * + * 3. Selection & tap-position placement + * When the user taps an overlay the world-space intersection point is + * converted to the plane's local coordinate space using the full + * inverse rotation (R = Rx·Ry·Rz, X-Y-Z Euler order from VROMatrix4f). + * Children are wrapped in a `ViroNode` positioned at that local point + * (Y=0 = on the surface), so objects appear exactly where you touched — + * not at the plane's geometric centre. + * + * 4. Plane removal + * `handleAnchorRemoved` removes the plane from the Map. If the removed + * plane was the selected one the selection is automatically cleared. + * + * 5. Resetting + * Call `selectorRef.current.reset()` to deselect the current plane and + * re-show all overlays so the user can pick again. + * + * ───────────────────────────────────────────────────────────────────────────── + * COORDINATE SYSTEM NOTE + * ───────────────────────────────────────────────────────────────────────────── + * Children are in the selected ViroARPlane's local space: + * - Y axis = plane normal (perpendicular to surface, pointing "up" for + * floors and "outward" for walls). + * - XZ plane = the detected surface. + * - Origin = ARKit/ARCore anchor transform origin (near the plane + * geometric centre but not necessarily identical to it). + * + * Typical child positioning: + * `position={[0, 0.5, 0]}` — 50 cm above / in front of the tap point. + * `position={[0, 0, 0]}` — exactly at the tap contact point. */ export class ViroARPlaneSelector extends React.Component { - _component: ViroNativeRef = null; state: State = { selectedPlaneId: null, - foundARPlanes: new Map(), + tapLocalPosition: null, + planes: new Map(), }; - render() { - // Uncomment this line to check for misnamed props - //checkMisnamedProps("ViroARPlaneSelector", this.props); + // --------------------------------------------------------------------------- + // Public API — forward ViroARScene anchor events to these via ref + // --------------------------------------------------------------------------- - return {this._getARPlanes()}; - } + /** + * Forward `ViroARScene.onAnchorFound` here. + * + * Filters by type ("plane"), alignment, size, and `onPlaneDetected`. + * Accepted planes are added to the visible overlay set. + * + * Usage: + * `onAnchorFound={(a) => selectorRef.current?.handleAnchorFound(a)}` + */ + handleAnchorFound = (anchor: ViroAnchor): void => { + if (anchor.type !== "plane") return; + if (!this._passesAlignmentFilter(anchor)) return; - _getARPlanes() { - const arPlanes: React.JSX.Element[] = []; - const detectBothAlignments = - this.props.alignment === "Both" || !this.props.alignment; - - // Determine which alignments to detect - const alignmentsToDetect: Array< - "Horizontal" | "HorizontalUpward" | "HorizontalDownward" | "Vertical" - > = []; - if (detectBothAlignments) { - alignmentsToDetect.push("Horizontal", "Vertical"); - } else if (this.props.alignment) { - // Type assertion safe here because we know it's not "Both" due to detectBothAlignments check - alignmentsToDetect.push( - this.props.alignment as - | "Horizontal" - | "HorizontalUpward" - | "HorizontalDownward" - | "Vertical" - ); + if (this.props.onPlaneDetected) { + const accepted = this.props.onPlaneDetected(anchor); + if (accepted === false) return; } - // Create detector ViroARPlane components for each alignment type - // These don't have anchorId set initially, but will discover and track planes - // We add visual children based on detected plane data - const detectorsPerAlignment = 25; // 25 detectors per alignment type - - alignmentsToDetect.forEach((alignment) => { - for (let i = 0; i < detectorsPerAlignment; i++) { - const detectorKey = `${_planePrefix}detector_${alignment}_${i}`; - - // Check if this detector has discovered a plane - // We'll match by checking if any plane in foundARPlanes has this alignment - // and hasn't been assigned to a previous detector - // Note: ARCore returns "HorizontalUpward", "HorizontalDownward", etc. - // so we need to check if alignment starts with the requested type - const detectedPlanes = Array.from( - this.state.foundARPlanes.entries() - ).filter(([_id, plane]) => { - if (alignment === "Horizontal") { - return plane.alignment.includes("Horizontal"); - } else if (alignment === "Vertical") { - return plane.alignment.includes("Vertical"); - } - return plane.alignment === alignment; - }); - - const planeData = detectedPlanes[i]?.[1]; - const anchorId = detectedPlanes[i]?.[0]; - const hasPlaneData = !!planeData; - - // Extract visual rendering data if plane detected - let visualElement = null; - if (hasPlaneData) { - const isSelected = this.state.selectedPlaneId === anchorId; - const surfaceWidth = planeData.width || 0.5; - const surfaceHeight = planeData.height || 0.5; - const vertices3D = (planeData as any).vertices; - - // Convert 3D vertices to 2D based on plane alignment - // ViroARPlane provides vertices in the plane's LOCAL coordinate system - // where the plane is always in the XZ plane. The anchor handles world orientation. - // Always extract [x, z] since vertices are in the plane's local XZ plane - const vertices2D = - vertices3D && vertices3D.length >= 3 - ? vertices3D.map( - ([x, _y, z]: [number, number, number]): [number, number] => [ - x, - z, - ] - ) - : undefined; - - // Rotation for ViroPolygon: - // ViroPolygon renders in XY plane by default, vertices are provided in XZ - // Need to rotate to map XZ plane to XY rendering plane - const polygonRotation: [number, number, number] = [-90, 0, 0]; - - const isVisible = this.state.selectedPlaneId === null || isSelected; - - // Use actual plane shapes (ViroPolygon with vertices) - const forceQuadForAndroid = false; // Now using actual shapes on Android - - const useActualShape = - !forceQuadForAndroid && - this.props.useActualShape !== false && - vertices2D && - vertices2D.length >= 3; - - const finalOpacity = isSelected ? 0 : isVisible ? 1 : 0; - - visualElement = useActualShape ? ( - - this._getOnClickSurface(anchorId, { - clickState, - position, - source, - }), - })} - position={[0, 0, 0]} - rotation={polygonRotation} - opacity={finalOpacity} - /> - ) : ( - - this._getOnClickSurface(anchorId, { - clickState, - position, - source, - }), - })} - position={[0, 0, 0]} - width={surfaceWidth} - height={surfaceHeight} - rotation={polygonRotation} - opacity={finalOpacity} - /> - ); - } - - arPlanes.push( - { - this._onARPlaneUpdated(anchor); - }} - onAnchorUpdated={(anchor) => { - this._onARPlaneUpdated(anchor); - }} - > - {visualElement} - {hasPlaneData && this.props.children && ( - - {this.props.children} - - )} - - ); - } + this.setState((prev) => { + const next = new Map(prev.planes); + next.set(anchor.anchorId, anchor); + return { planes: next }; }); + }; - return arPlanes; - } - - _getOnClickSurface = (anchorId: string, event: ViroClickStateEvent) => { - if (event.clickState < 3) { - return; - } - - // Get the plane data before updating state to avoid race conditions - const selectedPlane = this.state.foundARPlanes.get(anchorId); - if (!selectedPlane) { - console.warn( - "ViroARPlaneSelector: Cannot select plane - plane data not found" - ); - return; - } - - // Update state and call callback with the captured data - this.setState({ selectedPlaneId: anchorId }, () => { - this._onPlaneSelected(selectedPlane); + /** + * Forward `ViroARScene.onAnchorUpdated` here. + * + * Updates the stored anchor data (refined center, extent, and polygon + * vertices) for any plane already in the visible set. Unknown anchors + * are silently ignored. + * + * Usage: + * `onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)}` + */ + handleAnchorUpdated = (anchor: ViroAnchor): void => { + if (anchor.type !== "plane") return; + this.setState((prev) => { + if (!prev.planes.has(anchor.anchorId)) return null; + const next = new Map(prev.planes); + next.set(anchor.anchorId, anchor); + return { planes: next }; }); }; - _onARPlaneUpdated = (anchor: any) => { - if (!anchor.anchorId) { - console.warn("ViroARPlaneSelector: Anchor missing anchorId"); - return; - } - - const updateMap: ViroPlaneUpdatedMap = { - anchorId: anchor.anchorId, - type: anchor.type || "plane", - position: anchor.position, - rotation: anchor.rotation, - scale: anchor.scale, - center: anchor.center, - width: anchor.width, - height: anchor.height, - alignment: anchor.alignment, - classification: anchor.classification, - vertices: anchor.vertices, - }; - - // Update or add plane in Map - this.setState((prevState) => { - const newPlanes = new Map(prevState.foundARPlanes); - newPlanes.set(anchor.anchorId, updateMap as ViroARPlaneType); - return { foundARPlanes: newPlanes }; + /** + * Forward `ViroARScene.onAnchorRemoved` here. + * + * Removes the plane from the visible set. If the removed plane was + * currently selected, the selection is cleared automatically (equivalent + * to calling `reset()`), and `onPlaneRemoved` is fired. + * + * Note: the `onAnchorRemoved` callback on ViroARScene may fire with + * `undefined` — guard against that at the call site: + * `onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)}` + */ + handleAnchorRemoved = (anchor: ViroAnchor): void => { + if (!anchor?.anchorId) return; + const { anchorId } = anchor; + this.setState((prev) => { + if (!prev.planes.has(anchorId)) return null; + const next = new Map(prev.planes); + next.delete(anchorId); + return { + planes: next, + selectedPlaneId: + prev.selectedPlaneId === anchorId ? null : prev.selectedPlaneId, + }; }); - - // Call validation callback if provided - if (this.props.onPlaneDetected) { - this.props.onPlaneDetected(updateMap); - } + this.props.onPlaneRemoved?.(anchorId); }; - _onPlaneSelected = (updateMap: ViroPlaneUpdatedMap) => { - this.props.onPlaneSelected && this.props.onPlaneSelected(updateMap); + /** + * Clear the current selection and restore all plane overlays so the user + * can tap a different plane. + * + * Also clears the stored tap position so children return to the plane + * origin if a new plane is selected before a tap is registered. + * + * Typical usage: + * ```tsx + * // Let the user re-select after moving to a new room: + * selectorRef.current?.reset(); + * ``` + */ + reset = (): void => { + this.setState({ selectedPlaneId: null, tapLocalPosition: null }); }; + // --------------------------------------------------------------------------- + // World → plane-local coordinate conversion + // --------------------------------------------------------------------------- + /** - * This function allows the user to reset the surface and select a new plane. + * Convert a world-space position to ViroARPlane's local coordinate space. + * + * ViroARPlane local origin = anchor.position (world-space translation + * extracted from the ARKit/ARCore anchor transform via + * VROMatrix4f::extractTranslation — see VRTARUtils.m). + * + * ViroARPlane orientation = anchor.rotation (Euler angles in degrees, + * extracted via VROMatrix4f::extractRotation().toEuler(), X-Y-Z order + * confirmed from VROMatrix4f::rotate which calls rotateX→rotateY→rotateZ). + * + * Combined rotation: R = Rx · Ry · Rz + * World→local: local = Rᵀ · (world − anchorPosition) + * (Rᵀ = R⁻¹ since R is orthogonal) + * + * The returned Y component represents distance from the plane surface. + * Callers should clamp it to 0 to keep children on the surface. */ - reset = () => { - this.setState({ - selectedPlaneId: null, - }); + _worldToLocal = ( + world: [number, number, number], + anchorPosition: [number, number, number], + rotationDeg: [number, number, number] + ): [number, number, number] => { + const toRad = Math.PI / 180; + const c1 = Math.cos(rotationDeg[0] * toRad), s1 = Math.sin(rotationDeg[0] * toRad); // rx + const c2 = Math.cos(rotationDeg[1] * toRad), s2 = Math.sin(rotationDeg[1] * toRad); // ry + const c3 = Math.cos(rotationDeg[2] * toRad), s3 = Math.sin(rotationDeg[2] * toRad); // rz + + const dx = world[0] - anchorPosition[0]; + const dy = world[1] - anchorPosition[1]; + const dz = world[2] - anchorPosition[2]; + + // Rᵀ of (Rx·Ry·Rz) applied to [dx, dy, dz]: + return [ + c2*c3*dx + (s1*s2*c3 + c1*s3)*dy + (-c1*s2*c3 + s1*s3)*dz, + -c2*s3*dx + (-s1*s2*s3 + c1*c3)*dy + ( c1*s2*s3 + s1*c3)*dz, + s2*dx + (-s1*c2)*dy + c1*c2*dz, + ]; }; + + // --------------------------------------------------------------------------- + // Private helpers + // --------------------------------------------------------------------------- + + _passesAlignmentFilter = (anchor: ViroAnchor): boolean => { + const { alignment } = this.props; + if (!alignment || alignment === "Both") return true; + if (!anchor.alignment) return false; + if (alignment === "Horizontal") + return anchor.alignment.includes("Horizontal"); + if (alignment === "Vertical") return anchor.alignment.includes("Vertical"); + return anchor.alignment === alignment; + }; + + // --------------------------------------------------------------------------- + // Render + // --------------------------------------------------------------------------- + + render() { + return {this._renderPlanes()}; + } + + _renderPlanes() { + const { selectedPlaneId, planes } = this.state; + const materialName = + this.props.material ?? "ViroARPlaneSelector_Translucent"; + const elements: React.JSX.Element[] = []; + + planes.forEach((anchor, anchorId) => { + const isSelected = selectedPlaneId === anchorId; + // hideOverlayOnSelection defaults to true: hide the overlay once a plane + // is selected (only children remain visible). Set to false to keep the + // selected plane's overlay visible after selection. + const hideOnSelection = this.props.hideOverlayOnSelection !== false; + const surfaceOpacity = + selectedPlaneId === null ? 1 : // no selection → all visible + isSelected && !hideOnSelection ? 1 : // selected, overlay kept + 0; // selected+hide or unselected → hide + + const vertices3D = anchor.vertices; + const vertices2D = + vertices3D && vertices3D.length >= 3 + ? vertices3D.map( + ([x, _y, z]: [number, number, number]): [number, number] => [ + x, + z, + ] + ) + : undefined; + + // ViroPolygon renders in XY; vertices are in XZ — rotate to align. + const polygonRotation: [number, number, number] = [-90, 0, 0]; + + const useActualShape = + this.props.useActualShape !== false && + vertices2D !== undefined && + vertices2D.length >= 3; + + // Click handler — only attached when click selection is enabled. + const clickHandlerProps = this.props.disableClickSelection + ? {} + : { + onClickState: ( + clickState: number, + tapWorld: [number, number, number] + ) => { + // clickState 3 = CLICKED (click down + up on same target) + if (clickState === 3) { + const plane = this.state.planes.get(anchorId); + if (plane) { + // Convert world-space tap → plane-local, clamped to surface (Y=0). + const local = this._worldToLocal( + tapWorld, + plane.position as [number, number, number], + plane.rotation as [number, number, number] + ); + const tapLocal: [number, number, number] = [local[0], 0, local[2]]; + + this.setState( + { selectedPlaneId: anchorId, tapLocalPosition: tapLocal }, + () => this.props.onPlaneSelected?.(plane, tapWorld) + ); + } + } + }, + }; + + const visual = useActualShape ? ( + + ) : ( + + ); + + elements.push( + this.handleAnchorUpdated(a as ViroAnchor)} + > + {visual} + {isSelected && this.props.children != null && ( + + {this.props.children} + + )} + + ); + }); + + return elements; + } } ViroMaterials.createMaterials({ ViroARPlaneSelector_Translucent: { lightingModel: "Constant", - diffuseColor: "rgba(0, 122, 255, 0.5)", // Bright blue with 50% opacity for better visibility + diffuseColor: "rgba(0, 122, 255, 0.5)", blendMode: "Alpha", - cullMode: "None", // Render both sides for better Android compatibility + cullMode: "None", writesToDepthBuffer: false, }, }); diff --git a/components/AR/ViroARScene.tsx b/components/AR/ViroARScene.tsx index 8b5fea7b..fb95411d 100644 --- a/components/AR/ViroARScene.tsx +++ b/components/AR/ViroARScene.tsx @@ -420,7 +420,7 @@ export class ViroARScene extends ViroBase { let anchorDetectionTypes = typeof this.props.anchorDetectionTypes === "string" ? new Array(this.props.anchorDetectionTypes) - : this.props.anchorDetectionTypes; + : this.props.anchorDetectionTypes ?? ["planesHorizontal", "planesVertical"]; let timeToFuse = undefined; if ( diff --git a/components/AR/ViroARSceneNavigator.tsx b/components/AR/ViroARSceneNavigator.tsx index 17c5d955..bdc61348 100644 --- a/components/AR/ViroARSceneNavigator.tsx +++ b/components/AR/ViroARSceneNavigator.tsx @@ -22,11 +22,10 @@ import { } from "react-native"; import { ViroWorldOrigin, - ViroCloudAnchorProvider, + ViroProvider, ViroCloudAnchorStateChangeEvent, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, - ViroGeospatialAnchorProvider, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, @@ -103,6 +102,20 @@ type Props = ViewProps & { */ occlusionMode?: ViroOcclusionMode; + /** + * Enables depth sensing without activating occlusion rendering. + * Virtual objects will NOT be occluded by real-world surfaces, but depth data + * will be available for hit tests (DepthPoint type) and distance measurement. + * + * If occlusionMode="depthBased" is also set, occlusionMode takes precedence. + * + * Android: requires ARCore Depth API support (ARCore 1.18+). + * iOS: uses LiDAR on supported devices, monocular depth estimator as fallback. + * + * @default false + */ + depthEnabled?: boolean; + /** * [Debug] Enable depth debug visualization to see how the depth texture is being sampled. * When enabled, the camera background will show a color overlay representing depth values: @@ -140,14 +153,17 @@ type Props = ViewProps & { preferMonocularDepth?: boolean; /** - * Enable cloud anchors for cross-platform anchor sharing. - * When set to 'arcore', the ARCore Cloud Anchors SDK will be used. - * Requires a valid Google Cloud API key configured in the native project. + * Cloud and geospatial anchor provider. + * Set to `"reactvision"` (default) for the ReactVision backend, + * `"arcore"` for Google Cloud Anchors, or `"none"` to disable. * - * @default "none" + * Replaces the old `cloudAnchorProvider` / `geospatialAnchorProvider` props, + * which are now deprecated. Both providers are set to the same value. + * + * @default "reactvision" * @platform ios,android */ - cloudAnchorProvider?: ViroCloudAnchorProvider; + provider?: ViroProvider; /** * Callback fired when a cloud anchor state changes. @@ -155,16 +171,6 @@ type Props = ViewProps & { */ onCloudAnchorStateChange?: (event: ViroCloudAnchorStateChangeEvent) => void; - /** - * Enable the ARCore Geospatial API for location-based AR experiences. - * When set to 'arcore', the ARCore Geospatial SDK will be used. - * Requires a valid Google Cloud API key configured in the native project. - * - * @default "none" - * @platform ios,android - */ - geospatialAnchorProvider?: ViroGeospatialAnchorProvider; - /** * Enable world mesh for physics collision with real-world surfaces. * When enabled, virtual physics objects will collide with detected @@ -932,6 +938,208 @@ export class ViroARSceneNavigator extends React.Component { ); }; + /** + * ReactVision — save GPS coordinates to the backend and return a cross-device shareable UUID. + * Does NOT create a local AR anchor — call createGeospatialAnchor separately for AR placement. + * + * @param latitude WGS84 latitude + * @param longitude WGS84 longitude + * @param altitude Altitude in metres + * @param altitudeMode "street_level" (default) or "rooftop_level" + * @returns Promise resolving to { success, anchorId } where anchorId is the platform UUID + */ + _hostGeospatialAnchor = async ( + latitude: number, + longitude: number, + altitude: number, + altitudeMode?: string + ): Promise => { + return await ViroARSceneNavigatorModule.hostGeospatialAnchor( + findNodeHandle(this), + latitude, + longitude, + altitude, + altitudeMode || "street_level" + ); + }; + + /** + * ReactVision — fetch GPS coordinates from the backend by platform UUID and create a local AR anchor. + * Combines rvGetGeospatialAnchor + createGeospatialAnchor into a single call. + * + * @param platformUuid UUID returned by hostGeospatialAnchor + * @param quaternion Orientation [x, y, z, w] (default identity) + * @returns Promise resolving to { success, anchor: { anchorId, latitude, longitude, altitude } } + */ + _resolveGeospatialAnchor = async ( + platformUuid: string, + quaternion?: ViroQuaternion + ): Promise => { + return await ViroARSceneNavigatorModule.resolveGeospatialAnchor( + findNodeHandle(this), + platformUuid, + quaternion || [0, 0, 0, 1] + ); + }; + + /** + * ReactVision — fetch a geospatial anchor record by UUID. + * Returns the anchor with linked scene asset data (position, rotation, scale, fileUrl). + */ + _rvGetGeospatialAnchor = async (anchorId: string): Promise => { + return await ViroARSceneNavigatorModule.rvGetGeospatialAnchor( + findNodeHandle(this), + anchorId + ); + }; + + /** + * ReactVision — find geospatial anchors near a GPS location. + * @param latitude Centre latitude + * @param longitude Centre longitude + * @param radius Search radius in metres (default 500) + * @param limit Max results (default 50) + */ + _rvFindNearbyGeospatialAnchors = async ( + latitude: number, + longitude: number, + radius: number = 500, + limit: number = 50 + ): Promise => { + return await ViroARSceneNavigatorModule.rvFindNearbyGeospatialAnchors( + findNodeHandle(this), + latitude, + longitude, + radius, + limit + ); + }; + + /** + * ReactVision — update a geospatial anchor (link scene asset, scene, or rename). + * Pass null/empty string to leave a field unchanged. + */ + _rvUpdateGeospatialAnchor = async ( + anchorId: string, + sceneAssetId?: string, + sceneId?: string, + name?: string, + userAssetId?: string + ): Promise => { + return await ViroARSceneNavigatorModule.rvUpdateGeospatialAnchor( + findNodeHandle(this), + anchorId, + sceneAssetId ?? "", + sceneId ?? "", + name ?? "", + userAssetId ?? "" + ); + }; + + _rvUploadAsset = async ( + filePath: string, + assetType: string, + fileName: string, + appUserId?: string + ): Promise => { + return await ViroARSceneNavigatorModule.rvUploadAsset( + findNodeHandle(this), + filePath, + assetType, + fileName, + appUserId ?? "" + ); + }; + + /** + * ReactVision — permanently delete a geospatial anchor from the backend. + */ + _rvDeleteGeospatialAnchor = async (anchorId: string): Promise => { + return await ViroARSceneNavigatorModule.rvDeleteGeospatialAnchor( + findNodeHandle(this), + anchorId + ); + }; + + _rvListGeospatialAnchors = async (limit: number, offset: number): Promise => { + return await ViroARSceneNavigatorModule.rvListGeospatialAnchors( + findNodeHandle(this), limit, offset + ); + }; + + // =========================================================================== + // Cloud Anchor Management API Methods + // =========================================================================== + + _rvGetCloudAnchor = async (anchorId: string): Promise => { + return await ViroARSceneNavigatorModule.rvGetCloudAnchor(findNodeHandle(this), anchorId); + }; + + _rvListCloudAnchors = async (limit: number, offset: number): Promise => { + return await ViroARSceneNavigatorModule.rvListCloudAnchors(findNodeHandle(this), limit, offset); + }; + + _rvUpdateCloudAnchor = async ( + anchorId: string, + name: string, + description: string, + isPublic: boolean + ): Promise => { + return await ViroARSceneNavigatorModule.rvUpdateCloudAnchor( + findNodeHandle(this), anchorId, name, description, isPublic + ); + }; + + _rvDeleteCloudAnchor = async (anchorId: string): Promise => { + return await ViroARSceneNavigatorModule.rvDeleteCloudAnchor(findNodeHandle(this), anchorId); + }; + + _rvFindNearbyCloudAnchors = async ( + latitude: number, + longitude: number, + radius: number, + limit: number + ): Promise => { + return await ViroARSceneNavigatorModule.rvFindNearbyCloudAnchors( + findNodeHandle(this), latitude, longitude, radius, limit + ); + }; + + _rvAttachAssetToCloudAnchor = async ( + anchorId: string, + fileUrl: string, + fileSize: number, + name: string, + assetType: string, + externalUserId: string + ): Promise => { + return await ViroARSceneNavigatorModule.rvAttachAssetToCloudAnchor( + findNodeHandle(this), anchorId, fileUrl, fileSize, name, assetType, externalUserId + ); + }; + + _rvRemoveAssetFromCloudAnchor = async (anchorId: string, assetId: string): Promise => { + return await ViroARSceneNavigatorModule.rvRemoveAssetFromCloudAnchor( + findNodeHandle(this), anchorId, assetId + ); + }; + + _rvTrackCloudAnchorResolution = async ( + anchorId: string, + success: boolean, + confidence: number, + matchCount: number, + inlierCount: number, + processingTimeMs: number, + platform: string, + externalUserId: string + ): Promise => { + return await ViroARSceneNavigatorModule.rvTrackCloudAnchorResolution( + findNodeHandle(this), anchorId, success, confidence, matchCount, + inlierCount, processingTimeMs, platform, externalUserId + ); + }; + // =========================================================================== // Scene Semantics API Methods // =========================================================================== @@ -1166,9 +1374,28 @@ export class ViroARSceneNavigator extends React.Component { getCameraGeospatialPose: this._getCameraGeospatialPose, checkVPSAvailability: this._checkVPSAvailability, createGeospatialAnchor: this._createGeospatialAnchor, + hostGeospatialAnchor: this._hostGeospatialAnchor, + resolveGeospatialAnchor: this._resolveGeospatialAnchor, createTerrainAnchor: this._createTerrainAnchor, createRooftopAnchor: this._createRooftopAnchor, removeGeospatialAnchor: this._removeGeospatialAnchor, + // ReactVision Geospatial CRUD + rvGetGeospatialAnchor: this._rvGetGeospatialAnchor, + rvFindNearbyGeospatialAnchors: this._rvFindNearbyGeospatialAnchors, + rvUpdateGeospatialAnchor: this._rvUpdateGeospatialAnchor, + rvDeleteGeospatialAnchor: this._rvDeleteGeospatialAnchor, + rvListGeospatialAnchors: this._rvListGeospatialAnchors, + // ReactVision Cloud Anchor Management + rvGetCloudAnchor: this._rvGetCloudAnchor, + rvListCloudAnchors: this._rvListCloudAnchors, + rvUpdateCloudAnchor: this._rvUpdateCloudAnchor, + rvDeleteCloudAnchor: this._rvDeleteCloudAnchor, + rvFindNearbyCloudAnchors: this._rvFindNearbyCloudAnchors, + rvAttachAssetToCloudAnchor: this._rvAttachAssetToCloudAnchor, + rvRemoveAssetFromCloudAnchor: this._rvRemoveAssetFromCloudAnchor, + rvTrackCloudAnchorResolution: this._rvTrackCloudAnchorResolution, + // Assets API + rvUploadAsset: this._rvUploadAsset, // Scene Semantics API isSemanticModeSupported: this._isSemanticModeSupported, setSemanticModeEnabled: this._setSemanticModeEnabled, @@ -1205,9 +1432,28 @@ export class ViroARSceneNavigator extends React.Component { getCameraGeospatialPose: this._getCameraGeospatialPose, checkVPSAvailability: this._checkVPSAvailability, createGeospatialAnchor: this._createGeospatialAnchor, + hostGeospatialAnchor: this._hostGeospatialAnchor, + resolveGeospatialAnchor: this._resolveGeospatialAnchor, createTerrainAnchor: this._createTerrainAnchor, createRooftopAnchor: this._createRooftopAnchor, removeGeospatialAnchor: this._removeGeospatialAnchor, + // ReactVision Geospatial CRUD + rvGetGeospatialAnchor: this._rvGetGeospatialAnchor, + rvFindNearbyGeospatialAnchors: this._rvFindNearbyGeospatialAnchors, + rvUpdateGeospatialAnchor: this._rvUpdateGeospatialAnchor, + rvDeleteGeospatialAnchor: this._rvDeleteGeospatialAnchor, + rvListGeospatialAnchors: this._rvListGeospatialAnchors, + // ReactVision Cloud Anchor Management + rvGetCloudAnchor: this._rvGetCloudAnchor, + rvListCloudAnchors: this._rvListCloudAnchors, + rvUpdateCloudAnchor: this._rvUpdateCloudAnchor, + rvDeleteCloudAnchor: this._rvDeleteCloudAnchor, + rvFindNearbyCloudAnchors: this._rvFindNearbyCloudAnchors, + rvAttachAssetToCloudAnchor: this._rvAttachAssetToCloudAnchor, + rvRemoveAssetFromCloudAnchor: this._rvRemoveAssetFromCloudAnchor, + rvTrackCloudAnchorResolution: this._rvTrackCloudAnchorResolution, + // Assets API + rvUploadAsset: this._rvUploadAsset, // Scene Semantics API isSemanticModeSupported: this._isSemanticModeSupported, setSemanticModeEnabled: this._setSemanticModeEnabled, @@ -1242,14 +1488,20 @@ export class ViroARSceneNavigator extends React.Component { delete this.sceneNavigator.viroAppProps?.rootTag; } - const { viroAppProps = {} } = this.props; + const { + viroAppProps = {}, + provider = "reactvision", + ...restProps + } = this.props; return ( { this._component = component; }} - {...this.props} + {...restProps} + cloudAnchorProvider={provider} + geospatialAnchorProvider={provider} viroAppProps={viroAppProps} currentSceneIndex={this.state.currentSceneIndex} style={(this.props.style, styles.container)} diff --git a/components/Material/ViroMaterials.ts b/components/Material/ViroMaterials.ts index 3a79dc22..ae4b13fa 100644 --- a/components/Material/ViroMaterials.ts +++ b/components/Material/ViroMaterials.ts @@ -57,6 +57,20 @@ export type ViroResolvedCubeMap = { export type ViroShaderModifier = { body?: string; uniforms?: string; + /** Typed varying declarations shared between vertex and fragment stages. + * Each string is a GLSL type+name pair, e.g. "highp float displacement". + * The 'out' / 'in' qualifiers are added automatically. */ + varyings?: string[]; + /** When true the modifier may declare and sample + * 'uniform sampler2D scene_depth_texture'. + * The engine auto-binds the previous frame's scene depth buffer (HDR mode only). + * The sampler is bound by name — this flag is informational metadata. */ + requiresSceneDepth?: boolean; + /** When true the modifier may declare and sample 'uniform sampler2D camera_texture'. + * The engine auto-binds the live AR camera background texture. + * On Android (ARCore) the OES extension and samplerExternalOES are injected automatically. + * A 'uniform mat4 camera_image_transform' is also auto-bound for UV mapping. */ + requiresCameraTexture?: boolean; }; export type ViroShaderModifiers = { @@ -158,10 +172,6 @@ export class ViroMaterials { } if (MaterialManager) { - console.log( - "ViroMaterials: Sending materials to native:", - Object.keys(result) - ); MaterialManager.setJSMaterials(result); } else { console.error( @@ -187,7 +197,7 @@ export class ViroMaterials { * * @param materialName - The name of the material to update * @param uniformName - The name of the uniform variable (e.g., "time") - * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4") + * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4", "sampler2D") * @param value - The new value (number for float, array for vectors/matrices) * * @example @@ -201,8 +211,8 @@ export class ViroMaterials { static updateShaderUniform( materialName: string, uniformName: string, - uniformType: "float" | "vec2" | "vec3" | "vec4" | "mat4", - value: number | number[] + uniformType: "float" | "vec2" | "vec3" | "vec4" | "mat4" | "sampler2D", + value: number | number[] | any ) { if (!MaterialManager) { console.error( @@ -210,6 +220,11 @@ export class ViroMaterials { ); return; } - MaterialManager.updateShaderUniform(materialName, uniformName, uniformType, value); + MaterialManager.updateShaderUniform( + materialName, + uniformName, + uniformType, + value + ); } } diff --git a/components/Types/ViroEvents.ts b/components/Types/ViroEvents.ts index b03f92c2..30b54167 100644 --- a/components/Types/ViroEvents.ts +++ b/components/Types/ViroEvents.ts @@ -419,9 +419,12 @@ export type ViroCloudAnchorState = | "ErrorHostingServiceUnavailable"; /** - * Cloud anchor provider type. + * Unified AR provider — controls both cloud anchors and geospatial anchors. */ -export type ViroCloudAnchorProvider = "none" | "arcore"; +export type ViroProvider = "none" | "arcore" | "reactvision"; + +/** @deprecated Use ViroProvider */ +export type ViroCloudAnchorProvider = ViroProvider; /** * Represents a cloud-hosted AR anchor. @@ -475,10 +478,8 @@ export type ViroCloudAnchorStateChangeEvent = { * Viro Geospatial API Events and Types * ============================================================================ */ -/** - * Geospatial anchor provider type. - */ -export type ViroGeospatialAnchorProvider = "none" | "arcore"; +/** @deprecated Use ViroProvider */ +export type ViroGeospatialAnchorProvider = ViroProvider; /** * Earth tracking state. diff --git a/components/Utilities/ViroUtils.tsx b/components/Utilities/ViroUtils.tsx index 3da6ddc7..05c26765 100644 --- a/components/Utilities/ViroUtils.tsx +++ b/components/Utilities/ViroUtils.tsx @@ -67,6 +67,74 @@ export function polarToCartesianActual(polarcoords: number[]) { } import { Platform, NativeModules } from "react-native"; +import type { ViroGeospatialPose } from "../Types/ViroEvents"; + +// --------------------------------------------------------------------------- +// Geospatial utilities — GPS ↔ AR world-space conversion +// --------------------------------------------------------------------------- + +const EARTH_RADIUS_M = 6378137; // WGS84 equatorial radius in metres + +/** + * Convert a lat/lng pair to Web Mercator coordinates (metres). + * Returns [x (Easting), y (Northing)]. + */ +export function latLngToMercator( + lat: number, + lng: number, +): [number, number] { + const x = EARTH_RADIUS_M * (lng * Math.PI) / 180; + const y = + EARTH_RADIUS_M * + Math.log(Math.tan(Math.PI / 4 + (lat * Math.PI) / 360)); + return [x, y]; +} + +/** + * Convert a GPS position (lat/lng/alt) to an AR world-space offset from the + * device's current geospatial pose. + * + * Uses a Mercator projection for the horizontal plane and the device compass + * heading to rotate into the AR coordinate frame: + * +X = right, +Y = up, -Z = forward (right-hand rule) + * + * @param devicePose Current camera geospatial pose from getCameraGeospatialPose() + * @param anchorLat Target latitude in degrees + * @param anchorLng Target longitude in degrees + * @param anchorAlt Target altitude in metres (WGS84) + * @returns [arX, arY, arZ] position in metres relative to the device + */ +export function gpsToArWorld( + devicePose: ViroGeospatialPose, + anchorLat: number, + anchorLng: number, + anchorAlt: number, +): [number, number, number] { + const [devX, devY] = latLngToMercator(devicePose.latitude, devicePose.longitude); + const [ancX, ancY] = latLngToMercator(anchorLat, anchorLng); + + // Delta in metres: East (X) and North (Y) + const deltaE = ancX - devX; + const deltaN = ancY - devY; + const deltaAlt = anchorAlt - devicePose.altitude; + + // Bearing from device to anchor (clockwise from North, radians) + const bearing = Math.atan2(deltaE, deltaN); + const distance = Math.sqrt(deltaE * deltaE + deltaN * deltaN); + + // Device compass heading: degrees CW from North → radians + const headingRad = (devicePose.heading * Math.PI) / 180; + + // Relative bearing in device frame + const relBearing = bearing - headingRad; + + // AR frame: +X = right, -Z = forward + return [ + distance * Math.sin(relBearing), // arX + deltaAlt, // arY (altitude difference) + -distance * Math.cos(relBearing), // arZ + ]; +} export interface ViroiOSArSupportResponse { isARSupported: boolean; diff --git a/components/Utilities/ViroVersion.ts b/components/Utilities/ViroVersion.ts index 90e2c26e..8cd4d652 100644 --- a/components/Utilities/ViroVersion.ts +++ b/components/Utilities/ViroVersion.ts @@ -1 +1 @@ -export const VIRO_VERSION = "2.52.1"; +export const VIRO_VERSION = "2.53.0"; diff --git a/dist/components/AR/ViroARPlaneSelector.d.ts b/dist/components/AR/ViroARPlaneSelector.d.ts index 2ac3d443..3e19857c 100644 --- a/dist/components/AR/ViroARPlaneSelector.d.ts +++ b/dist/components/AR/ViroARPlaneSelector.d.ts @@ -8,39 +8,292 @@ * * @providesModule ViroARPlaneSelector */ -import { ViroClickStateEvent, ViroPlaneUpdatedMap } from "../Types/ViroEvents"; -import { ViroARPlaneType, ViroNativeRef } from "../Types/ViroUtils"; +import { ViroAnchor, ViroPlaneUpdatedMap } from "../Types/ViroEvents"; import * as React from "react"; type Props = { + /** + * Minimum height (meters) a detected plane must have before it is shown. + * Planes smaller than this are silently ignored. Default: 0 (no minimum). + */ minHeight?: number; + /** + * Minimum width (meters) a detected plane must have before it is shown. + * Planes smaller than this are silently ignored. Default: 0 (no minimum). + */ minWidth?: number; + /** + * Which plane orientations to accept. + * + * | Value | Accepted planes | + * |--------------------|----------------------------------------| + * | `"Horizontal"` | Both HorizontalUpward + HorizontalDownward | + * | `"HorizontalUpward"` | Upward-facing floors/tables only | + * | `"HorizontalDownward"` | Downward-facing ceilings only | + * | `"Vertical"` | Walls and vertical surfaces only | + * | `"Both"` (default) | All orientations | + * + * Default: `"Both"` (accept every plane ARKit/ARCore detects). + */ alignment?: "Horizontal" | "HorizontalUpward" | "HorizontalDownward" | "Vertical" | "Both"; - onPlaneSelected?: (updateMap: ViroPlaneUpdatedMap) => void; - onPlaneDetected?: (updateMap: ViroPlaneUpdatedMap) => boolean; + /** + * Called once when the user taps a plane and it becomes selected. + * + * @param plane The ViroAnchor of the selected plane. Includes + * `center` (local offset), `width`, `height`, + * `alignment`, `vertices`, and `classification`. + * @param tapPosition World-space position of the tap ray–surface + * intersection. Use this when you need to know + * the exact 3-D point the user touched (e.g. to + * spawn a particle at the contact point). + * + * Note: children are automatically placed at the tap point inside the + * plane's local coordinate space — you do NOT need to read tapPosition + * just to get the object at the right location. + */ + onPlaneSelected?: (plane: ViroPlaneUpdatedMap, tapPosition?: [number, number, number]) => void; + /** + * Called for every plane that passes the alignment and size filters, + * before it is added to the visible set. + * + * Return `false` to reject the plane (e.g. skip planes that are too + * far away, or have the wrong classification). Any other return value + * (including `undefined`) accepts the plane. + */ + onPlaneDetected?: (plane: ViroPlaneUpdatedMap) => boolean; + /** + * Called when ARKit/ARCore removes a previously detected plane. + * + * If the removed plane was the selected one, the selection is + * automatically cleared and `reset()` does not need to be called. + * + * @param anchorId The ARKit/ARCore anchor ID of the removed plane. + */ + onPlaneRemoved?: (anchorId: string) => void; + /** + * When `true` (default), the plane overlay for the selected plane is + * hidden after the user makes a selection. Only `children` remain + * visible, giving a clean look without the blue indicator underneath + * the placed content. + * + * Set to `false` to keep the overlay visible on the selected plane + * (e.g. to let the user see the plane boundary while repositioning + * content). + * + * Unselected planes are always hidden once a selection is made, + * regardless of this prop. + * + * Default: `true`. + */ + hideOverlayOnSelection?: boolean; + /** + * When `true`, tapping a plane overlay does not trigger selection. + * Use this when you want to select planes programmatically (e.g. via + * a hit-test in `ViroARScene.performARHitTestWithPoint`) rather than + * through direct tap. + * + * Default: `false` (tap-to-select is enabled). + */ disableClickSelection?: boolean; + /** + * When `true` (default), the plane overlay uses ARKit/ARCore's actual + * polygon boundary vertices (`ViroPolygon`) for a precise fit. + * + * When `false`, or before ARKit has provided polygon vertices, the + * overlay falls back to an axis-aligned bounding rectangle + * (`ViroQuad` sized to `anchor.width × anchor.height`). + * + * Default: `true`. + */ useActualShape?: boolean; + /** + * Name of a `ViroMaterials`-registered material to use for the plane + * overlay surface. The material is applied to both the `ViroPolygon` + * (actual-shape) and the `ViroQuad` (bounding-rect) fallback. + * + * Default: `"ViroARPlaneSelector_Translucent"` — a semi-transparent + * blue material registered at the bottom of this file. + */ + material?: string; + /** + * Content to place on the selected plane at the tap point. + * + * Children are rendered as children of `ViroARPlane` (plane-local + * coordinate space) and are wrapped in a `ViroNode` positioned at the + * tap location on the plane surface (Y = 0 in local space = on the + * surface). + * + * Children should position themselves relative to this origin: + * - `position={[0, 0.5, 0]}` — 50 cm above the tap point (typical + * for a 3-D object resting on a floor or wall). + * - `position={[0, 0, 0]}` — at the exact tap contact point. + * + * Children are NOT rendered until a plane is selected. + */ children?: React.ReactNode; }; type State = { + /** anchorId of the currently selected plane, or null if none selected. */ selectedPlaneId: string | null; - foundARPlanes: Map; + /** + * Tap point in the selected plane's local coordinate space (Y=0 on surface). + * Used to position children at the location the user tapped rather than at + * the plane's geometric center. Cleared by reset(). + */ + tapLocalPosition: [number, number, number] | null; + /** Live map of all accepted planes keyed by their ARKit/ARCore anchor ID. */ + planes: Map; }; /** - * This component wraps the logic required to enable user selection - * of an AR plane. This currently only allows for 1 plane to be selected, - * but could easily be modified to allow for more planes. + * ViroARPlaneSelector + * + * Detects AR planes reported by ARKit (iOS) or ARCore (Android), renders a + * tappable overlay on each one, and places your content on the plane the user + * selects — at the exact point they tapped. + * + * ───────────────────────────────────────────────────────────────────────────── + * REQUIRED WIRING (breaking change from the original component) + * ───────────────────────────────────────────────────────────────────────────── + * The component no longer self-discovers planes. You must forward the + * parent ViroARScene's anchor events to it via a ref: + * + * ```tsx + * const selectorRef = useRef(null); + * + * selectorRef.current?.handleAnchorFound(a)} + * onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)} + * onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)} + * > + * console.log("selected", plane, tapPos)} + * > + * + * + * + * ``` + * + * ───────────────────────────────────────────────────────────────────────────── + * BEHAVIOUR + * ───────────────────────────────────────────────────────────────────────────── + * 1. Plane discovery + * `handleAnchorFound` is called for every new ARKit/ARCore plane anchor. + * Planes are filtered by `alignment`, `minWidth`, `minHeight`, and the + * optional `onPlaneDetected` callback. Accepted planes are stored in an + * internal Map keyed by their ARKit/ARCore anchor ID — no pre-allocated + * slots, no index-mapping artefacts. + * + * 2. Plane visualisation + * Each accepted plane gets one overlay rendered as a child of + * `ViroARPlane anchorId={id}` so it is always locked to the correct + * real-world surface. The overlay is: + * - A `ViroPolygon` matching ARKit's actual boundary vertices when + * `useActualShape` is true (default) and vertices are available. + * - A `ViroQuad` (bounding rectangle) otherwise. + * All overlays are visible until one is selected; then the others hide. + * + * 3. Selection & tap-position placement + * When the user taps an overlay the world-space intersection point is + * converted to the plane's local coordinate space using the full + * inverse rotation (R = Rx·Ry·Rz, X-Y-Z Euler order from VROMatrix4f). + * Children are wrapped in a `ViroNode` positioned at that local point + * (Y=0 = on the surface), so objects appear exactly where you touched — + * not at the plane's geometric centre. + * + * 4. Plane removal + * `handleAnchorRemoved` removes the plane from the Map. If the removed + * plane was the selected one the selection is automatically cleared. + * + * 5. Resetting + * Call `selectorRef.current.reset()` to deselect the current plane and + * re-show all overlays so the user can pick again. + * + * ───────────────────────────────────────────────────────────────────────────── + * COORDINATE SYSTEM NOTE + * ───────────────────────────────────────────────────────────────────────────── + * Children are in the selected ViroARPlane's local space: + * - Y axis = plane normal (perpendicular to surface, pointing "up" for + * floors and "outward" for walls). + * - XZ plane = the detected surface. + * - Origin = ARKit/ARCore anchor transform origin (near the plane + * geometric centre but not necessarily identical to it). + * + * Typical child positioning: + * `position={[0, 0.5, 0]}` — 50 cm above / in front of the tap point. + * `position={[0, 0, 0]}` — exactly at the tap contact point. */ export declare class ViroARPlaneSelector extends React.Component { - _component: ViroNativeRef; state: State; - render(): React.JSX.Element; - _getARPlanes(): React.JSX.Element[]; - _getOnClickSurface: (anchorId: string, event: ViroClickStateEvent) => void; - _onARPlaneUpdated: (anchor: any) => void; - _onPlaneSelected: (updateMap: ViroPlaneUpdatedMap) => void; /** - * This function allows the user to reset the surface and select a new plane. + * Forward `ViroARScene.onAnchorFound` here. + * + * Filters by type ("plane"), alignment, size, and `onPlaneDetected`. + * Accepted planes are added to the visible overlay set. + * + * Usage: + * `onAnchorFound={(a) => selectorRef.current?.handleAnchorFound(a)}` + */ + handleAnchorFound: (anchor: ViroAnchor) => void; + /** + * Forward `ViroARScene.onAnchorUpdated` here. + * + * Updates the stored anchor data (refined center, extent, and polygon + * vertices) for any plane already in the visible set. Unknown anchors + * are silently ignored. + * + * Usage: + * `onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)}` + */ + handleAnchorUpdated: (anchor: ViroAnchor) => void; + /** + * Forward `ViroARScene.onAnchorRemoved` here. + * + * Removes the plane from the visible set. If the removed plane was + * currently selected, the selection is cleared automatically (equivalent + * to calling `reset()`), and `onPlaneRemoved` is fired. + * + * Note: the `onAnchorRemoved` callback on ViroARScene may fire with + * `undefined` — guard against that at the call site: + * `onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)}` + */ + handleAnchorRemoved: (anchor: ViroAnchor) => void; + /** + * Clear the current selection and restore all plane overlays so the user + * can tap a different plane. + * + * Also clears the stored tap position so children return to the plane + * origin if a new plane is selected before a tap is registered. + * + * Typical usage: + * ```tsx + * // Let the user re-select after moving to a new room: + * selectorRef.current?.reset(); + * ``` */ reset: () => void; + /** + * Convert a world-space position to ViroARPlane's local coordinate space. + * + * ViroARPlane local origin = anchor.position (world-space translation + * extracted from the ARKit/ARCore anchor transform via + * VROMatrix4f::extractTranslation — see VRTARUtils.m). + * + * ViroARPlane orientation = anchor.rotation (Euler angles in degrees, + * extracted via VROMatrix4f::extractRotation().toEuler(), X-Y-Z order + * confirmed from VROMatrix4f::rotate which calls rotateX→rotateY→rotateZ). + * + * Combined rotation: R = Rx · Ry · Rz + * World→local: local = Rᵀ · (world − anchorPosition) + * (Rᵀ = R⁻¹ since R is orthogonal) + * + * The returned Y component represents distance from the plane surface. + * Callers should clamp it to 0 to keep children on the surface. + */ + _worldToLocal: (world: [number, number, number], anchorPosition: [number, number, number], rotationDeg: [number, number, number]) => [number, number, number]; + _passesAlignmentFilter: (anchor: ViroAnchor) => boolean; + render(): React.JSX.Element; + _renderPlanes(): React.JSX.Element[]; } export {}; diff --git a/dist/components/AR/ViroARPlaneSelector.js b/dist/components/AR/ViroARPlaneSelector.js index 0778177b..9004c4c2 100644 --- a/dist/components/AR/ViroARPlaneSelector.js +++ b/dist/components/AR/ViroARPlaneSelector.js @@ -50,179 +50,302 @@ const ViroNode_1 = require("../ViroNode"); const ViroQuad_1 = require("../ViroQuad"); const ViroPolygon_1 = require("../ViroPolygon"); const ViroARPlane_1 = require("./ViroARPlane"); -var _planePrefix = "ViroARPlaneSelector_Plane_"; /** - * This component wraps the logic required to enable user selection - * of an AR plane. This currently only allows for 1 plane to be selected, - * but could easily be modified to allow for more planes. + * ViroARPlaneSelector + * + * Detects AR planes reported by ARKit (iOS) or ARCore (Android), renders a + * tappable overlay on each one, and places your content on the plane the user + * selects — at the exact point they tapped. + * + * ───────────────────────────────────────────────────────────────────────────── + * REQUIRED WIRING (breaking change from the original component) + * ───────────────────────────────────────────────────────────────────────────── + * The component no longer self-discovers planes. You must forward the + * parent ViroARScene's anchor events to it via a ref: + * + * ```tsx + * const selectorRef = useRef(null); + * + * selectorRef.current?.handleAnchorFound(a)} + * onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)} + * onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)} + * > + * console.log("selected", plane, tapPos)} + * > + * + * + * + * ``` + * + * ───────────────────────────────────────────────────────────────────────────── + * BEHAVIOUR + * ───────────────────────────────────────────────────────────────────────────── + * 1. Plane discovery + * `handleAnchorFound` is called for every new ARKit/ARCore plane anchor. + * Planes are filtered by `alignment`, `minWidth`, `minHeight`, and the + * optional `onPlaneDetected` callback. Accepted planes are stored in an + * internal Map keyed by their ARKit/ARCore anchor ID — no pre-allocated + * slots, no index-mapping artefacts. + * + * 2. Plane visualisation + * Each accepted plane gets one overlay rendered as a child of + * `ViroARPlane anchorId={id}` so it is always locked to the correct + * real-world surface. The overlay is: + * - A `ViroPolygon` matching ARKit's actual boundary vertices when + * `useActualShape` is true (default) and vertices are available. + * - A `ViroQuad` (bounding rectangle) otherwise. + * All overlays are visible until one is selected; then the others hide. + * + * 3. Selection & tap-position placement + * When the user taps an overlay the world-space intersection point is + * converted to the plane's local coordinate space using the full + * inverse rotation (R = Rx·Ry·Rz, X-Y-Z Euler order from VROMatrix4f). + * Children are wrapped in a `ViroNode` positioned at that local point + * (Y=0 = on the surface), so objects appear exactly where you touched — + * not at the plane's geometric centre. + * + * 4. Plane removal + * `handleAnchorRemoved` removes the plane from the Map. If the removed + * plane was the selected one the selection is automatically cleared. + * + * 5. Resetting + * Call `selectorRef.current.reset()` to deselect the current plane and + * re-show all overlays so the user can pick again. + * + * ───────────────────────────────────────────────────────────────────────────── + * COORDINATE SYSTEM NOTE + * ───────────────────────────────────────────────────────────────────────────── + * Children are in the selected ViroARPlane's local space: + * - Y axis = plane normal (perpendicular to surface, pointing "up" for + * floors and "outward" for walls). + * - XZ plane = the detected surface. + * - Origin = ARKit/ARCore anchor transform origin (near the plane + * geometric centre but not necessarily identical to it). + * + * Typical child positioning: + * `position={[0, 0.5, 0]}` — 50 cm above / in front of the tap point. + * `position={[0, 0, 0]}` — exactly at the tap contact point. */ class ViroARPlaneSelector extends React.Component { - _component = null; state = { selectedPlaneId: null, - foundARPlanes: new Map(), + tapLocalPosition: null, + planes: new Map(), }; - render() { - // Uncomment this line to check for misnamed props - //checkMisnamedProps("ViroARPlaneSelector", this.props); - return {this._getARPlanes()}; - } - _getARPlanes() { - const arPlanes = []; - const detectBothAlignments = this.props.alignment === "Both" || !this.props.alignment; - // Determine which alignments to detect - const alignmentsToDetect = []; - if (detectBothAlignments) { - alignmentsToDetect.push("Horizontal", "Vertical"); - } - else if (this.props.alignment) { - // Type assertion safe here because we know it's not "Both" due to detectBothAlignments check - alignmentsToDetect.push(this.props.alignment); - } - // Create detector ViroARPlane components for each alignment type - // These don't have anchorId set initially, but will discover and track planes - // We add visual children based on detected plane data - const detectorsPerAlignment = 25; // 25 detectors per alignment type - alignmentsToDetect.forEach((alignment) => { - for (let i = 0; i < detectorsPerAlignment; i++) { - const detectorKey = `${_planePrefix}detector_${alignment}_${i}`; - // Check if this detector has discovered a plane - // We'll match by checking if any plane in foundARPlanes has this alignment - // and hasn't been assigned to a previous detector - // Note: ARCore returns "HorizontalUpward", "HorizontalDownward", etc. - // so we need to check if alignment starts with the requested type - const detectedPlanes = Array.from(this.state.foundARPlanes.entries()).filter(([_id, plane]) => { - if (alignment === "Horizontal") { - return plane.alignment.includes("Horizontal"); - } - else if (alignment === "Vertical") { - return plane.alignment.includes("Vertical"); - } - return plane.alignment === alignment; - }); - const planeData = detectedPlanes[i]?.[1]; - const anchorId = detectedPlanes[i]?.[0]; - const hasPlaneData = !!planeData; - // Extract visual rendering data if plane detected - let visualElement = null; - if (hasPlaneData) { - const isSelected = this.state.selectedPlaneId === anchorId; - const surfaceWidth = planeData.width || 0.5; - const surfaceHeight = planeData.height || 0.5; - const vertices3D = planeData.vertices; - // Convert 3D vertices to 2D based on plane alignment - // ViroARPlane provides vertices in the plane's LOCAL coordinate system - // where the plane is always in the XZ plane. The anchor handles world orientation. - // Always extract [x, z] since vertices are in the plane's local XZ plane - const vertices2D = vertices3D && vertices3D.length >= 3 - ? vertices3D.map(([x, _y, z]) => [ - x, - z, - ]) - : undefined; - // Rotation for ViroPolygon: - // ViroPolygon renders in XY plane by default, vertices are provided in XZ - // Need to rotate to map XZ plane to XY rendering plane - const polygonRotation = [-90, 0, 0]; - const isVisible = this.state.selectedPlaneId === null || isSelected; - // Use actual plane shapes (ViroPolygon with vertices) - const forceQuadForAndroid = false; // Now using actual shapes on Android - const useActualShape = !forceQuadForAndroid && - this.props.useActualShape !== false && - vertices2D && - vertices2D.length >= 3; - const finalOpacity = isSelected ? 0 : isVisible ? 1 : 0; - visualElement = useActualShape ? ( this._getOnClickSurface(anchorId, { - clickState, - position, - source, - }), - })} position={[0, 0, 0]} rotation={polygonRotation} opacity={finalOpacity}/>) : ( this._getOnClickSurface(anchorId, { - clickState, - position, - source, - }), - })} position={[0, 0, 0]} width={surfaceWidth} height={surfaceHeight} rotation={polygonRotation} opacity={finalOpacity}/>); - } - arPlanes.push( { - this._onARPlaneUpdated(anchor); - }} onAnchorUpdated={(anchor) => { - this._onARPlaneUpdated(anchor); - }}> - {visualElement} - {hasPlaneData && this.props.children && ( - {this.props.children} - )} - ); - } - }); - return arPlanes; - } - _getOnClickSurface = (anchorId, event) => { - if (event.clickState < 3) { + // --------------------------------------------------------------------------- + // Public API — forward ViroARScene anchor events to these via ref + // --------------------------------------------------------------------------- + /** + * Forward `ViroARScene.onAnchorFound` here. + * + * Filters by type ("plane"), alignment, size, and `onPlaneDetected`. + * Accepted planes are added to the visible overlay set. + * + * Usage: + * `onAnchorFound={(a) => selectorRef.current?.handleAnchorFound(a)}` + */ + handleAnchorFound = (anchor) => { + if (anchor.type !== "plane") return; - } - // Get the plane data before updating state to avoid race conditions - const selectedPlane = this.state.foundARPlanes.get(anchorId); - if (!selectedPlane) { - console.warn("ViroARPlaneSelector: Cannot select plane - plane data not found"); + if (!this._passesAlignmentFilter(anchor)) return; + if (this.props.onPlaneDetected) { + const accepted = this.props.onPlaneDetected(anchor); + if (accepted === false) + return; } - // Update state and call callback with the captured data - this.setState({ selectedPlaneId: anchorId }, () => { - this._onPlaneSelected(selectedPlane); + this.setState((prev) => { + const next = new Map(prev.planes); + next.set(anchor.anchorId, anchor); + return { planes: next }; }); }; - _onARPlaneUpdated = (anchor) => { - if (!anchor.anchorId) { - console.warn("ViroARPlaneSelector: Anchor missing anchorId"); + /** + * Forward `ViroARScene.onAnchorUpdated` here. + * + * Updates the stored anchor data (refined center, extent, and polygon + * vertices) for any plane already in the visible set. Unknown anchors + * are silently ignored. + * + * Usage: + * `onAnchorUpdated={(a) => selectorRef.current?.handleAnchorUpdated(a)}` + */ + handleAnchorUpdated = (anchor) => { + if (anchor.type !== "plane") return; - } - const updateMap = { - anchorId: anchor.anchorId, - type: anchor.type || "plane", - position: anchor.position, - rotation: anchor.rotation, - scale: anchor.scale, - center: anchor.center, - width: anchor.width, - height: anchor.height, - alignment: anchor.alignment, - classification: anchor.classification, - vertices: anchor.vertices, - }; - // Update or add plane in Map - this.setState((prevState) => { - const newPlanes = new Map(prevState.foundARPlanes); - newPlanes.set(anchor.anchorId, updateMap); - return { foundARPlanes: newPlanes }; + this.setState((prev) => { + if (!prev.planes.has(anchor.anchorId)) + return null; + const next = new Map(prev.planes); + next.set(anchor.anchorId, anchor); + return { planes: next }; }); - // Call validation callback if provided - if (this.props.onPlaneDetected) { - this.props.onPlaneDetected(updateMap); - } }; - _onPlaneSelected = (updateMap) => { - this.props.onPlaneSelected && this.props.onPlaneSelected(updateMap); + /** + * Forward `ViroARScene.onAnchorRemoved` here. + * + * Removes the plane from the visible set. If the removed plane was + * currently selected, the selection is cleared automatically (equivalent + * to calling `reset()`), and `onPlaneRemoved` is fired. + * + * Note: the `onAnchorRemoved` callback on ViroARScene may fire with + * `undefined` — guard against that at the call site: + * `onAnchorRemoved={(a) => a && selectorRef.current?.handleAnchorRemoved(a)}` + */ + handleAnchorRemoved = (anchor) => { + if (!anchor?.anchorId) + return; + const { anchorId } = anchor; + this.setState((prev) => { + if (!prev.planes.has(anchorId)) + return null; + const next = new Map(prev.planes); + next.delete(anchorId); + return { + planes: next, + selectedPlaneId: prev.selectedPlaneId === anchorId ? null : prev.selectedPlaneId, + }; + }); + this.props.onPlaneRemoved?.(anchorId); }; /** - * This function allows the user to reset the surface and select a new plane. + * Clear the current selection and restore all plane overlays so the user + * can tap a different plane. + * + * Also clears the stored tap position so children return to the plane + * origin if a new plane is selected before a tap is registered. + * + * Typical usage: + * ```tsx + * // Let the user re-select after moving to a new room: + * selectorRef.current?.reset(); + * ``` */ reset = () => { - this.setState({ - selectedPlaneId: null, - }); + this.setState({ selectedPlaneId: null, tapLocalPosition: null }); + }; + // --------------------------------------------------------------------------- + // World → plane-local coordinate conversion + // --------------------------------------------------------------------------- + /** + * Convert a world-space position to ViroARPlane's local coordinate space. + * + * ViroARPlane local origin = anchor.position (world-space translation + * extracted from the ARKit/ARCore anchor transform via + * VROMatrix4f::extractTranslation — see VRTARUtils.m). + * + * ViroARPlane orientation = anchor.rotation (Euler angles in degrees, + * extracted via VROMatrix4f::extractRotation().toEuler(), X-Y-Z order + * confirmed from VROMatrix4f::rotate which calls rotateX→rotateY→rotateZ). + * + * Combined rotation: R = Rx · Ry · Rz + * World→local: local = Rᵀ · (world − anchorPosition) + * (Rᵀ = R⁻¹ since R is orthogonal) + * + * The returned Y component represents distance from the plane surface. + * Callers should clamp it to 0 to keep children on the surface. + */ + _worldToLocal = (world, anchorPosition, rotationDeg) => { + const toRad = Math.PI / 180; + const c1 = Math.cos(rotationDeg[0] * toRad), s1 = Math.sin(rotationDeg[0] * toRad); // rx + const c2 = Math.cos(rotationDeg[1] * toRad), s2 = Math.sin(rotationDeg[1] * toRad); // ry + const c3 = Math.cos(rotationDeg[2] * toRad), s3 = Math.sin(rotationDeg[2] * toRad); // rz + const dx = world[0] - anchorPosition[0]; + const dy = world[1] - anchorPosition[1]; + const dz = world[2] - anchorPosition[2]; + // Rᵀ of (Rx·Ry·Rz) applied to [dx, dy, dz]: + return [ + c2 * c3 * dx + (s1 * s2 * c3 + c1 * s3) * dy + (-c1 * s2 * c3 + s1 * s3) * dz, + -c2 * s3 * dx + (-s1 * s2 * s3 + c1 * c3) * dy + (c1 * s2 * s3 + s1 * c3) * dz, + s2 * dx + (-s1 * c2) * dy + c1 * c2 * dz, + ]; }; + // --------------------------------------------------------------------------- + // Private helpers + // --------------------------------------------------------------------------- + _passesAlignmentFilter = (anchor) => { + const { alignment } = this.props; + if (!alignment || alignment === "Both") + return true; + if (!anchor.alignment) + return false; + if (alignment === "Horizontal") + return anchor.alignment.includes("Horizontal"); + if (alignment === "Vertical") + return anchor.alignment.includes("Vertical"); + return anchor.alignment === alignment; + }; + // --------------------------------------------------------------------------- + // Render + // --------------------------------------------------------------------------- + render() { + return {this._renderPlanes()}; + } + _renderPlanes() { + const { selectedPlaneId, planes } = this.state; + const materialName = this.props.material ?? "ViroARPlaneSelector_Translucent"; + const elements = []; + planes.forEach((anchor, anchorId) => { + const isSelected = selectedPlaneId === anchorId; + // hideOverlayOnSelection defaults to true: hide the overlay once a plane + // is selected (only children remain visible). Set to false to keep the + // selected plane's overlay visible after selection. + const hideOnSelection = this.props.hideOverlayOnSelection !== false; + const surfaceOpacity = selectedPlaneId === null ? 1 : // no selection → all visible + isSelected && !hideOnSelection ? 1 : // selected, overlay kept + 0; // selected+hide or unselected → hide + const vertices3D = anchor.vertices; + const vertices2D = vertices3D && vertices3D.length >= 3 + ? vertices3D.map(([x, _y, z]) => [ + x, + z, + ]) + : undefined; + // ViroPolygon renders in XY; vertices are in XZ — rotate to align. + const polygonRotation = [-90, 0, 0]; + const useActualShape = this.props.useActualShape !== false && + vertices2D !== undefined && + vertices2D.length >= 3; + // Click handler — only attached when click selection is enabled. + const clickHandlerProps = this.props.disableClickSelection + ? {} + : { + onClickState: (clickState, tapWorld) => { + // clickState 3 = CLICKED (click down + up on same target) + if (clickState === 3) { + const plane = this.state.planes.get(anchorId); + if (plane) { + // Convert world-space tap → plane-local, clamped to surface (Y=0). + const local = this._worldToLocal(tapWorld, plane.position, plane.rotation); + const tapLocal = [local[0], 0, local[2]]; + this.setState({ selectedPlaneId: anchorId, tapLocalPosition: tapLocal }, () => this.props.onPlaneSelected?.(plane, tapWorld)); + } + } + }, + }; + const visual = useActualShape ? () : (); + elements.push( this.handleAnchorUpdated(a)}> + {visual} + {isSelected && this.props.children != null && ( + {this.props.children} + )} + ); + }); + return elements; + } } exports.ViroARPlaneSelector = ViroARPlaneSelector; ViroMaterials_1.ViroMaterials.createMaterials({ ViroARPlaneSelector_Translucent: { lightingModel: "Constant", - diffuseColor: "rgba(0, 122, 255, 0.5)", // Bright blue with 50% opacity for better visibility + diffuseColor: "rgba(0, 122, 255, 0.5)", blendMode: "Alpha", - cullMode: "None", // Render both sides for better Android compatibility + cullMode: "None", writesToDepthBuffer: false, }, }); diff --git a/dist/components/AR/ViroARScene.js b/dist/components/AR/ViroARScene.js index b3c853a0..4335974c 100644 --- a/dist/components/AR/ViroARScene.js +++ b/dist/components/AR/ViroARScene.js @@ -288,7 +288,7 @@ class ViroARScene extends ViroBase_1.ViroBase { // Since anchorDetectionTypes can be either a string or an array, convert the string to a 1-element array. let anchorDetectionTypes = typeof this.props.anchorDetectionTypes === "string" ? new Array(this.props.anchorDetectionTypes) - : this.props.anchorDetectionTypes; + : this.props.anchorDetectionTypes ?? ["planesHorizontal", "planesVertical"]; let timeToFuse = undefined; if (this.props.onFuse != undefined && typeof this.props.onFuse === "object") { diff --git a/dist/components/AR/ViroARSceneNavigator.d.ts b/dist/components/AR/ViroARSceneNavigator.d.ts index 1434a8e1..f035a4eb 100644 --- a/dist/components/AR/ViroARSceneNavigator.d.ts +++ b/dist/components/AR/ViroARSceneNavigator.d.ts @@ -11,7 +11,7 @@ */ import * as React from "react"; import { ViewProps } from "react-native"; -import { ViroWorldOrigin, ViroCloudAnchorProvider, ViroCloudAnchorStateChangeEvent, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroGeospatialAnchorProvider, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroQuaternion, ViroSemanticSupportResult, ViroSemanticLabelFractionsResult, ViroSemanticLabelFractionResult, ViroSemanticLabel, ViroMonocularDepthPreferenceResult, ViroDepthOcclusionSupportResult, ViroGeospatialSetupStatusResult } from "../Types/ViroEvents"; +import { ViroWorldOrigin, ViroProvider, ViroCloudAnchorStateChangeEvent, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroQuaternion, ViroSemanticSupportResult, ViroSemanticLabelFractionsResult, ViroSemanticLabelFractionResult, ViroSemanticLabel, ViroMonocularDepthPreferenceResult, ViroDepthOcclusionSupportResult, ViroGeospatialSetupStatusResult } from "../Types/ViroEvents"; import { Viro3DPoint, ViroNativeRef, ViroScene, ViroSceneDictionary } from "../Types/ViroUtils"; import { ViroWorldMeshConfig, ViroWorldMeshStats } from "../Types/ViroWorldMesh"; /** @@ -54,6 +54,19 @@ type Props = ViewProps & { * @default "disabled" */ occlusionMode?: ViroOcclusionMode; + /** + * Enables depth sensing without activating occlusion rendering. + * Virtual objects will NOT be occluded by real-world surfaces, but depth data + * will be available for hit tests (DepthPoint type) and distance measurement. + * + * If occlusionMode="depthBased" is also set, occlusionMode takes precedence. + * + * Android: requires ARCore Depth API support (ARCore 1.18+). + * iOS: uses LiDAR on supported devices, monocular depth estimator as fallback. + * + * @default false + */ + depthEnabled?: boolean; /** * [Debug] Enable depth debug visualization to see how the depth texture is being sampled. * When enabled, the camera background will show a color overlay representing depth values: @@ -89,28 +102,22 @@ type Props = ViewProps & { */ preferMonocularDepth?: boolean; /** - * Enable cloud anchors for cross-platform anchor sharing. - * When set to 'arcore', the ARCore Cloud Anchors SDK will be used. - * Requires a valid Google Cloud API key configured in the native project. + * Cloud and geospatial anchor provider. + * Set to `"reactvision"` (default) for the ReactVision backend, + * `"arcore"` for Google Cloud Anchors, or `"none"` to disable. + * + * Replaces the old `cloudAnchorProvider` / `geospatialAnchorProvider` props, + * which are now deprecated. Both providers are set to the same value. * - * @default "none" + * @default "reactvision" * @platform ios,android */ - cloudAnchorProvider?: ViroCloudAnchorProvider; + provider?: ViroProvider; /** * Callback fired when a cloud anchor state changes. * This includes progress updates during hosting/resolving operations. */ onCloudAnchorStateChange?: (event: ViroCloudAnchorStateChangeEvent) => void; - /** - * Enable the ARCore Geospatial API for location-based AR experiences. - * When set to 'arcore', the ARCore Geospatial SDK will be used. - * Requires a valid Google Cloud API key configured in the native project. - * - * @default "none" - * @platform ios,android - */ - geospatialAnchorProvider?: ViroGeospatialAnchorProvider; /** * Enable world mesh for physics collision with real-world surfaces. * When enabled, virtual physics objects will collide with detected @@ -423,6 +430,58 @@ export declare class ViroARSceneNavigator extends React.Component * @param anchorId - The ID of the anchor to remove */ _removeGeospatialAnchor: (anchorId: string) => void; + /** + * ReactVision — save GPS coordinates to the backend and return a cross-device shareable UUID. + * Does NOT create a local AR anchor — call createGeospatialAnchor separately for AR placement. + * + * @param latitude WGS84 latitude + * @param longitude WGS84 longitude + * @param altitude Altitude in metres + * @param altitudeMode "street_level" (default) or "rooftop_level" + * @returns Promise resolving to { success, anchorId } where anchorId is the platform UUID + */ + _hostGeospatialAnchor: (latitude: number, longitude: number, altitude: number, altitudeMode?: string) => Promise; + /** + * ReactVision — fetch GPS coordinates from the backend by platform UUID and create a local AR anchor. + * Combines rvGetGeospatialAnchor + createGeospatialAnchor into a single call. + * + * @param platformUuid UUID returned by hostGeospatialAnchor + * @param quaternion Orientation [x, y, z, w] (default identity) + * @returns Promise resolving to { success, anchor: { anchorId, latitude, longitude, altitude } } + */ + _resolveGeospatialAnchor: (platformUuid: string, quaternion?: ViroQuaternion) => Promise; + /** + * ReactVision — fetch a geospatial anchor record by UUID. + * Returns the anchor with linked scene asset data (position, rotation, scale, fileUrl). + */ + _rvGetGeospatialAnchor: (anchorId: string) => Promise; + /** + * ReactVision — find geospatial anchors near a GPS location. + * @param latitude Centre latitude + * @param longitude Centre longitude + * @param radius Search radius in metres (default 500) + * @param limit Max results (default 50) + */ + _rvFindNearbyGeospatialAnchors: (latitude: number, longitude: number, radius?: number, limit?: number) => Promise; + /** + * ReactVision — update a geospatial anchor (link scene asset, scene, or rename). + * Pass null/empty string to leave a field unchanged. + */ + _rvUpdateGeospatialAnchor: (anchorId: string, sceneAssetId?: string, sceneId?: string, name?: string, userAssetId?: string) => Promise; + _rvUploadAsset: (filePath: string, assetType: string, fileName: string, appUserId?: string) => Promise; + /** + * ReactVision — permanently delete a geospatial anchor from the backend. + */ + _rvDeleteGeospatialAnchor: (anchorId: string) => Promise; + _rvListGeospatialAnchors: (limit: number, offset: number) => Promise; + _rvGetCloudAnchor: (anchorId: string) => Promise; + _rvListCloudAnchors: (limit: number, offset: number) => Promise; + _rvUpdateCloudAnchor: (anchorId: string, name: string, description: string, isPublic: boolean) => Promise; + _rvDeleteCloudAnchor: (anchorId: string) => Promise; + _rvFindNearbyCloudAnchors: (latitude: number, longitude: number, radius: number, limit: number) => Promise; + _rvAttachAssetToCloudAnchor: (anchorId: string, fileUrl: string, fileSize: number, name: string, assetType: string, externalUserId: string) => Promise; + _rvRemoveAssetFromCloudAnchor: (anchorId: string, assetId: string) => Promise; + _rvTrackCloudAnchorResolution: (anchorId: string, success: boolean, confidence: number, matchCount: number, inlierCount: number, processingTimeMs: number, platform: string, externalUserId: string) => Promise; /** * Check if Scene Semantics mode is supported on this device. * Scene Semantics uses ML to classify each pixel in the camera feed @@ -520,9 +579,25 @@ export declare class ViroARSceneNavigator extends React.Component getCameraGeospatialPose: () => Promise; checkVPSAvailability: (latitude: number, longitude: number) => Promise; createGeospatialAnchor: (latitude: number, longitude: number, altitude: number, quaternion?: ViroQuaternion) => Promise; + hostGeospatialAnchor: (latitude: number, longitude: number, altitude: number, altitudeMode?: string) => Promise; + resolveGeospatialAnchor: (platformUuid: string, quaternion?: ViroQuaternion) => Promise; createTerrainAnchor: (latitude: number, longitude: number, altitudeAboveTerrain: number, quaternion?: ViroQuaternion) => Promise; createRooftopAnchor: (latitude: number, longitude: number, altitudeAboveRooftop: number, quaternion?: ViroQuaternion) => Promise; removeGeospatialAnchor: (anchorId: string) => void; + rvGetGeospatialAnchor: (anchorId: string) => Promise; + rvFindNearbyGeospatialAnchors: (latitude: number, longitude: number, radius?: number, limit?: number) => Promise; + rvUpdateGeospatialAnchor: (anchorId: string, sceneAssetId?: string, sceneId?: string, name?: string, userAssetId?: string) => Promise; + rvDeleteGeospatialAnchor: (anchorId: string) => Promise; + rvListGeospatialAnchors: (limit: number, offset: number) => Promise; + rvGetCloudAnchor: (anchorId: string) => Promise; + rvListCloudAnchors: (limit: number, offset: number) => Promise; + rvUpdateCloudAnchor: (anchorId: string, name: string, description: string, isPublic: boolean) => Promise; + rvDeleteCloudAnchor: (anchorId: string) => Promise; + rvFindNearbyCloudAnchors: (latitude: number, longitude: number, radius: number, limit: number) => Promise; + rvAttachAssetToCloudAnchor: (anchorId: string, fileUrl: string, fileSize: number, name: string, assetType: string, externalUserId: string) => Promise; + rvRemoveAssetFromCloudAnchor: (anchorId: string, assetId: string) => Promise; + rvTrackCloudAnchorResolution: (anchorId: string, success: boolean, confidence: number, matchCount: number, inlierCount: number, processingTimeMs: number, platform: string, externalUserId: string) => Promise; + rvUploadAsset: (filePath: string, assetType: string, fileName: string, appUserId?: string) => Promise; isSemanticModeSupported: () => Promise; setSemanticModeEnabled: (enabled: boolean) => void; getSemanticLabelFractions: () => Promise; @@ -555,9 +630,25 @@ export declare class ViroARSceneNavigator extends React.Component getCameraGeospatialPose: () => Promise; checkVPSAvailability: (latitude: number, longitude: number) => Promise; createGeospatialAnchor: (latitude: number, longitude: number, altitude: number, quaternion?: ViroQuaternion) => Promise; + hostGeospatialAnchor: (latitude: number, longitude: number, altitude: number, altitudeMode?: string) => Promise; + resolveGeospatialAnchor: (platformUuid: string, quaternion?: ViroQuaternion) => Promise; createTerrainAnchor: (latitude: number, longitude: number, altitudeAboveTerrain: number, quaternion?: ViroQuaternion) => Promise; createRooftopAnchor: (latitude: number, longitude: number, altitudeAboveRooftop: number, quaternion?: ViroQuaternion) => Promise; removeGeospatialAnchor: (anchorId: string) => void; + rvGetGeospatialAnchor: (anchorId: string) => Promise; + rvFindNearbyGeospatialAnchors: (latitude: number, longitude: number, radius?: number, limit?: number) => Promise; + rvUpdateGeospatialAnchor: (anchorId: string, sceneAssetId?: string, sceneId?: string, name?: string, userAssetId?: string) => Promise; + rvDeleteGeospatialAnchor: (anchorId: string) => Promise; + rvListGeospatialAnchors: (limit: number, offset: number) => Promise; + rvGetCloudAnchor: (anchorId: string) => Promise; + rvListCloudAnchors: (limit: number, offset: number) => Promise; + rvUpdateCloudAnchor: (anchorId: string, name: string, description: string, isPublic: boolean) => Promise; + rvDeleteCloudAnchor: (anchorId: string) => Promise; + rvFindNearbyCloudAnchors: (latitude: number, longitude: number, radius: number, limit: number) => Promise; + rvAttachAssetToCloudAnchor: (anchorId: string, fileUrl: string, fileSize: number, name: string, assetType: string, externalUserId: string) => Promise; + rvRemoveAssetFromCloudAnchor: (anchorId: string, assetId: string) => Promise; + rvTrackCloudAnchorResolution: (anchorId: string, success: boolean, confidence: number, matchCount: number, inlierCount: number, processingTimeMs: number, platform: string, externalUserId: string) => Promise; + rvUploadAsset: (filePath: string, assetType: string, fileName: string, appUserId?: string) => Promise; isSemanticModeSupported: () => Promise; setSemanticModeEnabled: (enabled: boolean) => void; getSemanticLabelFractions: () => Promise; diff --git a/dist/components/AR/ViroARSceneNavigator.js b/dist/components/AR/ViroARSceneNavigator.js index 9a659502..a8ad3255 100644 --- a/dist/components/AR/ViroARSceneNavigator.js +++ b/dist/components/AR/ViroARSceneNavigator.js @@ -603,6 +603,93 @@ class ViroARSceneNavigator extends React.Component { _removeGeospatialAnchor = (anchorId) => { ViroARSceneNavigatorModule.removeGeospatialAnchor((0, react_native_1.findNodeHandle)(this), anchorId); }; + /** + * ReactVision — save GPS coordinates to the backend and return a cross-device shareable UUID. + * Does NOT create a local AR anchor — call createGeospatialAnchor separately for AR placement. + * + * @param latitude WGS84 latitude + * @param longitude WGS84 longitude + * @param altitude Altitude in metres + * @param altitudeMode "street_level" (default) or "rooftop_level" + * @returns Promise resolving to { success, anchorId } where anchorId is the platform UUID + */ + _hostGeospatialAnchor = async (latitude, longitude, altitude, altitudeMode) => { + return await ViroARSceneNavigatorModule.hostGeospatialAnchor((0, react_native_1.findNodeHandle)(this), latitude, longitude, altitude, altitudeMode || "street_level"); + }; + /** + * ReactVision — fetch GPS coordinates from the backend by platform UUID and create a local AR anchor. + * Combines rvGetGeospatialAnchor + createGeospatialAnchor into a single call. + * + * @param platformUuid UUID returned by hostGeospatialAnchor + * @param quaternion Orientation [x, y, z, w] (default identity) + * @returns Promise resolving to { success, anchor: { anchorId, latitude, longitude, altitude } } + */ + _resolveGeospatialAnchor = async (platformUuid, quaternion) => { + return await ViroARSceneNavigatorModule.resolveGeospatialAnchor((0, react_native_1.findNodeHandle)(this), platformUuid, quaternion || [0, 0, 0, 1]); + }; + /** + * ReactVision — fetch a geospatial anchor record by UUID. + * Returns the anchor with linked scene asset data (position, rotation, scale, fileUrl). + */ + _rvGetGeospatialAnchor = async (anchorId) => { + return await ViroARSceneNavigatorModule.rvGetGeospatialAnchor((0, react_native_1.findNodeHandle)(this), anchorId); + }; + /** + * ReactVision — find geospatial anchors near a GPS location. + * @param latitude Centre latitude + * @param longitude Centre longitude + * @param radius Search radius in metres (default 500) + * @param limit Max results (default 50) + */ + _rvFindNearbyGeospatialAnchors = async (latitude, longitude, radius = 500, limit = 50) => { + return await ViroARSceneNavigatorModule.rvFindNearbyGeospatialAnchors((0, react_native_1.findNodeHandle)(this), latitude, longitude, radius, limit); + }; + /** + * ReactVision — update a geospatial anchor (link scene asset, scene, or rename). + * Pass null/empty string to leave a field unchanged. + */ + _rvUpdateGeospatialAnchor = async (anchorId, sceneAssetId, sceneId, name, userAssetId) => { + return await ViroARSceneNavigatorModule.rvUpdateGeospatialAnchor((0, react_native_1.findNodeHandle)(this), anchorId, sceneAssetId ?? "", sceneId ?? "", name ?? "", userAssetId ?? ""); + }; + _rvUploadAsset = async (filePath, assetType, fileName, appUserId) => { + return await ViroARSceneNavigatorModule.rvUploadAsset((0, react_native_1.findNodeHandle)(this), filePath, assetType, fileName, appUserId ?? ""); + }; + /** + * ReactVision — permanently delete a geospatial anchor from the backend. + */ + _rvDeleteGeospatialAnchor = async (anchorId) => { + return await ViroARSceneNavigatorModule.rvDeleteGeospatialAnchor((0, react_native_1.findNodeHandle)(this), anchorId); + }; + _rvListGeospatialAnchors = async (limit, offset) => { + return await ViroARSceneNavigatorModule.rvListGeospatialAnchors((0, react_native_1.findNodeHandle)(this), limit, offset); + }; + // =========================================================================== + // Cloud Anchor Management API Methods + // =========================================================================== + _rvGetCloudAnchor = async (anchorId) => { + return await ViroARSceneNavigatorModule.rvGetCloudAnchor((0, react_native_1.findNodeHandle)(this), anchorId); + }; + _rvListCloudAnchors = async (limit, offset) => { + return await ViroARSceneNavigatorModule.rvListCloudAnchors((0, react_native_1.findNodeHandle)(this), limit, offset); + }; + _rvUpdateCloudAnchor = async (anchorId, name, description, isPublic) => { + return await ViroARSceneNavigatorModule.rvUpdateCloudAnchor((0, react_native_1.findNodeHandle)(this), anchorId, name, description, isPublic); + }; + _rvDeleteCloudAnchor = async (anchorId) => { + return await ViroARSceneNavigatorModule.rvDeleteCloudAnchor((0, react_native_1.findNodeHandle)(this), anchorId); + }; + _rvFindNearbyCloudAnchors = async (latitude, longitude, radius, limit) => { + return await ViroARSceneNavigatorModule.rvFindNearbyCloudAnchors((0, react_native_1.findNodeHandle)(this), latitude, longitude, radius, limit); + }; + _rvAttachAssetToCloudAnchor = async (anchorId, fileUrl, fileSize, name, assetType, externalUserId) => { + return await ViroARSceneNavigatorModule.rvAttachAssetToCloudAnchor((0, react_native_1.findNodeHandle)(this), anchorId, fileUrl, fileSize, name, assetType, externalUserId); + }; + _rvRemoveAssetFromCloudAnchor = async (anchorId, assetId) => { + return await ViroARSceneNavigatorModule.rvRemoveAssetFromCloudAnchor((0, react_native_1.findNodeHandle)(this), anchorId, assetId); + }; + _rvTrackCloudAnchorResolution = async (anchorId, success, confidence, matchCount, inlierCount, processingTimeMs, platform, externalUserId) => { + return await ViroARSceneNavigatorModule.rvTrackCloudAnchorResolution((0, react_native_1.findNodeHandle)(this), anchorId, success, confidence, matchCount, inlierCount, processingTimeMs, platform, externalUserId); + }; // =========================================================================== // Scene Semantics API Methods // =========================================================================== @@ -794,9 +881,28 @@ class ViroARSceneNavigator extends React.Component { getCameraGeospatialPose: this._getCameraGeospatialPose, checkVPSAvailability: this._checkVPSAvailability, createGeospatialAnchor: this._createGeospatialAnchor, + hostGeospatialAnchor: this._hostGeospatialAnchor, + resolveGeospatialAnchor: this._resolveGeospatialAnchor, createTerrainAnchor: this._createTerrainAnchor, createRooftopAnchor: this._createRooftopAnchor, removeGeospatialAnchor: this._removeGeospatialAnchor, + // ReactVision Geospatial CRUD + rvGetGeospatialAnchor: this._rvGetGeospatialAnchor, + rvFindNearbyGeospatialAnchors: this._rvFindNearbyGeospatialAnchors, + rvUpdateGeospatialAnchor: this._rvUpdateGeospatialAnchor, + rvDeleteGeospatialAnchor: this._rvDeleteGeospatialAnchor, + rvListGeospatialAnchors: this._rvListGeospatialAnchors, + // ReactVision Cloud Anchor Management + rvGetCloudAnchor: this._rvGetCloudAnchor, + rvListCloudAnchors: this._rvListCloudAnchors, + rvUpdateCloudAnchor: this._rvUpdateCloudAnchor, + rvDeleteCloudAnchor: this._rvDeleteCloudAnchor, + rvFindNearbyCloudAnchors: this._rvFindNearbyCloudAnchors, + rvAttachAssetToCloudAnchor: this._rvAttachAssetToCloudAnchor, + rvRemoveAssetFromCloudAnchor: this._rvRemoveAssetFromCloudAnchor, + rvTrackCloudAnchorResolution: this._rvTrackCloudAnchorResolution, + // Assets API + rvUploadAsset: this._rvUploadAsset, // Scene Semantics API isSemanticModeSupported: this._isSemanticModeSupported, setSemanticModeEnabled: this._setSemanticModeEnabled, @@ -833,9 +939,28 @@ class ViroARSceneNavigator extends React.Component { getCameraGeospatialPose: this._getCameraGeospatialPose, checkVPSAvailability: this._checkVPSAvailability, createGeospatialAnchor: this._createGeospatialAnchor, + hostGeospatialAnchor: this._hostGeospatialAnchor, + resolveGeospatialAnchor: this._resolveGeospatialAnchor, createTerrainAnchor: this._createTerrainAnchor, createRooftopAnchor: this._createRooftopAnchor, removeGeospatialAnchor: this._removeGeospatialAnchor, + // ReactVision Geospatial CRUD + rvGetGeospatialAnchor: this._rvGetGeospatialAnchor, + rvFindNearbyGeospatialAnchors: this._rvFindNearbyGeospatialAnchors, + rvUpdateGeospatialAnchor: this._rvUpdateGeospatialAnchor, + rvDeleteGeospatialAnchor: this._rvDeleteGeospatialAnchor, + rvListGeospatialAnchors: this._rvListGeospatialAnchors, + // ReactVision Cloud Anchor Management + rvGetCloudAnchor: this._rvGetCloudAnchor, + rvListCloudAnchors: this._rvListCloudAnchors, + rvUpdateCloudAnchor: this._rvUpdateCloudAnchor, + rvDeleteCloudAnchor: this._rvDeleteCloudAnchor, + rvFindNearbyCloudAnchors: this._rvFindNearbyCloudAnchors, + rvAttachAssetToCloudAnchor: this._rvAttachAssetToCloudAnchor, + rvRemoveAssetFromCloudAnchor: this._rvRemoveAssetFromCloudAnchor, + rvTrackCloudAnchorResolution: this._rvTrackCloudAnchorResolution, + // Assets API + rvUploadAsset: this._rvUploadAsset, // Scene Semantics API isSemanticModeSupported: this._isSemanticModeSupported, setSemanticModeEnabled: this._setSemanticModeEnabled, @@ -865,10 +990,10 @@ class ViroARSceneNavigator extends React.Component { if (this.sceneNavigator.viroAppProps?.rootTag) { delete this.sceneNavigator.viroAppProps?.rootTag; } - const { viroAppProps = {} } = this.props; + const { viroAppProps = {}, provider = "reactvision", ...restProps } = this.props; return ( { this._component = component; - }} {...this.props} viroAppProps={viroAppProps} currentSceneIndex={this.state.currentSceneIndex} style={(this.props.style, styles.container)} key={this.state.internalRemountKey} onTabSwitch={this._onTabSwitch}> + }} {...restProps} cloudAnchorProvider={provider} geospatialAnchorProvider={provider} viroAppProps={viroAppProps} currentSceneIndex={this.state.currentSceneIndex} style={(this.props.style, styles.container)} key={this.state.internalRemountKey} onTabSwitch={this._onTabSwitch}> {items} ); } diff --git a/dist/components/Material/ViroMaterials.d.ts b/dist/components/Material/ViroMaterials.d.ts index 58ac328a..51903aa1 100644 --- a/dist/components/Material/ViroMaterials.d.ts +++ b/dist/components/Material/ViroMaterials.d.ts @@ -30,6 +30,20 @@ export type ViroResolvedCubeMap = { export type ViroShaderModifier = { body?: string; uniforms?: string; + /** Typed varying declarations shared between vertex and fragment stages. + * Each string is a GLSL type+name pair, e.g. "highp float displacement". + * The 'out' / 'in' qualifiers are added automatically. */ + varyings?: string[]; + /** When true the modifier may declare and sample + * 'uniform sampler2D scene_depth_texture'. + * The engine auto-binds the previous frame's scene depth buffer (HDR mode only). + * The sampler is bound by name — this flag is informational metadata. */ + requiresSceneDepth?: boolean; + /** When true the modifier may declare and sample 'uniform sampler2D camera_texture'. + * The engine auto-binds the live AR camera background texture. + * On Android (ARCore) the OES extension and samplerExternalOES are injected automatically. + * A 'uniform mat4 camera_image_transform' is also auto-bound for UV mapping. */ + requiresCameraTexture?: boolean; }; export type ViroShaderModifiers = { geometry?: string | ViroShaderModifier; @@ -85,7 +99,7 @@ export declare class ViroMaterials { * * @param materialName - The name of the material to update * @param uniformName - The name of the uniform variable (e.g., "time") - * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4") + * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4", "sampler2D") * @param value - The new value (number for float, array for vectors/matrices) * * @example @@ -96,5 +110,5 @@ export declare class ViroMaterials { * // Update color uniform * ViroMaterials.updateShaderUniform("myMaterial", "glowColor", "vec3", [1.0, 0.5, 0.0]); */ - static updateShaderUniform(materialName: string, uniformName: string, uniformType: "float" | "vec2" | "vec3" | "vec4" | "mat4", value: number | number[]): void; + static updateShaderUniform(materialName: string, uniformName: string, uniformType: "float" | "vec2" | "vec3" | "vec4" | "mat4" | "sampler2D", value: number | number[] | any): void; } diff --git a/dist/components/Material/ViroMaterials.js b/dist/components/Material/ViroMaterials.js index 7c4da414..1dd26d93 100644 --- a/dist/components/Material/ViroMaterials.js +++ b/dist/components/Material/ViroMaterials.js @@ -73,7 +73,6 @@ class ViroMaterials { result[key] = resultMaterial; } if (MaterialManager) { - console.log("ViroMaterials: Sending materials to native:", Object.keys(result)); MaterialManager.setJSMaterials(result); } else { @@ -96,7 +95,7 @@ class ViroMaterials { * * @param materialName - The name of the material to update * @param uniformName - The name of the uniform variable (e.g., "time") - * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4") + * @param uniformType - The type of the uniform ("float", "vec2", "vec3", "vec4", "mat4", "sampler2D") * @param value - The new value (number for float, array for vectors/matrices) * * @example diff --git a/dist/components/ReactVisionClient.d.ts b/dist/components/ReactVisionClient.d.ts new file mode 100644 index 00000000..30cbc35f --- /dev/null +++ b/dist/components/ReactVisionClient.d.ts @@ -0,0 +1,110 @@ +/** + * ReactVisionClient.ts + * + * Pure TypeScript / fetch() client for the ReactVision platform APIs. + * + * Use this for: + * - Geospatial Anchors (GPS-based, no AR frame data required) + * - Cloud Anchor metadata queries (list, search, delete) + * + * For hosting/resolving Cloud Anchors with visual feature data, use the + * native ViroARSceneNavigator.hostCloudAnchor() / resolveCloudAnchor() APIs + * which route through the ReactVisionCCA C++ library inside ViroCore. + * + * Copyright © 2026 ReactVision. All rights reserved. + * Proprietary and Confidential + */ +export interface RVGeospatialAnchor { + id: string; + project_id: string; + name?: string; + latitude: number; + longitude: number; + altitude?: number; + radius_m?: number; + heading?: number; + metadata?: Record; + created_at: string; + updated_at: string; +} +export interface RVCreateGeospatialAnchorParams { + project_id: string; + name?: string; + latitude: number; + longitude: number; + altitude?: number; + radius_m?: number; + heading?: number; + metadata?: Record; +} +export interface RVUpdateGeospatialAnchorParams { + name?: string; + latitude?: number; + longitude?: number; + altitude?: number; + radius_m?: number; + heading?: number; + metadata?: Record; +} +export interface RVNearbySearchParams { + latitude: number; + longitude: number; + radius_m: number; + project_id?: string; + limit?: number; +} +export interface RVListGeospatialParams { + project_id?: string; + limit?: number; + offset?: number; +} +export interface RVGeospatialListResult { + success: boolean; + data: RVGeospatialAnchor[]; + total?: number; +} +export interface RVCloudAnchor { + id: string; + project_id: string; + status: string; + descriptors_url?: string; + created_at: string; + expires_at?: string; +} +export interface RVApiResult { + success: boolean; + data?: T; + error?: string; +} +export declare class ReactVisionClient { + private readonly apiKey; + private readonly baseUrl; + /** + * @param apiKey ReactVision API key from platform.reactvision.xyz dashboard. + * @param baseUrl Optional override (defaults to https://platform.reactvision.xyz). + */ + constructor(apiKey: string, baseUrl?: string); + /** Create a geospatial (GPS-based) anchor. */ + createGeospatialAnchor(params: RVCreateGeospatialAnchorParams): Promise>; + /** Fetch a single geospatial anchor by ID. */ + getGeospatialAnchor(id: string): Promise>; + /** List geospatial anchors (optionally filtered by project). */ + listGeospatialAnchors(params?: RVListGeospatialParams): Promise>; + /** Find geospatial anchors within a radius (metres) of a GPS coordinate. */ + findNearbyGeospatialAnchors(params: RVNearbySearchParams): Promise>; + /** Update a geospatial anchor's fields. */ + updateGeospatialAnchor(id: string, params: RVUpdateGeospatialAnchorParams): Promise>; + /** Delete a geospatial anchor. */ + deleteGeospatialAnchor(id: string): Promise>; + /** Fetch metadata for a cloud anchor by ID. */ + getCloudAnchor(id: string): Promise>; + /** List cloud anchors for a project. */ + listCloudAnchors(projectId: string, limit?: number, offset?: number): Promise>; + /** Delete a cloud anchor. */ + deleteCloudAnchor(id: string): Promise>; + private _get; + private _post; + private _patch; + private _delete; + private _request; +} diff --git a/dist/components/ReactVisionClient.js b/dist/components/ReactVisionClient.js new file mode 100644 index 00000000..641ad128 --- /dev/null +++ b/dist/components/ReactVisionClient.js @@ -0,0 +1,139 @@ +"use strict"; +/** + * ReactVisionClient.ts + * + * Pure TypeScript / fetch() client for the ReactVision platform APIs. + * + * Use this for: + * - Geospatial Anchors (GPS-based, no AR frame data required) + * - Cloud Anchor metadata queries (list, search, delete) + * + * For hosting/resolving Cloud Anchors with visual feature data, use the + * native ViroARSceneNavigator.hostCloudAnchor() / resolveCloudAnchor() APIs + * which route through the ReactVisionCCA C++ library inside ViroCore. + * + * Copyright © 2026 ReactVision. All rights reserved. + * Proprietary and Confidential + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReactVisionClient = void 0; +// ============================================================================ +// Client +// ============================================================================ +class ReactVisionClient { + apiKey; + baseUrl; + /** + * @param apiKey ReactVision API key from platform.reactvision.xyz dashboard. + * @param baseUrl Optional override (defaults to https://platform.reactvision.xyz). + */ + constructor(apiKey, baseUrl = "https://platform.reactvision.xyz") { + this.apiKey = apiKey; + this.baseUrl = baseUrl.replace(/\/$/, ""); + } + // -------------------------------------------------------------------------- + // Geospatial Anchors + // -------------------------------------------------------------------------- + /** Create a geospatial (GPS-based) anchor. */ + async createGeospatialAnchor(params) { + return this._post("/functions/v1/geospatial-anchors", params); + } + /** Fetch a single geospatial anchor by ID. */ + async getGeospatialAnchor(id) { + return this._get(`/functions/v1/geospatial-anchors/${id}`); + } + /** List geospatial anchors (optionally filtered by project). */ + async listGeospatialAnchors(params = {}) { + const qs = new URLSearchParams(); + if (params.project_id) + qs.set("project_id", params.project_id); + if (params.limit != null) + qs.set("limit", String(params.limit)); + if (params.offset != null) + qs.set("offset", String(params.offset)); + const query = qs.toString() ? `?${qs}` : ""; + return this._get(`/functions/v1/geospatial-anchors${query}`); + } + /** Find geospatial anchors within a radius (metres) of a GPS coordinate. */ + async findNearbyGeospatialAnchors(params) { + return this._post("/functions/v1/geospatial-anchors/nearby", params); + } + /** Update a geospatial anchor's fields. */ + async updateGeospatialAnchor(id, params) { + return this._patch(`/functions/v1/geospatial-anchors/${id}`, params); + } + /** Delete a geospatial anchor. */ + async deleteGeospatialAnchor(id) { + return this._delete(`/functions/v1/geospatial-anchors/${id}`); + } + // -------------------------------------------------------------------------- + // Cloud Anchor metadata (read-only from JS; host/resolve go through native) + // -------------------------------------------------------------------------- + /** Fetch metadata for a cloud anchor by ID. */ + async getCloudAnchor(id) { + return this._get(`/cloud-anchors/${id}`); + } + /** List cloud anchors for a project. */ + async listCloudAnchors(projectId, limit = 50, offset = 0) { + return this._get(`/cloud-anchors?project_id=${projectId}&limit=${limit}&offset=${offset}`); + } + /** Delete a cloud anchor. */ + async deleteCloudAnchor(id) { + return this._delete(`/cloud-anchors/${id}`); + } + // -------------------------------------------------------------------------- + // Internal fetch helpers + // -------------------------------------------------------------------------- + async _get(path) { + return this._request("GET", path, undefined); + } + async _post(path, body) { + return this._request("POST", path, body); + } + async _patch(path, body) { + return this._request("PATCH", path, body); + } + async _delete(path) { + return this._request("DELETE", path, undefined); + } + async _request(method, path, body) { + try { + const response = await fetch(`${this.baseUrl}${path}`, { + method, + headers: { + "x-api-key": this.apiKey, + "Content-Type": "application/json", + }, + body: body !== undefined ? JSON.stringify(body) : undefined, + }); + const text = await response.text(); + let json = {}; + try { + json = JSON.parse(text); + } + catch { + if (!response.ok) { + return { success: false, error: `HTTP ${response.status}` }; + } + return { success: true }; + } + if (!response.ok) { + const msg = json.error || + json.message || + `HTTP ${response.status}`; + return { success: false, error: msg }; + } + // Geospatial API wraps data in { success, data }; Cloud Anchor API + // returns the object directly or in { anchor }. + const data = json.data ?? + json.anchor ?? + json; + return { success: true, data }; + } + catch (err) { + const msg = err instanceof Error ? err.message : String(err); + return { success: false, error: msg }; + } + } +} +exports.ReactVisionClient = ReactVisionClient; diff --git a/dist/components/Types/ViroEvents.d.ts b/dist/components/Types/ViroEvents.d.ts index f5f8dc61..f51e27f6 100644 --- a/dist/components/Types/ViroEvents.d.ts +++ b/dist/components/Types/ViroEvents.d.ts @@ -308,9 +308,11 @@ export type ViroSoundFinishEvent = any; */ export type ViroCloudAnchorState = "None" | "Success" | "ErrorInternal" | "TaskInProgress" | "ErrorNotAuthorized" | "ErrorResourceExhausted" | "ErrorHostingDatasetProcessingFailed" | "ErrorCloudIdNotFound" | "ErrorResolvingSdkVersionTooOld" | "ErrorResolvingSdkVersionTooNew" | "ErrorHostingServiceUnavailable"; /** - * Cloud anchor provider type. + * Unified AR provider — controls both cloud anchors and geospatial anchors. */ -export type ViroCloudAnchorProvider = "none" | "arcore"; +export type ViroProvider = "none" | "arcore" | "reactvision"; +/** @deprecated Use ViroProvider */ +export type ViroCloudAnchorProvider = ViroProvider; /** * Represents a cloud-hosted AR anchor. */ @@ -358,10 +360,8 @@ export type ViroCloudAnchorStateChangeEvent = { /** =========================================================================== * Viro Geospatial API Events and Types * ============================================================================ */ -/** - * Geospatial anchor provider type. - */ -export type ViroGeospatialAnchorProvider = "none" | "arcore"; +/** @deprecated Use ViroProvider */ +export type ViroGeospatialAnchorProvider = ViroProvider; /** * Earth tracking state. * Maps to GARSessionEarthState (iOS) and Earth.EarthState (Android) diff --git a/dist/components/Utilities/ViroUtils.d.ts b/dist/components/Utilities/ViroUtils.d.ts index 241ed9ee..6149430d 100644 --- a/dist/components/Utilities/ViroUtils.d.ts +++ b/dist/components/Utilities/ViroUtils.d.ts @@ -28,6 +28,27 @@ export declare function polarToCartesian(polarcoords: number[]): number[]; * phi - the yz-plane angle starting from y = 0 degrees */ export declare function polarToCartesianActual(polarcoords: number[]): number[]; +import type { ViroGeospatialPose } from "../Types/ViroEvents"; +/** + * Convert a lat/lng pair to Web Mercator coordinates (metres). + * Returns [x (Easting), y (Northing)]. + */ +export declare function latLngToMercator(lat: number, lng: number): [number, number]; +/** + * Convert a GPS position (lat/lng/alt) to an AR world-space offset from the + * device's current geospatial pose. + * + * Uses a Mercator projection for the horizontal plane and the device compass + * heading to rotate into the AR coordinate frame: + * +X = right, +Y = up, -Z = forward (right-hand rule) + * + * @param devicePose Current camera geospatial pose from getCameraGeospatialPose() + * @param anchorLat Target latitude in degrees + * @param anchorLng Target longitude in degrees + * @param anchorAlt Target altitude in metres (WGS84) + * @returns [arX, arY, arZ] position in metres relative to the device + */ +export declare function gpsToArWorld(devicePose: ViroGeospatialPose, anchorLat: number, anchorLng: number, anchorAlt: number): [number, number, number]; export interface ViroiOSArSupportResponse { isARSupported: boolean; } diff --git a/dist/components/Utilities/ViroUtils.js b/dist/components/Utilities/ViroUtils.js index f4e2e2c8..a7e2e319 100644 --- a/dist/components/Utilities/ViroUtils.js +++ b/dist/components/Utilities/ViroUtils.js @@ -12,6 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.polarToCartesian = polarToCartesian; exports.polarToCartesianActual = polarToCartesianActual; +exports.latLngToMercator = latLngToMercator; +exports.gpsToArWorld = gpsToArWorld; exports.isARSupportedOnDevice = isARSupportedOnDevice; /** * Convert the given polar coords of the form [r, theta, phi] to cartesian @@ -62,6 +64,55 @@ function polarToCartesianActual(polarcoords) { return cartesianCoords; } const react_native_1 = require("react-native"); +// --------------------------------------------------------------------------- +// Geospatial utilities — GPS ↔ AR world-space conversion +// --------------------------------------------------------------------------- +const EARTH_RADIUS_M = 6378137; // WGS84 equatorial radius in metres +/** + * Convert a lat/lng pair to Web Mercator coordinates (metres). + * Returns [x (Easting), y (Northing)]. + */ +function latLngToMercator(lat, lng) { + const x = EARTH_RADIUS_M * (lng * Math.PI) / 180; + const y = EARTH_RADIUS_M * + Math.log(Math.tan(Math.PI / 4 + (lat * Math.PI) / 360)); + return [x, y]; +} +/** + * Convert a GPS position (lat/lng/alt) to an AR world-space offset from the + * device's current geospatial pose. + * + * Uses a Mercator projection for the horizontal plane and the device compass + * heading to rotate into the AR coordinate frame: + * +X = right, +Y = up, -Z = forward (right-hand rule) + * + * @param devicePose Current camera geospatial pose from getCameraGeospatialPose() + * @param anchorLat Target latitude in degrees + * @param anchorLng Target longitude in degrees + * @param anchorAlt Target altitude in metres (WGS84) + * @returns [arX, arY, arZ] position in metres relative to the device + */ +function gpsToArWorld(devicePose, anchorLat, anchorLng, anchorAlt) { + const [devX, devY] = latLngToMercator(devicePose.latitude, devicePose.longitude); + const [ancX, ancY] = latLngToMercator(anchorLat, anchorLng); + // Delta in metres: East (X) and North (Y) + const deltaE = ancX - devX; + const deltaN = ancY - devY; + const deltaAlt = anchorAlt - devicePose.altitude; + // Bearing from device to anchor (clockwise from North, radians) + const bearing = Math.atan2(deltaE, deltaN); + const distance = Math.sqrt(deltaE * deltaE + deltaN * deltaN); + // Device compass heading: degrees CW from North → radians + const headingRad = (devicePose.heading * Math.PI) / 180; + // Relative bearing in device frame + const relBearing = bearing - headingRad; + // AR frame: +X = right, -Z = forward + return [ + distance * Math.sin(relBearing), // arX + deltaAlt, // arY (altitude difference) + -distance * Math.cos(relBearing), // arZ + ]; +} function isARSupportedOnDevice() { return new Promise((resolve, reject) => { if (react_native_1.Platform.OS == "ios") { diff --git a/dist/components/Utilities/ViroVersion.d.ts b/dist/components/Utilities/ViroVersion.d.ts index c756dd59..d606b4c4 100644 --- a/dist/components/Utilities/ViroVersion.d.ts +++ b/dist/components/Utilities/ViroVersion.d.ts @@ -1 +1 @@ -export declare const VIRO_VERSION = "2.52.1"; +export declare const VIRO_VERSION = "2.53.0"; diff --git a/dist/components/Utilities/ViroVersion.js b/dist/components/Utilities/ViroVersion.js index 12c41a80..cf9e47db 100644 --- a/dist/components/Utilities/ViroVersion.js +++ b/dist/components/Utilities/ViroVersion.js @@ -1,4 +1,4 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VIRO_VERSION = void 0; -exports.VIRO_VERSION = "2.52.1"; +exports.VIRO_VERSION = "2.53.0"; diff --git a/dist/index.d.ts b/dist/index.d.ts index 3eee477c..11080c20 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -52,10 +52,10 @@ import { ViroVRSceneNavigator } from "./components/ViroVRSceneNavigator"; import { Viro3DSceneNavigator } from "./components/Viro3DSceneNavigator"; import { ViroTextStyle } from "./components/Styles/ViroTextStyle"; import { ViroStyle } from "./components/Styles/ViroStyle"; -import { polarToCartesian, polarToCartesianActual, isARSupportedOnDevice, ViroARSupportResponse } from "./components/Utilities/ViroUtils"; +import { polarToCartesian, polarToCartesianActual, isARSupportedOnDevice, ViroARSupportResponse, latLngToMercator, gpsToArWorld } from "./components/Utilities/ViroUtils"; import { ViroARCamera } from "./components/AR/ViroARCamera"; -import { ViroHoverEvent, ViroClickEvent, ViroClickStateEvent, ViroTouchEvent, ViroScrollEvent, ViroSwipeEvent, ViroFuseEvent, ViroPinchEvent, ViroRotateEvent, ViroDragEvent, ViroPlatformEvent, ViroCollisionEvent, ViroPlatformInfo, ViroCameraTransformEvent, ViroPlatformUpdateEvent, ViroCameraTransform, ViroExitViroEvent, ViroErrorEvent, ViroAnimationStartEvent, ViroAnimationFinishEvent, ViroLoadStartEvent, ViroLoadEndEvent, ViroLoadErrorEvent, ViroVideoBufferStartEvent, ViroVideoBufferEndEvent, ViroVideoUpdateTimeEvent, ViroVideoErrorEvent, ViroVideoFinishEvent, ViroAnimatedComponentStartEvent, ViroAnimatedComponentFinishEvent, ViroARAnchorRemovedEvent, ViroARAnchorUpdatedEvent, ViroARAnchorFoundEvent, ViroAnchor, ViroAnchorFoundMap, ViroAnchorUpdatedMap, ViroPlaneUpdatedMap, ViroPlaneUpdatedEvent, ViroARPlaneSizes, ViroCameraARHitTestEvent, ViroCameraARHitTest, ViroARHitTestResult, ViroARPointCloudUpdateEvent, ViroARPointCloud, ViroTrackingUpdatedEvent, ViroTrackingState, ViroTrackingReason, ViroAmbientLightUpdateEvent, ViroAmbientLightInfo, ViroWorldOrigin, ViroNativeTransformUpdateEvent, ViroControllerStatusEvent, ViroControllerStatus, ViroPortalEnterEvent, ViroPortalExitEvent, ViroSoundFinishEvent, ViroPinchStateTypes, ViroClickStateTypes, ViroRotateStateTypes, ViroCloudAnchorState, ViroCloudAnchorProvider, ViroCloudAnchor, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroCloudAnchorStateChangeEvent, ViroGeospatialAnchorProvider, ViroEarthTrackingState, ViroVPSAvailability, ViroGeospatialAnchorType, ViroQuaternion, ViroGeospatialPose, ViroGeospatialAnchor, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroMonocularDepthSupportResult, ViroMonocularDepthModelAvailableResult, ViroMonocularDepthPreferenceResult } from "./components/Types/ViroEvents"; +import { ViroHoverEvent, ViroClickEvent, ViroClickStateEvent, ViroTouchEvent, ViroScrollEvent, ViroSwipeEvent, ViroFuseEvent, ViroPinchEvent, ViroRotateEvent, ViroDragEvent, ViroPlatformEvent, ViroCollisionEvent, ViroPlatformInfo, ViroCameraTransformEvent, ViroPlatformUpdateEvent, ViroCameraTransform, ViroExitViroEvent, ViroErrorEvent, ViroAnimationStartEvent, ViroAnimationFinishEvent, ViroLoadStartEvent, ViroLoadEndEvent, ViroLoadErrorEvent, ViroVideoBufferStartEvent, ViroVideoBufferEndEvent, ViroVideoUpdateTimeEvent, ViroVideoErrorEvent, ViroVideoFinishEvent, ViroAnimatedComponentStartEvent, ViroAnimatedComponentFinishEvent, ViroARAnchorRemovedEvent, ViroARAnchorUpdatedEvent, ViroARAnchorFoundEvent, ViroAnchor, ViroAnchorFoundMap, ViroAnchorUpdatedMap, ViroPlaneUpdatedMap, ViroPlaneUpdatedEvent, ViroARPlaneSizes, ViroCameraARHitTestEvent, ViroCameraARHitTest, ViroARHitTestResult, ViroARPointCloudUpdateEvent, ViroARPointCloud, ViroTrackingUpdatedEvent, ViroTrackingState, ViroTrackingReason, ViroAmbientLightUpdateEvent, ViroAmbientLightInfo, ViroWorldOrigin, ViroNativeTransformUpdateEvent, ViroControllerStatusEvent, ViroControllerStatus, ViroPortalEnterEvent, ViroPortalExitEvent, ViroSoundFinishEvent, ViroPinchStateTypes, ViroClickStateTypes, ViroRotateStateTypes, ViroProvider, ViroCloudAnchorState, ViroCloudAnchorProvider, ViroCloudAnchor, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroCloudAnchorStateChangeEvent, ViroGeospatialAnchorProvider, ViroEarthTrackingState, ViroVPSAvailability, ViroGeospatialAnchorType, ViroQuaternion, ViroGeospatialPose, ViroGeospatialAnchor, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroMonocularDepthSupportResult, ViroMonocularDepthModelAvailableResult, ViroMonocularDepthPreferenceResult } from "./components/Types/ViroEvents"; import { ViroSurface } from "./components/ViroSurface"; import { ViroSceneNavigator } from "./components/ViroSceneNavigator"; import { VIRO_VERSION } from "./components/Utilities/ViroVersion"; -export { ViroARImageMarker, ViroARObjectMarker, ViroARTrackingTargets, ViroARPlane, ViroARPlaneSelector, ViroARScene, ViroARSceneNavigator, ViroBox, ViroButton, ViroCamera, ViroController, ViroDirectionalLight, ViroFlexView, ViroGeometry, ViroLightingEnvironment, ViroImage, ViroMaterials, ViroARCamera, ViroMaterialVideo, ViroNode, ViroOmniLight, ViroOrbitCamera, ViroParticleEmitter, ViroPolygon, ViroPolyline, ViroPortal, ViroPortalScene, ViroQuad, ViroScene, ViroSurface, ViroSceneNavigator, ViroSkyBox, ViroAnimations, Viro3DObject, Viro360Image, Viro360Video, ViroAnimatedImage, ViroAmbientLight, ViroAnimatedComponent, ViroSound, ViroSoundField, ViroSpatialSound, ViroSphere, ViroSpinner, ViroSpotLight, ViroText, ViroVideo, ViroVRSceneNavigator, Viro3DSceneNavigator, ViroARTrackingReasonConstants, ViroRecordingErrorConstants, ViroTrackingStateConstants, polarToCartesian, polarToCartesianActual, isARSupportedOnDevice, ViroARSupportResponse, ViroHoverEvent, ViroClickEvent, ViroClickStateEvent, ViroClickStateTypes, ViroTouchEvent, ViroScrollEvent, ViroSwipeEvent, ViroFuseEvent, ViroPinchEvent, ViroPinchStateTypes, ViroRotateEvent, ViroRotateStateTypes, ViroDragEvent, ViroPlatformEvent, ViroCollisionEvent, ViroPlatformInfo, ViroCameraTransformEvent, ViroPlatformUpdateEvent, ViroCameraTransform, ViroExitViroEvent, ViroErrorEvent, ViroAnimationStartEvent, ViroAnimationFinishEvent, ViroLoadStartEvent, ViroLoadEndEvent, ViroLoadErrorEvent, ViroVideoBufferStartEvent, ViroVideoBufferEndEvent, ViroVideoUpdateTimeEvent, ViroVideoErrorEvent, ViroVideoFinishEvent, ViroAnimatedComponentStartEvent, ViroAnimatedComponentFinishEvent, ViroARAnchorRemovedEvent, ViroARAnchorUpdatedEvent, ViroARAnchorFoundEvent, ViroAnchor, ViroAnchorFoundMap, ViroAnchorUpdatedMap, ViroPlaneUpdatedMap, ViroPlaneUpdatedEvent, ViroARPlaneSizes, ViroCameraARHitTestEvent, ViroCameraARHitTest, ViroARHitTestResult, ViroARPointCloudUpdateEvent, ViroARPointCloud, ViroTrackingUpdatedEvent, ViroTrackingState, ViroTrackingReason, ViroAmbientLightUpdateEvent, ViroAmbientLightInfo, ViroWorldOrigin, ViroNativeTransformUpdateEvent, ViroControllerStatusEvent, ViroControllerStatus, ViroPortalEnterEvent, ViroPortalExitEvent, ViroSoundFinishEvent, ViroTextStyle, ViroStyle, ViroMaterial, ViroShaderModifiers, ViroShaderUniform, ViroShaderModifier, VIRO_VERSION, ViroCloudAnchorState, ViroCloudAnchorProvider, ViroCloudAnchor, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroCloudAnchorStateChangeEvent, ViroGeospatialAnchorProvider, ViroEarthTrackingState, ViroVPSAvailability, ViroGeospatialAnchorType, ViroQuaternion, ViroGeospatialPose, ViroGeospatialAnchor, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroMonocularDepthSupportResult, ViroMonocularDepthModelAvailableResult, ViroMonocularDepthPreferenceResult, }; +export { ViroARImageMarker, ViroARObjectMarker, ViroARTrackingTargets, ViroARPlane, ViroARPlaneSelector, ViroARScene, ViroARSceneNavigator, ViroBox, ViroButton, ViroCamera, ViroController, ViroDirectionalLight, ViroFlexView, ViroGeometry, ViroLightingEnvironment, ViroImage, ViroMaterials, ViroARCamera, ViroMaterialVideo, ViroNode, ViroOmniLight, ViroOrbitCamera, ViroParticleEmitter, ViroPolygon, ViroPolyline, ViroPortal, ViroPortalScene, ViroQuad, ViroScene, ViroSurface, ViroSceneNavigator, ViroSkyBox, ViroAnimations, Viro3DObject, Viro360Image, Viro360Video, ViroAnimatedImage, ViroAmbientLight, ViroAnimatedComponent, ViroSound, ViroSoundField, ViroSpatialSound, ViroSphere, ViroSpinner, ViroSpotLight, ViroText, ViroVideo, ViroVRSceneNavigator, Viro3DSceneNavigator, ViroARTrackingReasonConstants, ViroRecordingErrorConstants, ViroTrackingStateConstants, polarToCartesian, polarToCartesianActual, isARSupportedOnDevice, latLngToMercator, gpsToArWorld, ViroARSupportResponse, ViroHoverEvent, ViroClickEvent, ViroClickStateEvent, ViroClickStateTypes, ViroTouchEvent, ViroScrollEvent, ViroSwipeEvent, ViroFuseEvent, ViroPinchEvent, ViroPinchStateTypes, ViroRotateEvent, ViroRotateStateTypes, ViroDragEvent, ViroPlatformEvent, ViroCollisionEvent, ViroPlatformInfo, ViroCameraTransformEvent, ViroPlatformUpdateEvent, ViroCameraTransform, ViroExitViroEvent, ViroErrorEvent, ViroAnimationStartEvent, ViroAnimationFinishEvent, ViroLoadStartEvent, ViroLoadEndEvent, ViroLoadErrorEvent, ViroVideoBufferStartEvent, ViroVideoBufferEndEvent, ViroVideoUpdateTimeEvent, ViroVideoErrorEvent, ViroVideoFinishEvent, ViroAnimatedComponentStartEvent, ViroAnimatedComponentFinishEvent, ViroARAnchorRemovedEvent, ViroARAnchorUpdatedEvent, ViroARAnchorFoundEvent, ViroAnchor, ViroAnchorFoundMap, ViroAnchorUpdatedMap, ViroPlaneUpdatedMap, ViroPlaneUpdatedEvent, ViroARPlaneSizes, ViroCameraARHitTestEvent, ViroCameraARHitTest, ViroARHitTestResult, ViroARPointCloudUpdateEvent, ViroARPointCloud, ViroTrackingUpdatedEvent, ViroTrackingState, ViroTrackingReason, ViroAmbientLightUpdateEvent, ViroAmbientLightInfo, ViroWorldOrigin, ViroNativeTransformUpdateEvent, ViroControllerStatusEvent, ViroControllerStatus, ViroPortalEnterEvent, ViroPortalExitEvent, ViroSoundFinishEvent, ViroTextStyle, ViroStyle, ViroMaterial, ViroShaderModifiers, ViroShaderUniform, ViroShaderModifier, VIRO_VERSION, ViroProvider, ViroCloudAnchorState, ViroCloudAnchorProvider, ViroCloudAnchor, ViroHostCloudAnchorResult, ViroResolveCloudAnchorResult, ViroCloudAnchorStateChangeEvent, ViroGeospatialAnchorProvider, ViroEarthTrackingState, ViroVPSAvailability, ViroGeospatialAnchorType, ViroQuaternion, ViroGeospatialPose, ViroGeospatialAnchor, ViroGeospatialSupportResult, ViroEarthTrackingStateResult, ViroGeospatialPoseResult, ViroVPSAvailabilityResult, ViroCreateGeospatialAnchorResult, ViroMonocularDepthSupportResult, ViroMonocularDepthModelAvailableResult, ViroMonocularDepthPreferenceResult, }; diff --git a/dist/index.js b/dist/index.js index 6da873d7..a31a3b34 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ViroARTrackingReasonConstants = exports.Viro3DSceneNavigator = exports.ViroVRSceneNavigator = exports.ViroVideo = exports.ViroText = exports.ViroSpotLight = exports.ViroSpinner = exports.ViroSphere = exports.ViroSpatialSound = exports.ViroSoundField = exports.ViroSound = exports.ViroAnimatedComponent = exports.ViroAmbientLight = exports.ViroAnimatedImage = exports.Viro360Video = exports.Viro360Image = exports.Viro3DObject = exports.ViroAnimations = exports.ViroSkyBox = exports.ViroSceneNavigator = exports.ViroSurface = exports.ViroScene = exports.ViroQuad = exports.ViroPortalScene = exports.ViroPortal = exports.ViroPolyline = exports.ViroPolygon = exports.ViroParticleEmitter = exports.ViroOrbitCamera = exports.ViroOmniLight = exports.ViroNode = exports.ViroMaterialVideo = exports.ViroARCamera = exports.ViroMaterials = exports.ViroImage = exports.ViroLightingEnvironment = exports.ViroGeometry = exports.ViroFlexView = exports.ViroDirectionalLight = exports.ViroController = exports.ViroCamera = exports.ViroButton = exports.ViroBox = exports.ViroARSceneNavigator = exports.ViroARScene = exports.ViroARPlaneSelector = exports.ViroARPlane = exports.ViroARTrackingTargets = exports.ViroARObjectMarker = exports.ViroARImageMarker = void 0; -exports.VIRO_VERSION = exports.ViroRotateStateTypes = exports.ViroPinchStateTypes = exports.ViroClickStateTypes = exports.isARSupportedOnDevice = exports.polarToCartesianActual = exports.polarToCartesian = exports.ViroTrackingStateConstants = exports.ViroRecordingErrorConstants = void 0; +exports.VIRO_VERSION = exports.ViroRotateStateTypes = exports.ViroPinchStateTypes = exports.ViroClickStateTypes = exports.gpsToArWorld = exports.latLngToMercator = exports.isARSupportedOnDevice = exports.polarToCartesianActual = exports.polarToCartesian = exports.ViroTrackingStateConstants = exports.ViroRecordingErrorConstants = void 0; /** * Copyright (c) 2016-present, Viro Media, Inc. * All rights reserved. @@ -107,6 +107,8 @@ const ViroUtils_1 = require("./components/Utilities/ViroUtils"); Object.defineProperty(exports, "polarToCartesian", { enumerable: true, get: function () { return ViroUtils_1.polarToCartesian; } }); Object.defineProperty(exports, "polarToCartesianActual", { enumerable: true, get: function () { return ViroUtils_1.polarToCartesianActual; } }); Object.defineProperty(exports, "isARSupportedOnDevice", { enumerable: true, get: function () { return ViroUtils_1.isARSupportedOnDevice; } }); +Object.defineProperty(exports, "latLngToMercator", { enumerable: true, get: function () { return ViroUtils_1.latLngToMercator; } }); +Object.defineProperty(exports, "gpsToArWorld", { enumerable: true, get: function () { return ViroUtils_1.gpsToArWorld; } }); const ViroARCamera_1 = require("./components/AR/ViroARCamera"); Object.defineProperty(exports, "ViroARCamera", { enumerable: true, get: function () { return ViroARCamera_1.ViroARCamera; } }); const ViroEvents_1 = require("./components/Types/ViroEvents"); diff --git a/dist/plugins/withViro.d.ts b/dist/plugins/withViro.d.ts index 834b01b2..9ab5b104 100644 --- a/dist/plugins/withViro.d.ts +++ b/dist/plugins/withViro.d.ts @@ -1,17 +1,16 @@ import { ConfigPlugin } from "@expo/config-plugins"; export type XrMode = "GVR" | "AR" | "OVR_MOBILE"; /** - * Cloud Anchors provider type. - * - "none": Cloud Anchors disabled - * - "arcore": Use ARCore Cloud Anchors (works on both iOS and Android) + * Anchor provider type. + * - "none": Disabled + * - "arcore": Use ARCore Cloud Anchors / Geospatial API + * - "reactvision": Use ReactVision backend (requires libreactvisioncca) */ -export type CloudAnchorProvider = "none" | "arcore"; -/** - * Geospatial Anchor provider type. - * - "none": Geospatial API disabled - * - "arcore": Use ARCore Geospatial API (works on both iOS and Android) - */ -export type GeospatialAnchorProvider = "none" | "arcore"; +export type Provider = "none" | "arcore" | "reactvision"; +/** @deprecated Use Provider */ +export type CloudAnchorProvider = Provider; +/** @deprecated Use Provider */ +export type GeospatialAnchorProvider = Provider; /** * iOS framework linkage type. * - "dynamic": Use dynamic frameworks (required for ARCore SDK) @@ -27,15 +26,14 @@ export interface ViroConfigurationOptions { * When set to "dynamic", uses dynamic frameworks which is required for ARCore SDK. * When set to "static", uses static frameworks for smaller binary size. * - * Note: If using cloudAnchorProvider or geospatialAnchorProvider with "arcore", - * this will be automatically set to "dynamic" regardless of the configured value. + * Note: If using provider: "arcore", this will be automatically set to "dynamic". * * DEFAULTS TO: undefined (uses project default, typically static) */ iosLinkage?: IosLinkage; /** * Google Cloud API key for ARCore Cloud Anchors and Geospatial API. - * Required if using cloudAnchorProvider: "arcore" or geospatialAnchorProvider: "arcore" + * Required if using provider: "arcore". * * Get your API key from Google Cloud Console: * https://console.cloud.google.com/apis/credentials @@ -44,18 +42,38 @@ export interface ViroConfigurationOptions { */ googleCloudApiKey?: string; /** - * Cloud Anchors provider for cross-platform anchor sharing. - * When set to "arcore", enables ARCore Cloud Anchors on both iOS and Android. + * ReactVision API key for ReactVision Cloud Anchors and Geospatial API. + * Required if using provider: "reactvision" (the default). * - * DEFAULTS TO: "none" + * Written to AndroidManifest as com.reactvision.RVApiKey and to Info.plist as RVApiKey. */ - cloudAnchorProvider?: CloudAnchorProvider; + rvApiKey?: string; + /** + * ReactVision Project ID for ReactVision Cloud Anchors and Geospatial API. + * Required if using provider: "reactvision" (the default). + * + * Written to AndroidManifest as com.reactvision.RVProjectId and to Info.plist as RVProjectId. + */ + rvProjectId?: string; /** - * Geospatial Anchor provider for location-based AR. - * When set to "arcore", enables ARCore Geospatial API on both iOS and Android. - * Requires googleCloudApiKey to be set. + * Anchor provider for both cloud anchors and geospatial anchors. + * Replaces the deprecated cloudAnchorProvider + geospatialAnchorProvider props. * - * DEFAULTS TO: "none" + * - "reactvision": Use ReactVision backend (requires rvApiKey + rvProjectId) + * - "arcore": Use ARCore Cloud Anchors / Geospatial API (requires googleCloudApiKey) + * - "none": Disable both + * + * DEFAULTS TO: "reactvision" + */ + provider?: Provider; + /** + * @deprecated Use provider instead. + * Cloud Anchors provider. Overrides provider for cloud anchors only if set. + */ + cloudAnchorProvider?: CloudAnchorProvider; + /** + * @deprecated Use provider instead. + * Geospatial Anchor provider. Overrides provider for geospatial only if set. */ geospatialAnchorProvider?: GeospatialAnchorProvider; ios?: { @@ -92,12 +110,12 @@ export interface ViroConfigurationOptions { /** * Whether to include ARCore SDK pods. * When true, adds ARCore/CloudAnchors, ARCore/Geospatial, and ARCore/Semantics pods. - * This is automatically set to true when using cloudAnchorProvider or geospatialAnchorProvider with "arcore". + * This is automatically set to true when using provider: "arcore". * * ViroKit is built with weak linking, so ARCore pods are optional. * Without ARCore pods, cloud anchors, geospatial, and semantics features will be disabled at runtime. * - * DEFAULTS TO: false (unless cloudAnchorProvider or geospatialAnchorProvider is "arcore") + * DEFAULTS TO: false (unless provider is "arcore") */ includeARCore?: boolean; }; diff --git a/dist/plugins/withViroAndroid.js b/dist/plugins/withViroAndroid.js index 4027d88b..86c96f9a 100644 --- a/dist/plugins/withViroAndroid.js +++ b/dist/plugins/withViroAndroid.js @@ -166,6 +166,13 @@ const withViroManifest = (config) => (0, config_plugins_1.withAndroidManifest)(c const viroPlugin = config?.plugins?.find((plugin) => Array.isArray(plugin) && plugin[0] === "@reactvision/react-viro"); if (Array.isArray(viroPlugin) && viroPlugin.length > 1) { const pluginOptions = viroPlugin[1]; + // Resolve unified provider prop; old geospatialAnchorProvider overrides for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent) but provider + // is not explicitly set — avoids injecting location permissions for apps with no credentials. + const legacyOpts = pluginOptions; + const geospatialAnchorProvider = legacyOpts.geospatialAnchorProvider + ?? pluginOptions.provider + ?? (pluginOptions.rvApiKey ? "reactvision" : undefined); if (pluginOptions.googleCloudApiKey) { contents?.manifest?.application?.[0]["meta-data"]?.push({ $: { @@ -174,6 +181,37 @@ const withViroManifest = (config) => (0, config_plugins_1.withAndroidManifest)(c }, }); } + if (pluginOptions.rvApiKey) { + contents?.manifest?.application?.[0]["meta-data"]?.push({ + $: { + "android:name": "com.reactvision.RVApiKey", + "android:value": pluginOptions.rvApiKey, + }, + }); + } + if (pluginOptions.rvProjectId) { + contents?.manifest?.application?.[0]["meta-data"]?.push({ + $: { + "android:name": "com.reactvision.RVProjectId", + "android:value": pluginOptions.rvProjectId, + }, + }); + } + // Add location permissions when geospatial provider is active + if (geospatialAnchorProvider === "arcore" || geospatialAnchorProvider === "reactvision") { + const existingPermissions = (contents.manifest["uses-permission"] || []) + .map((p) => p.$?.["android:name"]); + if (!existingPermissions.includes("android.permission.ACCESS_FINE_LOCATION")) { + contents.manifest["uses-permission"].push({ + $: { "android:name": "android.permission.ACCESS_FINE_LOCATION" }, + }); + } + if (!existingPermissions.includes("android.permission.ACCESS_COARSE_LOCATION")) { + contents.manifest["uses-permission"].push({ + $: { "android:name": "android.permission.ACCESS_COARSE_LOCATION" }, + }); + } + } } if (viroPluginConfig.includes("GVR") || viroPluginConfig.includes("OVR_MOBILE")) { diff --git a/dist/plugins/withViroIos.js b/dist/plugins/withViroIos.js index 15ffdfc2..af1f5fc1 100644 --- a/dist/plugins/withViroIos.js +++ b/dist/plugins/withViroIos.js @@ -22,8 +22,12 @@ const withViroPods = (config) => { const pluginConfig = config?.plugins?.find((plugin) => Array.isArray(plugin) && plugin[0] === "@reactvision/react-viro"); if (Array.isArray(pluginConfig) && pluginConfig.length > 1) { const options = pluginConfig[1]; - cloudAnchorProvider = options.cloudAnchorProvider; - geospatialAnchorProvider = options.geospatialAnchorProvider; + // Resolve unified provider prop; old props override for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent). + const defaultProvider = options.rvApiKey ? "reactvision" : undefined; + const legacyOpts = options; + cloudAnchorProvider = legacyOpts.cloudAnchorProvider ?? options.provider ?? defaultProvider; + geospatialAnchorProvider = legacyOpts.geospatialAnchorProvider ?? options.provider ?? defaultProvider; iosLinkage = options.iosLinkage; includeARCore = options.ios?.includeARCore; } @@ -161,6 +165,8 @@ const withDefaultInfoPlist = (config, _props) => { let microphoneUsagePermission = withViro_1.DEFAULTS.ios.microphoneUsagePermission; let locationUsagePermission = withViro_1.DEFAULTS.ios.locationUsagePermission; let googleCloudApiKey; + let rvApiKey; + let rvProjectId; let cloudAnchorProvider; let geospatialAnchorProvider; let includeARCore; @@ -178,8 +184,14 @@ const withDefaultInfoPlist = (config, _props) => { locationUsagePermission = pluginOptions.ios?.locationUsagePermission || locationUsagePermission; googleCloudApiKey = pluginOptions.googleCloudApiKey; - cloudAnchorProvider = pluginOptions.cloudAnchorProvider; - geospatialAnchorProvider = pluginOptions.geospatialAnchorProvider; + rvApiKey = pluginOptions.rvApiKey; + rvProjectId = pluginOptions.rvProjectId; + // Resolve unified provider prop; old props override for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent). + const defaultProvider2 = pluginOptions.rvApiKey ? "reactvision" : undefined; + const legacyOpts2 = pluginOptions; + cloudAnchorProvider = legacyOpts2.cloudAnchorProvider ?? pluginOptions.provider ?? defaultProvider2; + geospatialAnchorProvider = legacyOpts2.geospatialAnchorProvider ?? pluginOptions.provider ?? defaultProvider2; includeARCore = pluginOptions.ios?.includeARCore; } } @@ -201,8 +213,15 @@ const withDefaultInfoPlist = (config, _props) => { if (googleCloudApiKey) { config.ios.infoPlist.GARAPIKey = googleCloudApiKey; } + // Add ReactVision credentials for ReactVision Cloud Anchors and Geospatial API (iOS) + if (rvApiKey) { + config.ios.infoPlist.RVApiKey = rvApiKey; + } + if (rvProjectId) { + config.ios.infoPlist.RVProjectId = rvProjectId; + } // Add location permissions for Geospatial API - if (geospatialAnchorProvider === "arcore" || includeARCore === true) { + if (geospatialAnchorProvider === "arcore" || geospatialAnchorProvider === "reactvision" || includeARCore === true) { config.ios.infoPlist.NSLocationWhenInUseUsageDescription = config.ios.infoPlist.NSLocationWhenInUseUsageDescription || locationUsagePermission; config.ios.infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription = diff --git a/index.ts b/index.ts index 2afdd439..a3d3ce09 100644 --- a/index.ts +++ b/index.ts @@ -67,6 +67,8 @@ import { polarToCartesianActual, isARSupportedOnDevice, ViroARSupportResponse, + latLngToMercator, + gpsToArWorld, } from "./components/Utilities/ViroUtils"; import { ViroARCamera } from "./components/AR/ViroARCamera"; import { @@ -129,6 +131,8 @@ import { ViroPinchStateTypes, ViroClickStateTypes, ViroRotateStateTypes, + // Provider Types + ViroProvider, // Cloud Anchor Types ViroCloudAnchorState, ViroCloudAnchorProvider, @@ -215,6 +219,8 @@ export { polarToCartesian, polarToCartesianActual, isARSupportedOnDevice, + latLngToMercator, + gpsToArWorld, // Types ViroARSupportResponse, ViroHoverEvent, @@ -283,6 +289,8 @@ export { ViroShaderUniform, ViroShaderModifier, VIRO_VERSION, + // Provider Types + ViroProvider, // Cloud Anchor Types ViroCloudAnchorState, ViroCloudAnchorProvider, diff --git a/ios/ViroReact.xcodeproj/project.pbxproj b/ios/ViroReact.xcodeproj/project.pbxproj index fc5c7440..bb91a478 100644 --- a/ios/ViroReact.xcodeproj/project.pbxproj +++ b/ios/ViroReact.xcodeproj/project.pbxproj @@ -2059,7 +2059,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "VIROREACT_DIST_PATH=${SRCROOT}/dist/\nVIRO_DEVICE_LIBRARY=$VIROREACT_DIST_PATH/armv7_arm64\nVIRO_SIMULATOR_LIBRARY=$VIROREACT_DIST_PATH/x86_64\n\n# Copy the static library (device or simulator) to dist folder\nif [ ${PLATFORM_NAME} = \"iphonesimulator\" ]; then\nmkdir -p $VIRO_SIMULATOR_LIBRARY\ncp -r $TARGET_BUILD_DIR/libViroReact.a $VIRO_SIMULATOR_LIBRARY\nelse\nmkdir -p $VIRO_DEVICE_LIBRARY\ncp -r $TARGET_BUILD_DIR/libViroReact.a $VIRO_DEVICE_LIBRARY\nfi\n\n# If both the device and simulator frameworks now exist, create the Universal framework\nif [ -f $VIRO_DEVICE_LIBRARY/libViroReact.a ] && [ -f $VIRO_SIMULATOR_LIBRARY/libViroReact.a ]; then\nlipo $VIRO_SIMULATOR_LIBRARY/libViroReact.a $VIRO_DEVICE_LIBRARY/libViroReact.a -create -output $VIROREACT_DIST_PATH/lib/libViroReact.a\nfi\n"; + shellScript = "VIROREACT_DIST_PATH=${SRCROOT}/dist/\n\nmkdir -p $VIROREACT_DIST_PATH/lib\ncp -r $TARGET_BUILD_DIR/libViroReact.a $VIROREACT_DIST_PATH/lib/libViroReact.a\n"; }; EDCFBBED88237D1EB61CD28B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; diff --git a/ios/ViroReact/AR/Managers/VRTARSceneNavigatorManager.mm b/ios/ViroReact/AR/Managers/VRTARSceneNavigatorManager.mm index 83ae2743..d9b4266f 100644 --- a/ios/ViroReact/AR/Managers/VRTARSceneNavigatorManager.mm +++ b/ios/ViroReact/AR/Managers/VRTARSceneNavigatorManager.mm @@ -46,6 +46,7 @@ @implementation VRTARSceneNavigatorManager RCT_EXPORT_VIEW_PROPERTY(shadowsEnabled, BOOL) RCT_EXPORT_VIEW_PROPERTY(multisamplingEnabled, BOOL) RCT_EXPORT_VIEW_PROPERTY(occlusionMode, NSString) +RCT_EXPORT_VIEW_PROPERTY(depthEnabled, BOOL) RCT_EXPORT_VIEW_PROPERTY(depthDebugEnabled, BOOL) RCT_EXPORT_VIEW_PROPERTY(cloudAnchorProvider, NSString) RCT_EXPORT_VIEW_PROPERTY(geospatialAnchorProvider, NSString) diff --git a/ios/ViroReact/AR/Modules/VRTARSceneNavigatorModule.mm b/ios/ViroReact/AR/Modules/VRTARSceneNavigatorModule.mm index 67f6752a..de147471 100644 --- a/ios/ViroReact/AR/Modules/VRTARSceneNavigatorModule.mm +++ b/ios/ViroReact/AR/Modules/VRTARSceneNavigatorModule.mm @@ -702,6 +702,58 @@ - (dispatch_queue_t)methodQueue { }]; } +RCT_EXPORT_METHOD(hostGeospatialAnchor:(nonnull NSNumber *)reactTag + latitude:(double)latitude + longitude:(double)longitude + altitude:(double)altitude + altitudeMode:(NSString *)altitudeMode + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + VRTARSceneNavigator *component = (VRTARSceneNavigator *)viewRegistry[reactTag]; + if (!component || ![component isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid component"}); + return; + } + [component hostGeospatialAnchor:latitude + longitude:longitude + altitude:altitude + altitudeMode:altitudeMode + completionHandler:^(BOOL success, NSString *platformUuid, NSString *error) { + if (success) { + resolve(@{@"success": @YES, @"anchorId": platformUuid}); + } else { + resolve(@{@"success": @NO, @"error": error ?: @"Unknown error"}); + } + }]; + }]; +} + +RCT_EXPORT_METHOD(resolveGeospatialAnchor:(nonnull NSNumber *)reactTag + platformUuid:(NSString *)platformUuid + quaternion:(id)quaternion + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + VRTARSceneNavigator *component = (VRTARSceneNavigator *)viewRegistry[reactTag]; + if (!component || ![component isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid component"}); + return; + } + [component resolveGeospatialAnchor:platformUuid + quaternion:quaternion + completionHandler:^(BOOL success, NSDictionary *anchorData, NSString *error) { + if (success) { + resolve(@{@"success": @YES, @"anchor": anchorData}); + } else { + resolve(@{@"success": @NO, @"error": error ?: @"Unknown error"}); + } + }]; + }]; +} + RCT_EXPORT_METHOD(removeGeospatialAnchor:(nonnull NSNumber *)reactTag anchorId:(NSString *)anchorId) { [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, @@ -714,6 +766,385 @@ - (dispatch_queue_t)methodQueue { }]; } +RCT_EXPORT_METHOD(rvGetGeospatialAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); + return; + } + VRTARSceneNavigator *component = (VRTARSceneNavigator *)view; + [component rvGetGeospatialAnchor:anchorId + completionHandler:^(BOOL success, NSDictionary *anchorData, NSString *error) { + NSMutableDictionary *result = [NSMutableDictionary new]; + [result setObject:@(success) forKey:@"success"]; + if (anchorData) [result setObject:anchorData forKey:@"anchor"]; + if (error) [result setObject:error forKey:@"error"]; + resolve(result); + }]; + } @catch (NSException *exception) { + resolve(@{@"success": @NO, @"error": exception.reason}); + } + }]; +} + +RCT_EXPORT_METHOD(rvFindNearbyGeospatialAnchors:(nonnull NSNumber *)reactTag + latitude:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); + return; + } + VRTARSceneNavigator *component = (VRTARSceneNavigator *)view; + [component rvFindNearbyGeospatialAnchors:latitude + longitude:longitude + radius:radius + limit:limit + completionHandler:^(BOOL success, NSArray *anchors, NSString *error) { + NSMutableDictionary *result = [NSMutableDictionary new]; + [result setObject:@(success) forKey:@"success"]; + [result setObject:anchors ?: @[] forKey:@"anchors"]; + if (error) [result setObject:error forKey:@"error"]; + resolve(result); + }]; + } @catch (NSException *exception) { + resolve(@{@"success": @NO, @"anchors": @[], @"error": exception.reason}); + } + }]; +} + +RCT_EXPORT_METHOD(rvUpdateGeospatialAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + sceneAssetId:(NSString *)sceneAssetId + sceneId:(NSString *)sceneId + name:(NSString *)name + userAssetId:(NSString *)userAssetId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); + return; + } + VRTARSceneNavigator *component = (VRTARSceneNavigator *)view; + [component rvUpdateGeospatialAnchor:anchorId + sceneAssetId:sceneAssetId + sceneId:sceneId + name:name + userAssetId:userAssetId + completionHandler:^(BOOL success, NSDictionary *anchorData, NSString *error) { + NSMutableDictionary *result = [NSMutableDictionary new]; + [result setObject:@(success) forKey:@"success"]; + if (anchorData) [result setObject:anchorData forKey:@"anchor"]; + if (error) [result setObject:error forKey:@"error"]; + resolve(result); + }]; + } @catch (NSException *exception) { + resolve(@{@"success": @NO, @"error": exception.reason}); + } + }]; +} + +RCT_EXPORT_METHOD(rvUploadAsset:(nonnull NSNumber *)reactTag + filePath:(NSString *)filePath + assetType:(NSString *)assetType + fileName:(NSString *)fileName + appUserId:(NSString *)appUserId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvUploadAsset:filePath assetType:assetType + fileName:fileName appUserId:appUserId + completionHandler:^(BOOL success, NSString *userAssetId, NSString *fileUrl, NSString *error) { + NSMutableDictionary *result = [NSMutableDictionary new]; + [result setObject:@(success) forKey:@"success"]; + if (userAssetId) [result setObject:userAssetId forKey:@"userAssetId"]; + if (fileUrl) [result setObject:fileUrl forKey:@"fileUrl"]; + if (error) [result setObject:error forKey:@"error"]; + resolve(result); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvDeleteGeospatialAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); + return; + } + VRTARSceneNavigator *component = (VRTARSceneNavigator *)view; + [component rvDeleteGeospatialAnchor:anchorId + completionHandler:^(BOOL success, NSString *error) { + NSMutableDictionary *result = [NSMutableDictionary new]; + [result setObject:@(success) forKey:@"success"]; + if (error) [result setObject:error forKey:@"error"]; + resolve(result); + }]; + } @catch (NSException *exception) { + resolve(@{@"success": @NO, @"error": exception.reason}); + } + }]; +} + +RCT_EXPORT_METHOD(rvListGeospatialAnchors:(nonnull NSNumber *)reactTag + limit:(NSInteger)limit + offset:(NSInteger)offset + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvListGeospatialAnchors:(int)limit offset:(int)offset + completionHandler:^(BOOL success, NSArray *anchors, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + [r setObject:success ? anchors : @[] forKey:@"anchors"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +// ── Cloud anchor management ─────────────────────────────────────────────────── + +RCT_EXPORT_METHOD(rvGetCloudAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvGetCloudAnchor:anchorId + completionHandler:^(BOOL success, NSDictionary *anchorData, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + if (anchorData) [r setObject:anchorData forKey:@"anchor"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvListCloudAnchors:(nonnull NSNumber *)reactTag + limit:(NSInteger)limit + offset:(NSInteger)offset + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvListCloudAnchors:(int)limit offset:(int)offset + completionHandler:^(BOOL success, NSArray *anchors, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + [r setObject:success ? anchors : @[] forKey:@"anchors"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvUpdateCloudAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + name:(NSString *)name + description:(NSString *)description + isPublic:(BOOL)isPublic + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvUpdateCloudAnchor:anchorId name:name description:description + isPublic:isPublic completionHandler:^(BOOL success, NSDictionary *anchorData, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + if (anchorData) [r setObject:anchorData forKey:@"anchor"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvDeleteCloudAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvDeleteCloudAnchor:anchorId + completionHandler:^(BOOL success, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvFindNearbyCloudAnchors:(nonnull NSNumber *)reactTag + latitude:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(NSInteger)limit + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvFindNearbyCloudAnchors:latitude longitude:longitude + radius:radius limit:(int)limit + completionHandler:^(BOOL success, NSArray *anchors, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + [r setObject:success ? anchors : @[] forKey:@"anchors"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvAttachAssetToCloudAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + fileUrl:(NSString *)fileUrl + fileSize:(double)fileSize + name:(NSString *)name + assetType:(NSString *)assetType + externalUserId:(NSString *)externalUserId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvAttachAssetToCloudAnchor:anchorId fileUrl:fileUrl + fileSize:(int64_t)fileSize name:name assetType:assetType externalUserId:externalUserId + completionHandler:^(BOOL success, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvRemoveAssetFromCloudAnchor:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + assetId:(NSString *)assetId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvRemoveAssetFromCloudAnchor:anchorId assetId:assetId + completionHandler:^(BOOL success, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(success) forKey:@"success"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + +RCT_EXPORT_METHOD(rvTrackCloudAnchorResolution:(nonnull NSNumber *)reactTag + anchorId:(NSString *)anchorId + success:(BOOL)success + confidence:(double)confidence + matchCount:(NSInteger)matchCount + inlierCount:(NSInteger)inlierCount + processingTimeMs:(NSInteger)processingTimeMs + platform:(NSString *)platform + externalUserId:(NSString *)externalUserId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, + NSDictionary *viewRegistry) { + @try { + VRTView *view = (VRTView *)viewRegistry[reactTag]; + if (![view isKindOfClass:[VRTARSceneNavigator class]]) { + resolve(@{@"success": @NO, @"error": @"Invalid view type"}); return; + } + [(VRTARSceneNavigator *)view rvTrackCloudAnchorResolution:anchorId success:success + confidence:confidence matchCount:(int)matchCount inlierCount:(int)inlierCount + processingTimeMs:(int)processingTimeMs platform:platform externalUserId:externalUserId + completionHandler:^(BOOL ok, NSString *error) { + NSMutableDictionary *r = [NSMutableDictionary new]; + [r setObject:@(ok) forKey:@"success"]; + if (error) [r setObject:error forKey:@"error"]; + resolve(r); + }]; + } @catch (NSException *ex) { resolve(@{@"success": @NO, @"error": ex.reason}); } + }]; +} + #pragma mark - Scene Semantics API Methods RCT_EXPORT_METHOD(isSemanticModeSupported:(nonnull NSNumber *)reactTag diff --git a/ios/ViroReact/AR/Views/VRTARScene.mm b/ios/ViroReact/AR/Views/VRTARScene.mm index 05fd58a5..7ce9c7f9 100644 --- a/ios/ViroReact/AR/Views/VRTARScene.mm +++ b/ios/ViroReact/AR/Views/VRTARScene.mm @@ -66,7 +66,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge { _vroArScene->initDeclarativeSession(); _vroArScene->setDelegate(_sceneDelegate); _vroArScene->getDeclarativeSession()->setDelegate(_sceneDelegate); - _nativeDetectionTypes = { VROAnchorDetection::PlanesHorizontal }; // default detection type is horizontal plane + _nativeDetectionTypes = { VROAnchorDetection::PlanesHorizontal, VROAnchorDetection::PlanesVertical }; _vroArScene->setAnchorDetectionTypes(_nativeDetectionTypes); } return self; diff --git a/ios/ViroReact/AR/Views/VRTARSceneNavigator.h b/ios/ViroReact/AR/Views/VRTARSceneNavigator.h index 18846081..5676975b 100644 --- a/ios/ViroReact/AR/Views/VRTARSceneNavigator.h +++ b/ios/ViroReact/AR/Views/VRTARSceneNavigator.h @@ -48,6 +48,7 @@ @property (nonatomic, readwrite) BOOL shadowsEnabled; @property (nonatomic, readwrite) BOOL multisamplingEnabled; @property (nonatomic, copy) NSString *occlusionMode; +@property (nonatomic, assign) BOOL depthEnabled; @property (nonatomic, assign) BOOL depthDebugEnabled; @property (nonatomic, copy) NSString *cloudAnchorProvider; @property (nonatomic, copy) NSString *geospatialAnchorProvider; @@ -150,6 +151,81 @@ typedef void (^GeospatialAnchorCompletionHandler)(BOOL success, - (void)removeGeospatialAnchor:(NSString *)anchorId; +// ReactVision-specific: save GPS anchor to backend (returns platform UUID), no local AR anchor +- (void)hostGeospatialAnchor:(double)latitude + longitude:(double)longitude + altitude:(double)altitude + altitudeMode:(NSString *)altitudeMode + completionHandler:(void (^)(BOOL success, NSString * _Nullable platformUuid, NSString * _Nullable error))completionHandler; + +// ReactVision-specific: fetch GPS coords from backend by UUID + create local AR anchor +- (void)resolveGeospatialAnchor:(NSString *)platformUuid + quaternion:(id)quaternion + completionHandler:(GeospatialAnchorCompletionHandler)completionHandler; + +// ReactVision Geospatial CRUD +- (void)rvGetGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvFindNearbyGeospatialAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvUpdateGeospatialAnchor:(NSString *)anchorId + sceneAssetId:(NSString *)sceneAssetId + sceneId:(NSString *)sceneId + name:(NSString *)name + userAssetId:(NSString *)userAssetId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvUploadAsset:(NSString *)filePath + assetType:(NSString *)assetType + fileName:(NSString *)fileName + appUserId:(NSString *)appUserId + completionHandler:(void (^)(BOOL success, NSString *userAssetId, NSString *fileUrl, NSString *error))completionHandler; +- (void)rvDeleteGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvListGeospatialAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; + +// Cloud anchor management +- (void)rvGetCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvListCloudAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvUpdateCloudAnchor:(NSString *)anchorId + name:(NSString *)name + description:(NSString *)description + isPublic:(BOOL)isPublic + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvDeleteCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvFindNearbyCloudAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvAttachAssetToCloudAnchor:(NSString *)anchorId + fileUrl:(NSString *)fileUrl + fileSize:(int64_t)fileSize + name:(NSString *)name + assetType:(NSString *)assetType + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvRemoveAssetFromCloudAnchor:(NSString *)anchorId + assetId:(NSString *)assetId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvTrackCloudAnchorResolution:(NSString *)anchorId + success:(BOOL)success + confidence:(double)confidence + matchCount:(int)matchCount + inlierCount:(int)inlierCount + processingTimeMs:(int)processingTimeMs + platform:(NSString *)platform + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; + #pragma mark - Scene Semantics API Methods // Check if Scene Semantics mode is supported on this device diff --git a/ios/ViroReact/AR/Views/VRTARSceneNavigator.mm b/ios/ViroReact/AR/Views/VRTARSceneNavigator.mm index f5568c6e..19c82088 100644 --- a/ios/ViroReact/AR/Views/VRTARSceneNavigator.mm +++ b/ios/ViroReact/AR/Views/VRTARSceneNavigator.mm @@ -58,6 +58,9 @@ @implementation VRTARSceneNavigator { BOOL _pendingWorldMeshEnabled; BOOL _needsWorldMeshApply; VROWorldMeshConfig _worldMeshConfigCpp; + + // depthEnabled: activate depth sensing without occlusion rendering + BOOL _depthEnabled; } - (instancetype)initWithBridge:(RCTBridge *)bridge { @@ -83,6 +86,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge { _bloomEnabled = YES; _shadowsEnabled = YES; _multisamplingEnabled = NO; + _depthEnabled = NO; } return self; } @@ -163,15 +167,12 @@ - (void)didSetProps:(NSArray *)changedProps { arSession->setVideoQuality(_vroVideoQuality); arSession->setNumberOfTrackedImages(_numberOfTrackedImages); - // Apply initial occlusion mode if set - if (_occlusionMode) { - VROOcclusionMode mode = VROOcclusionMode::Disabled; - if ([_occlusionMode caseInsensitiveCompare:@"depthBased"] == NSOrderedSame) { - mode = VROOcclusionMode::DepthBased; - } else if ([_occlusionMode caseInsensitiveCompare:@"peopleOnly"] == NSOrderedSame) { - mode = VROOcclusionMode::PeopleOnly; + // Apply initial occlusion mode (considers both occlusionMode and depthEnabled) + { + VROOcclusionMode mode = [self computeEffectiveOcclusionMode]; + if (mode != VROOcclusionMode::Disabled || _occlusionMode != nil || _depthEnabled) { + arSession->setOcclusionMode(mode); } - arSession->setOcclusionMode(mode); } // Apply initial depth debug setting if set @@ -479,19 +480,38 @@ - (void)setMultisamplingEnabled:(BOOL)multisamplingEnabled { _multisamplingEnabled = multisamplingEnabled; } +- (VROOcclusionMode)computeEffectiveOcclusionMode { + // Explicit occlusionMode prop always takes precedence. + // Guard against nil: in ObjC [nil caseInsensitiveCompare:] returns 0 == NSOrderedSame, + // which would incorrectly match "depthBased" when the prop is not set. + if (_occlusionMode != nil && [_occlusionMode caseInsensitiveCompare:@"depthBased"] == NSOrderedSame) + return VROOcclusionMode::DepthBased; + if (_occlusionMode != nil && [_occlusionMode caseInsensitiveCompare:@"peopleOnly"] == NSOrderedSame) + return VROOcclusionMode::PeopleOnly; + // depthEnabled activates depth sensing without occlusion rendering + if (_depthEnabled) + return VROOcclusionMode::DepthOnly; + return VROOcclusionMode::Disabled; +} + - (void)setOcclusionMode:(NSString *)occlusionMode { _occlusionMode = occlusionMode; if (_vroView) { VROViewAR *viewAR = (VROViewAR *) _vroView; std::shared_ptr arSession = [viewAR getARSession]; if (arSession) { - VROOcclusionMode mode = VROOcclusionMode::Disabled; - if ([occlusionMode caseInsensitiveCompare:@"depthBased"] == NSOrderedSame) { - mode = VROOcclusionMode::DepthBased; - } else if ([occlusionMode caseInsensitiveCompare:@"peopleOnly"] == NSOrderedSame) { - mode = VROOcclusionMode::PeopleOnly; - } - arSession->setOcclusionMode(mode); + arSession->setOcclusionMode([self computeEffectiveOcclusionMode]); + } + } +} + +- (void)setDepthEnabled:(BOOL)depthEnabled { + _depthEnabled = depthEnabled; + if (_vroView) { + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (arSession) { + arSession->setOcclusionMode([self computeEffectiveOcclusionMode]); } } } @@ -527,6 +547,24 @@ -(VROVector3f) projectPoint:(VROVector3f)point { return projectedPoint; } +#pragma mark - Cloud Anchor Helpers + +/** + * Improvement 2: split "message|StateString" encoded by the C++ layer + * (encodeError in VROCloudAnchorProviderReactVision.mm) into separate components. + * Falls back to [raw, "ErrorInternal"] when the separator is absent (ARCore path). + */ +static void splitErrorState(NSString *raw, NSString * __autoreleasing *outMsg, NSString * __autoreleasing *outState) { + NSRange sep = [raw rangeOfString:@"|" options:NSBackwardsSearch]; + if (sep.location != NSNotFound) { + *outMsg = [raw substringToIndex:sep.location]; + *outState = [raw substringFromIndex:sep.location + 1]; + } else { + *outMsg = raw; + *outState = @"ErrorInternal"; + } +} + #pragma mark - Cloud Anchor Methods - (void)setCloudAnchorProvider:(NSString *)cloudAnchorProvider { @@ -549,6 +587,19 @@ - (void)setCloudAnchorProvider:(NSString *)cloudAnchorProvider { } else { RCTLogWarn(@"[ViroAR] WARNING: GARAPIKey not found in Info.plist. Cloud anchors will not work!"); } + } else if ([cloudAnchorProvider caseInsensitiveCompare:@"reactvision"] == NSOrderedSame) { + arSession->setCloudAnchorProvider(VROCloudAnchorProvider::ReactVision); + RCTLogInfo(@"[ViroAR] ReactVision Cloud Anchors provider enabled"); + + // Check if ReactVision credentials are configured + NSString *rvApiKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"RVApiKey"]; + NSString *rvProjectId = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"RVProjectId"]; + if (!rvApiKey || rvApiKey.length == 0) { + RCTLogWarn(@"[ViroAR] WARNING: RVApiKey not found in Info.plist. ReactVision cloud anchors will not work!"); + } + if (!rvProjectId || rvProjectId.length == 0) { + RCTLogWarn(@"[ViroAR] WARNING: RVProjectId not found in Info.plist. ReactVision cloud anchors will not work!"); + } } else { arSession->setCloudAnchorProvider(VROCloudAnchorProvider::None); RCTLogInfo(@"[ViroAR] Cloud Anchors disabled"); @@ -614,10 +665,12 @@ - (void)hostCloudAnchor:(NSString *)anchorId } }, [completionHandler](std::string error) { - // Failure callback + // Failure callback — Improvement 2: parse encoded "|StateString" if (completionHandler) { - NSString *errorStr = [NSString stringWithUTF8String:error.c_str()]; - completionHandler(NO, nil, errorStr, @"ErrorInternal"); + NSString *raw = [NSString stringWithUTF8String:error.c_str()]; + NSString *msg, *state; + splitErrorState(raw, &msg, &state); + completionHandler(NO, nil, msg, state); } } ); @@ -665,10 +718,12 @@ - (void)resolveCloudAnchor:(NSString *)cloudAnchorId } }, [completionHandler](std::string error) { - // Failure callback + // Failure callback — Improvement 2: parse encoded "|StateString" if (completionHandler) { - NSString *errorStr = [NSString stringWithUTF8String:error.c_str()]; - completionHandler(NO, nil, errorStr, @"ErrorInternal"); + NSString *raw = [NSString stringWithUTF8String:error.c_str()]; + NSString *msg, *state; + splitErrorState(raw, &msg, &state); + completionHandler(NO, nil, msg, state); } } ); @@ -701,6 +756,17 @@ - (void)setGeospatialAnchorProvider:(NSString *)geospatialAnchorProvider { } else { RCTLogWarn(@"[ViroAR] WARNING: GARAPIKey not found in Info.plist. Geospatial features will not work!"); } + } else if ([geospatialAnchorProvider caseInsensitiveCompare:@"reactvision"] == NSOrderedSame) { + arSession->setGeospatialAnchorProvider(VROGeospatialAnchorProvider::ReactVision); + RCTLogInfo(@"[ViroAR] ReactVision Geospatial provider enabled"); + + // Check that credentials are present in Info.plist + NSString *rvApiKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"RVApiKey"]; + if (rvApiKey && rvApiKey.length > 0) { + RCTLogInfo(@"[ViroAR] RVApiKey found in Info.plist"); + } else { + RCTLogWarn(@"[ViroAR] WARNING: RVApiKey not found in Info.plist. ReactVision Geospatial will not work!"); + } } else { arSession->setGeospatialAnchorProvider(VROGeospatialAnchorProvider::None); RCTLogInfo(@"[ViroAR] Geospatial provider disabled"); @@ -955,6 +1021,76 @@ - (void)createGeospatialAnchor:(double)latitude ); } +- (void)hostGeospatialAnchor:(double)latitude + longitude:(double)longitude + altitude:(double)altitude + altitudeMode:(NSString *)altitudeMode + completionHandler:(void (^)(BOOL success, NSString *platformUuid, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, nil, @"AR session not available"); + return; + } + std::string modeStr = altitudeMode ? std::string([altitudeMode UTF8String]) : "street_level"; + arSession->hostGeospatialAnchor(latitude, longitude, altitude, modeStr, + [completionHandler](std::string platformUuid) { + if (completionHandler) { + completionHandler(YES, [NSString stringWithUTF8String:platformUuid.c_str()], nil); + } + }, + [completionHandler](std::string error) { + if (completionHandler) { + completionHandler(NO, nil, [NSString stringWithUTF8String:error.c_str()]); + } + } + ); +} + +- (void)resolveGeospatialAnchor:(NSString *)platformUuid + quaternion:(id)quaternion + completionHandler:(GeospatialAnchorCompletionHandler)completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, nil, @"AR session not available"); + return; + } + VROQuaternion quat = [self parseQuaternion:quaternion]; + std::string uuidStr = std::string([platformUuid UTF8String]); + arSession->resolveGeospatialAnchor(uuidStr, quat, + [completionHandler](std::shared_ptr anchor) { + if (completionHandler) { + VROMatrix4f transform = anchor->getTransform(); + VROVector3f position = transform.extractTranslation(); + NSDictionary *anchorData = @{ + @"anchorId": [NSString stringWithUTF8String:anchor->getId().c_str()], + @"type": @"WGS84", + @"latitude": @(anchor->getLatitude()), + @"longitude": @(anchor->getLongitude()), + @"altitude": @(anchor->getAltitude()), + @"heading": @(anchor->getHeading()), + @"position": @[@(position.x), @(position.y), @(position.z)] + }; + completionHandler(YES, anchorData, nil); + } + }, + [completionHandler](std::string error) { + if (completionHandler) { + completionHandler(NO, nil, [NSString stringWithUTF8String:error.c_str()]); + } + } + ); +} + - (void)createTerrainAnchor:(double)latitude longitude:(double)longitude altitudeAboveTerrain:(double)altitudeAboveTerrain @@ -1068,22 +1204,341 @@ - (void)removeGeospatialAnchor:(NSString *)anchorId { return; } - // Find the geospatial anchor by ID and remove it + // Geospatial anchors are not in the ARKit frame anchor list (they are GPS-computed, + // not ARKit-tracked). Construct a minimal anchor with just the ID and delegate + // removal to the session, which uses getId() for the backend API call. std::string anchorIdStr = std::string([anchorId UTF8String]); - std::unique_ptr &frame = arSession->getLastFrame(); - if (frame) { - const std::vector> &anchors = frame->getAnchors(); - for (const auto &anchor : anchors) { - if (anchor->getId() == anchorIdStr) { - std::shared_ptr geoAnchor = - std::dynamic_pointer_cast(anchor); - if (geoAnchor) { - arSession->removeGeospatialAnchor(geoAnchor); - break; + auto geoAnchor = std::make_shared( + VROGeospatialAnchorType::WGS84, 0, 0, 0, VROQuaternion()); + geoAnchor->setId(anchorIdStr); + arSession->removeGeospatialAnchor(geoAnchor); +} + +static NSDictionary *rvParseAnchorJson(NSString *json) { + NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) return nil; + return [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; +} + +static NSArray *rvParseAnchorArrayJson(NSString *json) { + NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) return @[]; + id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + return [obj isKindOfClass:[NSArray class]] ? obj : @[]; +} + +- (void)rvGetGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, nil, @"AR session not available"); + return; + } + arSession->rvGetGeospatialAnchor( + std::string([anchorId UTF8String]), + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + if (success) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(YES, rvParseAnchorJson(jsonStr), nil); + } else { + completionHandler(NO, nil, [NSString stringWithUTF8String:error.c_str()]); } } - } + }); +} + +- (void)rvFindNearbyGeospatialAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, @[], @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, @[], @"AR session not available"); + return; + } + arSession->rvFindNearbyGeospatialAnchors(latitude, longitude, radius, limit, + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + if (success) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(YES, rvParseAnchorArrayJson(jsonStr), nil); + } else { + completionHandler(NO, @[], [NSString stringWithUTF8String:error.c_str()]); + } + } + }); +} + +- (void)rvUpdateGeospatialAnchor:(NSString *)anchorId + sceneAssetId:(NSString *)sceneAssetId + sceneId:(NSString *)sceneId + name:(NSString *)name + userAssetId:(NSString *)userAssetId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, nil, @"AR session not available"); + return; + } + arSession->rvUpdateGeospatialAnchor( + std::string([anchorId UTF8String]), + sceneAssetId ? std::string([sceneAssetId UTF8String]) : "", + sceneId ? std::string([sceneId UTF8String]) : "", + name ? std::string([name UTF8String]) : "", + userAssetId ? std::string([userAssetId UTF8String]) : "", + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + if (success) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(YES, rvParseAnchorJson(jsonStr), nil); + } else { + completionHandler(NO, nil, [NSString stringWithUTF8String:error.c_str()]); + } + } + }); +} + +- (void)rvUploadAsset:(NSString *)filePath + assetType:(NSString *)assetType + fileName:(NSString *)fileName + appUserId:(NSString *)appUserId + completionHandler:(void (^)(BOOL success, NSString *userAssetId, NSString *fileUrl, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, nil, nil, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, nil, nil, @"AR session not available"); + return; + } + arSession->rvUploadAsset( + std::string([filePath UTF8String]), + assetType ? std::string([assetType UTF8String]) : "", + fileName ? std::string([fileName UTF8String]) : "", + appUserId ? std::string([appUserId UTF8String]) : "", + [completionHandler](bool success, std::string assetId, std::string fileUrl, std::string error) { + if (completionHandler) { + if (success) { + completionHandler(YES, + [NSString stringWithUTF8String:assetId.c_str()], + [NSString stringWithUTF8String:fileUrl.c_str()], + nil); + } else { + completionHandler(NO, nil, nil, [NSString stringWithUTF8String:error.c_str()]); + } + } + }); +} + +- (void)rvDeleteGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler { + if (!_vroView) { + if (completionHandler) completionHandler(NO, @"AR view not initialized"); + return; + } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { + if (completionHandler) completionHandler(NO, @"AR session not available"); + return; } + arSession->rvDeleteGeospatialAnchor( + std::string([anchorId UTF8String]), + [completionHandler](bool success, std::string error) { + if (completionHandler) { + completionHandler(success, success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +- (void)rvListGeospatialAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL, NSArray *, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @[], @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @[], @"AR session not available"); return; } + arSession->rvListGeospatialAnchors(limit, offset, + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(success, success ? rvParseAnchorArrayJson(jsonStr) : @[], + success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +// ── Cloud anchor management ─────────────────────────────────────────────────── + +- (void)rvGetCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL, NSDictionary *, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, nil, @"AR session not available"); return; } + arSession->rvGetCloudAnchor(std::string([anchorId UTF8String]), + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(success, success ? rvParseAnchorJson(jsonStr) : nil, + success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +- (void)rvListCloudAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL, NSArray *, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @[], @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @[], @"AR session not available"); return; } + arSession->rvListCloudAnchors(limit, offset, + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(success, success ? rvParseAnchorArrayJson(jsonStr) : @[], + success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +- (void)rvUpdateCloudAnchor:(NSString *)anchorId + name:(NSString *)name + description:(NSString *)description + isPublic:(BOOL)isPublic + completionHandler:(void (^)(BOOL, NSDictionary *, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, nil, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, nil, @"AR session not available"); return; } + arSession->rvUpdateCloudAnchor( + std::string([anchorId UTF8String]), + name ? std::string([name UTF8String]) : "", + description ? std::string([description UTF8String]) : "", + (bool)isPublic, + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(success, success ? rvParseAnchorJson(jsonStr) : nil, + success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +- (void)rvDeleteCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @"AR session not available"); return; } + arSession->rvDeleteCloudAnchor(std::string([anchorId UTF8String]), + [completionHandler](bool success, std::string error) { + if (completionHandler) + completionHandler(success, success ? nil : [NSString stringWithUTF8String:error.c_str()]); + }); +} + +- (void)rvFindNearbyCloudAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL, NSArray *, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @[], @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @[], @"AR session not available"); return; } + arSession->rvFindNearbyCloudAnchors(latitude, longitude, radius, limit, + [completionHandler](bool success, std::string jsonData, std::string error) { + if (completionHandler) { + NSString *jsonStr = [NSString stringWithUTF8String:jsonData.c_str()]; + completionHandler(success, success ? rvParseAnchorArrayJson(jsonStr) : @[], + success ? nil : [NSString stringWithUTF8String:error.c_str()]); + } + }); +} + +- (void)rvAttachAssetToCloudAnchor:(NSString *)anchorId + fileUrl:(NSString *)fileUrl + fileSize:(int64_t)fileSize + name:(NSString *)name + assetType:(NSString *)assetType + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @"AR session not available"); return; } + arSession->rvAttachAssetToCloudAnchor( + std::string([anchorId UTF8String]), + std::string([fileUrl UTF8String]), + fileSize, + name ? std::string([name UTF8String]) : "", + assetType ? std::string([assetType UTF8String]) : "", + externalUserId ? std::string([externalUserId UTF8String]) : "", + [completionHandler](bool success, std::string error) { + if (completionHandler) + completionHandler(success, success ? nil : [NSString stringWithUTF8String:error.c_str()]); + }); +} + +- (void)rvRemoveAssetFromCloudAnchor:(NSString *)anchorId + assetId:(NSString *)assetId + completionHandler:(void (^)(BOOL, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @"AR session not available"); return; } + arSession->rvRemoveAssetFromCloudAnchor( + std::string([anchorId UTF8String]), + std::string([assetId UTF8String]), + [completionHandler](bool success, std::string error) { + if (completionHandler) + completionHandler(success, success ? nil : [NSString stringWithUTF8String:error.c_str()]); + }); +} + +- (void)rvTrackCloudAnchorResolution:(NSString *)anchorId + success:(BOOL)success + confidence:(double)confidence + matchCount:(int)matchCount + inlierCount:(int)inlierCount + processingTimeMs:(int)processingTimeMs + platform:(NSString *)platform + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL, NSString *))completionHandler { + if (!_vroView) { if (completionHandler) completionHandler(NO, @"AR view not initialized"); return; } + VROViewAR *viewAR = (VROViewAR *) _vroView; + std::shared_ptr arSession = [viewAR getARSession]; + if (!arSession) { if (completionHandler) completionHandler(NO, @"AR session not available"); return; } + arSession->rvTrackCloudAnchorResolution( + std::string([anchorId UTF8String]), + (bool)success, confidence, matchCount, inlierCount, processingTimeMs, + platform ? std::string([platform UTF8String]) : "", + externalUserId ? std::string([externalUserId UTF8String]) : "", + [completionHandler](bool ok, std::string error) { + if (completionHandler) + completionHandler(ok, ok ? nil : [NSString stringWithUTF8String:error.c_str()]); + }); } #pragma mark - Scene Semantics API Methods diff --git a/ios/ViroReact/Modules/VRTMaterialManager.mm b/ios/ViroReact/Modules/VRTMaterialManager.mm index 15d98de6..e9134bf1 100644 --- a/ios/ViroReact/Modules/VRTMaterialManager.mm +++ b/ios/ViroReact/Modules/VRTMaterialManager.mm @@ -405,6 +405,9 @@ - (MaterialWrapper *)createMaterial:(NSDictionary *)material name:(NSString *)ma // Handle both string and dictionary formats NSString *modifierCode; + NSArray *varyingsArray = nil; + BOOL requiresSceneDepth = NO; + BOOL requiresCameraTexture = NO; if ([modifierValue isKindOfClass:[NSString class]]) { modifierCode = (NSString *)modifierValue; } else if ([modifierValue isKindOfClass:[NSDictionary class]]) { @@ -416,24 +419,57 @@ - (MaterialWrapper *)createMaterial:(NSDictionary *)material name:(NSString *)ma } else { modifierCode = body; } - + if (!modifierCode) { RCTLogError(@"Shader modifier dictionary must contain 'body' or 'uniforms' key"); continue; } + + // Extract varyings if present + if (modifierDict[@"varyings"] && [modifierDict[@"varyings"] isKindOfClass:[NSArray class]]) { + varyingsArray = (NSArray *)modifierDict[@"varyings"]; + } + + // Extract requiresSceneDepth flag + if (modifierDict[@"requiresSceneDepth"]) { + requiresSceneDepth = [modifierDict[@"requiresSceneDepth"] boolValue]; + } + // Extract requiresCameraTexture flag + if (modifierDict[@"requiresCameraTexture"]) { + requiresCameraTexture = [modifierDict[@"requiresCameraTexture"] boolValue]; + } } else { RCTLogError(@"Shader modifier must be string or dictionary with 'body' key"); continue; } - + VROShaderEntryPoint entryPoint = [self convertEntryPoint:entryPointName]; NSArray *lines = [modifierCode componentsSeparatedByString:@"\n"]; std::vector linesVec; for (NSString *line in lines) { linesVec.push_back(std::string([line UTF8String])); } - + auto modifier = std::make_shared(entryPoint, linesVec); + + // Set varyings if present + if (varyingsArray && varyingsArray.count > 0) { + std::vector varyings; + for (NSString *varying in varyingsArray) { + varyings.push_back(std::string([varying UTF8String])); + } + modifier->setVaryings(varyings); + } + + // Set requiresSceneDepth if flagged + if (requiresSceneDepth) { + modifier->setRequiresSceneDepth(true); + } + // Set requiresCameraTexture if flagged + if (requiresCameraTexture) { + modifier->setRequiresCameraTexture(true); + } + vroMaterial->addShaderModifier(modifier); } } else if ([@"materialUniforms" caseInsensitiveCompare:materialPropertyName] == NSOrderedSame || @@ -479,6 +515,11 @@ - (void)setUniformForMaterial:(std::shared_ptr)vroMaterial } } else if ([type isEqualToString:@"mat4"]) { // TODO: parse matrix + } else if ([type isEqualToString:@"sampler2D"]) { + std::shared_ptr texture = [self createTexture2D:value sRGB:YES]; + if (texture) { + vroMaterial->setShaderUniform(std::string([name UTF8String]), texture); + } } } diff --git a/ios/ViroReact/Views/VRT3DObject.mm b/ios/ViroReact/Views/VRT3DObject.mm index 43b1d44f..b1d17c09 100644 --- a/ios/ViroReact/Views/VRT3DObject.mm +++ b/ios/ViroReact/Views/VRT3DObject.mm @@ -214,7 +214,8 @@ - (void)didSetProps:(NSArray *)changedProps { [strongSelf setMorphTargets:strongSelf->_morphTargets]; if (strongSelf.materials) { - // Apply materials recursively to all child geometries in the loaded model + // Apply materials recursively so child geometry nodes (sub-meshes) of the model + // also receive the rendering properties, but textures are preserved via merge logic. [strongSelf applyMaterialsRecursive:YES]; } diff --git a/ios/ViroReact/Views/VRTNode.mm b/ios/ViroReact/Views/VRTNode.mm index 93d9fdec..4a9a4aea 100644 --- a/ios/ViroReact/Views/VRTNode.mm +++ b/ios/ViroReact/Views/VRTNode.mm @@ -91,9 +91,12 @@ @interface VRTNode () { // Store original embedded materials from GLB before any shader overrides // This allows us to always start from the true baseline when switching shaders std::vector> _originalEmbeddedMaterials; - // Store original materials for child nodes (to preserve skinning modifiers, etc.) + // Store original materials for child nodes (used by applyShaderOverridesRecursive:) // Maps node pointer to its original materials vector std::unordered_map>> _childNodeOriginalMaterials; + // Store original embedded materials for child nodes used by applyMaterialsRecursive: + // Kept separate from _childNodeOriginalMaterials to avoid interference with shader overrides + std::unordered_map>> _childNodeMaterialMergeOriginals; } // Track shader override materials and their clones for uniform updates @property (nonatomic, strong) NSMutableDictionary *shaderOverrideMap; @@ -684,46 +687,61 @@ - (void)applyMaterialsRecursive:(BOOL)recursive { [self updateVideoTextures]; - // Recursively apply materials to all child nodes if requested - if (recursive) { + // Recursively merge material rendering properties onto child node embedded materials. + // This preserves embedded textures and skinning modifiers while applying user-specified + // rendering settings (lighting model, bloom, blend mode, etc.) from the first override material. + if (recursive && self.materials && self.materials.count > 0) { VRTMaterialManager *materialManager = [self.bridge moduleForClass:[VRTMaterialManager class]]; - std::vector> tempMaterials; + NSString *firstMaterialName = self.materials[0]; + std::shared_ptr overrideMaterial = [materialManager getMaterialByName:firstMaterialName]; + + if (overrideMaterial) { + std::function)> applyToChildren = [&](std::shared_ptr node) { + for (std::shared_ptr child : node->getChildNodes()) { + std::shared_ptr childGeometry = child->getGeometry(); + if (childGeometry) { + VRONode *childPtr = child.get(); + std::vector> childOriginalMaterials; + + // Save original embedded materials on first call; use stored ones thereafter + if (_childNodeMaterialMergeOriginals.find(childPtr) == _childNodeMaterialMergeOriginals.end()) { + childOriginalMaterials = childGeometry->getMaterials(); + if (!childOriginalMaterials.empty()) { + _childNodeMaterialMergeOriginals[childPtr] = childOriginalMaterials; + } + } else { + childOriginalMaterials = _childNodeMaterialMergeOriginals[childPtr]; + } - if (self.materials) { - // Build materials list from material names - always copy - for (int i = 0; i < self.materials.count; i++) { - NSString *materialName = [self.materials objectAtIndex:i]; - std::shared_ptr sourceMaterial = [materialManager getMaterialByName:materialName]; - if (sourceMaterial) { - // Always copy to prevent state persistence - tempMaterials.push_back(std::make_shared(sourceMaterial)); - } - } - } else { - // No materials - use default empty material for cleanup - tempMaterials.push_back(std::make_shared()); - } + if (!childOriginalMaterials.empty()) { + std::vector> mergedChildMaterials; + for (const auto &originalMat : childOriginalMaterials) { + // Copy embedded material — preserves textures and skinning modifiers + std::shared_ptr mergedMat = std::make_shared(originalMat); - // Apply to all child nodes recursively - std::function)> applyToChildren = [&](std::shared_ptr node) { - for (std::shared_ptr child : node->getChildNodes()) { - std::shared_ptr childGeometry = child->getGeometry(); - if (childGeometry) { - // Always create fresh copies for each child geometry - std::vector> childMaterials; - for (const auto &mat : tempMaterials) { - childMaterials.push_back(std::make_shared(mat)); + // Apply rendering properties from the user override only (NOT colors/textures) + mergedMat->setLightingModel(overrideMaterial->getLightingModel()); + mergedMat->setBloomThreshold(overrideMaterial->getBloomThreshold()); + mergedMat->setShininess(overrideMaterial->getShininess()); + mergedMat->setBlendMode(overrideMaterial->getBlendMode()); + mergedMat->setTransparencyMode(overrideMaterial->getTransparencyMode()); + mergedMat->setCullMode(overrideMaterial->getCullMode()); + mergedMat->setWritesToDepthBuffer(overrideMaterial->getWritesToDepthBuffer()); + mergedMat->setReadsFromDepthBuffer(overrideMaterial->getReadsFromDepthBuffer()); + + mergedChildMaterials.push_back(mergedMat); + } + childGeometry->setMaterials(mergedChildMaterials); + childGeometry->updateSubstrate(); + } } - childGeometry->setMaterials(childMaterials); - // Force geometry substrate to reset - childGeometry->updateSubstrate(); + // Recurse to grandchildren + applyToChildren(child); } - // Recurse to grandchildren - applyToChildren(child); - } - }; + }; - applyToChildren(self.node); + applyToChildren(self.node); + } } } diff --git a/ios/dist/ViroRenderer/ViroKit.framework/ARCoreCoreMLSemanticsResources.bundle/Info.plist b/ios/dist/ViroRenderer/ViroKit.framework/ARCoreCoreMLSemanticsResources.bundle/Info.plist index 2eaf6527..6e21c5a9 100644 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/ARCoreCoreMLSemanticsResources.bundle/Info.plist and b/ios/dist/ViroRenderer/ViroKit.framework/ARCoreCoreMLSemanticsResources.bundle/Info.plist differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/ARCoreResources.bundle/Info.plist b/ios/dist/ViroRenderer/ViroKit.framework/ARCoreResources.bundle/Info.plist index 5ea2d1e0..631d814f 100644 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/ARCoreResources.bundle/Info.plist and b/ios/dist/ViroRenderer/ViroKit.framework/ARCoreResources.bundle/Info.plist differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/Info.plist b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/Info.plist deleted file mode 100755 index 53ec6552..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/Info.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - CFBundleIdentifier - com.generic.bundleidentifier - - diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ar.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ar.lproj/CardboardSDK.strings deleted file mode 100755 index cdf62aa9..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ar.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/arrowRight.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/arrowRight.png deleted file mode 100755 index 90c573a9..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/arrowRight.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ca.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ca.lproj/CardboardSDK.strings deleted file mode 100755 index 28b26063..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ca.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cardboardLogotype.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cardboardLogotype.png deleted file mode 100755 index 207c086a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cardboardLogotype.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/continueButton.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/continueButton.png deleted file mode 100755 index e84d29f6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/continueButton.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cs.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cs.lproj/CardboardSDK.strings deleted file mode 100755 index 76b30855..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/cs.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/da.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/da.lproj/CardboardSDK.strings deleted file mode 100755 index 28d39501..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/da.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/de.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/de.lproj/CardboardSDK.strings deleted file mode 100755 index 4ccc0623..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/de.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/el.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/el.lproj/CardboardSDK.strings deleted file mode 100755 index 0251f528..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/el.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en.lproj/CardboardSDK.strings deleted file mode 100755 index f2b07c33..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_AU.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_AU.lproj/CardboardSDK.strings deleted file mode 100755 index 057c9ca7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_AU.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_GB.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_GB.lproj/CardboardSDK.strings deleted file mode 100755 index 057c9ca7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_GB.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_IN.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_IN.lproj/CardboardSDK.strings deleted file mode 100755 index 057c9ca7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/en_IN.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es.lproj/CardboardSDK.strings deleted file mode 100755 index de9cf85b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es_MX.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es_MX.lproj/CardboardSDK.strings deleted file mode 100755 index a5ca4670..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/es_MX.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fi.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fi.lproj/CardboardSDK.strings deleted file mode 100755 index 2df0408d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fi.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fr.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fr.lproj/CardboardSDK.strings deleted file mode 100755 index b5041fbc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/fr.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/gearButton.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/gearButton.png deleted file mode 100755 index bc726d7e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/gearButton.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/he.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/he.lproj/CardboardSDK.strings deleted file mode 100755 index c03896d6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/he.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hi.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hi.lproj/CardboardSDK.strings deleted file mode 100755 index f3d17674..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hi.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hr.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hr.lproj/CardboardSDK.strings deleted file mode 100755 index fdf8f805..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hr.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hu.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hu.lproj/CardboardSDK.strings deleted file mode 100755 index 3a958806..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/hu.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@1x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@1x.png deleted file mode 100755 index d571552f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@1x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@2x.png deleted file mode 100755 index 151fe88d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@3x.png deleted file mode 100755 index 2adff593..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_back_white@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward.png deleted file mode 100755 index 552d40de..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@2x.png deleted file mode 100755 index 878b6e5e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@3x.png deleted file mode 100755 index a5042fdd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_arrow_forward@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard.png deleted file mode 100755 index 0d1cd170..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@2x.png deleted file mode 100755 index 3ee47e8c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@3x.png deleted file mode 100755 index 234ddf0b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_cardboard@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen.png deleted file mode 100755 index 20fefe7f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@2x.png deleted file mode 100755 index 4423c7ce..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@3x.png deleted file mode 100755 index 9652e513..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit.png deleted file mode 100755 index d4ae38c2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@2x.png deleted file mode 100755 index 364bad0b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@3x.png deleted file mode 100755 index 5fb4d7be..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_fullscreen_exit@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help.png deleted file mode 100755 index 25d99893..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@2x.png deleted file mode 100755 index 1ccd4f36..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@3x.png deleted file mode 100755 index 7cd312e6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_help@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info.png deleted file mode 100755 index 667316bd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@2x.png deleted file mode 100755 index a7c672df..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@3x.png deleted file mode 100755 index ad0e6cdb..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_info@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@1x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@1x.png deleted file mode 100755 index cc880755..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@1x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@2x.png deleted file mode 100755 index 3fcca05f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@3x.png deleted file mode 100755 index d9c9d818..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ic_settings_white@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/id.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/id.lproj/CardboardSDK.strings deleted file mode 100755 index 2a7cdccf..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/id.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/it.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/it.lproj/CardboardSDK.strings deleted file mode 100755 index b8bd7a93..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/it.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/iw.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/iw.lproj/CardboardSDK.strings deleted file mode 100755 index c03896d6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/iw.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ja.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ja.lproj/CardboardSDK.strings deleted file mode 100755 index 0a397565..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ja.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ko.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ko.lproj/CardboardSDK.strings deleted file mode 100755 index 05d26ea5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ko.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nb.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nb.lproj/CardboardSDK.strings deleted file mode 100755 index fcf40f43..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nb.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nl.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nl.lproj/CardboardSDK.strings deleted file mode 100755 index 38d12fb4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/nl.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pl.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pl.lproj/CardboardSDK.strings deleted file mode 100755 index 85197a03..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pl.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt.lproj/CardboardSDK.strings deleted file mode 100755 index 32c99f6b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt_PT.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt_PT.lproj/CardboardSDK.strings deleted file mode 100755 index dbb12d9e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/pt_PT.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@1x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@1x.png deleted file mode 100755 index ceedc387..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@1x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@2x.png deleted file mode 100755 index 4ed334af..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@3x.png deleted file mode 100755 index dcc2ad56..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/qrSample@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ro.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ro.lproj/CardboardSDK.strings deleted file mode 100755 index 5de59267..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ro.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/rotateInstructions.mp4 b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/rotateInstructions.mp4 deleted file mode 100755 index 645d3c96..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/rotateInstructions.mp4 and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ru.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ru.lproj/CardboardSDK.strings deleted file mode 100755 index 2deefb1f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/ru.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sk.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sk.lproj/CardboardSDK.strings deleted file mode 100755 index 72b8ceed..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sk.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sv.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sv.lproj/CardboardSDK.strings deleted file mode 100755 index efd5e1e0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/sv.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/th.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/th.lproj/CardboardSDK.strings deleted file mode 100755 index 0dabf41a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/th.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tickmarks.png b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tickmarks.png deleted file mode 100755 index b298ead5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tickmarks.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tr.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tr.lproj/CardboardSDK.strings deleted file mode 100755 index 9f34d8f7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/tr.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/uk.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/uk.lproj/CardboardSDK.strings deleted file mode 100755 index a751aaa7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/uk.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/vi.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/vi.lproj/CardboardSDK.strings deleted file mode 100755 index 8e2fb27e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/vi.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_CN.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_CN.lproj/CardboardSDK.strings deleted file mode 100755 index aff9e17a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_CN.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_HK.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_HK.lproj/CardboardSDK.strings deleted file mode 100755 index 22126a0d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_HK.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_TW.lproj/CardboardSDK.strings b/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_TW.lproj/CardboardSDK.strings deleted file mode 100755 index 22126a0d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/CardboardSDK.bundle/zh_TW.lproj/CardboardSDK.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/analytics/coremldata.bin b/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/analytics/coremldata.bin deleted file mode 100644 index bd737ae1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/analytics/coremldata.bin and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/coremldata.bin b/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/coremldata.bin deleted file mode 100644 index a586d6b8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/coremldata.bin and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/metadata.json b/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/metadata.json deleted file mode 100644 index 616d319b..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/metadata.json +++ /dev/null @@ -1,83 +0,0 @@ -[ - { - "shortDescription" : "Depth Anything V2 vits (with ImageNet normalization)", - "metadataOutputVersion" : "3.0", - "outputSchema" : [ - { - "hasShapeFlexibility" : "0", - "isOptional" : "0", - "dataType" : "Float32", - "formattedType" : "MultiArray (Float32 1 × 518 × 518)", - "shortDescription" : "", - "shape" : "[1, 518, 518]", - "name" : "depth", - "type" : "MultiArray" - } - ], - "version" : "2.0", - "modelParameters" : [ - - ], - "author" : "TikTok \/ Depth Anything Team", - "specificationVersion" : 6, - "storagePrecision" : "Float16", - "mlProgramOperationTypeHistogram" : { - "Concat" : 1, - "Linear" : 48, - "SliceByIndex" : 40, - "LayerNorm" : 28, - "Transpose" : 29, - "Matmul" : 24, - "Sub" : 1, - "Gelu" : 12, - "UpsampleBilinear" : 5, - "Softmax" : 12, - "Mul" : 38, - "Cast" : 2, - "Reshape" : 29, - "Add" : 35, - "ConvTranspose" : 2, - "Relu" : 16, - "Squeeze" : 1, - "Conv" : 31 - }, - "computePrecision" : "Mixed (Float16, Float32, Int32)", - "stateSchema" : [ - - ], - "isUpdatable" : "0", - "availability" : { - "macOS" : "12.0", - "tvOS" : "15.0", - "visionOS" : "1.0", - "watchOS" : "8.0", - "iOS" : "15.0", - "macCatalyst" : "15.0" - }, - "modelType" : { - "name" : "MLModelType_mlProgram" - }, - "inputSchema" : [ - { - "height" : "518", - "colorspace" : "RGB", - "isOptional" : "0", - "width" : "518", - "isColor" : "1", - "formattedType" : "Image (Color 518 × 518)", - "hasSizeFlexibility" : "0", - "type" : "Image", - "shortDescription" : "", - "name" : "image" - } - ], - "userDefinedMetadata" : { - "com.github.apple.coremltools.conversion_date" : "2026-01-30", - "com.github.apple.coremltools.source" : "torch==2.7.0", - "com.github.apple.coremltools.version" : "9.0", - "com.github.apple.coremltools.source_dialect" : "TorchScript" - }, - "generatedClassName" : "DepthAnythingV2", - "method" : "predict" - } -] \ No newline at end of file diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/model.mil b/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/model.mil deleted file mode 100644 index 7a70ac5a..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/model.mil +++ /dev/null @@ -1,1100 +0,0 @@ -program(1.0) -[buildInfo = dict, tensor>({{"coremlc-component-MIL", "3510.2.1"}, {"coremlc-version", "3500.32.1"}, {"coremltools-component-torch", "2.7.0"}, {"coremltools-source-dialect", "TorchScript"}, {"coremltools-version", "9.0"}})] -{ - func main(tensor image) { - tensor image__scaled___y_0 = const()[name = tensor("image__scaled___y_0"), val = tensor(0x1.010102p-8)]; - tensor image__scaled__ = mul(x = image, y = image__scaled___y_0)[name = tensor("image__scaled__")]; - tensor image_to_fp16_dtype_0 = const()[name = tensor("image_to_fp16_dtype_0"), val = tensor("fp16")]; - tensor mean_to_fp16 = const()[name = tensor("mean_to_fp16"), val = tensor([[[[0x1.f0cp-2]], [[0x1.d3p-2]], [[0x1.9fcp-2]]]])]; - tensor image_to_fp16 = cast(dtype = image_to_fp16_dtype_0, x = image__scaled__)[name = tensor("cast_32")]; - tensor var_6_cast_fp16 = sub(x = image_to_fp16, y = mean_to_fp16)[name = tensor("op_6_cast_fp16")]; - tensor _inversed_x_3_y_0_to_fp16 = const()[name = tensor("_inversed_x_3_y_0_to_fp16"), val = tensor([[[[0x1.178p+2]], [[0x1.1dcp+2]], [[0x1.1c8p+2]]]])]; - tensor _inversed_x_3_cast_fp16 = mul(x = var_6_cast_fp16, y = _inversed_x_3_y_0_to_fp16)[name = tensor("_inversed_x_3_cast_fp16")]; - tensor var_22 = const()[name = tensor("op_22"), val = tensor(1)]; - tensor var_25 = const()[name = tensor("op_25"), val = tensor(-1)]; - tensor x_5_pad_type_0 = const()[name = tensor("x_5_pad_type_0"), val = tensor("valid")]; - tensor x_5_strides_0 = const()[name = tensor("x_5_strides_0"), val = tensor([14, 14])]; - tensor x_5_pad_0 = const()[name = tensor("x_5_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor x_5_dilations_0 = const()[name = tensor("x_5_dilations_0"), val = tensor([1, 1])]; - tensor x_5_groups_0 = const()[name = tensor("x_5_groups_0"), val = tensor(1)]; - tensor model_pretrained_patch_embed_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_patch_embed_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(64)))]; - tensor model_pretrained_patch_embed_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_patch_embed_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(451712)))]; - tensor x_5_cast_fp16 = conv(bias = model_pretrained_patch_embed_proj_bias_to_fp16, dilations = x_5_dilations_0, groups = x_5_groups_0, pad = x_5_pad_0, pad_type = x_5_pad_type_0, strides = x_5_strides_0, weight = model_pretrained_patch_embed_proj_weight_to_fp16, x = _inversed_x_3_cast_fp16)[name = tensor("x_5_cast_fp16")]; - tensor concat_0 = const()[name = tensor("concat_0"), val = tensor([1, 384, 1369])]; - tensor var_96_cast_fp16 = reshape(shape = concat_0, x = x_5_cast_fp16)[name = tensor("op_96_cast_fp16")]; - tensor x_7_perm_0 = const()[name = tensor("x_7_perm_0"), val = tensor([0, 2, 1])]; - tensor x_9_interleave_0 = const()[name = tensor("x_9_interleave_0"), val = tensor(false)]; - tensor model_pretrained_cls_token_to_fp16 = const()[name = tensor("model_pretrained_cls_token_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(452544)))]; - tensor x_7_cast_fp16 = transpose(perm = x_7_perm_0, x = var_96_cast_fp16)[name = tensor("transpose_28")]; - tensor x_9_cast_fp16 = concat(axis = var_22, interleave = x_9_interleave_0, values = (model_pretrained_cls_token_to_fp16, x_7_cast_fp16))[name = tensor("x_9_cast_fp16")]; - tensor model_pretrained_pos_embed_to_fp16 = const()[name = tensor("model_pretrained_pos_embed_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(453376)))]; - tensor input_1_cast_fp16 = add(x = x_9_cast_fp16, y = model_pretrained_pos_embed_to_fp16)[name = tensor("input_1_cast_fp16")]; - tensor x_11_axes_0 = const()[name = tensor("x_11_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_0_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(1505600)))]; - tensor model_pretrained_blocks_0_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(1506432)))]; - tensor var_11_to_fp16 = const()[name = tensor("op_11_to_fp16"), val = tensor(0x1.1p-20)]; - tensor x_11_cast_fp16 = layer_norm(axes = x_11_axes_0, beta = model_pretrained_blocks_0_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_0_norm1_weight_to_fp16, x = input_1_cast_fp16)[name = tensor("x_11_cast_fp16")]; - tensor model_pretrained_blocks_0_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(1507264)))]; - tensor model_pretrained_blocks_0_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2392064)))]; - tensor linear_0_cast_fp16 = linear(bias = model_pretrained_blocks_0_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_0_attn_qkv_weight_to_fp16, x = x_11_cast_fp16)[name = tensor("linear_0_cast_fp16")]; - tensor var_125 = const()[name = tensor("op_125"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_126_cast_fp16 = reshape(shape = var_125, x = linear_0_cast_fp16)[name = tensor("op_126_cast_fp16")]; - tensor var_127 = const()[name = tensor("op_127"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_129_begin_0 = const()[name = tensor("op_129_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_129_end_0 = const()[name = tensor("op_129_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_129_end_mask_0 = const()[name = tensor("op_129_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_129_squeeze_mask_0 = const()[name = tensor("op_129_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_1_cast_fp16 = transpose(perm = var_127, x = var_126_cast_fp16)[name = tensor("transpose_27")]; - tensor var_129_cast_fp16 = slice_by_index(begin = var_129_begin_0, end = var_129_end_0, end_mask = var_129_end_mask_0, squeeze_mask = var_129_squeeze_mask_0, x = qkv_1_cast_fp16)[name = tensor("op_129_cast_fp16")]; - tensor var_130_to_fp16 = const()[name = tensor("op_130_to_fp16"), val = tensor(0x1p-3)]; - tensor q_1_cast_fp16 = mul(x = var_129_cast_fp16, y = var_130_to_fp16)[name = tensor("q_1_cast_fp16")]; - tensor k_1_begin_0 = const()[name = tensor("k_1_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_1_end_0 = const()[name = tensor("k_1_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_1_end_mask_0 = const()[name = tensor("k_1_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_1_squeeze_mask_0 = const()[name = tensor("k_1_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_1_cast_fp16 = slice_by_index(begin = k_1_begin_0, end = k_1_end_0, end_mask = k_1_end_mask_0, squeeze_mask = k_1_squeeze_mask_0, x = qkv_1_cast_fp16)[name = tensor("k_1_cast_fp16")]; - tensor v_1_begin_0 = const()[name = tensor("v_1_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_1_end_0 = const()[name = tensor("v_1_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_1_end_mask_0 = const()[name = tensor("v_1_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_1_squeeze_mask_0 = const()[name = tensor("v_1_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_1_cast_fp16 = slice_by_index(begin = v_1_begin_0, end = v_1_end_0, end_mask = v_1_end_mask_0, squeeze_mask = v_1_squeeze_mask_0, x = qkv_1_cast_fp16)[name = tensor("v_1_cast_fp16")]; - tensor attn_1_transpose_x_1 = const()[name = tensor("attn_1_transpose_x_1"), val = tensor(false)]; - tensor attn_1_transpose_y_1 = const()[name = tensor("attn_1_transpose_y_1"), val = tensor(true)]; - tensor attn_1_cast_fp16 = matmul(transpose_x = attn_1_transpose_x_1, transpose_y = attn_1_transpose_y_1, x = q_1_cast_fp16, y = k_1_cast_fp16)[name = tensor("attn_1_cast_fp16")]; - tensor input_3_cast_fp16 = softmax(axis = var_25, x = attn_1_cast_fp16)[name = tensor("input_3_cast_fp16")]; - tensor var_138_transpose_x_0 = const()[name = tensor("op_138_transpose_x_0"), val = tensor(false)]; - tensor var_138_transpose_y_0 = const()[name = tensor("op_138_transpose_y_0"), val = tensor(false)]; - tensor var_138_cast_fp16 = matmul(transpose_x = var_138_transpose_x_0, transpose_y = var_138_transpose_y_0, x = input_3_cast_fp16, y = v_1_cast_fp16)[name = tensor("op_138_cast_fp16")]; - tensor var_139_perm_0 = const()[name = tensor("op_139_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_140 = const()[name = tensor("op_140"), val = tensor([1, 1370, 384])]; - tensor var_139_cast_fp16 = transpose(perm = var_139_perm_0, x = var_138_cast_fp16)[name = tensor("transpose_26")]; - tensor input_5_cast_fp16 = reshape(shape = var_140, x = var_139_cast_fp16)[name = tensor("input_5_cast_fp16")]; - tensor model_pretrained_blocks_0_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2394432)))]; - tensor model_pretrained_blocks_0_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2689408)))]; - tensor linear_1_cast_fp16 = linear(bias = model_pretrained_blocks_0_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_0_attn_proj_weight_to_fp16, x = input_5_cast_fp16)[name = tensor("linear_1_cast_fp16")]; - tensor model_pretrained_blocks_0_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2690240)))]; - tensor var_147_cast_fp16 = mul(x = linear_1_cast_fp16, y = model_pretrained_blocks_0_ls1_gamma_to_fp16)[name = tensor("op_147_cast_fp16")]; - tensor input_9_cast_fp16 = add(x = input_1_cast_fp16, y = var_147_cast_fp16)[name = tensor("input_9_cast_fp16")]; - tensor input_11_axes_0 = const()[name = tensor("input_11_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_0_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2691072)))]; - tensor model_pretrained_blocks_0_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2691904)))]; - tensor input_11_cast_fp16 = layer_norm(axes = input_11_axes_0, beta = model_pretrained_blocks_0_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_0_norm2_weight_to_fp16, x = input_9_cast_fp16)[name = tensor("input_11_cast_fp16")]; - tensor model_pretrained_blocks_0_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(2692736)))]; - tensor model_pretrained_blocks_0_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(3872448)))]; - tensor linear_2_cast_fp16 = linear(bias = model_pretrained_blocks_0_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_0_mlp_fc1_weight_to_fp16, x = input_11_cast_fp16)[name = tensor("linear_2_cast_fp16")]; - tensor input_15_mode_0 = const()[name = tensor("input_15_mode_0"), val = tensor("EXACT")]; - tensor input_15_cast_fp16 = gelu(mode = input_15_mode_0, x = linear_2_cast_fp16)[name = tensor("input_15_cast_fp16")]; - tensor model_pretrained_blocks_0_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(3875584)))]; - tensor model_pretrained_blocks_0_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5055296)))]; - tensor linear_3_cast_fp16 = linear(bias = model_pretrained_blocks_0_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_0_mlp_fc2_weight_to_fp16, x = input_15_cast_fp16)[name = tensor("linear_3_cast_fp16")]; - tensor model_pretrained_blocks_0_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_0_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5056128)))]; - tensor var_165_cast_fp16 = mul(x = linear_3_cast_fp16, y = model_pretrained_blocks_0_ls2_gamma_to_fp16)[name = tensor("op_165_cast_fp16")]; - tensor input_21_cast_fp16 = add(x = input_9_cast_fp16, y = var_165_cast_fp16)[name = tensor("input_21_cast_fp16")]; - tensor x_17_axes_0 = const()[name = tensor("x_17_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_1_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5056960)))]; - tensor model_pretrained_blocks_1_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5057792)))]; - tensor x_17_cast_fp16 = layer_norm(axes = x_17_axes_0, beta = model_pretrained_blocks_1_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_1_norm1_weight_to_fp16, x = input_21_cast_fp16)[name = tensor("x_17_cast_fp16")]; - tensor model_pretrained_blocks_1_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5058624)))]; - tensor model_pretrained_blocks_1_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5943424)))]; - tensor linear_4_cast_fp16 = linear(bias = model_pretrained_blocks_1_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_1_attn_qkv_weight_to_fp16, x = x_17_cast_fp16)[name = tensor("linear_4_cast_fp16")]; - tensor var_188 = const()[name = tensor("op_188"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_189_cast_fp16 = reshape(shape = var_188, x = linear_4_cast_fp16)[name = tensor("op_189_cast_fp16")]; - tensor var_190 = const()[name = tensor("op_190"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_192_begin_0 = const()[name = tensor("op_192_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_192_end_0 = const()[name = tensor("op_192_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_192_end_mask_0 = const()[name = tensor("op_192_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_192_squeeze_mask_0 = const()[name = tensor("op_192_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_3_cast_fp16 = transpose(perm = var_190, x = var_189_cast_fp16)[name = tensor("transpose_25")]; - tensor var_192_cast_fp16 = slice_by_index(begin = var_192_begin_0, end = var_192_end_0, end_mask = var_192_end_mask_0, squeeze_mask = var_192_squeeze_mask_0, x = qkv_3_cast_fp16)[name = tensor("op_192_cast_fp16")]; - tensor var_193_to_fp16 = const()[name = tensor("op_193_to_fp16"), val = tensor(0x1p-3)]; - tensor q_3_cast_fp16 = mul(x = var_192_cast_fp16, y = var_193_to_fp16)[name = tensor("q_3_cast_fp16")]; - tensor k_3_begin_0 = const()[name = tensor("k_3_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_3_end_0 = const()[name = tensor("k_3_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_3_end_mask_0 = const()[name = tensor("k_3_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_3_squeeze_mask_0 = const()[name = tensor("k_3_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_3_cast_fp16 = slice_by_index(begin = k_3_begin_0, end = k_3_end_0, end_mask = k_3_end_mask_0, squeeze_mask = k_3_squeeze_mask_0, x = qkv_3_cast_fp16)[name = tensor("k_3_cast_fp16")]; - tensor v_3_begin_0 = const()[name = tensor("v_3_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_3_end_0 = const()[name = tensor("v_3_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_3_end_mask_0 = const()[name = tensor("v_3_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_3_squeeze_mask_0 = const()[name = tensor("v_3_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_3_cast_fp16 = slice_by_index(begin = v_3_begin_0, end = v_3_end_0, end_mask = v_3_end_mask_0, squeeze_mask = v_3_squeeze_mask_0, x = qkv_3_cast_fp16)[name = tensor("v_3_cast_fp16")]; - tensor attn_5_transpose_x_1 = const()[name = tensor("attn_5_transpose_x_1"), val = tensor(false)]; - tensor attn_5_transpose_y_1 = const()[name = tensor("attn_5_transpose_y_1"), val = tensor(true)]; - tensor attn_5_cast_fp16 = matmul(transpose_x = attn_5_transpose_x_1, transpose_y = attn_5_transpose_y_1, x = q_3_cast_fp16, y = k_3_cast_fp16)[name = tensor("attn_5_cast_fp16")]; - tensor input_23_cast_fp16 = softmax(axis = var_25, x = attn_5_cast_fp16)[name = tensor("input_23_cast_fp16")]; - tensor var_201_transpose_x_0 = const()[name = tensor("op_201_transpose_x_0"), val = tensor(false)]; - tensor var_201_transpose_y_0 = const()[name = tensor("op_201_transpose_y_0"), val = tensor(false)]; - tensor var_201_cast_fp16 = matmul(transpose_x = var_201_transpose_x_0, transpose_y = var_201_transpose_y_0, x = input_23_cast_fp16, y = v_3_cast_fp16)[name = tensor("op_201_cast_fp16")]; - tensor var_202_perm_0 = const()[name = tensor("op_202_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_203 = const()[name = tensor("op_203"), val = tensor([1, 1370, 384])]; - tensor var_202_cast_fp16 = transpose(perm = var_202_perm_0, x = var_201_cast_fp16)[name = tensor("transpose_24")]; - tensor input_25_cast_fp16 = reshape(shape = var_203, x = var_202_cast_fp16)[name = tensor("input_25_cast_fp16")]; - tensor model_pretrained_blocks_1_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(5945792)))]; - tensor model_pretrained_blocks_1_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(6240768)))]; - tensor linear_5_cast_fp16 = linear(bias = model_pretrained_blocks_1_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_1_attn_proj_weight_to_fp16, x = input_25_cast_fp16)[name = tensor("linear_5_cast_fp16")]; - tensor model_pretrained_blocks_1_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(6241600)))]; - tensor var_210_cast_fp16 = mul(x = linear_5_cast_fp16, y = model_pretrained_blocks_1_ls1_gamma_to_fp16)[name = tensor("op_210_cast_fp16")]; - tensor input_29_cast_fp16 = add(x = input_21_cast_fp16, y = var_210_cast_fp16)[name = tensor("input_29_cast_fp16")]; - tensor input_31_axes_0 = const()[name = tensor("input_31_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_1_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(6242432)))]; - tensor model_pretrained_blocks_1_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(6243264)))]; - tensor input_31_cast_fp16 = layer_norm(axes = input_31_axes_0, beta = model_pretrained_blocks_1_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_1_norm2_weight_to_fp16, x = input_29_cast_fp16)[name = tensor("input_31_cast_fp16")]; - tensor model_pretrained_blocks_1_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(6244096)))]; - tensor model_pretrained_blocks_1_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(7423808)))]; - tensor linear_6_cast_fp16 = linear(bias = model_pretrained_blocks_1_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_1_mlp_fc1_weight_to_fp16, x = input_31_cast_fp16)[name = tensor("linear_6_cast_fp16")]; - tensor input_35_mode_0 = const()[name = tensor("input_35_mode_0"), val = tensor("EXACT")]; - tensor input_35_cast_fp16 = gelu(mode = input_35_mode_0, x = linear_6_cast_fp16)[name = tensor("input_35_cast_fp16")]; - tensor model_pretrained_blocks_1_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(7426944)))]; - tensor model_pretrained_blocks_1_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(8606656)))]; - tensor linear_7_cast_fp16 = linear(bias = model_pretrained_blocks_1_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_1_mlp_fc2_weight_to_fp16, x = input_35_cast_fp16)[name = tensor("linear_7_cast_fp16")]; - tensor model_pretrained_blocks_1_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_1_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(8607488)))]; - tensor var_228_cast_fp16 = mul(x = linear_7_cast_fp16, y = model_pretrained_blocks_1_ls2_gamma_to_fp16)[name = tensor("op_228_cast_fp16")]; - tensor input_41_cast_fp16 = add(x = input_29_cast_fp16, y = var_228_cast_fp16)[name = tensor("input_41_cast_fp16")]; - tensor x_23_axes_0 = const()[name = tensor("x_23_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_2_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(8608320)))]; - tensor model_pretrained_blocks_2_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(8609152)))]; - tensor x_23_cast_fp16 = layer_norm(axes = x_23_axes_0, beta = model_pretrained_blocks_2_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_2_norm1_weight_to_fp16, x = input_41_cast_fp16)[name = tensor("x_23_cast_fp16")]; - tensor model_pretrained_blocks_2_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(8609984)))]; - tensor model_pretrained_blocks_2_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9494784)))]; - tensor linear_8_cast_fp16 = linear(bias = model_pretrained_blocks_2_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_2_attn_qkv_weight_to_fp16, x = x_23_cast_fp16)[name = tensor("linear_8_cast_fp16")]; - tensor var_251 = const()[name = tensor("op_251"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_252_cast_fp16 = reshape(shape = var_251, x = linear_8_cast_fp16)[name = tensor("op_252_cast_fp16")]; - tensor var_253 = const()[name = tensor("op_253"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_255_begin_0 = const()[name = tensor("op_255_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_255_end_0 = const()[name = tensor("op_255_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_255_end_mask_0 = const()[name = tensor("op_255_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_255_squeeze_mask_0 = const()[name = tensor("op_255_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_5_cast_fp16 = transpose(perm = var_253, x = var_252_cast_fp16)[name = tensor("transpose_23")]; - tensor var_255_cast_fp16 = slice_by_index(begin = var_255_begin_0, end = var_255_end_0, end_mask = var_255_end_mask_0, squeeze_mask = var_255_squeeze_mask_0, x = qkv_5_cast_fp16)[name = tensor("op_255_cast_fp16")]; - tensor var_256_to_fp16 = const()[name = tensor("op_256_to_fp16"), val = tensor(0x1p-3)]; - tensor q_5_cast_fp16 = mul(x = var_255_cast_fp16, y = var_256_to_fp16)[name = tensor("q_5_cast_fp16")]; - tensor k_5_begin_0 = const()[name = tensor("k_5_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_5_end_0 = const()[name = tensor("k_5_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_5_end_mask_0 = const()[name = tensor("k_5_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_5_squeeze_mask_0 = const()[name = tensor("k_5_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_5_cast_fp16 = slice_by_index(begin = k_5_begin_0, end = k_5_end_0, end_mask = k_5_end_mask_0, squeeze_mask = k_5_squeeze_mask_0, x = qkv_5_cast_fp16)[name = tensor("k_5_cast_fp16")]; - tensor v_5_begin_0 = const()[name = tensor("v_5_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_5_end_0 = const()[name = tensor("v_5_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_5_end_mask_0 = const()[name = tensor("v_5_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_5_squeeze_mask_0 = const()[name = tensor("v_5_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_5_cast_fp16 = slice_by_index(begin = v_5_begin_0, end = v_5_end_0, end_mask = v_5_end_mask_0, squeeze_mask = v_5_squeeze_mask_0, x = qkv_5_cast_fp16)[name = tensor("v_5_cast_fp16")]; - tensor attn_9_transpose_x_1 = const()[name = tensor("attn_9_transpose_x_1"), val = tensor(false)]; - tensor attn_9_transpose_y_1 = const()[name = tensor("attn_9_transpose_y_1"), val = tensor(true)]; - tensor attn_9_cast_fp16 = matmul(transpose_x = attn_9_transpose_x_1, transpose_y = attn_9_transpose_y_1, x = q_5_cast_fp16, y = k_5_cast_fp16)[name = tensor("attn_9_cast_fp16")]; - tensor input_43_cast_fp16 = softmax(axis = var_25, x = attn_9_cast_fp16)[name = tensor("input_43_cast_fp16")]; - tensor var_264_transpose_x_0 = const()[name = tensor("op_264_transpose_x_0"), val = tensor(false)]; - tensor var_264_transpose_y_0 = const()[name = tensor("op_264_transpose_y_0"), val = tensor(false)]; - tensor var_264_cast_fp16 = matmul(transpose_x = var_264_transpose_x_0, transpose_y = var_264_transpose_y_0, x = input_43_cast_fp16, y = v_5_cast_fp16)[name = tensor("op_264_cast_fp16")]; - tensor var_265_perm_0 = const()[name = tensor("op_265_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_266 = const()[name = tensor("op_266"), val = tensor([1, 1370, 384])]; - tensor var_265_cast_fp16 = transpose(perm = var_265_perm_0, x = var_264_cast_fp16)[name = tensor("transpose_22")]; - tensor input_45_cast_fp16 = reshape(shape = var_266, x = var_265_cast_fp16)[name = tensor("input_45_cast_fp16")]; - tensor model_pretrained_blocks_2_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9497152)))]; - tensor model_pretrained_blocks_2_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9792128)))]; - tensor linear_9_cast_fp16 = linear(bias = model_pretrained_blocks_2_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_2_attn_proj_weight_to_fp16, x = input_45_cast_fp16)[name = tensor("linear_9_cast_fp16")]; - tensor model_pretrained_blocks_2_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9792960)))]; - tensor var_273_cast_fp16 = mul(x = linear_9_cast_fp16, y = model_pretrained_blocks_2_ls1_gamma_to_fp16)[name = tensor("op_273_cast_fp16")]; - tensor input_49_cast_fp16 = add(x = input_41_cast_fp16, y = var_273_cast_fp16)[name = tensor("input_49_cast_fp16")]; - tensor input_51_axes_0 = const()[name = tensor("input_51_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_2_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9793792)))]; - tensor model_pretrained_blocks_2_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9794624)))]; - tensor input_51_cast_fp16 = layer_norm(axes = input_51_axes_0, beta = model_pretrained_blocks_2_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_2_norm2_weight_to_fp16, x = input_49_cast_fp16)[name = tensor("input_51_cast_fp16")]; - tensor model_pretrained_blocks_2_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(9795456)))]; - tensor model_pretrained_blocks_2_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(10975168)))]; - tensor linear_10_cast_fp16 = linear(bias = model_pretrained_blocks_2_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_2_mlp_fc1_weight_to_fp16, x = input_51_cast_fp16)[name = tensor("linear_10_cast_fp16")]; - tensor input_55_mode_0 = const()[name = tensor("input_55_mode_0"), val = tensor("EXACT")]; - tensor input_55_cast_fp16 = gelu(mode = input_55_mode_0, x = linear_10_cast_fp16)[name = tensor("input_55_cast_fp16")]; - tensor model_pretrained_blocks_2_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(10978304)))]; - tensor model_pretrained_blocks_2_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(12158016)))]; - tensor linear_11_cast_fp16 = linear(bias = model_pretrained_blocks_2_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_2_mlp_fc2_weight_to_fp16, x = input_55_cast_fp16)[name = tensor("linear_11_cast_fp16")]; - tensor model_pretrained_blocks_2_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_2_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(12158848)))]; - tensor var_291_cast_fp16 = mul(x = linear_11_cast_fp16, y = model_pretrained_blocks_2_ls2_gamma_to_fp16)[name = tensor("op_291_cast_fp16")]; - tensor input_61_cast_fp16 = add(x = input_49_cast_fp16, y = var_291_cast_fp16)[name = tensor("input_61_cast_fp16")]; - tensor x_29_axes_0 = const()[name = tensor("x_29_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_3_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(12159680)))]; - tensor model_pretrained_blocks_3_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(12160512)))]; - tensor x_29_cast_fp16 = layer_norm(axes = x_29_axes_0, beta = model_pretrained_blocks_3_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_3_norm1_weight_to_fp16, x = input_61_cast_fp16)[name = tensor("x_29_cast_fp16")]; - tensor model_pretrained_blocks_3_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(12161344)))]; - tensor model_pretrained_blocks_3_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13046144)))]; - tensor linear_12_cast_fp16 = linear(bias = model_pretrained_blocks_3_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_3_attn_qkv_weight_to_fp16, x = x_29_cast_fp16)[name = tensor("linear_12_cast_fp16")]; - tensor var_314 = const()[name = tensor("op_314"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_315_cast_fp16 = reshape(shape = var_314, x = linear_12_cast_fp16)[name = tensor("op_315_cast_fp16")]; - tensor var_316 = const()[name = tensor("op_316"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_318_begin_0 = const()[name = tensor("op_318_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_318_end_0 = const()[name = tensor("op_318_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_318_end_mask_0 = const()[name = tensor("op_318_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_318_squeeze_mask_0 = const()[name = tensor("op_318_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_7_cast_fp16 = transpose(perm = var_316, x = var_315_cast_fp16)[name = tensor("transpose_21")]; - tensor var_318_cast_fp16 = slice_by_index(begin = var_318_begin_0, end = var_318_end_0, end_mask = var_318_end_mask_0, squeeze_mask = var_318_squeeze_mask_0, x = qkv_7_cast_fp16)[name = tensor("op_318_cast_fp16")]; - tensor var_319_to_fp16 = const()[name = tensor("op_319_to_fp16"), val = tensor(0x1p-3)]; - tensor q_7_cast_fp16 = mul(x = var_318_cast_fp16, y = var_319_to_fp16)[name = tensor("q_7_cast_fp16")]; - tensor k_7_begin_0 = const()[name = tensor("k_7_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_7_end_0 = const()[name = tensor("k_7_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_7_end_mask_0 = const()[name = tensor("k_7_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_7_squeeze_mask_0 = const()[name = tensor("k_7_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_7_cast_fp16 = slice_by_index(begin = k_7_begin_0, end = k_7_end_0, end_mask = k_7_end_mask_0, squeeze_mask = k_7_squeeze_mask_0, x = qkv_7_cast_fp16)[name = tensor("k_7_cast_fp16")]; - tensor v_7_begin_0 = const()[name = tensor("v_7_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_7_end_0 = const()[name = tensor("v_7_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_7_end_mask_0 = const()[name = tensor("v_7_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_7_squeeze_mask_0 = const()[name = tensor("v_7_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_7_cast_fp16 = slice_by_index(begin = v_7_begin_0, end = v_7_end_0, end_mask = v_7_end_mask_0, squeeze_mask = v_7_squeeze_mask_0, x = qkv_7_cast_fp16)[name = tensor("v_7_cast_fp16")]; - tensor attn_13_transpose_x_1 = const()[name = tensor("attn_13_transpose_x_1"), val = tensor(false)]; - tensor attn_13_transpose_y_1 = const()[name = tensor("attn_13_transpose_y_1"), val = tensor(true)]; - tensor attn_13_cast_fp16 = matmul(transpose_x = attn_13_transpose_x_1, transpose_y = attn_13_transpose_y_1, x = q_7_cast_fp16, y = k_7_cast_fp16)[name = tensor("attn_13_cast_fp16")]; - tensor input_63_cast_fp16 = softmax(axis = var_25, x = attn_13_cast_fp16)[name = tensor("input_63_cast_fp16")]; - tensor var_327_transpose_x_0 = const()[name = tensor("op_327_transpose_x_0"), val = tensor(false)]; - tensor var_327_transpose_y_0 = const()[name = tensor("op_327_transpose_y_0"), val = tensor(false)]; - tensor var_327_cast_fp16 = matmul(transpose_x = var_327_transpose_x_0, transpose_y = var_327_transpose_y_0, x = input_63_cast_fp16, y = v_7_cast_fp16)[name = tensor("op_327_cast_fp16")]; - tensor var_328_perm_0 = const()[name = tensor("op_328_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_329 = const()[name = tensor("op_329"), val = tensor([1, 1370, 384])]; - tensor var_328_cast_fp16 = transpose(perm = var_328_perm_0, x = var_327_cast_fp16)[name = tensor("transpose_20")]; - tensor input_65_cast_fp16 = reshape(shape = var_329, x = var_328_cast_fp16)[name = tensor("input_65_cast_fp16")]; - tensor model_pretrained_blocks_3_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13048512)))]; - tensor model_pretrained_blocks_3_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13343488)))]; - tensor linear_13_cast_fp16 = linear(bias = model_pretrained_blocks_3_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_3_attn_proj_weight_to_fp16, x = input_65_cast_fp16)[name = tensor("linear_13_cast_fp16")]; - tensor model_pretrained_blocks_3_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13344320)))]; - tensor var_336_cast_fp16 = mul(x = linear_13_cast_fp16, y = model_pretrained_blocks_3_ls1_gamma_to_fp16)[name = tensor("op_336_cast_fp16")]; - tensor input_69_cast_fp16 = add(x = input_61_cast_fp16, y = var_336_cast_fp16)[name = tensor("input_69_cast_fp16")]; - tensor input_71_axes_0 = const()[name = tensor("input_71_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_3_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13345152)))]; - tensor model_pretrained_blocks_3_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13345984)))]; - tensor input_71_cast_fp16 = layer_norm(axes = input_71_axes_0, beta = model_pretrained_blocks_3_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_3_norm2_weight_to_fp16, x = input_69_cast_fp16)[name = tensor("input_71_cast_fp16")]; - tensor model_pretrained_blocks_3_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(13346816)))]; - tensor model_pretrained_blocks_3_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(14526528)))]; - tensor linear_14_cast_fp16 = linear(bias = model_pretrained_blocks_3_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_3_mlp_fc1_weight_to_fp16, x = input_71_cast_fp16)[name = tensor("linear_14_cast_fp16")]; - tensor input_75_mode_0 = const()[name = tensor("input_75_mode_0"), val = tensor("EXACT")]; - tensor input_75_cast_fp16 = gelu(mode = input_75_mode_0, x = linear_14_cast_fp16)[name = tensor("input_75_cast_fp16")]; - tensor model_pretrained_blocks_3_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(14529664)))]; - tensor model_pretrained_blocks_3_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(15709376)))]; - tensor linear_15_cast_fp16 = linear(bias = model_pretrained_blocks_3_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_3_mlp_fc2_weight_to_fp16, x = input_75_cast_fp16)[name = tensor("linear_15_cast_fp16")]; - tensor model_pretrained_blocks_3_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_3_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(15710208)))]; - tensor var_354_cast_fp16 = mul(x = linear_15_cast_fp16, y = model_pretrained_blocks_3_ls2_gamma_to_fp16)[name = tensor("op_354_cast_fp16")]; - tensor input_81_cast_fp16 = add(x = input_69_cast_fp16, y = var_354_cast_fp16)[name = tensor("input_81_cast_fp16")]; - tensor x_35_axes_0 = const()[name = tensor("x_35_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_4_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(15711040)))]; - tensor model_pretrained_blocks_4_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(15711872)))]; - tensor x_35_cast_fp16 = layer_norm(axes = x_35_axes_0, beta = model_pretrained_blocks_4_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_4_norm1_weight_to_fp16, x = input_81_cast_fp16)[name = tensor("x_35_cast_fp16")]; - tensor model_pretrained_blocks_4_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(15712704)))]; - tensor model_pretrained_blocks_4_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16597504)))]; - tensor linear_16_cast_fp16 = linear(bias = model_pretrained_blocks_4_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_4_attn_qkv_weight_to_fp16, x = x_35_cast_fp16)[name = tensor("linear_16_cast_fp16")]; - tensor var_377 = const()[name = tensor("op_377"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_378_cast_fp16 = reshape(shape = var_377, x = linear_16_cast_fp16)[name = tensor("op_378_cast_fp16")]; - tensor var_379 = const()[name = tensor("op_379"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_381_begin_0 = const()[name = tensor("op_381_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_381_end_0 = const()[name = tensor("op_381_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_381_end_mask_0 = const()[name = tensor("op_381_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_381_squeeze_mask_0 = const()[name = tensor("op_381_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_9_cast_fp16 = transpose(perm = var_379, x = var_378_cast_fp16)[name = tensor("transpose_19")]; - tensor var_381_cast_fp16 = slice_by_index(begin = var_381_begin_0, end = var_381_end_0, end_mask = var_381_end_mask_0, squeeze_mask = var_381_squeeze_mask_0, x = qkv_9_cast_fp16)[name = tensor("op_381_cast_fp16")]; - tensor var_382_to_fp16 = const()[name = tensor("op_382_to_fp16"), val = tensor(0x1p-3)]; - tensor q_9_cast_fp16 = mul(x = var_381_cast_fp16, y = var_382_to_fp16)[name = tensor("q_9_cast_fp16")]; - tensor k_9_begin_0 = const()[name = tensor("k_9_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_9_end_0 = const()[name = tensor("k_9_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_9_end_mask_0 = const()[name = tensor("k_9_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_9_squeeze_mask_0 = const()[name = tensor("k_9_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_9_cast_fp16 = slice_by_index(begin = k_9_begin_0, end = k_9_end_0, end_mask = k_9_end_mask_0, squeeze_mask = k_9_squeeze_mask_0, x = qkv_9_cast_fp16)[name = tensor("k_9_cast_fp16")]; - tensor v_9_begin_0 = const()[name = tensor("v_9_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_9_end_0 = const()[name = tensor("v_9_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_9_end_mask_0 = const()[name = tensor("v_9_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_9_squeeze_mask_0 = const()[name = tensor("v_9_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_9_cast_fp16 = slice_by_index(begin = v_9_begin_0, end = v_9_end_0, end_mask = v_9_end_mask_0, squeeze_mask = v_9_squeeze_mask_0, x = qkv_9_cast_fp16)[name = tensor("v_9_cast_fp16")]; - tensor attn_17_transpose_x_1 = const()[name = tensor("attn_17_transpose_x_1"), val = tensor(false)]; - tensor attn_17_transpose_y_1 = const()[name = tensor("attn_17_transpose_y_1"), val = tensor(true)]; - tensor attn_17_cast_fp16 = matmul(transpose_x = attn_17_transpose_x_1, transpose_y = attn_17_transpose_y_1, x = q_9_cast_fp16, y = k_9_cast_fp16)[name = tensor("attn_17_cast_fp16")]; - tensor input_83_cast_fp16 = softmax(axis = var_25, x = attn_17_cast_fp16)[name = tensor("input_83_cast_fp16")]; - tensor var_390_transpose_x_0 = const()[name = tensor("op_390_transpose_x_0"), val = tensor(false)]; - tensor var_390_transpose_y_0 = const()[name = tensor("op_390_transpose_y_0"), val = tensor(false)]; - tensor var_390_cast_fp16 = matmul(transpose_x = var_390_transpose_x_0, transpose_y = var_390_transpose_y_0, x = input_83_cast_fp16, y = v_9_cast_fp16)[name = tensor("op_390_cast_fp16")]; - tensor var_391_perm_0 = const()[name = tensor("op_391_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_392 = const()[name = tensor("op_392"), val = tensor([1, 1370, 384])]; - tensor var_391_cast_fp16 = transpose(perm = var_391_perm_0, x = var_390_cast_fp16)[name = tensor("transpose_18")]; - tensor input_85_cast_fp16 = reshape(shape = var_392, x = var_391_cast_fp16)[name = tensor("input_85_cast_fp16")]; - tensor model_pretrained_blocks_4_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16599872)))]; - tensor model_pretrained_blocks_4_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16894848)))]; - tensor linear_17_cast_fp16 = linear(bias = model_pretrained_blocks_4_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_4_attn_proj_weight_to_fp16, x = input_85_cast_fp16)[name = tensor("linear_17_cast_fp16")]; - tensor model_pretrained_blocks_4_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16895680)))]; - tensor var_399_cast_fp16 = mul(x = linear_17_cast_fp16, y = model_pretrained_blocks_4_ls1_gamma_to_fp16)[name = tensor("op_399_cast_fp16")]; - tensor input_89_cast_fp16 = add(x = input_81_cast_fp16, y = var_399_cast_fp16)[name = tensor("input_89_cast_fp16")]; - tensor input_91_axes_0 = const()[name = tensor("input_91_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_4_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16896512)))]; - tensor model_pretrained_blocks_4_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16897344)))]; - tensor input_91_cast_fp16 = layer_norm(axes = input_91_axes_0, beta = model_pretrained_blocks_4_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_4_norm2_weight_to_fp16, x = input_89_cast_fp16)[name = tensor("input_91_cast_fp16")]; - tensor model_pretrained_blocks_4_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(16898176)))]; - tensor model_pretrained_blocks_4_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(18077888)))]; - tensor linear_18_cast_fp16 = linear(bias = model_pretrained_blocks_4_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_4_mlp_fc1_weight_to_fp16, x = input_91_cast_fp16)[name = tensor("linear_18_cast_fp16")]; - tensor input_95_mode_0 = const()[name = tensor("input_95_mode_0"), val = tensor("EXACT")]; - tensor input_95_cast_fp16 = gelu(mode = input_95_mode_0, x = linear_18_cast_fp16)[name = tensor("input_95_cast_fp16")]; - tensor model_pretrained_blocks_4_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(18081024)))]; - tensor model_pretrained_blocks_4_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(19260736)))]; - tensor linear_19_cast_fp16 = linear(bias = model_pretrained_blocks_4_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_4_mlp_fc2_weight_to_fp16, x = input_95_cast_fp16)[name = tensor("linear_19_cast_fp16")]; - tensor model_pretrained_blocks_4_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_4_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(19261568)))]; - tensor var_417_cast_fp16 = mul(x = linear_19_cast_fp16, y = model_pretrained_blocks_4_ls2_gamma_to_fp16)[name = tensor("op_417_cast_fp16")]; - tensor input_101_cast_fp16 = add(x = input_89_cast_fp16, y = var_417_cast_fp16)[name = tensor("input_101_cast_fp16")]; - tensor x_41_axes_0 = const()[name = tensor("x_41_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_5_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(19262400)))]; - tensor model_pretrained_blocks_5_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(19263232)))]; - tensor x_41_cast_fp16 = layer_norm(axes = x_41_axes_0, beta = model_pretrained_blocks_5_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_5_norm1_weight_to_fp16, x = input_101_cast_fp16)[name = tensor("x_41_cast_fp16")]; - tensor model_pretrained_blocks_5_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(19264064)))]; - tensor model_pretrained_blocks_5_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20148864)))]; - tensor linear_20_cast_fp16 = linear(bias = model_pretrained_blocks_5_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_5_attn_qkv_weight_to_fp16, x = x_41_cast_fp16)[name = tensor("linear_20_cast_fp16")]; - tensor var_440 = const()[name = tensor("op_440"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_441_cast_fp16 = reshape(shape = var_440, x = linear_20_cast_fp16)[name = tensor("op_441_cast_fp16")]; - tensor var_442 = const()[name = tensor("op_442"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_444_begin_0 = const()[name = tensor("op_444_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_444_end_0 = const()[name = tensor("op_444_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_444_end_mask_0 = const()[name = tensor("op_444_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_444_squeeze_mask_0 = const()[name = tensor("op_444_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_11_cast_fp16 = transpose(perm = var_442, x = var_441_cast_fp16)[name = tensor("transpose_17")]; - tensor var_444_cast_fp16 = slice_by_index(begin = var_444_begin_0, end = var_444_end_0, end_mask = var_444_end_mask_0, squeeze_mask = var_444_squeeze_mask_0, x = qkv_11_cast_fp16)[name = tensor("op_444_cast_fp16")]; - tensor var_445_to_fp16 = const()[name = tensor("op_445_to_fp16"), val = tensor(0x1p-3)]; - tensor q_11_cast_fp16 = mul(x = var_444_cast_fp16, y = var_445_to_fp16)[name = tensor("q_11_cast_fp16")]; - tensor k_11_begin_0 = const()[name = tensor("k_11_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_11_end_0 = const()[name = tensor("k_11_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_11_end_mask_0 = const()[name = tensor("k_11_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_11_squeeze_mask_0 = const()[name = tensor("k_11_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_11_cast_fp16 = slice_by_index(begin = k_11_begin_0, end = k_11_end_0, end_mask = k_11_end_mask_0, squeeze_mask = k_11_squeeze_mask_0, x = qkv_11_cast_fp16)[name = tensor("k_11_cast_fp16")]; - tensor v_11_begin_0 = const()[name = tensor("v_11_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_11_end_0 = const()[name = tensor("v_11_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_11_end_mask_0 = const()[name = tensor("v_11_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_11_squeeze_mask_0 = const()[name = tensor("v_11_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_11_cast_fp16 = slice_by_index(begin = v_11_begin_0, end = v_11_end_0, end_mask = v_11_end_mask_0, squeeze_mask = v_11_squeeze_mask_0, x = qkv_11_cast_fp16)[name = tensor("v_11_cast_fp16")]; - tensor attn_21_transpose_x_1 = const()[name = tensor("attn_21_transpose_x_1"), val = tensor(false)]; - tensor attn_21_transpose_y_1 = const()[name = tensor("attn_21_transpose_y_1"), val = tensor(true)]; - tensor attn_21_cast_fp16 = matmul(transpose_x = attn_21_transpose_x_1, transpose_y = attn_21_transpose_y_1, x = q_11_cast_fp16, y = k_11_cast_fp16)[name = tensor("attn_21_cast_fp16")]; - tensor input_103_cast_fp16 = softmax(axis = var_25, x = attn_21_cast_fp16)[name = tensor("input_103_cast_fp16")]; - tensor var_453_transpose_x_0 = const()[name = tensor("op_453_transpose_x_0"), val = tensor(false)]; - tensor var_453_transpose_y_0 = const()[name = tensor("op_453_transpose_y_0"), val = tensor(false)]; - tensor var_453_cast_fp16 = matmul(transpose_x = var_453_transpose_x_0, transpose_y = var_453_transpose_y_0, x = input_103_cast_fp16, y = v_11_cast_fp16)[name = tensor("op_453_cast_fp16")]; - tensor var_454_perm_0 = const()[name = tensor("op_454_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_455 = const()[name = tensor("op_455"), val = tensor([1, 1370, 384])]; - tensor var_454_cast_fp16 = transpose(perm = var_454_perm_0, x = var_453_cast_fp16)[name = tensor("transpose_16")]; - tensor input_105_cast_fp16 = reshape(shape = var_455, x = var_454_cast_fp16)[name = tensor("input_105_cast_fp16")]; - tensor model_pretrained_blocks_5_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20151232)))]; - tensor model_pretrained_blocks_5_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20446208)))]; - tensor linear_21_cast_fp16 = linear(bias = model_pretrained_blocks_5_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_5_attn_proj_weight_to_fp16, x = input_105_cast_fp16)[name = tensor("linear_21_cast_fp16")]; - tensor model_pretrained_blocks_5_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20447040)))]; - tensor var_462_cast_fp16 = mul(x = linear_21_cast_fp16, y = model_pretrained_blocks_5_ls1_gamma_to_fp16)[name = tensor("op_462_cast_fp16")]; - tensor input_109_cast_fp16 = add(x = input_101_cast_fp16, y = var_462_cast_fp16)[name = tensor("input_109_cast_fp16")]; - tensor input_111_axes_0 = const()[name = tensor("input_111_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_5_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20447872)))]; - tensor model_pretrained_blocks_5_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20448704)))]; - tensor input_111_cast_fp16 = layer_norm(axes = input_111_axes_0, beta = model_pretrained_blocks_5_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_5_norm2_weight_to_fp16, x = input_109_cast_fp16)[name = tensor("input_111_cast_fp16")]; - tensor model_pretrained_blocks_5_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(20449536)))]; - tensor model_pretrained_blocks_5_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(21629248)))]; - tensor linear_22_cast_fp16 = linear(bias = model_pretrained_blocks_5_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_5_mlp_fc1_weight_to_fp16, x = input_111_cast_fp16)[name = tensor("linear_22_cast_fp16")]; - tensor input_115_mode_0 = const()[name = tensor("input_115_mode_0"), val = tensor("EXACT")]; - tensor input_115_cast_fp16 = gelu(mode = input_115_mode_0, x = linear_22_cast_fp16)[name = tensor("input_115_cast_fp16")]; - tensor model_pretrained_blocks_5_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(21632384)))]; - tensor model_pretrained_blocks_5_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(22812096)))]; - tensor linear_23_cast_fp16 = linear(bias = model_pretrained_blocks_5_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_5_mlp_fc2_weight_to_fp16, x = input_115_cast_fp16)[name = tensor("linear_23_cast_fp16")]; - tensor model_pretrained_blocks_5_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_5_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(22812928)))]; - tensor var_480_cast_fp16 = mul(x = linear_23_cast_fp16, y = model_pretrained_blocks_5_ls2_gamma_to_fp16)[name = tensor("op_480_cast_fp16")]; - tensor input_121_cast_fp16 = add(x = input_109_cast_fp16, y = var_480_cast_fp16)[name = tensor("input_121_cast_fp16")]; - tensor x_47_axes_0 = const()[name = tensor("x_47_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_6_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(22813760)))]; - tensor model_pretrained_blocks_6_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(22814592)))]; - tensor x_47_cast_fp16 = layer_norm(axes = x_47_axes_0, beta = model_pretrained_blocks_6_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_6_norm1_weight_to_fp16, x = input_121_cast_fp16)[name = tensor("x_47_cast_fp16")]; - tensor model_pretrained_blocks_6_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(22815424)))]; - tensor model_pretrained_blocks_6_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(23700224)))]; - tensor linear_24_cast_fp16 = linear(bias = model_pretrained_blocks_6_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_6_attn_qkv_weight_to_fp16, x = x_47_cast_fp16)[name = tensor("linear_24_cast_fp16")]; - tensor var_503 = const()[name = tensor("op_503"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_504_cast_fp16 = reshape(shape = var_503, x = linear_24_cast_fp16)[name = tensor("op_504_cast_fp16")]; - tensor var_505 = const()[name = tensor("op_505"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_507_begin_0 = const()[name = tensor("op_507_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_507_end_0 = const()[name = tensor("op_507_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_507_end_mask_0 = const()[name = tensor("op_507_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_507_squeeze_mask_0 = const()[name = tensor("op_507_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_13_cast_fp16 = transpose(perm = var_505, x = var_504_cast_fp16)[name = tensor("transpose_15")]; - tensor var_507_cast_fp16 = slice_by_index(begin = var_507_begin_0, end = var_507_end_0, end_mask = var_507_end_mask_0, squeeze_mask = var_507_squeeze_mask_0, x = qkv_13_cast_fp16)[name = tensor("op_507_cast_fp16")]; - tensor var_508_to_fp16 = const()[name = tensor("op_508_to_fp16"), val = tensor(0x1p-3)]; - tensor q_13_cast_fp16 = mul(x = var_507_cast_fp16, y = var_508_to_fp16)[name = tensor("q_13_cast_fp16")]; - tensor k_13_begin_0 = const()[name = tensor("k_13_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_13_end_0 = const()[name = tensor("k_13_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_13_end_mask_0 = const()[name = tensor("k_13_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_13_squeeze_mask_0 = const()[name = tensor("k_13_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_13_cast_fp16 = slice_by_index(begin = k_13_begin_0, end = k_13_end_0, end_mask = k_13_end_mask_0, squeeze_mask = k_13_squeeze_mask_0, x = qkv_13_cast_fp16)[name = tensor("k_13_cast_fp16")]; - tensor v_13_begin_0 = const()[name = tensor("v_13_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_13_end_0 = const()[name = tensor("v_13_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_13_end_mask_0 = const()[name = tensor("v_13_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_13_squeeze_mask_0 = const()[name = tensor("v_13_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_13_cast_fp16 = slice_by_index(begin = v_13_begin_0, end = v_13_end_0, end_mask = v_13_end_mask_0, squeeze_mask = v_13_squeeze_mask_0, x = qkv_13_cast_fp16)[name = tensor("v_13_cast_fp16")]; - tensor attn_25_transpose_x_1 = const()[name = tensor("attn_25_transpose_x_1"), val = tensor(false)]; - tensor attn_25_transpose_y_1 = const()[name = tensor("attn_25_transpose_y_1"), val = tensor(true)]; - tensor attn_25_cast_fp16 = matmul(transpose_x = attn_25_transpose_x_1, transpose_y = attn_25_transpose_y_1, x = q_13_cast_fp16, y = k_13_cast_fp16)[name = tensor("attn_25_cast_fp16")]; - tensor input_123_cast_fp16 = softmax(axis = var_25, x = attn_25_cast_fp16)[name = tensor("input_123_cast_fp16")]; - tensor var_516_transpose_x_0 = const()[name = tensor("op_516_transpose_x_0"), val = tensor(false)]; - tensor var_516_transpose_y_0 = const()[name = tensor("op_516_transpose_y_0"), val = tensor(false)]; - tensor var_516_cast_fp16 = matmul(transpose_x = var_516_transpose_x_0, transpose_y = var_516_transpose_y_0, x = input_123_cast_fp16, y = v_13_cast_fp16)[name = tensor("op_516_cast_fp16")]; - tensor var_517_perm_0 = const()[name = tensor("op_517_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_518 = const()[name = tensor("op_518"), val = tensor([1, 1370, 384])]; - tensor var_517_cast_fp16 = transpose(perm = var_517_perm_0, x = var_516_cast_fp16)[name = tensor("transpose_14")]; - tensor input_125_cast_fp16 = reshape(shape = var_518, x = var_517_cast_fp16)[name = tensor("input_125_cast_fp16")]; - tensor model_pretrained_blocks_6_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(23702592)))]; - tensor model_pretrained_blocks_6_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(23997568)))]; - tensor linear_25_cast_fp16 = linear(bias = model_pretrained_blocks_6_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_6_attn_proj_weight_to_fp16, x = input_125_cast_fp16)[name = tensor("linear_25_cast_fp16")]; - tensor model_pretrained_blocks_6_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(23998400)))]; - tensor var_525_cast_fp16 = mul(x = linear_25_cast_fp16, y = model_pretrained_blocks_6_ls1_gamma_to_fp16)[name = tensor("op_525_cast_fp16")]; - tensor input_129_cast_fp16 = add(x = input_121_cast_fp16, y = var_525_cast_fp16)[name = tensor("input_129_cast_fp16")]; - tensor input_131_axes_0 = const()[name = tensor("input_131_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_6_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(23999232)))]; - tensor model_pretrained_blocks_6_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(24000064)))]; - tensor input_131_cast_fp16 = layer_norm(axes = input_131_axes_0, beta = model_pretrained_blocks_6_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_6_norm2_weight_to_fp16, x = input_129_cast_fp16)[name = tensor("input_131_cast_fp16")]; - tensor model_pretrained_blocks_6_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(24000896)))]; - tensor model_pretrained_blocks_6_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(25180608)))]; - tensor linear_26_cast_fp16 = linear(bias = model_pretrained_blocks_6_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_6_mlp_fc1_weight_to_fp16, x = input_131_cast_fp16)[name = tensor("linear_26_cast_fp16")]; - tensor input_135_mode_0 = const()[name = tensor("input_135_mode_0"), val = tensor("EXACT")]; - tensor input_135_cast_fp16 = gelu(mode = input_135_mode_0, x = linear_26_cast_fp16)[name = tensor("input_135_cast_fp16")]; - tensor model_pretrained_blocks_6_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(25183744)))]; - tensor model_pretrained_blocks_6_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(26363456)))]; - tensor linear_27_cast_fp16 = linear(bias = model_pretrained_blocks_6_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_6_mlp_fc2_weight_to_fp16, x = input_135_cast_fp16)[name = tensor("linear_27_cast_fp16")]; - tensor model_pretrained_blocks_6_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_6_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(26364288)))]; - tensor var_543_cast_fp16 = mul(x = linear_27_cast_fp16, y = model_pretrained_blocks_6_ls2_gamma_to_fp16)[name = tensor("op_543_cast_fp16")]; - tensor input_141_cast_fp16 = add(x = input_129_cast_fp16, y = var_543_cast_fp16)[name = tensor("input_141_cast_fp16")]; - tensor x_53_axes_0 = const()[name = tensor("x_53_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_7_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(26365120)))]; - tensor model_pretrained_blocks_7_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(26365952)))]; - tensor x_53_cast_fp16 = layer_norm(axes = x_53_axes_0, beta = model_pretrained_blocks_7_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_7_norm1_weight_to_fp16, x = input_141_cast_fp16)[name = tensor("x_53_cast_fp16")]; - tensor model_pretrained_blocks_7_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(26366784)))]; - tensor model_pretrained_blocks_7_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27251584)))]; - tensor linear_28_cast_fp16 = linear(bias = model_pretrained_blocks_7_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_7_attn_qkv_weight_to_fp16, x = x_53_cast_fp16)[name = tensor("linear_28_cast_fp16")]; - tensor var_566 = const()[name = tensor("op_566"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_567_cast_fp16 = reshape(shape = var_566, x = linear_28_cast_fp16)[name = tensor("op_567_cast_fp16")]; - tensor var_568 = const()[name = tensor("op_568"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_570_begin_0 = const()[name = tensor("op_570_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_570_end_0 = const()[name = tensor("op_570_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_570_end_mask_0 = const()[name = tensor("op_570_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_570_squeeze_mask_0 = const()[name = tensor("op_570_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_15_cast_fp16 = transpose(perm = var_568, x = var_567_cast_fp16)[name = tensor("transpose_13")]; - tensor var_570_cast_fp16 = slice_by_index(begin = var_570_begin_0, end = var_570_end_0, end_mask = var_570_end_mask_0, squeeze_mask = var_570_squeeze_mask_0, x = qkv_15_cast_fp16)[name = tensor("op_570_cast_fp16")]; - tensor var_571_to_fp16 = const()[name = tensor("op_571_to_fp16"), val = tensor(0x1p-3)]; - tensor q_15_cast_fp16 = mul(x = var_570_cast_fp16, y = var_571_to_fp16)[name = tensor("q_15_cast_fp16")]; - tensor k_15_begin_0 = const()[name = tensor("k_15_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_15_end_0 = const()[name = tensor("k_15_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_15_end_mask_0 = const()[name = tensor("k_15_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_15_squeeze_mask_0 = const()[name = tensor("k_15_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_15_cast_fp16 = slice_by_index(begin = k_15_begin_0, end = k_15_end_0, end_mask = k_15_end_mask_0, squeeze_mask = k_15_squeeze_mask_0, x = qkv_15_cast_fp16)[name = tensor("k_15_cast_fp16")]; - tensor v_15_begin_0 = const()[name = tensor("v_15_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_15_end_0 = const()[name = tensor("v_15_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_15_end_mask_0 = const()[name = tensor("v_15_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_15_squeeze_mask_0 = const()[name = tensor("v_15_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_15_cast_fp16 = slice_by_index(begin = v_15_begin_0, end = v_15_end_0, end_mask = v_15_end_mask_0, squeeze_mask = v_15_squeeze_mask_0, x = qkv_15_cast_fp16)[name = tensor("v_15_cast_fp16")]; - tensor attn_29_transpose_x_1 = const()[name = tensor("attn_29_transpose_x_1"), val = tensor(false)]; - tensor attn_29_transpose_y_1 = const()[name = tensor("attn_29_transpose_y_1"), val = tensor(true)]; - tensor attn_29_cast_fp16 = matmul(transpose_x = attn_29_transpose_x_1, transpose_y = attn_29_transpose_y_1, x = q_15_cast_fp16, y = k_15_cast_fp16)[name = tensor("attn_29_cast_fp16")]; - tensor input_143_cast_fp16 = softmax(axis = var_25, x = attn_29_cast_fp16)[name = tensor("input_143_cast_fp16")]; - tensor var_579_transpose_x_0 = const()[name = tensor("op_579_transpose_x_0"), val = tensor(false)]; - tensor var_579_transpose_y_0 = const()[name = tensor("op_579_transpose_y_0"), val = tensor(false)]; - tensor var_579_cast_fp16 = matmul(transpose_x = var_579_transpose_x_0, transpose_y = var_579_transpose_y_0, x = input_143_cast_fp16, y = v_15_cast_fp16)[name = tensor("op_579_cast_fp16")]; - tensor var_580_perm_0 = const()[name = tensor("op_580_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_581 = const()[name = tensor("op_581"), val = tensor([1, 1370, 384])]; - tensor var_580_cast_fp16 = transpose(perm = var_580_perm_0, x = var_579_cast_fp16)[name = tensor("transpose_12")]; - tensor input_145_cast_fp16 = reshape(shape = var_581, x = var_580_cast_fp16)[name = tensor("input_145_cast_fp16")]; - tensor model_pretrained_blocks_7_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27253952)))]; - tensor model_pretrained_blocks_7_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27548928)))]; - tensor linear_29_cast_fp16 = linear(bias = model_pretrained_blocks_7_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_7_attn_proj_weight_to_fp16, x = input_145_cast_fp16)[name = tensor("linear_29_cast_fp16")]; - tensor model_pretrained_blocks_7_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27549760)))]; - tensor var_588_cast_fp16 = mul(x = linear_29_cast_fp16, y = model_pretrained_blocks_7_ls1_gamma_to_fp16)[name = tensor("op_588_cast_fp16")]; - tensor input_149_cast_fp16 = add(x = input_141_cast_fp16, y = var_588_cast_fp16)[name = tensor("input_149_cast_fp16")]; - tensor input_151_axes_0 = const()[name = tensor("input_151_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_7_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27550592)))]; - tensor model_pretrained_blocks_7_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27551424)))]; - tensor input_151_cast_fp16 = layer_norm(axes = input_151_axes_0, beta = model_pretrained_blocks_7_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_7_norm2_weight_to_fp16, x = input_149_cast_fp16)[name = tensor("input_151_cast_fp16")]; - tensor model_pretrained_blocks_7_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(27552256)))]; - tensor model_pretrained_blocks_7_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(28731968)))]; - tensor linear_30_cast_fp16 = linear(bias = model_pretrained_blocks_7_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_7_mlp_fc1_weight_to_fp16, x = input_151_cast_fp16)[name = tensor("linear_30_cast_fp16")]; - tensor input_155_mode_0 = const()[name = tensor("input_155_mode_0"), val = tensor("EXACT")]; - tensor input_155_cast_fp16 = gelu(mode = input_155_mode_0, x = linear_30_cast_fp16)[name = tensor("input_155_cast_fp16")]; - tensor model_pretrained_blocks_7_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(28735104)))]; - tensor model_pretrained_blocks_7_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(29914816)))]; - tensor linear_31_cast_fp16 = linear(bias = model_pretrained_blocks_7_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_7_mlp_fc2_weight_to_fp16, x = input_155_cast_fp16)[name = tensor("linear_31_cast_fp16")]; - tensor model_pretrained_blocks_7_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_7_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(29915648)))]; - tensor var_606_cast_fp16 = mul(x = linear_31_cast_fp16, y = model_pretrained_blocks_7_ls2_gamma_to_fp16)[name = tensor("op_606_cast_fp16")]; - tensor input_161_cast_fp16 = add(x = input_149_cast_fp16, y = var_606_cast_fp16)[name = tensor("input_161_cast_fp16")]; - tensor x_59_axes_0 = const()[name = tensor("x_59_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_8_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(29916480)))]; - tensor model_pretrained_blocks_8_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(29917312)))]; - tensor x_59_cast_fp16 = layer_norm(axes = x_59_axes_0, beta = model_pretrained_blocks_8_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_8_norm1_weight_to_fp16, x = input_161_cast_fp16)[name = tensor("x_59_cast_fp16")]; - tensor model_pretrained_blocks_8_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(29918144)))]; - tensor model_pretrained_blocks_8_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(30802944)))]; - tensor linear_32_cast_fp16 = linear(bias = model_pretrained_blocks_8_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_8_attn_qkv_weight_to_fp16, x = x_59_cast_fp16)[name = tensor("linear_32_cast_fp16")]; - tensor var_629 = const()[name = tensor("op_629"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_630_cast_fp16 = reshape(shape = var_629, x = linear_32_cast_fp16)[name = tensor("op_630_cast_fp16")]; - tensor var_631 = const()[name = tensor("op_631"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_633_begin_0 = const()[name = tensor("op_633_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_633_end_0 = const()[name = tensor("op_633_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_633_end_mask_0 = const()[name = tensor("op_633_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_633_squeeze_mask_0 = const()[name = tensor("op_633_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_17_cast_fp16 = transpose(perm = var_631, x = var_630_cast_fp16)[name = tensor("transpose_11")]; - tensor var_633_cast_fp16 = slice_by_index(begin = var_633_begin_0, end = var_633_end_0, end_mask = var_633_end_mask_0, squeeze_mask = var_633_squeeze_mask_0, x = qkv_17_cast_fp16)[name = tensor("op_633_cast_fp16")]; - tensor var_634_to_fp16 = const()[name = tensor("op_634_to_fp16"), val = tensor(0x1p-3)]; - tensor q_17_cast_fp16 = mul(x = var_633_cast_fp16, y = var_634_to_fp16)[name = tensor("q_17_cast_fp16")]; - tensor k_17_begin_0 = const()[name = tensor("k_17_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_17_end_0 = const()[name = tensor("k_17_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_17_end_mask_0 = const()[name = tensor("k_17_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_17_squeeze_mask_0 = const()[name = tensor("k_17_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_17_cast_fp16 = slice_by_index(begin = k_17_begin_0, end = k_17_end_0, end_mask = k_17_end_mask_0, squeeze_mask = k_17_squeeze_mask_0, x = qkv_17_cast_fp16)[name = tensor("k_17_cast_fp16")]; - tensor v_17_begin_0 = const()[name = tensor("v_17_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_17_end_0 = const()[name = tensor("v_17_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_17_end_mask_0 = const()[name = tensor("v_17_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_17_squeeze_mask_0 = const()[name = tensor("v_17_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_17_cast_fp16 = slice_by_index(begin = v_17_begin_0, end = v_17_end_0, end_mask = v_17_end_mask_0, squeeze_mask = v_17_squeeze_mask_0, x = qkv_17_cast_fp16)[name = tensor("v_17_cast_fp16")]; - tensor attn_33_transpose_x_1 = const()[name = tensor("attn_33_transpose_x_1"), val = tensor(false)]; - tensor attn_33_transpose_y_1 = const()[name = tensor("attn_33_transpose_y_1"), val = tensor(true)]; - tensor attn_33_cast_fp16 = matmul(transpose_x = attn_33_transpose_x_1, transpose_y = attn_33_transpose_y_1, x = q_17_cast_fp16, y = k_17_cast_fp16)[name = tensor("attn_33_cast_fp16")]; - tensor input_163_cast_fp16 = softmax(axis = var_25, x = attn_33_cast_fp16)[name = tensor("input_163_cast_fp16")]; - tensor var_642_transpose_x_0 = const()[name = tensor("op_642_transpose_x_0"), val = tensor(false)]; - tensor var_642_transpose_y_0 = const()[name = tensor("op_642_transpose_y_0"), val = tensor(false)]; - tensor var_642_cast_fp16 = matmul(transpose_x = var_642_transpose_x_0, transpose_y = var_642_transpose_y_0, x = input_163_cast_fp16, y = v_17_cast_fp16)[name = tensor("op_642_cast_fp16")]; - tensor var_643_perm_0 = const()[name = tensor("op_643_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_644 = const()[name = tensor("op_644"), val = tensor([1, 1370, 384])]; - tensor var_643_cast_fp16 = transpose(perm = var_643_perm_0, x = var_642_cast_fp16)[name = tensor("transpose_10")]; - tensor input_165_cast_fp16 = reshape(shape = var_644, x = var_643_cast_fp16)[name = tensor("input_165_cast_fp16")]; - tensor model_pretrained_blocks_8_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(30805312)))]; - tensor model_pretrained_blocks_8_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(31100288)))]; - tensor linear_33_cast_fp16 = linear(bias = model_pretrained_blocks_8_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_8_attn_proj_weight_to_fp16, x = input_165_cast_fp16)[name = tensor("linear_33_cast_fp16")]; - tensor model_pretrained_blocks_8_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(31101120)))]; - tensor var_651_cast_fp16 = mul(x = linear_33_cast_fp16, y = model_pretrained_blocks_8_ls1_gamma_to_fp16)[name = tensor("op_651_cast_fp16")]; - tensor input_169_cast_fp16 = add(x = input_161_cast_fp16, y = var_651_cast_fp16)[name = tensor("input_169_cast_fp16")]; - tensor input_171_axes_0 = const()[name = tensor("input_171_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_8_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(31101952)))]; - tensor model_pretrained_blocks_8_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(31102784)))]; - tensor input_171_cast_fp16 = layer_norm(axes = input_171_axes_0, beta = model_pretrained_blocks_8_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_8_norm2_weight_to_fp16, x = input_169_cast_fp16)[name = tensor("input_171_cast_fp16")]; - tensor model_pretrained_blocks_8_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(31103616)))]; - tensor model_pretrained_blocks_8_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(32283328)))]; - tensor linear_34_cast_fp16 = linear(bias = model_pretrained_blocks_8_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_8_mlp_fc1_weight_to_fp16, x = input_171_cast_fp16)[name = tensor("linear_34_cast_fp16")]; - tensor input_175_mode_0 = const()[name = tensor("input_175_mode_0"), val = tensor("EXACT")]; - tensor input_175_cast_fp16 = gelu(mode = input_175_mode_0, x = linear_34_cast_fp16)[name = tensor("input_175_cast_fp16")]; - tensor model_pretrained_blocks_8_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(32286464)))]; - tensor model_pretrained_blocks_8_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(33466176)))]; - tensor linear_35_cast_fp16 = linear(bias = model_pretrained_blocks_8_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_8_mlp_fc2_weight_to_fp16, x = input_175_cast_fp16)[name = tensor("linear_35_cast_fp16")]; - tensor model_pretrained_blocks_8_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_8_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(33467008)))]; - tensor var_669_cast_fp16 = mul(x = linear_35_cast_fp16, y = model_pretrained_blocks_8_ls2_gamma_to_fp16)[name = tensor("op_669_cast_fp16")]; - tensor input_181_cast_fp16 = add(x = input_169_cast_fp16, y = var_669_cast_fp16)[name = tensor("input_181_cast_fp16")]; - tensor x_65_axes_0 = const()[name = tensor("x_65_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_9_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(33467840)))]; - tensor model_pretrained_blocks_9_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(33468672)))]; - tensor x_65_cast_fp16 = layer_norm(axes = x_65_axes_0, beta = model_pretrained_blocks_9_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_9_norm1_weight_to_fp16, x = input_181_cast_fp16)[name = tensor("x_65_cast_fp16")]; - tensor model_pretrained_blocks_9_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(33469504)))]; - tensor model_pretrained_blocks_9_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34354304)))]; - tensor linear_36_cast_fp16 = linear(bias = model_pretrained_blocks_9_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_9_attn_qkv_weight_to_fp16, x = x_65_cast_fp16)[name = tensor("linear_36_cast_fp16")]; - tensor var_692 = const()[name = tensor("op_692"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_693_cast_fp16 = reshape(shape = var_692, x = linear_36_cast_fp16)[name = tensor("op_693_cast_fp16")]; - tensor var_694 = const()[name = tensor("op_694"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_696_begin_0 = const()[name = tensor("op_696_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_696_end_0 = const()[name = tensor("op_696_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_696_end_mask_0 = const()[name = tensor("op_696_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_696_squeeze_mask_0 = const()[name = tensor("op_696_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_19_cast_fp16 = transpose(perm = var_694, x = var_693_cast_fp16)[name = tensor("transpose_9")]; - tensor var_696_cast_fp16 = slice_by_index(begin = var_696_begin_0, end = var_696_end_0, end_mask = var_696_end_mask_0, squeeze_mask = var_696_squeeze_mask_0, x = qkv_19_cast_fp16)[name = tensor("op_696_cast_fp16")]; - tensor var_697_to_fp16 = const()[name = tensor("op_697_to_fp16"), val = tensor(0x1p-3)]; - tensor q_19_cast_fp16 = mul(x = var_696_cast_fp16, y = var_697_to_fp16)[name = tensor("q_19_cast_fp16")]; - tensor k_19_begin_0 = const()[name = tensor("k_19_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_19_end_0 = const()[name = tensor("k_19_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_19_end_mask_0 = const()[name = tensor("k_19_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_19_squeeze_mask_0 = const()[name = tensor("k_19_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_19_cast_fp16 = slice_by_index(begin = k_19_begin_0, end = k_19_end_0, end_mask = k_19_end_mask_0, squeeze_mask = k_19_squeeze_mask_0, x = qkv_19_cast_fp16)[name = tensor("k_19_cast_fp16")]; - tensor v_19_begin_0 = const()[name = tensor("v_19_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_19_end_0 = const()[name = tensor("v_19_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_19_end_mask_0 = const()[name = tensor("v_19_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_19_squeeze_mask_0 = const()[name = tensor("v_19_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_19_cast_fp16 = slice_by_index(begin = v_19_begin_0, end = v_19_end_0, end_mask = v_19_end_mask_0, squeeze_mask = v_19_squeeze_mask_0, x = qkv_19_cast_fp16)[name = tensor("v_19_cast_fp16")]; - tensor attn_37_transpose_x_1 = const()[name = tensor("attn_37_transpose_x_1"), val = tensor(false)]; - tensor attn_37_transpose_y_1 = const()[name = tensor("attn_37_transpose_y_1"), val = tensor(true)]; - tensor attn_37_cast_fp16 = matmul(transpose_x = attn_37_transpose_x_1, transpose_y = attn_37_transpose_y_1, x = q_19_cast_fp16, y = k_19_cast_fp16)[name = tensor("attn_37_cast_fp16")]; - tensor input_183_cast_fp16 = softmax(axis = var_25, x = attn_37_cast_fp16)[name = tensor("input_183_cast_fp16")]; - tensor var_705_transpose_x_0 = const()[name = tensor("op_705_transpose_x_0"), val = tensor(false)]; - tensor var_705_transpose_y_0 = const()[name = tensor("op_705_transpose_y_0"), val = tensor(false)]; - tensor var_705_cast_fp16 = matmul(transpose_x = var_705_transpose_x_0, transpose_y = var_705_transpose_y_0, x = input_183_cast_fp16, y = v_19_cast_fp16)[name = tensor("op_705_cast_fp16")]; - tensor var_706_perm_0 = const()[name = tensor("op_706_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_707 = const()[name = tensor("op_707"), val = tensor([1, 1370, 384])]; - tensor var_706_cast_fp16 = transpose(perm = var_706_perm_0, x = var_705_cast_fp16)[name = tensor("transpose_8")]; - tensor input_185_cast_fp16 = reshape(shape = var_707, x = var_706_cast_fp16)[name = tensor("input_185_cast_fp16")]; - tensor model_pretrained_blocks_9_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34356672)))]; - tensor model_pretrained_blocks_9_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34651648)))]; - tensor linear_37_cast_fp16 = linear(bias = model_pretrained_blocks_9_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_9_attn_proj_weight_to_fp16, x = input_185_cast_fp16)[name = tensor("linear_37_cast_fp16")]; - tensor model_pretrained_blocks_9_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34652480)))]; - tensor var_714_cast_fp16 = mul(x = linear_37_cast_fp16, y = model_pretrained_blocks_9_ls1_gamma_to_fp16)[name = tensor("op_714_cast_fp16")]; - tensor input_189_cast_fp16 = add(x = input_181_cast_fp16, y = var_714_cast_fp16)[name = tensor("input_189_cast_fp16")]; - tensor input_191_axes_0 = const()[name = tensor("input_191_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_9_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34653312)))]; - tensor model_pretrained_blocks_9_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34654144)))]; - tensor input_191_cast_fp16 = layer_norm(axes = input_191_axes_0, beta = model_pretrained_blocks_9_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_9_norm2_weight_to_fp16, x = input_189_cast_fp16)[name = tensor("input_191_cast_fp16")]; - tensor model_pretrained_blocks_9_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(34654976)))]; - tensor model_pretrained_blocks_9_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(35834688)))]; - tensor linear_38_cast_fp16 = linear(bias = model_pretrained_blocks_9_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_9_mlp_fc1_weight_to_fp16, x = input_191_cast_fp16)[name = tensor("linear_38_cast_fp16")]; - tensor input_195_mode_0 = const()[name = tensor("input_195_mode_0"), val = tensor("EXACT")]; - tensor input_195_cast_fp16 = gelu(mode = input_195_mode_0, x = linear_38_cast_fp16)[name = tensor("input_195_cast_fp16")]; - tensor model_pretrained_blocks_9_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(35837824)))]; - tensor model_pretrained_blocks_9_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37017536)))]; - tensor linear_39_cast_fp16 = linear(bias = model_pretrained_blocks_9_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_9_mlp_fc2_weight_to_fp16, x = input_195_cast_fp16)[name = tensor("linear_39_cast_fp16")]; - tensor model_pretrained_blocks_9_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_9_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37018368)))]; - tensor var_732_cast_fp16 = mul(x = linear_39_cast_fp16, y = model_pretrained_blocks_9_ls2_gamma_to_fp16)[name = tensor("op_732_cast_fp16")]; - tensor input_201_cast_fp16 = add(x = input_189_cast_fp16, y = var_732_cast_fp16)[name = tensor("input_201_cast_fp16")]; - tensor x_71_axes_0 = const()[name = tensor("x_71_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_10_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37019200)))]; - tensor model_pretrained_blocks_10_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37020032)))]; - tensor x_71_cast_fp16 = layer_norm(axes = x_71_axes_0, beta = model_pretrained_blocks_10_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_10_norm1_weight_to_fp16, x = input_201_cast_fp16)[name = tensor("x_71_cast_fp16")]; - tensor model_pretrained_blocks_10_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37020864)))]; - tensor model_pretrained_blocks_10_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37905664)))]; - tensor linear_40_cast_fp16 = linear(bias = model_pretrained_blocks_10_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_10_attn_qkv_weight_to_fp16, x = x_71_cast_fp16)[name = tensor("linear_40_cast_fp16")]; - tensor var_755 = const()[name = tensor("op_755"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_756_cast_fp16 = reshape(shape = var_755, x = linear_40_cast_fp16)[name = tensor("op_756_cast_fp16")]; - tensor var_757 = const()[name = tensor("op_757"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_759_begin_0 = const()[name = tensor("op_759_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_759_end_0 = const()[name = tensor("op_759_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_759_end_mask_0 = const()[name = tensor("op_759_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_759_squeeze_mask_0 = const()[name = tensor("op_759_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_21_cast_fp16 = transpose(perm = var_757, x = var_756_cast_fp16)[name = tensor("transpose_7")]; - tensor var_759_cast_fp16 = slice_by_index(begin = var_759_begin_0, end = var_759_end_0, end_mask = var_759_end_mask_0, squeeze_mask = var_759_squeeze_mask_0, x = qkv_21_cast_fp16)[name = tensor("op_759_cast_fp16")]; - tensor var_760_to_fp16 = const()[name = tensor("op_760_to_fp16"), val = tensor(0x1p-3)]; - tensor q_21_cast_fp16 = mul(x = var_759_cast_fp16, y = var_760_to_fp16)[name = tensor("q_21_cast_fp16")]; - tensor k_21_begin_0 = const()[name = tensor("k_21_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_21_end_0 = const()[name = tensor("k_21_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_21_end_mask_0 = const()[name = tensor("k_21_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_21_squeeze_mask_0 = const()[name = tensor("k_21_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_21_cast_fp16 = slice_by_index(begin = k_21_begin_0, end = k_21_end_0, end_mask = k_21_end_mask_0, squeeze_mask = k_21_squeeze_mask_0, x = qkv_21_cast_fp16)[name = tensor("k_21_cast_fp16")]; - tensor v_21_begin_0 = const()[name = tensor("v_21_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_21_end_0 = const()[name = tensor("v_21_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_21_end_mask_0 = const()[name = tensor("v_21_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_21_squeeze_mask_0 = const()[name = tensor("v_21_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_21_cast_fp16 = slice_by_index(begin = v_21_begin_0, end = v_21_end_0, end_mask = v_21_end_mask_0, squeeze_mask = v_21_squeeze_mask_0, x = qkv_21_cast_fp16)[name = tensor("v_21_cast_fp16")]; - tensor attn_41_transpose_x_1 = const()[name = tensor("attn_41_transpose_x_1"), val = tensor(false)]; - tensor attn_41_transpose_y_1 = const()[name = tensor("attn_41_transpose_y_1"), val = tensor(true)]; - tensor attn_41_cast_fp16 = matmul(transpose_x = attn_41_transpose_x_1, transpose_y = attn_41_transpose_y_1, x = q_21_cast_fp16, y = k_21_cast_fp16)[name = tensor("attn_41_cast_fp16")]; - tensor input_203_cast_fp16 = softmax(axis = var_25, x = attn_41_cast_fp16)[name = tensor("input_203_cast_fp16")]; - tensor var_768_transpose_x_0 = const()[name = tensor("op_768_transpose_x_0"), val = tensor(false)]; - tensor var_768_transpose_y_0 = const()[name = tensor("op_768_transpose_y_0"), val = tensor(false)]; - tensor var_768_cast_fp16 = matmul(transpose_x = var_768_transpose_x_0, transpose_y = var_768_transpose_y_0, x = input_203_cast_fp16, y = v_21_cast_fp16)[name = tensor("op_768_cast_fp16")]; - tensor var_769_perm_0 = const()[name = tensor("op_769_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_770 = const()[name = tensor("op_770"), val = tensor([1, 1370, 384])]; - tensor var_769_cast_fp16 = transpose(perm = var_769_perm_0, x = var_768_cast_fp16)[name = tensor("transpose_6")]; - tensor input_205_cast_fp16 = reshape(shape = var_770, x = var_769_cast_fp16)[name = tensor("input_205_cast_fp16")]; - tensor model_pretrained_blocks_10_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(37908032)))]; - tensor model_pretrained_blocks_10_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(38203008)))]; - tensor linear_41_cast_fp16 = linear(bias = model_pretrained_blocks_10_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_10_attn_proj_weight_to_fp16, x = input_205_cast_fp16)[name = tensor("linear_41_cast_fp16")]; - tensor model_pretrained_blocks_10_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(38203840)))]; - tensor var_777_cast_fp16 = mul(x = linear_41_cast_fp16, y = model_pretrained_blocks_10_ls1_gamma_to_fp16)[name = tensor("op_777_cast_fp16")]; - tensor input_209_cast_fp16 = add(x = input_201_cast_fp16, y = var_777_cast_fp16)[name = tensor("input_209_cast_fp16")]; - tensor input_211_axes_0 = const()[name = tensor("input_211_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_10_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(38204672)))]; - tensor model_pretrained_blocks_10_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(38205504)))]; - tensor input_211_cast_fp16 = layer_norm(axes = input_211_axes_0, beta = model_pretrained_blocks_10_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_10_norm2_weight_to_fp16, x = input_209_cast_fp16)[name = tensor("input_211_cast_fp16")]; - tensor model_pretrained_blocks_10_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(38206336)))]; - tensor model_pretrained_blocks_10_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(39386048)))]; - tensor linear_42_cast_fp16 = linear(bias = model_pretrained_blocks_10_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_10_mlp_fc1_weight_to_fp16, x = input_211_cast_fp16)[name = tensor("linear_42_cast_fp16")]; - tensor input_215_mode_0 = const()[name = tensor("input_215_mode_0"), val = tensor("EXACT")]; - tensor input_215_cast_fp16 = gelu(mode = input_215_mode_0, x = linear_42_cast_fp16)[name = tensor("input_215_cast_fp16")]; - tensor model_pretrained_blocks_10_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(39389184)))]; - tensor model_pretrained_blocks_10_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(40568896)))]; - tensor linear_43_cast_fp16 = linear(bias = model_pretrained_blocks_10_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_10_mlp_fc2_weight_to_fp16, x = input_215_cast_fp16)[name = tensor("linear_43_cast_fp16")]; - tensor model_pretrained_blocks_10_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_10_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(40569728)))]; - tensor var_795_cast_fp16 = mul(x = linear_43_cast_fp16, y = model_pretrained_blocks_10_ls2_gamma_to_fp16)[name = tensor("op_795_cast_fp16")]; - tensor input_221_cast_fp16 = add(x = input_209_cast_fp16, y = var_795_cast_fp16)[name = tensor("input_221_cast_fp16")]; - tensor x_77_axes_0 = const()[name = tensor("x_77_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_11_norm1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_norm1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(40570560)))]; - tensor model_pretrained_blocks_11_norm1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_norm1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(40571392)))]; - tensor x_77_cast_fp16 = layer_norm(axes = x_77_axes_0, beta = model_pretrained_blocks_11_norm1_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_11_norm1_weight_to_fp16, x = input_221_cast_fp16)[name = tensor("x_77_cast_fp16")]; - tensor model_pretrained_blocks_11_attn_qkv_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_attn_qkv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(40572224)))]; - tensor model_pretrained_blocks_11_attn_qkv_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_attn_qkv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41457024)))]; - tensor linear_44_cast_fp16 = linear(bias = model_pretrained_blocks_11_attn_qkv_bias_to_fp16, weight = model_pretrained_blocks_11_attn_qkv_weight_to_fp16, x = x_77_cast_fp16)[name = tensor("linear_44_cast_fp16")]; - tensor var_818 = const()[name = tensor("op_818"), val = tensor([1, 1370, 3, 6, 64])]; - tensor var_819_cast_fp16 = reshape(shape = var_818, x = linear_44_cast_fp16)[name = tensor("op_819_cast_fp16")]; - tensor var_820 = const()[name = tensor("op_820"), val = tensor([2, 0, 3, 1, 4])]; - tensor var_822_begin_0 = const()[name = tensor("op_822_begin_0"), val = tensor([0, 0, 0, 0, 0])]; - tensor var_822_end_0 = const()[name = tensor("op_822_end_0"), val = tensor([1, 1, 6, 1370, 64])]; - tensor var_822_end_mask_0 = const()[name = tensor("op_822_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor var_822_squeeze_mask_0 = const()[name = tensor("op_822_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor qkv_23_cast_fp16 = transpose(perm = var_820, x = var_819_cast_fp16)[name = tensor("transpose_5")]; - tensor var_822_cast_fp16 = slice_by_index(begin = var_822_begin_0, end = var_822_end_0, end_mask = var_822_end_mask_0, squeeze_mask = var_822_squeeze_mask_0, x = qkv_23_cast_fp16)[name = tensor("op_822_cast_fp16")]; - tensor var_823_to_fp16 = const()[name = tensor("op_823_to_fp16"), val = tensor(0x1p-3)]; - tensor q_cast_fp16 = mul(x = var_822_cast_fp16, y = var_823_to_fp16)[name = tensor("q_cast_fp16")]; - tensor k_begin_0 = const()[name = tensor("k_begin_0"), val = tensor([1, 0, 0, 0, 0])]; - tensor k_end_0 = const()[name = tensor("k_end_0"), val = tensor([2, 1, 6, 1370, 64])]; - tensor k_end_mask_0 = const()[name = tensor("k_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor k_squeeze_mask_0 = const()[name = tensor("k_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor k_cast_fp16 = slice_by_index(begin = k_begin_0, end = k_end_0, end_mask = k_end_mask_0, squeeze_mask = k_squeeze_mask_0, x = qkv_23_cast_fp16)[name = tensor("k_cast_fp16")]; - tensor v_begin_0 = const()[name = tensor("v_begin_0"), val = tensor([2, 0, 0, 0, 0])]; - tensor v_end_0 = const()[name = tensor("v_end_0"), val = tensor([3, 1, 6, 1370, 64])]; - tensor v_end_mask_0 = const()[name = tensor("v_end_mask_0"), val = tensor([false, true, true, true, true])]; - tensor v_squeeze_mask_0 = const()[name = tensor("v_squeeze_mask_0"), val = tensor([true, false, false, false, false])]; - tensor v_cast_fp16 = slice_by_index(begin = v_begin_0, end = v_end_0, end_mask = v_end_mask_0, squeeze_mask = v_squeeze_mask_0, x = qkv_23_cast_fp16)[name = tensor("v_cast_fp16")]; - tensor attn_45_transpose_x_1 = const()[name = tensor("attn_45_transpose_x_1"), val = tensor(false)]; - tensor attn_45_transpose_y_1 = const()[name = tensor("attn_45_transpose_y_1"), val = tensor(true)]; - tensor attn_45_cast_fp16 = matmul(transpose_x = attn_45_transpose_x_1, transpose_y = attn_45_transpose_y_1, x = q_cast_fp16, y = k_cast_fp16)[name = tensor("attn_45_cast_fp16")]; - tensor input_223_cast_fp16 = softmax(axis = var_25, x = attn_45_cast_fp16)[name = tensor("input_223_cast_fp16")]; - tensor var_831_transpose_x_0 = const()[name = tensor("op_831_transpose_x_0"), val = tensor(false)]; - tensor var_831_transpose_y_0 = const()[name = tensor("op_831_transpose_y_0"), val = tensor(false)]; - tensor var_831_cast_fp16 = matmul(transpose_x = var_831_transpose_x_0, transpose_y = var_831_transpose_y_0, x = input_223_cast_fp16, y = v_cast_fp16)[name = tensor("op_831_cast_fp16")]; - tensor var_832_perm_0 = const()[name = tensor("op_832_perm_0"), val = tensor([0, 2, 1, 3])]; - tensor var_833 = const()[name = tensor("op_833"), val = tensor([1, 1370, 384])]; - tensor var_832_cast_fp16 = transpose(perm = var_832_perm_0, x = var_831_cast_fp16)[name = tensor("transpose_4")]; - tensor input_225_cast_fp16 = reshape(shape = var_833, x = var_832_cast_fp16)[name = tensor("input_225_cast_fp16")]; - tensor model_pretrained_blocks_11_attn_proj_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_attn_proj_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41459392)))]; - tensor model_pretrained_blocks_11_attn_proj_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_attn_proj_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41754368)))]; - tensor linear_45_cast_fp16 = linear(bias = model_pretrained_blocks_11_attn_proj_bias_to_fp16, weight = model_pretrained_blocks_11_attn_proj_weight_to_fp16, x = input_225_cast_fp16)[name = tensor("linear_45_cast_fp16")]; - tensor model_pretrained_blocks_11_ls1_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_ls1_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41755200)))]; - tensor var_840_cast_fp16 = mul(x = linear_45_cast_fp16, y = model_pretrained_blocks_11_ls1_gamma_to_fp16)[name = tensor("op_840_cast_fp16")]; - tensor input_229_cast_fp16 = add(x = input_221_cast_fp16, y = var_840_cast_fp16)[name = tensor("input_229_cast_fp16")]; - tensor input_231_axes_0 = const()[name = tensor("input_231_axes_0"), val = tensor([-1])]; - tensor model_pretrained_blocks_11_norm2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_norm2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41756032)))]; - tensor model_pretrained_blocks_11_norm2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_norm2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41756864)))]; - tensor input_231_cast_fp16 = layer_norm(axes = input_231_axes_0, beta = model_pretrained_blocks_11_norm2_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_blocks_11_norm2_weight_to_fp16, x = input_229_cast_fp16)[name = tensor("input_231_cast_fp16")]; - tensor model_pretrained_blocks_11_mlp_fc1_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_mlp_fc1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(41757696)))]; - tensor model_pretrained_blocks_11_mlp_fc1_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_mlp_fc1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(42937408)))]; - tensor linear_46_cast_fp16 = linear(bias = model_pretrained_blocks_11_mlp_fc1_bias_to_fp16, weight = model_pretrained_blocks_11_mlp_fc1_weight_to_fp16, x = input_231_cast_fp16)[name = tensor("linear_46_cast_fp16")]; - tensor input_235_mode_0 = const()[name = tensor("input_235_mode_0"), val = tensor("EXACT")]; - tensor input_235_cast_fp16 = gelu(mode = input_235_mode_0, x = linear_46_cast_fp16)[name = tensor("input_235_cast_fp16")]; - tensor model_pretrained_blocks_11_mlp_fc2_weight_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_mlp_fc2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(42940544)))]; - tensor model_pretrained_blocks_11_mlp_fc2_bias_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_mlp_fc2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44120256)))]; - tensor linear_47_cast_fp16 = linear(bias = model_pretrained_blocks_11_mlp_fc2_bias_to_fp16, weight = model_pretrained_blocks_11_mlp_fc2_weight_to_fp16, x = input_235_cast_fp16)[name = tensor("linear_47_cast_fp16")]; - tensor model_pretrained_blocks_11_ls2_gamma_to_fp16 = const()[name = tensor("model_pretrained_blocks_11_ls2_gamma_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44121088)))]; - tensor var_858_cast_fp16 = mul(x = linear_47_cast_fp16, y = model_pretrained_blocks_11_ls2_gamma_to_fp16)[name = tensor("op_858_cast_fp16")]; - tensor input_241_cast_fp16 = add(x = input_229_cast_fp16, y = var_858_cast_fp16)[name = tensor("input_241_cast_fp16")]; - tensor out_1_axes_0 = const()[name = tensor("out_1_axes_0"), val = tensor([-1])]; - tensor model_pretrained_norm_weight_to_fp16 = const()[name = tensor("model_pretrained_norm_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44121920)))]; - tensor model_pretrained_norm_bias_to_fp16 = const()[name = tensor("model_pretrained_norm_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44122752)))]; - tensor out_1_cast_fp16 = layer_norm(axes = out_1_axes_0, beta = model_pretrained_norm_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_norm_weight_to_fp16, x = input_61_cast_fp16)[name = tensor("out_1_cast_fp16")]; - tensor out_3_axes_0 = const()[name = tensor("out_3_axes_0"), val = tensor([-1])]; - tensor out_3_cast_fp16 = layer_norm(axes = out_3_axes_0, beta = model_pretrained_norm_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_norm_weight_to_fp16, x = input_121_cast_fp16)[name = tensor("out_3_cast_fp16")]; - tensor out_5_axes_0 = const()[name = tensor("out_5_axes_0"), val = tensor([-1])]; - tensor out_5_cast_fp16 = layer_norm(axes = out_5_axes_0, beta = model_pretrained_norm_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_norm_weight_to_fp16, x = input_181_cast_fp16)[name = tensor("out_5_cast_fp16")]; - tensor out_axes_0 = const()[name = tensor("out_axes_0"), val = tensor([-1])]; - tensor out_cast_fp16 = layer_norm(axes = out_axes_0, beta = model_pretrained_norm_bias_to_fp16, epsilon = var_11_to_fp16, gamma = model_pretrained_norm_weight_to_fp16, x = input_241_cast_fp16)[name = tensor("out_cast_fp16")]; - tensor x_83_begin_0 = const()[name = tensor("x_83_begin_0"), val = tensor([0, 1, 0])]; - tensor x_83_end_0 = const()[name = tensor("x_83_end_0"), val = tensor([1, 1370, 384])]; - tensor x_83_end_mask_0 = const()[name = tensor("x_83_end_mask_0"), val = tensor([true, true, true])]; - tensor x_83_cast_fp16 = slice_by_index(begin = x_83_begin_0, end = x_83_end_0, end_mask = x_83_end_mask_0, x = out_1_cast_fp16)[name = tensor("x_83_cast_fp16")]; - tensor x_85_begin_0 = const()[name = tensor("x_85_begin_0"), val = tensor([0, 1, 0])]; - tensor x_85_end_0 = const()[name = tensor("x_85_end_0"), val = tensor([1, 1370, 384])]; - tensor x_85_end_mask_0 = const()[name = tensor("x_85_end_mask_0"), val = tensor([true, true, true])]; - tensor x_85_cast_fp16 = slice_by_index(begin = x_85_begin_0, end = x_85_end_0, end_mask = x_85_end_mask_0, x = out_3_cast_fp16)[name = tensor("x_85_cast_fp16")]; - tensor x_87_begin_0 = const()[name = tensor("x_87_begin_0"), val = tensor([0, 1, 0])]; - tensor x_87_end_0 = const()[name = tensor("x_87_end_0"), val = tensor([1, 1370, 384])]; - tensor x_87_end_mask_0 = const()[name = tensor("x_87_end_mask_0"), val = tensor([true, true, true])]; - tensor x_87_cast_fp16 = slice_by_index(begin = x_87_begin_0, end = x_87_end_0, end_mask = x_87_end_mask_0, x = out_5_cast_fp16)[name = tensor("x_87_cast_fp16")]; - tensor x_89_begin_0 = const()[name = tensor("x_89_begin_0"), val = tensor([0, 1, 0])]; - tensor x_89_end_0 = const()[name = tensor("x_89_end_0"), val = tensor([1, 1370, 384])]; - tensor x_89_end_mask_0 = const()[name = tensor("x_89_end_mask_0"), val = tensor([true, true, true])]; - tensor x_89_cast_fp16 = slice_by_index(begin = x_89_begin_0, end = x_89_end_0, end_mask = x_89_end_mask_0, x = out_cast_fp16)[name = tensor("x_89_cast_fp16")]; - tensor var_918 = const()[name = tensor("op_918"), val = tensor([0, 2, 1])]; - tensor var_922 = const()[name = tensor("op_922"), val = tensor([1, 384, 37, 37])]; - tensor var_919_cast_fp16 = transpose(perm = var_918, x = x_83_cast_fp16)[name = tensor("transpose_3")]; - tensor input_243_cast_fp16 = reshape(shape = var_922, x = var_919_cast_fp16)[name = tensor("input_243_cast_fp16")]; - tensor input_245_pad_type_0 = const()[name = tensor("input_245_pad_type_0"), val = tensor("valid")]; - tensor input_245_strides_0 = const()[name = tensor("input_245_strides_0"), val = tensor([1, 1])]; - tensor input_245_pad_0 = const()[name = tensor("input_245_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_245_dilations_0 = const()[name = tensor("input_245_dilations_0"), val = tensor([1, 1])]; - tensor input_245_groups_0 = const()[name = tensor("input_245_groups_0"), val = tensor(1)]; - tensor model_depth_head_projects_0_weight_to_fp16 = const()[name = tensor("model_depth_head_projects_0_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44123584)))]; - tensor model_depth_head_projects_0_bias_to_fp16 = const()[name = tensor("model_depth_head_projects_0_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44160512)))]; - tensor input_245_cast_fp16 = conv(bias = model_depth_head_projects_0_bias_to_fp16, dilations = input_245_dilations_0, groups = input_245_groups_0, pad = input_245_pad_0, pad_type = input_245_pad_type_0, strides = input_245_strides_0, weight = model_depth_head_projects_0_weight_to_fp16, x = input_243_cast_fp16)[name = tensor("input_245_cast_fp16")]; - tensor input_257_pad_type_0 = const()[name = tensor("input_257_pad_type_0"), val = tensor("valid")]; - tensor input_257_strides_0 = const()[name = tensor("input_257_strides_0"), val = tensor([4, 4])]; - tensor input_257_pad_0 = const()[name = tensor("input_257_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_257_dilations_0 = const()[name = tensor("input_257_dilations_0"), val = tensor([1, 1])]; - tensor input_257_groups_0 = const()[name = tensor("input_257_groups_0"), val = tensor(1)]; - tensor input_257_has_output_shape_output_shape_0 = const()[name = tensor("input_257_has_output_shape_output_shape_0"), val = tensor([1, 48, 148, 148])]; - tensor model_depth_head_resize_layers_0_weight_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_0_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44160704)))]; - tensor model_depth_head_resize_layers_0_bias_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_0_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44234496)))]; - tensor input_257_has_output_shape_cast_fp16 = conv_transpose(bias = model_depth_head_resize_layers_0_bias_to_fp16, dilations = input_257_dilations_0, groups = input_257_groups_0, output_shape = input_257_has_output_shape_output_shape_0, pad = input_257_pad_0, pad_type = input_257_pad_type_0, strides = input_257_strides_0, weight = model_depth_head_resize_layers_0_weight_to_fp16, x = input_245_cast_fp16)[name = tensor("input_257_has_output_shape_cast_fp16")]; - tensor var_938 = const()[name = tensor("op_938"), val = tensor([0, 2, 1])]; - tensor var_942 = const()[name = tensor("op_942"), val = tensor([1, 384, 37, 37])]; - tensor var_939_cast_fp16 = transpose(perm = var_938, x = x_85_cast_fp16)[name = tensor("transpose_2")]; - tensor input_247_cast_fp16 = reshape(shape = var_942, x = var_939_cast_fp16)[name = tensor("input_247_cast_fp16")]; - tensor input_249_pad_type_0 = const()[name = tensor("input_249_pad_type_0"), val = tensor("valid")]; - tensor input_249_strides_0 = const()[name = tensor("input_249_strides_0"), val = tensor([1, 1])]; - tensor input_249_pad_0 = const()[name = tensor("input_249_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_249_dilations_0 = const()[name = tensor("input_249_dilations_0"), val = tensor([1, 1])]; - tensor input_249_groups_0 = const()[name = tensor("input_249_groups_0"), val = tensor(1)]; - tensor model_depth_head_projects_1_weight_to_fp16 = const()[name = tensor("model_depth_head_projects_1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44234688)))]; - tensor model_depth_head_projects_1_bias_to_fp16 = const()[name = tensor("model_depth_head_projects_1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44308480)))]; - tensor input_249_cast_fp16 = conv(bias = model_depth_head_projects_1_bias_to_fp16, dilations = input_249_dilations_0, groups = input_249_groups_0, pad = input_249_pad_0, pad_type = input_249_pad_type_0, strides = input_249_strides_0, weight = model_depth_head_projects_1_weight_to_fp16, x = input_247_cast_fp16)[name = tensor("input_249_cast_fp16")]; - tensor input_259_pad_type_0 = const()[name = tensor("input_259_pad_type_0"), val = tensor("valid")]; - tensor input_259_strides_0 = const()[name = tensor("input_259_strides_0"), val = tensor([2, 2])]; - tensor input_259_pad_0 = const()[name = tensor("input_259_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_259_dilations_0 = const()[name = tensor("input_259_dilations_0"), val = tensor([1, 1])]; - tensor input_259_groups_0 = const()[name = tensor("input_259_groups_0"), val = tensor(1)]; - tensor input_259_has_output_shape_output_shape_0 = const()[name = tensor("input_259_has_output_shape_output_shape_0"), val = tensor([1, 96, 74, 74])]; - tensor model_depth_head_resize_layers_1_weight_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44308736)))]; - tensor model_depth_head_resize_layers_1_bias_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44382528)))]; - tensor input_259_has_output_shape_cast_fp16 = conv_transpose(bias = model_depth_head_resize_layers_1_bias_to_fp16, dilations = input_259_dilations_0, groups = input_259_groups_0, output_shape = input_259_has_output_shape_output_shape_0, pad = input_259_pad_0, pad_type = input_259_pad_type_0, strides = input_259_strides_0, weight = model_depth_head_resize_layers_1_weight_to_fp16, x = input_249_cast_fp16)[name = tensor("input_259_has_output_shape_cast_fp16")]; - tensor var_958 = const()[name = tensor("op_958"), val = tensor([0, 2, 1])]; - tensor var_962 = const()[name = tensor("op_962"), val = tensor([1, 384, 37, 37])]; - tensor var_959_cast_fp16 = transpose(perm = var_958, x = x_87_cast_fp16)[name = tensor("transpose_1")]; - tensor input_251_cast_fp16 = reshape(shape = var_962, x = var_959_cast_fp16)[name = tensor("input_251_cast_fp16")]; - tensor input_261_pad_type_0 = const()[name = tensor("input_261_pad_type_0"), val = tensor("valid")]; - tensor input_261_strides_0 = const()[name = tensor("input_261_strides_0"), val = tensor([1, 1])]; - tensor input_261_pad_0 = const()[name = tensor("input_261_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_261_dilations_0 = const()[name = tensor("input_261_dilations_0"), val = tensor([1, 1])]; - tensor input_261_groups_0 = const()[name = tensor("input_261_groups_0"), val = tensor(1)]; - tensor model_depth_head_projects_2_weight_to_fp16 = const()[name = tensor("model_depth_head_projects_2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44382784)))]; - tensor model_depth_head_projects_2_bias_to_fp16 = const()[name = tensor("model_depth_head_projects_2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44530304)))]; - tensor input_261_cast_fp16 = conv(bias = model_depth_head_projects_2_bias_to_fp16, dilations = input_261_dilations_0, groups = input_261_groups_0, pad = input_261_pad_0, pad_type = input_261_pad_type_0, strides = input_261_strides_0, weight = model_depth_head_projects_2_weight_to_fp16, x = input_251_cast_fp16)[name = tensor("input_261_cast_fp16")]; - tensor var_971 = const()[name = tensor("op_971"), val = tensor([0, 2, 1])]; - tensor var_975 = const()[name = tensor("op_975"), val = tensor([1, 384, 37, 37])]; - tensor var_972_cast_fp16 = transpose(perm = var_971, x = x_89_cast_fp16)[name = tensor("transpose_0")]; - tensor input_253_cast_fp16 = reshape(shape = var_975, x = var_972_cast_fp16)[name = tensor("input_253_cast_fp16")]; - tensor input_255_pad_type_0 = const()[name = tensor("input_255_pad_type_0"), val = tensor("valid")]; - tensor input_255_strides_0 = const()[name = tensor("input_255_strides_0"), val = tensor([1, 1])]; - tensor input_255_pad_0 = const()[name = tensor("input_255_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_255_dilations_0 = const()[name = tensor("input_255_dilations_0"), val = tensor([1, 1])]; - tensor input_255_groups_0 = const()[name = tensor("input_255_groups_0"), val = tensor(1)]; - tensor model_depth_head_projects_3_weight_to_fp16 = const()[name = tensor("model_depth_head_projects_3_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44530752)))]; - tensor model_depth_head_projects_3_bias_to_fp16 = const()[name = tensor("model_depth_head_projects_3_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44825728)))]; - tensor input_255_cast_fp16 = conv(bias = model_depth_head_projects_3_bias_to_fp16, dilations = input_255_dilations_0, groups = input_255_groups_0, pad = input_255_pad_0, pad_type = input_255_pad_type_0, strides = input_255_strides_0, weight = model_depth_head_projects_3_weight_to_fp16, x = input_253_cast_fp16)[name = tensor("input_255_cast_fp16")]; - tensor input_263_pad_type_0 = const()[name = tensor("input_263_pad_type_0"), val = tensor("custom")]; - tensor input_263_pad_0 = const()[name = tensor("input_263_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_263_strides_0 = const()[name = tensor("input_263_strides_0"), val = tensor([2, 2])]; - tensor input_263_dilations_0 = const()[name = tensor("input_263_dilations_0"), val = tensor([1, 1])]; - tensor input_263_groups_0 = const()[name = tensor("input_263_groups_0"), val = tensor(1)]; - tensor model_depth_head_resize_layers_3_weight_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_3_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(44826560)))]; - tensor model_depth_head_resize_layers_3_bias_to_fp16 = const()[name = tensor("model_depth_head_resize_layers_3_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(47480832)))]; - tensor input_263_cast_fp16 = conv(bias = model_depth_head_resize_layers_3_bias_to_fp16, dilations = input_263_dilations_0, groups = input_263_groups_0, pad = input_263_pad_0, pad_type = input_263_pad_type_0, strides = input_263_strides_0, weight = model_depth_head_resize_layers_3_weight_to_fp16, x = input_255_cast_fp16)[name = tensor("input_263_cast_fp16")]; - tensor layer_1_rn_pad_type_0 = const()[name = tensor("layer_1_rn_pad_type_0"), val = tensor("custom")]; - tensor layer_1_rn_pad_0 = const()[name = tensor("layer_1_rn_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor layer_1_rn_strides_0 = const()[name = tensor("layer_1_rn_strides_0"), val = tensor([1, 1])]; - tensor layer_1_rn_dilations_0 = const()[name = tensor("layer_1_rn_dilations_0"), val = tensor([1, 1])]; - tensor layer_1_rn_groups_0 = const()[name = tensor("layer_1_rn_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_layer1_rn_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_layer1_rn_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(47481664)))]; - tensor layer_1_rn_cast_fp16 = conv(dilations = layer_1_rn_dilations_0, groups = layer_1_rn_groups_0, pad = layer_1_rn_pad_0, pad_type = layer_1_rn_pad_type_0, strides = layer_1_rn_strides_0, weight = model_depth_head_scratch_layer1_rn_weight_to_fp16, x = input_257_has_output_shape_cast_fp16)[name = tensor("layer_1_rn_cast_fp16")]; - tensor layer_2_rn_pad_type_0 = const()[name = tensor("layer_2_rn_pad_type_0"), val = tensor("custom")]; - tensor layer_2_rn_pad_0 = const()[name = tensor("layer_2_rn_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor layer_2_rn_strides_0 = const()[name = tensor("layer_2_rn_strides_0"), val = tensor([1, 1])]; - tensor layer_2_rn_dilations_0 = const()[name = tensor("layer_2_rn_dilations_0"), val = tensor([1, 1])]; - tensor layer_2_rn_groups_0 = const()[name = tensor("layer_2_rn_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_layer2_rn_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_layer2_rn_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(47537024)))]; - tensor layer_2_rn_cast_fp16 = conv(dilations = layer_2_rn_dilations_0, groups = layer_2_rn_groups_0, pad = layer_2_rn_pad_0, pad_type = layer_2_rn_pad_type_0, strides = layer_2_rn_strides_0, weight = model_depth_head_scratch_layer2_rn_weight_to_fp16, x = input_259_has_output_shape_cast_fp16)[name = tensor("layer_2_rn_cast_fp16")]; - tensor layer_3_rn_pad_type_0 = const()[name = tensor("layer_3_rn_pad_type_0"), val = tensor("custom")]; - tensor layer_3_rn_pad_0 = const()[name = tensor("layer_3_rn_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor layer_3_rn_strides_0 = const()[name = tensor("layer_3_rn_strides_0"), val = tensor([1, 1])]; - tensor layer_3_rn_dilations_0 = const()[name = tensor("layer_3_rn_dilations_0"), val = tensor([1, 1])]; - tensor layer_3_rn_groups_0 = const()[name = tensor("layer_3_rn_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_layer3_rn_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_layer3_rn_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(47647680)))]; - tensor layer_3_rn_cast_fp16 = conv(dilations = layer_3_rn_dilations_0, groups = layer_3_rn_groups_0, pad = layer_3_rn_pad_0, pad_type = layer_3_rn_pad_type_0, strides = layer_3_rn_strides_0, weight = model_depth_head_scratch_layer3_rn_weight_to_fp16, x = input_261_cast_fp16)[name = tensor("layer_3_rn_cast_fp16")]; - tensor input_265_pad_type_0 = const()[name = tensor("input_265_pad_type_0"), val = tensor("custom")]; - tensor input_265_pad_0 = const()[name = tensor("input_265_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_265_strides_0 = const()[name = tensor("input_265_strides_0"), val = tensor([1, 1])]; - tensor input_265_dilations_0 = const()[name = tensor("input_265_dilations_0"), val = tensor([1, 1])]; - tensor input_265_groups_0 = const()[name = tensor("input_265_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_layer4_rn_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_layer4_rn_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(47868928)))]; - tensor input_265_cast_fp16 = conv(dilations = input_265_dilations_0, groups = input_265_groups_0, pad = input_265_pad_0, pad_type = input_265_pad_type_0, strides = input_265_strides_0, weight = model_depth_head_scratch_layer4_rn_weight_to_fp16, x = input_263_cast_fp16)[name = tensor("input_265_cast_fp16")]; - tensor input_267_cast_fp16 = relu(x = input_265_cast_fp16)[name = tensor("input_267_cast_fp16")]; - tensor input_269_pad_type_0 = const()[name = tensor("input_269_pad_type_0"), val = tensor("custom")]; - tensor input_269_pad_0 = const()[name = tensor("input_269_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_269_strides_0 = const()[name = tensor("input_269_strides_0"), val = tensor([1, 1])]; - tensor input_269_dilations_0 = const()[name = tensor("input_269_dilations_0"), val = tensor([1, 1])]; - tensor input_269_groups_0 = const()[name = tensor("input_269_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet4_resConfUnit2_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_resConfUnit2_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48311360)))]; - tensor model_depth_head_scratch_refinenet4_resConfUnit2_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_resConfUnit2_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48385152)))]; - tensor input_269_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet4_resConfUnit2_conv1_bias_to_fp16, dilations = input_269_dilations_0, groups = input_269_groups_0, pad = input_269_pad_0, pad_type = input_269_pad_type_0, strides = input_269_strides_0, weight = model_depth_head_scratch_refinenet4_resConfUnit2_conv1_weight_to_fp16, x = input_267_cast_fp16)[name = tensor("input_269_cast_fp16")]; - tensor input_271_cast_fp16 = relu(x = input_269_cast_fp16)[name = tensor("input_271_cast_fp16")]; - tensor x_91_pad_type_0 = const()[name = tensor("x_91_pad_type_0"), val = tensor("custom")]; - tensor x_91_pad_0 = const()[name = tensor("x_91_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_91_strides_0 = const()[name = tensor("x_91_strides_0"), val = tensor([1, 1])]; - tensor x_91_dilations_0 = const()[name = tensor("x_91_dilations_0"), val = tensor([1, 1])]; - tensor x_91_groups_0 = const()[name = tensor("x_91_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet4_resConfUnit2_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_resConfUnit2_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48385344)))]; - tensor model_depth_head_scratch_refinenet4_resConfUnit2_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_resConfUnit2_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48459136)))]; - tensor x_91_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet4_resConfUnit2_conv2_bias_to_fp16, dilations = x_91_dilations_0, groups = x_91_groups_0, pad = x_91_pad_0, pad_type = x_91_pad_type_0, strides = x_91_strides_0, weight = model_depth_head_scratch_refinenet4_resConfUnit2_conv2_weight_to_fp16, x = input_271_cast_fp16)[name = tensor("x_91_cast_fp16")]; - tensor input_273_cast_fp16 = add(x = x_91_cast_fp16, y = input_265_cast_fp16)[name = tensor("input_273_cast_fp16")]; - tensor input_275_scale_factor_height_0 = const()[name = tensor("input_275_scale_factor_height_0"), val = tensor(0x1.f28714p+0)]; - tensor input_275_scale_factor_width_0 = const()[name = tensor("input_275_scale_factor_width_0"), val = tensor(0x1.f28714p+0)]; - tensor input_275_align_corners_0 = const()[name = tensor("input_275_align_corners_0"), val = tensor(true)]; - tensor input_275_cast_fp16 = upsample_bilinear(align_corners = input_275_align_corners_0, scale_factor_height = input_275_scale_factor_height_0, scale_factor_width = input_275_scale_factor_width_0, x = input_273_cast_fp16)[name = tensor("input_275_cast_fp16")]; - tensor x_95_pad_type_0 = const()[name = tensor("x_95_pad_type_0"), val = tensor("valid")]; - tensor x_95_strides_0 = const()[name = tensor("x_95_strides_0"), val = tensor([1, 1])]; - tensor x_95_pad_0 = const()[name = tensor("x_95_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor x_95_dilations_0 = const()[name = tensor("x_95_dilations_0"), val = tensor([1, 1])]; - tensor x_95_groups_0 = const()[name = tensor("x_95_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet4_out_conv_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_out_conv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48459328)))]; - tensor model_depth_head_scratch_refinenet4_out_conv_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet4_out_conv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48467584)))]; - tensor x_95_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet4_out_conv_bias_to_fp16, dilations = x_95_dilations_0, groups = x_95_groups_0, pad = x_95_pad_0, pad_type = x_95_pad_type_0, strides = x_95_strides_0, weight = model_depth_head_scratch_refinenet4_out_conv_weight_to_fp16, x = input_275_cast_fp16)[name = tensor("x_95_cast_fp16")]; - tensor input_277_cast_fp16 = relu(x = layer_3_rn_cast_fp16)[name = tensor("input_277_cast_fp16")]; - tensor input_279_pad_type_0 = const()[name = tensor("input_279_pad_type_0"), val = tensor("custom")]; - tensor input_279_pad_0 = const()[name = tensor("input_279_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_279_strides_0 = const()[name = tensor("input_279_strides_0"), val = tensor([1, 1])]; - tensor input_279_dilations_0 = const()[name = tensor("input_279_dilations_0"), val = tensor([1, 1])]; - tensor input_279_groups_0 = const()[name = tensor("input_279_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet3_resConfUnit1_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit1_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48467776)))]; - tensor model_depth_head_scratch_refinenet3_resConfUnit1_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit1_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48541568)))]; - tensor input_279_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet3_resConfUnit1_conv1_bias_to_fp16, dilations = input_279_dilations_0, groups = input_279_groups_0, pad = input_279_pad_0, pad_type = input_279_pad_type_0, strides = input_279_strides_0, weight = model_depth_head_scratch_refinenet3_resConfUnit1_conv1_weight_to_fp16, x = input_277_cast_fp16)[name = tensor("input_279_cast_fp16")]; - tensor input_281_cast_fp16 = relu(x = input_279_cast_fp16)[name = tensor("input_281_cast_fp16")]; - tensor x_93_pad_type_0 = const()[name = tensor("x_93_pad_type_0"), val = tensor("custom")]; - tensor x_93_pad_0 = const()[name = tensor("x_93_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_93_strides_0 = const()[name = tensor("x_93_strides_0"), val = tensor([1, 1])]; - tensor x_93_dilations_0 = const()[name = tensor("x_93_dilations_0"), val = tensor([1, 1])]; - tensor x_93_groups_0 = const()[name = tensor("x_93_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet3_resConfUnit1_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit1_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48541760)))]; - tensor model_depth_head_scratch_refinenet3_resConfUnit1_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit1_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48615552)))]; - tensor x_93_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet3_resConfUnit1_conv2_bias_to_fp16, dilations = x_93_dilations_0, groups = x_93_groups_0, pad = x_93_pad_0, pad_type = x_93_pad_type_0, strides = x_93_strides_0, weight = model_depth_head_scratch_refinenet3_resConfUnit1_conv2_weight_to_fp16, x = input_281_cast_fp16)[name = tensor("x_93_cast_fp16")]; - tensor y_1_cast_fp16 = add(x = x_93_cast_fp16, y = layer_3_rn_cast_fp16)[name = tensor("y_1_cast_fp16")]; - tensor input_283_cast_fp16 = add(x = x_95_cast_fp16, y = y_1_cast_fp16)[name = tensor("input_283_cast_fp16")]; - tensor input_285_cast_fp16 = relu(x = input_283_cast_fp16)[name = tensor("input_285_cast_fp16")]; - tensor input_287_pad_type_0 = const()[name = tensor("input_287_pad_type_0"), val = tensor("custom")]; - tensor input_287_pad_0 = const()[name = tensor("input_287_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_287_strides_0 = const()[name = tensor("input_287_strides_0"), val = tensor([1, 1])]; - tensor input_287_dilations_0 = const()[name = tensor("input_287_dilations_0"), val = tensor([1, 1])]; - tensor input_287_groups_0 = const()[name = tensor("input_287_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet3_resConfUnit2_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit2_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48615744)))]; - tensor model_depth_head_scratch_refinenet3_resConfUnit2_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit2_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48689536)))]; - tensor input_287_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet3_resConfUnit2_conv1_bias_to_fp16, dilations = input_287_dilations_0, groups = input_287_groups_0, pad = input_287_pad_0, pad_type = input_287_pad_type_0, strides = input_287_strides_0, weight = model_depth_head_scratch_refinenet3_resConfUnit2_conv1_weight_to_fp16, x = input_285_cast_fp16)[name = tensor("input_287_cast_fp16")]; - tensor input_289_cast_fp16 = relu(x = input_287_cast_fp16)[name = tensor("input_289_cast_fp16")]; - tensor x_97_pad_type_0 = const()[name = tensor("x_97_pad_type_0"), val = tensor("custom")]; - tensor x_97_pad_0 = const()[name = tensor("x_97_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_97_strides_0 = const()[name = tensor("x_97_strides_0"), val = tensor([1, 1])]; - tensor x_97_dilations_0 = const()[name = tensor("x_97_dilations_0"), val = tensor([1, 1])]; - tensor x_97_groups_0 = const()[name = tensor("x_97_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet3_resConfUnit2_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit2_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48689728)))]; - tensor model_depth_head_scratch_refinenet3_resConfUnit2_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_resConfUnit2_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48763520)))]; - tensor x_97_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet3_resConfUnit2_conv2_bias_to_fp16, dilations = x_97_dilations_0, groups = x_97_groups_0, pad = x_97_pad_0, pad_type = x_97_pad_type_0, strides = x_97_strides_0, weight = model_depth_head_scratch_refinenet3_resConfUnit2_conv2_weight_to_fp16, x = input_289_cast_fp16)[name = tensor("x_97_cast_fp16")]; - tensor input_291_cast_fp16 = add(x = x_97_cast_fp16, y = input_283_cast_fp16)[name = tensor("input_291_cast_fp16")]; - tensor input_293_scale_factor_height_0 = const()[name = tensor("input_293_scale_factor_height_0"), val = tensor(0x1p+1)]; - tensor input_293_scale_factor_width_0 = const()[name = tensor("input_293_scale_factor_width_0"), val = tensor(0x1p+1)]; - tensor input_293_align_corners_0 = const()[name = tensor("input_293_align_corners_0"), val = tensor(true)]; - tensor input_293_cast_fp16 = upsample_bilinear(align_corners = input_293_align_corners_0, scale_factor_height = input_293_scale_factor_height_0, scale_factor_width = input_293_scale_factor_width_0, x = input_291_cast_fp16)[name = tensor("input_293_cast_fp16")]; - tensor x_101_pad_type_0 = const()[name = tensor("x_101_pad_type_0"), val = tensor("valid")]; - tensor x_101_strides_0 = const()[name = tensor("x_101_strides_0"), val = tensor([1, 1])]; - tensor x_101_pad_0 = const()[name = tensor("x_101_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor x_101_dilations_0 = const()[name = tensor("x_101_dilations_0"), val = tensor([1, 1])]; - tensor x_101_groups_0 = const()[name = tensor("x_101_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet3_out_conv_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_out_conv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48763712)))]; - tensor model_depth_head_scratch_refinenet3_out_conv_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet3_out_conv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48771968)))]; - tensor x_101_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet3_out_conv_bias_to_fp16, dilations = x_101_dilations_0, groups = x_101_groups_0, pad = x_101_pad_0, pad_type = x_101_pad_type_0, strides = x_101_strides_0, weight = model_depth_head_scratch_refinenet3_out_conv_weight_to_fp16, x = input_293_cast_fp16)[name = tensor("x_101_cast_fp16")]; - tensor input_295_cast_fp16 = relu(x = layer_2_rn_cast_fp16)[name = tensor("input_295_cast_fp16")]; - tensor input_297_pad_type_0 = const()[name = tensor("input_297_pad_type_0"), val = tensor("custom")]; - tensor input_297_pad_0 = const()[name = tensor("input_297_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_297_strides_0 = const()[name = tensor("input_297_strides_0"), val = tensor([1, 1])]; - tensor input_297_dilations_0 = const()[name = tensor("input_297_dilations_0"), val = tensor([1, 1])]; - tensor input_297_groups_0 = const()[name = tensor("input_297_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet2_resConfUnit1_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit1_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48772160)))]; - tensor model_depth_head_scratch_refinenet2_resConfUnit1_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit1_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48845952)))]; - tensor input_297_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet2_resConfUnit1_conv1_bias_to_fp16, dilations = input_297_dilations_0, groups = input_297_groups_0, pad = input_297_pad_0, pad_type = input_297_pad_type_0, strides = input_297_strides_0, weight = model_depth_head_scratch_refinenet2_resConfUnit1_conv1_weight_to_fp16, x = input_295_cast_fp16)[name = tensor("input_297_cast_fp16")]; - tensor input_299_cast_fp16 = relu(x = input_297_cast_fp16)[name = tensor("input_299_cast_fp16")]; - tensor x_99_pad_type_0 = const()[name = tensor("x_99_pad_type_0"), val = tensor("custom")]; - tensor x_99_pad_0 = const()[name = tensor("x_99_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_99_strides_0 = const()[name = tensor("x_99_strides_0"), val = tensor([1, 1])]; - tensor x_99_dilations_0 = const()[name = tensor("x_99_dilations_0"), val = tensor([1, 1])]; - tensor x_99_groups_0 = const()[name = tensor("x_99_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet2_resConfUnit1_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit1_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48846144)))]; - tensor model_depth_head_scratch_refinenet2_resConfUnit1_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit1_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48919936)))]; - tensor x_99_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet2_resConfUnit1_conv2_bias_to_fp16, dilations = x_99_dilations_0, groups = x_99_groups_0, pad = x_99_pad_0, pad_type = x_99_pad_type_0, strides = x_99_strides_0, weight = model_depth_head_scratch_refinenet2_resConfUnit1_conv2_weight_to_fp16, x = input_299_cast_fp16)[name = tensor("x_99_cast_fp16")]; - tensor y_3_cast_fp16 = add(x = x_99_cast_fp16, y = layer_2_rn_cast_fp16)[name = tensor("y_3_cast_fp16")]; - tensor input_301_cast_fp16 = add(x = x_101_cast_fp16, y = y_3_cast_fp16)[name = tensor("input_301_cast_fp16")]; - tensor input_303_cast_fp16 = relu(x = input_301_cast_fp16)[name = tensor("input_303_cast_fp16")]; - tensor input_305_pad_type_0 = const()[name = tensor("input_305_pad_type_0"), val = tensor("custom")]; - tensor input_305_pad_0 = const()[name = tensor("input_305_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_305_strides_0 = const()[name = tensor("input_305_strides_0"), val = tensor([1, 1])]; - tensor input_305_dilations_0 = const()[name = tensor("input_305_dilations_0"), val = tensor([1, 1])]; - tensor input_305_groups_0 = const()[name = tensor("input_305_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet2_resConfUnit2_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit2_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48920128)))]; - tensor model_depth_head_scratch_refinenet2_resConfUnit2_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit2_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48993920)))]; - tensor input_305_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet2_resConfUnit2_conv1_bias_to_fp16, dilations = input_305_dilations_0, groups = input_305_groups_0, pad = input_305_pad_0, pad_type = input_305_pad_type_0, strides = input_305_strides_0, weight = model_depth_head_scratch_refinenet2_resConfUnit2_conv1_weight_to_fp16, x = input_303_cast_fp16)[name = tensor("input_305_cast_fp16")]; - tensor input_307_cast_fp16 = relu(x = input_305_cast_fp16)[name = tensor("input_307_cast_fp16")]; - tensor x_103_pad_type_0 = const()[name = tensor("x_103_pad_type_0"), val = tensor("custom")]; - tensor x_103_pad_0 = const()[name = tensor("x_103_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_103_strides_0 = const()[name = tensor("x_103_strides_0"), val = tensor([1, 1])]; - tensor x_103_dilations_0 = const()[name = tensor("x_103_dilations_0"), val = tensor([1, 1])]; - tensor x_103_groups_0 = const()[name = tensor("x_103_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet2_resConfUnit2_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit2_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(48994112)))]; - tensor model_depth_head_scratch_refinenet2_resConfUnit2_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_resConfUnit2_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49067904)))]; - tensor x_103_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet2_resConfUnit2_conv2_bias_to_fp16, dilations = x_103_dilations_0, groups = x_103_groups_0, pad = x_103_pad_0, pad_type = x_103_pad_type_0, strides = x_103_strides_0, weight = model_depth_head_scratch_refinenet2_resConfUnit2_conv2_weight_to_fp16, x = input_307_cast_fp16)[name = tensor("x_103_cast_fp16")]; - tensor input_309_cast_fp16 = add(x = x_103_cast_fp16, y = input_301_cast_fp16)[name = tensor("input_309_cast_fp16")]; - tensor input_311_scale_factor_height_0 = const()[name = tensor("input_311_scale_factor_height_0"), val = tensor(0x1p+1)]; - tensor input_311_scale_factor_width_0 = const()[name = tensor("input_311_scale_factor_width_0"), val = tensor(0x1p+1)]; - tensor input_311_align_corners_0 = const()[name = tensor("input_311_align_corners_0"), val = tensor(true)]; - tensor input_311_cast_fp16 = upsample_bilinear(align_corners = input_311_align_corners_0, scale_factor_height = input_311_scale_factor_height_0, scale_factor_width = input_311_scale_factor_width_0, x = input_309_cast_fp16)[name = tensor("input_311_cast_fp16")]; - tensor x_107_pad_type_0 = const()[name = tensor("x_107_pad_type_0"), val = tensor("valid")]; - tensor x_107_strides_0 = const()[name = tensor("x_107_strides_0"), val = tensor([1, 1])]; - tensor x_107_pad_0 = const()[name = tensor("x_107_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor x_107_dilations_0 = const()[name = tensor("x_107_dilations_0"), val = tensor([1, 1])]; - tensor x_107_groups_0 = const()[name = tensor("x_107_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet2_out_conv_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_out_conv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49068096)))]; - tensor model_depth_head_scratch_refinenet2_out_conv_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet2_out_conv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49076352)))]; - tensor x_107_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet2_out_conv_bias_to_fp16, dilations = x_107_dilations_0, groups = x_107_groups_0, pad = x_107_pad_0, pad_type = x_107_pad_type_0, strides = x_107_strides_0, weight = model_depth_head_scratch_refinenet2_out_conv_weight_to_fp16, x = input_311_cast_fp16)[name = tensor("x_107_cast_fp16")]; - tensor input_313_cast_fp16 = relu(x = layer_1_rn_cast_fp16)[name = tensor("input_313_cast_fp16")]; - tensor input_315_pad_type_0 = const()[name = tensor("input_315_pad_type_0"), val = tensor("custom")]; - tensor input_315_pad_0 = const()[name = tensor("input_315_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_315_strides_0 = const()[name = tensor("input_315_strides_0"), val = tensor([1, 1])]; - tensor input_315_dilations_0 = const()[name = tensor("input_315_dilations_0"), val = tensor([1, 1])]; - tensor input_315_groups_0 = const()[name = tensor("input_315_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet1_resConfUnit1_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit1_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49076544)))]; - tensor model_depth_head_scratch_refinenet1_resConfUnit1_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit1_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49150336)))]; - tensor input_315_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet1_resConfUnit1_conv1_bias_to_fp16, dilations = input_315_dilations_0, groups = input_315_groups_0, pad = input_315_pad_0, pad_type = input_315_pad_type_0, strides = input_315_strides_0, weight = model_depth_head_scratch_refinenet1_resConfUnit1_conv1_weight_to_fp16, x = input_313_cast_fp16)[name = tensor("input_315_cast_fp16")]; - tensor input_317_cast_fp16 = relu(x = input_315_cast_fp16)[name = tensor("input_317_cast_fp16")]; - tensor x_105_pad_type_0 = const()[name = tensor("x_105_pad_type_0"), val = tensor("custom")]; - tensor x_105_pad_0 = const()[name = tensor("x_105_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_105_strides_0 = const()[name = tensor("x_105_strides_0"), val = tensor([1, 1])]; - tensor x_105_dilations_0 = const()[name = tensor("x_105_dilations_0"), val = tensor([1, 1])]; - tensor x_105_groups_0 = const()[name = tensor("x_105_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet1_resConfUnit1_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit1_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49150528)))]; - tensor model_depth_head_scratch_refinenet1_resConfUnit1_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit1_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49224320)))]; - tensor x_105_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet1_resConfUnit1_conv2_bias_to_fp16, dilations = x_105_dilations_0, groups = x_105_groups_0, pad = x_105_pad_0, pad_type = x_105_pad_type_0, strides = x_105_strides_0, weight = model_depth_head_scratch_refinenet1_resConfUnit1_conv2_weight_to_fp16, x = input_317_cast_fp16)[name = tensor("x_105_cast_fp16")]; - tensor y_cast_fp16 = add(x = x_105_cast_fp16, y = layer_1_rn_cast_fp16)[name = tensor("y_cast_fp16")]; - tensor input_319_cast_fp16 = add(x = x_107_cast_fp16, y = y_cast_fp16)[name = tensor("input_319_cast_fp16")]; - tensor input_321_cast_fp16 = relu(x = input_319_cast_fp16)[name = tensor("input_321_cast_fp16")]; - tensor input_323_pad_type_0 = const()[name = tensor("input_323_pad_type_0"), val = tensor("custom")]; - tensor input_323_pad_0 = const()[name = tensor("input_323_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_323_strides_0 = const()[name = tensor("input_323_strides_0"), val = tensor([1, 1])]; - tensor input_323_dilations_0 = const()[name = tensor("input_323_dilations_0"), val = tensor([1, 1])]; - tensor input_323_groups_0 = const()[name = tensor("input_323_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet1_resConfUnit2_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit2_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49224512)))]; - tensor model_depth_head_scratch_refinenet1_resConfUnit2_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit2_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49298304)))]; - tensor input_323_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet1_resConfUnit2_conv1_bias_to_fp16, dilations = input_323_dilations_0, groups = input_323_groups_0, pad = input_323_pad_0, pad_type = input_323_pad_type_0, strides = input_323_strides_0, weight = model_depth_head_scratch_refinenet1_resConfUnit2_conv1_weight_to_fp16, x = input_321_cast_fp16)[name = tensor("input_323_cast_fp16")]; - tensor input_325_cast_fp16 = relu(x = input_323_cast_fp16)[name = tensor("input_325_cast_fp16")]; - tensor x_pad_type_0 = const()[name = tensor("x_pad_type_0"), val = tensor("custom")]; - tensor x_pad_0 = const()[name = tensor("x_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor x_strides_0 = const()[name = tensor("x_strides_0"), val = tensor([1, 1])]; - tensor x_dilations_0 = const()[name = tensor("x_dilations_0"), val = tensor([1, 1])]; - tensor x_groups_0 = const()[name = tensor("x_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet1_resConfUnit2_conv2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit2_conv2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49298496)))]; - tensor model_depth_head_scratch_refinenet1_resConfUnit2_conv2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_resConfUnit2_conv2_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49372288)))]; - tensor x_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet1_resConfUnit2_conv2_bias_to_fp16, dilations = x_dilations_0, groups = x_groups_0, pad = x_pad_0, pad_type = x_pad_type_0, strides = x_strides_0, weight = model_depth_head_scratch_refinenet1_resConfUnit2_conv2_weight_to_fp16, x = input_325_cast_fp16)[name = tensor("x_cast_fp16")]; - tensor input_327_cast_fp16 = add(x = x_cast_fp16, y = input_319_cast_fp16)[name = tensor("input_327_cast_fp16")]; - tensor input_329_scale_factor_height_0 = const()[name = tensor("input_329_scale_factor_height_0"), val = tensor(0x1p+1)]; - tensor input_329_scale_factor_width_0 = const()[name = tensor("input_329_scale_factor_width_0"), val = tensor(0x1p+1)]; - tensor input_329_align_corners_0 = const()[name = tensor("input_329_align_corners_0"), val = tensor(true)]; - tensor input_329_cast_fp16 = upsample_bilinear(align_corners = input_329_align_corners_0, scale_factor_height = input_329_scale_factor_height_0, scale_factor_width = input_329_scale_factor_width_0, x = input_327_cast_fp16)[name = tensor("input_329_cast_fp16")]; - tensor input_331_pad_type_0 = const()[name = tensor("input_331_pad_type_0"), val = tensor("valid")]; - tensor input_331_strides_0 = const()[name = tensor("input_331_strides_0"), val = tensor([1, 1])]; - tensor input_331_pad_0 = const()[name = tensor("input_331_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_331_dilations_0 = const()[name = tensor("input_331_dilations_0"), val = tensor([1, 1])]; - tensor input_331_groups_0 = const()[name = tensor("input_331_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_refinenet1_out_conv_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_out_conv_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49372480)))]; - tensor model_depth_head_scratch_refinenet1_out_conv_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_refinenet1_out_conv_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49380736)))]; - tensor input_331_cast_fp16 = conv(bias = model_depth_head_scratch_refinenet1_out_conv_bias_to_fp16, dilations = input_331_dilations_0, groups = input_331_groups_0, pad = input_331_pad_0, pad_type = input_331_pad_type_0, strides = input_331_strides_0, weight = model_depth_head_scratch_refinenet1_out_conv_weight_to_fp16, x = input_329_cast_fp16)[name = tensor("input_331_cast_fp16")]; - tensor input_333_pad_type_0 = const()[name = tensor("input_333_pad_type_0"), val = tensor("custom")]; - tensor input_333_pad_0 = const()[name = tensor("input_333_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_333_strides_0 = const()[name = tensor("input_333_strides_0"), val = tensor([1, 1])]; - tensor input_333_dilations_0 = const()[name = tensor("input_333_dilations_0"), val = tensor([1, 1])]; - tensor input_333_groups_0 = const()[name = tensor("input_333_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_output_conv1_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv1_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49380928)))]; - tensor model_depth_head_scratch_output_conv1_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv1_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49417856)))]; - tensor input_333_cast_fp16 = conv(bias = model_depth_head_scratch_output_conv1_bias_to_fp16, dilations = input_333_dilations_0, groups = input_333_groups_0, pad = input_333_pad_0, pad_type = input_333_pad_type_0, strides = input_333_strides_0, weight = model_depth_head_scratch_output_conv1_weight_to_fp16, x = input_331_cast_fp16)[name = tensor("input_333_cast_fp16")]; - tensor input_335_scale_factor_height_0 = const()[name = tensor("input_335_scale_factor_height_0"), val = tensor(0x1.c00006p+0)]; - tensor input_335_scale_factor_width_0 = const()[name = tensor("input_335_scale_factor_width_0"), val = tensor(0x1.c00006p+0)]; - tensor input_335_align_corners_0 = const()[name = tensor("input_335_align_corners_0"), val = tensor(true)]; - tensor input_335_cast_fp16 = upsample_bilinear(align_corners = input_335_align_corners_0, scale_factor_height = input_335_scale_factor_height_0, scale_factor_width = input_335_scale_factor_width_0, x = input_333_cast_fp16)[name = tensor("input_335_cast_fp16")]; - tensor input_337_pad_type_0 = const()[name = tensor("input_337_pad_type_0"), val = tensor("custom")]; - tensor input_337_pad_0 = const()[name = tensor("input_337_pad_0"), val = tensor([1, 1, 1, 1])]; - tensor input_337_strides_0 = const()[name = tensor("input_337_strides_0"), val = tensor([1, 1])]; - tensor input_337_dilations_0 = const()[name = tensor("input_337_dilations_0"), val = tensor([1, 1])]; - tensor input_337_groups_0 = const()[name = tensor("input_337_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_output_conv2_0_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv2_0_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49417984)))]; - tensor model_depth_head_scratch_output_conv2_0_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv2_0_bias_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49436480)))]; - tensor input_337_cast_fp16 = conv(bias = model_depth_head_scratch_output_conv2_0_bias_to_fp16, dilations = input_337_dilations_0, groups = input_337_groups_0, pad = input_337_pad_0, pad_type = input_337_pad_type_0, strides = input_337_strides_0, weight = model_depth_head_scratch_output_conv2_0_weight_to_fp16, x = input_335_cast_fp16)[name = tensor("input_337_cast_fp16")]; - tensor input_339_cast_fp16 = relu(x = input_337_cast_fp16)[name = tensor("input_339_cast_fp16")]; - tensor input_341_pad_type_0 = const()[name = tensor("input_341_pad_type_0"), val = tensor("valid")]; - tensor input_341_strides_0 = const()[name = tensor("input_341_strides_0"), val = tensor([1, 1])]; - tensor input_341_pad_0 = const()[name = tensor("input_341_pad_0"), val = tensor([0, 0, 0, 0])]; - tensor input_341_dilations_0 = const()[name = tensor("input_341_dilations_0"), val = tensor([1, 1])]; - tensor input_341_groups_0 = const()[name = tensor("input_341_groups_0"), val = tensor(1)]; - tensor model_depth_head_scratch_output_conv2_2_weight_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv2_2_weight_to_fp16"), val = tensor(BLOBFILE(path = tensor("@model_path/weights/weight.bin"), offset = tensor(49436608)))]; - tensor model_depth_head_scratch_output_conv2_2_bias_to_fp16 = const()[name = tensor("model_depth_head_scratch_output_conv2_2_bias_to_fp16"), val = tensor([0x1.6b4p-4])]; - tensor input_341_cast_fp16 = conv(bias = model_depth_head_scratch_output_conv2_2_bias_to_fp16, dilations = input_341_dilations_0, groups = input_341_groups_0, pad = input_341_pad_0, pad_type = input_341_pad_type_0, strides = input_341_strides_0, weight = model_depth_head_scratch_output_conv2_2_weight_to_fp16, x = input_339_cast_fp16)[name = tensor("input_341_cast_fp16")]; - tensor input_cast_fp16 = relu(x = input_341_cast_fp16)[name = tensor("input_cast_fp16")]; - tensor var_1232_axes_0 = const()[name = tensor("op_1232_axes_0"), val = tensor([1])]; - tensor var_1232_cast_fp16 = squeeze(axes = var_1232_axes_0, x = input_cast_fp16)[name = tensor("op_1232_cast_fp16")]; - tensor var_1232_cast_fp16_to_fp32_dtype_0 = const()[name = tensor("op_1232_cast_fp16_to_fp32_dtype_0"), val = tensor("fp32")]; - tensor depth = cast(dtype = var_1232_cast_fp16_to_fp32_dtype_0, x = var_1232_cast_fp16)[name = tensor("cast_31")]; - } -> (depth); -} \ No newline at end of file diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/weights/weight.bin b/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/weights/weight.bin deleted file mode 100644 index 96bd0a7e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/DepthPro.mlmodelc/weights/weight.bin and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/DeviceList.plist b/ios/dist/ViroRenderer/ViroKit.framework/DeviceList.plist index f1d2af94..a8dfa845 100644 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/DeviceList.plist and b/ios/dist/ViroRenderer/ViroKit.framework/DeviceList.plist differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ar.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ar.lproj/GoogleKitCore.strings deleted file mode 100755 index 70e0f60b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ar.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/bg.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/bg.lproj/GoogleKitCore.strings deleted file mode 100755 index f2780937..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/bg.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ca.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ca.lproj/GoogleKitCore.strings deleted file mode 100755 index d94a0a09..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ca.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/cs.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/cs.lproj/GoogleKitCore.strings deleted file mode 100755 index 3779b746..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/cs.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/da.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/da.lproj/GoogleKitCore.strings deleted file mode 100755 index 8c8cfcac..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/da.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/de.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/de.lproj/GoogleKitCore.strings deleted file mode 100755 index b833e365..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/de.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/el.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/el.lproj/GoogleKitCore.strings deleted file mode 100755 index 6199e9d5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/el.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en.lproj/GoogleKitCore.strings deleted file mode 100755 index adfde1a4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_AU.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_AU.lproj/GoogleKitCore.strings deleted file mode 100755 index f7f0f659..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_AU.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_GB.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_GB.lproj/GoogleKitCore.strings deleted file mode 100755 index f7f0f659..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_GB.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_IN.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_IN.lproj/GoogleKitCore.strings deleted file mode 100755 index f7f0f659..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/en_IN.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es.lproj/GoogleKitCore.strings deleted file mode 100755 index 07a256a1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_419.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_419.lproj/GoogleKitCore.strings deleted file mode 100755 index 20436b0d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_419.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_MX.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_MX.lproj/GoogleKitCore.strings deleted file mode 100755 index 20436b0d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/es_MX.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fa.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fa.lproj/GoogleKitCore.strings deleted file mode 100755 index bc84d628..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fa.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fi.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fi.lproj/GoogleKitCore.strings deleted file mode 100755 index 5f1f09a6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fi.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr.lproj/GoogleKitCore.strings deleted file mode 100755 index 301dda75..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr_CA.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr_CA.lproj/GoogleKitCore.strings deleted file mode 100755 index 57be6602..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/fr_CA.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/he.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/he.lproj/GoogleKitCore.strings deleted file mode 100755 index f1af56e5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/he.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hi.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hi.lproj/GoogleKitCore.strings deleted file mode 100755 index 5710e279..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hi.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hr.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hr.lproj/GoogleKitCore.strings deleted file mode 100755 index 33aec092..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hr.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hu.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hu.lproj/GoogleKitCore.strings deleted file mode 100755 index 0c04bacc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hu.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hy.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hy.lproj/GoogleKitCore.strings deleted file mode 100755 index 014831c9..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/hy.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/id.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/id.lproj/GoogleKitCore.strings deleted file mode 100755 index 5491b9a8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/id.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/it.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/it.lproj/GoogleKitCore.strings deleted file mode 100755 index 772e4c49..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/it.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/iw.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/iw.lproj/GoogleKitCore.strings deleted file mode 100755 index f1af56e5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/iw.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ja.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ja.lproj/GoogleKitCore.strings deleted file mode 100755 index d33d6392..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ja.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ka.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ka.lproj/GoogleKitCore.strings deleted file mode 100755 index b3d338e7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ka.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/kk.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/kk.lproj/GoogleKitCore.strings deleted file mode 100755 index 41dedcdd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/kk.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/km.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/km.lproj/GoogleKitCore.strings deleted file mode 100755 index 7bc24129..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/km.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ko.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ko.lproj/GoogleKitCore.strings deleted file mode 100755 index 9bd28296..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ko.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lo.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lo.lproj/GoogleKitCore.strings deleted file mode 100755 index 45be12b6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lo.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lt.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lt.lproj/GoogleKitCore.strings deleted file mode 100755 index b3f1f042..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lt.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lv.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lv.lproj/GoogleKitCore.strings deleted file mode 100755 index 512104d1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/lv.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/mn.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/mn.lproj/GoogleKitCore.strings deleted file mode 100755 index 7a5720d0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/mn.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ms.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ms.lproj/GoogleKitCore.strings deleted file mode 100755 index 2634321b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ms.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nb.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nb.lproj/GoogleKitCore.strings deleted file mode 100755 index 76f06b54..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nb.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nl.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nl.lproj/GoogleKitCore.strings deleted file mode 100755 index 274b358c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/nl.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/no.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/no.lproj/GoogleKitCore.strings deleted file mode 100755 index 76f06b54..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/no.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pl.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pl.lproj/GoogleKitCore.strings deleted file mode 100755 index 62cb3376..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pl.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt.lproj/GoogleKitCore.strings deleted file mode 100755 index b66c2f6e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_BR.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_BR.lproj/GoogleKitCore.strings deleted file mode 100755 index b66c2f6e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_BR.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_PT.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_PT.lproj/GoogleKitCore.strings deleted file mode 100755 index 58869c1f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/pt_PT.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ro.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ro.lproj/GoogleKitCore.strings deleted file mode 100755 index 1234970f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ro.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ru.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ru.lproj/GoogleKitCore.strings deleted file mode 100755 index 0835d51e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/ru.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sk.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sk.lproj/GoogleKitCore.strings deleted file mode 100755 index 896aab1e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sk.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sq.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sq.lproj/GoogleKitCore.strings deleted file mode 100755 index 1e07b2ad..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sq.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sr.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sr.lproj/GoogleKitCore.strings deleted file mode 100755 index 853c922a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sr.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sv.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sv.lproj/GoogleKitCore.strings deleted file mode 100755 index 8ad17509..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/sv.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/th.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/th.lproj/GoogleKitCore.strings deleted file mode 100755 index 636968d2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/th.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/tr.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/tr.lproj/GoogleKitCore.strings deleted file mode 100755 index aac98322..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/tr.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/uk.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/uk.lproj/GoogleKitCore.strings deleted file mode 100755 index e1fcab90..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/uk.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/vi.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/vi.lproj/GoogleKitCore.strings deleted file mode 100755 index df4f057d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/vi.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_CN.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_CN.lproj/GoogleKitCore.strings deleted file mode 100755 index 80916a86..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_CN.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_HK.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_HK.lproj/GoogleKitCore.strings deleted file mode 100755 index 911dd248..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_HK.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_TW.lproj/GoogleKitCore.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_TW.lproj/GoogleKitCore.strings deleted file mode 100755 index 050f7ec4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/Resources/zh_TW.lproj/GoogleKitCore.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue.png deleted file mode 100755 index 813c4301..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@2x.png deleted file mode 100755 index 08e0b22f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@3x.png deleted file mode 100755 index 7420a626..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted.png deleted file mode 100755 index b74d7a60..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@2x.png deleted file mode 100755 index 36a4137d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@3x.png deleted file mode 100755 index 377d2b18..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_blue_highlighted@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark.png deleted file mode 100755 index 6c6689e4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@2x.png deleted file mode 100755 index 78cbd312..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@3x.png deleted file mode 100755 index 2164ab85..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted.png deleted file mode 100755 index aee96318..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@2x.png deleted file mode 100755 index 6094bf79..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@3x.png deleted file mode 100755 index 7afe5283..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_dark_highlighted@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light.png deleted file mode 100755 index 2e161886..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@2x.png deleted file mode 100755 index a49b5e58..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@3x.png deleted file mode 100755 index 477ff6b1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted.png deleted file mode 100755 index 1a736f87..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@2x.png deleted file mode 100755 index 776a4d8f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@3x.png deleted file mode 100755 index 214e84cd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_light_highlighted@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red.png deleted file mode 100755 index b3029380..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@2x.png deleted file mode 100755 index 181b6080..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@3x.png deleted file mode 100755 index 2fa8f710..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted.png deleted file mode 100755 index 55b6d78e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@2x.png deleted file mode 100755 index af28660d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@3x.png deleted file mode 100755 index a3d95a4b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/button_red_highlighted@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark.png deleted file mode 100755 index fa26c861..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark@2x.png deleted file mode 100755 index abeb8877..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_background_selected_dark@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory.png deleted file mode 100755 index faa4714e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@2x.png deleted file mode 100755 index 6f974792..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@3x.png deleted file mode 100755 index 021c59ae..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_disclosure_accessory@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider.png deleted file mode 100755 index 961dd81d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider@2x.png deleted file mode 100755 index dd337e73..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/cell_divider@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox.png deleted file mode 100755 index b2521386..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox@2x.png deleted file mode 100755 index 99ec9b63..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked.png deleted file mode 100755 index 101ef3a0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked@2x.png deleted file mode 100755 index 808a2e26..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkbox_checked@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark.png deleted file mode 100755 index 7640fb51..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark@2x.png deleted file mode 100755 index d740be0f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/checkmark@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider.png deleted file mode 100755 index 6d9422a0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider@2x.png deleted file mode 100755 index 4e998b2f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitCore.bundle/vertical_divider@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ar.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ar.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 5e452bdd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ar.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/bg.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/bg.lproj/GoogleKitDialogs.strings deleted file mode 100755 index fc78321e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/bg.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ca.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ca.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 94914c2c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ca.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/cs.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/cs.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 779ecc62..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/cs.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/da.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/da.lproj/GoogleKitDialogs.strings deleted file mode 100755 index ddf943dc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/da.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/de.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/de.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 4de8e4e4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/de.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/el.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/el.lproj/GoogleKitDialogs.strings deleted file mode 100755 index dea82db5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/el.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en.lproj/GoogleKitDialogs.strings deleted file mode 100755 index e04a6e9a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_AU.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_AU.lproj/GoogleKitDialogs.strings deleted file mode 100755 index cead3098..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_AU.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_GB.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_GB.lproj/GoogleKitDialogs.strings deleted file mode 100755 index cead3098..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_GB.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_IN.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_IN.lproj/GoogleKitDialogs.strings deleted file mode 100755 index cead3098..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/en_IN.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es.lproj/GoogleKitDialogs.strings deleted file mode 100755 index eb04bf5d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_419.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_419.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 66f13bf7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_419.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_MX.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_MX.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 66f13bf7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/es_MX.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fa.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fa.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 9c57b0e0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fa.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fi.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fi.lproj/GoogleKitDialogs.strings deleted file mode 100755 index d831fb4c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fi.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 8f3916a3..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr_CA.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr_CA.lproj/GoogleKitDialogs.strings deleted file mode 100755 index b913d1ee..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/fr_CA.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/he.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/he.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 0f00cc84..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/he.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hi.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hi.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 12213ee2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hi.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hr.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hr.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 66326eda..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hr.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hu.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hu.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 6c377fcc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hu.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hy.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hy.lproj/GoogleKitDialogs.strings deleted file mode 100755 index e0cec93e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/hy.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/id.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/id.lproj/GoogleKitDialogs.strings deleted file mode 100755 index b9d1d7e9..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/id.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/it.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/it.lproj/GoogleKitDialogs.strings deleted file mode 100755 index d768202e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/it.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/iw.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/iw.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 0f00cc84..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/iw.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ja.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ja.lproj/GoogleKitDialogs.strings deleted file mode 100755 index c673e34f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ja.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ka.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ka.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 086171a5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ka.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/kk.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/kk.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 417699bd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/kk.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/km.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/km.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 26c08c0f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/km.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ko.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ko.lproj/GoogleKitDialogs.strings deleted file mode 100755 index cfe6d14c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ko.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lo.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lo.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 182ae16c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lo.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lt.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lt.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 54a57552..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lt.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lv.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lv.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 94a90ea6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/lv.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/mn.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/mn.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 9ca532aa..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/mn.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ms.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ms.lproj/GoogleKitDialogs.strings deleted file mode 100755 index dfa49a95..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ms.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nb.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nb.lproj/GoogleKitDialogs.strings deleted file mode 100755 index e29a3383..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nb.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nl.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nl.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 7e8f2dd1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/nl.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/no.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/no.lproj/GoogleKitDialogs.strings deleted file mode 100755 index e29a3383..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/no.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pl.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pl.lproj/GoogleKitDialogs.strings deleted file mode 100755 index cdf6b1a4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pl.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt.lproj/GoogleKitDialogs.strings deleted file mode 100755 index ad418268..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_BR.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_BR.lproj/GoogleKitDialogs.strings deleted file mode 100755 index ad418268..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_BR.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_PT.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_PT.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 7b62ba65..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/pt_PT.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ro.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ro.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 4ef7a463..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ro.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ru.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ru.lproj/GoogleKitDialogs.strings deleted file mode 100755 index b742decf..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/ru.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sk.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sk.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 2ce3a32f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sk.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sq.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sq.lproj/GoogleKitDialogs.strings deleted file mode 100755 index dd09b67c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sq.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sr.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sr.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 07df4bbf..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sr.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sv.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sv.lproj/GoogleKitDialogs.strings deleted file mode 100755 index f1b83ab7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/sv.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/th.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/th.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 880a9dd6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/th.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/tr.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/tr.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 4eced562..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/tr.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/uk.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/uk.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 0852636d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/uk.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/vi.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/vi.lproj/GoogleKitDialogs.strings deleted file mode 100755 index f1e9197e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/vi.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_CN.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_CN.lproj/GoogleKitDialogs.strings deleted file mode 100755 index 4e4b1181..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_CN.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_HK.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_HK.lproj/GoogleKitDialogs.strings deleted file mode 100755 index ce99d440..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_HK.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_TW.lproj/GoogleKitDialogs.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_TW.lproj/GoogleKitDialogs.strings deleted file mode 100755 index a59eaf95..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/Resources/zh_TW.lproj/GoogleKitDialogs.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom.png deleted file mode 100755 index f407eb1b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom@2x.png deleted file mode 100755 index f165f6a7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_bottom@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left.png deleted file mode 100755 index 41412cf6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left@2x.png deleted file mode 100755 index baabb600..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_left@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right.png deleted file mode 100755 index 2780fb5f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right@2x.png deleted file mode 100755 index f0f9c662..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_right@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top.png deleted file mode 100755 index 852bab03..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top@2x.png deleted file mode 100755 index 05cb6fe5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/arrow_top@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background.png deleted file mode 100755 index b8b6b34b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background@2x.png deleted file mode 100755 index ee9c2488..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/background@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom.png deleted file mode 100755 index 2226a732..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom@2x.png deleted file mode 100755 index ffd37256..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/bottom@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left.png deleted file mode 100755 index 1f774475..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left@2x.png deleted file mode 100755 index 314f0752..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_left@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right.png deleted file mode 100755 index 4d3f98e2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right@2x.png deleted file mode 100755 index e309be6f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_bottom_right@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left.png deleted file mode 100755 index 39942ef9..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left@2x.png deleted file mode 100755 index d574d620..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_left@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right.png deleted file mode 100755 index 65e35c54..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right@2x.png deleted file mode 100755 index 9e165054..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/corner_top_right@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check.png deleted file mode 100755 index 5e5e7cf2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@2x.png deleted file mode 100755 index 53c44e05..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@3x.png deleted file mode 100755 index c9c01741..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_check@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close.png deleted file mode 100755 index 40a1a84e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@2x.png deleted file mode 100755 index 24d93196..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@3x.png deleted file mode 100755 index 776a6c28..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_close@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment.png deleted file mode 100755 index 00d69026..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@2x.png deleted file mode 100755 index 7c9804b7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@3x.png deleted file mode 100755 index e96ccd21..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_comment@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete.png deleted file mode 100755 index 999aa4cc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@2x.png deleted file mode 100755 index 796ccd22..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@3x.png deleted file mode 100755 index 6d7cb81c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_delete@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email.png deleted file mode 100755 index 4325fafd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@2x.png deleted file mode 100755 index 70620e46..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@3x.png deleted file mode 100755 index 3d136274..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_email@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download.png deleted file mode 100755 index c2c845e8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@2x.png deleted file mode 100755 index f5afb24d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@3x.png deleted file mode 100755 index ce97c85d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_file_download@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info.png deleted file mode 100755 index 5ef3dc08..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@2x.png deleted file mode 100755 index 46ed12a8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@3x.png deleted file mode 100755 index a81eeb9e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_info@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link.png deleted file mode 100755 index 67b2a9ea..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@2x.png deleted file mode 100755 index 248782d4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@3x.png deleted file mode 100755 index af03b855..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_link@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message.png deleted file mode 100755 index d58563fc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@2x.png deleted file mode 100755 index 7587b291..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@3x.png deleted file mode 100755 index 5456c42f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_message@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit.png deleted file mode 100755 index 9efbaae2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@2x.png deleted file mode 100755 index 87f8de1c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@3x.png deleted file mode 100755 index 4af4ae63..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_mode_edit@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser.png deleted file mode 100755 index bbe5c14a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@2x.png deleted file mode 100755 index d87cbccc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@3x.png deleted file mode 100755 index 4324fbf5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_open_in_browser@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera.png deleted file mode 100755 index 2ce3c5b7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@2x.png deleted file mode 100755 index d83d658d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@3x.png deleted file mode 100755 index 6125fa2b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_camera@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library.png deleted file mode 100755 index 6fb2ad6e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@2x.png deleted file mode 100755 index 5ab220f6..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@3x.png deleted file mode 100755 index bd91f66d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_photo_library@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus.png deleted file mode 100755 index 10c74aeb..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@2x.png deleted file mode 100755 index 96e44b05..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@3x.png deleted file mode 100755 index 8b31508d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_post_gplus@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print.png deleted file mode 100755 index d29c76c4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@2x.png deleted file mode 100755 index f5d0dee2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@3x.png deleted file mode 100755 index f55abe01..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_print@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem.png deleted file mode 100755 index e768d112..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@2x.png deleted file mode 100755 index 2ea61649..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@3x.png deleted file mode 100755 index ed36f700..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red.png deleted file mode 100755 index a3799cce..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@2x.png deleted file mode 100755 index c35e7a22..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@3x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@3x.png deleted file mode 100755 index 78fe386e..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/ic_report_problem_red@3x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left.png deleted file mode 100755 index 5c7567b0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left@2x.png deleted file mode 100755 index 7e6e8006..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/left@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right.png deleted file mode 100755 index 23dd61e4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right@2x.png deleted file mode 100755 index f4d24c08..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/right@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top.png deleted file mode 100755 index ef95df56..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top@2x.png b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top@2x.png deleted file mode 100755 index 33157862..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitDialogs.bundle/top@2x.png and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ar.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ar.lproj/GoogleKitHUD.strings deleted file mode 100755 index 5bcdea60..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ar.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/bg.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/bg.lproj/GoogleKitHUD.strings deleted file mode 100755 index 895eda5c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/bg.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ca.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ca.lproj/GoogleKitHUD.strings deleted file mode 100755 index f6f37d5f..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ca.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/cs.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/cs.lproj/GoogleKitHUD.strings deleted file mode 100755 index a0d736e8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/cs.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/da.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/da.lproj/GoogleKitHUD.strings deleted file mode 100755 index 44f60060..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/da.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/de.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/de.lproj/GoogleKitHUD.strings deleted file mode 100755 index 1584a0d3..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/de.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/el.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/el.lproj/GoogleKitHUD.strings deleted file mode 100755 index fcc8f2e8..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/el.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en.lproj/GoogleKitHUD.strings deleted file mode 100755 index 86b7bd5c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_AU.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_AU.lproj/GoogleKitHUD.strings deleted file mode 100755 index 30b91167..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_AU.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_GB.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_GB.lproj/GoogleKitHUD.strings deleted file mode 100755 index 30b91167..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_GB.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_IN.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_IN.lproj/GoogleKitHUD.strings deleted file mode 100755 index 30b91167..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/en_IN.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es.lproj/GoogleKitHUD.strings deleted file mode 100755 index 4e698acb..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_419.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_419.lproj/GoogleKitHUD.strings deleted file mode 100755 index 44506d73..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_419.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_MX.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_MX.lproj/GoogleKitHUD.strings deleted file mode 100755 index 44506d73..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/es_MX.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fa.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fa.lproj/GoogleKitHUD.strings deleted file mode 100755 index deb7795a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fa.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fi.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fi.lproj/GoogleKitHUD.strings deleted file mode 100755 index 018ae87a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fi.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr.lproj/GoogleKitHUD.strings deleted file mode 100755 index f1662e1b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr_CA.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr_CA.lproj/GoogleKitHUD.strings deleted file mode 100755 index c9a90983..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/fr_CA.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/he.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/he.lproj/GoogleKitHUD.strings deleted file mode 100755 index fcf35273..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/he.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hi.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hi.lproj/GoogleKitHUD.strings deleted file mode 100755 index 4c1c697c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hi.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hr.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hr.lproj/GoogleKitHUD.strings deleted file mode 100755 index 68d739bc..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hr.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hu.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hu.lproj/GoogleKitHUD.strings deleted file mode 100755 index 8cd3d6b2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hu.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hy.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hy.lproj/GoogleKitHUD.strings deleted file mode 100755 index 5e8bd145..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/hy.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/id.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/id.lproj/GoogleKitHUD.strings deleted file mode 100755 index 853f0c51..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/id.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/it.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/it.lproj/GoogleKitHUD.strings deleted file mode 100755 index 868576a0..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/it.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/iw.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/iw.lproj/GoogleKitHUD.strings deleted file mode 100755 index fcf35273..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/iw.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ja.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ja.lproj/GoogleKitHUD.strings deleted file mode 100755 index 7fdfc085..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ja.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ka.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ka.lproj/GoogleKitHUD.strings deleted file mode 100755 index 6362c54a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ka.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/kk.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/kk.lproj/GoogleKitHUD.strings deleted file mode 100755 index b68326a4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/kk.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/km.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/km.lproj/GoogleKitHUD.strings deleted file mode 100755 index 1091d795..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/km.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ko.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ko.lproj/GoogleKitHUD.strings deleted file mode 100755 index b1dfc25a..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ko.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lo.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lo.lproj/GoogleKitHUD.strings deleted file mode 100755 index 9fd91e4d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lo.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lt.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lt.lproj/GoogleKitHUD.strings deleted file mode 100755 index 069af761..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lt.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lv.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lv.lproj/GoogleKitHUD.strings deleted file mode 100755 index 5ac80aed..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/lv.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/mn.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/mn.lproj/GoogleKitHUD.strings deleted file mode 100755 index a3563ca3..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/mn.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ms.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ms.lproj/GoogleKitHUD.strings deleted file mode 100755 index 8e89acef..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ms.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nb.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nb.lproj/GoogleKitHUD.strings deleted file mode 100755 index a1da1a29..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nb.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nl.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nl.lproj/GoogleKitHUD.strings deleted file mode 100755 index 62044b90..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/nl.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/no.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/no.lproj/GoogleKitHUD.strings deleted file mode 100755 index a1da1a29..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/no.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pl.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pl.lproj/GoogleKitHUD.strings deleted file mode 100755 index be7577ca..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pl.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt.lproj/GoogleKitHUD.strings deleted file mode 100755 index 110f6198..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_BR.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_BR.lproj/GoogleKitHUD.strings deleted file mode 100755 index 110f6198..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_BR.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_PT.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_PT.lproj/GoogleKitHUD.strings deleted file mode 100755 index eb84193c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/pt_PT.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ro.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ro.lproj/GoogleKitHUD.strings deleted file mode 100755 index 7e306a5c..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ro.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ru.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ru.lproj/GoogleKitHUD.strings deleted file mode 100755 index f062ae3d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/ru.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sk.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sk.lproj/GoogleKitHUD.strings deleted file mode 100755 index d29a69e4..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sk.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sq.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sq.lproj/GoogleKitHUD.strings deleted file mode 100755 index 031d2424..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sq.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sr.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sr.lproj/GoogleKitHUD.strings deleted file mode 100755 index ccff8088..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sr.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sv.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sv.lproj/GoogleKitHUD.strings deleted file mode 100755 index fc0373a5..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/sv.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/th.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/th.lproj/GoogleKitHUD.strings deleted file mode 100755 index c0ba25f1..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/th.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/tr.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/tr.lproj/GoogleKitHUD.strings deleted file mode 100755 index da718c54..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/tr.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/uk.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/uk.lproj/GoogleKitHUD.strings deleted file mode 100755 index c4a59fcf..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/uk.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/vi.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/vi.lproj/GoogleKitHUD.strings deleted file mode 100755 index 4b2365dd..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/vi.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_CN.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_CN.lproj/GoogleKitHUD.strings deleted file mode 100755 index 9eb12e49..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_CN.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_HK.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_HK.lproj/GoogleKitHUD.strings deleted file mode 100755 index a7848e82..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_HK.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_TW.lproj/GoogleKitHUD.strings b/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_TW.lproj/GoogleKitHUD.strings deleted file mode 100755 index 969291d7..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/GoogleKitHUD.bundle/Resources/zh_TW.lproj/GoogleKitHUD.strings and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARBodyMeshingPointsiOS.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARBodyMeshingPointsiOS.h deleted file mode 100644 index 9360f357..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARBodyMeshingPointsiOS.h +++ /dev/null @@ -1,109 +0,0 @@ -// -// VROARBodyMeshingPointsiOS.h -// ViroKit -// -// Created by vik.advani on 9/4/18. -// Copyright © 2018 Viro Media. All rights reserved. -// - -#ifndef VROARBodyMeshingPointsiOS_h -#define VROARBodyMeshingPointsiOS_h - -#include -#include "VROCameraTexture.h" -#import -#import -#import -#import - -class VRODriver; - -enum class VROBodyMeshingJoints { - kTop = 0, - kNeck = 1, - kRightShoulder = 2, - kRightElbow = 3, - kRightWrist = 4, - kLeftShoulder = 5, - kLeftElbow =6, - kLeftWrist = 7, - kRightHip = 8, - kRightKnee = 9, - kRightAnkle = 10, - kLeftHip = 11, - kLeftKnee = 12, - kLeftAngle = 13, - - }; - -@interface VROBodyMeshingCaptureDelegate : NSObject { - CMTime _lastTimestamp; - int32_t _fps; - VNCoreMLRequest *_coreMLRequest; -} - -- (id)initWithMLRequest:(VNCoreMLRequest *)coreMLRequest; - -@end - -class BodyPoint { -public: - BodyPoint(CGPoint point, double confidence) { - _point = point; - _confidence = confidence; - } - - CGPoint _point; - double _confidence; -}; - -@interface BodyPointImpl: NSObject - @property (readwrite, nonatomic) CGPoint _point; - @property (readwrite, nonatomic) double _confidence; -@end - -class VROARBodyMeshingPointsiOS { - - public: - class VROBodyMeshingDelegate { - public: - virtual void onBodyMeshJointsAvail(NSDictionary *joints) {}; - }; - - - VROARBodyMeshingPointsiOS(); - bool initBodyTracking(VROCameraPosition position, std::shared_ptr driver); - bool isBodyPointConfidenceLessThan(BodyPointImpl *bodyPoint, float confidence); - void startBodyTracking(); - void stopBodyTracking(); - void processBuffer(CVPixelBufferRef sampleBuffer); - uint8_t ClampIntToByte(int n); - uint8_t clamp(int16_t input); - void printBodyPoint(NSDictionary *bodyPoints, VROBodyMeshingJoints jointType); - void writeImageToDisk(CVPixelBufferRef imageBuffer); - CVPixelBufferRef convertImage(CVImageBufferRef imageBuffer); - NSDictionary * convert(MLMultiArray *heatmap); - - void setDelegate(std::shared_ptr delegate) { - auto autoWeakDelegate = delegate; - _bodyMeshDelegateWeak = autoWeakDelegate; - } - private: - /* - Capture session and delegate used for live video playback. - */ - AVCaptureSession *_captureSession; - MLModel *_model; - VNCoreMLModel *_coreMLModel; - VNCoreMLRequest *_coreMLRequest; - CMTime _lastTimestamp; - int32_t _fps; - VROBodyMeshingCaptureDelegate *_delegate; - dispatch_queue_t bodyMeshingQueue; - std::weak_ptr _bodyMeshDelegateWeak; - CVPixelBufferRef rotatedBuffer; -}; - -#endif - - diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrame.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrame.h index 1c78d776..5cc79f10 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrame.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrame.h @@ -119,6 +119,17 @@ class VROARFrame { */ virtual std::shared_ptr getPointCloud() = 0; + /* + Returns a tightly-packed (stride == width), row-major Y (luma) plane of the + camera image. width and height are set to the plane dimensions. + The pointer is valid for the lifetime of this frame object; caller must NOT free it. + Returns false if the luma plane is unavailable (platform unsupported, frame not ready). + */ + virtual bool getCameraImageY(const uint8_t** data, int* width, int* height) { + (void)data; (void)width; (void)height; + return false; + } + /* Get the depth texture for this frame, if available. Returns nullptr if depth is not supported or not enabled. diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrameiOS.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrameiOS.h index 6419f5e3..99d9bf28 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrameiOS.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARFrameiOS.h @@ -70,6 +70,7 @@ class API_AVAILABLE(ios(12.0)) VROARFrameiOS : public VROARFrame { VROVector3f getAmbientLightColor() const; std::shared_ptr getPointCloud(); + bool getCameraImageY(const uint8_t** data, int* width, int* height) override; // Depth data support (iOS 14.0+ with LiDAR) std::shared_ptr getDepthTexture() override; @@ -116,6 +117,10 @@ class API_AVAILABLE(ios(12.0)) VROARFrameiOS : public VROARFrame { mutable std::shared_ptr _depthTexture; mutable std::shared_ptr _depthConfidenceTexture; + // Cached tightly-packed Y plane (acquired lazily via getCameraImageY) + mutable std::vector _lumaData; + mutable int _lumaW = 0, _lumaH = 0; + /* Sample depth texture at normalized UV coordinates (0-1 range). Returns depth value in meters, or 0.0 if invalid. diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARPlaneAnchor.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARPlaneAnchor.h index a9018216..4deddb84 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARPlaneAnchor.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARPlaneAnchor.h @@ -40,7 +40,7 @@ Thresholds: - Minimum extent change: 1cm or 5% - Minimum center change: 1cm - - Update throttle: 100ms (10 updates/sec max) + - Update throttle: 33ms early (first 20 updates), 66ms mature */ #define VRO_PLANE_CHANGE_DETECTION_ENABLED @@ -177,15 +177,14 @@ class VROARPlaneAnchor : public VROARAnchor { // Check extent change (absolute and percentage) VROVector3f extentDiff = newExtent - _extent; float maxExtentDiff = std::max(std::abs(extentDiff.x), std::abs(extentDiff.z)); + // Absolute threshold: any 1cm change is significant if (maxExtentDiff > EXTENT_THRESHOLD) { - // Also check percentage change for larger planes - if (_extent.magnitude() > 0.001f) { - float percentChange = maxExtentDiff / _extent.magnitude(); - if (percentChange > EXTENT_PERCENT_THRESHOLD) { - return true; - } - } else { - // For very small planes, any change is significant + return true; + } + // Relative threshold: significant % change even if absolute is small + if (_extent.magnitude() > 0.001f) { + float percentChange = maxExtentDiff / _extent.magnitude(); + if (percentChange > EXTENT_PERCENT_THRESHOLD) { return true; } } @@ -221,13 +220,11 @@ class VROARPlaneAnchor : public VROARAnchor { // Check if update should be throttled bool shouldThrottleUpdate() const { - // Minimum time between updates (milliseconds) - static const int MIN_UPDATE_INTERVAL_MS = 100; // 10 updates per second max - + // First 20 updates: ~30fps (33ms). After: ~15fps (66ms). + int intervalMs = (_updateCount < 20) ? 33 : 66; auto now = std::chrono::steady_clock::now(); auto elapsed = std::chrono::duration_cast(now - _lastUpdateTime).count(); - - return elapsed < MIN_UPDATE_INTERVAL_MS; + return elapsed < intervalMs; } // Mark that an update occurred diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARScene.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARScene.h index ea44a03d..13767481 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARScene.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARScene.h @@ -58,7 +58,7 @@ class VROARScene : public VROScene { _ambientLightColor = { 1.0, 1.0, 1.0 }; _pointCloudNode = std::make_shared(); _pointCloudEmitter = nullptr; - _detectionTypes = { VROAnchorDetection::PlanesHorizontal }; //default is horizontal + _detectionTypes = { VROAnchorDetection::PlanesHorizontal, VROAnchorDetection::PlanesVertical }; }; virtual ~VROARScene(); diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSession.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSession.h index e1336218..7a397877 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSession.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSession.h @@ -97,11 +97,13 @@ enum class VROImageTrackingImpl { enum class VROCloudAnchorProvider { None, ARCore, + ReactVision, // ReactVision custom backend (ReactVisionCCA) }; enum class VROGeospatialAnchorProvider { None, ARCoreGeospatial, + ReactVision, // ReactVision custom backend (RVCCAGeospatialProvider) }; /* @@ -111,7 +113,8 @@ enum class VROGeospatialAnchorProvider { enum class VROOcclusionMode { Disabled, // No occlusion - virtual objects always render on top DepthBased, // Use depth data to occlude virtual objects behind real-world surfaces - PeopleOnly // Only occlude virtual objects behind detected people (iOS 13+/Android with ARCore) + PeopleOnly, // Only occlude virtual objects behind detected people (iOS 13+/Android with ARCore) + DepthOnly // Activates depth sensing WITHOUT occlusion rendering (depth data available, no visual occlusion) }; /* @@ -443,6 +446,25 @@ class VROARSession { } } + virtual void resolveGeospatialAnchor(const std::string& platformUuid, VROQuaternion quaternion, + std::function)> onSuccess, + std::function onFailure) { + if (onFailure) { + onFailure("Resolve geospatial anchor not supported"); + } + } + + // Host a geospatial anchor to the ReactVision backend at the given GPS position. + // Returns the platform UUID via onSuccess(platformUuid) string callback. + virtual void hostGeospatialAnchor(double latitude, double longitude, double altitude, + const std::string& altitudeMode, + std::function onSuccess, + std::function onFailure) { + if (onFailure) { + onFailure("Host geospatial anchor not supported"); + } + } + /* Create a terrain anchor at the specified location. Terrain anchors are positioned relative to the terrain surface. @@ -478,6 +500,140 @@ class VROARSession { // Default implementation does nothing } + // ======================================================================== + // ReactVision Cloud Anchor Management API + // These do not require an active AR frame — they are pure backend operations. + // ======================================================================== + + virtual void rvGetCloudAnchor( + const std::string& anchorId, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + virtual void rvListCloudAnchors( + int limit, int offset, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + virtual void rvUpdateCloudAnchor( + const std::string& anchorId, + const std::string& name, + const std::string& description, + bool isPublic, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + virtual void rvDeleteCloudAnchor( + const std::string& anchorId, + std::function callback) { + if (callback) callback(false, "Not supported"); + } + virtual void rvFindNearbyCloudAnchors( + double lat, double lng, double radius, int limit, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + virtual void rvAttachAssetToCloudAnchor( + const std::string& anchorId, + const std::string& fileUrl, + int64_t fileSize, + const std::string& name, + const std::string& assetType, + const std::string& externalUserId, + std::function callback) { + if (callback) callback(false, "Not supported"); + } + virtual void rvRemoveAssetFromCloudAnchor( + const std::string& anchorId, + const std::string& assetId, + std::function callback) { + if (callback) callback(false, "Not supported"); + } + virtual void rvTrackCloudAnchorResolution( + const std::string& anchorId, + bool success, double confidence, + int matchCount, int inlierCount, int processingTimeMs, + const std::string& platform, const std::string& externalUserId, + std::function callback) { + if (callback) callback(false, "Not supported"); + } + + // ======================================================================== + // ReactVision Geospatial CRUD API + // These methods route directly to the ReactVision backend and are only + // meaningful when geospatialAnchorProvider == ReactVision. + // ======================================================================== + + /* + Retrieve a geospatial anchor record by ID (with linked scene asset / scene data). + Callback receives (success, jsonData, error). + */ + virtual void rvGetGeospatialAnchor( + const std::string& anchorId, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + + /* + Find geospatial anchors within radius metres of the given GPS coordinate. + Callback receives (success, jsonArrayData, error). + */ + virtual void rvFindNearbyGeospatialAnchors( + double lat, double lng, double radius, int limit, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + + /* + Update an existing geospatial anchor (link scene asset, scene, user asset, or rename). + Pass empty strings to leave a field unchanged. + Callback receives (success, jsonData, error). + */ + virtual void rvUpdateGeospatialAnchor( + const std::string& anchorId, + const std::string& sceneAssetId, + const std::string& sceneId, + const std::string& name, + const std::string& userAssetId, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + + /* + Upload a file to ReactVision storage and return a user_asset_id. + filePath must be a local file path readable by the native layer. + assetType: "3d-model" | "image" | "video" | "audio" + Callback receives (success, userAssetId, fileUrl, error). + */ + virtual void rvUploadAsset( + const std::string& filePath, + const std::string& assetType, + const std::string& fileName, + const std::string& appUserId, + std::function callback) { + if (callback) callback(false, "", "", "Not supported"); + } + + /* + Permanently delete a geospatial anchor from the ReactVision backend. + Callback receives (success, error). + */ + virtual void rvDeleteGeospatialAnchor( + const std::string& anchorId, + std::function callback) { + if (callback) callback(false, "Not supported"); + } + + /* + List geospatial anchors for the current project (paginated). + Callback receives (success, jsonArrayData, error). + */ + virtual void rvListGeospatialAnchors( + int limit, int offset, + std::function callback) { + if (callback) callback(false, "", "Not supported"); + } + // ======================================================================== // Scene Semantics API // ======================================================================== diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSessioniOS.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSessioniOS.h index 0e330721..e83e08bc 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSessioniOS.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROARSessioniOS.h @@ -42,6 +42,8 @@ class VROTrackingHelper; class VROMonocularDepthEstimator; @class VROARKitSessionDelegate; @class VROCloudAnchorProviderARCore; +@class VROCloudAnchorProviderReactVision; +namespace ReactVisionCCA { class RVCCAGeospatialProvider; } class API_AVAILABLE(ios(12.0)) VROARSessioniOS : public VROARSession, public std::enable_shared_from_this { public: @@ -139,6 +141,13 @@ class API_AVAILABLE(ios(12.0)) VROARSessioniOS : public VROARSession, public std VROQuaternion quaternion, std::function)> onSuccess, std::function onFailure) override; + void resolveGeospatialAnchor(const std::string& platformUuid, VROQuaternion quaternion, + std::function)> onSuccess, + std::function onFailure) override; + void hostGeospatialAnchor(double latitude, double longitude, double altitude, + const std::string& altitudeMode, + std::function onSuccess, + std::function onFailure) override; void createTerrainAnchor(double latitude, double longitude, double altitudeAboveTerrain, VROQuaternion quaternion, std::function)> onSuccess, @@ -148,6 +157,44 @@ class API_AVAILABLE(ios(12.0)) VROARSessioniOS : public VROARSession, public std std::function)> onSuccess, std::function onFailure) override; void removeGeospatialAnchor(std::shared_ptr anchor) override; + void rvGetGeospatialAnchor(const std::string& anchorId, + std::function callback) override; + void rvFindNearbyGeospatialAnchors(double lat, double lng, double radius, int limit, + std::function callback) override; + void rvUpdateGeospatialAnchor(const std::string& anchorId, + const std::string& sceneAssetId, const std::string& sceneId, const std::string& name, + const std::string& userAssetId, + std::function callback) override; + void rvUploadAsset(const std::string& filePath, const std::string& assetType, + const std::string& fileName, const std::string& appUserId, + std::function callback) override; + void rvDeleteGeospatialAnchor(const std::string& anchorId, + std::function callback) override; + void rvListGeospatialAnchors(int limit, int offset, + std::function callback) override; + + // Cloud anchor management + void rvGetCloudAnchor(const std::string& anchorId, + std::function callback) override; + void rvListCloudAnchors(int limit, int offset, + std::function callback) override; + void rvUpdateCloudAnchor(const std::string& anchorId, const std::string& name, + const std::string& description, bool isPublic, + std::function callback) override; + void rvDeleteCloudAnchor(const std::string& anchorId, + std::function callback) override; + void rvFindNearbyCloudAnchors(double lat, double lng, double radius, int limit, + std::function callback) override; + void rvAttachAssetToCloudAnchor(const std::string& anchorId, const std::string& fileUrl, + int64_t fileSize, const std::string& name, const std::string& assetType, + const std::string& externalUserId, + std::function callback) override; + void rvRemoveAssetFromCloudAnchor(const std::string& anchorId, const std::string& assetId, + std::function callback) override; + void rvTrackCloudAnchorResolution(const std::string& anchorId, bool success, + double confidence, int matchCount, int inlierCount, int processingTimeMs, + const std::string& platform, const std::string& externalUserId, + std::function callback) override; // Scene Semantics API bool isSemanticModeSupported() const override; @@ -197,6 +244,32 @@ class API_AVAILABLE(ios(12.0)) VROARSessioniOS : public VROARSession, public std The ARCore cloud anchor provider instance (for iOS using ARCore SDK). */ VROCloudAnchorProviderARCore *_cloudAnchorProviderARCore = nil; + + /* + The ReactVision cloud anchor provider instance. + Reads RVApiKey and RVProjectId from Info.plist. + */ + VROCloudAnchorProviderReactVision *_cloudAnchorProviderRV = nil; + + /* + The ReactVision geospatial provider instance. + Active when setGeospatialAnchorProvider(ReactVision) is called. + */ + std::shared_ptr _geospatialProviderRV; + std::string _rvGeoProjectId; + + /* + CLLocationManager delegate for ReactVision geospatial — provides GPS pose + when ARCore VPS is not in use. + */ + id _rvLocationDelegate; + + /* + Last GPS pose received from Core Location (ReactVision provider path). + Updated on the main thread; read from any thread via getCameraGeospatialPose(). + */ + mutable VROGeospatialPose _lastKnownGPSPose; + bool _needsGeospatialModeApply = false; /* diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROChoreographer.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROChoreographer.h index 22d4ba6f..b4e2d7a8 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROChoreographer.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROChoreographer.h @@ -261,6 +261,20 @@ class VROChoreographer { Floating point target for initially rendering the scene. */ std::shared_ptr _hdrTarget; + + /* + Depth-only render target (DepthTextureRaw) used to capture the scene depth + after the base render pass. The depth is blitted from _hdrTarget each frame + and stored on VRORenderContext as the scene depth for the *next* frame. + Only created when HDR rendering is enabled and MRT is supported. + */ + std::shared_ptr _sceneDepthTarget; + + /* + The scene depth texture captured from the last completed frame. Set on + VRORenderContext at the start of each frame so shaders can sample it. + */ + std::shared_ptr _lastSceneDepthTexture; /* Tone mapping render pass to render the floating point scene in RGB. diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROMaterial.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROMaterial.h index e795b81d..70fa857c 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROMaterial.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROMaterial.h @@ -392,7 +392,9 @@ class VROMaterial : public VROAnimatable, public VROThreadRestricted { } void setShaderUniform(std::string name, std::shared_ptr texture) { _shaderUniformTextures[name] = texture; - // NOTE: Do NOT call updateSubstrate() - it deletes and recreates the shader binding! + // Call updateSubstrateTextures() (not updateSubstrate()) to re-bind textures without + // destroying and recreating the shader binding. + updateSubstrateTextures(); } const std::map &getShaderUniformFloats() const { return _shaderUniformFloats; } diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderContext.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderContext.h index 8c97f7e7..6964feef 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderContext.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderContext.h @@ -208,6 +208,27 @@ class VRORenderContext { return _depthTexture; } + void setSceneDepthTexture(std::shared_ptr texture) { + _sceneDepthTexture = texture; + } + std::shared_ptr getSceneDepthTexture() const { + return _sceneDepthTexture; + } + + void setCameraBackgroundTexture(std::shared_ptr texture) { + _cameraBackgroundTexture = texture; + } + std::shared_ptr getCameraBackgroundTexture() const { + return _cameraBackgroundTexture; + } + + void setCameraImageTransform(VROMatrix4f transform) { + _cameraImageTransform = transform; + } + VROMatrix4f getCameraImageTransform() const { + return _cameraImageTransform; + } + void setDepthTextureTransform(VROMatrix4f transform) { _depthTextureTransform = transform; } @@ -223,7 +244,9 @@ class VRORenderContext { } bool isOcclusionEnabled() const { - return _occlusionMode != VROOcclusionMode::Disabled && _depthTexture != nullptr; + return (_occlusionMode == VROOcclusionMode::DepthBased || + _occlusionMode == VROOcclusionMode::PeopleOnly) + && _depthTexture != nullptr; } void setViewport(VROViewport viewport) { @@ -315,6 +338,25 @@ class VRORenderContext { */ std::shared_ptr _depthTexture; + /* + Scene depth texture captured from the previous frame's base render pass. + Null for the first frame or when HDR rendering is disabled. + Sampled as raw depth values (no PCF compare mode). + */ + std::shared_ptr _sceneDepthTexture; + + /* + Live AR camera background texture. On Android this is GL_TEXTURE_EXTERNAL_OES; + on iOS it is a standard GL_TEXTURE_2D. Null when no AR session is active. + */ + std::shared_ptr _cameraBackgroundTexture; + + /* + Transform mapping viewport UV coordinates to camera image UV coordinates. + This accounts for device orientation and camera crop/zoom. + */ + VROMatrix4f _cameraImageTransform; + /* Transform to convert from screen UV to depth texture UV. */ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderer.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderer.h index 3dda1933..572d2d1f 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderer.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VRORenderer.h @@ -256,6 +256,14 @@ class VRORenderer { void setOcclusionMode(VROOcclusionMode mode); void setDepthTexture(std::shared_ptr depthTexture); void setDepthTextureTransform(VROMatrix4f transform); + + /* + Set the live AR camera background texture and its viewport-to-image UV transform. + These are auto-bound to shader modifier samplers named 'camera_texture' and the + uniform 'camera_image_transform', respectively. + */ + void setCameraBackgroundTexture(std::shared_ptr texture); + void setCameraImageTransform(VROMatrix4f transform); #pragma mark - Camera diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderModifier.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderModifier.h index 18526282..5871efb2 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderModifier.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderModifier.h @@ -225,6 +225,63 @@ class VROShaderModifier { std::string getName() const { return _name; } + + /* + Priority controls the injection order when multiple modifiers share the same entry + point. Lower values run first. Modifiers with equal priority preserve their + insertion order (stable sort). Suggested conventions: + -100 Engine internals (AR shadow, occlusion, etc.) + 0 Default / user modifiers + 100 Debug / overlay modifiers + */ + void setPriority(int priority) { + _priority = priority; + } + int getPriority() const { + return _priority; + } + + /* + When true, the modifier's GLSL code may declare and sample 'uniform sampler2D scene_depth_texture'. + The engine automatically binds the previous frame's scene depth to that sampler. + Only available when HDR rendering is enabled; the sampler returns null (skipped) otherwise. + This flag is informational metadata — the binding is driven by the sampler name alone. + */ + void setRequiresSceneDepth(bool value) { + _requiresSceneDepth = value; + } + bool requiresSceneDepth() const { + return _requiresSceneDepth; + } + + /* + When true, the modifier's GLSL code may declare and sample 'uniform sampler2D camera_texture'. + The engine automatically binds the live AR camera background texture to that sampler. + On Android (ARCore) the texture is GL_TEXTURE_EXTERNAL_OES; the engine injects the required + #extension and replaces 'sampler2D camera_texture' with 'samplerExternalOES camera_texture' + automatically, so user code can always declare 'uniform sampler2D camera_texture'. + A 'uniform mat4 camera_image_transform' is also auto-bound, providing the UV mapping + from viewport coordinates to camera image coordinates. + */ + void setRequiresCameraTexture(bool value) { + _requiresCameraTexture = value; + } + bool requiresCameraTexture() const { + return _requiresCameraTexture; + } + + /* + Varyings declare typed variables that are written in the vertex stage (Geometry or Vertex + entry point) and read in the fragment stage (Surface, LightingModel, or Fragment entry + point). Each string should be a GLSL type + name pair, e.g. "highp float displacement". + The "out" / "in" qualifiers are added automatically by VROShaderProgram. + */ + void setVaryings(std::vector varyings) { + _varyings = std::move(varyings); + } + const std::vector &getVaryings() const { + return _varyings; + } /* Vertex attributes required by the modifier must be set. This is a bitmask of @@ -292,6 +349,15 @@ class VROShaderModifier { int _shaderModifierId; std::string _name; + int _priority = 0; + bool _requiresSceneDepth = false; + bool _requiresCameraTexture = false; + + /* + Typed varying declarations shared between vertex and fragment stages. + Each string is a GLSL type+name pair, e.g. "highp float displacement". + */ + std::vector _varyings; /* VROShaderMask indicating any additional vertex attributes this modifier requires. See diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderProgram.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderProgram.h index 19500e77..04bf7ed0 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderProgram.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROShaderProgram.h @@ -145,6 +145,10 @@ class VROShaderProgram { return _samplers; } + const std::vector &getModifierSamplers() const { + return _modifierSamplers; + } + const std::string &getName() const { return _shaderName; } @@ -269,6 +273,13 @@ class VROShaderProgram { List of the names of all samplers used by this shader. */ std::vector _samplers; + + /* + List of sampler names declared inside shader modifiers (via "uniform sampler2D ..." in + modifier code). These are assigned texture units sequentially after _samplers, and the + corresponding textures are supplied via VROMaterial::getShaderUniformTextures(). + */ + std::vector _modifierSamplers; /* The modifiers used on this shader. diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROTexture.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROTexture.h index 4e0edb63..c57ba70b 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROTexture.h +++ b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROTexture.h @@ -272,9 +272,6 @@ class VROTexture : public std::enable_shared_from_this { int getHeight() const { return _height; } - bool isSRGB() const { - return _sRGB; - } protected: int _width, _height; diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewControllerGVR.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewControllerGVR.h deleted file mode 100644 index dce0f30f..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewControllerGVR.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// VROViewControllerGVR.h -// ViroKit -// -// Created by Raj Advani on 11/30/17. -// Copyright © 2017 Viro Media. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -class VRORendererConfiguration; - -@interface VROViewControllerGVR : UIViewController - -/* - Set this to true to force the view into landscape mode - when it appears. - */ -@property (readwrite, nonatomic) BOOL forceLandscape; - -- (id)initWithConfig:(VRORendererConfiguration)config; - -@end diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewGVR.h b/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewGVR.h deleted file mode 100644 index 5f2940c0..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/Headers/VROViewGVR.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// VROViewGVR.h -// ViroRenderer -// -// Created by Raj Advani on 4/28/16. -// Copyright © 2016 Viro Media. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import -#import -#import "VROView.h" - -class VRORendererConfiguration; - -@interface VROViewGVR : GLKView - -@property (readwrite, nonatomic) BOOL paused; -@property (readwrite, nonatomic) IBInspectable BOOL testingMode; - -- (instancetype)initWithFrame:(CGRect)frame config:(VRORendererConfiguration)config; - -@end diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Info.plist b/ios/dist/ViroRenderer/ViroKit.framework/Info.plist index dd857f22..29f6c894 100644 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/Info.plist and b/ios/dist/ViroRenderer/ViroKit.framework/Info.plist differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Black.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Black.ttf deleted file mode 100755 index f150e874..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Black.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BlackItalic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BlackItalic.ttf deleted file mode 100755 index e0fb09fa..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BlackItalic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Bold.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Bold.ttf deleted file mode 100755 index 545aa00d..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Bold.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BoldItalic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BoldItalic.ttf deleted file mode 100755 index 423cc61b..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-BoldItalic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Italic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Italic.ttf deleted file mode 100755 index ef813625..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Italic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Light.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Light.ttf deleted file mode 100755 index 4895ef11..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Light.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-LightItalic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-LightItalic.ttf deleted file mode 100755 index 7deff915..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-LightItalic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Medium.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Medium.ttf deleted file mode 100755 index 24f2a3e2..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Medium.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-MediumItalic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-MediumItalic.ttf deleted file mode 100755 index d23cfa41..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-MediumItalic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Regular.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Regular.ttf deleted file mode 100755 index e73de947..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Regular.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Thin.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Thin.ttf deleted file mode 100755 index be8fbf49..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-Thin.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-ThinItalic.ttf b/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-ThinItalic.ttf deleted file mode 100755 index f7aa4878..00000000 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/MaterialRobotoFontLoader.bundle/Roboto-ThinItalic.ttf and /dev/null differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Shaders.dat b/ios/dist/ViroRenderer/ViroKit.framework/Shaders.dat index d2211302..b441759e 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/Shaders.dat +++ b/ios/dist/ViroRenderer/ViroKit.framework/Shaders.dat @@ -1,5 +1,5 @@ dependencies: \ /Users/dorantes/Documents/ViroWorkspace/virocore/ViroRenderer/Shaders.metal \ - /private/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v17.3.48.0.S3RzyU/Metal.xctoolchain/usr/metal/32023/lib/clang/32023.850/include/metal/module.modulemap \ + /private/var/run/com.apple.security.cryptexd/mnt/com.apple.MobileAsset.MetalToolchain-v17.3.7003.10.XhrnA4/Metal.xctoolchain/usr/metal/32023/lib/clang/32023.864/include/metal/module.modulemap \ /Users/dorantes/Documents/ViroWorkspace/virocore/ViroRenderer/VROSharedStructures.h \ /Users/dorantes/Documents/ViroWorkspace/virocore/ViroRenderer/VRODefines.h diff --git a/ios/dist/ViroRenderer/ViroKit.framework/Shaders.metal b/ios/dist/ViroRenderer/ViroKit.framework/Shaders.metal deleted file mode 100644 index 71926995..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/Shaders.metal +++ /dev/null @@ -1,1327 +0,0 @@ -// -// Shaders.metal -// ViroRenderer -// -// Created by Raj Advani on 10/13/15. -// Copyright © 2015 Raj Advani. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#include -#include "VROSharedStructures.h" - -#include "VRODefines.h" -#if VRO_METAL - -using namespace metal; - -struct VROCustomUniforms { -#pragma custom_uniforms -}; - -constexpr sampler s(coord::normalized, - address::repeat, - filter::linear, - mip_filter::linear); - -/* --------------------------------------- - GEOMETRY ATTRIBUTES - --------------------------------------- */ - -typedef struct { - float3 position [[ attribute(0) ]]; - float3 normal [[ attribute(1) ]]; - float4 color [[ attribute(2) ]]; - float2 texcoord [[ attribute(3) ]]; -} VRORendererAttributes; - -/* --------------------------------------- - MODIFIER STRUCTURES - --------------------------------------- */ - -struct VROShaderGeometry { - float3 position; - float3 normal; - float2 texcoord; - float4 tangent; - float4 bone_weights; - int4 bone_indices; -}; - -struct VROShaderVertex { - float4 position; -}; - -struct VROTransforms { - float4x4 model_matrix; - float4x4 view_matrix; - float4x4 projection_matrix; -}; - -struct VROSurface { - float4 diffuse_color; - float2 diffuse_texcoord; - float diffuse_intensity; - float shininess; - float3 specular_color; - float roughness; - float metalness; - float ao; - float alpha; - float3 normal; - float3 position; - float3 view; -}; - -/* --------------------------------------- - SHARED LIGHTING FUNCTIONS - --------------------------------------- */ - -float compute_attenuation(constant VROLightUniforms &light, - float3 surface_pos, - thread float3 *surface_to_light); - -float compute_attenuation(constant VROLightUniforms &light, - float3 surface_pos, - thread float3 *surface_to_light) { - - float attenuation = 1.0; - - // Directional light - if (light.type == 1) { - *surface_to_light = normalize(light.direction); - attenuation = 1.0; - } - - // Omni + Spot lights - else { - *surface_to_light = -normalize(light.position.xyz - surface_pos); - float distance_to_light = length(light.position.xyz - surface_pos); - float d = clamp((distance_to_light - light.attenuation_start_distance) / - (light.attenuation_end_distance - light.attenuation_start_distance), - 0.0, 1.0); - - attenuation = 1.0 - pow(d, 1.0 / light.attenuation_falloff_exp); - - // Spot light - if (light.type == 3) { - float light_surface_angle = acos(dot(*surface_to_light, normalize(light.direction))); - if (light_surface_angle > light.spot_inner_angle) { - float t = (light_surface_angle - light.spot_inner_angle) / light.spot_outer_angle; - attenuation = clamp(mix(attenuation, 0.0, t), 0.0, 1.0); - } - } - } - - return attenuation; -} - -float4 compute_reflection(float3 surface_position, float3 camera_position, float3 normal, - texturecube reflect_texture); -float4 compute_reflection(float3 surface_position, float3 camera_position, float3 normal, - texturecube reflect_texture) { - - float3 surface_to_camera = normalize(surface_position - camera_position); - float3 reflect_ray = reflect(surface_to_camera, -normal); - - return reflect_texture.sample(s, float3(reflect_ray.xy, -reflect_ray.z)); -} - -/* --------------------------------------- - CONSTANT LIGHTING MODEL - --------------------------------------- */ - -typedef struct { - float4 position [[ position ]]; - float4 color; - float2 texcoord; - - float3 surface_position; - float3 camera_position; - - float3 ambient_color; - float4 material_color; - float diffuse_intensity; - float material_alpha; -} VROConstantLightingVertexOut; - -vertex VROConstantLightingVertexOut constant_lighting_vertex(VRORendererAttributes attributes [[ stage_in ]], - constant VROViewUniforms &view [[ buffer(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma geometry_modifier_uniforms -#pragma vertex_modifier_uniforms - - VROConstantLightingVertexOut out; - - VROShaderGeometry _geometry; - _geometry.position = attributes.position; - _geometry.normal = attributes.normal; - _geometry.texcoord = attributes.texcoord; - - VROTransforms _transforms; - _transforms.model_matrix = view.model_matrix; - _transforms.view_matrix = view.view_matrix; - _transforms.projection_matrix = view.projection_matrix; - -#pragma geometry_modifier_body - - float3 v_position = (_transforms.model_matrix * float4(_geometry.position, 1.0)).xyz; - float4 in_position = float4(_geometry.position, 1.0); - - VROShaderVertex _vertex; - _vertex.position = view.modelview_projection_matrix * in_position; - -#pragma vertex_modifier_body - - out.position = _vertex.position; - out.texcoord = _geometry.texcoord; - out.ambient_color = lighting.ambient_light_color; - out.material_color = material.diffuse_surface_color; - out.diffuse_intensity = material.diffuse_intensity; - out.material_alpha = material.alpha; - out.surface_position = v_position; - out.camera_position = view.camera_position; - - return out; -} - -fragment float4 constant_lighting_fragment_c(VROConstantLightingVertexOut in [[ stage_in ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = material.shininess; - _surface.roughness = material.roughness; - _surface.metalness = material.metalness; - _surface.ao = material.ao; - _surface.normal = float3(0, 0, 1); - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.diffuse_texcoord = float2(0, 0); - _surface.specular_texcoord = float2(0, 0); - _surface.alpha = in.material_alpha; - -#pragma surface_modifier_body - - float4 _output_color = float4(_surface.diffuse_color.xyz * lighting.ambient_light_color + _surface.diffuse_color.xyz * in.diffuse_intensity, - _surface.alpha * _surface.diffuse_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 constant_lighting_fragment_t(VROConstantLightingVertexOut in [[ stage_in ]], - texture2d texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = material.shininess; - _surface.normal = float3(0, 0, 1); - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha; - -#pragma surface_modifier_body - - float4 _output_color = float4(_surface.diffuse_color.xyz * lighting.ambient_light_color + _surface.diffuse_color.xyz * in.diffuse_intensity, - _surface.alpha * _surface.diffuse_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 constant_lighting_fragment_q(VROConstantLightingVertexOut in [[ stage_in ]], - texturecube texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float3 texcoord = float3(in.surface_position.x, in.surface_position.y, -in.surface_position.z); - float4 texture_color = texture.sample(s, texcoord); - - VROSurface _surface; - _surface.diffuse_color = in.material_color * texture_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = material.shininess; - _surface.normal = float3(0, 0, 1); - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha; - -#pragma surface_modifier_body - - float4 _output_color = float4(_surface.diffuse_color.xyz * lighting.ambient_light_color + _surface.diffuse_color.xyz * in.diffuse_intensity, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -/* --------------------------------------- - LAMBERT LIGHTING MODEL - --------------------------------------- */ - -typedef struct { - float4 position [[ position ]]; - float3 normal; - float4 color; - float2 texcoord; - - float3 surface_position; - float3 camera_position; - - float3 ambient_color; - float4 material_color; - float diffuse_intensity; - float material_alpha; -} VROLambertLightingVertexOut; - -vertex VROLambertLightingVertexOut lambert_lighting_vertex(VRORendererAttributes attributes [[ stage_in ]], - constant VROViewUniforms &view [[ buffer(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma geometry_modifier_uniforms -#pragma vertex_modifier_uniforms - - VROLambertLightingVertexOut out; - - VROShaderGeometry _geometry; - _geometry.position = attributes.position; - _geometry.normal = attributes.normal; - _geometry.texcoord = attributes.texcoord; - _geometry.color = attributes.color; - - VROTransforms _transforms; - _transforms.model_matrix = view.model_matrix; - _transforms.view_matrix = view.view_matrix; - _transforms.projection_matrix = view.projection_matrix; - _transforms.normal_matrix = view.normal_matrix; - _transforms.modelview_matrix = view.modelview_matrix; - -#pragma geometry_modifier_body - - float3 v_position = (_transforms.model_matrix * float4(_geometry.position, 1.0)).xyz; - float4 in_position = float4(_geometry.position, 1.0); - - VROShaderVertex _vertex; - _vertex.position = view.modelview_projection_matrix * in_position; - -#pragma vertex_modifier_body - - out.position = _vertex.position; - out.texcoord = _geometry.texcoord; - out.color = _geometry.color; - - out.surface_position = v_position; - out.camera_position = view.camera_position; - out.normal = normalize((_transforms.normal_matrix * float4(_geometry.normal, 0.0)).xyz); - - out.ambient_color = lighting.ambient_light_color; - out.material_color = material.diffuse_surface_color; - out.diffuse_intensity = material.diffuse_intensity; - out.material_alpha = material.alpha; - - return out; -} - -float3 apply_light_lambert(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float4 material_color); -float3 apply_light_lambert(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float4 material_color) { - - thread float3 surface_to_light; - float attenuation = compute_attenuation(light, surface_pos, &surface_to_light); - - float diffuse_coeff = fmax(0.0, dot(-surface_normal, surface_to_light)); - return attenuation * diffuse_coeff * material_color.rgb * light.color; -} - -float4 lambert_lighting_diffuse_fixed(VROLambertLightingVertexOut in, - constant VROSceneLightingUniforms &lighting); -float4 lambert_lighting_diffuse_fixed(VROLambertLightingVertexOut in, - constant VROSceneLightingUniforms &lighting) { - float3 ambient_light_color = in.ambient_color * in.material_color.xyz; - float4 material_diffuse_color = in.material_color * in.diffuse_intensity; - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - in.normal, - material_diffuse_color); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * in.material_color.a); -} - -float4 lambert_lighting_diffuse_texture(VROLambertLightingVertexOut in, - texture2d texture, - constant VROSceneLightingUniforms &lighting); -float4 lambert_lighting_diffuse_texture(VROLambertLightingVertexOut in, - texture2d texture, - constant VROSceneLightingUniforms &lighting) { - - float4 diffuse_texture_color = texture.sample(s, in.texcoord); - float3 ambient_light_color = in.ambient_color * diffuse_texture_color.xyz; - - float4 material_diffuse_color = diffuse_texture_color * in.diffuse_intensity; - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - in.normal, - material_diffuse_color); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * diffuse_texture_color.a); -} - -fragment float4 lambert_lighting_fragment_c(VROLambertLightingVertexOut in [[ stage_in ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = 0; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - _surface.normal, - material_diffuse_color); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 lambert_lighting_fragment_c_reflect(VROLambertLightingVertexOut in [[ stage_in ]], - texturecube reflect_texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - _surface.normal, - _surface.diffuse_color.xyz, - in.diffuse_intensity); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 lambert_lighting_fragment_t(VROLambertLightingVertexOut in [[ stage_in ]], - texture2d texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = 0; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - _surface.normal, - material_diffuse_color); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 lambert_lighting_fragment_t_reflect(VROLambertLightingVertexOut in [[ stage_in ]], - texture2d texture [[ texture(0) ]], - texturecube reflect_texture [[ texture(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = float4(0, 0, 0, 0); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_lambert(lighting.lights[i], - in.surface_position, - _surface.normal, - _surface.diffuse_color.xyz, - in.diffuse_intensity); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -/* --------------------------------------- - PHONG LIGHTING MODEL - --------------------------------------- */ - -typedef struct { - float4 position [[ position ]]; - float3 normal; - float4 color; - float2 texcoord; - - float3 surface_position; - float3 camera_position; - - float3 ambient_color; - float4 material_color; - float material_shininess; - float diffuse_intensity; - float material_alpha; -} VROPhongLightingVertexOut; - -vertex VROPhongLightingVertexOut phong_lighting_vertex(VRORendererAttributes attributes [[ stage_in ]], - constant VROViewUniforms &view [[ buffer(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma geometry_modifier_uniforms -#pragma vertex_modifier_uniforms - - VROPhongLightingVertexOut out; - - VROShaderGeometry _geometry; - _geometry.position = attributes.position; - _geometry.normal = attributes.normal; - _geometry.texcoord = attributes.texcoord; - _geometry.color = attributes.color; - - VROTransforms _transforms; - _transforms.model_matrix = view.model_matrix; - _transforms.view_matrix = view.view_matrix; - _transforms.projection_matrix = view.projection_matrix; - _transforms.normal_matrix = view.normal_matrix; - _transforms.modelview_matrix = view.modelview_matrix; - -#pragma geometry_modifier_body - - float3 v_position = (_transforms.model_matrix * float4(_geometry.position, 1.0)).xyz; - float4 in_position = float4(_geometry.position, 1.0); - - VROShaderVertex _vertex; - _vertex.position = view.modelview_projection_matrix * in_position; - -#pragma vertex_modifier_body - - out.position = _vertex.position; - out.texcoord = _geometry.texcoord; - out.color = _geometry.color; - - out.surface_position = v_position; - out.camera_position = view.camera_position; - out.normal = normalize((_transforms.normal_matrix * float4(_geometry.normal, 0.0)).xyz); - - out.ambient_color = lighting.ambient_light_color; - out.material_color = material.diffuse_surface_color; - out.material_shininess = material.shininess; - out.diffuse_intensity = material.diffuse_intensity; - out.material_alpha = material.alpha; - - return out; -} - -float3 apply_light_phong(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float3 surface_to_camera, - float4 material_diffuse_color, - float4 material_specular_color, - float material_shininess); -float3 apply_light_phong(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float3 surface_to_camera, - float4 material_diffuse_color, - float4 material_specular_color, - float material_shininess) { - - thread float3 surface_to_light; - float attenuation = compute_attenuation(light, surface_pos, &surface_to_light); - - // Diffuse - float diffuse_coeff = fmax(0.0, dot(-surface_normal, surface_to_light)); - float3 diffuse = diffuse_coeff * material_diffuse_color.rgb * light.color; - - // Specular - float specular_coeff = 0.0; - if (diffuse_coeff > 0.0) { - specular_coeff = pow(max(0.0, dot(surface_to_camera, - reflect(surface_to_light, -surface_normal))), - material_shininess); - } - - float3 specular = specular_coeff * material_specular_color.rgb * light.color; - return attenuation * (diffuse + specular); -} - -float4 phong_lighting_diffuse_fixed(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(0) ]]); -float4 phong_lighting_diffuse_fixed(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(0) ]]) { - - float3 ambient_light_color = in.ambient_color * in.material_color.xyz; - - float4 material_diffuse_color = in.material_color * in.diffuse_intensity; - float4 material_specular_color = specular_texture.sample(s, in.texcoord); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - in.normal, - surface_to_camera, - material_diffuse_color, - material_specular_color, - in.material_shininess); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * in.material_color.a); -} - -float4 phong_lighting_diffuse_texture(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(0) ]]); -float4 phong_lighting_diffuse_texture(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(0) ]]) { - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - float3 ambient_light_color = in.ambient_color * diffuse_texture_color.xyz; - - float4 material_diffuse_color = diffuse_texture_color * in.diffuse_intensity; - float4 material_specular_color = specular_texture.sample(s, in.texcoord); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - in.normal, - surface_to_camera, - material_diffuse_color, - material_specular_color, - in.material_shininess); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * diffuse_texture_color.a); -} - -fragment float4 phong_lighting_fragment_c(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - material_diffuse_color, - _surface.specular_color, - _surface.shininess); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 phong_lighting_fragment_c_reflect(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - texturecube reflect_texture [[ texture(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - _surface.diffuse_color.xyz, - _surface.specular_color, - _surface.shininess); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 phong_lighting_fragment_t(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - material_diffuse_color, - _surface.specular_color, - _surface.shininess); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 phong_lighting_fragment_t_reflect(VROPhongLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - texturecube reflect_texture [[ texture(2) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_phong(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - _surface.diffuse_color.xyz, - _surface.specular_color, - _surface.shininess); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; - --------------------------------------- */ - -typedef struct { - float4 position [[ position ]]; - float3 normal; - float4 color; - float2 texcoord; - - float3 surface_position; - float3 camera_position; - - float3 ambient_color; - float4 material_color; - float material_shininess; - float diffuse_intensity; - float material_alpha; -} VROBlinnLightingVertexOut; - -vertex VROBlinnLightingVertexOut blinn_lighting_vertex(VRORendererAttributes attributes [[ stage_in ]], - constant VROViewUniforms &view [[ buffer(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma geometry_modifier_uniforms -#pragma vertex_modifier_uniforms - - VROBlinnLightingVertexOut out; - - VROShaderGeometry _geometry; - _geometry.position = attributes.position; - _geometry.normal = attributes.normal; - _geometry.texcoord = attributes.texcoord; - _geometry.color = attributes.color; - - VROTransforms _transforms; - _transforms.model_matrix = view.model_matrix; - _transforms.view_matrix = view.view_matrix; - _transforms.projection_matrix = view.projection_matrix; - _transforms.normal_matrix = view.normal_matrix; - _transforms.modelview_matrix = view.modelview_matrix; - -#pragma geometry_modifier_body - - float3 v_position = (_transforms.model_matrix * float4(_geometry.position, 1.0)).xyz; - float4 in_position = float4(_geometry.position, 1.0); - - VROShaderVertex _vertex; - _vertex.position = view.modelview_projection_matrix * in_position; - -#pragma vertex_modifier_body - - out.position = _vertex.position; - out.texcoord = _geometry.texcoord; - out.color = _geometry.color; - - out.surface_position = v_position; - out.camera_position = view.camera_position; - out.normal = normalize((_transforms.normal_matrix * float4(_geometry.normal, 0.0)).xyz); - - out.ambient_color = lighting.ambient_light_color; - out.material_color = material.diffuse_surface_color; - out.material_shininess = material.shininess; - out.diffuse_intensity = material.diffuse_intensity; - out.material_alpha = material.alpha; - - return out; -} - -float3 apply_light_blinn(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float3 surface_to_camera, - float4 material_diffuse_color, - float4 material_specular_color, - float material_shininess); -float3 apply_light_blinn(constant VROLightUniforms &light, - float3 surface_pos, - float3 surface_normal, - float3 surface_to_camera, - float4 material_diffuse_color, - float4 material_specular_color, - float material_shininess) { - - thread float3 surface_to_light; - float attenuation = compute_attenuation(light, surface_pos, &surface_to_light); - - // Diffuse - float diffuse_coeff = fmax(0.0, dot(-surface_normal, surface_to_light)); - float3 diffuse = diffuse_coeff * material_diffuse_color.rgb * light.color; - - // Specular - float specular_coeff = 0.0; - if (diffuse_coeff > 0.0) { - specular_coeff = pow(max(0.0, dot(normalize(-surface_to_camera + surface_to_light), - -surface_normal)), - material_shininess); - } - - float3 specular = specular_coeff * material_specular_color.rgb * light.color; - return attenuation * (diffuse + specular); -} - -float4 blinn_lighting_diffuse_fixed(VROBlinnLightingVertexOut in, - texture2d specular_texture, - constant VROSceneLightingUniforms &lighting); -float4 blinn_lighting_diffuse_fixed(VROBlinnLightingVertexOut in, - texture2d specular_texture, - constant VROSceneLightingUniforms &lighting) { - - float3 ambient_light_color = in.ambient_color * in.material_color.xyz; - - float4 material_diffuse_color = in.material_color * in.diffuse_intensity; - float4 material_specular_color = specular_texture.sample(s, in.texcoord); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - in.normal, - surface_to_camera, - material_diffuse_color, - material_specular_color, - in.material_shininess); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * in.material_color.a); -} - -float4 blinn_lighting_diffuse_texture(VROBlinnLightingVertexOut in, - texture2d diffuse_texture, - texture2d specular_texture, - constant VROSceneLightingUniforms &lighting); -float4 blinn_lighting_diffuse_texture(VROBlinnLightingVertexOut in, - texture2d diffuse_texture, - texture2d specular_texture, - constant VROSceneLightingUniforms &lighting) { - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - float3 ambient_light_color = in.ambient_color * diffuse_texture_color.xyz; - - float4 material_diffuse_color = diffuse_texture_color * in.diffuse_intensity; - float4 material_specular_color = specular_texture.sample(s, in.texcoord); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - in.normal, - surface_to_camera, - material_diffuse_color, - material_specular_color, - in.material_shininess); - } - - return float4(ambient_light_color + diffuse_light_color, - in.material_alpha * diffuse_texture_color.a); -} - -fragment float4 blinn_lighting_fragment_c(VROBlinnLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - material_diffuse_color, - _surface.specular_color, - _surface.shininess); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 blinn_lighting_fragment_c_reflect(VROBlinnLightingVertexOut in [[ stage_in ]], - texture2d specular_texture [[ texture(0) ]], - texturecube reflect_texture [[ texture(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - VROSurface _surface; - _surface.diffuse_color = in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - _surface.diffuse_color.xyz, - _surface.specular_color, - _surface.shininess); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 blinn_lighting_fragment_t(VROBlinnLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float3 ambient_light_color = in.ambient_color * _surface.diffuse_color.xyz; - float4 material_diffuse_color = _surface.diffuse_color * in.diffuse_intensity; - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - - float3 diffuse_light_color = float3(0, 0, 0); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - material_diffuse_color, - _surface.specular_color, - _surface.shininess); - } - - float4 _output_color = float4(ambient_light_color + diffuse_light_color, _surface.alpha); - -#pragma fragment_modifier_body - - return _output_color; -} - -fragment float4 blinn_lighting_fragment_t_reflect(VROBlinnLightingVertexOut in [[ stage_in ]], - texture2d diffuse_texture [[ texture(0) ]], - texture2d specular_texture [[ texture(1) ]], - texturecube reflect_texture [[ texture(2) ]], - constant VROMaterialUniforms &material [[ buffer(2) ]], - constant VROCustomUniforms &_custom [[ buffer(3) ]], - constant VROSceneLightingUniforms &lighting [[ buffer(4) ]]) { - -#pragma surface_modifier_uniforms -#pragma fragment_modifier_uniforms - - float4 diffuse_texture_color = diffuse_texture.sample(s, in.texcoord); - - VROSurface _surface; - _surface.diffuse_color = diffuse_texture_color * in.material_color; - _surface.specular_color = specular_texture.sample(s, in.texcoord); - _surface.shininess = material.shininess; - _surface.normal = in.normal; - _surface.position = in.surface_position; - _surface.view = normalize(in.camera_position - in.surface_position); - _surface.alpha = in.material_alpha * diffuse_texture_color.a * in.material_color.a; - -#pragma surface_modifier_body - - float4 reflective_color = compute_reflection(in.surface_position, in.camera_position, _surface.normal, reflect_texture); - - float3 diffuse_light_color = float3(0, 0, 0); - float3 surface_to_camera = normalize(in.camera_position - in.surface_position); - for (int i = 0; i < lighting.num_lights; i++) { - diffuse_light_color += apply_light_blinn(lighting.lights[i], - in.surface_position, - _surface.normal, - surface_to_camera, - _surface.diffuse_color.xyz, - _surface.specular_color, - _surface.shininess); - } - float4 lighting_color = float4(in.ambient_color * _surface.diffuse_color.xyz + diffuse_light_color, _surface.alpha); - - float4 _output_color = float4(lighting_color.xyz + reflective_color.xyz, lighting_color.a); - -#pragma fragment_modifier_body - - return _output_color; -} - -/* --------------------------------------- - DISTORTION SHADERS - --------------------------------------- */ - -typedef struct { - float2 position [[ attribute(0) ]]; - float vignette [[ attribute(1) ]]; - float2 red_texcoord [[ attribute(2) ]]; - float2 green_texcoord [[ attribute(3) ]]; - float2 blue_texcoord [[ attribute(4) ]]; -} VRODistortionAttributes; - -typedef struct { - float4 position [[ position ]]; - float2 texcoord; - float vignette; -} VRODistortionVertexOut; - -vertex VRODistortionVertexOut distortion_vertex(VRODistortionAttributes attributes [[ stage_in ]], - constant VRODistortionUniforms &uniforms [[ buffer(1) ]]) { - - VRODistortionVertexOut out; - out.position = float4(attributes.position, 0.0, 1.0); - out.texcoord = attributes.blue_texcoord.xy * uniforms.texcoord_scale; - out.vignette = attributes.vignette; - - return out; -} - -fragment float4 distortion_fragment(VRODistortionVertexOut in [[ stage_in ]], - texture2d texture [[ texture(0) ]]) { - - return in.vignette * texture.sample(s, in.texcoord); -} - -typedef struct { - float4 position [[ position ]]; - float2 red_texcoord; - float2 blue_texcoord; - float2 green_texcoord; - float vignette; -} VRODistortionAberrationVertexOut; - -vertex VRODistortionAberrationVertexOut distortion_aberration_vertex(VRODistortionAttributes attributes [[ stage_in ]], - constant VRODistortionUniforms &uniforms [[ buffer(1) ]]) { - - VRODistortionAberrationVertexOut out; - out.position = float4(attributes.position, 0.0, 1.0); - out.red_texcoord = attributes.red_texcoord.xy * uniforms.texcoord_scale; - out.green_texcoord = attributes.green_texcoord.xy * uniforms.texcoord_scale; - out.blue_texcoord = attributes.blue_texcoord.xy * uniforms.texcoord_scale; - out.vignette = attributes.vignette; - - return out; -} - -fragment float4 distortion_aberration_fragment(VRODistortionAberrationVertexOut in [[ stage_in ]], - texture2d texture [[ texture(0) ]]) { - - return in.vignette * float4(texture.sample(s, in.red_texcoord).r, - texture.sample(s, in.green_texcoord).g, - texture.sample(s, in.blue_texcoord).b, - 1.0); -} - -#endif diff --git a/ios/dist/ViroRenderer/ViroKit.framework/VROPolygon.h b/ios/dist/ViroRenderer/ViroKit.framework/VROPolygon.h deleted file mode 100644 index c01ad2de..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/VROPolygon.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// VROPolygon.h -// ViroRenderer -// -// Copyright © 2018 Viro Media. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#ifndef VROPolygon_h -#define VROPolygon_h - -#include "VROGeometry.h" -#include "VROShapeUtils.h" -#include "VROByteBuffer.h" -#include - -namespace p2t { - class Point; -} - -/* - A geometric representation of a flat Polygon, constructed with N vertices that describes its shape. - */ -class VROPolygon : public VROGeometry { -public: - static std::shared_ptr createPolygon(std::vector path, - float u0 = 0, float v0 = 0, float u1 = 1, float v1 = 1); - static std::shared_ptr createPolygon(std::vector path, - std::vector> holes, - float u0 = 0, float v0 = 0, float u1 = 1, float v1 = 1); - virtual ~VROPolygon(); - -protected: - - VROPolygon(std::vector path, std::vector> holes, - float u0, float v0, float u1, float v1); - -private: - - /* - A vector of 3D coordinates representing the perimeter of this polygon shape, in local - model space. - */ - std::vector _path; - std::vector> _holes; - - /* - The min and max horizontal and vertical values of this polygon shape, in local - model space. - */ - float _minX, _maxX, _minY, _maxY; - - /* - Texture coordinates with which to use as UV edges for bounded materials. - */ - float _u0, _v0, _u1, _v1; - - /* - Rebuilds the sources and elements for this geometric shape with the latest set of - boundary vertices. - */ - void updateSurface(); - void buildGeometry(std::vector> &sources, - std::vector> &elements); - std::shared_ptr buildElement(size_t numCorners); - void writePolygonCorner(p2t::Point *position, VROByteBuffer &buffer); - - /* - Poly2Tri only processes paths with non repeating points, otherwise it would crash - the application. Thus, removeDuplicateVertices() is used to sanitize and remove - duplicated vertices for a given path. - */ - void removeDuplicateVertices(std::vector &path); -}; - -#endif /* VROPolygon_h */ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/ViroKit b/ios/dist/ViroRenderer/ViroKit.framework/ViroKit index e4b6f185..199a04dc 100755 Binary files a/ios/dist/ViroRenderer/ViroKit.framework/ViroKit and b/ios/dist/ViroRenderer/ViroKit.framework/ViroKit differ diff --git a/ios/dist/ViroRenderer/ViroKit.framework/_CodeSignature/CodeResources b/ios/dist/ViroRenderer/ViroKit.framework/_CodeSignature/CodeResources deleted file mode 100644 index 06c3395f..00000000 --- a/ios/dist/ViroRenderer/ViroKit.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,15231 +0,0 @@ - - - - - files - - CardboardSDK.bundle/Info.plist - - 7IAIK8tPbyUbblavMdwkgwa4oeY= - - CardboardSDK.bundle/ar.lproj/CardboardSDK.strings - - hash - - iI/v50w5rlwo/eLeBZqMKwnRk0M= - - optional - - - CardboardSDK.bundle/arrowRight.png - - DHtbTaoGw+L0h7aoEC15TIepH/A= - - CardboardSDK.bundle/ca.lproj/CardboardSDK.strings - - hash - - vGEqM6koBhFkcgN17Jeiqjjn+nI= - - optional - - - CardboardSDK.bundle/cardboardLogotype.png - - SxKNfyHZddkajL2wJuhGQ74dXIE= - - CardboardSDK.bundle/continueButton.png - - 6/FygOhoBqJp5xevLWaYHxSn8Ik= - - CardboardSDK.bundle/cs.lproj/CardboardSDK.strings - - hash - - sl7aydrqOi7ae6jKKGDOW/gw9yM= - - optional - - - CardboardSDK.bundle/da.lproj/CardboardSDK.strings - - hash - - /eyXzDASD/wxjE1rdZ+QafdcHbQ= - - optional - - - CardboardSDK.bundle/de.lproj/CardboardSDK.strings - - hash - - IbpUoraAFH5jyo0jg7dHkIXSx5Q= - - optional - - - CardboardSDK.bundle/el.lproj/CardboardSDK.strings - - hash - - LPuK7Gginc0qo3F3UKLixdPITRY= - - optional - - - CardboardSDK.bundle/en.lproj/CardboardSDK.strings - - hash - - IPk97equneLqPwVbDZn2k9ommj8= - - optional - - - CardboardSDK.bundle/en_AU.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - optional - - - CardboardSDK.bundle/en_GB.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - optional - - - CardboardSDK.bundle/en_IN.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - optional - - - CardboardSDK.bundle/es.lproj/CardboardSDK.strings - - hash - - E5fKEg3nWyk2qhwajgVgoOedR+M= - - optional - - - CardboardSDK.bundle/es_MX.lproj/CardboardSDK.strings - - hash - - HeAokm8d1if5/IDTXkfoxWUZON0= - - optional - - - CardboardSDK.bundle/fi.lproj/CardboardSDK.strings - - hash - - qDWc2kYjBIZC3kTtxfcplx6HTmE= - - optional - - - CardboardSDK.bundle/fr.lproj/CardboardSDK.strings - - hash - - xAW8DeJbMVENsILiSvKq681CWIE= - - optional - - - CardboardSDK.bundle/gearButton.png - - hdJUVK4BVFmFVJsdwgtqyTr79vk= - - CardboardSDK.bundle/he.lproj/CardboardSDK.strings - - hash - - QQsHArkUOLF6KorfbxB1E5Jo12Y= - - optional - - - CardboardSDK.bundle/hi.lproj/CardboardSDK.strings - - hash - - 8NgBYrtCUlEODny6a8xAYHSH9u4= - - optional - - - CardboardSDK.bundle/hr.lproj/CardboardSDK.strings - - hash - - Ki1n1FecB8Udk6tDteRHffRAYgU= - - optional - - - CardboardSDK.bundle/hu.lproj/CardboardSDK.strings - - hash - - g+Xhv4MrhVmGIidN2Vo8t0f5aDI= - - optional - - - CardboardSDK.bundle/ic_arrow_back_white@1x.png - - ynIcRaFhTRUzSNCofHDU6et1HQY= - - CardboardSDK.bundle/ic_arrow_back_white@2x.png - - zyk6C+r6sjw0FyBzOT9wGjBDAIc= - - CardboardSDK.bundle/ic_arrow_back_white@3x.png - - ltPFDJyIX/Mk4NSJzkupdHTJnmA= - - CardboardSDK.bundle/ic_arrow_forward.png - - Pguh/y+CtXfBvX48eneX0smvmBc= - - CardboardSDK.bundle/ic_arrow_forward@2x.png - - nbT1THBg/IL8Qym7OFZvwZoh044= - - CardboardSDK.bundle/ic_arrow_forward@3x.png - - jqZZYGD66fty0DUCHzZthOGzWxg= - - CardboardSDK.bundle/ic_cardboard.png - - wm1AczGiAKuWJp5/HBM4PJCJqz4= - - CardboardSDK.bundle/ic_cardboard@2x.png - - dIgMrvnaXORH924rNjMezZ/uz4I= - - CardboardSDK.bundle/ic_cardboard@3x.png - - 9HnQCsY/5+yjr0jiZTIsUYiT8tk= - - CardboardSDK.bundle/ic_fullscreen.png - - 6076J1S3OL56FKFae2ubJ+Cxric= - - CardboardSDK.bundle/ic_fullscreen@2x.png - - X0URfZNoC2O77kf8LEZaavVuSyI= - - CardboardSDK.bundle/ic_fullscreen@3x.png - - +8HRCqwdPTIJX8naPst8Dsk4xNI= - - CardboardSDK.bundle/ic_fullscreen_exit.png - - iSeV1ZfyA0ZtESMYr3tjYZCTSQ8= - - CardboardSDK.bundle/ic_fullscreen_exit@2x.png - - jD0UFyq1Vr4MYcmR85kdt5XenSs= - - CardboardSDK.bundle/ic_fullscreen_exit@3x.png - - 9qnbjtGli1NdAx1LtT4YLHhHL24= - - CardboardSDK.bundle/ic_help.png - - reB0j0zeSPGuDxpliVhjuAzuoPw= - - CardboardSDK.bundle/ic_help@2x.png - - QGdLkJNCXwiyZcevrO2gaLxvM8o= - - CardboardSDK.bundle/ic_help@3x.png - - Uj74l37VT7Ip8ZMwemU3XfqhHdY= - - CardboardSDK.bundle/ic_info.png - - gh4W1qgeovGUTB835b2R9VeOEh8= - - CardboardSDK.bundle/ic_info@2x.png - - E4NxBz8xEUdIc7FhxmjUBJUqh98= - - CardboardSDK.bundle/ic_info@3x.png - - PwsZZjA3pH/CHQ0uUznYsdhnQmk= - - CardboardSDK.bundle/ic_settings_white@1x.png - - wEDMBnG8jvZGHttnQBmmYNJzpt8= - - CardboardSDK.bundle/ic_settings_white@2x.png - - evPA64kKKIf23w1Zg/BtMHUyxW4= - - CardboardSDK.bundle/ic_settings_white@3x.png - - qMYOP+Cu3lJ/a8+w4Snj1JKUCFo= - - CardboardSDK.bundle/id.lproj/CardboardSDK.strings - - hash - - kokU7lHVNGUFqy774ghTxUM3gOs= - - optional - - - CardboardSDK.bundle/it.lproj/CardboardSDK.strings - - hash - - ujLgibcS3CSQyWeD5BQNyAVkFYA= - - optional - - - CardboardSDK.bundle/iw.lproj/CardboardSDK.strings - - hash - - QQsHArkUOLF6KorfbxB1E5Jo12Y= - - optional - - - CardboardSDK.bundle/ja.lproj/CardboardSDK.strings - - hash - - har8QNmTVexHcZVrmwAqZ5cOrG8= - - optional - - - CardboardSDK.bundle/ko.lproj/CardboardSDK.strings - - hash - - PqNLuQxt05NraVVfEdGubiGjyN0= - - optional - - - CardboardSDK.bundle/nb.lproj/CardboardSDK.strings - - hash - - UvUtX7nv9j1h96bViKb2Tdz4Dc8= - - optional - - - CardboardSDK.bundle/nl.lproj/CardboardSDK.strings - - hash - - hfe2Stb8RLgZLSLAVRPKJVYjq4U= - - optional - - - CardboardSDK.bundle/pl.lproj/CardboardSDK.strings - - hash - - uZ7IydIgliTMgci5OZvgSUBc96Q= - - optional - - - CardboardSDK.bundle/pt.lproj/CardboardSDK.strings - - hash - - BYKfI0Izt8czjqric0hlZtnAh5M= - - optional - - - CardboardSDK.bundle/pt_PT.lproj/CardboardSDK.strings - - hash - - QpUhTPdLcv0KOfuGfcgaitvPLP8= - - optional - - - CardboardSDK.bundle/qrSample@1x.png - - 2rseTVr8X5nMGUaWg39d1alSEC0= - - CardboardSDK.bundle/qrSample@2x.png - - 1zbRmt5ATL+hVRUjfVeYUHDNgV8= - - CardboardSDK.bundle/qrSample@3x.png - - RZ2eLnCZWuGYWodKe9y1Re18E5Y= - - CardboardSDK.bundle/ro.lproj/CardboardSDK.strings - - hash - - NoGdOS1lBk5X6eB1efYflp4Yh1s= - - optional - - - CardboardSDK.bundle/rotateInstructions.mp4 - - N+3ePK2O2jmYIhQwCBSwWUhIdVg= - - CardboardSDK.bundle/ru.lproj/CardboardSDK.strings - - hash - - HS68klX2idhl0Y6erRSAaoBHvYA= - - optional - - - CardboardSDK.bundle/sk.lproj/CardboardSDK.strings - - hash - - 6YBPlRHYI9stl3pd+FBth6+gldI= - - optional - - - CardboardSDK.bundle/sv.lproj/CardboardSDK.strings - - hash - - myiR7u9dlUf0CalIE16knOalSn4= - - optional - - - CardboardSDK.bundle/th.lproj/CardboardSDK.strings - - hash - - OhkG8j7IYtoMd5O0PlBKI4eUVo8= - - optional - - - CardboardSDK.bundle/tickmarks.png - - Msr3GGlbMUC+Y5uoYYCEWz8FOMc= - - CardboardSDK.bundle/tr.lproj/CardboardSDK.strings - - hash - - Kp9Rp5+KjpWPy5orBssbmBFZpY8= - - optional - - - CardboardSDK.bundle/uk.lproj/CardboardSDK.strings - - hash - - eiYeO0o6nTYWYqzRzphk+0hX1Kw= - - optional - - - CardboardSDK.bundle/vi.lproj/CardboardSDK.strings - - hash - - 4Ri07kkj098APGFLKqNOBn5Rr0s= - - optional - - - CardboardSDK.bundle/zh_CN.lproj/CardboardSDK.strings - - hash - - ptTwP6yyDOl7ra4kP+7taz7jvFw= - - optional - - - CardboardSDK.bundle/zh_HK.lproj/CardboardSDK.strings - - hash - - m3QrbgwHa19deb+y6oMTTV3OPmE= - - optional - - - CardboardSDK.bundle/zh_TW.lproj/CardboardSDK.strings - - hash - - m3QrbgwHa19deb+y6oMTTV3OPmE= - - optional - - - DeviceList.plist - - hn7ObbyGtqatR/rOsmydBZYAN3E= - - GoogleKitCore.bundle/Resources/ar.lproj/GoogleKitCore.strings - - hash - - Eum4cYRCaRsTxO5jwHka5hjmlwo= - - optional - - - GoogleKitCore.bundle/Resources/bg.lproj/GoogleKitCore.strings - - hash - - Z17pLESM8r4wgVqh3EGpQ/clizc= - - optional - - - GoogleKitCore.bundle/Resources/ca.lproj/GoogleKitCore.strings - - hash - - 5veE/icWdg6nh3b13BryOqpNJkY= - - optional - - - GoogleKitCore.bundle/Resources/cs.lproj/GoogleKitCore.strings - - hash - - fWSzY/R6IWwIsveGipXwhW1IQ1A= - - optional - - - GoogleKitCore.bundle/Resources/da.lproj/GoogleKitCore.strings - - hash - - ZHdssU6j4tOP37Fi73uumnwRBs8= - - optional - - - GoogleKitCore.bundle/Resources/de.lproj/GoogleKitCore.strings - - hash - - 6Qa8+7OGMnoo4ktgITO6brGFWlk= - - optional - - - GoogleKitCore.bundle/Resources/el.lproj/GoogleKitCore.strings - - hash - - VKPl4yM3ICyh8GhjreEEpuA1Le0= - - optional - - - GoogleKitCore.bundle/Resources/en.lproj/GoogleKitCore.strings - - hash - - BAmD8wu0RrZfRskEckoby0jxbwI= - - optional - - - GoogleKitCore.bundle/Resources/en_AU.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - optional - - - GoogleKitCore.bundle/Resources/en_GB.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - optional - - - GoogleKitCore.bundle/Resources/en_IN.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - optional - - - GoogleKitCore.bundle/Resources/es.lproj/GoogleKitCore.strings - - hash - - ZfmhfXd/igpBJjauPEfsqSWh1uE= - - optional - - - GoogleKitCore.bundle/Resources/es_419.lproj/GoogleKitCore.strings - - hash - - hJjUld9rJaYvmrnzuMh8zVIsLjM= - - optional - - - GoogleKitCore.bundle/Resources/es_MX.lproj/GoogleKitCore.strings - - hash - - hJjUld9rJaYvmrnzuMh8zVIsLjM= - - optional - - - GoogleKitCore.bundle/Resources/fa.lproj/GoogleKitCore.strings - - hash - - slVASJqdgrRomCMxcMmedAwWezs= - - optional - - - GoogleKitCore.bundle/Resources/fi.lproj/GoogleKitCore.strings - - hash - - tF8KIjNPHruKRflYqfEBT41+6fY= - - optional - - - GoogleKitCore.bundle/Resources/fr.lproj/GoogleKitCore.strings - - hash - - d5us+ZddcX6Xsbu+pc1AIgEXP2Y= - - optional - - - GoogleKitCore.bundle/Resources/fr_CA.lproj/GoogleKitCore.strings - - hash - - uKWc3jUFd3Vr43R+nlXE3e9WXYk= - - optional - - - GoogleKitCore.bundle/Resources/he.lproj/GoogleKitCore.strings - - hash - - lsgeywI4t/ewZoVf9pO5kRAomNA= - - optional - - - GoogleKitCore.bundle/Resources/hi.lproj/GoogleKitCore.strings - - hash - - WxVd/Iuy0yb4jPzzBoETXjQ7Xsg= - - optional - - - GoogleKitCore.bundle/Resources/hr.lproj/GoogleKitCore.strings - - hash - - mRmMR582drUFHrMf8MubYakQ6U0= - - optional - - - GoogleKitCore.bundle/Resources/hu.lproj/GoogleKitCore.strings - - hash - - UYSCp31QJkGhskoEHci5f0bXIE8= - - optional - - - GoogleKitCore.bundle/Resources/hy.lproj/GoogleKitCore.strings - - hash - - 09W30XiwstnBCiIGHYKhF9z/GlI= - - optional - - - GoogleKitCore.bundle/Resources/id.lproj/GoogleKitCore.strings - - hash - - BWe/7Y/x8DIo5xOilKEj0MaClH8= - - optional - - - GoogleKitCore.bundle/Resources/it.lproj/GoogleKitCore.strings - - hash - - Y1RaRUpkidRqXKMab85U+bNxBBs= - - optional - - - GoogleKitCore.bundle/Resources/iw.lproj/GoogleKitCore.strings - - hash - - lsgeywI4t/ewZoVf9pO5kRAomNA= - - optional - - - GoogleKitCore.bundle/Resources/ja.lproj/GoogleKitCore.strings - - hash - - 7MDgTALMgOtuVE3+yPJXxzmbQ4k= - - optional - - - GoogleKitCore.bundle/Resources/ka.lproj/GoogleKitCore.strings - - hash - - Crq0mFUWsf55hAxNWYIlynaIHDs= - - optional - - - GoogleKitCore.bundle/Resources/kk.lproj/GoogleKitCore.strings - - hash - - fNVbzGNrDo6SlSA8Xof5153S+HA= - - optional - - - GoogleKitCore.bundle/Resources/km.lproj/GoogleKitCore.strings - - hash - - QvdVJwvmQhiNicKjAwxsd4is08g= - - optional - - - GoogleKitCore.bundle/Resources/ko.lproj/GoogleKitCore.strings - - hash - - 3NVS0zKE+hZZ4EugCsfqdf8wJVI= - - optional - - - GoogleKitCore.bundle/Resources/lo.lproj/GoogleKitCore.strings - - hash - - Iiy13OG62f/OD4IyfDZuD71WJ/w= - - optional - - - GoogleKitCore.bundle/Resources/lt.lproj/GoogleKitCore.strings - - hash - - NhfZMuIgPcn8YjPvg0BjtVu6iV0= - - optional - - - GoogleKitCore.bundle/Resources/lv.lproj/GoogleKitCore.strings - - hash - - 9JmLq5UDJpaOEOn/yTGxxXmhM1s= - - optional - - - GoogleKitCore.bundle/Resources/mn.lproj/GoogleKitCore.strings - - hash - - wjHF0blcXzaaWibfCMvzRzYlZ30= - - optional - - - GoogleKitCore.bundle/Resources/ms.lproj/GoogleKitCore.strings - - hash - - nOZ5tmjquSiiHmYgqC40xl/BNc0= - - optional - - - GoogleKitCore.bundle/Resources/nb.lproj/GoogleKitCore.strings - - hash - - LNRk+i/hGXNXbTOZ82odgfp4BRg= - - optional - - - GoogleKitCore.bundle/Resources/nl.lproj/GoogleKitCore.strings - - hash - - fOmgJ+mxuA+yK+QvrcqAHlfFqms= - - optional - - - GoogleKitCore.bundle/Resources/no.lproj/GoogleKitCore.strings - - hash - - LNRk+i/hGXNXbTOZ82odgfp4BRg= - - optional - - - GoogleKitCore.bundle/Resources/pl.lproj/GoogleKitCore.strings - - hash - - T8808/aIZXy5gnwnJu7DCuUml9k= - - optional - - - GoogleKitCore.bundle/Resources/pt.lproj/GoogleKitCore.strings - - hash - - 1vcArmroEqrBQ0XE7k1k/ArgcQw= - - optional - - - GoogleKitCore.bundle/Resources/pt_BR.lproj/GoogleKitCore.strings - - hash - - 1vcArmroEqrBQ0XE7k1k/ArgcQw= - - optional - - - GoogleKitCore.bundle/Resources/pt_PT.lproj/GoogleKitCore.strings - - hash - - QFNoDl8KPBH1d4R14Vl9HibF2h4= - - optional - - - GoogleKitCore.bundle/Resources/ro.lproj/GoogleKitCore.strings - - hash - - gRn9+NeavCGOA4FkyFA/fKSUNco= - - optional - - - GoogleKitCore.bundle/Resources/ru.lproj/GoogleKitCore.strings - - hash - - T9vjG4O7PzDhBvTdEslkd3wO5RQ= - - optional - - - GoogleKitCore.bundle/Resources/sk.lproj/GoogleKitCore.strings - - hash - - 4KSAjJqVVWg+zU8Kz0g4NyWSxsA= - - optional - - - GoogleKitCore.bundle/Resources/sq.lproj/GoogleKitCore.strings - - hash - - SPZYpjwPNC+UUkD7V91L4yP/FL4= - - optional - - - GoogleKitCore.bundle/Resources/sr.lproj/GoogleKitCore.strings - - hash - - av8nYtVutBhprVIYDhJVJu+oiTo= - - optional - - - GoogleKitCore.bundle/Resources/sv.lproj/GoogleKitCore.strings - - hash - - hMnEk3QMy51KtzfqpTgG7+RDFY0= - - optional - - - GoogleKitCore.bundle/Resources/th.lproj/GoogleKitCore.strings - - hash - - E0OUzGUDWDFFeXc2Tvb9wItVVds= - - optional - - - GoogleKitCore.bundle/Resources/tr.lproj/GoogleKitCore.strings - - hash - - TovVC4li3GZnIe8Hj7qOZ+hayGk= - - optional - - - GoogleKitCore.bundle/Resources/uk.lproj/GoogleKitCore.strings - - hash - - Dt//jCl8xN3Y1w6RifXXXeP8cjk= - - optional - - - GoogleKitCore.bundle/Resources/vi.lproj/GoogleKitCore.strings - - hash - - QFuYqm3CIT/2M4luvp90oH9Ss1s= - - optional - - - GoogleKitCore.bundle/Resources/zh_CN.lproj/GoogleKitCore.strings - - hash - - FjZPgGsbaraQeqJtovNRBv80HCY= - - optional - - - GoogleKitCore.bundle/Resources/zh_HK.lproj/GoogleKitCore.strings - - hash - - t5crTY74iSD4QkKqeZR7HVkt9hQ= - - optional - - - GoogleKitCore.bundle/Resources/zh_TW.lproj/GoogleKitCore.strings - - hash - - cqWoNicAimUUR3k95SkMdSGnlos= - - optional - - - GoogleKitCore.bundle/button_blue.png - - EdLFZBuA23t/uR40su7hhGo6D88= - - GoogleKitCore.bundle/button_blue@2x.png - - M3i+rNM76it5c4Ui8FnC9inPm4A= - - GoogleKitCore.bundle/button_blue@3x.png - - eG6YZuo4oa3+KxBPtF0SBEvngjU= - - GoogleKitCore.bundle/button_blue_highlighted.png - - bXhdEfMI3jtCu2L+pyaw+FyC0jU= - - GoogleKitCore.bundle/button_blue_highlighted@2x.png - - ObWCMTKKll6voyHyLLqwiWBcI0g= - - GoogleKitCore.bundle/button_blue_highlighted@3x.png - - jukefpwH9F9C+rMOM+bTsnDvfSg= - - GoogleKitCore.bundle/button_dark.png - - L8ee0jrA8HoRsmw7UCKhha+sDbk= - - GoogleKitCore.bundle/button_dark@2x.png - - r4chXvHjzO/Hg/miplODfpmMOzM= - - GoogleKitCore.bundle/button_dark@3x.png - - wlgV5B+NXjw6FVbeyZUuPu0pDzc= - - GoogleKitCore.bundle/button_dark_highlighted.png - - SHhfDbJnbkJE5shtzMKOzMSSzGM= - - GoogleKitCore.bundle/button_dark_highlighted@2x.png - - i1uv/ls4Ym8HNPtChxBM5mvt1lo= - - GoogleKitCore.bundle/button_dark_highlighted@3x.png - - M1LfUf7Ow7FP4/aicAYh+I4h48Y= - - GoogleKitCore.bundle/button_light.png - - 9r8fUKbvtRvQvzXniohRRYZjBno= - - GoogleKitCore.bundle/button_light@2x.png - - Y2cJaGOh/191dicG+Qboh8jw3B8= - - GoogleKitCore.bundle/button_light@3x.png - - vQTUgHswTpUNAF10jbEvjhJ0u5c= - - GoogleKitCore.bundle/button_light_highlighted.png - - ScT6x7hDQUd+wbVPt4dNQD3mAeU= - - GoogleKitCore.bundle/button_light_highlighted@2x.png - - 3qm5F9jrMCT/JbZyHM3iaLMEWvE= - - GoogleKitCore.bundle/button_light_highlighted@3x.png - - smQxFu/r8Fk9qvuLeK88dxdy1u8= - - GoogleKitCore.bundle/button_red.png - - YMXd0k818rrXK6hyNfoqWk5fTOM= - - GoogleKitCore.bundle/button_red@2x.png - - lLMt4u0Ai14eex8USMw8iSlHUrg= - - GoogleKitCore.bundle/button_red@3x.png - - vYQCvc3s7pl2j5iF85ZZgbjCIVs= - - GoogleKitCore.bundle/button_red_highlighted.png - - HxqD0zJONSsrFhLMGQmaXHivM94= - - GoogleKitCore.bundle/button_red_highlighted@2x.png - - asnqRGpe1O/yDd1yCXajR8fgchc= - - GoogleKitCore.bundle/button_red_highlighted@3x.png - - o/z3SGVyhX+NQfqHbXuuW8raXI8= - - GoogleKitCore.bundle/cell_background_selected_dark.png - - 2mirA61LthCS+trOSIt+LWfUrLY= - - GoogleKitCore.bundle/cell_background_selected_dark@2x.png - - Oy4tekurGsmuQcnsqTzGBKXF7Do= - - GoogleKitCore.bundle/cell_disclosure_accessory.png - - B0F2FK0uWPCdm88mqlG1XV+qn6Q= - - GoogleKitCore.bundle/cell_disclosure_accessory@2x.png - - yaO6MET5yuR00YkCceVV/AvtIAU= - - GoogleKitCore.bundle/cell_disclosure_accessory@3x.png - - EYwrMveD65n0/NOOX7uEGwIDcbY= - - GoogleKitCore.bundle/cell_divider.png - - 1hoxDGSO3Dmg62P82wko2uOQLXg= - - GoogleKitCore.bundle/cell_divider@2x.png - - cLmHaGAog4MGB+nD9vFCftC72Lc= - - GoogleKitCore.bundle/checkbox.png - - +r4cFpdhm06aXoGnJEFe3c+JV+o= - - GoogleKitCore.bundle/checkbox@2x.png - - b0wAuwOHNtRX1fQz9bHZYYNvoo8= - - GoogleKitCore.bundle/checkbox_checked.png - - 40rInfG5DD8usXtutTiJfkpwPSo= - - GoogleKitCore.bundle/checkbox_checked@2x.png - - hQbWighszNfrR/LzZ6yMD5b9ZjQ= - - GoogleKitCore.bundle/checkmark.png - - A4zMJ2YoLBhwUeQCPfZJBucLdnQ= - - GoogleKitCore.bundle/checkmark@2x.png - - YoI7bcZlGmnZWNKU8wGOg8l33d4= - - GoogleKitCore.bundle/vertical_divider.png - - DrqS1LhrJb9AHawGUrF/gKnFTUs= - - GoogleKitCore.bundle/vertical_divider@2x.png - - JWjJc49n+EsngeyNErrRE13hwIE= - - GoogleKitDialogs.bundle/Resources/ar.lproj/GoogleKitDialogs.strings - - hash - - yOy6GQoAbMUFdMqOG2tMseFhUr0= - - optional - - - GoogleKitDialogs.bundle/Resources/bg.lproj/GoogleKitDialogs.strings - - hash - - wtcU0SmTltUvHHi1rDzU4vm4Ddw= - - optional - - - GoogleKitDialogs.bundle/Resources/ca.lproj/GoogleKitDialogs.strings - - hash - - JWTiE8KGD/nj4NQIpFcsyBr7J+o= - - optional - - - GoogleKitDialogs.bundle/Resources/cs.lproj/GoogleKitDialogs.strings - - hash - - 7LAzptvycx09dJzTIOz09CVUb2Y= - - optional - - - GoogleKitDialogs.bundle/Resources/da.lproj/GoogleKitDialogs.strings - - hash - - hPixibsq7hHBFP65K8SQpjg8Ipw= - - optional - - - GoogleKitDialogs.bundle/Resources/de.lproj/GoogleKitDialogs.strings - - hash - - JOhcc4bWuc5fvkOYWYEgijhEAHM= - - optional - - - GoogleKitDialogs.bundle/Resources/el.lproj/GoogleKitDialogs.strings - - hash - - UnyecPs1E+5ecr8NpY+ory8Htr4= - - optional - - - GoogleKitDialogs.bundle/Resources/en.lproj/GoogleKitDialogs.strings - - hash - - xoSJIx76u3jZ7zEuvbxyGkOt4L0= - - optional - - - GoogleKitDialogs.bundle/Resources/en_AU.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - optional - - - GoogleKitDialogs.bundle/Resources/en_GB.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - optional - - - GoogleKitDialogs.bundle/Resources/en_IN.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - optional - - - GoogleKitDialogs.bundle/Resources/es.lproj/GoogleKitDialogs.strings - - hash - - X978KYvajDEvvvuzOTgoaPPBbYY= - - optional - - - GoogleKitDialogs.bundle/Resources/es_419.lproj/GoogleKitDialogs.strings - - hash - - wMf93hxAGRuEKenH6s06fXhiFhI= - - optional - - - GoogleKitDialogs.bundle/Resources/es_MX.lproj/GoogleKitDialogs.strings - - hash - - wMf93hxAGRuEKenH6s06fXhiFhI= - - optional - - - GoogleKitDialogs.bundle/Resources/fa.lproj/GoogleKitDialogs.strings - - hash - - TjKOz3kfcdUUYfA548yPvQkIzLY= - - optional - - - GoogleKitDialogs.bundle/Resources/fi.lproj/GoogleKitDialogs.strings - - hash - - 3xx0gipx6AP3VeWWDpFmuoJn0VI= - - optional - - - GoogleKitDialogs.bundle/Resources/fr.lproj/GoogleKitDialogs.strings - - hash - - iiugAWg8d/GXBKp3/BlTXMuFLQc= - - optional - - - GoogleKitDialogs.bundle/Resources/fr_CA.lproj/GoogleKitDialogs.strings - - hash - - uMEvCkOV9t0fKt9uMQDVBzVuSS4= - - optional - - - GoogleKitDialogs.bundle/Resources/he.lproj/GoogleKitDialogs.strings - - hash - - HmMniq5QygOzBGBPgbk8tHNngpc= - - optional - - - GoogleKitDialogs.bundle/Resources/hi.lproj/GoogleKitDialogs.strings - - hash - - 9vlNEFFDUAfCGk0jVwm5HvnHxXU= - - optional - - - GoogleKitDialogs.bundle/Resources/hr.lproj/GoogleKitDialogs.strings - - hash - - K5GbDN2QQl5JpLqHMjryX8hjGxo= - - optional - - - GoogleKitDialogs.bundle/Resources/hu.lproj/GoogleKitDialogs.strings - - hash - - hu/6rBYTwUuQIojF4WBevRTcgQs= - - optional - - - GoogleKitDialogs.bundle/Resources/hy.lproj/GoogleKitDialogs.strings - - hash - - Lib0s1qNgFmePohhuBDhtDB0EE4= - - optional - - - GoogleKitDialogs.bundle/Resources/id.lproj/GoogleKitDialogs.strings - - hash - - qORRDavuofRLmRQK8BeinG6HZRU= - - optional - - - GoogleKitDialogs.bundle/Resources/it.lproj/GoogleKitDialogs.strings - - hash - - Y+8IcgmhTdkSsaRgI1WCH43WTOg= - - optional - - - GoogleKitDialogs.bundle/Resources/iw.lproj/GoogleKitDialogs.strings - - hash - - HmMniq5QygOzBGBPgbk8tHNngpc= - - optional - - - GoogleKitDialogs.bundle/Resources/ja.lproj/GoogleKitDialogs.strings - - hash - - TThtfT1PBoB9aBpYdh7ixsSbC6k= - - optional - - - GoogleKitDialogs.bundle/Resources/ka.lproj/GoogleKitDialogs.strings - - hash - - vbqw1vIDLjFwqIFVThTdIqBtvQ4= - - optional - - - GoogleKitDialogs.bundle/Resources/kk.lproj/GoogleKitDialogs.strings - - hash - - 7fn4p7+WE/l/kt0ee7ye3zIBMkk= - - optional - - - GoogleKitDialogs.bundle/Resources/km.lproj/GoogleKitDialogs.strings - - hash - - riTEsapgmpKSlOcv3tKwz1dG46M= - - optional - - - GoogleKitDialogs.bundle/Resources/ko.lproj/GoogleKitDialogs.strings - - hash - - xKNYMwPmUFEnhKdlxNtepdWkgl0= - - optional - - - GoogleKitDialogs.bundle/Resources/lo.lproj/GoogleKitDialogs.strings - - hash - - 5l/Ee+ScMY+7RZotYgtRQJCeGPs= - - optional - - - GoogleKitDialogs.bundle/Resources/lt.lproj/GoogleKitDialogs.strings - - hash - - vuWkt0k4ZBpzafue2AbpFwk1HLg= - - optional - - - GoogleKitDialogs.bundle/Resources/lv.lproj/GoogleKitDialogs.strings - - hash - - Lx1jRghrLk7MdFkRe0TApHRLQPc= - - optional - - - GoogleKitDialogs.bundle/Resources/mn.lproj/GoogleKitDialogs.strings - - hash - - R4wpeSWU+qIH+x2cPRQp8BnJqcY= - - optional - - - GoogleKitDialogs.bundle/Resources/ms.lproj/GoogleKitDialogs.strings - - hash - - upcLRV2Ez5fLyY00q2N+w3FMUrI= - - optional - - - GoogleKitDialogs.bundle/Resources/nb.lproj/GoogleKitDialogs.strings - - hash - - 1nY2zOrn79RMWtfbNphyzLa9sSA= - - optional - - - GoogleKitDialogs.bundle/Resources/nl.lproj/GoogleKitDialogs.strings - - hash - - PRTNG7vkDGkixQxsbnlMnntPxPk= - - optional - - - GoogleKitDialogs.bundle/Resources/no.lproj/GoogleKitDialogs.strings - - hash - - 1nY2zOrn79RMWtfbNphyzLa9sSA= - - optional - - - GoogleKitDialogs.bundle/Resources/pl.lproj/GoogleKitDialogs.strings - - hash - - VT1lWvdKl5+fnvJ1G7q2SQtiTBw= - - optional - - - GoogleKitDialogs.bundle/Resources/pt.lproj/GoogleKitDialogs.strings - - hash - - bwYUOPhA2egLeXdiqOPVN2LgL34= - - optional - - - GoogleKitDialogs.bundle/Resources/pt_BR.lproj/GoogleKitDialogs.strings - - hash - - bwYUOPhA2egLeXdiqOPVN2LgL34= - - optional - - - GoogleKitDialogs.bundle/Resources/pt_PT.lproj/GoogleKitDialogs.strings - - hash - - n3vT+a3gAtWqWMZndk0EGuxdVtE= - - optional - - - GoogleKitDialogs.bundle/Resources/ro.lproj/GoogleKitDialogs.strings - - hash - - cjeTZjmMWwwZJGrV2Wig918lm2k= - - optional - - - GoogleKitDialogs.bundle/Resources/ru.lproj/GoogleKitDialogs.strings - - hash - - iD+WaMXXrSRY0/6ExXh4XNi4vo0= - - optional - - - GoogleKitDialogs.bundle/Resources/sk.lproj/GoogleKitDialogs.strings - - hash - - wk/VLlvonpw58jGrAnigELhxEEI= - - optional - - - GoogleKitDialogs.bundle/Resources/sq.lproj/GoogleKitDialogs.strings - - hash - - /jw3z9DFWDV0xPPQlS7s1z0fyOc= - - optional - - - GoogleKitDialogs.bundle/Resources/sr.lproj/GoogleKitDialogs.strings - - hash - - 4kNU9JkUSYwkpUn8vMgUPSkChfQ= - - optional - - - GoogleKitDialogs.bundle/Resources/sv.lproj/GoogleKitDialogs.strings - - hash - - 1Ev+aczEP5IU9DN6lZmf/1FU3fM= - - optional - - - GoogleKitDialogs.bundle/Resources/th.lproj/GoogleKitDialogs.strings - - hash - - wLiG7dVvnp3q7Bt99o+waGQEkQQ= - - optional - - - GoogleKitDialogs.bundle/Resources/tr.lproj/GoogleKitDialogs.strings - - hash - - i09LFoHpUC7A/z64md3c2MyPrsg= - - optional - - - GoogleKitDialogs.bundle/Resources/uk.lproj/GoogleKitDialogs.strings - - hash - - HxfxRQr1DQqRRzD2OK0f6Y61MvU= - - optional - - - GoogleKitDialogs.bundle/Resources/vi.lproj/GoogleKitDialogs.strings - - hash - - bvVyPUY5WPbQCJ97G6B1tbpQTbc= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_CN.lproj/GoogleKitDialogs.strings - - hash - - llwV86uJl1i1EozmsR5OqfX2clI= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_HK.lproj/GoogleKitDialogs.strings - - hash - - exfGOojxi5Aa3wn8byhKgkATA78= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_TW.lproj/GoogleKitDialogs.strings - - hash - - Liyx3uk451DzpDz4QaCewnPCAR4= - - optional - - - GoogleKitDialogs.bundle/arrow_bottom.png - - zfKxccgJSL/kZPBd6V0HdE/j9TI= - - GoogleKitDialogs.bundle/arrow_bottom@2x.png - - yzBM9E16FVC0WRqUTEDrJuCF6Os= - - GoogleKitDialogs.bundle/arrow_left.png - - 4h+2KQZ1mMkQg1FDazLt866dzuM= - - GoogleKitDialogs.bundle/arrow_left@2x.png - - iEoNYuu6JAATS+KkiPqjx2TjbC4= - - GoogleKitDialogs.bundle/arrow_right.png - - jK0sW8YoUA3QCBoei3eEmrOx9y8= - - GoogleKitDialogs.bundle/arrow_right@2x.png - - 2DOQN+Xj6wQh8sDLcupATh6/dyA= - - GoogleKitDialogs.bundle/arrow_top.png - - SH2MJ9brpL5Y6ow1Lc/P5I1K6MQ= - - GoogleKitDialogs.bundle/arrow_top@2x.png - - BUZS/r+lvMdFduLDw4bQi94Ho4I= - - GoogleKitDialogs.bundle/background.png - - 3EsGPAF2zDuSlfV1GfwT25eS5Hg= - - GoogleKitDialogs.bundle/background@2x.png - - kQIpxuz+hjck5dJ4jh1wtLSrlgg= - - GoogleKitDialogs.bundle/bottom.png - - HOfN5XjGIHM83rXaPXp4B8NoIHk= - - GoogleKitDialogs.bundle/bottom@2x.png - - yQf7J/KE8NRkBI92um0n3bAaDKM= - - GoogleKitDialogs.bundle/corner_bottom_left.png - - AuX+MIKLr2pOFe0t4VetUtwmfXw= - - GoogleKitDialogs.bundle/corner_bottom_left@2x.png - - SHMfIzN3JzbC13f9V/nmG2D3opc= - - GoogleKitDialogs.bundle/corner_bottom_right.png - - 9zHdtuM4X5SlfZG2evrjDM296e8= - - GoogleKitDialogs.bundle/corner_bottom_right@2x.png - - n7f1J9rSsJdODXiY2mer/Bv5nbw= - - GoogleKitDialogs.bundle/corner_top_left.png - - 0oBdEZjwDHbS7Wf7aAiM57epLf4= - - GoogleKitDialogs.bundle/corner_top_left@2x.png - - V13nRxocUEsVwtbV9iU+1FDis6Y= - - GoogleKitDialogs.bundle/corner_top_right.png - - mfN6AFOkOFH4Xf+0L7x/s2pp0+U= - - GoogleKitDialogs.bundle/corner_top_right@2x.png - - p+Wvm5tL+Cab3afNJ0NKs+9452E= - - GoogleKitDialogs.bundle/ic_check.png - - 7YlS8BxQfJ54mZNnosLJTA+i+kI= - - GoogleKitDialogs.bundle/ic_check@2x.png - - AteJE6U6PwMvwioZ/t10XhiVJ9M= - - GoogleKitDialogs.bundle/ic_check@3x.png - - 4XBExChBsjNZC1Zk52EuWiT0AhE= - - GoogleKitDialogs.bundle/ic_close.png - - uIvFQv+za0ce8VWAUHDjWkdJYVc= - - GoogleKitDialogs.bundle/ic_close@2x.png - - m2uZzaOvA1M7z0u6lCK8W+LxPsE= - - GoogleKitDialogs.bundle/ic_close@3x.png - - yB0UZ4BJZwu0mCPwpqaI5cyeWoM= - - GoogleKitDialogs.bundle/ic_comment.png - - fsZt3b9STCAni1EY5neH9LoPqD4= - - GoogleKitDialogs.bundle/ic_comment@2x.png - - RnfmGIL1GCItaCBZjxKqFfwk5cQ= - - GoogleKitDialogs.bundle/ic_comment@3x.png - - 64uUjyuvgN827suFDjxlBd3fzu8= - - GoogleKitDialogs.bundle/ic_delete.png - - qU8grkqOLbFGN/DJCSkrlCH+PM0= - - GoogleKitDialogs.bundle/ic_delete@2x.png - - UazQCMTour2Y/5yOZNz+spYPSNQ= - - GoogleKitDialogs.bundle/ic_delete@3x.png - - HoRbp65Wh2xyXDtTE2rsMrOT8uA= - - GoogleKitDialogs.bundle/ic_email.png - - C5QDGGnRei4yll4bvfQo1fC3Lpk= - - GoogleKitDialogs.bundle/ic_email@2x.png - - Qzj9490REhlCIzdLej2h+xwb+I4= - - GoogleKitDialogs.bundle/ic_email@3x.png - - uRc/+vGWzPerwjlQGRQBcmQnf7I= - - GoogleKitDialogs.bundle/ic_file_download.png - - B6B5i7Ci3SmqcyIEEYPnkRSMGzI= - - GoogleKitDialogs.bundle/ic_file_download@2x.png - - /yQ+k/inZPqKt9PtibpadzrOt/Q= - - GoogleKitDialogs.bundle/ic_file_download@3x.png - - YDw846NXbesLRZ6fgEcjEMYfLM4= - - GoogleKitDialogs.bundle/ic_info.png - - FJYDB1Ub4dkcFJUsN58VlsxsrGk= - - GoogleKitDialogs.bundle/ic_info@2x.png - - osVrIl4NcZXVDgw3mjBKnSFPmx0= - - GoogleKitDialogs.bundle/ic_info@3x.png - - YJH3tDumg4IJKZA0T87l57IkTOk= - - GoogleKitDialogs.bundle/ic_link.png - - MK98PiWh9qXVKqtEKTjUQKvEQ+8= - - GoogleKitDialogs.bundle/ic_link@2x.png - - KkKrkUc8AmTG+MhDyBAoDlatk48= - - GoogleKitDialogs.bundle/ic_link@3x.png - - k69lxGe/UJ79p1tO0NQeGRba+rY= - - GoogleKitDialogs.bundle/ic_message.png - - sCVzxqdw5lKeiEEtN2wzQ006V9A= - - GoogleKitDialogs.bundle/ic_message@2x.png - - F3OF5VvOqSmFYTRJz7fIusrHZfY= - - GoogleKitDialogs.bundle/ic_message@3x.png - - gzNrxuhJjkwFJWgBUHRs8ntLTSY= - - GoogleKitDialogs.bundle/ic_mode_edit.png - - 7Xlc6WdqZZQQActAE2sew63BN00= - - GoogleKitDialogs.bundle/ic_mode_edit@2x.png - - LnZSspyCDwljwEpCh5FHvHvoHMc= - - GoogleKitDialogs.bundle/ic_mode_edit@3x.png - - w1myZR6QQ0LC7bzBlDe28+dHE6c= - - GoogleKitDialogs.bundle/ic_open_in_browser.png - - +bC58jBYMyt2ICn/Uzu0Y1PJieM= - - GoogleKitDialogs.bundle/ic_open_in_browser@2x.png - - gEhpZajVyfk/MT/k8EiggjFKxy4= - - GoogleKitDialogs.bundle/ic_open_in_browser@3x.png - - eoc9LE0/lJZOzScsv8ORtVUiPEY= - - GoogleKitDialogs.bundle/ic_photo_camera.png - - MIn+/bIl9+oAex1+lpThoWKg6ao= - - GoogleKitDialogs.bundle/ic_photo_camera@2x.png - - RajOeGX8TO1Vqm+hD9uFedBNWd4= - - GoogleKitDialogs.bundle/ic_photo_camera@3x.png - - 9xHFmUxTVzx9+bgDPZoQaRvAetU= - - GoogleKitDialogs.bundle/ic_photo_library.png - - KlfuuNzldgKUa5BIIKtXTPx0wMI= - - GoogleKitDialogs.bundle/ic_photo_library@2x.png - - W4r8OrbUJXxbD4OonzffeOrKis4= - - GoogleKitDialogs.bundle/ic_photo_library@3x.png - - ZZ/CUcgHTx4HNCah3J5hcot3MCs= - - GoogleKitDialogs.bundle/ic_post_gplus.png - - CvNEixGNLOjmId4tqkYgZnr7LaU= - - GoogleKitDialogs.bundle/ic_post_gplus@2x.png - - SckaYhp13eh74wpzBHXq14tDrDI= - - GoogleKitDialogs.bundle/ic_post_gplus@3x.png - - LT8hbqEGJwxQPhPs/kcbPtvHWu0= - - GoogleKitDialogs.bundle/ic_print.png - - sps2m7fOvRdOUh5cqevkO5S+dsE= - - GoogleKitDialogs.bundle/ic_print@2x.png - - X4FZ4ndGiTfYDV7+ejSL7QZ03Rc= - - GoogleKitDialogs.bundle/ic_print@3x.png - - m3CndM3rYzpAoesGS0GjREymIoA= - - GoogleKitDialogs.bundle/ic_report_problem.png - - zJhL3lcrgJTSJxsvDOEb45kkPUA= - - GoogleKitDialogs.bundle/ic_report_problem@2x.png - - m2QgrOoj6dK8oo8jP6SoJh7s+d8= - - GoogleKitDialogs.bundle/ic_report_problem@3x.png - - 242DYE8Uo9/P/sap59XGBQmm0H8= - - GoogleKitDialogs.bundle/ic_report_problem_red.png - - ghYJA+1VA2mtGnf9IJaikVwqJnw= - - GoogleKitDialogs.bundle/ic_report_problem_red@2x.png - - mwGArBI0lnFep4UdDiGS6Yu/dqs= - - GoogleKitDialogs.bundle/ic_report_problem_red@3x.png - - lzbY9bVj7a+fFYOpC5YbqNYjI+4= - - GoogleKitDialogs.bundle/left.png - - xtjDsHLZRQE5/ekNBsh6xSEcsvo= - - GoogleKitDialogs.bundle/left@2x.png - - MZKAzvCfRv746Tqe4IE96XVxHIM= - - GoogleKitDialogs.bundle/right.png - - gOrm8ACRnhLXAOk9r8Aw1z7Voqs= - - GoogleKitDialogs.bundle/right@2x.png - - EcOWeHYRFhbiQAFAs6O6Z/g0WUw= - - GoogleKitDialogs.bundle/top.png - - voQqqKUF0YiK6wJkhzpNgUoeLmc= - - GoogleKitDialogs.bundle/top@2x.png - - Xu+KUYmB9pm1CmDytU2wAUibKGU= - - GoogleKitHUD.bundle/Resources/ar.lproj/GoogleKitHUD.strings - - hash - - AaNmjkCbjrYDl06swIvVv+SFEdw= - - optional - - - GoogleKitHUD.bundle/Resources/bg.lproj/GoogleKitHUD.strings - - hash - - 9onkxmM8jRn9rmZrBj2mutG9CfU= - - optional - - - GoogleKitHUD.bundle/Resources/ca.lproj/GoogleKitHUD.strings - - hash - - Mr93ZCk83KDgxaWed/ocxflPsjQ= - - optional - - - GoogleKitHUD.bundle/Resources/cs.lproj/GoogleKitHUD.strings - - hash - - DS4Ga/tGR9av0Bldybf54LAxoks= - - optional - - - GoogleKitHUD.bundle/Resources/da.lproj/GoogleKitHUD.strings - - hash - - iMNs1mt1S6Q0RP1mCu9anu3YQd8= - - optional - - - GoogleKitHUD.bundle/Resources/de.lproj/GoogleKitHUD.strings - - hash - - xhcmc3AcCpH+Qm8gd8NKwYYNAnM= - - optional - - - GoogleKitHUD.bundle/Resources/el.lproj/GoogleKitHUD.strings - - hash - - 6TMH/p6z7KvNSoAUKFB9R/JgCDM= - - optional - - - GoogleKitHUD.bundle/Resources/en.lproj/GoogleKitHUD.strings - - hash - - 8yDQcLNsp0Sn2uTbporqa48QJ8w= - - optional - - - GoogleKitHUD.bundle/Resources/en_AU.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - optional - - - GoogleKitHUD.bundle/Resources/en_GB.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - optional - - - GoogleKitHUD.bundle/Resources/en_IN.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - optional - - - GoogleKitHUD.bundle/Resources/es.lproj/GoogleKitHUD.strings - - hash - - bp7trgjw+C6Cc/v/LuF99Egzhug= - - optional - - - GoogleKitHUD.bundle/Resources/es_419.lproj/GoogleKitHUD.strings - - hash - - M7q07s6g+7CezOA3WFaskcie9Ys= - - optional - - - GoogleKitHUD.bundle/Resources/es_MX.lproj/GoogleKitHUD.strings - - hash - - M7q07s6g+7CezOA3WFaskcie9Ys= - - optional - - - GoogleKitHUD.bundle/Resources/fa.lproj/GoogleKitHUD.strings - - hash - - KX9Oc1hCnSVqtaqgw88+LtDuVlU= - - optional - - - GoogleKitHUD.bundle/Resources/fi.lproj/GoogleKitHUD.strings - - hash - - 4Rr5aSBIArDnfLk6gHn5/I3dKEc= - - optional - - - GoogleKitHUD.bundle/Resources/fr.lproj/GoogleKitHUD.strings - - hash - - SDDHj/f8qk8PamYofFI7gMxiBUY= - - optional - - - GoogleKitHUD.bundle/Resources/fr_CA.lproj/GoogleKitHUD.strings - - hash - - pZ3GX+u4BZCk7xa1n8V/i6bctG8= - - optional - - - GoogleKitHUD.bundle/Resources/he.lproj/GoogleKitHUD.strings - - hash - - PRBUQcUTBHKyNg8WEpcHKumgAgs= - - optional - - - GoogleKitHUD.bundle/Resources/hi.lproj/GoogleKitHUD.strings - - hash - - I1o0Spslb/0/q01PhDbWIiRwXQ4= - - optional - - - GoogleKitHUD.bundle/Resources/hr.lproj/GoogleKitHUD.strings - - hash - - 3tmWqbfG3w3Njjl3qDv7QHmKvfI= - - optional - - - GoogleKitHUD.bundle/Resources/hu.lproj/GoogleKitHUD.strings - - hash - - HkSvjp9GIS8mOeU9kc+KSz9HQk4= - - optional - - - GoogleKitHUD.bundle/Resources/hy.lproj/GoogleKitHUD.strings - - hash - - JWi8uig1JF6yg2jrJVp1kbvt+M0= - - optional - - - GoogleKitHUD.bundle/Resources/id.lproj/GoogleKitHUD.strings - - hash - - M7FVwr2ejyS8PoR7KUy5fqSWprc= - - optional - - - GoogleKitHUD.bundle/Resources/it.lproj/GoogleKitHUD.strings - - hash - - Ovi2gE+2cEupNzCHNHKy6I7KPCk= - - optional - - - GoogleKitHUD.bundle/Resources/iw.lproj/GoogleKitHUD.strings - - hash - - PRBUQcUTBHKyNg8WEpcHKumgAgs= - - optional - - - GoogleKitHUD.bundle/Resources/ja.lproj/GoogleKitHUD.strings - - hash - - wjI1zUzwo+M84X80Ln9COaOPiD4= - - optional - - - GoogleKitHUD.bundle/Resources/ka.lproj/GoogleKitHUD.strings - - hash - - 33XC4Q37/CFuvhHg1hOZgYuyd2E= - - optional - - - GoogleKitHUD.bundle/Resources/kk.lproj/GoogleKitHUD.strings - - hash - - Mk963y70d4R8iSw777sWTmpZx2I= - - optional - - - GoogleKitHUD.bundle/Resources/km.lproj/GoogleKitHUD.strings - - hash - - Jp3bfWEAo3XOQ9MJe9y2r36P6/o= - - optional - - - GoogleKitHUD.bundle/Resources/ko.lproj/GoogleKitHUD.strings - - hash - - NNXW2kvbe4S0thwxSgxhxDoEeck= - - optional - - - GoogleKitHUD.bundle/Resources/lo.lproj/GoogleKitHUD.strings - - hash - - kK/2uyfI5P05P0No3YVDOG3v/Gk= - - optional - - - GoogleKitHUD.bundle/Resources/lt.lproj/GoogleKitHUD.strings - - hash - - MmTAdmNnQQAQpBX7rLYXDJ0P9sA= - - optional - - - GoogleKitHUD.bundle/Resources/lv.lproj/GoogleKitHUD.strings - - hash - - tgiCZCAmx9O0huPGIkb3ngu8hpI= - - optional - - - GoogleKitHUD.bundle/Resources/mn.lproj/GoogleKitHUD.strings - - hash - - YAazAb6EacRwLWdYqVjgVCHpWT0= - - optional - - - GoogleKitHUD.bundle/Resources/ms.lproj/GoogleKitHUD.strings - - hash - - Z1Q/YOuauVh2yANH0REn14ojqsU= - - optional - - - GoogleKitHUD.bundle/Resources/nb.lproj/GoogleKitHUD.strings - - hash - - fLlMm5qte4UZlZeVNj+GiKSoidw= - - optional - - - GoogleKitHUD.bundle/Resources/nl.lproj/GoogleKitHUD.strings - - hash - - pagPHTlBp6IMFhYiNBZj4jkGdHc= - - optional - - - GoogleKitHUD.bundle/Resources/no.lproj/GoogleKitHUD.strings - - hash - - fLlMm5qte4UZlZeVNj+GiKSoidw= - - optional - - - GoogleKitHUD.bundle/Resources/pl.lproj/GoogleKitHUD.strings - - hash - - vNvovxxNwq/ab/aNA2fwgvV08J0= - - optional - - - GoogleKitHUD.bundle/Resources/pt.lproj/GoogleKitHUD.strings - - hash - - +lYznxUTyFYr0mG3NSI4GayRdzw= - - optional - - - GoogleKitHUD.bundle/Resources/pt_BR.lproj/GoogleKitHUD.strings - - hash - - +lYznxUTyFYr0mG3NSI4GayRdzw= - - optional - - - GoogleKitHUD.bundle/Resources/pt_PT.lproj/GoogleKitHUD.strings - - hash - - tP+n9cDYMOpE6tjVkyy+tKZTDRU= - - optional - - - GoogleKitHUD.bundle/Resources/ro.lproj/GoogleKitHUD.strings - - hash - - /W2o9SoR4Se12NBqsVyf4I1xCDw= - - optional - - - GoogleKitHUD.bundle/Resources/ru.lproj/GoogleKitHUD.strings - - hash - - xrlrNkPgleZGUHQqvIznJradDbs= - - optional - - - GoogleKitHUD.bundle/Resources/sk.lproj/GoogleKitHUD.strings - - hash - - xTK6EeKdIuYw6VSMno7c+JM4FIk= - - optional - - - GoogleKitHUD.bundle/Resources/sq.lproj/GoogleKitHUD.strings - - hash - - zgPauh7ypA/MiAV14t2IVao7aPY= - - optional - - - GoogleKitHUD.bundle/Resources/sr.lproj/GoogleKitHUD.strings - - hash - - Spw8AS/ldO64IyIwBByrFuvmf7E= - - optional - - - GoogleKitHUD.bundle/Resources/sv.lproj/GoogleKitHUD.strings - - hash - - HOoONzSsvbE6cBtU1D21A8JJkik= - - optional - - - GoogleKitHUD.bundle/Resources/th.lproj/GoogleKitHUD.strings - - hash - - foOVRpy/fjk3ZpzRXBwFB/X6htA= - - optional - - - GoogleKitHUD.bundle/Resources/tr.lproj/GoogleKitHUD.strings - - hash - - WWTcYxp/FJhNCcreYBRev4xxjis= - - optional - - - GoogleKitHUD.bundle/Resources/uk.lproj/GoogleKitHUD.strings - - hash - - Gqnow7ZCHlTAAcOlUelvocWOO1Q= - - optional - - - GoogleKitHUD.bundle/Resources/vi.lproj/GoogleKitHUD.strings - - hash - - 8hzf+bCR6CE61+uR14aX0GbKqCg= - - optional - - - GoogleKitHUD.bundle/Resources/zh_CN.lproj/GoogleKitHUD.strings - - hash - - NkKNrGVetaTrCA5PDsiqfUg/eFU= - - optional - - - GoogleKitHUD.bundle/Resources/zh_HK.lproj/GoogleKitHUD.strings - - hash - - K3D2RHHzR8XKKTTVOX8eJlYld5Y= - - optional - - - GoogleKitHUD.bundle/Resources/zh_TW.lproj/GoogleKitHUD.strings - - hash - - 0bhClt7gNEuowJAnjV9J6o5KmBk= - - optional - - - Headers/VROARAnchor.h - - lfhoaP0L8Q+c8iw9ldCQTKm7Dx4= - - Headers/VROARCamera.h - - tQ3OhrOAj/wGc6/hJ1Gq4sJCZks= - - Headers/VROARConstraintMatcher.h - - 9KdxGoAtNButNXgonccLLpzXy8w= - - Headers/VROARDeclarativeImageNode.h - - DOs/Bn+rv3aj9B/kRVdWF7/6+4E= - - Headers/VROARDeclarativeNode.h - - L6+kSqa5T2mil421CA8MNE7SbHQ= - - Headers/VROARDeclarativeNodeDelegate.h - - Mm4A5Mztv3Xj2iVDec9ERVKWKgU= - - Headers/VROARDeclarativeObjectNode.h - - U5s7QRJjx1Wd45EsSTrLTlHbK28= - - Headers/VROARDeclarativePlane.h - - W+62Mt3prrdsV0Va6LUbjAzIT5k= - - Headers/VROARDeclarativeSession.h - - hM8ho1J5EWgpmH47WBfDyELJK7c= - - Headers/VROARFrame.h - - VbDE2LQJTK0sN3nmZjapDF6YVms= - - Headers/VROARFrameInertial.h - - vbZFdmyHMlKpzGksf3+YghQgMrw= - - Headers/VROARFrameiOS.h - - zOyz1D6ar2kZms+elDE/PkT4BlQ= - - Headers/VROARHitTestResult.h - - +jUA2dOKJkOYUA1zr6+gVsC6RNs= - - Headers/VROARImageAnchor.h - - 8+pc6Vo9dONkC9MXEYlW4B7Ae1A= - - Headers/VROARImageDatabase.h - - YKBn6g7W9zITJ2K2vXQlQwNf86k= - - Headers/VROARImageTarget.h - - fSZZwRy3U4b9/mNe88zbB/tfaek= - - Headers/VROARImageTargetiOS.h - - zwkxuedyYHr0iND0yRQkEXGZedU= - - Headers/VROARNode.h - - 9cxYJDn9NlPGhFwNrmY5AufcqAE= - - Headers/VROARNodeDelegateiOS.h - - mcjv03abjLNhCOWQlA/XoT23nFI= - - Headers/VROARObjectAnchor.h - - Aq63oeyDn5+NYCkyMxB7E1N22iw= - - Headers/VROARObjectTarget.h - - 1mT1L2MM5QA/3tU7KoOCvP9NxZ4= - - Headers/VROARObjectTargetiOS.h - - 1NmMRUybdeMM75EVnuywgozU480= - - Headers/VROARPlaneAnchor.h - - Yt7HqONaUf2sotSEBTg7e8KWksA= - - Headers/VROARPointCloud.h - - nu2nWG4oVwWthzZK0mKUKLj/uSw= - - Headers/VROARScene.h - - 0RTrOOECKVxKBWU6XrVasQf11Es= - - Headers/VROARSceneController.h - - 9X5Hj/RbIQ1k/FSp37o5kM692co= - - Headers/VROARSceneDelegateiOS.h - - fvrVrVgKA9uc79vEHxETfPFGpp8= - - Headers/VROARSession.h - - MRUo+pAnS4IN90/8WrvKJbrRGSM= - - Headers/VROARSessioniOS.h - - VXzDlvNOGU9e91CpLShjw/rh8Sc= - - Headers/VROARShadow.h - - nmYli3t2JLMx8spFXQFvDsuWqo8= - - Headers/VROAction.h - - RB56CDypA98C5TuJogysoaEkktc= - - Headers/VROAllocationTracker.h - - 4SnEx5qxk2mKWNCvSWsDeHgLUn0= - - Headers/VROAnimBodyDataiOS.h - - S16SPiAepwKQXP8yvW/E+gCrPi8= - - Headers/VROAnimatable.h - - QlHN857ibXMEJGZ9Y6wmADj1VoU= - - Headers/VROAnimatedTextureOpenGL.h - - ejm5EgA79NmY8vdTtrr3Dru7P44= - - Headers/VROAnimation.h - - ByTznwgjqr1FCwF/RHerAWhim2A= - - Headers/VROAnimationChain.h - - F/Z/qq5Pzf4ZjFUs184ABwtIECQ= - - Headers/VROAnimationFloat.h - - xiWlkxP+4KFvYg1QZ4MHpLRa9OU= - - Headers/VROAnimationGroup.h - - TvhR5Hp7emB4nJSnyR7GaMJmi7g= - - Headers/VROAnimationQuaternion.h - - UKYgzpTq890a/cye/pgROfomKrs= - - Headers/VROAnimationVector3f.h - - uoMK0slGiCKtSoIB/qDmXJM9OlM= - - Headers/VROAtomic.h - - /qIseOaqtviaJO9MGiziIgGEOK0= - - Headers/VROAudioPlayer.h - - naOsLPwEv+t6XsPEQ+QbFkfTfFU= - - Headers/VROAudioPlayeriOS.h - - tpjIkKLB93KiLUnHbswHnz8FBFk= - - Headers/VROBillboardConstraint.h - - 1sYf15BU4KFfxuI8Qwewa0AL5Fk= - - Headers/VROBodyAnimData.h - - Y89dGjaMgeBjDg8KS4pmxIhLqCg= - - Headers/VROBodyMesher.h - - tvgZtUlIRrZTM3775a7QC+lZreI= - - Headers/VROBodyPlayer.h - - YslPGwoupwYy1cHDCwGvJCl3KjA= - - Headers/VROBodyPlayeriOS.h - - HtFUjNQ5WgIfXJJVgOLFW/neRK0= - - Headers/VROBodyTracker.h - - CaWAIpzHkjRvXoNDk2eZdCZREmY= - - Headers/VROBodyTrackerController.h - - yzMXhdrPFAVuE/7h9406Dg2eR6Q= - - Headers/VROBodyTrackerYolo.h - - zd7naAPPhQgTHezUOP2Cnb1dC8U= - - Headers/VROBodyTrackeriOS.h - - XG7PMr9T9qJfgK49rg4lC7KZ0SA= - - Headers/VROBoneConstraint.h - - 9MKZdVkMjQwe1ndEEuQkvRlVGXQ= - - Headers/VROBoundingBox.h - - zhNSFNA/G82cDyejxt3TwmuLDs4= - - Headers/VROBox.h - - bIIbl7KuWiG09ihnShTIWuKcGDY= - - Headers/VROByteBuffer.h - - Jxx5+phVc6s1UdAB5AXSqZh7l/w= - - Headers/VROCamera.h - - Ckrer3OZi8BXbJzt9njB+wWkH14= - - Headers/VROCameraTexture.h - - YJcsx783gH34ZD4609dNK3AP06M= - - Headers/VROCameraTextureiOS.h - - /1kTtpsXgJQTXxvdj7NilhfQzwc= - - Headers/VROChoreographer.h - - elpCqqi/cq+5bufVWFzmB4dJvrI= - - Headers/VROConcurrentBuffer.h - - lUUUZ9vlA8Eh9HdkUdNv4DlJT4M= - - Headers/VROConstraint.h - - GD0Z8o0HilG0r7QBGaGTVCBdFiA= - - Headers/VROData.h - - Q3aKjrkP5Ps82wl2cb0Ia2NMpIE= - - Headers/VRODefines.h - - aVT7ujuN9RBqizsdFZkirsnJBCg= - - Headers/VRODeviceUtil.h - - MhjGcHIQU77sgwh+yBGbNaTkksc= - - Headers/VRODriver.h - - eILCTfOSpJrx8/1mfA0r5JPL2D8= - - Headers/VROEventDelegate.h - - e20g8rM8X9h3T8faWybib/CFIhY= - - Headers/VROEventDelegateiOS.h - - 0jq3sM53Xa3xlMd0qhvd7jHj4es= - - Headers/VROExecutableAnimation.h - - vsfHT4C0Spa3wyHE35rLwRfMYpE= - - Headers/VROFBXLoader.h - - Am8uzBc6bSh4bdNm+PYKdJPZtSs= - - Headers/VROFieldOfView.h - - JToSFb40P5VNWdkukTtej4WUWDg= - - Headers/VROFixedParticleEmitter.h - - vyrc7h1hKvauZOx4u29SLnHI1ss= - - Headers/VROFrameListener.h - - GYSYaCJ82wDbCL5hcTmK3sKAaTI= - - Headers/VROFrameScheduler.h - - 9XHnyoVjNcf0YE4tyQ1fabiO/8M= - - Headers/VROFrameSynchronizer.h - - cgiabeN2ssA0rE3Ue18PERFgg+M= - - Headers/VROFrameTimer.h - - ELRmghW79P1IEueiPs9wr4rlqSA= - - Headers/VROFrustum.h - - bKy8/xkIwnkAewnf5DqyWTJyTaw= - - Headers/VROFrustumBoxIntersectionMetadata.h - - eIcC7/nZwUm5RyPC0iT+UvbFDGI= - - Headers/VROFrustumPlane.h - - E3B/PiTGmcZr51lrHztxqs7eB2k= - - Headers/VROGLTFLoader.h - - pR9rQ/rmw+zd8TTLdujWdQ3RLJM= - - Headers/VROGaussianBlurRenderPass.h - - iAl9Q97042ojxITgtOEqEUBXojU= - - Headers/VROGeometry.h - - vbBXyHyBLIxq0lxa5J9X5StjVQ8= - - Headers/VROGeometryElement.h - - VEQimYPz3tfclGRDqLpn2SVXC2Y= - - Headers/VROGeometrySource.h - - wB8X4bIo1A3Xs/caFrvvpjam5Ig= - - Headers/VROGeometryUtil.h - - feCRIQVpW01cgQNvyZSqAucD6tw= - - Headers/VROHDRLoader.h - - y3Kr5e1nmW4qYn2B1nHQXSCv0JI= - - Headers/VROHitTestResult.h - - eI8uILBmwbrW5aRaoUWL+4YxOKI= - - Headers/VROHoverDistanceListener.h - - P8GaJJVzG0Lbu549P7A2hx5eFd8= - - Headers/VROIKRig.h - - ZF7UK5rV7MFVXGL/RfMkMopikzg= - - Headers/VROImage.h - - TJXmjg1jHkUOyqmDdbHR1MLKl10= - - Headers/VROImageUtil.h - - 4nmLlfZS4O4CLXRDJsJF5hPN2J0= - - Headers/VROImageiOS.h - - GNugrSdDqrG+T40VFkavInLtduI= - - Headers/VROInputControllerBase.h - - IkH8Y8JJ2rty3EhX7wmmLvl0aJo= - - Headers/VROInputControllerCardboardiOS.h - - 200ukPB3eEvqtKtMv1a5i0tACp8= - - Headers/VROInputPresenter.h - - 2xn/LnehUhAzaGiuq38whZPfdh0= - - Headers/VROInputPresenterCardboardiOS.h - - joJDK7l/Xf820TAxtH7hTUVopS8= - - Headers/VROInputType.h - - pBH08foKvaNQN7lcXRIJNfEvGbE= - - Headers/VROLazyMaterial.h - - tPsbG/3DUBy8mzJytVF8Yqr8Xwk= - - Headers/VROLight.h - - 3bpRzigml3qdyw4ILXFr02F5g7M= - - Headers/VROLineSegment.h - - pTCPmIhuUEFiiZWdD3n8bVEgve8= - - Headers/VROLog.h - - u1t0kZrZYwHdzLvWl0dcC1ikofI= - - Headers/VROMaterial.h - - tVoGA/UkVZfauSkoFmz0kexr4d8= - - Headers/VROMaterialAnimation.h - - M1uBFo5O5dmmW3NKPf+sE96vqL8= - - Headers/VROMaterialSubstrate.h - - fzPTnPE9wwp5++tFjlEre4BTBj4= - - Headers/VROMaterialVisual.h - - g0j7VTFp2FOvjEWCZkUS6PGLs9I= - - Headers/VROMath.h - - DC0Hfj/bhs2YqJUDVNh/61tObts= - - Headers/VROMatrix4f.h - - eGHMHHRxNMkItEAhZBFdtZmqwBE= - - Headers/VROModelIOUtil.h - - KytPixVXKsQUSnA5dC2LA2wqjww= - - Headers/VROMorpher.h - - FyL99vnwPbMb+qr4MJIvLiyUuO4= - - Headers/VRONode.h - - tiUj21intaXKaH3VGpXnuIA+Hl0= - - Headers/VRONodeCamera.h - - IVS7bmPPpjuLRQY2yKsim54q+0M= - - Headers/VROOBJLoader.h - - j0CmbrWknC1pQssPvqxKGRHP1Ws= - - Headers/VROOneEuroFilter.h - - 1LUfh63f2dAj1ag4seGiGt9HN4M= - - Headers/VROOpenGL.h - - aT3yTCk31F5CEE3js88V9dPLuxI= - - Headers/VROParticle.h - - vv4uoJq6hDuw0BOesKOzI721XHk= - - Headers/VROParticleEmitter.h - - rDh2gwSO8uh9K22bjAXwk5WWsoM= - - Headers/VROParticleModifier.h - - 3vqQKqWESAOrYrYCz/1JKwuffIA= - - Headers/VROParticleUBO.h - - bMMNJ0vwB3rFFo9knFRcrSH3oko= - - Headers/VROPencil.h - - botcXc5Q6Tj1SoaT8jWtlDbTj8g= - - Headers/VROPhysicsBody.h - - 745c3BhoRmSXXY/QNLdclxg+J5U= - - Headers/VROPhysicsBodyDelegate.h - - YriARUizLUNEOjyJ37bS1MpYkd4= - - Headers/VROPhysicsBodyDelegateiOS.h - - UIJtjJhEYwxbhT0OxBB9vQe+CiE= - - Headers/VROPhysicsContactResultCallback.h - - dKtSNbtll6uUiiA1c0bUaQaeamQ= - - Headers/VROPhysicsMotionState.h - - oDGcYS0OvPXZbF5XadEY/XGeBOo= - - Headers/VROPhysicsShape.h - - chzbnGnzzK03+bz7OnFQxA+Q984= - - Headers/VROPhysicsWorld.h - - OxTY4JBwtCujxO5WaGNsSAnTD3A= - - Headers/VROPlane.h - - TovuUp4fhdvWX5+umfMTnTQpPAE= - - Headers/VROPlatformUtil.h - - kaLe3kKqr9o/9wuMW+OJ662yibc= - - Headers/VROPolygon.h - - IiYpOSNZ7aF0g23Gs0hdTxLluxE= - - Headers/VROPolyline.h - - 469gN/f2Oa7/yL2HNXRHLt8HdVs= - - Headers/VROPortal.h - - JnSjWoA9SKfr+JlrlTCFJCo/H2E= - - Headers/VROPortalDelegate.h - - As/a1XgUAEERD6Wniw0px1i1+Ds= - - Headers/VROPortalDelegateiOS.h - - z01tO0ApgZl9Kgmz5MdQE7FK0Q4= - - Headers/VROPortalFrame.h - - 3PogCV0fKNEbaIIJ2HjFqN1Zv/o= - - Headers/VROPortalTraversalListener.h - - h2Y+GXGu8cotLz6+/WG1DR3+VfI= - - Headers/VROPoseFilter.h - - qTV+T/nLWcGez8+/p8GCIY2a9kY= - - Headers/VROPoseFilterEuro.h - - LDLnpKOGeUGFVisvvb3GeLnQVzc= - - Headers/VROPostProcessEffectFactory.h - - q4bCUY+AIl0Zzgbrhn2Mb+x+D9k= - - Headers/VROProjector.h - - t/tNkbXossQ44xLs/KL926IT1AU= - - Headers/VROPropertyAnimation.h - - 2gViKSbboiD2EzCV72xG0R5UJDw= - - Headers/VROQuaternion.h - - wz7AIFchWwo8uvW9NGNeNqrqKeo= - - Headers/VRORenderContext.h - - tEh7H7R0s/r/XjkbOHZ6YVPicRU= - - Headers/VRORenderDelegate.h - - jKNkIfTIkx27bgwVnlsZ6oOUEwY= - - Headers/VRORenderMetadata.h - - WiCLS0SVHy6IrD8TZ5OWoDRoneM= - - Headers/VRORenderParameters.h - - JSmCvpT2mEm0NG8dOCh91K3fQbs= - - Headers/VRORenderPass.h - - wzjhlsWaHzjRf68YqqRy7d1ixlw= - - Headers/VRORenderToTextureDelegate.h - - 1m4Ys5JQW/sDWOpmyChP6fea+WA= - - Headers/VRORenderer.h - - JhI/engmhAWTLgT2UnG2Y58KaY4= - - Headers/VRORendererConfiguration.h - - mdeubZaicUCtt7SeCEZJNm6gjAE= - - Headers/VRORendererTest.h - - +niia4zwR1GJE/080Iy8IzymRpQ= - - Headers/VRORendererTestHarness.h - - KulBr4jyRanJ7vAqBN4kND/mdzo= - - Headers/VROReticle.h - - 0U8pEo8oqMF3G7QMmKIubq4WAgg= - - Headers/VROScene.h - - KLUtB6GMgvcCOGgb3QXLX1i9bqE= - - Headers/VROSceneController.h - - groY5s2i47bnvjm9dpEQ9R/aeaM= - - Headers/VROSceneDelegateiOS.h - - 2nt0eQbop1Adt7L40oCCfPtFH2k= - - Headers/VROShaderModifier.h - - Lcl3oBRqTvWaeoN+Gk8vNj7L2mU= - - Headers/VROShaderProgram.h - - MKbCWjGwxhIn14HOX9zLMuOavoc= - - Headers/VROShapeUtils.h - - ChQ+dr+X/fI+yJBmdLfdoE50lXo= - - Headers/VROSkeletalAnimationLayer.h - - X+E1mXGaFvsrpdfG1R2NFQDBsWg= - - Headers/VROSkeletonRenderer.h - - iACbTxwuOTWEwJqeuQiCVCdF1XY= - - Headers/VROSkinner.h - - n603bHEUxdofLIeX57A2bP2fSP8= - - Headers/VROSkybox.h - - UOYg1mA4nb98Gvrrxr3Pv/XsZPA= - - Headers/VROSortKey.h - - Zs82AISq0v3Nj1+3HkRzN+iY61g= - - Headers/VROSound.h - - PyzicbeI7ZrPDoRxC0/9hc/JqYA= - - Headers/VROSoundData.h - - Q5HLnJ5MDLJhMzPYb1yH7k3Lad0= - - Headers/VROSoundDataDelegate.h - - LyVUf9525CFLOlmb7SZkduIdVIw= - - Headers/VROSoundDataGVR.h - - eHryjxAbjlcl2zan/snFWXCp6nM= - - Headers/VROSoundDelegate.h - - oY0v7cPc7SysIXKzOND/TM011rQ= - - Headers/VROSoundDelegateInternal.h - - QnV5dC5wSQrKzfgRA5eZPc9hFWE= - - Headers/VROSoundDelegateiOS.h - - 3B37mKeXdLi0Y0qcnevt9KR77Sk= - - Headers/VROSoundGVR.h - - onECxTohQlLGmackTdQ5NUbAYrM= - - Headers/VROSparseBitSet.h - - aFLr1UwQ53vP74sfO81Qg3yYddI= - - Headers/VROSphere.h - - vGpVutuoHd94MEMWY3R65kyOukw= - - Headers/VROStringUtil.h - - zcktGb4M41uwA2HxgAH99aDl4nk= - - Headers/VROSurface.h - - Zkn75wZCYxKy2Fwckj/HEOttIv8= - - Headers/VROTaskQueue.h - - 9ucmMZ0Zni91Or6GxlLNbPi9YA0= - - Headers/VROText.h - - 9tKwwsnT6AUYrLSQ8C30UTnjTYw= - - Headers/VROTexture.h - - dojYd4RTaZjTG06UGxhZsOXGjGk= - - Headers/VROTextureUtil.h - - yYehbvu6GOkgJ6tHYDaUPgDGeKI= - - Headers/VROThreadRestricted.h - - pNmbls8NMB/JrWDAryXDna+urN4= - - Headers/VROTime.h - - 2MsJZ8KNXtK9+seGabum2a3qP08= - - Headers/VROTimingFunction.h - - +5NEQNXVo+YuNZd259VpQzfGQCI= - - Headers/VROTimingFunctionBounce.h - - HGzEQQh5v3jBK6Ban2B2WXM3i7E= - - Headers/VROTimingFunctionCubicBezier.h - - 1Flsxc5h5xBkeOS4PSoLNAoEn7I= - - Headers/VROTimingFunctionEaseIn.h - - mDEfbF0o3jnipNWKHEIC/dqFX/g= - - Headers/VROTimingFunctionEaseInEaseOut.h - - dnx9tkVUZGHcMo9NOh6bENPFei4= - - Headers/VROTimingFunctionEaseOut.h - - MKTELfHYCfaFk4uidIvRZHPAGK4= - - Headers/VROTimingFunctionLinear.h - - jILNacVr08X8/Ds+4xw/bTjwj8A= - - Headers/VROTimingFunctionPowerDeceleration.h - - Uby0CF5912aOv9UjmSED7Vde+SM= - - Headers/VROTorusKnot.h - - 3evgiLh0IPSAmGFGg69J1+2HGaw= - - Headers/VROTransaction.h - - VxQP5K2/2SfuiOqyIFhQah0nCGQ= - - Headers/VROTransformConstraint.h - - A/rtkGOJSHP6YQSjRiXxnC3C0S8= - - Headers/VROTransformDelegate.h - - +RIlpJCdop1zt5QkIJoGwJGNxtY= - - Headers/VROTransformDelegateiOS.h - - v9RpvMFCxcQBaF4YC6asxutLZEg= - - Headers/VROTree.h - - oTAwNS8CVqfhAZ+et4LK+6h99TI= - - Headers/VROTriangle.h - - serJluuzKD8N1k8YZRw84roWb4k= - - Headers/VROTypeface.h - - h/NMRqV/ijsEjnVKQkSQZ51SUZs= - - Headers/VROTypefaceCollection.h - - vAxKoq4eaJRyAZUDCzZvCIyTRwg= - - Headers/VROUniform.h - - 0tf/zC6YdYYyvJ0OCdftoXQaouY= - - Headers/VROVector3f.h - - sQ3Z4USd6I2NVKbxrNXjpZ9UyL0= - - Headers/VROVector4f.h - - a5pNl0y4R8GAMiVCd9sdOvjQjic= - - Headers/VROVideoDelegate.h - - XnFlnap26FJOd+S8qq80s7l8ZMc= - - Headers/VROVideoDelegateInternal.h - - 0PpiehEjS+yTI27a9cHgStgfi68= - - Headers/VROVideoDelegateiOS.h - - kdzTsvxKkAm2aLTpxwXIuXhcrnE= - - Headers/VROVideoSurface.h - - rCfw2eCIlKwcmUU/dLUYiPv8aiw= - - Headers/VROVideoTexture.h - - P7koO72UIVeT8/OFmjw15hBlnV0= - - Headers/VROVideoTextureCache.h - - XvakXbLV1TwXj/xaprBP6LYuUJI= - - Headers/VROVideoTextureiOS.h - - ctUwnB4ugNDOmQMgnGJhS8swdQo= - - Headers/VROView.h - - aRa8jtXQzZZk/RtHrtMiqd6l4bA= - - Headers/VROViewAR.h - - I4RNoyLcLiSiineV/w0nPHR3teU= - - Headers/VROViewControllerGVR.h - - dTFaj6tUNmt6yNYDZzhly0YEN2g= - - Headers/VROViewGVR.h - - l4t17e1Z4FAts0fICnA0WQ88eEc= - - Headers/VROViewMetal.h - - rwH4JLUW6iAae441pmYWmx6ES68= - - Headers/VROViewRecorder.h - - Muu7lPivif/vdGPPQxo6WzcPhNc= - - Headers/VROViewScene.h - - dSkeFUK8xCAVKeGrwvhcmt1R2Ps= - - Headers/VROViewport.h - - 11Gvq2I3w5DCAg59+FnOlr2q914= - - Headers/VROVisionEngine.h - - +hsTW3orWtOKs/WJP/1JobTsEag= - - Headers/VROVisionModel.h - - +XkT63J0ip6gpNyxUmYlzp9pdvg= - - Headers/ViroKit.h - - KFsElWpJEeCRldl04gD1JyQOub4= - - Headers/gif_hash.h - - qcENcGTrBKTrBowPi9IrLkaicV0= - - Headers/gif_lib.h - - U/WA0Upe3L3XYwOrejyH6GdDUzw= - - Headers/gif_lib_private.h - - ekRtF3isgr3jNRxF3ZCe+5KT8x8= - - Headers/glm/CMakeLists.txt - - n20Yv55vtqRTFjekOLv59Hdn5IU= - - Headers/glm/common.hpp - - 2qvdMhsDiqic28qmBLobTlRKvak= - - Headers/glm/detail/_features.hpp - - boKnkaOgEtfkg+m+gKqkzT1YMFY= - - Headers/glm/detail/_fixes.hpp - - i57PubyVTmiFJW9Var+eTSyL3mM= - - Headers/glm/detail/_noise.hpp - - IyV2PeGpAnO4PmH2ZAD/83msNAw= - - Headers/glm/detail/_swizzle.hpp - - BOfPTBFJiWYKRgz/RiqtSCGTsB0= - - Headers/glm/detail/_swizzle_func.hpp - - Vjqv92gMvQq9nHacUnLwJmSjKvU= - - Headers/glm/detail/_vectorize.hpp - - XQ8eZBnptkN4fO5LKJZLZzxSOM4= - - Headers/glm/detail/dummy.cpp - - HQ9y1ceE5EIctfSegOR2qY0/f4E= - - Headers/glm/detail/func_common.hpp - - TINZYMtUZmwSUrOEuEKRI/4ayW8= - - Headers/glm/detail/func_common.inl - - 92Iltl4FELA13m+/94J9f2hYNaM= - - Headers/glm/detail/func_common_simd.inl - - WCsNiTRwglLGkF+/3o95YKTD0+Q= - - Headers/glm/detail/func_exponential.hpp - - Ht04yt7W4NnImMtSZ2Sml/5CyOc= - - Headers/glm/detail/func_exponential.inl - - 8uOsYbz5IUQ9GlK5oZEpt+33lx0= - - Headers/glm/detail/func_exponential_simd.inl - - T5qdcE38h8v+KYqF9cjDyYszOX0= - - Headers/glm/detail/func_geometric.hpp - - n8soh36b09rhVbet+gTLS9ZP60A= - - Headers/glm/detail/func_geometric.inl - - TzvsTDiql+1aSb6PMvFXGhm7duI= - - Headers/glm/detail/func_geometric_simd.inl - - qETcwF/FqOVp8fkJE5kDVfQjsDo= - - Headers/glm/detail/func_integer.hpp - - GDw4tH/J+g66h58TFJdc/03D1g0= - - Headers/glm/detail/func_integer.inl - - O4WB/PW0pIRh28IdMmalp5tRJNk= - - Headers/glm/detail/func_integer_simd.inl - - QMz4stzTXocnEpeIm0VKPzORhOg= - - Headers/glm/detail/func_matrix.hpp - - dDc6gLBStm9yJUwlu/rCIvLtm4o= - - Headers/glm/detail/func_matrix.inl - - vzoIsrftv7uQppUhivMXwOs9e74= - - Headers/glm/detail/func_matrix_simd.inl - - uB6Wq58LnzCZewwt/7PCejrlyIU= - - Headers/glm/detail/func_packing.hpp - - /Ez5jeEmqIr8p0Yd77IihhEO2X4= - - Headers/glm/detail/func_packing.inl - - 41PP+G10YS07pToRQ8ITEfvZVVY= - - Headers/glm/detail/func_packing_simd.inl - - hZ3I83eB6K/Rio+xVvipAWvvBm8= - - Headers/glm/detail/func_trigonometric.hpp - - Cq5w3I4nd28Uw3UPbEv1dByBEtw= - - Headers/glm/detail/func_trigonometric.inl - - zpKvHgfN6sq4fTvlNWG4pAZEdKg= - - Headers/glm/detail/func_trigonometric_simd.inl - - 2jmj7l5rSw0yVb/vlWAYkK/YBwk= - - Headers/glm/detail/func_vector_relational.hpp - - +p0L3cKGZDTqFWpn88TAl6x1pdo= - - Headers/glm/detail/func_vector_relational.inl - - NYsI33GjdZ1uIFOUOb9xVlm/NK8= - - Headers/glm/detail/func_vector_relational_simd.inl - - HkynrZIWQGYz8EUgIEYJrRktBqQ= - - Headers/glm/detail/glm.cpp - - rPR2dd+Fv77YC4hn9A7qQmb36G8= - - Headers/glm/detail/precision.hpp - - QkrWpgwgUrn69kmQfGVyjvk1rNw= - - Headers/glm/detail/setup.hpp - - N8dhQIni8ff4tTC9VB5GpJFsJBE= - - Headers/glm/detail/type_float.hpp - - T2zNThrL5tzJv82Mr1oLm8bq1c8= - - Headers/glm/detail/type_gentype.hpp - - +Yv1tuO8I1ejOnOr2asWGHhiZqA= - - Headers/glm/detail/type_gentype.inl - - 9WURNRmyyS9joS43AbNz69h7oSc= - - Headers/glm/detail/type_half.hpp - - lpThaGHnOquGYgckEqH3lZ5QDHw= - - Headers/glm/detail/type_half.inl - - lF/UuVD6z5TUqZ4+9YRFOLLJ898= - - Headers/glm/detail/type_int.hpp - - EsLdFZKWPfO4Igk4cAQjpJT3NLY= - - Headers/glm/detail/type_mat.hpp - - bGuRqibLhk91ommCa0FUGPSoGrw= - - Headers/glm/detail/type_mat.inl - - YYh22fJnZgacFJWUKbX/XoRWMfE= - - Headers/glm/detail/type_mat2x2.hpp - - TpeSN3jjEgfcUPV42pm0cGMUkbk= - - Headers/glm/detail/type_mat2x2.inl - - 27CX+oPpOoYY/PixUy86hYKoTWY= - - Headers/glm/detail/type_mat2x3.hpp - - vC4YuPS+u7zUhalDZ2PvgfT92dM= - - Headers/glm/detail/type_mat2x3.inl - - dlhHFphUMP4gWP/BH0WD1j7qdQM= - - Headers/glm/detail/type_mat2x4.hpp - - tHCeF2ElpYCIMs+SZuk4hqc10lw= - - Headers/glm/detail/type_mat2x4.inl - - uj78Nx4VKxxxdII7ahAMSYFzhGs= - - Headers/glm/detail/type_mat3x2.hpp - - nYzZA0V8g9DmIbmQeaPftD+dy0w= - - Headers/glm/detail/type_mat3x2.inl - - yVx6XFQ61QTADfY4uNcvNrUP2o4= - - Headers/glm/detail/type_mat3x3.hpp - - NXCfrnM83lkiqiaHJ6NqMlmNGCg= - - Headers/glm/detail/type_mat3x3.inl - - +CReYrRXLuve8oIxPvFkDmyw1v4= - - Headers/glm/detail/type_mat3x4.hpp - - OIpkT7UR64LRR2OmXI6o5/oVhNU= - - Headers/glm/detail/type_mat3x4.inl - - bPmPoYYsYFfXTGEhQNBz2nMSli4= - - Headers/glm/detail/type_mat4x2.hpp - - /1ELQFYHwr4EEkuUcGecdNYSJ2o= - - Headers/glm/detail/type_mat4x2.inl - - 24xrMcuSzKL2ojb1p6FE89ghLhI= - - Headers/glm/detail/type_mat4x3.hpp - - s3dxr7DcpbMEo1mEgDQuqbPJD40= - - Headers/glm/detail/type_mat4x3.inl - - oyCcv7BNGzG+ZMhS/FYmaPadjF8= - - Headers/glm/detail/type_mat4x4.hpp - - nEuruftHTigtDRqjNhPpaF/noYo= - - Headers/glm/detail/type_mat4x4.inl - - LyJwFyg6sAC4xjlSOK8aJCf+Du8= - - Headers/glm/detail/type_mat4x4_simd.inl - - FtUTa0k+7BpyQAwDGBZGtSOa8lI= - - Headers/glm/detail/type_vec.hpp - - rPSWy5Msv9P1vSogWTTrffgWM9I= - - Headers/glm/detail/type_vec.inl - - trRK6qh5PoGx1c1E+xDewhOQzlw= - - Headers/glm/detail/type_vec1.hpp - - j7SSCq7qlAfIFkM+E1OVfstCx+k= - - Headers/glm/detail/type_vec1.inl - - KTX/8gyRAuffK8+tacEPOtDtjYw= - - Headers/glm/detail/type_vec2.hpp - - 323GbVfGWpElo/Fq4lpgHaQ9EEQ= - - Headers/glm/detail/type_vec2.inl - - Uk1ZuqeRD71VnvO3M+WPJnIuQPc= - - Headers/glm/detail/type_vec3.hpp - - 8pEmWIYQM7KC0NIsw9A6YYE+FJU= - - Headers/glm/detail/type_vec3.inl - - q0I+OaFqb6C1Tk5GTP+jz0t/q2g= - - Headers/glm/detail/type_vec4.hpp - - 3r4L3t6iFR/HNaVkbs1xygqg0JY= - - Headers/glm/detail/type_vec4.inl - - QftYgwdLMv4jjGt6wcWuv3EPX50= - - Headers/glm/detail/type_vec4_simd.inl - - 64g9QybhHhHeYeX95pcKjPndjHc= - - Headers/glm/exponential.hpp - - CoZi/mwDoaj8Yn1axlpYZXYFPEo= - - Headers/glm/ext.hpp - - 3Zvr4S/+3Jbk5xuFN2YAqJ07w/c= - - Headers/glm/fwd.hpp - - 6Diza5adx7dxjJ6q8SVJ71vsrEE= - - Headers/glm/geometric.hpp - - RWF9oFlYaId1FZX9fPQ1h7FFDtY= - - Headers/glm/glm.hpp - - 8q5sn+8Ixc/VAkRoVz1aVGfnjM4= - - Headers/glm/gtc/bitfield.hpp - - /sTDwY3z1mL13Nbw0rg+X4CV04s= - - Headers/glm/gtc/bitfield.inl - - CY+0u7qODCQCgk9qfv9ulTBT0Xc= - - Headers/glm/gtc/color_encoding.inl - - sh6TIGwKSTWf/071dRicOMwpDKk= - - Headers/glm/gtc/color_space.hpp - - CfgMmgRrhKepAWJ6ddXxaOsbg/U= - - Headers/glm/gtc/color_space.inl - - Jwb2rIZbvZXJSJOvjtqaJuEFalE= - - Headers/glm/gtc/constants.hpp - - 6a1Fh+XpXqhoe58jQHjru6SbR2I= - - Headers/glm/gtc/constants.inl - - JQHQsT0TuRWEx5b1yPG3BSX4+bs= - - Headers/glm/gtc/epsilon.hpp - - kHBQMSjfe37KPVsfoVu0sn7R8k8= - - Headers/glm/gtc/epsilon.inl - - W2BbmZTuJ3Lvk8lZV7nrxFQnExI= - - Headers/glm/gtc/functions.hpp - - 8cCOrqDITwYLyV50flmLcte2MMo= - - Headers/glm/gtc/functions.inl - - tknaoQBONIz/tFETSPGID7eBEpQ= - - Headers/glm/gtc/integer.hpp - - kYH9BwmwVt56UAx2Mt6su+Bd5O4= - - Headers/glm/gtc/integer.inl - - LTwyG1AML9+31n+vadL/la6M5Rg= - - Headers/glm/gtc/matrix_access.hpp - - vktUkQGtslUUMZtvgQP4PI0/+1s= - - Headers/glm/gtc/matrix_access.inl - - yjsD08wtxk8MmlIcdw/bZVLCaTw= - - Headers/glm/gtc/matrix_integer.hpp - - Y79LAgkDRizb3QBaKab2YLkjuDM= - - Headers/glm/gtc/matrix_inverse.hpp - - xaYJHIeY6zIlIDMivTK4sKnnL5s= - - Headers/glm/gtc/matrix_inverse.inl - - FTHJXuoUbnsqcG+cxFHejh1ma9Q= - - Headers/glm/gtc/matrix_transform.hpp - - fZfpUTM4S1W4WKRxjqeyDrvG66Q= - - Headers/glm/gtc/matrix_transform.inl - - BkWwIMixxL6DEn80IID3ObYvFIE= - - Headers/glm/gtc/noise.hpp - - /vM+k2sNisK8unEwXORcVPUVQHQ= - - Headers/glm/gtc/noise.inl - - sAj8tQ+5swpgcCZXrcrtbHO/CDM= - - Headers/glm/gtc/packing.hpp - - rk0JcDILSgt5BNNlDZ40Nr8NEjI= - - Headers/glm/gtc/packing.inl - - dTNU7VjrjdUFwhsEW6+aDx5My7c= - - Headers/glm/gtc/quaternion.hpp - - z3v53nWbvJ3omg7toz0unrqz9KM= - - Headers/glm/gtc/quaternion.inl - - JZzj77yTFHod5QtkYIZuCICKneg= - - Headers/glm/gtc/quaternion_simd.inl - - xQL9miNmQL4lJkqOxSUjNzS5m+4= - - Headers/glm/gtc/random.hpp - - 5a4svIlOJF3Q/osffPQQ5Ct8lCI= - - Headers/glm/gtc/random.inl - - I294peBC4wwwbdr3Zvug9oR1Lb4= - - Headers/glm/gtc/reciprocal.hpp - - BusgdIdDoYAPZ85IZlOsR+TLnL8= - - Headers/glm/gtc/reciprocal.inl - - IXz8lH5H9NfhqTPtJ2t15RE8b4E= - - Headers/glm/gtc/round.hpp - - 4lpF3YsztoOo5ldBhyjPGXLmEwA= - - Headers/glm/gtc/round.inl - - DaOeuGFGhUo26TwmCc4yrUyoCck= - - Headers/glm/gtc/type_aligned.hpp - - 3OkmM8plgZhG8zjTGFVM0EGKU2o= - - Headers/glm/gtc/type_precision.hpp - - EUX62/anW42C6xNEh0ARTbqPUpk= - - Headers/glm/gtc/type_precision.inl - - yirF9vl9G0CLpcekjDCcSeCLpcI= - - Headers/glm/gtc/type_ptr.hpp - - r7cY6NEYwh4cfo1BN/R2oGEuxtQ= - - Headers/glm/gtc/type_ptr.inl - - gaW7ksVRvfLaunm7RmNGQvvi39Q= - - Headers/glm/gtc/ulp.hpp - - P+CcBb+RZVlHYWzZXEdXYa1nDNs= - - Headers/glm/gtc/ulp.inl - - N+qR5Irm8nHCc7TENmWrak7hNWQ= - - Headers/glm/gtc/vec1.hpp - - hSqWdaq1f4knfdjOynH7zB0DOaI= - - Headers/glm/gtc/vec1.inl - - QAmFACA1VCnp8m8IWr5+s5gY1Uw= - - Headers/glm/gtx/associated_min_max.hpp - - fXyC+rBYs1efJt4HGfYh3+C4eNQ= - - Headers/glm/gtx/associated_min_max.inl - - f6rCzL1oWBiqUjaNl5JdJha20Ms= - - Headers/glm/gtx/bit.hpp - - dfiRXENxUE6VSHXbhn9DUutK+Pc= - - Headers/glm/gtx/bit.inl - - IuI4Ss+vUsLdErJFSMfVLmV9TKI= - - Headers/glm/gtx/closest_point.hpp - - KEgJ0RRE5bxpymxx5cp09lHSabw= - - Headers/glm/gtx/closest_point.inl - - 5Y9snOJiiI5Epy382UZ5q3lMOFY= - - Headers/glm/gtx/color_space.hpp - - qrFFxuvk6QwlZeXe4OwZnNUl/aY= - - Headers/glm/gtx/color_space.inl - - WOsjxhfzDD2rqiBCqt/93IgZANk= - - Headers/glm/gtx/color_space_YCoCg.hpp - - udc09heQw9HmhUYZDcTxgJ8RGS8= - - Headers/glm/gtx/color_space_YCoCg.inl - - 3JWx755YLHhsnzWLUul2NMmXTRk= - - Headers/glm/gtx/common.hpp - - vZeuhWgYuJVdsjdsCLhXoXzE95M= - - Headers/glm/gtx/common.inl - - JMNqcF5p2Pkrp4gosOGaGM8873E= - - Headers/glm/gtx/compatibility.hpp - - 1TIwDooCa2geTsWxW9ZCZVdkOCY= - - Headers/glm/gtx/compatibility.inl - - ejprKQSpqeCTrkmZzouV8/wtfOo= - - Headers/glm/gtx/component_wise.hpp - - HpZs++RvZegufVgCN803ND3YI/0= - - Headers/glm/gtx/component_wise.inl - - ehXstCKd3MoBmk2otrfU8Pgw+e4= - - Headers/glm/gtx/dual_quaternion.hpp - - ueeMd6b0omyoQ0AECSUIMvFImsg= - - Headers/glm/gtx/dual_quaternion.inl - - +vsn2hVXsT1l9uJ4IS3tcneHtVk= - - Headers/glm/gtx/euler_angles.hpp - - qgQEO35jBwOO9BClChxtkENp2tg= - - Headers/glm/gtx/euler_angles.inl - - HqlzU90pWML/eEZ3tya/+0N7WKI= - - Headers/glm/gtx/extend.hpp - - UH0Cne9I7PssdQXJuw5kFcGY/EY= - - Headers/glm/gtx/extend.inl - - jiys5NYozDzkWgo9zf8A52kDAOs= - - Headers/glm/gtx/extended_min_max.hpp - - ZWIJ3Gt98uO4bG21+ae1o7xJwiM= - - Headers/glm/gtx/extended_min_max.inl - - X+9dcVrvmYObhgL5UIRyXHmkahs= - - Headers/glm/gtx/fast_exponential.hpp - - oWQTS2KeH7FXsz75DcsS9Is8wbE= - - Headers/glm/gtx/fast_exponential.inl - - zAKp27LXgDv+PK1Ff+8NeGaO3Tk= - - Headers/glm/gtx/fast_square_root.hpp - - zhAeELXlkQytrka1/Flc2GR31n4= - - Headers/glm/gtx/fast_square_root.inl - - ht4ntJ9/YC+yeSyJutZqXC9PfNw= - - Headers/glm/gtx/fast_trigonometry.hpp - - MX3uAMWO5BGmLGj6Jl6KmzkEhI0= - - Headers/glm/gtx/fast_trigonometry.inl - - uGqVX5rffHcf/A6ryOR54PqMd/E= - - Headers/glm/gtx/float_notmalize.inl - - GgdHSAwnJBRHB/ZpTapn+7P0lek= - - Headers/glm/gtx/gradient_paint.hpp - - wtbtdLG6yjZItrGf6KkRAOBiROI= - - Headers/glm/gtx/gradient_paint.inl - - Mv/w5ejSj0XxW/bu7WLEKHGeOQc= - - Headers/glm/gtx/handed_coordinate_space.hpp - - M18zhR4RiGZGe3A7mmbrG9v2CAo= - - Headers/glm/gtx/handed_coordinate_space.inl - - lq1qQkBfyLf2Ch4diK2tFIbtfHI= - - Headers/glm/gtx/hash.hpp - - hxKaysy2gDbgmTF/SMVP4OnOL0M= - - Headers/glm/gtx/hash.inl - - CtcaQduC3D2ZQpgEOLigZA37kQk= - - Headers/glm/gtx/integer.hpp - - jlOoigwzJf1iD7HDkQxKIlt7uv4= - - Headers/glm/gtx/integer.inl - - FOIxUJFmOw3w/BjSHOhP04cFOXE= - - Headers/glm/gtx/intersect.hpp - - Ok9EVEgdEcSV9ZsKtTi5r80/UhY= - - Headers/glm/gtx/intersect.inl - - hwVHIzWk3X4LfB5E1CO/RiH1fRg= - - Headers/glm/gtx/io.hpp - - POGjOqibKARARlEQoncx9iiaH2g= - - Headers/glm/gtx/io.inl - - SZdKH9vDNjJsslXSwcGS4L0FXD4= - - Headers/glm/gtx/log_base.hpp - - 1G2KBd/xuNZuES4cbbJ3J6YwgI8= - - Headers/glm/gtx/log_base.inl - - sky9cHbjAYuUmlDdRfAbY/Zmvec= - - Headers/glm/gtx/matrix_cross_product.hpp - - Ir1sbY7YppTTfgJqBmknmN2j79k= - - Headers/glm/gtx/matrix_cross_product.inl - - M4oz2YXoUkNCumIcE0+RE6FeqgY= - - Headers/glm/gtx/matrix_decompose.hpp - - v9mvMoM58y+TPYwogHaudad7ZtM= - - Headers/glm/gtx/matrix_decompose.inl - - aHB6hnMAPmiGachCP/cdcChuxuE= - - Headers/glm/gtx/matrix_interpolation.hpp - - BgLkiBSgfj0izCGEuqByMlIygnU= - - Headers/glm/gtx/matrix_interpolation.inl - - gZSfjc9ngpf9zEo1gy77FGASRNs= - - Headers/glm/gtx/matrix_major_storage.hpp - - uW/XAqQWz2HC29JXlQJL68EQ7cU= - - Headers/glm/gtx/matrix_major_storage.inl - - EFIcj6V9sXg8nt9jENtXRLDzfF4= - - Headers/glm/gtx/matrix_operation.hpp - - CrDAKJocOr//E4aBRY43XyLi0zU= - - Headers/glm/gtx/matrix_operation.inl - - v2S8y7e7qkzx0kHf850Zr37osng= - - Headers/glm/gtx/matrix_query.hpp - - 30wR3HPMNGSnbuXlcJW/230DPgo= - - Headers/glm/gtx/matrix_query.inl - - GWQe+SbMr6o94y1Qp6r/q7lbgD0= - - Headers/glm/gtx/matrix_transform_2d.hpp - - nsU/ILl+fo95F4xz5KR3J/hbwpo= - - Headers/glm/gtx/matrix_transform_2d.inl - - YeGiJWtFphgiyGNUa1G6YLbs+mc= - - Headers/glm/gtx/mixed_product.hpp - - M/XYv02ZXsjEtQ2Rx6KBo4L+lcE= - - Headers/glm/gtx/mixed_product.inl - - TH2N19CK10bPUu/wPcNYFXWUn64= - - Headers/glm/gtx/norm.hpp - - n9sVefwuYHcFoGEj2aiGXOs1saA= - - Headers/glm/gtx/norm.inl - - e9cPgtVCNCSVJyyi1EbWdJ5WfvY= - - Headers/glm/gtx/normal.hpp - - CflEIoPEARWKsDQDSw0V5ngfCeE= - - Headers/glm/gtx/normal.inl - - hVxdXx/Tc9FKWt0Oa/xMfpIaJSw= - - Headers/glm/gtx/normalize_dot.hpp - - emorQs7BvvdW2905FyVFAqyeYRE= - - Headers/glm/gtx/normalize_dot.inl - - gA8xTv1vwOPxmhr2r224Otm9vXo= - - Headers/glm/gtx/number_precision.hpp - - GCd3+jyzd3sHyjt3s1kZmHtxwgE= - - Headers/glm/gtx/number_precision.inl - - myZq9u38lOrVN8nPh5PSQhICq1U= - - Headers/glm/gtx/optimum_pow.hpp - - HIkq5BnzSBWmPCNocbYgzJxxpaM= - - Headers/glm/gtx/optimum_pow.inl - - jlJFCh0lKOnNhWnwFR2Z7MiKPYU= - - Headers/glm/gtx/orthonormalize.hpp - - 6KyQ2NzZx623TUnbtIUroN/KCso= - - Headers/glm/gtx/orthonormalize.inl - - 7j1ej1HNTRAUGAYYctDLddwJiE0= - - Headers/glm/gtx/perpendicular.hpp - - 9KhfopHUla5v7ZYvy37dpx2RzgA= - - Headers/glm/gtx/perpendicular.inl - - 7cUFH+WJ/H+iDpo//zHelg8c4Hs= - - Headers/glm/gtx/polar_coordinates.hpp - - ZlZHtQ/C+gr5tmAivvAU9Vujhn4= - - Headers/glm/gtx/polar_coordinates.inl - - +kz4c45AJXBgyemiY+uuOJh2vik= - - Headers/glm/gtx/projection.hpp - - gJgG22czGn9NeDloInV9Mygatgo= - - Headers/glm/gtx/projection.inl - - FBMSVTcQrTwDIOI1SOAQsd5LBlc= - - Headers/glm/gtx/quaternion.hpp - - NWjN9XAmdulxigJEmYtGO8b+JBw= - - Headers/glm/gtx/quaternion.inl - - vGKtSiP3+LdgG4O1yYD1JVfaFlw= - - Headers/glm/gtx/range.hpp - - Zl0hrJ1KeAfVFHKT7640NUg+nxQ= - - Headers/glm/gtx/raw_data.hpp - - iBjGzMypC5767CwUg0BNpadciYE= - - Headers/glm/gtx/raw_data.inl - - c00Sdgx/YFN4DSyjViwRHZV/JHk= - - Headers/glm/gtx/rotate_normalized_axis.hpp - - cjU2ELoh1h2LBaYvAahxV7ct2Cw= - - Headers/glm/gtx/rotate_normalized_axis.inl - - x+PR6wRDkkInzYZ9fKo1OaGtkcw= - - Headers/glm/gtx/rotate_vector.hpp - - 9gedrVn2wqM7gGRx4T4Eb/m3Vpw= - - Headers/glm/gtx/rotate_vector.inl - - 5ZTE5Sm8aA8kVJp+D4rohbrP/YA= - - Headers/glm/gtx/scalar_multiplication.hpp - - v5pgAw+mMJg8skJOi7gWHwbvrxE= - - Headers/glm/gtx/scalar_relational.hpp - - lw6f8a1VmQ2AtXaK8Hk9y7Es3UI= - - Headers/glm/gtx/scalar_relational.inl - - tDMJdcj/RLgleUH+cW5FPjtwO9M= - - Headers/glm/gtx/spline.hpp - - WiwQiWYW0tbvShAorGAVdO4k5Is= - - Headers/glm/gtx/spline.inl - - XmoSjwhtH+lAkc3RY21ofmC9Lr0= - - Headers/glm/gtx/std_based_type.hpp - - 5sCJcgPHPhLEDGF2vWg4fHIxbHI= - - Headers/glm/gtx/std_based_type.inl - - XtvEUckGVylbc7hT/8d0QbL00U8= - - Headers/glm/gtx/string_cast.hpp - - zMRud/tkllrbPXntAJKQ5ZEjfWY= - - Headers/glm/gtx/string_cast.inl - - 76jKk939fviLeBi1p3ulp8dvQrE= - - Headers/glm/gtx/transform.hpp - - 3yOJsigU+JG/wd22ulu/Tg3/Q90= - - Headers/glm/gtx/transform.inl - - yJenP/AMZhWIVJEm7GtUjgsuvL4= - - Headers/glm/gtx/transform2.hpp - - umV11DsLL3VudNDtEw3IviN8+xU= - - Headers/glm/gtx/transform2.inl - - rlHZ2qpOAqw6TCPfvUwicVfe9Cc= - - Headers/glm/gtx/type_aligned.hpp - - jOhhu6dl0AqoZ1ZZ9i66ETcDZPY= - - Headers/glm/gtx/type_aligned.inl - - JHWxhKeBZW0IFSHlgCnbHimbWcM= - - Headers/glm/gtx/type_trait.hpp - - Ev6v2+PAWoHTL2KE+3GXAVLLwVw= - - Headers/glm/gtx/type_trait.inl - - 2jmj7l5rSw0yVb/vlWAYkK/YBwk= - - Headers/glm/gtx/vector_angle.hpp - - Vn5Fqne9tIVK32lDkq66JGI64qI= - - Headers/glm/gtx/vector_angle.inl - - VnUNEmPWcQdiv6bU8B11HZyL52w= - - Headers/glm/gtx/vector_query.hpp - - 9vQ+ZTb+HuNfpl2TS/NuTdp5ycA= - - Headers/glm/gtx/vector_query.inl - - sfLoWdnHWcg0esc89sKqQ4MRHwo= - - Headers/glm/gtx/wrap.hpp - - ulX2YAxOMba2lCVF0lksYjRfDQ4= - - Headers/glm/gtx/wrap.inl - - YGjSzCZQNZ/2yKpjIm4hkAVtI+E= - - Headers/glm/integer.hpp - - fDUnCCzJIx1l3yE1rwYtTkbCxXk= - - Headers/glm/mat2x2.hpp - - VPqsUnW5yfl/cn1558XBF/Jy6Uk= - - Headers/glm/mat2x3.hpp - - tEOY1llVWdSg1kS0HmEhF+qCxxs= - - Headers/glm/mat2x4.hpp - - 1veqeHRUcEc/f0VL6tNwrmW/9Jk= - - Headers/glm/mat3x2.hpp - - /OWwmt+9x7QUpFimhlrRtTf56q0= - - Headers/glm/mat3x3.hpp - - EwHZXOjtRcVMuaMKtk4YBalojqE= - - Headers/glm/mat3x4.hpp - - rYLB9qQk65Z8AyT78zXu+QSM7uc= - - Headers/glm/mat4x2.hpp - - Vv7qWsJDlkuxaMYHGIBp0sxZMdE= - - Headers/glm/mat4x3.hpp - - h1VI6eIqG+eM6Ip0A0NXDu8KPIA= - - Headers/glm/mat4x4.hpp - - jQ9PkMH0wZBlxl0jL/HH46q6F6g= - - Headers/glm/matrix.hpp - - 14dmzuV17eugK+wBnDv1OqFUxZ8= - - Headers/glm/packing.hpp - - P+OXApK0uqXE9vUq0i8fUUxEKBc= - - Headers/glm/simd/exponential.h - - F3tx9nE/BWdIelpucJSEnABoBQg= - - Headers/glm/simd/geometric.h - - U8IIoN4/8kZAlao9cCKXP48TClU= - - Headers/glm/simd/integer.h - - UmnLqAfyVtvghyqrZ13cKg8CyJc= - - Headers/glm/simd/matrix.h - - StIz2kdymrXmvYRaidEdTWyDKPk= - - Headers/glm/simd/packing.h - - qUPv99nQlr0Er9KaVAuf34m7MJs= - - Headers/glm/simd/platform.h - - WjtIzCx/SUt3uaAQNSPbCD+Ym4w= - - Headers/glm/simd/simd_common.h - - BxoF5Xb/NroKyHIl1Z3+m8IGwMg= - - Headers/glm/simd/trigonometric.h - - kiz0CT2hfqdycbkdAJxEqOE5QVs= - - Headers/glm/simd/vector_relational.h - - 2k6Ue2ZX+qRJedZ9u3Eul7uXh4M= - - Headers/glm/trigonometric.hpp - - H1eg8NlU5vJJgAXf8pUeV88wxzs= - - Headers/glm/vec2.hpp - - Ipt5byZRjgjjs9OI/4fjEAoeR/E= - - Headers/glm/vec3.hpp - - UV0kbsFCQEN3ghGdifqEvwyZDsg= - - Headers/glm/vec4.hpp - - GNvK9a9nBLg0IXXSJXL+0M5sdWo= - - Headers/glm/vector_relational.hpp - - rXzVsX60oVfg+Br04yQrBydDS5g= - - Headers/optional.hpp - - UQWAPvqO3lZMCgspf0O5G68sNpA= - - Headers/tiny_obj_loader.h - - fNagYI/VfcsFrtF3VvrdAnK6r8M= - - Info.plist - - 0sSgSRy2hdFjqVfi0KbmmxTv188= - - MaterialRobotoFontLoader.bundle/Roboto-Black.ttf - - Vw7l8OeQVxE+rRXdeJYaZIu/zmA= - - MaterialRobotoFontLoader.bundle/Roboto-BlackItalic.ttf - - 7On5eW3hrxZSJdQY9rwWcK72O5Q= - - MaterialRobotoFontLoader.bundle/Roboto-Bold.ttf - - yZXHuAgmdHB5GqY3C1OT7pQiyAc= - - MaterialRobotoFontLoader.bundle/Roboto-BoldItalic.ttf - - k8ksE8oYji45zrOHJQP07TKLwFc= - - MaterialRobotoFontLoader.bundle/Roboto-Italic.ttf - - bzcO65GKbBzbsKLqlYHQTyLC4S4= - - MaterialRobotoFontLoader.bundle/Roboto-Light.ttf - - BhTqgM8ZTLlU0h4B+IOj6DThkxw= - - MaterialRobotoFontLoader.bundle/Roboto-LightItalic.ttf - - azDRmFM0CX3gumYS//3v1IizCII= - - MaterialRobotoFontLoader.bundle/Roboto-Medium.ttf - - QjpSo27gUwDU3v1xfJNuEgt1WXU= - - MaterialRobotoFontLoader.bundle/Roboto-MediumItalic.ttf - - 1FzjnQH4t5tfrBgLc0OG7phQdRk= - - MaterialRobotoFontLoader.bundle/Roboto-Regular.ttf - - Oxqvi5Nc1fJpg1LmIClU5RE3ass= - - MaterialRobotoFontLoader.bundle/Roboto-Thin.ttf - - ev71aAmVntm3s56QGam2e9M0NYE= - - MaterialRobotoFontLoader.bundle/Roboto-ThinItalic.ttf - - fQgVc2LvXWArp3JRlKRBnK7v0fw= - - Modules/module.modulemap - - AmzopnVptSbPjzszrX2UEkL+YhI= - - VROPolygon.h - - IiYpOSNZ7aF0g23Gs0hdTxLluxE= - - blank.png - - 2zF/fVHZCklks1GlonZyXK2nLXA= - - bodymesh.mlmodelc/coremldata.bin - - oytokLT4r34jW/RAIq6K3pj9c2U= - - bodymesh.mlmodelc/model.espresso.net - - zM/c62cw/OmQTuyCaB8K1KuBGww= - - bodymesh.mlmodelc/model.espresso.shape - - j6C6opwcKRzHMK3v535681Zrp7k= - - bodymesh.mlmodelc/model.espresso.weights - - Hv7jkWAoboCxJgtHOe/g4Uio7XA= - - bodymesh.mlmodelc/model/coremldata.bin - - t2QsrTKfM0V7EitGUAjV6Fhw99E= - - bodymesh.mlmodelc/neural_network_optionals/coremldata.bin - - 3oqEe/+MND1puFOiFebud17y75Y= - - brdf_fsh.glsl - - 1J2Heg4cN8tVBhdSAfNCYmeAgB8= - - brdf_vsh.glsl - - 9wjQqdI4Pd0M9Q9C/orS49x22Yk= - - constant_fsh.glsl - - IYOObRJJrAMb1t40JaHVn488GBc= - - constant_fsh_adreno.glsl - - M2SAm1EYv7iCbH2gqhqMDIsUTAw= - - constant_functions_fsh.glsl - - uyo/s+xZ5T5LN+wNQLTzAL9HuHs= - - constant_functions_fsh_adreno.glsl - - avXrPSjSjDIK5hzwdnvM2II7kKA= - - constant_q_fsh.glsl - - yDSyPYWuz11IWGshsx2VSnVucRc= - - constant_q_fsh_adreno.glsl - - 6ii+kdfSMTfDI6Re4kPJWLs13rk= - - equirect_to_cube_fsh.glsl - - Cvg9P003xAGMA9KQNbMykn4rKt4= - - equirect_to_cube_vsh.glsl - - uUK/NMEWuPt7ztgL/ob6JUrs+cE= - - hourglass_2_1.mlmodelc/coremldata.bin - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hourglass_2_1.mlmodelc/model.espresso.net - - kCkGi+fKYgL5r2wPoG+DBzFO0V8= - - hourglass_2_1.mlmodelc/model.espresso.shape - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hourglass_2_1.mlmodelc/model.espresso.weights - - FB5LJOTuHRKV+OPsWnw1ya9X084= - - hourglass_2_1.mlmodelc/model/coremldata.bin - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hourglass_2_1.mlmodelc/neural_network_optionals/coremldata.bin - - 3oqEe/+MND1puFOiFebud17y75Y= - - hourglass_2_1_ds_t.mlmodelc/coremldata.bin - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hourglass_2_1_ds_t.mlmodelc/model.espresso.net - - SHQ/R5zexqpBWljkqcadlcmCB90= - - hourglass_2_1_ds_t.mlmodelc/model.espresso.shape - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hourglass_2_1_ds_t.mlmodelc/model.espresso.weights - - 5iWq87elaYdhd3S/olb+UMhPlK0= - - hourglass_2_1_ds_t.mlmodelc/model/coremldata.bin - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hourglass_2_1_ds_t.mlmodelc/neural_network_optionals/coremldata.bin - - 3oqEe/+MND1puFOiFebud17y75Y= - - hourglass_2_1_t.mlmodelc/coremldata.bin - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hourglass_2_1_t.mlmodelc/model.espresso.net - - kCkGi+fKYgL5r2wPoG+DBzFO0V8= - - hourglass_2_1_t.mlmodelc/model.espresso.shape - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hourglass_2_1_t.mlmodelc/model.espresso.weights - - 2/4MrDfiURpvbO8c7jK/WoRSeIg= - - hourglass_2_1_t.mlmodelc/model/coremldata.bin - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hourglass_2_1_t.mlmodelc/neural_network_optionals/coremldata.bin - - 3oqEe/+MND1puFOiFebud17y75Y= - - image_fsh.glsl - - fxjVZE+CEkKBoz0hxIu9Mu2EYpU= - - image_vsh.glsl - - tT5mTlpg0WsXqBXmKLwdVF2De+4= - - irradiance_convolution_fsh.glsl - - ceHkEHQadzQPAy+4kjbiXwN4d9s= - - irradiance_convolution_vsh.glsl - - uUK/NMEWuPt7ztgL/ob6JUrs+cE= - - lighting_general_functions_fsh.glsl - - TDdj7gFYX496o9Wai/r17qhysBQ= - - particles_fsh.glsl - - OHDxWWALxYa5XDl0lLEIhWEw3tA= - - particles_vsh.glsl - - rbjf8l9np5ESrK1m5eysjr9N+uQ= - - pbr_fsh.glsl - - znDgKelsHVvLZvafFw/PZNNuMNc= - - point_cloud.png - - 6iIOU0KZ2qaHAu8SQg/0TLwU5EM= - - prefilter_convolution_fsh.glsl - - Sn+PPelr34qFl5Yiqptt7VKqU8g= - - prefilter_convolution_vsh.glsl - - YFwuSIyfBD6M2hSC9vorUcK11n0= - - skinning_vsh.glsl - - 72fqVn0SmznCFaZxoYckZRT/51o= - - standard_fsh.glsl - - TE1HilHHlqCZleB5PHgSKyVqzco= - - standard_vsh.glsl - - M6tybziH02FVjCYOHQZ0e7H2rus= - - standard_vsh_adreno.glsl - - 9FMcwbqVdK5UId/Hskcymu+WIMs= - - surface_functions_fsh.glsl - - Je7gHqHn/0tVrmXguggoc3Oktwk= - - surface_functions_fsh_adreno.glsl - - m+kPcsWxwRa4BvQW0TanlyHk8Fw= - - test_uv.npy - - 69+126uupsE3aXLNqG/UtBOc5vQ= - - vbml_m_face_to_v.npy - - Pad3Y69rhm3DYLfRW/zN29sc8mg= - - vbml_m_texcoords.npy - - W07o/SJZRbOgKuP/y7XS0sDmPoI= - - vbml_m_uv_mask.npy - - jR3UkUOz7+r4V6ersm23RxLfLCc= - - vbml_m_v_to_vt.npy - - Lp5/DxzSwpYVJx9G3kZD+mDi1Xk= - - - files2 - - CardboardSDK.bundle/Info.plist - - hash - - 7IAIK8tPbyUbblavMdwkgwa4oeY= - - hash2 - - /4QyGiPgxtwWoK85onHWPyq0M1zsUQvtHll/jT/caa8= - - - CardboardSDK.bundle/ar.lproj/CardboardSDK.strings - - hash - - iI/v50w5rlwo/eLeBZqMKwnRk0M= - - hash2 - - ZGJTrA2BBmcThly8ZMEjXaunEL0mQ+R+PkNlFgoqBUQ= - - optional - - - CardboardSDK.bundle/arrowRight.png - - hash - - DHtbTaoGw+L0h7aoEC15TIepH/A= - - hash2 - - mDHVTxbxTKKUKNzf8I+a4VtANyaZi4BnuawQGDpSrvI= - - - CardboardSDK.bundle/ca.lproj/CardboardSDK.strings - - hash - - vGEqM6koBhFkcgN17Jeiqjjn+nI= - - hash2 - - hpto9SLuOJmNHb+gFtpRmVY+yrLpKgBSY+6qCt51Xl4= - - optional - - - CardboardSDK.bundle/cardboardLogotype.png - - hash - - SxKNfyHZddkajL2wJuhGQ74dXIE= - - hash2 - - 6a/FcKOdbrORU4/ezNq9BQDrKIEgkm+Rbe3NGo1w2a8= - - - CardboardSDK.bundle/continueButton.png - - hash - - 6/FygOhoBqJp5xevLWaYHxSn8Ik= - - hash2 - - YWBVU8/nX2eYuHnln/YP4Z08j791czdng3zxK3pwTqQ= - - - CardboardSDK.bundle/cs.lproj/CardboardSDK.strings - - hash - - sl7aydrqOi7ae6jKKGDOW/gw9yM= - - hash2 - - Bx3i3mKXXp14Vrw/BMYd48atpQkNF8Odnhq4snXdl1g= - - optional - - - CardboardSDK.bundle/da.lproj/CardboardSDK.strings - - hash - - /eyXzDASD/wxjE1rdZ+QafdcHbQ= - - hash2 - - Xi/cFepm6lDeoaAD9IS/AWZl8tfyQuq1k+aoafeDcYs= - - optional - - - CardboardSDK.bundle/de.lproj/CardboardSDK.strings - - hash - - IbpUoraAFH5jyo0jg7dHkIXSx5Q= - - hash2 - - MFfbzmZyYAnwnBbOwvX1g0o6EBfMA68esGlcW5GymME= - - optional - - - CardboardSDK.bundle/el.lproj/CardboardSDK.strings - - hash - - LPuK7Gginc0qo3F3UKLixdPITRY= - - hash2 - - Pp3s5tmyVjmv1LQDvR8V82UM26lIjIFGDFO1fxRIZIQ= - - optional - - - CardboardSDK.bundle/en.lproj/CardboardSDK.strings - - hash - - IPk97equneLqPwVbDZn2k9ommj8= - - hash2 - - x04fD2cmW8j+B5XPWYOd2idvzk8ztpq26n8IU3jVqoY= - - optional - - - CardboardSDK.bundle/en_AU.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - hash2 - - /qbe5DVlPJFhY457pOQGLxuLr//mHet4AgtZWYoQXA4= - - optional - - - CardboardSDK.bundle/en_GB.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - hash2 - - /qbe5DVlPJFhY457pOQGLxuLr//mHet4AgtZWYoQXA4= - - optional - - - CardboardSDK.bundle/en_IN.lproj/CardboardSDK.strings - - hash - - 81Vu0SdDsEIfAJvq0GcTkRF45gc= - - hash2 - - /qbe5DVlPJFhY457pOQGLxuLr//mHet4AgtZWYoQXA4= - - optional - - - CardboardSDK.bundle/es.lproj/CardboardSDK.strings - - hash - - E5fKEg3nWyk2qhwajgVgoOedR+M= - - hash2 - - ecXFwXVCpczedZZPhmXyD6jGT5505tJ+w53aMfXQ+QU= - - optional - - - CardboardSDK.bundle/es_MX.lproj/CardboardSDK.strings - - hash - - HeAokm8d1if5/IDTXkfoxWUZON0= - - hash2 - - xSY3riBNrsJJf0RTsPn3Psx2KFh6jxKGxBczIeULB6U= - - optional - - - CardboardSDK.bundle/fi.lproj/CardboardSDK.strings - - hash - - qDWc2kYjBIZC3kTtxfcplx6HTmE= - - hash2 - - EiCGJVspKQuot05RzO4jRAkezP7T3r8jy+446Q2muyw= - - optional - - - CardboardSDK.bundle/fr.lproj/CardboardSDK.strings - - hash - - xAW8DeJbMVENsILiSvKq681CWIE= - - hash2 - - L1CobxNRGwCcKEL33EgL//GA8+yfd5KgPO4mtnYi/rk= - - optional - - - CardboardSDK.bundle/gearButton.png - - hash - - hdJUVK4BVFmFVJsdwgtqyTr79vk= - - hash2 - - hvA/BN8mKfvc2Mx1CtlywXE4LaXrmzXBmMhig3BvKes= - - - CardboardSDK.bundle/he.lproj/CardboardSDK.strings - - hash - - QQsHArkUOLF6KorfbxB1E5Jo12Y= - - hash2 - - aU5qwN5XP8uE7Yn+FUWxTrtzxy8GV86kIL3GqgGOQho= - - optional - - - CardboardSDK.bundle/hi.lproj/CardboardSDK.strings - - hash - - 8NgBYrtCUlEODny6a8xAYHSH9u4= - - hash2 - - GfXpfgEuG0ydEEuSmpABg86YQOd2G/ALsX1nPuJIQmk= - - optional - - - CardboardSDK.bundle/hr.lproj/CardboardSDK.strings - - hash - - Ki1n1FecB8Udk6tDteRHffRAYgU= - - hash2 - - 8tM85fQtwxiySAEu+uGAJC2kif3LmK7pTk34+PW6Z60= - - optional - - - CardboardSDK.bundle/hu.lproj/CardboardSDK.strings - - hash - - g+Xhv4MrhVmGIidN2Vo8t0f5aDI= - - hash2 - - xRYqS23CPN3FhTDpazmfi7F3aZR0fgW55ox+2KwRCbI= - - optional - - - CardboardSDK.bundle/ic_arrow_back_white@1x.png - - hash - - ynIcRaFhTRUzSNCofHDU6et1HQY= - - hash2 - - BDL50RJQd8lj2i7rOhvyPIrEYLQgivt0wkSBUG8+l7o= - - - CardboardSDK.bundle/ic_arrow_back_white@2x.png - - hash - - zyk6C+r6sjw0FyBzOT9wGjBDAIc= - - hash2 - - TspeGokKSzc3J5/tnLbsVWIaQXmHgfVJpAUmRrt9TzY= - - - CardboardSDK.bundle/ic_arrow_back_white@3x.png - - hash - - ltPFDJyIX/Mk4NSJzkupdHTJnmA= - - hash2 - - rJra6423+D0OWBtfqwnnrUxMonxqG20MvJk005wj5OA= - - - CardboardSDK.bundle/ic_arrow_forward.png - - hash - - Pguh/y+CtXfBvX48eneX0smvmBc= - - hash2 - - ADYgQ4cF58LsiLW3Du4735SQ/Rb634ir+Ha06Enonls= - - - CardboardSDK.bundle/ic_arrow_forward@2x.png - - hash - - nbT1THBg/IL8Qym7OFZvwZoh044= - - hash2 - - 6f8OY1Q9qmnmBy4n/zr8iCaWw0qC6tHWTWh4Zn9VTlg= - - - CardboardSDK.bundle/ic_arrow_forward@3x.png - - hash - - jqZZYGD66fty0DUCHzZthOGzWxg= - - hash2 - - Mfa3LMM/qSAGyriZtMoJiG98ikRrDPHHJIhjx1T1p80= - - - CardboardSDK.bundle/ic_cardboard.png - - hash - - wm1AczGiAKuWJp5/HBM4PJCJqz4= - - hash2 - - ZxMLOb1aHg6cM8D5pG2Aqxyjvfl9+W7vPqICt/p8afU= - - - CardboardSDK.bundle/ic_cardboard@2x.png - - hash - - dIgMrvnaXORH924rNjMezZ/uz4I= - - hash2 - - QcbtI0oquV8/CwIDFrSW2KbUchjQFVVUVVeeHXIf8yQ= - - - CardboardSDK.bundle/ic_cardboard@3x.png - - hash - - 9HnQCsY/5+yjr0jiZTIsUYiT8tk= - - hash2 - - V+YKKY/jOcUKd7iJiyXdbOM0Pwix/Cd2YlmRR7KgnWA= - - - CardboardSDK.bundle/ic_fullscreen.png - - hash - - 6076J1S3OL56FKFae2ubJ+Cxric= - - hash2 - - AjQUt+ukwQ4SPfcRYnAehzJpg/RfCJ3iIfzPxR/yRAk= - - - CardboardSDK.bundle/ic_fullscreen@2x.png - - hash - - X0URfZNoC2O77kf8LEZaavVuSyI= - - hash2 - - BgclyGxahpVloiGfEDhMB/jP1cxBZA13Lel7ZkU+JM4= - - - CardboardSDK.bundle/ic_fullscreen@3x.png - - hash - - +8HRCqwdPTIJX8naPst8Dsk4xNI= - - hash2 - - lk59bM0RQDEPVUGs/I9Xr3536ZHFkqCZ62W37d6qlMM= - - - CardboardSDK.bundle/ic_fullscreen_exit.png - - hash - - iSeV1ZfyA0ZtESMYr3tjYZCTSQ8= - - hash2 - - 4IJT+Fevd9uYHF4beXI095sUVWj95fYwlrWZk18GNU0= - - - CardboardSDK.bundle/ic_fullscreen_exit@2x.png - - hash - - jD0UFyq1Vr4MYcmR85kdt5XenSs= - - hash2 - - NubAhH6qcuuxguSqZpitVh1F8yqR2XQEMtK9+BE79XA= - - - CardboardSDK.bundle/ic_fullscreen_exit@3x.png - - hash - - 9qnbjtGli1NdAx1LtT4YLHhHL24= - - hash2 - - A4PnW2QdN0wuq8drvSU14LCuMH+hZqznySXKhve/Sko= - - - CardboardSDK.bundle/ic_help.png - - hash - - reB0j0zeSPGuDxpliVhjuAzuoPw= - - hash2 - - ghSz9t5DjqYmKwseGzuLG73BQ/cIhNKd3reAWdvEF70= - - - CardboardSDK.bundle/ic_help@2x.png - - hash - - QGdLkJNCXwiyZcevrO2gaLxvM8o= - - hash2 - - D5AJyLuN4T5+KoNTTtSj/e1QX1UZdvVDUnAcyXBY6T8= - - - CardboardSDK.bundle/ic_help@3x.png - - hash - - Uj74l37VT7Ip8ZMwemU3XfqhHdY= - - hash2 - - H2QVdUD0jgcjmRcyqAwxe7LLigYMBia1N8Fs5CAddcY= - - - CardboardSDK.bundle/ic_info.png - - hash - - gh4W1qgeovGUTB835b2R9VeOEh8= - - hash2 - - Q8Db/19rEQZLkNmHH0vCGQ0nqEzxeSW4xtsjPDt1ZLA= - - - CardboardSDK.bundle/ic_info@2x.png - - hash - - E4NxBz8xEUdIc7FhxmjUBJUqh98= - - hash2 - - iIJU7BsqTX3OS/zSHtyYoGah1r0tXtmsy5RYECvCYFE= - - - CardboardSDK.bundle/ic_info@3x.png - - hash - - PwsZZjA3pH/CHQ0uUznYsdhnQmk= - - hash2 - - lhBJUwf1YG/YptAZ4wjcObnAdViQ25aVu5VM84jeBrU= - - - CardboardSDK.bundle/ic_settings_white@1x.png - - hash - - wEDMBnG8jvZGHttnQBmmYNJzpt8= - - hash2 - - 8jYl+4h+EC/4o+JhGy+Y7DOkosdp4pdY2cBR8vwAQoE= - - - CardboardSDK.bundle/ic_settings_white@2x.png - - hash - - evPA64kKKIf23w1Zg/BtMHUyxW4= - - hash2 - - Q3Bq2dmER6rUc1JUR2cN/4fIZ0OHgGha8m3JFP/1F/Q= - - - CardboardSDK.bundle/ic_settings_white@3x.png - - hash - - qMYOP+Cu3lJ/a8+w4Snj1JKUCFo= - - hash2 - - TqpqkR79IADVI9xuHjbG1PmvN6xfbBOv4AzMQ63LzmE= - - - CardboardSDK.bundle/id.lproj/CardboardSDK.strings - - hash - - kokU7lHVNGUFqy774ghTxUM3gOs= - - hash2 - - R4yzpHX7T6qpId6DVut0v6KibWyeQUNB7xplgTO1wvw= - - optional - - - CardboardSDK.bundle/it.lproj/CardboardSDK.strings - - hash - - ujLgibcS3CSQyWeD5BQNyAVkFYA= - - hash2 - - w8RcCJP2vHk2u3ze/vDU8nY3ZMGCAJJ94JY6ciuDhI4= - - optional - - - CardboardSDK.bundle/iw.lproj/CardboardSDK.strings - - hash - - QQsHArkUOLF6KorfbxB1E5Jo12Y= - - hash2 - - aU5qwN5XP8uE7Yn+FUWxTrtzxy8GV86kIL3GqgGOQho= - - optional - - - CardboardSDK.bundle/ja.lproj/CardboardSDK.strings - - hash - - har8QNmTVexHcZVrmwAqZ5cOrG8= - - hash2 - - 8xT4lEIgbgIv5/jv98ti3pXmcLXFxHoD+esCn0yFs78= - - optional - - - CardboardSDK.bundle/ko.lproj/CardboardSDK.strings - - hash - - PqNLuQxt05NraVVfEdGubiGjyN0= - - hash2 - - 4cp/GfRhspCB8TOKN8t+ukEww1Uz0HjhrT7zwjPcq/M= - - optional - - - CardboardSDK.bundle/nb.lproj/CardboardSDK.strings - - hash - - UvUtX7nv9j1h96bViKb2Tdz4Dc8= - - hash2 - - LHDIWpFM4Kybyv8o8CFz/SCkqE82Qtm42n7REKd/1gs= - - optional - - - CardboardSDK.bundle/nl.lproj/CardboardSDK.strings - - hash - - hfe2Stb8RLgZLSLAVRPKJVYjq4U= - - hash2 - - 5HFiUavC/q9t241Y3FuA3ZgQ9LKX7nbsor7kjSLd55Q= - - optional - - - CardboardSDK.bundle/pl.lproj/CardboardSDK.strings - - hash - - uZ7IydIgliTMgci5OZvgSUBc96Q= - - hash2 - - +N9LLkcAAfYd1Lsp0hUJhMoAgrsQ936gcQEt5RZ40w0= - - optional - - - CardboardSDK.bundle/pt.lproj/CardboardSDK.strings - - hash - - BYKfI0Izt8czjqric0hlZtnAh5M= - - hash2 - - diXnABK7xNijV4q1YoGm2So5Myecj2x+RR2c3zLxLKY= - - optional - - - CardboardSDK.bundle/pt_PT.lproj/CardboardSDK.strings - - hash - - QpUhTPdLcv0KOfuGfcgaitvPLP8= - - hash2 - - N/VeNwxTDJS8mQ6QJUqtJnP0SnTQ9grYJ6tneZiNzwc= - - optional - - - CardboardSDK.bundle/qrSample@1x.png - - hash - - 2rseTVr8X5nMGUaWg39d1alSEC0= - - hash2 - - x76/cdFrS+XlnBqUf54E5xYz+N87T8DEsS50wY4s6ug= - - - CardboardSDK.bundle/qrSample@2x.png - - hash - - 1zbRmt5ATL+hVRUjfVeYUHDNgV8= - - hash2 - - cYrmRev8bM3nN8+CBUPB+1QUifSfeWJb3jJBzp6dhUE= - - - CardboardSDK.bundle/qrSample@3x.png - - hash - - RZ2eLnCZWuGYWodKe9y1Re18E5Y= - - hash2 - - rAiZ8DErDIt6Z1Rf3RB3zL85KXNqfwPvkYfhY3Q4bOY= - - - CardboardSDK.bundle/ro.lproj/CardboardSDK.strings - - hash - - NoGdOS1lBk5X6eB1efYflp4Yh1s= - - hash2 - - KkGA8uZl0PwBmy3LKFr7qlsyw0lYwf287rSp1FzqoxY= - - optional - - - CardboardSDK.bundle/rotateInstructions.mp4 - - hash - - N+3ePK2O2jmYIhQwCBSwWUhIdVg= - - hash2 - - mblOTgfMszEYmV6eR6dRcXyYEnv327GCVsBGmXGru6I= - - - CardboardSDK.bundle/ru.lproj/CardboardSDK.strings - - hash - - HS68klX2idhl0Y6erRSAaoBHvYA= - - hash2 - - hj0gOyNHB5EiqKwC7FuEvtXMbu4xzuwzvPKudSnRzWg= - - optional - - - CardboardSDK.bundle/sk.lproj/CardboardSDK.strings - - hash - - 6YBPlRHYI9stl3pd+FBth6+gldI= - - hash2 - - j2yxRjOjWFP7BlsAYWmbHJmRDkTK/22PDy5vsE4EqdE= - - optional - - - CardboardSDK.bundle/sv.lproj/CardboardSDK.strings - - hash - - myiR7u9dlUf0CalIE16knOalSn4= - - hash2 - - cJisjfHqiEhfW0+nzy98qi5xrl0eZamQQ3QnBz8sviQ= - - optional - - - CardboardSDK.bundle/th.lproj/CardboardSDK.strings - - hash - - OhkG8j7IYtoMd5O0PlBKI4eUVo8= - - hash2 - - 9ISGxj+tapO3UzV5iowzj8+n83XMW9HajaPyyooVh1c= - - optional - - - CardboardSDK.bundle/tickmarks.png - - hash - - Msr3GGlbMUC+Y5uoYYCEWz8FOMc= - - hash2 - - yzQp9pGs6OLHSgz028HpDKSSm5IRV2ZLr1RVcSxwSxo= - - - CardboardSDK.bundle/tr.lproj/CardboardSDK.strings - - hash - - Kp9Rp5+KjpWPy5orBssbmBFZpY8= - - hash2 - - Dpiu32KxMDOkGZc3cgL1VrclXKE56rjwa29KOlAjUxk= - - optional - - - CardboardSDK.bundle/uk.lproj/CardboardSDK.strings - - hash - - eiYeO0o6nTYWYqzRzphk+0hX1Kw= - - hash2 - - yQqxd1iP8hR2wQpuSsS7igq0RoO/cazOQdN+IowC4dI= - - optional - - - CardboardSDK.bundle/vi.lproj/CardboardSDK.strings - - hash - - 4Ri07kkj098APGFLKqNOBn5Rr0s= - - hash2 - - U5wtKmOLSoBlMHLdIQIVufbLzSFWcoBaJH77/6cen5o= - - optional - - - CardboardSDK.bundle/zh_CN.lproj/CardboardSDK.strings - - hash - - ptTwP6yyDOl7ra4kP+7taz7jvFw= - - hash2 - - pI27+HnEQomZmjZi1PXFuUpZLg0UuuNZvcZaOYdeaa0= - - optional - - - CardboardSDK.bundle/zh_HK.lproj/CardboardSDK.strings - - hash - - m3QrbgwHa19deb+y6oMTTV3OPmE= - - hash2 - - Ks3zFyteBVADEJHPdVZLRGFh5BbewMzlSYekoVZaQf0= - - optional - - - CardboardSDK.bundle/zh_TW.lproj/CardboardSDK.strings - - hash - - m3QrbgwHa19deb+y6oMTTV3OPmE= - - hash2 - - Ks3zFyteBVADEJHPdVZLRGFh5BbewMzlSYekoVZaQf0= - - optional - - - DeviceList.plist - - hash - - hn7ObbyGtqatR/rOsmydBZYAN3E= - - hash2 - - 6dfh+DDLiffWbnD1xWYGQSklD9CRKhmhl9BE/70Jp5A= - - - GoogleKitCore.bundle/Resources/ar.lproj/GoogleKitCore.strings - - hash - - Eum4cYRCaRsTxO5jwHka5hjmlwo= - - hash2 - - 3z4swOIS3B1/59VF8YTV790l38HRZos9NexPjqSHwx0= - - optional - - - GoogleKitCore.bundle/Resources/bg.lproj/GoogleKitCore.strings - - hash - - Z17pLESM8r4wgVqh3EGpQ/clizc= - - hash2 - - Ktc5OTcUec6tG1hHMvSV+Er4tPXxB8Dm8rNVCN6zPYk= - - optional - - - GoogleKitCore.bundle/Resources/ca.lproj/GoogleKitCore.strings - - hash - - 5veE/icWdg6nh3b13BryOqpNJkY= - - hash2 - - r9O+3RJk1+eLxUBW0Xoe8e8Om7JuySPjSedDyNuenOY= - - optional - - - GoogleKitCore.bundle/Resources/cs.lproj/GoogleKitCore.strings - - hash - - fWSzY/R6IWwIsveGipXwhW1IQ1A= - - hash2 - - l3rp7bq7lBej0nGnV4mn0uMOu2I0GsNwL1jZ5kP4nWo= - - optional - - - GoogleKitCore.bundle/Resources/da.lproj/GoogleKitCore.strings - - hash - - ZHdssU6j4tOP37Fi73uumnwRBs8= - - hash2 - - lBZ8QKi5/QBgFA8oLulBQW/ZYVrvPK9idIMc9tvV890= - - optional - - - GoogleKitCore.bundle/Resources/de.lproj/GoogleKitCore.strings - - hash - - 6Qa8+7OGMnoo4ktgITO6brGFWlk= - - hash2 - - QVxNdva3mvwaWCYsqDTI/xNSejrsZNOwoOb4+aSh3l0= - - optional - - - GoogleKitCore.bundle/Resources/el.lproj/GoogleKitCore.strings - - hash - - VKPl4yM3ICyh8GhjreEEpuA1Le0= - - hash2 - - 0DpSyKtptYwj2gi8YKflwf9f8k036qpeusPk3o6EDOo= - - optional - - - GoogleKitCore.bundle/Resources/en.lproj/GoogleKitCore.strings - - hash - - BAmD8wu0RrZfRskEckoby0jxbwI= - - hash2 - - AapJDkss/t0UDYm4qy7S1RVdpUCo0aF4l5PsZ+lEaHI= - - optional - - - GoogleKitCore.bundle/Resources/en_AU.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - hash2 - - 0TJBja/pCnptGoBhHYP91+02QbTTCWlaFy7thMOb1m0= - - optional - - - GoogleKitCore.bundle/Resources/en_GB.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - hash2 - - 0TJBja/pCnptGoBhHYP91+02QbTTCWlaFy7thMOb1m0= - - optional - - - GoogleKitCore.bundle/Resources/en_IN.lproj/GoogleKitCore.strings - - hash - - 2azfDZoMeBcNTpspaMtI+spvLpE= - - hash2 - - 0TJBja/pCnptGoBhHYP91+02QbTTCWlaFy7thMOb1m0= - - optional - - - GoogleKitCore.bundle/Resources/es.lproj/GoogleKitCore.strings - - hash - - ZfmhfXd/igpBJjauPEfsqSWh1uE= - - hash2 - - cuI1sx+c7qC/Aaloy180zNpM2dgA8DzlfJNDwIdQi+o= - - optional - - - GoogleKitCore.bundle/Resources/es_419.lproj/GoogleKitCore.strings - - hash - - hJjUld9rJaYvmrnzuMh8zVIsLjM= - - hash2 - - 26Zabnw3zJGk5aTlUe6Lr3pDumO+RREyqrP9oDJu1K8= - - optional - - - GoogleKitCore.bundle/Resources/es_MX.lproj/GoogleKitCore.strings - - hash - - hJjUld9rJaYvmrnzuMh8zVIsLjM= - - hash2 - - 26Zabnw3zJGk5aTlUe6Lr3pDumO+RREyqrP9oDJu1K8= - - optional - - - GoogleKitCore.bundle/Resources/fa.lproj/GoogleKitCore.strings - - hash - - slVASJqdgrRomCMxcMmedAwWezs= - - hash2 - - v36bhWib3H9dYkttMnoBdQtm2K6rujVp4t9FCbN2DE8= - - optional - - - GoogleKitCore.bundle/Resources/fi.lproj/GoogleKitCore.strings - - hash - - tF8KIjNPHruKRflYqfEBT41+6fY= - - hash2 - - Lkte5FrB7LNmLZxj7Sra47IgvgIaA07i9rZxUhUAbCQ= - - optional - - - GoogleKitCore.bundle/Resources/fr.lproj/GoogleKitCore.strings - - hash - - d5us+ZddcX6Xsbu+pc1AIgEXP2Y= - - hash2 - - R9YFwcrDlowSGO+ARgucvaZ6mrVCZKY8i2VHAIy9xBM= - - optional - - - GoogleKitCore.bundle/Resources/fr_CA.lproj/GoogleKitCore.strings - - hash - - uKWc3jUFd3Vr43R+nlXE3e9WXYk= - - hash2 - - iSJu3cqw6PpksjghuN/CP1QjqwO3Qmz2A+JVCwPNVbQ= - - optional - - - GoogleKitCore.bundle/Resources/he.lproj/GoogleKitCore.strings - - hash - - lsgeywI4t/ewZoVf9pO5kRAomNA= - - hash2 - - eMIM4sn8A9BQIoKu2OBC93P0OtLAu9y7yDiCp4QK4NU= - - optional - - - GoogleKitCore.bundle/Resources/hi.lproj/GoogleKitCore.strings - - hash - - WxVd/Iuy0yb4jPzzBoETXjQ7Xsg= - - hash2 - - Ofk4NKhzIrlKDNhpnw8NkLlCmLC3uJHVyC+MQaeZKm8= - - optional - - - GoogleKitCore.bundle/Resources/hr.lproj/GoogleKitCore.strings - - hash - - mRmMR582drUFHrMf8MubYakQ6U0= - - hash2 - - WtyvhUMuB3JnVAz/C/x3H06HVWIB3KODrBicETy26to= - - optional - - - GoogleKitCore.bundle/Resources/hu.lproj/GoogleKitCore.strings - - hash - - UYSCp31QJkGhskoEHci5f0bXIE8= - - hash2 - - pJAhwF6FrfEo9Wh0bFFP016C7oyg36HZhwHOTU9i8Ok= - - optional - - - GoogleKitCore.bundle/Resources/hy.lproj/GoogleKitCore.strings - - hash - - 09W30XiwstnBCiIGHYKhF9z/GlI= - - hash2 - - JV/JG5iGlNRYrrO/3nw6OF6ROLZ3koHUuPWqDWlfiPg= - - optional - - - GoogleKitCore.bundle/Resources/id.lproj/GoogleKitCore.strings - - hash - - BWe/7Y/x8DIo5xOilKEj0MaClH8= - - hash2 - - Xrh1QJKo44Du/BV3zOMmShVn9Q9g6mQdeK2iCuaPTEk= - - optional - - - GoogleKitCore.bundle/Resources/it.lproj/GoogleKitCore.strings - - hash - - Y1RaRUpkidRqXKMab85U+bNxBBs= - - hash2 - - MUKnO8jICCl8gm1m2D3qxP2+0fdlYkEm8Tp3aSkJf6M= - - optional - - - GoogleKitCore.bundle/Resources/iw.lproj/GoogleKitCore.strings - - hash - - lsgeywI4t/ewZoVf9pO5kRAomNA= - - hash2 - - eMIM4sn8A9BQIoKu2OBC93P0OtLAu9y7yDiCp4QK4NU= - - optional - - - GoogleKitCore.bundle/Resources/ja.lproj/GoogleKitCore.strings - - hash - - 7MDgTALMgOtuVE3+yPJXxzmbQ4k= - - hash2 - - b6Yhwv7IHp5PZHUSr0m0BIVCb8wgpZEr//WLR+hrimI= - - optional - - - GoogleKitCore.bundle/Resources/ka.lproj/GoogleKitCore.strings - - hash - - Crq0mFUWsf55hAxNWYIlynaIHDs= - - hash2 - - PnqZLzxFLrCSB2Bn26KxkvoCrTutlFcw42YxMvYeJTM= - - optional - - - GoogleKitCore.bundle/Resources/kk.lproj/GoogleKitCore.strings - - hash - - fNVbzGNrDo6SlSA8Xof5153S+HA= - - hash2 - - id9j3Z+kPthTpvou64IcxY5W6XtoKDpeqIsdpBLu2fc= - - optional - - - GoogleKitCore.bundle/Resources/km.lproj/GoogleKitCore.strings - - hash - - QvdVJwvmQhiNicKjAwxsd4is08g= - - hash2 - - ttNn5kWz6ZheyAsSAeqAbzl21qU8FqxnDdPfjLdXEHo= - - optional - - - GoogleKitCore.bundle/Resources/ko.lproj/GoogleKitCore.strings - - hash - - 3NVS0zKE+hZZ4EugCsfqdf8wJVI= - - hash2 - - 7HT+l5NLq17GCnaX32PGXyUdw+FqwXqMY4fwByFdqsA= - - optional - - - GoogleKitCore.bundle/Resources/lo.lproj/GoogleKitCore.strings - - hash - - Iiy13OG62f/OD4IyfDZuD71WJ/w= - - hash2 - - HBbRTmyl5ZmdnEKz6b55dQymkYQ7HRcinRKObxi5InI= - - optional - - - GoogleKitCore.bundle/Resources/lt.lproj/GoogleKitCore.strings - - hash - - NhfZMuIgPcn8YjPvg0BjtVu6iV0= - - hash2 - - zmh05BARMs4R/KzkpA4x84weO7Y2QuzJktAx3EbNigs= - - optional - - - GoogleKitCore.bundle/Resources/lv.lproj/GoogleKitCore.strings - - hash - - 9JmLq5UDJpaOEOn/yTGxxXmhM1s= - - hash2 - - 77GSBHFGE/6mui4uVDzW8/pnRkT/QRtptle4tiU9Q1U= - - optional - - - GoogleKitCore.bundle/Resources/mn.lproj/GoogleKitCore.strings - - hash - - wjHF0blcXzaaWibfCMvzRzYlZ30= - - hash2 - - Rx0Oskm5U7OzAT3FMDNyWUeLimbsu76V0VxYT7dDyLc= - - optional - - - GoogleKitCore.bundle/Resources/ms.lproj/GoogleKitCore.strings - - hash - - nOZ5tmjquSiiHmYgqC40xl/BNc0= - - hash2 - - uUiAzmj5q1j4vonTt9bX5S8ScGuiFo6Jpf1s76uI+bw= - - optional - - - GoogleKitCore.bundle/Resources/nb.lproj/GoogleKitCore.strings - - hash - - LNRk+i/hGXNXbTOZ82odgfp4BRg= - - hash2 - - v8/2bJx+Aq2xobddB0VuEEf4Yq1TVAPSpqr8VacddsE= - - optional - - - GoogleKitCore.bundle/Resources/nl.lproj/GoogleKitCore.strings - - hash - - fOmgJ+mxuA+yK+QvrcqAHlfFqms= - - hash2 - - 3ECxL+0Vvvx3h739eWCGuuCdAtVbJhAE57BQw9K+6CA= - - optional - - - GoogleKitCore.bundle/Resources/no.lproj/GoogleKitCore.strings - - hash - - LNRk+i/hGXNXbTOZ82odgfp4BRg= - - hash2 - - v8/2bJx+Aq2xobddB0VuEEf4Yq1TVAPSpqr8VacddsE= - - optional - - - GoogleKitCore.bundle/Resources/pl.lproj/GoogleKitCore.strings - - hash - - T8808/aIZXy5gnwnJu7DCuUml9k= - - hash2 - - mwrWIqx05KzaKBVFg/a4xa1/7t3EPmFYvMO13L9pMOI= - - optional - - - GoogleKitCore.bundle/Resources/pt.lproj/GoogleKitCore.strings - - hash - - 1vcArmroEqrBQ0XE7k1k/ArgcQw= - - hash2 - - dn7BlVkquHIbYE1PZAbOyswj8AGhQ5ACkJTjdxiGvyg= - - optional - - - GoogleKitCore.bundle/Resources/pt_BR.lproj/GoogleKitCore.strings - - hash - - 1vcArmroEqrBQ0XE7k1k/ArgcQw= - - hash2 - - dn7BlVkquHIbYE1PZAbOyswj8AGhQ5ACkJTjdxiGvyg= - - optional - - - GoogleKitCore.bundle/Resources/pt_PT.lproj/GoogleKitCore.strings - - hash - - QFNoDl8KPBH1d4R14Vl9HibF2h4= - - hash2 - - CwJAlBLGqcFA6AlrBhVSG2yvkSmDU3TycDsQtI0LvFs= - - optional - - - GoogleKitCore.bundle/Resources/ro.lproj/GoogleKitCore.strings - - hash - - gRn9+NeavCGOA4FkyFA/fKSUNco= - - hash2 - - RHPZReCe5T/yGTOvN7Q5+tg80ZZVDCruWoGmwq2XGoQ= - - optional - - - GoogleKitCore.bundle/Resources/ru.lproj/GoogleKitCore.strings - - hash - - T9vjG4O7PzDhBvTdEslkd3wO5RQ= - - hash2 - - OMmdcSwLYp5/fdnbXXT62Ha2e+92weB1XTLrcx6Clz8= - - optional - - - GoogleKitCore.bundle/Resources/sk.lproj/GoogleKitCore.strings - - hash - - 4KSAjJqVVWg+zU8Kz0g4NyWSxsA= - - hash2 - - ybJE7631+hgjuhJis+5PTnJcC6fc2FIpppOzQiClowk= - - optional - - - GoogleKitCore.bundle/Resources/sq.lproj/GoogleKitCore.strings - - hash - - SPZYpjwPNC+UUkD7V91L4yP/FL4= - - hash2 - - i78ns905O2POdfs3TvpGKAv4Hd7KQR5ZDvwLWp6VDco= - - optional - - - GoogleKitCore.bundle/Resources/sr.lproj/GoogleKitCore.strings - - hash - - av8nYtVutBhprVIYDhJVJu+oiTo= - - hash2 - - /h2mII6FYvHIKBR/URYej7yJG+zd42l8Q+87Bs+Sj/4= - - optional - - - GoogleKitCore.bundle/Resources/sv.lproj/GoogleKitCore.strings - - hash - - hMnEk3QMy51KtzfqpTgG7+RDFY0= - - hash2 - - mOWBBjQK7uASFMM/zoXAUbp1xK9f3wM9p64zYUIDUnU= - - optional - - - GoogleKitCore.bundle/Resources/th.lproj/GoogleKitCore.strings - - hash - - E0OUzGUDWDFFeXc2Tvb9wItVVds= - - hash2 - - LNvAddSaja3uTfzwJgQCpvvWxdnbd9DKp43KP60K7TI= - - optional - - - GoogleKitCore.bundle/Resources/tr.lproj/GoogleKitCore.strings - - hash - - TovVC4li3GZnIe8Hj7qOZ+hayGk= - - hash2 - - Xg7ZVNu7FxzCC9WsEb5cVQGKWv5U7/Sf6iaQ4zU3Rho= - - optional - - - GoogleKitCore.bundle/Resources/uk.lproj/GoogleKitCore.strings - - hash - - Dt//jCl8xN3Y1w6RifXXXeP8cjk= - - hash2 - - Pu1TqTvL3H44rDyq9re7qYa/j7S6Z/n+3cJ6AkF4IQU= - - optional - - - GoogleKitCore.bundle/Resources/vi.lproj/GoogleKitCore.strings - - hash - - QFuYqm3CIT/2M4luvp90oH9Ss1s= - - hash2 - - xT6R8jViTkc/uvySqxJgoPggafKUN13YiOSzHPU6sIM= - - optional - - - GoogleKitCore.bundle/Resources/zh_CN.lproj/GoogleKitCore.strings - - hash - - FjZPgGsbaraQeqJtovNRBv80HCY= - - hash2 - - RdHdK1jyiy0l6f3xrR0LbnE8gEdpvv3sBDKMSYITZhU= - - optional - - - GoogleKitCore.bundle/Resources/zh_HK.lproj/GoogleKitCore.strings - - hash - - t5crTY74iSD4QkKqeZR7HVkt9hQ= - - hash2 - - eSDI4xgFvpgXiAz6kpJy552d9tmoF7JVf7t1t9Vez34= - - optional - - - GoogleKitCore.bundle/Resources/zh_TW.lproj/GoogleKitCore.strings - - hash - - cqWoNicAimUUR3k95SkMdSGnlos= - - hash2 - - sF7SjL/kjzWoa36gTBdQ8Ef1jSnHLu92ut+GTNIfZ1s= - - optional - - - GoogleKitCore.bundle/button_blue.png - - hash - - EdLFZBuA23t/uR40su7hhGo6D88= - - hash2 - - 6+SUUqoj/rxLFaJfrIwPpvoaAu9oteKDzhvJVxsjIzY= - - - GoogleKitCore.bundle/button_blue@2x.png - - hash - - M3i+rNM76it5c4Ui8FnC9inPm4A= - - hash2 - - Y+zyW0DpoPwAXYGNF/85jPH7o8C8GIpp4XYYUrB+yO8= - - - GoogleKitCore.bundle/button_blue@3x.png - - hash - - eG6YZuo4oa3+KxBPtF0SBEvngjU= - - hash2 - - fvznEMDs9KtPOI6dllDYwuMSeHSXubJ343xVr95dUH0= - - - GoogleKitCore.bundle/button_blue_highlighted.png - - hash - - bXhdEfMI3jtCu2L+pyaw+FyC0jU= - - hash2 - - KgmxJojDmD9XtgdJZt4xa9ww6kDMGZDmlOH43Zj+hLQ= - - - GoogleKitCore.bundle/button_blue_highlighted@2x.png - - hash - - ObWCMTKKll6voyHyLLqwiWBcI0g= - - hash2 - - j6E2lgWHNHeFrP0T3MH96Tijh1zM1OQGsFgaTlgMhug= - - - GoogleKitCore.bundle/button_blue_highlighted@3x.png - - hash - - jukefpwH9F9C+rMOM+bTsnDvfSg= - - hash2 - - Nhl5ZfNRZ7DYtxxFx36SOvA5JGjAI8e/Bfw2QbmXrPc= - - - GoogleKitCore.bundle/button_dark.png - - hash - - L8ee0jrA8HoRsmw7UCKhha+sDbk= - - hash2 - - pMOQrBH2A7kGHKg/SPMMREDFaIMh7jUvW3AjQivwnnI= - - - GoogleKitCore.bundle/button_dark@2x.png - - hash - - r4chXvHjzO/Hg/miplODfpmMOzM= - - hash2 - - AZiI0jc+8OzbnzBHMwMaZlswEQI+bdzOFMdxJD1ihnw= - - - GoogleKitCore.bundle/button_dark@3x.png - - hash - - wlgV5B+NXjw6FVbeyZUuPu0pDzc= - - hash2 - - CHY9tKHAwkD0xgEZI57bkQKqos0/xO6WPPWpXYqElfo= - - - GoogleKitCore.bundle/button_dark_highlighted.png - - hash - - SHhfDbJnbkJE5shtzMKOzMSSzGM= - - hash2 - - bJXT9HIdhZLg+nzRKUqZON5btkU2nyGVUVYnKXtXdnc= - - - GoogleKitCore.bundle/button_dark_highlighted@2x.png - - hash - - i1uv/ls4Ym8HNPtChxBM5mvt1lo= - - hash2 - - eznhebzkAC3RirEji+guEkzawyL6hOE3c31kU3dPNcQ= - - - GoogleKitCore.bundle/button_dark_highlighted@3x.png - - hash - - M1LfUf7Ow7FP4/aicAYh+I4h48Y= - - hash2 - - G9HsU0WxEd18uFjOk2GlQcwdg5fYAZAytbdWKQoXDPE= - - - GoogleKitCore.bundle/button_light.png - - hash - - 9r8fUKbvtRvQvzXniohRRYZjBno= - - hash2 - - LIVUtyEXkllZXhZ+CBNtKSeB/QsdmH9AWZ9E9bH/dI0= - - - GoogleKitCore.bundle/button_light@2x.png - - hash - - Y2cJaGOh/191dicG+Qboh8jw3B8= - - hash2 - - ZcwKtbRi3xYgbHcgGqTcXDOGg+eGMHg2P95MCBQ/nIM= - - - GoogleKitCore.bundle/button_light@3x.png - - hash - - vQTUgHswTpUNAF10jbEvjhJ0u5c= - - hash2 - - Vk44NqFqOS9vurQSxWeC20T/YONSgtnk5KPNrxz1xqg= - - - GoogleKitCore.bundle/button_light_highlighted.png - - hash - - ScT6x7hDQUd+wbVPt4dNQD3mAeU= - - hash2 - - sMLkJKbcsWKpXWKiubB8w7YnM7j3Cca4U3smuimPrnQ= - - - GoogleKitCore.bundle/button_light_highlighted@2x.png - - hash - - 3qm5F9jrMCT/JbZyHM3iaLMEWvE= - - hash2 - - 7c8i9ZLkKFcTH6ZOcfpc4lgllipOecLFk+Lnk/VJsoM= - - - GoogleKitCore.bundle/button_light_highlighted@3x.png - - hash - - smQxFu/r8Fk9qvuLeK88dxdy1u8= - - hash2 - - f2VJIqkEbe+0GPQYSkPIN6UpF/fdx/L6wUDSkRcNo90= - - - GoogleKitCore.bundle/button_red.png - - hash - - YMXd0k818rrXK6hyNfoqWk5fTOM= - - hash2 - - ZnARUcq4lUTA4fS400uLbUxIxaDsudUxjMv8CymmuWg= - - - GoogleKitCore.bundle/button_red@2x.png - - hash - - lLMt4u0Ai14eex8USMw8iSlHUrg= - - hash2 - - uH74FL3PyRiQVyhQsu2Ktxq0cvE76HdC1zJQ74LGvVc= - - - GoogleKitCore.bundle/button_red@3x.png - - hash - - vYQCvc3s7pl2j5iF85ZZgbjCIVs= - - hash2 - - NOlUUbvGJrklXjGpq8/VWnYu4G+gfG9yzp1fomANUjs= - - - GoogleKitCore.bundle/button_red_highlighted.png - - hash - - HxqD0zJONSsrFhLMGQmaXHivM94= - - hash2 - - Hcn1aH+44wYU8m3xV558lnm5s/z5Q1SvojIU9fjgTxs= - - - GoogleKitCore.bundle/button_red_highlighted@2x.png - - hash - - asnqRGpe1O/yDd1yCXajR8fgchc= - - hash2 - - CuQBTB7EFvoYWyvDTarJhYCUJ2IOPIBil/WdT+JsxiU= - - - GoogleKitCore.bundle/button_red_highlighted@3x.png - - hash - - o/z3SGVyhX+NQfqHbXuuW8raXI8= - - hash2 - - fIFgTu6OfR/mcI+z5NkZamG8R+r1KX4xTVCzM0nmMBk= - - - GoogleKitCore.bundle/cell_background_selected_dark.png - - hash - - 2mirA61LthCS+trOSIt+LWfUrLY= - - hash2 - - OxsgjJFy0rNUcYRJS82+YHH1x16bjx8ro39386+b1oc= - - - GoogleKitCore.bundle/cell_background_selected_dark@2x.png - - hash - - Oy4tekurGsmuQcnsqTzGBKXF7Do= - - hash2 - - lAtgZx7/WLEB2kVcHmSrwlRgXnG1CSPt+Y7pjPDu/W4= - - - GoogleKitCore.bundle/cell_disclosure_accessory.png - - hash - - B0F2FK0uWPCdm88mqlG1XV+qn6Q= - - hash2 - - lsG1pE/J6nSrhvtTTSQ/VJzqRogH6JD6KhL6RYuNFGw= - - - GoogleKitCore.bundle/cell_disclosure_accessory@2x.png - - hash - - yaO6MET5yuR00YkCceVV/AvtIAU= - - hash2 - - E7lAyPzxBvOSri8lB5nMUxKdVVqow01mOy5x2Fup41c= - - - GoogleKitCore.bundle/cell_disclosure_accessory@3x.png - - hash - - EYwrMveD65n0/NOOX7uEGwIDcbY= - - hash2 - - 23/usFwSFJCzAdG8Frp4qOM2skBrjo0DTHgsK+5cq0A= - - - GoogleKitCore.bundle/cell_divider.png - - hash - - 1hoxDGSO3Dmg62P82wko2uOQLXg= - - hash2 - - Y+cyINUEebUEaFCuEEQFnZ/lheoKV/c0qFbbmHUL8qg= - - - GoogleKitCore.bundle/cell_divider@2x.png - - hash - - cLmHaGAog4MGB+nD9vFCftC72Lc= - - hash2 - - q0T3A6mMD8emcSW3MfpWymzjowQPXtm4KvflYxPo+zs= - - - GoogleKitCore.bundle/checkbox.png - - hash - - +r4cFpdhm06aXoGnJEFe3c+JV+o= - - hash2 - - JC+k1bzq/Sa1l8ztLUe9BWxMm8Ef80tEwG/d7G9pAbk= - - - GoogleKitCore.bundle/checkbox@2x.png - - hash - - b0wAuwOHNtRX1fQz9bHZYYNvoo8= - - hash2 - - JPHTK7AogIeGP+YruPei3qlRnr3pNT8Zw8cFBEcnc/c= - - - GoogleKitCore.bundle/checkbox_checked.png - - hash - - 40rInfG5DD8usXtutTiJfkpwPSo= - - hash2 - - MPzi23lCRaa439r1F/+ZySAKczSWTNds5aUtISFbfP4= - - - GoogleKitCore.bundle/checkbox_checked@2x.png - - hash - - hQbWighszNfrR/LzZ6yMD5b9ZjQ= - - hash2 - - wclIkJD9oPzMA7KgceiGlFKER9a9jpiXU1FO5A5mPDE= - - - GoogleKitCore.bundle/checkmark.png - - hash - - A4zMJ2YoLBhwUeQCPfZJBucLdnQ= - - hash2 - - XPpi5CfVohoieDTzKkdqKo7AoZYN5OHDvKamgDzNaJw= - - - GoogleKitCore.bundle/checkmark@2x.png - - hash - - YoI7bcZlGmnZWNKU8wGOg8l33d4= - - hash2 - - QUAd4GyJgOtKV6kW4AOteMzxQ5t/wEZpX+A7SVQq2VI= - - - GoogleKitCore.bundle/vertical_divider.png - - hash - - DrqS1LhrJb9AHawGUrF/gKnFTUs= - - hash2 - - 504exonop4B0G6X7MfANkcs0EgedVdjZpBAGWi2yxqs= - - - GoogleKitCore.bundle/vertical_divider@2x.png - - hash - - JWjJc49n+EsngeyNErrRE13hwIE= - - hash2 - - 0e5/5TUyUvGTBOZSKi/HD5SamcWKt0Y96xDoqhGM3i0= - - - GoogleKitDialogs.bundle/Resources/ar.lproj/GoogleKitDialogs.strings - - hash - - yOy6GQoAbMUFdMqOG2tMseFhUr0= - - hash2 - - Z6ZbJQPkc8olh2u1g4hujESaEmUITPz9eOlKQCwdw5o= - - optional - - - GoogleKitDialogs.bundle/Resources/bg.lproj/GoogleKitDialogs.strings - - hash - - wtcU0SmTltUvHHi1rDzU4vm4Ddw= - - hash2 - - sc/1b5J5VZSFm8jPl21YUv/oMh6O2TIwpqQQ6Il6YIw= - - optional - - - GoogleKitDialogs.bundle/Resources/ca.lproj/GoogleKitDialogs.strings - - hash - - JWTiE8KGD/nj4NQIpFcsyBr7J+o= - - hash2 - - +s3YxK0nuVr1j8MUKs5pDjdef2Wem2QOhOTz+JUHjkE= - - optional - - - GoogleKitDialogs.bundle/Resources/cs.lproj/GoogleKitDialogs.strings - - hash - - 7LAzptvycx09dJzTIOz09CVUb2Y= - - hash2 - - mlh5TCWDzDHGw973gJml4iYSwglkk+lw6CkYQdj9dtA= - - optional - - - GoogleKitDialogs.bundle/Resources/da.lproj/GoogleKitDialogs.strings - - hash - - hPixibsq7hHBFP65K8SQpjg8Ipw= - - hash2 - - zruvllYfb/6uDsIxAbU+7fPxeSOcV8N2TlAdvk+5IK8= - - optional - - - GoogleKitDialogs.bundle/Resources/de.lproj/GoogleKitDialogs.strings - - hash - - JOhcc4bWuc5fvkOYWYEgijhEAHM= - - hash2 - - TgpuTqro7P6xgbQdONjiNhz+1Xe8axaUsvQR6ntxeac= - - optional - - - GoogleKitDialogs.bundle/Resources/el.lproj/GoogleKitDialogs.strings - - hash - - UnyecPs1E+5ecr8NpY+ory8Htr4= - - hash2 - - XktqI+8xl8PbMEvBYYRwmf4FUttFZQhcJ0sMak4vlro= - - optional - - - GoogleKitDialogs.bundle/Resources/en.lproj/GoogleKitDialogs.strings - - hash - - xoSJIx76u3jZ7zEuvbxyGkOt4L0= - - hash2 - - 8xsAecJoaQEgQC4JFixJx5eLCMBXgAXdrYu6UJNvNUk= - - optional - - - GoogleKitDialogs.bundle/Resources/en_AU.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - hash2 - - uugBQDhZmlueQ2N1iZlvWAbR/X383EFDEptszzw9xqw= - - optional - - - GoogleKitDialogs.bundle/Resources/en_GB.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - hash2 - - uugBQDhZmlueQ2N1iZlvWAbR/X383EFDEptszzw9xqw= - - optional - - - GoogleKitDialogs.bundle/Resources/en_IN.lproj/GoogleKitDialogs.strings - - hash - - hnfQy0lN48/nOBbQSDdvSKdB+5s= - - hash2 - - uugBQDhZmlueQ2N1iZlvWAbR/X383EFDEptszzw9xqw= - - optional - - - GoogleKitDialogs.bundle/Resources/es.lproj/GoogleKitDialogs.strings - - hash - - X978KYvajDEvvvuzOTgoaPPBbYY= - - hash2 - - 7lQiC6hCfpOjpxqNceb6A+Vo/4y2Q7zG4OVybeAPtWk= - - optional - - - GoogleKitDialogs.bundle/Resources/es_419.lproj/GoogleKitDialogs.strings - - hash - - wMf93hxAGRuEKenH6s06fXhiFhI= - - hash2 - - HcRdXOhT6A1o1ZboNPZL9SYDYseYlo7FIh/19jtKaCM= - - optional - - - GoogleKitDialogs.bundle/Resources/es_MX.lproj/GoogleKitDialogs.strings - - hash - - wMf93hxAGRuEKenH6s06fXhiFhI= - - hash2 - - HcRdXOhT6A1o1ZboNPZL9SYDYseYlo7FIh/19jtKaCM= - - optional - - - GoogleKitDialogs.bundle/Resources/fa.lproj/GoogleKitDialogs.strings - - hash - - TjKOz3kfcdUUYfA548yPvQkIzLY= - - hash2 - - pdg/33cA3z0kdeWlQ7iN2+ouxIMHYCk+OG+mMU8W9tc= - - optional - - - GoogleKitDialogs.bundle/Resources/fi.lproj/GoogleKitDialogs.strings - - hash - - 3xx0gipx6AP3VeWWDpFmuoJn0VI= - - hash2 - - 94dr2hlXjOGu5x/RzQ2uQLop5PZqCJCsnTmp0IQAZnk= - - optional - - - GoogleKitDialogs.bundle/Resources/fr.lproj/GoogleKitDialogs.strings - - hash - - iiugAWg8d/GXBKp3/BlTXMuFLQc= - - hash2 - - VRP/WLacKnaezXFbORvpTe/KpKU/3Qvrap18pKuZG3o= - - optional - - - GoogleKitDialogs.bundle/Resources/fr_CA.lproj/GoogleKitDialogs.strings - - hash - - uMEvCkOV9t0fKt9uMQDVBzVuSS4= - - hash2 - - alT7etQJqYm3Cm0jZOTLbrtmY4GBT8reVsa14LqR/Xk= - - optional - - - GoogleKitDialogs.bundle/Resources/he.lproj/GoogleKitDialogs.strings - - hash - - HmMniq5QygOzBGBPgbk8tHNngpc= - - hash2 - - LwqRBjOU443xfnutjUt8TZ83afCo5WqgjhiGlPq/CeA= - - optional - - - GoogleKitDialogs.bundle/Resources/hi.lproj/GoogleKitDialogs.strings - - hash - - 9vlNEFFDUAfCGk0jVwm5HvnHxXU= - - hash2 - - X4fk/uagbvwRLIzHwbINRuGTDkB7PptaNWDoEppqcho= - - optional - - - GoogleKitDialogs.bundle/Resources/hr.lproj/GoogleKitDialogs.strings - - hash - - K5GbDN2QQl5JpLqHMjryX8hjGxo= - - hash2 - - Aa5miNo3tHIYvOgVzXsn+ToJGZaf0gVaPpjJfoRMKhQ= - - optional - - - GoogleKitDialogs.bundle/Resources/hu.lproj/GoogleKitDialogs.strings - - hash - - hu/6rBYTwUuQIojF4WBevRTcgQs= - - hash2 - - +Z61+za3nLFXDOZshJgo1wh9Ipq9gDReoKBup+LEtWI= - - optional - - - GoogleKitDialogs.bundle/Resources/hy.lproj/GoogleKitDialogs.strings - - hash - - Lib0s1qNgFmePohhuBDhtDB0EE4= - - hash2 - - 8JQZK4VSuJuBTNPvxhB7ftByKv/6NY5XqZQIjMtk2f4= - - optional - - - GoogleKitDialogs.bundle/Resources/id.lproj/GoogleKitDialogs.strings - - hash - - qORRDavuofRLmRQK8BeinG6HZRU= - - hash2 - - /2mVoD6xYUh9L0ddGISks1n9WowseLitBOaFSTo+wII= - - optional - - - GoogleKitDialogs.bundle/Resources/it.lproj/GoogleKitDialogs.strings - - hash - - Y+8IcgmhTdkSsaRgI1WCH43WTOg= - - hash2 - - eQgToKSaHCGcvYJowM27t8FkMTe4yFOwYza9zAm90wY= - - optional - - - GoogleKitDialogs.bundle/Resources/iw.lproj/GoogleKitDialogs.strings - - hash - - HmMniq5QygOzBGBPgbk8tHNngpc= - - hash2 - - LwqRBjOU443xfnutjUt8TZ83afCo5WqgjhiGlPq/CeA= - - optional - - - GoogleKitDialogs.bundle/Resources/ja.lproj/GoogleKitDialogs.strings - - hash - - TThtfT1PBoB9aBpYdh7ixsSbC6k= - - hash2 - - LYZ6rO9zYnlTnvdH636dZb01zyfqITA4mmgX3Hr4E6g= - - optional - - - GoogleKitDialogs.bundle/Resources/ka.lproj/GoogleKitDialogs.strings - - hash - - vbqw1vIDLjFwqIFVThTdIqBtvQ4= - - hash2 - - fRho/KVPx4bRPWs26QjTQWZAlu9RRBukO27NnhTtvKY= - - optional - - - GoogleKitDialogs.bundle/Resources/kk.lproj/GoogleKitDialogs.strings - - hash - - 7fn4p7+WE/l/kt0ee7ye3zIBMkk= - - hash2 - - G/DZ2YUbXXSApotb6YbpbrtwSXXfUkOVxWsYgp1LEvk= - - optional - - - GoogleKitDialogs.bundle/Resources/km.lproj/GoogleKitDialogs.strings - - hash - - riTEsapgmpKSlOcv3tKwz1dG46M= - - hash2 - - 15g63NRFXtgYOj2cjwR/ePvOnO+6awIJQkFwXheP0eo= - - optional - - - GoogleKitDialogs.bundle/Resources/ko.lproj/GoogleKitDialogs.strings - - hash - - xKNYMwPmUFEnhKdlxNtepdWkgl0= - - hash2 - - 2oZMaPN7d0Eq8+2TkdrMT2y8AQBkXN3yOU75zZd7XpA= - - optional - - - GoogleKitDialogs.bundle/Resources/lo.lproj/GoogleKitDialogs.strings - - hash - - 5l/Ee+ScMY+7RZotYgtRQJCeGPs= - - hash2 - - P+to1KnjI6V+HrWiVxq+WenHkk90pPZNMS2hrn35ppE= - - optional - - - GoogleKitDialogs.bundle/Resources/lt.lproj/GoogleKitDialogs.strings - - hash - - vuWkt0k4ZBpzafue2AbpFwk1HLg= - - hash2 - - gjbu/7rOB7wR523aerHSa3uewF3a+0V0g6EpNQ/+n/Q= - - optional - - - GoogleKitDialogs.bundle/Resources/lv.lproj/GoogleKitDialogs.strings - - hash - - Lx1jRghrLk7MdFkRe0TApHRLQPc= - - hash2 - - 5aR+9rgtGxMTFjQxLHkcyezBEAhDpytS98m69jm6Ttc= - - optional - - - GoogleKitDialogs.bundle/Resources/mn.lproj/GoogleKitDialogs.strings - - hash - - R4wpeSWU+qIH+x2cPRQp8BnJqcY= - - hash2 - - H/ief7gHw+r032wGc0h9OYIDEUCT6bW6ooRHq7+VZ9o= - - optional - - - GoogleKitDialogs.bundle/Resources/ms.lproj/GoogleKitDialogs.strings - - hash - - upcLRV2Ez5fLyY00q2N+w3FMUrI= - - hash2 - - Z15Cf0foR+NJHluV8jUTaXy6rZ7XTz0wH7Tl1OYWGJw= - - optional - - - GoogleKitDialogs.bundle/Resources/nb.lproj/GoogleKitDialogs.strings - - hash - - 1nY2zOrn79RMWtfbNphyzLa9sSA= - - hash2 - - kjZwF9cLmT4cDXN8S39Rj4O6vTtLrngoN+8fbgI5+yg= - - optional - - - GoogleKitDialogs.bundle/Resources/nl.lproj/GoogleKitDialogs.strings - - hash - - PRTNG7vkDGkixQxsbnlMnntPxPk= - - hash2 - - q/9UdXXMUaVSdernXYV7cbRhpVNdHbCPr7wYxXJqjdM= - - optional - - - GoogleKitDialogs.bundle/Resources/no.lproj/GoogleKitDialogs.strings - - hash - - 1nY2zOrn79RMWtfbNphyzLa9sSA= - - hash2 - - kjZwF9cLmT4cDXN8S39Rj4O6vTtLrngoN+8fbgI5+yg= - - optional - - - GoogleKitDialogs.bundle/Resources/pl.lproj/GoogleKitDialogs.strings - - hash - - VT1lWvdKl5+fnvJ1G7q2SQtiTBw= - - hash2 - - QbxEGFwJBxlmlbPzLhgrspTvxEbHQ73dbfeG0qTy474= - - optional - - - GoogleKitDialogs.bundle/Resources/pt.lproj/GoogleKitDialogs.strings - - hash - - bwYUOPhA2egLeXdiqOPVN2LgL34= - - hash2 - - 52Arf4Wn9o8vDCv82xp9bvIhMbodrTNqHanIKLILYsA= - - optional - - - GoogleKitDialogs.bundle/Resources/pt_BR.lproj/GoogleKitDialogs.strings - - hash - - bwYUOPhA2egLeXdiqOPVN2LgL34= - - hash2 - - 52Arf4Wn9o8vDCv82xp9bvIhMbodrTNqHanIKLILYsA= - - optional - - - GoogleKitDialogs.bundle/Resources/pt_PT.lproj/GoogleKitDialogs.strings - - hash - - n3vT+a3gAtWqWMZndk0EGuxdVtE= - - hash2 - - +uWS6n3kyVRUv1+FmK1Tf9MOCpkd7lQsG2lvNN+1Hmo= - - optional - - - GoogleKitDialogs.bundle/Resources/ro.lproj/GoogleKitDialogs.strings - - hash - - cjeTZjmMWwwZJGrV2Wig918lm2k= - - hash2 - - IaDIl9wXPoG8zhR0yVZ5qZy51Un/zqhF1fDfTdJrqV4= - - optional - - - GoogleKitDialogs.bundle/Resources/ru.lproj/GoogleKitDialogs.strings - - hash - - iD+WaMXXrSRY0/6ExXh4XNi4vo0= - - hash2 - - 3qAfbiDuifB0iTFD4lDSaYI/ZkqZCfb9Di1OLcfDtFc= - - optional - - - GoogleKitDialogs.bundle/Resources/sk.lproj/GoogleKitDialogs.strings - - hash - - wk/VLlvonpw58jGrAnigELhxEEI= - - hash2 - - EVkZUpa00nQFmfBiXTSnzr6vrfAUtvgALaV27Fwt6ik= - - optional - - - GoogleKitDialogs.bundle/Resources/sq.lproj/GoogleKitDialogs.strings - - hash - - /jw3z9DFWDV0xPPQlS7s1z0fyOc= - - hash2 - - ioPXnrVXJMih/ixc1PFEBBrQfyFmmlzfOUhBD1cpjHM= - - optional - - - GoogleKitDialogs.bundle/Resources/sr.lproj/GoogleKitDialogs.strings - - hash - - 4kNU9JkUSYwkpUn8vMgUPSkChfQ= - - hash2 - - oVmyz055ISrTvy/t3bYcJdE0dBBVT9kRk8RySH/HQYU= - - optional - - - GoogleKitDialogs.bundle/Resources/sv.lproj/GoogleKitDialogs.strings - - hash - - 1Ev+aczEP5IU9DN6lZmf/1FU3fM= - - hash2 - - 3/wPOZLRE3ceo0uKYDXdIfmwHQS1G2bYJLayvXpqa14= - - optional - - - GoogleKitDialogs.bundle/Resources/th.lproj/GoogleKitDialogs.strings - - hash - - wLiG7dVvnp3q7Bt99o+waGQEkQQ= - - hash2 - - 8yutK3+OaOgt26+ReaMOtuulSjqsAnPWojb6rgwGdaY= - - optional - - - GoogleKitDialogs.bundle/Resources/tr.lproj/GoogleKitDialogs.strings - - hash - - i09LFoHpUC7A/z64md3c2MyPrsg= - - hash2 - - up7prglyedW4sAY3zFMd6m1ukCyvdRyT60aMRmmZASM= - - optional - - - GoogleKitDialogs.bundle/Resources/uk.lproj/GoogleKitDialogs.strings - - hash - - HxfxRQr1DQqRRzD2OK0f6Y61MvU= - - hash2 - - QFNki5ZCjRCEYnWZIFUxVsqATIsy5MSaAxeyOwmCBhw= - - optional - - - GoogleKitDialogs.bundle/Resources/vi.lproj/GoogleKitDialogs.strings - - hash - - bvVyPUY5WPbQCJ97G6B1tbpQTbc= - - hash2 - - O5n03vD5x378iHkOmm9k0oKOFIhg+o4VGNxXVIhUDcc= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_CN.lproj/GoogleKitDialogs.strings - - hash - - llwV86uJl1i1EozmsR5OqfX2clI= - - hash2 - - xbRJ8RdMfiO18hd6mf15efsbs7/N6KVk4k0HL4DqlXc= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_HK.lproj/GoogleKitDialogs.strings - - hash - - exfGOojxi5Aa3wn8byhKgkATA78= - - hash2 - - SYHRA2VZRvARjSgtpBqHjw6FkLFEz1rkN5khTMQfK7s= - - optional - - - GoogleKitDialogs.bundle/Resources/zh_TW.lproj/GoogleKitDialogs.strings - - hash - - Liyx3uk451DzpDz4QaCewnPCAR4= - - hash2 - - Lb3PAOi4+6iJ7WgisYejLtWeIaIeuir7ijZu1TZe3W0= - - optional - - - GoogleKitDialogs.bundle/arrow_bottom.png - - hash - - zfKxccgJSL/kZPBd6V0HdE/j9TI= - - hash2 - - qLBNGWcM99TI0bFRXQJyls8cs3NYwHmcVRLVRDEllk0= - - - GoogleKitDialogs.bundle/arrow_bottom@2x.png - - hash - - yzBM9E16FVC0WRqUTEDrJuCF6Os= - - hash2 - - 7mwg/SKBCi4CpFM8Tmk1s2aMFqA8ZiHLKnVNOIeYxWM= - - - GoogleKitDialogs.bundle/arrow_left.png - - hash - - 4h+2KQZ1mMkQg1FDazLt866dzuM= - - hash2 - - 15nFWdWa1ARaqHKwUbpxzQRVqbsfhc8jqjKQM+uldRU= - - - GoogleKitDialogs.bundle/arrow_left@2x.png - - hash - - iEoNYuu6JAATS+KkiPqjx2TjbC4= - - hash2 - - nud1tUq5QPQDzIAIKEcc5LmtFJrHhAkZqr6lsfwpHgE= - - - GoogleKitDialogs.bundle/arrow_right.png - - hash - - jK0sW8YoUA3QCBoei3eEmrOx9y8= - - hash2 - - Kubf7JBB1Ge/2QISEImTth1UIXij/1wbeACxDk4pEpQ= - - - GoogleKitDialogs.bundle/arrow_right@2x.png - - hash - - 2DOQN+Xj6wQh8sDLcupATh6/dyA= - - hash2 - - nyb0Wu3LgDgOEfYbGfl5Zj9wrtLXZU9vpO6Xcd18RtY= - - - GoogleKitDialogs.bundle/arrow_top.png - - hash - - SH2MJ9brpL5Y6ow1Lc/P5I1K6MQ= - - hash2 - - pYTNVNlhLC4X7XpfUbE7YBUHBZxL5rjiflTECM9J6Ec= - - - GoogleKitDialogs.bundle/arrow_top@2x.png - - hash - - BUZS/r+lvMdFduLDw4bQi94Ho4I= - - hash2 - - kvtFeI4lbdJkTb6mwCi6jIRYyhuRL+OlR4KgKbUiaHU= - - - GoogleKitDialogs.bundle/background.png - - hash - - 3EsGPAF2zDuSlfV1GfwT25eS5Hg= - - hash2 - - Cuzdi6mtXGl3iVH4eHS4Mfx/rAKC2B1rIQFohoNPKWs= - - - GoogleKitDialogs.bundle/background@2x.png - - hash - - kQIpxuz+hjck5dJ4jh1wtLSrlgg= - - hash2 - - LIqtBMMMH6+wgM+TSDlBBjhMJHqpvbMBZOTbnepU7Wc= - - - GoogleKitDialogs.bundle/bottom.png - - hash - - HOfN5XjGIHM83rXaPXp4B8NoIHk= - - hash2 - - zguKIIqPQ0aKZwcUFddC7w8rcMknMzoS/b+4krcr1ds= - - - GoogleKitDialogs.bundle/bottom@2x.png - - hash - - yQf7J/KE8NRkBI92um0n3bAaDKM= - - hash2 - - yVgwGQWmQGfEpqiue+tQPUGi/Budzu7DNIgwtZOMqXg= - - - GoogleKitDialogs.bundle/corner_bottom_left.png - - hash - - AuX+MIKLr2pOFe0t4VetUtwmfXw= - - hash2 - - tCVO0p8pUKfyVk+PqVRdC1fs/WxKwlFeqsv9ZUZpW1Y= - - - GoogleKitDialogs.bundle/corner_bottom_left@2x.png - - hash - - SHMfIzN3JzbC13f9V/nmG2D3opc= - - hash2 - - /Wkuw4+MiN6OLrxaafS1irAGTuRgUOJhDYiV76xeDnA= - - - GoogleKitDialogs.bundle/corner_bottom_right.png - - hash - - 9zHdtuM4X5SlfZG2evrjDM296e8= - - hash2 - - ehG5KCwRMLIFs/RQxe06dmxboe9CeCMyzOqK6JO+m7A= - - - GoogleKitDialogs.bundle/corner_bottom_right@2x.png - - hash - - n7f1J9rSsJdODXiY2mer/Bv5nbw= - - hash2 - - 4MjjmHs/fZv06hasGLLJrOXv3ZRZL/8/aQIDSNgFAy4= - - - GoogleKitDialogs.bundle/corner_top_left.png - - hash - - 0oBdEZjwDHbS7Wf7aAiM57epLf4= - - hash2 - - tUeGvdcQNnmY64WnOBRV4wa2KvxYBXcFsF4RFFg8Ytw= - - - GoogleKitDialogs.bundle/corner_top_left@2x.png - - hash - - V13nRxocUEsVwtbV9iU+1FDis6Y= - - hash2 - - 02qu5X1y4fgU0SyzgYTXi2qg/q/dLhGITv1rz5pMnvc= - - - GoogleKitDialogs.bundle/corner_top_right.png - - hash - - mfN6AFOkOFH4Xf+0L7x/s2pp0+U= - - hash2 - - jsJlwVnBBKMeZFGo0WAZlIdMeb8+7LStwR4OZhWX7qA= - - - GoogleKitDialogs.bundle/corner_top_right@2x.png - - hash - - p+Wvm5tL+Cab3afNJ0NKs+9452E= - - hash2 - - P+CF3yE7QixD2gWKLjU+Cpuh8IQgwI20E5qN/TSDUp0= - - - GoogleKitDialogs.bundle/ic_check.png - - hash - - 7YlS8BxQfJ54mZNnosLJTA+i+kI= - - hash2 - - I3FjvX5KUHeaUEqWqqoMEJYnt23Hv7ImrvP1gndJYc8= - - - GoogleKitDialogs.bundle/ic_check@2x.png - - hash - - AteJE6U6PwMvwioZ/t10XhiVJ9M= - - hash2 - - 4mpyMT0okBGChZO7ewRuvJOtH+rA+iLa6cy7YBuTd0s= - - - GoogleKitDialogs.bundle/ic_check@3x.png - - hash - - 4XBExChBsjNZC1Zk52EuWiT0AhE= - - hash2 - - CMAZLjm9DKMDm52cxxz8Mz/gzAwoCuRma7m7EbVvZ4U= - - - GoogleKitDialogs.bundle/ic_close.png - - hash - - uIvFQv+za0ce8VWAUHDjWkdJYVc= - - hash2 - - z/MN7nvJAp+yXuU+D+Y3NnYkIs8Zu8+neHLBYMSXvRQ= - - - GoogleKitDialogs.bundle/ic_close@2x.png - - hash - - m2uZzaOvA1M7z0u6lCK8W+LxPsE= - - hash2 - - D21H+dlJdtHkY+hLiC1nUDl3AxuAGRssYRu7pe0jUgQ= - - - GoogleKitDialogs.bundle/ic_close@3x.png - - hash - - yB0UZ4BJZwu0mCPwpqaI5cyeWoM= - - hash2 - - tpX3U1nzjbcQ8CdJp/t3T0eDkHVfBgGW2eU6X+Dt61g= - - - GoogleKitDialogs.bundle/ic_comment.png - - hash - - fsZt3b9STCAni1EY5neH9LoPqD4= - - hash2 - - sGVOaw5z+3GJ414whwwa83Szxxjbs3jFxKpTJo5sLrk= - - - GoogleKitDialogs.bundle/ic_comment@2x.png - - hash - - RnfmGIL1GCItaCBZjxKqFfwk5cQ= - - hash2 - - HWwP/IcnrB7yHKlC4BZMdlPM907kDZn57wFexczzL2I= - - - GoogleKitDialogs.bundle/ic_comment@3x.png - - hash - - 64uUjyuvgN827suFDjxlBd3fzu8= - - hash2 - - HnJobtsXa4CssDMIip0r+lTiR97ptJXn2+kx7nGr3YI= - - - GoogleKitDialogs.bundle/ic_delete.png - - hash - - qU8grkqOLbFGN/DJCSkrlCH+PM0= - - hash2 - - PCtebc3Dyy/V+F0AKXvcP+pJD8BXUMdvTspveEGhZX0= - - - GoogleKitDialogs.bundle/ic_delete@2x.png - - hash - - UazQCMTour2Y/5yOZNz+spYPSNQ= - - hash2 - - l2BuSRAOl47/w+cIzYdQweOKdleyYm38lpd/E7wLf7c= - - - GoogleKitDialogs.bundle/ic_delete@3x.png - - hash - - HoRbp65Wh2xyXDtTE2rsMrOT8uA= - - hash2 - - QsgZBzzu/QCQ3De1oummIYk3GzCDq4GjkU0ytFK454s= - - - GoogleKitDialogs.bundle/ic_email.png - - hash - - C5QDGGnRei4yll4bvfQo1fC3Lpk= - - hash2 - - xoIArKtMay1sZMKe44S2U7XUpSv3ML7dh1X7b+36q5c= - - - GoogleKitDialogs.bundle/ic_email@2x.png - - hash - - Qzj9490REhlCIzdLej2h+xwb+I4= - - hash2 - - +npd8BVH4isJ0IlYfoY3B4+0Y96L3G5PkVVnRhowVLg= - - - GoogleKitDialogs.bundle/ic_email@3x.png - - hash - - uRc/+vGWzPerwjlQGRQBcmQnf7I= - - hash2 - - 9PbqFGnsixHUMt0J+CLRHwjjRZ6gA1DHpob+K0HIGtE= - - - GoogleKitDialogs.bundle/ic_file_download.png - - hash - - B6B5i7Ci3SmqcyIEEYPnkRSMGzI= - - hash2 - - aMghiQrYtJhoBl7iBh+PGOZBs2BpH1i0WmwBkWMURU0= - - - GoogleKitDialogs.bundle/ic_file_download@2x.png - - hash - - /yQ+k/inZPqKt9PtibpadzrOt/Q= - - hash2 - - ma5kBskXwXafTqhmOIgi4281O0de8NuIW54opntI8hU= - - - GoogleKitDialogs.bundle/ic_file_download@3x.png - - hash - - YDw846NXbesLRZ6fgEcjEMYfLM4= - - hash2 - - z30q907D31/dDwewK6egVHeWzvrbWCWLDeBJabDTPZE= - - - GoogleKitDialogs.bundle/ic_info.png - - hash - - FJYDB1Ub4dkcFJUsN58VlsxsrGk= - - hash2 - - YWpKHuzV/kTD2FXBBUp5pZJYiQc0RyH8Bc+Ld5M/sNA= - - - GoogleKitDialogs.bundle/ic_info@2x.png - - hash - - osVrIl4NcZXVDgw3mjBKnSFPmx0= - - hash2 - - 3PmS954x2goyJK+CXV3I6VRHlH4xiNqwEHgMM0fqRgU= - - - GoogleKitDialogs.bundle/ic_info@3x.png - - hash - - YJH3tDumg4IJKZA0T87l57IkTOk= - - hash2 - - FYJwpmeWnscU6UN5HK7tdTNnP285oKY/Lh3ocOVdtv8= - - - GoogleKitDialogs.bundle/ic_link.png - - hash - - MK98PiWh9qXVKqtEKTjUQKvEQ+8= - - hash2 - - qDAApc0CeIBg1q55V8sHLEPuOQunVd8JsBMM3i3nK4M= - - - GoogleKitDialogs.bundle/ic_link@2x.png - - hash - - KkKrkUc8AmTG+MhDyBAoDlatk48= - - hash2 - - V8lwGmsYKqSxc5KfBBqlrm9NWeDyxFu++TKoPzdjl0k= - - - GoogleKitDialogs.bundle/ic_link@3x.png - - hash - - k69lxGe/UJ79p1tO0NQeGRba+rY= - - hash2 - - l7PvP/Rj4lfxRganAQeyxvY1N0LloieShG4oVR9jLZU= - - - GoogleKitDialogs.bundle/ic_message.png - - hash - - sCVzxqdw5lKeiEEtN2wzQ006V9A= - - hash2 - - brHIGKDwo9BO/fzLnmtyFPNGst95ZDd+nbFwefnQ/VQ= - - - GoogleKitDialogs.bundle/ic_message@2x.png - - hash - - F3OF5VvOqSmFYTRJz7fIusrHZfY= - - hash2 - - BH4tyh9QwUiUumZNiyeBK1rIhgjd0/av5z+d5uePjO4= - - - GoogleKitDialogs.bundle/ic_message@3x.png - - hash - - gzNrxuhJjkwFJWgBUHRs8ntLTSY= - - hash2 - - BxkQEB0bqaoRwbaKMx1ry15a/wWAGMveD82S0ppHn/8= - - - GoogleKitDialogs.bundle/ic_mode_edit.png - - hash - - 7Xlc6WdqZZQQActAE2sew63BN00= - - hash2 - - fx+nd3RIH0Qechq2a+tO9AAkQ9xTAfydDDp9wihQfwI= - - - GoogleKitDialogs.bundle/ic_mode_edit@2x.png - - hash - - LnZSspyCDwljwEpCh5FHvHvoHMc= - - hash2 - - t3tSNn58Q8GjRiouW5saXehbM1LQccAWTH/BK5pl7HU= - - - GoogleKitDialogs.bundle/ic_mode_edit@3x.png - - hash - - w1myZR6QQ0LC7bzBlDe28+dHE6c= - - hash2 - - X0xMhA2r5TnGiwfMdrbz6m6Ma4d+7xNJC8AKwkx/iJ8= - - - GoogleKitDialogs.bundle/ic_open_in_browser.png - - hash - - +bC58jBYMyt2ICn/Uzu0Y1PJieM= - - hash2 - - HabLow8v6W8wBFiw5tbS32Z0AuIrcwFcIKKlZQeWmkI= - - - GoogleKitDialogs.bundle/ic_open_in_browser@2x.png - - hash - - gEhpZajVyfk/MT/k8EiggjFKxy4= - - hash2 - - 3YcLKHH30kjnzjyeipAN5rDPootMozlcmJAZNNSKyQI= - - - GoogleKitDialogs.bundle/ic_open_in_browser@3x.png - - hash - - eoc9LE0/lJZOzScsv8ORtVUiPEY= - - hash2 - - uSJmqnXLaySYF97xUxxnzyft7YpfyXsJRsQCiSPV9uE= - - - GoogleKitDialogs.bundle/ic_photo_camera.png - - hash - - MIn+/bIl9+oAex1+lpThoWKg6ao= - - hash2 - - a5ULdxEQl9hl+BtuyUJL6Qpg1Hh4+rjuTGKr7hrkJ74= - - - GoogleKitDialogs.bundle/ic_photo_camera@2x.png - - hash - - RajOeGX8TO1Vqm+hD9uFedBNWd4= - - hash2 - - ATy7xtf1XZ7WKPMxHfgRU83LYulEeYtqqsBLTfM5NbY= - - - GoogleKitDialogs.bundle/ic_photo_camera@3x.png - - hash - - 9xHFmUxTVzx9+bgDPZoQaRvAetU= - - hash2 - - k73ULij03fyfJtK3BkVDN0M9wkt+f1OBOjsYbeVjsrk= - - - GoogleKitDialogs.bundle/ic_photo_library.png - - hash - - KlfuuNzldgKUa5BIIKtXTPx0wMI= - - hash2 - - CCPDkZgCAitr2EId+AoWSmSJQ8VG5duq1hQ69aNZ3lI= - - - GoogleKitDialogs.bundle/ic_photo_library@2x.png - - hash - - W4r8OrbUJXxbD4OonzffeOrKis4= - - hash2 - - 0cf9eb1JixcWKkP8FLfuzT2ghte28ERM5Ll1m4Mw6nE= - - - GoogleKitDialogs.bundle/ic_photo_library@3x.png - - hash - - ZZ/CUcgHTx4HNCah3J5hcot3MCs= - - hash2 - - kLFypT6Yu7m69mFMuWXhV6bYNZb1WCugZrBp/U/vWBU= - - - GoogleKitDialogs.bundle/ic_post_gplus.png - - hash - - CvNEixGNLOjmId4tqkYgZnr7LaU= - - hash2 - - cy95LfNMx8n9UrLAQoWjdzWGhjJ0uNlaL8smV2KwpPw= - - - GoogleKitDialogs.bundle/ic_post_gplus@2x.png - - hash - - SckaYhp13eh74wpzBHXq14tDrDI= - - hash2 - - VOJhFAnV32hs2RlUYO7KxMwaHTOlF39+gWT+NI4HALg= - - - GoogleKitDialogs.bundle/ic_post_gplus@3x.png - - hash - - LT8hbqEGJwxQPhPs/kcbPtvHWu0= - - hash2 - - hetvGWuy6f0HyLCpdjf15A3qAQ/ifEoH7z+fQs2h5Qs= - - - GoogleKitDialogs.bundle/ic_print.png - - hash - - sps2m7fOvRdOUh5cqevkO5S+dsE= - - hash2 - - EuWHc40MSsMKTWOqDGsWEJ2obnPkw27jx3yXpWS7PvE= - - - GoogleKitDialogs.bundle/ic_print@2x.png - - hash - - X4FZ4ndGiTfYDV7+ejSL7QZ03Rc= - - hash2 - - MQbN/qIdTyIQPCRe3RZfEE0l6+EnC0qvefYELAotfyg= - - - GoogleKitDialogs.bundle/ic_print@3x.png - - hash - - m3CndM3rYzpAoesGS0GjREymIoA= - - hash2 - - h5ixCzMak6XpzvwEPMGvZk7s8gnqgmxhOPit5Tf0ssI= - - - GoogleKitDialogs.bundle/ic_report_problem.png - - hash - - zJhL3lcrgJTSJxsvDOEb45kkPUA= - - hash2 - - Gsjl2fsWQLMrbodg6Himx79/TaM1pIgFXRdjKtxvV5M= - - - GoogleKitDialogs.bundle/ic_report_problem@2x.png - - hash - - m2QgrOoj6dK8oo8jP6SoJh7s+d8= - - hash2 - - KJJXgqpsnmShlzuA01O6RN+gOVfF0R7uIoqEizVzx7E= - - - GoogleKitDialogs.bundle/ic_report_problem@3x.png - - hash - - 242DYE8Uo9/P/sap59XGBQmm0H8= - - hash2 - - MoNuLPbvchMiVlYbjByCp60PfvWGJd3cDNecAQjdOt0= - - - GoogleKitDialogs.bundle/ic_report_problem_red.png - - hash - - ghYJA+1VA2mtGnf9IJaikVwqJnw= - - hash2 - - ayGQbx41ej68PmKpkhk1y4pZs9FjxMGlVIoEf95moWk= - - - GoogleKitDialogs.bundle/ic_report_problem_red@2x.png - - hash - - mwGArBI0lnFep4UdDiGS6Yu/dqs= - - hash2 - - QAPtw1yZ2aLT2VkPg+HIr0olII5b9oBIBsBsytCdbeE= - - - GoogleKitDialogs.bundle/ic_report_problem_red@3x.png - - hash - - lzbY9bVj7a+fFYOpC5YbqNYjI+4= - - hash2 - - X8q7kmrdHtGuF62XdHev8YV8u1wQ/u2dbown7v+NM3c= - - - GoogleKitDialogs.bundle/left.png - - hash - - xtjDsHLZRQE5/ekNBsh6xSEcsvo= - - hash2 - - dZcKj/mJrl6UI0cC0Awh1VGp/8wU/9oB84pAKQiQWUA= - - - GoogleKitDialogs.bundle/left@2x.png - - hash - - MZKAzvCfRv746Tqe4IE96XVxHIM= - - hash2 - - Zu1Rz7vWfe0E2G+e3OEOZ2DgQRwYkpiycq5fMqWZpGI= - - - GoogleKitDialogs.bundle/right.png - - hash - - gOrm8ACRnhLXAOk9r8Aw1z7Voqs= - - hash2 - - bCmJSv+K/KZuzF0Xa1RQRwl6co9gt5re5R+KmdcgkjI= - - - GoogleKitDialogs.bundle/right@2x.png - - hash - - EcOWeHYRFhbiQAFAs6O6Z/g0WUw= - - hash2 - - LfFLbU9k3Kj3vcE5AZ68O5qrlioWvJeKRD822vZdCuo= - - - GoogleKitDialogs.bundle/top.png - - hash - - voQqqKUF0YiK6wJkhzpNgUoeLmc= - - hash2 - - AnwJBjWJgEkcjy4m9WnS0DiIaZKcqQ3Q6WPW40IsyM0= - - - GoogleKitDialogs.bundle/top@2x.png - - hash - - Xu+KUYmB9pm1CmDytU2wAUibKGU= - - hash2 - - DU+pjxf6M9evzF/YSuicnspy65QrBBJMAIflDx+WGWw= - - - GoogleKitHUD.bundle/Resources/ar.lproj/GoogleKitHUD.strings - - hash - - AaNmjkCbjrYDl06swIvVv+SFEdw= - - hash2 - - bVzGpLsLGKQjZ+Nukse1CtREvYkp3E5VgwD3k2xiNzk= - - optional - - - GoogleKitHUD.bundle/Resources/bg.lproj/GoogleKitHUD.strings - - hash - - 9onkxmM8jRn9rmZrBj2mutG9CfU= - - hash2 - - 1uwqQ3YY3b0mKgdnKelFQ7tOBGVuMtjAUrQVMur8zhA= - - optional - - - GoogleKitHUD.bundle/Resources/ca.lproj/GoogleKitHUD.strings - - hash - - Mr93ZCk83KDgxaWed/ocxflPsjQ= - - hash2 - - 9nFfo8wN7cibMpefr3WdUz0+zPAY5KlWFYpaRj8BUkE= - - optional - - - GoogleKitHUD.bundle/Resources/cs.lproj/GoogleKitHUD.strings - - hash - - DS4Ga/tGR9av0Bldybf54LAxoks= - - hash2 - - w/n2AMzv+hbxzohV4zetv4QidBIR9ENLtLoBdQTyaVA= - - optional - - - GoogleKitHUD.bundle/Resources/da.lproj/GoogleKitHUD.strings - - hash - - iMNs1mt1S6Q0RP1mCu9anu3YQd8= - - hash2 - - ZrQhfADQ+YV9L0hsy+9sg176HEUvFUHUAomCN7PCRkw= - - optional - - - GoogleKitHUD.bundle/Resources/de.lproj/GoogleKitHUD.strings - - hash - - xhcmc3AcCpH+Qm8gd8NKwYYNAnM= - - hash2 - - JyERN6s+zVw0Q5HcBD8atkAQHrbjNA4sTZJ5otYljTA= - - optional - - - GoogleKitHUD.bundle/Resources/el.lproj/GoogleKitHUD.strings - - hash - - 6TMH/p6z7KvNSoAUKFB9R/JgCDM= - - hash2 - - cERgYGTRLEthw5FWmjtSjJBjL27B9zFO7fPcQ2myvEo= - - optional - - - GoogleKitHUD.bundle/Resources/en.lproj/GoogleKitHUD.strings - - hash - - 8yDQcLNsp0Sn2uTbporqa48QJ8w= - - hash2 - - nq0vKbGbkuEV+haxFWuSuE3PlCqqDZ3FCRSooB8wv8Q= - - optional - - - GoogleKitHUD.bundle/Resources/en_AU.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - hash2 - - BFw9wQlCNxadq19hnnzc/n8goHSw2NvkAIVyT7yWf1Q= - - optional - - - GoogleKitHUD.bundle/Resources/en_GB.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - hash2 - - BFw9wQlCNxadq19hnnzc/n8goHSw2NvkAIVyT7yWf1Q= - - optional - - - GoogleKitHUD.bundle/Resources/en_IN.lproj/GoogleKitHUD.strings - - hash - - uVp3Oadxrl0EtqGipO7F9DILHWg= - - hash2 - - BFw9wQlCNxadq19hnnzc/n8goHSw2NvkAIVyT7yWf1Q= - - optional - - - GoogleKitHUD.bundle/Resources/es.lproj/GoogleKitHUD.strings - - hash - - bp7trgjw+C6Cc/v/LuF99Egzhug= - - hash2 - - C6c/5Vue2myWQQLLgeOLZj1PzSMZ/wI7h0logveiRy0= - - optional - - - GoogleKitHUD.bundle/Resources/es_419.lproj/GoogleKitHUD.strings - - hash - - M7q07s6g+7CezOA3WFaskcie9Ys= - - hash2 - - DL4gA3OAfSPUc7Hlw64RQuYMl3o6bWFBNNCJYnib5Cg= - - optional - - - GoogleKitHUD.bundle/Resources/es_MX.lproj/GoogleKitHUD.strings - - hash - - M7q07s6g+7CezOA3WFaskcie9Ys= - - hash2 - - DL4gA3OAfSPUc7Hlw64RQuYMl3o6bWFBNNCJYnib5Cg= - - optional - - - GoogleKitHUD.bundle/Resources/fa.lproj/GoogleKitHUD.strings - - hash - - KX9Oc1hCnSVqtaqgw88+LtDuVlU= - - hash2 - - uSpD2kATs7AHVf4vaDhH7+ppBzRWQbN/lqJa3jC5ghA= - - optional - - - GoogleKitHUD.bundle/Resources/fi.lproj/GoogleKitHUD.strings - - hash - - 4Rr5aSBIArDnfLk6gHn5/I3dKEc= - - hash2 - - cYuMSWHLnaJjVDpKIENFH0hWo/bluZ1JP60o2YlGxfU= - - optional - - - GoogleKitHUD.bundle/Resources/fr.lproj/GoogleKitHUD.strings - - hash - - SDDHj/f8qk8PamYofFI7gMxiBUY= - - hash2 - - 7aPmS6itqjFJ9YBSEXbI9DANF9Re+xzcPZ7VjMyYqLQ= - - optional - - - GoogleKitHUD.bundle/Resources/fr_CA.lproj/GoogleKitHUD.strings - - hash - - pZ3GX+u4BZCk7xa1n8V/i6bctG8= - - hash2 - - yucvRDTQbBwn08ZYmjj9Q12GlkewnZ4oEPWUBSKSSiY= - - optional - - - GoogleKitHUD.bundle/Resources/he.lproj/GoogleKitHUD.strings - - hash - - PRBUQcUTBHKyNg8WEpcHKumgAgs= - - hash2 - - Qf0Ivuqh27DUI+exG0HzEVt1Ef1sXZYJbknBtjHeCmg= - - optional - - - GoogleKitHUD.bundle/Resources/hi.lproj/GoogleKitHUD.strings - - hash - - I1o0Spslb/0/q01PhDbWIiRwXQ4= - - hash2 - - pR0ElM0qkFIvslkABuWZFvYWEKk+nH59e5X4Gi7EKR0= - - optional - - - GoogleKitHUD.bundle/Resources/hr.lproj/GoogleKitHUD.strings - - hash - - 3tmWqbfG3w3Njjl3qDv7QHmKvfI= - - hash2 - - bz4UeObMMHa1NOZcbnT5VmWnXOqZagxalGc/R64xgLA= - - optional - - - GoogleKitHUD.bundle/Resources/hu.lproj/GoogleKitHUD.strings - - hash - - HkSvjp9GIS8mOeU9kc+KSz9HQk4= - - hash2 - - jOoQDuG2kqZJlwqN1eNjc/MFbraKiPTp0wVgp8Gc0xU= - - optional - - - GoogleKitHUD.bundle/Resources/hy.lproj/GoogleKitHUD.strings - - hash - - JWi8uig1JF6yg2jrJVp1kbvt+M0= - - hash2 - - 5aRMW+i3iNnTMobyKdoy3elQOEREDYBjm9h4NDfytWM= - - optional - - - GoogleKitHUD.bundle/Resources/id.lproj/GoogleKitHUD.strings - - hash - - M7FVwr2ejyS8PoR7KUy5fqSWprc= - - hash2 - - Vj/il+espk6P9fQ1pqBVptyZgcjXHIgzY+NWPikJSJc= - - optional - - - GoogleKitHUD.bundle/Resources/it.lproj/GoogleKitHUD.strings - - hash - - Ovi2gE+2cEupNzCHNHKy6I7KPCk= - - hash2 - - K0B7+HU5Gki9VRtmpqcshEjbPLZSZG7NF/EuaJYe/R0= - - optional - - - GoogleKitHUD.bundle/Resources/iw.lproj/GoogleKitHUD.strings - - hash - - PRBUQcUTBHKyNg8WEpcHKumgAgs= - - hash2 - - Qf0Ivuqh27DUI+exG0HzEVt1Ef1sXZYJbknBtjHeCmg= - - optional - - - GoogleKitHUD.bundle/Resources/ja.lproj/GoogleKitHUD.strings - - hash - - wjI1zUzwo+M84X80Ln9COaOPiD4= - - hash2 - - 8j4ROUWtCEjVcEmO9wPnIky7m1ECNNZV6K3RliOCX9Y= - - optional - - - GoogleKitHUD.bundle/Resources/ka.lproj/GoogleKitHUD.strings - - hash - - 33XC4Q37/CFuvhHg1hOZgYuyd2E= - - hash2 - - 12OrOCMFmdhajKqFH91gfkK0wkLF8BGduELTvA2J2Ks= - - optional - - - GoogleKitHUD.bundle/Resources/kk.lproj/GoogleKitHUD.strings - - hash - - Mk963y70d4R8iSw777sWTmpZx2I= - - hash2 - - VvF8bp7Sp/GcQRy6HS8TZ/csHanrMCMTcZQsQrX1uhM= - - optional - - - GoogleKitHUD.bundle/Resources/km.lproj/GoogleKitHUD.strings - - hash - - Jp3bfWEAo3XOQ9MJe9y2r36P6/o= - - hash2 - - yuqEWfK2fgz87jrel/cJ3bo22C9ymZLH42XW1Ug8LGw= - - optional - - - GoogleKitHUD.bundle/Resources/ko.lproj/GoogleKitHUD.strings - - hash - - NNXW2kvbe4S0thwxSgxhxDoEeck= - - hash2 - - /ZAgZwj5yO9ZC0OANDJ/yKAhruZneCf4erCmDzAVoNM= - - optional - - - GoogleKitHUD.bundle/Resources/lo.lproj/GoogleKitHUD.strings - - hash - - kK/2uyfI5P05P0No3YVDOG3v/Gk= - - hash2 - - xiNJaXsPXu9hSoCcyko7yXrAr0GPYjz34oFjaSdeYag= - - optional - - - GoogleKitHUD.bundle/Resources/lt.lproj/GoogleKitHUD.strings - - hash - - MmTAdmNnQQAQpBX7rLYXDJ0P9sA= - - hash2 - - ZHBIARXWFftdlEx66dFD3wFcTGBiIl7trqGSK4wRIjY= - - optional - - - GoogleKitHUD.bundle/Resources/lv.lproj/GoogleKitHUD.strings - - hash - - tgiCZCAmx9O0huPGIkb3ngu8hpI= - - hash2 - - CLzT+GfOzB/lNaIsNFFvYx+4wwN24AiQCVE62z7Ng4o= - - optional - - - GoogleKitHUD.bundle/Resources/mn.lproj/GoogleKitHUD.strings - - hash - - YAazAb6EacRwLWdYqVjgVCHpWT0= - - hash2 - - vWASibw9H7a0ll03wYfLqbzVBnmXxBBVlYaffejAqdk= - - optional - - - GoogleKitHUD.bundle/Resources/ms.lproj/GoogleKitHUD.strings - - hash - - Z1Q/YOuauVh2yANH0REn14ojqsU= - - hash2 - - 5bc/okRPJMuOxv8wObcAtCqiawuN2v8kO4yKs6jqkZs= - - optional - - - GoogleKitHUD.bundle/Resources/nb.lproj/GoogleKitHUD.strings - - hash - - fLlMm5qte4UZlZeVNj+GiKSoidw= - - hash2 - - kJZU/WTO/bhyr94gH8wOMURWO1esJu0GREa2QjF3uwA= - - optional - - - GoogleKitHUD.bundle/Resources/nl.lproj/GoogleKitHUD.strings - - hash - - pagPHTlBp6IMFhYiNBZj4jkGdHc= - - hash2 - - 1hDEYrbFEirlr9yJA9P8iMxPz8M+5KUjTMoGSiYukPs= - - optional - - - GoogleKitHUD.bundle/Resources/no.lproj/GoogleKitHUD.strings - - hash - - fLlMm5qte4UZlZeVNj+GiKSoidw= - - hash2 - - kJZU/WTO/bhyr94gH8wOMURWO1esJu0GREa2QjF3uwA= - - optional - - - GoogleKitHUD.bundle/Resources/pl.lproj/GoogleKitHUD.strings - - hash - - vNvovxxNwq/ab/aNA2fwgvV08J0= - - hash2 - - igeYqr8NLc++ia9XuMlso74IqD1Uu+d14pS9OT6WcQA= - - optional - - - GoogleKitHUD.bundle/Resources/pt.lproj/GoogleKitHUD.strings - - hash - - +lYznxUTyFYr0mG3NSI4GayRdzw= - - hash2 - - hbjmZhBM6I41QLu2DwYujijDL010uJV5TbPTuvmBGNk= - - optional - - - GoogleKitHUD.bundle/Resources/pt_BR.lproj/GoogleKitHUD.strings - - hash - - +lYznxUTyFYr0mG3NSI4GayRdzw= - - hash2 - - hbjmZhBM6I41QLu2DwYujijDL010uJV5TbPTuvmBGNk= - - optional - - - GoogleKitHUD.bundle/Resources/pt_PT.lproj/GoogleKitHUD.strings - - hash - - tP+n9cDYMOpE6tjVkyy+tKZTDRU= - - hash2 - - 8J7ePdJy7VhhCF50+Pq6ijVE2Z3aEs2FD3TdJWpMIWg= - - optional - - - GoogleKitHUD.bundle/Resources/ro.lproj/GoogleKitHUD.strings - - hash - - /W2o9SoR4Se12NBqsVyf4I1xCDw= - - hash2 - - rVAshHZA6P0LQP1bPlLUIZ4+zMxPP7sCuYjmQEO9xjE= - - optional - - - GoogleKitHUD.bundle/Resources/ru.lproj/GoogleKitHUD.strings - - hash - - xrlrNkPgleZGUHQqvIznJradDbs= - - hash2 - - C/J2L+yPe0lkeFg+B8OqDqQJvPi3be/O+yxz9QDhsOE= - - optional - - - GoogleKitHUD.bundle/Resources/sk.lproj/GoogleKitHUD.strings - - hash - - xTK6EeKdIuYw6VSMno7c+JM4FIk= - - hash2 - - 72JBgATedPs9Qe4YyZu+c0jNKlkJ1GmSQiNS/hyILGI= - - optional - - - GoogleKitHUD.bundle/Resources/sq.lproj/GoogleKitHUD.strings - - hash - - zgPauh7ypA/MiAV14t2IVao7aPY= - - hash2 - - 1rUyl5Qb+0ve/6Xf4ibEWZUkT/yiG7STDAlkYqigfa0= - - optional - - - GoogleKitHUD.bundle/Resources/sr.lproj/GoogleKitHUD.strings - - hash - - Spw8AS/ldO64IyIwBByrFuvmf7E= - - hash2 - - C4oo5CuBWk9Y9qFKHNa/diwaHgngFWXzbVaERRfsQVs= - - optional - - - GoogleKitHUD.bundle/Resources/sv.lproj/GoogleKitHUD.strings - - hash - - HOoONzSsvbE6cBtU1D21A8JJkik= - - hash2 - - two/dxz/OQrllbz8BSeE4l62xMeeVnKnd/eDwYEn2QY= - - optional - - - GoogleKitHUD.bundle/Resources/th.lproj/GoogleKitHUD.strings - - hash - - foOVRpy/fjk3ZpzRXBwFB/X6htA= - - hash2 - - oNfHmlRejIuM2sn27MD5wQNp853N5BFgFHK+ESRFV9s= - - optional - - - GoogleKitHUD.bundle/Resources/tr.lproj/GoogleKitHUD.strings - - hash - - WWTcYxp/FJhNCcreYBRev4xxjis= - - hash2 - - gFSJSC4MlPidCNokHc/I/l79CTii8neKzWR4jKs8cpc= - - optional - - - GoogleKitHUD.bundle/Resources/uk.lproj/GoogleKitHUD.strings - - hash - - Gqnow7ZCHlTAAcOlUelvocWOO1Q= - - hash2 - - LMv7B2jB+rDQr9IHSCExAIVO0TE4Xr0TZIEhOdUmh/g= - - optional - - - GoogleKitHUD.bundle/Resources/vi.lproj/GoogleKitHUD.strings - - hash - - 8hzf+bCR6CE61+uR14aX0GbKqCg= - - hash2 - - 24yLAVFCf3MnMd5YjgwsT3Wr7p7fT8T2xkyCCam2mU4= - - optional - - - GoogleKitHUD.bundle/Resources/zh_CN.lproj/GoogleKitHUD.strings - - hash - - NkKNrGVetaTrCA5PDsiqfUg/eFU= - - hash2 - - HMdqVm9igGpHVhHcl2Rv/L+fajlkNv704ZWX4OrFxmM= - - optional - - - GoogleKitHUD.bundle/Resources/zh_HK.lproj/GoogleKitHUD.strings - - hash - - K3D2RHHzR8XKKTTVOX8eJlYld5Y= - - hash2 - - arM/V5ZGpbntqFuleWS2BiHGxZhO6j3tgNmYTDMBVo0= - - optional - - - GoogleKitHUD.bundle/Resources/zh_TW.lproj/GoogleKitHUD.strings - - hash - - 0bhClt7gNEuowJAnjV9J6o5KmBk= - - hash2 - - 6hKQYm7fxaEWwdHbdoG0B7mm/VC8jVD3cKSCP7l3NoU= - - optional - - - Headers/VROARAnchor.h - - hash - - lfhoaP0L8Q+c8iw9ldCQTKm7Dx4= - - hash2 - - 8cHr/MSWtuiSr7QCsaKC3cEkgHU+d5eROilJ07WcQhA= - - - Headers/VROARCamera.h - - hash - - tQ3OhrOAj/wGc6/hJ1Gq4sJCZks= - - hash2 - - 0UNHQ/nzwJqN520J06hDNN2pjZZ7kLCtjE8i5epombk= - - - Headers/VROARConstraintMatcher.h - - hash - - 9KdxGoAtNButNXgonccLLpzXy8w= - - hash2 - - 7AXPQ/ojm/+vEBhLT9Uecq8D6XGXqCwUGsNpVsts/jI= - - - Headers/VROARDeclarativeImageNode.h - - hash - - DOs/Bn+rv3aj9B/kRVdWF7/6+4E= - - hash2 - - 83bRElDglgj2KCKW/Lrqp/6TMmFRIyCIE3nMlyrlgw4= - - - Headers/VROARDeclarativeNode.h - - hash - - L6+kSqa5T2mil421CA8MNE7SbHQ= - - hash2 - - LMporjo69aVXpOBuD9VWy09lK872/ZjivpUZ1epsRRA= - - - Headers/VROARDeclarativeNodeDelegate.h - - hash - - Mm4A5Mztv3Xj2iVDec9ERVKWKgU= - - hash2 - - zajHM0IwH97dL97AbSHn5KCEZS5AEHsvGE0f0k+d8OA= - - - Headers/VROARDeclarativeObjectNode.h - - hash - - U5s7QRJjx1Wd45EsSTrLTlHbK28= - - hash2 - - xBK8kxR8fUzESNWRrPeljvgC48GdP7RKKMQ7kMT87PE= - - - Headers/VROARDeclarativePlane.h - - hash - - W+62Mt3prrdsV0Va6LUbjAzIT5k= - - hash2 - - uod7uWY6j6MvuOFZPZiiUn6LRkiJ33fiKApKeTSAxGI= - - - Headers/VROARDeclarativeSession.h - - hash - - hM8ho1J5EWgpmH47WBfDyELJK7c= - - hash2 - - bYZtgm2yDAO0l7o2Sov2uKPGGxtnU1M5p3HevNM0us8= - - - Headers/VROARFrame.h - - hash - - VbDE2LQJTK0sN3nmZjapDF6YVms= - - hash2 - - WntdmOLZA3SLBUVRRRtAUSpY5AJ+jDI+EcJqG7nwRaM= - - - Headers/VROARFrameInertial.h - - hash - - vbZFdmyHMlKpzGksf3+YghQgMrw= - - hash2 - - OyV4TSH5qgb2OJBUzrGsNOhqxT8GCYY+6mMrl4AdOj8= - - - Headers/VROARFrameiOS.h - - hash - - zOyz1D6ar2kZms+elDE/PkT4BlQ= - - hash2 - - Mwz9y+q51vyrZYvf4rNnBJ2nhfx43JCseyleiDHI2wU= - - - Headers/VROARHitTestResult.h - - hash - - +jUA2dOKJkOYUA1zr6+gVsC6RNs= - - hash2 - - GI2jqT0C6wJuRNFpX8z79Zqz1cGssZKi5J2xCYnZfCA= - - - Headers/VROARImageAnchor.h - - hash - - 8+pc6Vo9dONkC9MXEYlW4B7Ae1A= - - hash2 - - ndLsRAiTQ8UJAB2a6jh/kI+RJmY8+awYvlwNO3kEsyg= - - - Headers/VROARImageDatabase.h - - hash - - YKBn6g7W9zITJ2K2vXQlQwNf86k= - - hash2 - - Kc0O8JVSb1CaxNOB8cUrQ5aKdJPoqt64h8JYBmfj+x4= - - - Headers/VROARImageTarget.h - - hash - - fSZZwRy3U4b9/mNe88zbB/tfaek= - - hash2 - - ojQcu2eWPa+iQBhTcF+RBiVAuMz3WBU2KwXtfucz9Wg= - - - Headers/VROARImageTargetiOS.h - - hash - - zwkxuedyYHr0iND0yRQkEXGZedU= - - hash2 - - dfv4z07cO2YIAtDlop/eZOMmW/0cBvT/8jiu8/dyX4Y= - - - Headers/VROARNode.h - - hash - - 9cxYJDn9NlPGhFwNrmY5AufcqAE= - - hash2 - - si4mZpdiE1RZ8+JCgZm0lOMCc2oz1s5C31BBvqMdzWs= - - - Headers/VROARNodeDelegateiOS.h - - hash - - mcjv03abjLNhCOWQlA/XoT23nFI= - - hash2 - - dG7VHHVh1NsFGyvIA4ridwKatNOd8KbY8NCcJDkHc+w= - - - Headers/VROARObjectAnchor.h - - hash - - Aq63oeyDn5+NYCkyMxB7E1N22iw= - - hash2 - - 52t8fq850I6HGhGYMjvfVIRR2RcNzS2DZZNJnk5ejRA= - - - Headers/VROARObjectTarget.h - - hash - - 1mT1L2MM5QA/3tU7KoOCvP9NxZ4= - - hash2 - - KKBhb5t+QPq1fLSCn7/zK37V11PgrDZXTTlSFuQBhv4= - - - Headers/VROARObjectTargetiOS.h - - hash - - 1NmMRUybdeMM75EVnuywgozU480= - - hash2 - - JudZ3EZvwFSi1PmKQOVSSiwKH7fdIVXj+/gI9lXYjQs= - - - Headers/VROARPlaneAnchor.h - - hash - - Yt7HqONaUf2sotSEBTg7e8KWksA= - - hash2 - - SV9Bpbrzfss9h4s0wMcXQ8WNHG5GpPS5JJVo3uzxMvs= - - - Headers/VROARPointCloud.h - - hash - - nu2nWG4oVwWthzZK0mKUKLj/uSw= - - hash2 - - dKhLTlFf/Rhu1fWsIdMPQOTNmpAefQUxSMjUyTITc14= - - - Headers/VROARScene.h - - hash - - 0RTrOOECKVxKBWU6XrVasQf11Es= - - hash2 - - 7Vs5QvLU9V4t9D4gLhxzPFg1BC0a+YpwPfaxWXrCpYk= - - - Headers/VROARSceneController.h - - hash - - 9X5Hj/RbIQ1k/FSp37o5kM692co= - - hash2 - - oyLS3LnY6zhM4LGrFWgcIC4d1a2gGYfp8MDX6KgNT9I= - - - Headers/VROARSceneDelegateiOS.h - - hash - - fvrVrVgKA9uc79vEHxETfPFGpp8= - - hash2 - - lxlU29haKjUm82q5VXJUCbZyk6Cb+Jt9YJ4E5IqMVPM= - - - Headers/VROARSession.h - - hash - - MRUo+pAnS4IN90/8WrvKJbrRGSM= - - hash2 - - ovRdH2+ynD6Ze2eJtsSOsXNt7v3eOAj6D9rYZDl5kp8= - - - Headers/VROARSessioniOS.h - - hash - - VXzDlvNOGU9e91CpLShjw/rh8Sc= - - hash2 - - 7p52uAKtY89gvNyP9/JqjVANoo6rTt7+nLFac4kAuMQ= - - - Headers/VROARShadow.h - - hash - - nmYli3t2JLMx8spFXQFvDsuWqo8= - - hash2 - - yyHTxyXhe6dWKeTQlP5auBnSCK3S4PT1vCV5yTn23Uo= - - - Headers/VROAction.h - - hash - - RB56CDypA98C5TuJogysoaEkktc= - - hash2 - - Tsma9Uq8rzNJKo1JRRcHGYx5jA/5PiTOG/lEYTIWaDw= - - - Headers/VROAllocationTracker.h - - hash - - 4SnEx5qxk2mKWNCvSWsDeHgLUn0= - - hash2 - - qXa8pJHfnMLh/Gk3hv3fehwAPXLpaH9NYl8lGFobo+E= - - - Headers/VROAnimBodyDataiOS.h - - hash - - S16SPiAepwKQXP8yvW/E+gCrPi8= - - hash2 - - yxpSwuA11zMu9Ej61EIjTUb5Yd9oX31OL6TamES0XNc= - - - Headers/VROAnimatable.h - - hash - - QlHN857ibXMEJGZ9Y6wmADj1VoU= - - hash2 - - pJPiFijfZ+Jg6ovdN+xaHhQO+fjeZXeDek/VscBSotg= - - - Headers/VROAnimatedTextureOpenGL.h - - hash - - ejm5EgA79NmY8vdTtrr3Dru7P44= - - hash2 - - xEX1pAoTigSLKHJk45j0YqwSrPaGYaUfCDXPIa0YL9w= - - - Headers/VROAnimation.h - - hash - - ByTznwgjqr1FCwF/RHerAWhim2A= - - hash2 - - I91TquKzFMwD3mRMrrFyz1OCFBtCA/7Gkzetw15cqTU= - - - Headers/VROAnimationChain.h - - hash - - F/Z/qq5Pzf4ZjFUs184ABwtIECQ= - - hash2 - - aaVvDFqlYGCvzifs7S3E/OacLk5/n9i250AfGvpsWdE= - - - Headers/VROAnimationFloat.h - - hash - - xiWlkxP+4KFvYg1QZ4MHpLRa9OU= - - hash2 - - lOJG6NxeJ6TWTNXVRiNwWFfTwnwA85IrKwdnfQdB+8A= - - - Headers/VROAnimationGroup.h - - hash - - TvhR5Hp7emB4nJSnyR7GaMJmi7g= - - hash2 - - 65MqgMRCCqfuFNw2dwxSAVWgCpMJjfcKyn5QpntrS+Q= - - - Headers/VROAnimationQuaternion.h - - hash - - UKYgzpTq890a/cye/pgROfomKrs= - - hash2 - - jXHID1EGWb4Q8hrLhMohvENIrWgVxOzQ+z61iX00O6g= - - - Headers/VROAnimationVector3f.h - - hash - - uoMK0slGiCKtSoIB/qDmXJM9OlM= - - hash2 - - TkZMIyqjmOeoeQnOaufMU+xMug/VFPL544wteEYbC2w= - - - Headers/VROAtomic.h - - hash - - /qIseOaqtviaJO9MGiziIgGEOK0= - - hash2 - - g0EETLSWhx9QssL6rzaFWvFqcj6e+uMO/4qj1NbtkYU= - - - Headers/VROAudioPlayer.h - - hash - - naOsLPwEv+t6XsPEQ+QbFkfTfFU= - - hash2 - - wc88N4ypbXX1j3VyfT7xnaQ0SMdLVGlLq89HTfZ8/h0= - - - Headers/VROAudioPlayeriOS.h - - hash - - tpjIkKLB93KiLUnHbswHnz8FBFk= - - hash2 - - vd41Xd8lvJWQixCw0kO70fazq/aWoihcWp1+vDHqfjs= - - - Headers/VROBillboardConstraint.h - - hash - - 1sYf15BU4KFfxuI8Qwewa0AL5Fk= - - hash2 - - +T6M9YTNDbRpSs5nf2xv6IYXgA4fLMKEl5LMgzU4s08= - - - Headers/VROBodyAnimData.h - - hash - - Y89dGjaMgeBjDg8KS4pmxIhLqCg= - - hash2 - - E27+KBI8ALNKSCld4gsOfXkX6BOynrg+Ge9dcrVVtQM= - - - Headers/VROBodyMesher.h - - hash - - tvgZtUlIRrZTM3775a7QC+lZreI= - - hash2 - - 63Ne8qkHww0f71855s+0YnWC0kxMoY+C5SQftdPkwy0= - - - Headers/VROBodyPlayer.h - - hash - - YslPGwoupwYy1cHDCwGvJCl3KjA= - - hash2 - - V3b4m9K9kV/oxr3/DX369jKuDeyuW5osj7ADp63uSTQ= - - - Headers/VROBodyPlayeriOS.h - - hash - - HtFUjNQ5WgIfXJJVgOLFW/neRK0= - - hash2 - - hYkAeioMrbtmCnR6+6YjYJNfT/PbBzD+U67b/Mxht3g= - - - Headers/VROBodyTracker.h - - hash - - CaWAIpzHkjRvXoNDk2eZdCZREmY= - - hash2 - - B2cdUh0NGCQP67FOOEoBomGFzssaLCzKmB8JSlCN54w= - - - Headers/VROBodyTrackerController.h - - hash - - yzMXhdrPFAVuE/7h9406Dg2eR6Q= - - hash2 - - e41YSKrj1OOj6R2wZHCUpcyH9eoVQOe4mZFOnIt3ZXc= - - - Headers/VROBodyTrackerYolo.h - - hash - - zd7naAPPhQgTHezUOP2Cnb1dC8U= - - hash2 - - zhRaOnn191vd6ESjouQKxB2VlwK+ctdNk2Vj5Y6srw0= - - - Headers/VROBodyTrackeriOS.h - - hash - - XG7PMr9T9qJfgK49rg4lC7KZ0SA= - - hash2 - - OYBrjoDAiNe6Dzl228Z/UMuaYxu2wm5Z6R9yQqvB2O4= - - - Headers/VROBoneConstraint.h - - hash - - 9MKZdVkMjQwe1ndEEuQkvRlVGXQ= - - hash2 - - wUCQWVcC90R8cpcXynbGxjldBw9Mc6qrVQSemUqzgrE= - - - Headers/VROBoundingBox.h - - hash - - zhNSFNA/G82cDyejxt3TwmuLDs4= - - hash2 - - FCv5alA7eNG7V9k72O1/iC3pBLU6BsgzZfY34zW4ijE= - - - Headers/VROBox.h - - hash - - bIIbl7KuWiG09ihnShTIWuKcGDY= - - hash2 - - ftdkNUm2cyIuiFStd1PnAd5v3XjijAMUuDckKeS4mL8= - - - Headers/VROByteBuffer.h - - hash - - Jxx5+phVc6s1UdAB5AXSqZh7l/w= - - hash2 - - zF0piL6zAF2RU1DLmeJoDCEY8pbGMt0i3qM+3Eb9+h4= - - - Headers/VROCamera.h - - hash - - Ckrer3OZi8BXbJzt9njB+wWkH14= - - hash2 - - 1i8jGN6ovL0bWO2Hu+EQqva2d0oYjPXhpRjaX8yHeLM= - - - Headers/VROCameraTexture.h - - hash - - YJcsx783gH34ZD4609dNK3AP06M= - - hash2 - - Ua5sZEsS7HuZGV9bxaxIaF0j3neeysgAyePW3O8yElo= - - - Headers/VROCameraTextureiOS.h - - hash - - /1kTtpsXgJQTXxvdj7NilhfQzwc= - - hash2 - - 1h+rHtWrUGN2Ol4gCu9zPpe8cNEYXon35LjEPtPYvmM= - - - Headers/VROChoreographer.h - - hash - - elpCqqi/cq+5bufVWFzmB4dJvrI= - - hash2 - - s3l9/YqnzCbsTNGsdAcEusRW3PZr3ZAEJzIz/N88TOc= - - - Headers/VROConcurrentBuffer.h - - hash - - lUUUZ9vlA8Eh9HdkUdNv4DlJT4M= - - hash2 - - a8iyMqUPeVdsdIiYRrSDtB3YBhX+8QfjUEVmZC7YRio= - - - Headers/VROConstraint.h - - hash - - GD0Z8o0HilG0r7QBGaGTVCBdFiA= - - hash2 - - Ll0egPIb8jGlHvUZyO99F69iTYYZscuQX68b9PJXSXY= - - - Headers/VROData.h - - hash - - Q3aKjrkP5Ps82wl2cb0Ia2NMpIE= - - hash2 - - bJ1KYrZN8gm752OOepzCj3wZCy3jHoL0UtHC32EXULY= - - - Headers/VRODefines.h - - hash - - aVT7ujuN9RBqizsdFZkirsnJBCg= - - hash2 - - UyJ5CWiE8k7EJStVUiFDg5wHVxm3rTALprUMv8ITP5g= - - - Headers/VRODeviceUtil.h - - hash - - MhjGcHIQU77sgwh+yBGbNaTkksc= - - hash2 - - m0LjdXt7T0lTrMHPnt48iJ8J7Vl0lS9dGVo5/V2xRFw= - - - Headers/VRODriver.h - - hash - - eILCTfOSpJrx8/1mfA0r5JPL2D8= - - hash2 - - 3hZbv380dwQHRDMDrpdXpMCr7QMSla/5eB8EbEpc67Q= - - - Headers/VROEventDelegate.h - - hash - - e20g8rM8X9h3T8faWybib/CFIhY= - - hash2 - - Et3lna+kvoM6SWJi5zr/8WKxil6fxIMoxAejGtUVyLc= - - - Headers/VROEventDelegateiOS.h - - hash - - 0jq3sM53Xa3xlMd0qhvd7jHj4es= - - hash2 - - rINoBNRcTSpihKJvp7mU4GGEvR/V1w7jtii2eLt+L5s= - - - Headers/VROExecutableAnimation.h - - hash - - vsfHT4C0Spa3wyHE35rLwRfMYpE= - - hash2 - - eYIYd/b3CchuS8HoJEgDvTTP1XUPH5jhAcUPZOTE1qE= - - - Headers/VROFBXLoader.h - - hash - - Am8uzBc6bSh4bdNm+PYKdJPZtSs= - - hash2 - - OKft6BcN4VEaUEduXhrEPGSlndg76/yWrCEUzuItPLk= - - - Headers/VROFieldOfView.h - - hash - - JToSFb40P5VNWdkukTtej4WUWDg= - - hash2 - - 6RUgagyDYR8ImZqjKbo85e5oFCO6fJuwK84jtKqS/Ls= - - - Headers/VROFixedParticleEmitter.h - - hash - - vyrc7h1hKvauZOx4u29SLnHI1ss= - - hash2 - - /MP+en0lYPw3ipTg972Cj2ryXUvvwu7bZHeOJEldDjY= - - - Headers/VROFrameListener.h - - hash - - GYSYaCJ82wDbCL5hcTmK3sKAaTI= - - hash2 - - gDrXac+b7a57/73+pfMiTP/PVuGKPSbspYH4Vj+0Vas= - - - Headers/VROFrameScheduler.h - - hash - - 9XHnyoVjNcf0YE4tyQ1fabiO/8M= - - hash2 - - S7495agF4onjZ13htaXoGFbuj2QFhX28mOCbdEvHZTM= - - - Headers/VROFrameSynchronizer.h - - hash - - cgiabeN2ssA0rE3Ue18PERFgg+M= - - hash2 - - RLgm4GC1ygpgfB2Pv8OnU0o3VRWEW573GCXskxa9x2k= - - - Headers/VROFrameTimer.h - - hash - - ELRmghW79P1IEueiPs9wr4rlqSA= - - hash2 - - 0mGXiGW+CtOeTSfvxD9KMa5tOL3BO//7XZu0uThTsWg= - - - Headers/VROFrustum.h - - hash - - bKy8/xkIwnkAewnf5DqyWTJyTaw= - - hash2 - - mpzId0BAo5j5GyWZlXgsGWVYl0XsEmJ5fr9M8LZNPus= - - - Headers/VROFrustumBoxIntersectionMetadata.h - - hash - - eIcC7/nZwUm5RyPC0iT+UvbFDGI= - - hash2 - - 2vCoTRcajS3j+dMfdqloqLVUwt5WlJpV/JHTVy9dJWk= - - - Headers/VROFrustumPlane.h - - hash - - E3B/PiTGmcZr51lrHztxqs7eB2k= - - hash2 - - 15IB0Tr2EgCI8YIeJgFOS2kdT28GLBlwCNjd5ujLFuI= - - - Headers/VROGLTFLoader.h - - hash - - pR9rQ/rmw+zd8TTLdujWdQ3RLJM= - - hash2 - - iVGNF7xYjRFzgEC3BJQwgpfcL4Ul+9AOCO2AnyM2My8= - - - Headers/VROGaussianBlurRenderPass.h - - hash - - iAl9Q97042ojxITgtOEqEUBXojU= - - hash2 - - Z4eEUMJ4I7cJ8MaKbfvgqJw+STWDrZBfXRCFGZ1jKVE= - - - Headers/VROGeometry.h - - hash - - vbBXyHyBLIxq0lxa5J9X5StjVQ8= - - hash2 - - UwCy8PK1aAR60AkoM4LFr1jmwsy4spbacsYtaVtv6SI= - - - Headers/VROGeometryElement.h - - hash - - VEQimYPz3tfclGRDqLpn2SVXC2Y= - - hash2 - - hUNLVmLVo+44DaRzK8RRtso8HEPi6TuuAdd2BzXG8AE= - - - Headers/VROGeometrySource.h - - hash - - wB8X4bIo1A3Xs/caFrvvpjam5Ig= - - hash2 - - jTToVqpHf37ZNncA1OCwuFf99+H4SVd9APTgr5DLNRw= - - - Headers/VROGeometryUtil.h - - hash - - feCRIQVpW01cgQNvyZSqAucD6tw= - - hash2 - - gU1YAaQJ2at618fniNHD6YVBKG32IcvP2VKt+j1zDuU= - - - Headers/VROHDRLoader.h - - hash - - y3Kr5e1nmW4qYn2B1nHQXSCv0JI= - - hash2 - - q6Fzm3tS2JOmtudDPQ3nqcQq8VvWO+51ees8TKxDyYs= - - - Headers/VROHitTestResult.h - - hash - - eI8uILBmwbrW5aRaoUWL+4YxOKI= - - hash2 - - 0WjxNjH8Q6VK5bu96U79jKZQGRC7XizZF0Q6HfauGcA= - - - Headers/VROHoverDistanceListener.h - - hash - - P8GaJJVzG0Lbu549P7A2hx5eFd8= - - hash2 - - G8MWD+KL5TyXTnT/Bd1P42CnWESL+Q4+3p1Uy6o4G7o= - - - Headers/VROIKRig.h - - hash - - ZF7UK5rV7MFVXGL/RfMkMopikzg= - - hash2 - - dFJbhJv02NW9chWWh8uwmo1XcCSoUAddH9hCSFpwVAw= - - - Headers/VROImage.h - - hash - - TJXmjg1jHkUOyqmDdbHR1MLKl10= - - hash2 - - g4SpXZPCzwLiK+vyrJNRv/BOMLaMZGZ+34hs7LlNsFA= - - - Headers/VROImageUtil.h - - hash - - 4nmLlfZS4O4CLXRDJsJF5hPN2J0= - - hash2 - - ZtjeBT4UfytlM4YSAOImv833Enm4gR0ARJ9gs6UwrrQ= - - - Headers/VROImageiOS.h - - hash - - GNugrSdDqrG+T40VFkavInLtduI= - - hash2 - - hvaw7o0aIVdZJGOjjoo4UxsKZcDvEF73CsvUpoMKpbg= - - - Headers/VROInputControllerBase.h - - hash - - IkH8Y8JJ2rty3EhX7wmmLvl0aJo= - - hash2 - - chgUxypR58nh1YG7e/buY2lXNCcEJZznrwMXEeNXj+U= - - - Headers/VROInputControllerCardboardiOS.h - - hash - - 200ukPB3eEvqtKtMv1a5i0tACp8= - - hash2 - - NrSnH+PZ70dPz4ud5aUqxd0gH1In5hLiqBCGpEx0eP0= - - - Headers/VROInputPresenter.h - - hash - - 2xn/LnehUhAzaGiuq38whZPfdh0= - - hash2 - - tJTjPCvxuzBr3blwXZqsmZp3h6rzsQXwc+9TwLlOy74= - - - Headers/VROInputPresenterCardboardiOS.h - - hash - - joJDK7l/Xf820TAxtH7hTUVopS8= - - hash2 - - Hts59J6JKMsU1aFooXo9nMkRDv5aIf4JdU0ksMWooQ0= - - - Headers/VROInputType.h - - hash - - pBH08foKvaNQN7lcXRIJNfEvGbE= - - hash2 - - dQ5jnohpZeTRDpFHqncmiv6ejKsynvi92NoyFa0doSQ= - - - Headers/VROLazyMaterial.h - - hash - - tPsbG/3DUBy8mzJytVF8Yqr8Xwk= - - hash2 - - S+obPKLyb13MUbhuVKS5cCb6WYExC6n73NSU2ocU5w4= - - - Headers/VROLight.h - - hash - - 3bpRzigml3qdyw4ILXFr02F5g7M= - - hash2 - - Wdzk6GXvBCWY59+nIqdP0Xq1RdXSaJ0oeFjz3C2wYsI= - - - Headers/VROLineSegment.h - - hash - - pTCPmIhuUEFiiZWdD3n8bVEgve8= - - hash2 - - LZWeuvQN1G/Lr4Q4v3eSl8eYJPxFeYWGpfSvzYEuruw= - - - Headers/VROLog.h - - hash - - u1t0kZrZYwHdzLvWl0dcC1ikofI= - - hash2 - - Zqm1qm5AFARGIiMIENsJrAU6CTj+sdsgOhbtvEeZ8Eg= - - - Headers/VROMaterial.h - - hash - - tVoGA/UkVZfauSkoFmz0kexr4d8= - - hash2 - - NxX+10DC5RxB/kwreGe2XES7h8eOBUbYVbzNX/wV4PQ= - - - Headers/VROMaterialAnimation.h - - hash - - M1uBFo5O5dmmW3NKPf+sE96vqL8= - - hash2 - - QuR+s57ClYolnpbZSHt2VZbclHdx8jhIRJTXPeMAYBU= - - - Headers/VROMaterialSubstrate.h - - hash - - fzPTnPE9wwp5++tFjlEre4BTBj4= - - hash2 - - kh8qOte6aFSkwcoHsINjocFFkc/3GBjEnulUUSStmTg= - - - Headers/VROMaterialVisual.h - - hash - - g0j7VTFp2FOvjEWCZkUS6PGLs9I= - - hash2 - - GSwFsMTnGFJ2MViNCCwxWrOR98LK56WYbN4J3qACGuY= - - - Headers/VROMath.h - - hash - - DC0Hfj/bhs2YqJUDVNh/61tObts= - - hash2 - - lz4hUKpIIg4RTJwjpF9Yzv5tHDMKhq4PV080pVJPO3M= - - - Headers/VROMatrix4f.h - - hash - - eGHMHHRxNMkItEAhZBFdtZmqwBE= - - hash2 - - bhKdT3JKI8TloJReNIwTnjQKIAgo6yehyj61tq0QJv8= - - - Headers/VROModelIOUtil.h - - hash - - KytPixVXKsQUSnA5dC2LA2wqjww= - - hash2 - - Z3BSZPZEM4atoQlrVziX1dEh6FOI+tQw3mdNQPvTyFo= - - - Headers/VROMorpher.h - - hash - - FyL99vnwPbMb+qr4MJIvLiyUuO4= - - hash2 - - TQJFwLqRwMndfryQ45gSUBse0I79e7iimSCSmzpyHJM= - - - Headers/VRONode.h - - hash - - tiUj21intaXKaH3VGpXnuIA+Hl0= - - hash2 - - io+WVYNHJDvw+9tbOEuK4ic4w/wjgEL3lYL6KgZ9xJ0= - - - Headers/VRONodeCamera.h - - hash - - IVS7bmPPpjuLRQY2yKsim54q+0M= - - hash2 - - o3NnmzDFsRqFk4zEaDrGlYQlvh+/t+/HqA5BdEOT1pI= - - - Headers/VROOBJLoader.h - - hash - - j0CmbrWknC1pQssPvqxKGRHP1Ws= - - hash2 - - JCVdLi8H953EKKeROKqe5Wgybmx0qLz1535KIBlgwA0= - - - Headers/VROOneEuroFilter.h - - hash - - 1LUfh63f2dAj1ag4seGiGt9HN4M= - - hash2 - - MGP6vBAOciPBgl+P3Q14ak/gPiDPxzhXqtbPifLUs+A= - - - Headers/VROOpenGL.h - - hash - - aT3yTCk31F5CEE3js88V9dPLuxI= - - hash2 - - o3nS1Gu2DUQ0+n9bDE9H+WD18YfEk0XOV/kftU6srn4= - - - Headers/VROParticle.h - - hash - - vv4uoJq6hDuw0BOesKOzI721XHk= - - hash2 - - H+k8YCyEapbjCPLV4++mHorVJdgSTZgxfhFEVmoc8jI= - - - Headers/VROParticleEmitter.h - - hash - - rDh2gwSO8uh9K22bjAXwk5WWsoM= - - hash2 - - zMx/Wr6Obz/jICcjSIVS+SdaLyEls/6KdM4kJkAKgMY= - - - Headers/VROParticleModifier.h - - hash - - 3vqQKqWESAOrYrYCz/1JKwuffIA= - - hash2 - - hUKY/7iYjQEICFtOP0FnXNlzTUYg/rmoYbLP7YcmsUc= - - - Headers/VROParticleUBO.h - - hash - - bMMNJ0vwB3rFFo9knFRcrSH3oko= - - hash2 - - Lc9q7nGAPFwse/7OnhRaeN76uTytEA3WDj+rlNQdi90= - - - Headers/VROPencil.h - - hash - - botcXc5Q6Tj1SoaT8jWtlDbTj8g= - - hash2 - - vd32c58PH+5UWRNCpjF+BEMbkELMxjjL6UTOdcyrlkM= - - - Headers/VROPhysicsBody.h - - hash - - 745c3BhoRmSXXY/QNLdclxg+J5U= - - hash2 - - IdD7eA0rHhdo5AJ7JXuHMQ+vEisdZdxTq684hnxK928= - - - Headers/VROPhysicsBodyDelegate.h - - hash - - YriARUizLUNEOjyJ37bS1MpYkd4= - - hash2 - - vehmVpFXIK68pcF9Ii9J+WPAQSK7g3sZvvuUcogMLgw= - - - Headers/VROPhysicsBodyDelegateiOS.h - - hash - - UIJtjJhEYwxbhT0OxBB9vQe+CiE= - - hash2 - - 0QlUkddpHeI//38sokgw4aFjRfZvfYXFmymyQc/UjoE= - - - Headers/VROPhysicsContactResultCallback.h - - hash - - dKtSNbtll6uUiiA1c0bUaQaeamQ= - - hash2 - - 3ZX/R+NVbb5SUejttdfHTs8lRTb+ALvnJ9bCHvKEX4U= - - - Headers/VROPhysicsMotionState.h - - hash - - oDGcYS0OvPXZbF5XadEY/XGeBOo= - - hash2 - - /KzbecxEaLzpNWKwcIjuH67sGQPht7TuHCZ70OZI614= - - - Headers/VROPhysicsShape.h - - hash - - chzbnGnzzK03+bz7OnFQxA+Q984= - - hash2 - - eXP/h5QBGuWhtlWfATnHwPQD4daw1AWEBun2lc1a7jY= - - - Headers/VROPhysicsWorld.h - - hash - - OxTY4JBwtCujxO5WaGNsSAnTD3A= - - hash2 - - UItbAQMJ1E6H4XYtt6a6UEChM5J1Lhzpb7PIUipC/D8= - - - Headers/VROPlane.h - - hash - - TovuUp4fhdvWX5+umfMTnTQpPAE= - - hash2 - - DZT/1hDvlJnYUJiy3qQ8Sdchrb8DQzz8QfJ6oCDNxHM= - - - Headers/VROPlatformUtil.h - - hash - - kaLe3kKqr9o/9wuMW+OJ662yibc= - - hash2 - - ws0zb2O8CcvrbyQQcLNwmc4q+ZhSf9s37wZ6Z9eHrZc= - - - Headers/VROPolygon.h - - hash - - IiYpOSNZ7aF0g23Gs0hdTxLluxE= - - hash2 - - aqYoRvudkfn5EyoBxwIVM3Ftucb/cCHCe9LIaYfBv0M= - - - Headers/VROPolyline.h - - hash - - 469gN/f2Oa7/yL2HNXRHLt8HdVs= - - hash2 - - MWsWWN7H6qak4CVBPrld8MbH3CeO12UpfibnhQ6yJtI= - - - Headers/VROPortal.h - - hash - - JnSjWoA9SKfr+JlrlTCFJCo/H2E= - - hash2 - - BAisU+HoA2Osub5PzJfSoD33Q4RghNBrHivYtPbYOLE= - - - Headers/VROPortalDelegate.h - - hash - - As/a1XgUAEERD6Wniw0px1i1+Ds= - - hash2 - - 6dl0Khyy7p4UfKzqshqMplUsgDpahcAu9Qlnvzl4hOI= - - - Headers/VROPortalDelegateiOS.h - - hash - - z01tO0ApgZl9Kgmz5MdQE7FK0Q4= - - hash2 - - JwCqIKGgzuFPf+V6qMf13/MkhUrg1zjnPhJLThkltfg= - - - Headers/VROPortalFrame.h - - hash - - 3PogCV0fKNEbaIIJ2HjFqN1Zv/o= - - hash2 - - UATW2728Xt9xf9PoKaCySZEmqKE9yNpUdN3L5xp8kS4= - - - Headers/VROPortalTraversalListener.h - - hash - - h2Y+GXGu8cotLz6+/WG1DR3+VfI= - - hash2 - - WkOp+xVO5obkJ5z+d3QkuCqDL0i1RiGIpEGOp/o2iqk= - - - Headers/VROPoseFilter.h - - hash - - qTV+T/nLWcGez8+/p8GCIY2a9kY= - - hash2 - - 4ZQlCbWrPKBsroH3BXx+pK98SmGgATHYuPzsjMQ+waM= - - - Headers/VROPoseFilterEuro.h - - hash - - LDLnpKOGeUGFVisvvb3GeLnQVzc= - - hash2 - - LYxtd5GUF4L4N4NSO2D+6Muthj5hmL3lR6ur96LkKJk= - - - Headers/VROPostProcessEffectFactory.h - - hash - - q4bCUY+AIl0Zzgbrhn2Mb+x+D9k= - - hash2 - - dk3Dr6sMSL8WbBDygKBxvl4p2PyrDkG/QEcevuZ1seg= - - - Headers/VROProjector.h - - hash - - t/tNkbXossQ44xLs/KL926IT1AU= - - hash2 - - ZMk9fN76QI751XFPx9XtTQPFEH1IDrLkJ/wjccX+yBs= - - - Headers/VROPropertyAnimation.h - - hash - - 2gViKSbboiD2EzCV72xG0R5UJDw= - - hash2 - - 37kTByogW3gjv/YXhJ2jBRhiY3XGXWSPEx+58cL0L28= - - - Headers/VROQuaternion.h - - hash - - wz7AIFchWwo8uvW9NGNeNqrqKeo= - - hash2 - - vkIKGKGd6sZVfNRFcLcQMy31iVQVPAUh6XCFiF/IFpg= - - - Headers/VRORenderContext.h - - hash - - tEh7H7R0s/r/XjkbOHZ6YVPicRU= - - hash2 - - rSRo3zMRCpkX9hjb4PX3jVTCexTa1eJMH51q9TpDGYs= - - - Headers/VRORenderDelegate.h - - hash - - jKNkIfTIkx27bgwVnlsZ6oOUEwY= - - hash2 - - e8FKGp3BgOqxoEID88iAGf3qm4gmTbDawpTOAPB+7Cs= - - - Headers/VRORenderMetadata.h - - hash - - WiCLS0SVHy6IrD8TZ5OWoDRoneM= - - hash2 - - hHyRUSys+5mwwp6vJYgDczOUTC58BfyNFrOKsz37fI4= - - - Headers/VRORenderParameters.h - - hash - - JSmCvpT2mEm0NG8dOCh91K3fQbs= - - hash2 - - 1kzfCQ/IO5iS1ksUDjny7MyMIYulpTSgazCPKo+iP88= - - - Headers/VRORenderPass.h - - hash - - wzjhlsWaHzjRf68YqqRy7d1ixlw= - - hash2 - - vgjgnVeVhPCcyeBc3OeZtitPxvF4UChr3MwecSEsE1U= - - - Headers/VRORenderToTextureDelegate.h - - hash - - 1m4Ys5JQW/sDWOpmyChP6fea+WA= - - hash2 - - kfs/1AsMXCUouuoIuub/wiCBc7BhvCCk855kkeHDfSY= - - - Headers/VRORenderer.h - - hash - - JhI/engmhAWTLgT2UnG2Y58KaY4= - - hash2 - - 20WnbUf0oqakBz3hpokr5/jZuDkj04ebMU5Ta0Bfbc0= - - - Headers/VRORendererConfiguration.h - - hash - - mdeubZaicUCtt7SeCEZJNm6gjAE= - - hash2 - - C2LmcW3XDYymAA+mSkB6MAo52FJA8d47AchSfsblTN4= - - - Headers/VRORendererTest.h - - hash - - +niia4zwR1GJE/080Iy8IzymRpQ= - - hash2 - - FG5wiHm67NFxwnf44ZmojImuXreoULiYwz/BofARCHA= - - - Headers/VRORendererTestHarness.h - - hash - - KulBr4jyRanJ7vAqBN4kND/mdzo= - - hash2 - - lA6wKILKz7nWT5OCBnlV5oUX3CohJkTxytquZy5QRDU= - - - Headers/VROReticle.h - - hash - - 0U8pEo8oqMF3G7QMmKIubq4WAgg= - - hash2 - - GQFF+uLG2i36k8WqXnpPxhv1pB9Z/sbXw0InE81sTf4= - - - Headers/VROScene.h - - hash - - KLUtB6GMgvcCOGgb3QXLX1i9bqE= - - hash2 - - HLGURrkINKucdWWzbwEj7oReA/PqkyJxIBPyjaiHMRQ= - - - Headers/VROSceneController.h - - hash - - groY5s2i47bnvjm9dpEQ9R/aeaM= - - hash2 - - iHd9xMPQTNcktVpm+DIeVrqxfbyGaTL71VOKUG7bqUc= - - - Headers/VROSceneDelegateiOS.h - - hash - - 2nt0eQbop1Adt7L40oCCfPtFH2k= - - hash2 - - n7A/Z/DAApoBUM1nMRJ1ODkCitK9prQoRbYPG9kbC/0= - - - Headers/VROShaderModifier.h - - hash - - Lcl3oBRqTvWaeoN+Gk8vNj7L2mU= - - hash2 - - phvTq9dSTfqOURVMRxzsk8aEM3/3H6cH7ReUSN60KHA= - - - Headers/VROShaderProgram.h - - hash - - MKbCWjGwxhIn14HOX9zLMuOavoc= - - hash2 - - Xp8V1hAvEKPgmSoJJwOxINZB9FPjSAr52Rxum/q7QAc= - - - Headers/VROShapeUtils.h - - hash - - ChQ+dr+X/fI+yJBmdLfdoE50lXo= - - hash2 - - aOmnhITL53uHgn3F2B2wyW3MHZA802Vd9mSkLHtPpIM= - - - Headers/VROSkeletalAnimationLayer.h - - hash - - X+E1mXGaFvsrpdfG1R2NFQDBsWg= - - hash2 - - dzXQ4T8Yq7uVfHE/ziWkc/8aWlFBxwBDoeF6SgBmkwM= - - - Headers/VROSkeletonRenderer.h - - hash - - iACbTxwuOTWEwJqeuQiCVCdF1XY= - - hash2 - - GjDXXM5MShR6jRKuyQPECMIbSe9774ikwOGt0V6ftz0= - - - Headers/VROSkinner.h - - hash - - n603bHEUxdofLIeX57A2bP2fSP8= - - hash2 - - uUT+ijdQ1Ht/TykAzQmGbzutnSAu6HLDXRMTg5W9M3k= - - - Headers/VROSkybox.h - - hash - - UOYg1mA4nb98Gvrrxr3Pv/XsZPA= - - hash2 - - c0abqSS7OB1VGnPVJmEpegEnabfZAd8zXyJrvsb6Hlk= - - - Headers/VROSortKey.h - - hash - - Zs82AISq0v3Nj1+3HkRzN+iY61g= - - hash2 - - fxOiZorwxs7VDOzYcuUQ0Fo1si5By/tJ7muQgJ/Qbug= - - - Headers/VROSound.h - - hash - - PyzicbeI7ZrPDoRxC0/9hc/JqYA= - - hash2 - - yntGKzwKd7zvmfAyHA1QHlrchRvlOsTXHaAmiTSWrLw= - - - Headers/VROSoundData.h - - hash - - Q5HLnJ5MDLJhMzPYb1yH7k3Lad0= - - hash2 - - tSJS4RdfRewWjVMElt18Gfi9KVdhsGF8IKdbstOhf/w= - - - Headers/VROSoundDataDelegate.h - - hash - - LyVUf9525CFLOlmb7SZkduIdVIw= - - hash2 - - ZGfJL1+p2bfaOKlJsZ4CuXzP+OBkJOYbF6MMN3KRURg= - - - Headers/VROSoundDataGVR.h - - hash - - eHryjxAbjlcl2zan/snFWXCp6nM= - - hash2 - - 7MA/sDww/Meun6tugmaw0uP2LqZDDDVArxw/so7303o= - - - Headers/VROSoundDelegate.h - - hash - - oY0v7cPc7SysIXKzOND/TM011rQ= - - hash2 - - ZRnjZTPh1/eGrrskB50W6eZ5ktQhCTTyMMM9T9YpjcA= - - - Headers/VROSoundDelegateInternal.h - - hash - - QnV5dC5wSQrKzfgRA5eZPc9hFWE= - - hash2 - - Mnk8ooYZsKRSmptbIX045DD1ocNUeSg43PD9t9Gr/YA= - - - Headers/VROSoundDelegateiOS.h - - hash - - 3B37mKeXdLi0Y0qcnevt9KR77Sk= - - hash2 - - Thmx+GOTB3SZLlaQnWu33ulbZ+cgyA6juIlANC+8klM= - - - Headers/VROSoundGVR.h - - hash - - onECxTohQlLGmackTdQ5NUbAYrM= - - hash2 - - 9K1wH913QzddhU6vNBO/qL8rWLIjzT1y2Cb62kUguvQ= - - - Headers/VROSparseBitSet.h - - hash - - aFLr1UwQ53vP74sfO81Qg3yYddI= - - hash2 - - soMSAcKZTOy5j54IHcSuRc3M8SS/XKMU5UxeQNvtuEw= - - - Headers/VROSphere.h - - hash - - vGpVutuoHd94MEMWY3R65kyOukw= - - hash2 - - +rCV21ppQeUvfH69TAbsft1QpqO1uo8XYsurhzdgxT8= - - - Headers/VROStringUtil.h - - hash - - zcktGb4M41uwA2HxgAH99aDl4nk= - - hash2 - - JEJGCqYRGeskoAJhqANFMWTMCRy1wONb/jWNoCQ+x2k= - - - Headers/VROSurface.h - - hash - - Zkn75wZCYxKy2Fwckj/HEOttIv8= - - hash2 - - 6Gs0dvU0wo7Of+MhWi7CTuCp9AEUvCKeVTu8HjR5Z0o= - - - Headers/VROTaskQueue.h - - hash - - 9ucmMZ0Zni91Or6GxlLNbPi9YA0= - - hash2 - - 2JPu9UEx5EL2pn639FdN+PS+9VrBiXL9j5V/vWrqNaY= - - - Headers/VROText.h - - hash - - 9tKwwsnT6AUYrLSQ8C30UTnjTYw= - - hash2 - - qYjxujOk9vK3V+MvzvXzp/CfxmdayPE3Mr26N9tNzZU= - - - Headers/VROTexture.h - - hash - - dojYd4RTaZjTG06UGxhZsOXGjGk= - - hash2 - - EDfDm97DgN9Y9TUzkxjATJNJf9k9CQ6moJ7ocmLGh9o= - - - Headers/VROTextureUtil.h - - hash - - yYehbvu6GOkgJ6tHYDaUPgDGeKI= - - hash2 - - Q8GbhUW5eHzZNn1S1v5mknuWSYakRXBvAjGPmSUYqVs= - - - Headers/VROThreadRestricted.h - - hash - - pNmbls8NMB/JrWDAryXDna+urN4= - - hash2 - - HkQeOTZgxe9weu13T0pElQfoITsbgWsPewayxp+nYKY= - - - Headers/VROTime.h - - hash - - 2MsJZ8KNXtK9+seGabum2a3qP08= - - hash2 - - 0BRr9/DdZsf5lExWkxcrAYYWfJ3tEfxHLQL8paKG5qg= - - - Headers/VROTimingFunction.h - - hash - - +5NEQNXVo+YuNZd259VpQzfGQCI= - - hash2 - - ZQtI5gQy7vJu1FrAAUs17uGXc79Azzg73x6LpfGU04M= - - - Headers/VROTimingFunctionBounce.h - - hash - - HGzEQQh5v3jBK6Ban2B2WXM3i7E= - - hash2 - - hHasMaKzz+WChlb76ppavJcqOSh7mcY0745zTQxAxCQ= - - - Headers/VROTimingFunctionCubicBezier.h - - hash - - 1Flsxc5h5xBkeOS4PSoLNAoEn7I= - - hash2 - - O/BcmSGWrgO9JT+xi1zTKPKGFdtut20Uc18E01Budac= - - - Headers/VROTimingFunctionEaseIn.h - - hash - - mDEfbF0o3jnipNWKHEIC/dqFX/g= - - hash2 - - aJqGApBZzHPNDGdtAg/gWHkhFG0a291Xm1j3qyJEiQg= - - - Headers/VROTimingFunctionEaseInEaseOut.h - - hash - - dnx9tkVUZGHcMo9NOh6bENPFei4= - - hash2 - - uXJumoYnlZ10EUPJmkd6lwVGO8jYXAp0rtnpSTY08tU= - - - Headers/VROTimingFunctionEaseOut.h - - hash - - MKTELfHYCfaFk4uidIvRZHPAGK4= - - hash2 - - tvRNa6EzAMyUTe4KikLAd4Mjn9S8UrN8C924hL+X2/I= - - - Headers/VROTimingFunctionLinear.h - - hash - - jILNacVr08X8/Ds+4xw/bTjwj8A= - - hash2 - - WpCHHmBIc+/nQ1fRIvnn8kW3OmHPBEQwIh+CqIStyP8= - - - Headers/VROTimingFunctionPowerDeceleration.h - - hash - - Uby0CF5912aOv9UjmSED7Vde+SM= - - hash2 - - X2+7jXv1qqI3XNByZl0b1qmHgcTjgzhZh2mECindjS4= - - - Headers/VROTorusKnot.h - - hash - - 3evgiLh0IPSAmGFGg69J1+2HGaw= - - hash2 - - x1PIPBJ0GdXoaNvrr5twG/b4QDT5XABmkWh8A2WlUSg= - - - Headers/VROTransaction.h - - hash - - VxQP5K2/2SfuiOqyIFhQah0nCGQ= - - hash2 - - t/eeFqi3aBLnJCFAUxnEmAnZNJpf5U3Jb3PwayABAgc= - - - Headers/VROTransformConstraint.h - - hash - - A/rtkGOJSHP6YQSjRiXxnC3C0S8= - - hash2 - - nM4Jr/SVFTuW1DwCB4QXfNmVLMfELpKJ3Nmaer8RY1A= - - - Headers/VROTransformDelegate.h - - hash - - +RIlpJCdop1zt5QkIJoGwJGNxtY= - - hash2 - - HMDX+g7gsWtiH2iH4j27zn4CLcfyqxkrDfd7YMnsHAM= - - - Headers/VROTransformDelegateiOS.h - - hash - - v9RpvMFCxcQBaF4YC6asxutLZEg= - - hash2 - - R2tWvPN1YbscHOVxgKZgw3p+CACGktMVgm+Z0Z0N73k= - - - Headers/VROTree.h - - hash - - oTAwNS8CVqfhAZ+et4LK+6h99TI= - - hash2 - - Wq0P76keo1d9MGCvoWDk8I9QhFE8GO4p+pL1mg3KbTM= - - - Headers/VROTriangle.h - - hash - - serJluuzKD8N1k8YZRw84roWb4k= - - hash2 - - mB4ocQgXpk/Dnprz9lNyQ134/EZLObyDQMtexgREbzU= - - - Headers/VROTypeface.h - - hash - - h/NMRqV/ijsEjnVKQkSQZ51SUZs= - - hash2 - - EBGj7Ahr2eEvMtBqxhQY4SXqsOgvHlOB4qxHyqJ1l/4= - - - Headers/VROTypefaceCollection.h - - hash - - vAxKoq4eaJRyAZUDCzZvCIyTRwg= - - hash2 - - SUTbujZyGGe4qYJLq198dHKc834iS96zbrGqV9zoC1Y= - - - Headers/VROUniform.h - - hash - - 0tf/zC6YdYYyvJ0OCdftoXQaouY= - - hash2 - - U8c5vpM/C6G1JBlLutZjIbE8nK73oSVXqChBVF6xtRI= - - - Headers/VROVector3f.h - - hash - - sQ3Z4USd6I2NVKbxrNXjpZ9UyL0= - - hash2 - - F58N7LXALsMrshcpKxpUHnlTHW4Q0k9BEy78n9Ek3b4= - - - Headers/VROVector4f.h - - hash - - a5pNl0y4R8GAMiVCd9sdOvjQjic= - - hash2 - - 90R5lm0HRZUfRMbBVevweRtQEubyIVMX6cCbGcQUALg= - - - Headers/VROVideoDelegate.h - - hash - - XnFlnap26FJOd+S8qq80s7l8ZMc= - - hash2 - - OwFv/Nowcx99s1OO+52cJZc/fP3yHSUXwPOEPUL6j3I= - - - Headers/VROVideoDelegateInternal.h - - hash - - 0PpiehEjS+yTI27a9cHgStgfi68= - - hash2 - - qNjO49Ap8iZfLuCPXqKHJEceh7gILDfAoQOtinjRNQo= - - - Headers/VROVideoDelegateiOS.h - - hash - - kdzTsvxKkAm2aLTpxwXIuXhcrnE= - - hash2 - - FhugYQLj7OYFw7cq7y8qUX+AnsB+rOyD428Bf/Nr6ZI= - - - Headers/VROVideoSurface.h - - hash - - rCfw2eCIlKwcmUU/dLUYiPv8aiw= - - hash2 - - vlcs6+rf3AWH0TysxY3K/zX/Dx6SQue5v4KR+FHRWek= - - - Headers/VROVideoTexture.h - - hash - - P7koO72UIVeT8/OFmjw15hBlnV0= - - hash2 - - c97XdooCq7aEmTY0LzSlHfAzaAkdb3pJiR41CAb5gUU= - - - Headers/VROVideoTextureCache.h - - hash - - XvakXbLV1TwXj/xaprBP6LYuUJI= - - hash2 - - Au1kOa2VvqM+Pcf/8CoFZUdmAByFLXIKeoy/qhqK7u4= - - - Headers/VROVideoTextureiOS.h - - hash - - ctUwnB4ugNDOmQMgnGJhS8swdQo= - - hash2 - - l3bHVqL8QoDlig//m/CniumRLywMWNXN6mOzjwghtps= - - - Headers/VROView.h - - hash - - aRa8jtXQzZZk/RtHrtMiqd6l4bA= - - hash2 - - LknSEmlbedoHvRBM+OVRiRYify4X9f8nRwM4F1DINCc= - - - Headers/VROViewAR.h - - hash - - I4RNoyLcLiSiineV/w0nPHR3teU= - - hash2 - - HQamIZ1msBLI/McRPWD7tDIE9u6nHHLJawomdVGhvn8= - - - Headers/VROViewControllerGVR.h - - hash - - dTFaj6tUNmt6yNYDZzhly0YEN2g= - - hash2 - - MXWE71fBUU5vRZTk2nxP3AHsLPGq+QS5s7yGcCZv+pQ= - - - Headers/VROViewGVR.h - - hash - - l4t17e1Z4FAts0fICnA0WQ88eEc= - - hash2 - - MuxJCYQTY1Q0ce4Y5yTXNkJLqRMypXlKQoBauNgppSQ= - - - Headers/VROViewMetal.h - - hash - - rwH4JLUW6iAae441pmYWmx6ES68= - - hash2 - - lfZCy5eGPhveFejkOr+MHl9QislHWWx9lb3r2L058m4= - - - Headers/VROViewRecorder.h - - hash - - Muu7lPivif/vdGPPQxo6WzcPhNc= - - hash2 - - jzK8slSWgJrtHJUnfn9PW9g71sBCzcZQvbOlI6OId/A= - - - Headers/VROViewScene.h - - hash - - dSkeFUK8xCAVKeGrwvhcmt1R2Ps= - - hash2 - - ckgj9KYTatLx1SH1tNRjyoajAF0i1/HSRC7Mb+usr94= - - - Headers/VROViewport.h - - hash - - 11Gvq2I3w5DCAg59+FnOlr2q914= - - hash2 - - S9us/mQooZamkPnx+R0T4jg0miYoWyLKmTvuhX0hYJU= - - - Headers/VROVisionEngine.h - - hash - - +hsTW3orWtOKs/WJP/1JobTsEag= - - hash2 - - U8zrH5YncEeHLDDva/vXRsyz/LTYsAoAewnY8dU8YsQ= - - - Headers/VROVisionModel.h - - hash - - +XkT63J0ip6gpNyxUmYlzp9pdvg= - - hash2 - - qeNp8W3r+6/ZD76S398bOeeafZIUvcJjsSOvjZTW0q0= - - - Headers/ViroKit.h - - hash - - KFsElWpJEeCRldl04gD1JyQOub4= - - hash2 - - qlKgCpytfwCFiZdu5jvjv1yCjrh4PYdNHixTsUTN/dc= - - - Headers/gif_hash.h - - hash - - qcENcGTrBKTrBowPi9IrLkaicV0= - - hash2 - - 7sme50nL9j4b/G2i/x9AnqCBggAKz2HyTgWbNA34t74= - - - Headers/gif_lib.h - - hash - - U/WA0Upe3L3XYwOrejyH6GdDUzw= - - hash2 - - BMILochEWl4wH2mcoRAEAzqw8ikQrEFtYp4gh0kAOWU= - - - Headers/gif_lib_private.h - - hash - - ekRtF3isgr3jNRxF3ZCe+5KT8x8= - - hash2 - - sDU+EuXhNql66bJR+3L+FIyr8kgi2DPttO+ooZ9IwM0= - - - Headers/glm/CMakeLists.txt - - hash - - n20Yv55vtqRTFjekOLv59Hdn5IU= - - hash2 - - jcel1LXHLoBNYeNaQZYe8nfUDxsFcWVphyMDQtuVkT4= - - - Headers/glm/common.hpp - - hash - - 2qvdMhsDiqic28qmBLobTlRKvak= - - hash2 - - aaGg6ZZky9FqT4oaTtcwpmcO+REEn1VXOVYvPKg6y8E= - - - Headers/glm/detail/_features.hpp - - hash - - boKnkaOgEtfkg+m+gKqkzT1YMFY= - - hash2 - - 8I+hJJV581ysixQZOWiwypWe/JBUlha0sBzuUw26w1k= - - - Headers/glm/detail/_fixes.hpp - - hash - - i57PubyVTmiFJW9Var+eTSyL3mM= - - hash2 - - OgRIKwj0hLSpjwRMDkQ3ntaDqBym3RZ6aw6Sw6FFYkg= - - - Headers/glm/detail/_noise.hpp - - hash - - IyV2PeGpAnO4PmH2ZAD/83msNAw= - - hash2 - - XeC9soxXNcczP/4OyB8aXZu1TLDyTF0M76MdRXTCpww= - - - Headers/glm/detail/_swizzle.hpp - - hash - - BOfPTBFJiWYKRgz/RiqtSCGTsB0= - - hash2 - - HzaY1FOTnyeSIoN/gtMxuXtsYsihQ+63yuC9afqFTms= - - - Headers/glm/detail/_swizzle_func.hpp - - hash - - Vjqv92gMvQq9nHacUnLwJmSjKvU= - - hash2 - - Zu/Jk90NDFClu2jEKfC2db1z7DpHpXohzavS/1u7qqw= - - - Headers/glm/detail/_vectorize.hpp - - hash - - XQ8eZBnptkN4fO5LKJZLZzxSOM4= - - hash2 - - UPsB2TXUy931RRuz6G1wxlnRX01pApkXCU5FFhO9wWU= - - - Headers/glm/detail/dummy.cpp - - hash - - HQ9y1ceE5EIctfSegOR2qY0/f4E= - - hash2 - - yw0aP4tqMgks80v8BinGjkHKpkF+y+cI1JN4J0m3eik= - - - Headers/glm/detail/func_common.hpp - - hash - - TINZYMtUZmwSUrOEuEKRI/4ayW8= - - hash2 - - jLlpb76QTkDAuq+ItQvFcqPa9ffrhUZlQ3d74vqpVsc= - - - Headers/glm/detail/func_common.inl - - hash - - 92Iltl4FELA13m+/94J9f2hYNaM= - - hash2 - - ZdULiZOpcg2sT8p1rl+fSVz6IB1ANgJRag0h8MlqtMQ= - - - Headers/glm/detail/func_common_simd.inl - - hash - - WCsNiTRwglLGkF+/3o95YKTD0+Q= - - hash2 - - mJEFmJbqaf26yfbbD0D2BlxtIy6sS5rGiYTTwS+TtG0= - - - Headers/glm/detail/func_exponential.hpp - - hash - - Ht04yt7W4NnImMtSZ2Sml/5CyOc= - - hash2 - - uYIyHNqhR7vBQaheMr1pJxdNQIYBBu7L75VhrjKpxZc= - - - Headers/glm/detail/func_exponential.inl - - hash - - 8uOsYbz5IUQ9GlK5oZEpt+33lx0= - - hash2 - - 9Dj2HEom+Jpiyg8STMM+p/jLYxFHO7ZGw+LMS1kxInc= - - - Headers/glm/detail/func_exponential_simd.inl - - hash - - T5qdcE38h8v+KYqF9cjDyYszOX0= - - hash2 - - QfpqjJta9P0wzUv+Rc5OZ603TfKpPs3CMKhB7/N+R48= - - - Headers/glm/detail/func_geometric.hpp - - hash - - n8soh36b09rhVbet+gTLS9ZP60A= - - hash2 - - dceTdhhvOhuyf3c3W7db6z9dstWkenW9vCwfTVcDJwk= - - - Headers/glm/detail/func_geometric.inl - - hash - - TzvsTDiql+1aSb6PMvFXGhm7duI= - - hash2 - - o7r1rtprfsujFNLsCRYCi40TIpkUliL2WEsnLxvQ8Ts= - - - Headers/glm/detail/func_geometric_simd.inl - - hash - - qETcwF/FqOVp8fkJE5kDVfQjsDo= - - hash2 - - O86IHSK42TCQx4ZSjmmJKgz5+xsN5gYtVEaFsf2zf7k= - - - Headers/glm/detail/func_integer.hpp - - hash - - GDw4tH/J+g66h58TFJdc/03D1g0= - - hash2 - - zNmbmQ2Yg0Qn0ksGKUr0bttzMmnaKt/5ZDEhlCVulo4= - - - Headers/glm/detail/func_integer.inl - - hash - - O4WB/PW0pIRh28IdMmalp5tRJNk= - - hash2 - - VUSnGQd5gc9g75tKZPA3y7uvSeTZq+uhJf1hmnng7o8= - - - Headers/glm/detail/func_integer_simd.inl - - hash - - QMz4stzTXocnEpeIm0VKPzORhOg= - - hash2 - - l8HxrN+NdZHuLvl3Pa5BGY0UG2cC/dKVAxiwpeeKYMQ= - - - Headers/glm/detail/func_matrix.hpp - - hash - - dDc6gLBStm9yJUwlu/rCIvLtm4o= - - hash2 - - d98KN/kh9pu7HIjTlhg7Y735s/7MWePU7rn5vR1KnYI= - - - Headers/glm/detail/func_matrix.inl - - hash - - vzoIsrftv7uQppUhivMXwOs9e74= - - hash2 - - y2nNa3udwiWPoavNReY9gwy02iCKk6A1v4IQVpd/8Og= - - - Headers/glm/detail/func_matrix_simd.inl - - hash - - uB6Wq58LnzCZewwt/7PCejrlyIU= - - hash2 - - yTjRfsNODyrLKJ+JcDm7EQ8YfiJ3K0O1x2vtzYZPMvo= - - - Headers/glm/detail/func_packing.hpp - - hash - - /Ez5jeEmqIr8p0Yd77IihhEO2X4= - - hash2 - - NFWej+a1RgVKrq8RKh05lfgq7ArDZW1O7RLCJKx12zs= - - - Headers/glm/detail/func_packing.inl - - hash - - 41PP+G10YS07pToRQ8ITEfvZVVY= - - hash2 - - NnnFgpeqaojUfn2JZyMbE4kfNWtL3mi/6j8nIuNOq9A= - - - Headers/glm/detail/func_packing_simd.inl - - hash - - hZ3I83eB6K/Rio+xVvipAWvvBm8= - - hash2 - - 5OfaQC/Eyqb4kWQWMft5e2IMJ9QOrCOcPDYNoFWp8bc= - - - Headers/glm/detail/func_trigonometric.hpp - - hash - - Cq5w3I4nd28Uw3UPbEv1dByBEtw= - - hash2 - - vOO+yltC/6VHcE0SR88a5aKUM37tNM4apfgavNFeCjw= - - - Headers/glm/detail/func_trigonometric.inl - - hash - - zpKvHgfN6sq4fTvlNWG4pAZEdKg= - - hash2 - - ZPWPkr/ZZGtTD/lzZEiOBIMkesYbBAd4lsH2+c7ghPk= - - - Headers/glm/detail/func_trigonometric_simd.inl - - hash - - 2jmj7l5rSw0yVb/vlWAYkK/YBwk= - - hash2 - - 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= - - - Headers/glm/detail/func_vector_relational.hpp - - hash - - +p0L3cKGZDTqFWpn88TAl6x1pdo= - - hash2 - - AXvK6G6PFXoowYAkTdaWT4Qm2wZWYiRk0oy/MlUlIGI= - - - Headers/glm/detail/func_vector_relational.inl - - hash - - NYsI33GjdZ1uIFOUOb9xVlm/NK8= - - hash2 - - NSOJ4CPY7ALGSw8hqDUhJ490sQ9EIgzhXZfatmXSXz4= - - - Headers/glm/detail/func_vector_relational_simd.inl - - hash - - HkynrZIWQGYz8EUgIEYJrRktBqQ= - - hash2 - - hoxP5lp0AS80GE0sYuX78UpKtbqFJqVO+TxdzHoHtdY= - - - Headers/glm/detail/glm.cpp - - hash - - rPR2dd+Fv77YC4hn9A7qQmb36G8= - - hash2 - - JOtXHgwb95EzQWIhpF2tXyB/XonYwGjrCoh02sF66uY= - - - Headers/glm/detail/precision.hpp - - hash - - QkrWpgwgUrn69kmQfGVyjvk1rNw= - - hash2 - - 2vX+bd6x46m5onjQ8pD6ckT6583GGw9zp1ULZ+Y6KDA= - - - Headers/glm/detail/setup.hpp - - hash - - N8dhQIni8ff4tTC9VB5GpJFsJBE= - - hash2 - - gtU65zeLEFAs9vz1nwtQ25OSdDnhTTBGlW6vpThuTMU= - - - Headers/glm/detail/type_float.hpp - - hash - - T2zNThrL5tzJv82Mr1oLm8bq1c8= - - hash2 - - DA5UnumLl2ke+ad7cdLYuJrfl9PBUEbKfJ4QDIZgfZE= - - - Headers/glm/detail/type_gentype.hpp - - hash - - +Yv1tuO8I1ejOnOr2asWGHhiZqA= - - hash2 - - NN428Mil1V41nkm0GG7gkO0BsD/UM3lA7T79r4BQzDU= - - - Headers/glm/detail/type_gentype.inl - - hash - - 9WURNRmyyS9joS43AbNz69h7oSc= - - hash2 - - I6hiO5E+nBXX+60VSuRCQJDruouOxQvVUatVZoybdKk= - - - Headers/glm/detail/type_half.hpp - - hash - - lpThaGHnOquGYgckEqH3lZ5QDHw= - - hash2 - - ycZNSxiDs22fEqhiPrAy9ujnFszMj6xWuLddUinxxEk= - - - Headers/glm/detail/type_half.inl - - hash - - lF/UuVD6z5TUqZ4+9YRFOLLJ898= - - hash2 - - f1LhZslUmNpgVo98UkcHY3vhoVyp6oy2kLMqYtG7D1Q= - - - Headers/glm/detail/type_int.hpp - - hash - - EsLdFZKWPfO4Igk4cAQjpJT3NLY= - - hash2 - - jdfk9gWWBH5pNneDUD+zL7AIObvMyBjMV6h2BDtn80c= - - - Headers/glm/detail/type_mat.hpp - - hash - - bGuRqibLhk91ommCa0FUGPSoGrw= - - hash2 - - vAbfWJv+nTMinllHWcEuJxF0ERc5YSPh5zPDJhvSSCM= - - - Headers/glm/detail/type_mat.inl - - hash - - YYh22fJnZgacFJWUKbX/XoRWMfE= - - hash2 - - 6pWmeDjMuP/jtW/e5TecFICPp7kajDZseBvDhHOMftY= - - - Headers/glm/detail/type_mat2x2.hpp - - hash - - TpeSN3jjEgfcUPV42pm0cGMUkbk= - - hash2 - - YFncYre2vf2hUgbMYy7IN/o5nPYXtvGuojlKTye3MoE= - - - Headers/glm/detail/type_mat2x2.inl - - hash - - 27CX+oPpOoYY/PixUy86hYKoTWY= - - hash2 - - 3nWGsp/o115C7jlRwecZ/JSoAIE1Jn+GfqRxcXLiZz8= - - - Headers/glm/detail/type_mat2x3.hpp - - hash - - vC4YuPS+u7zUhalDZ2PvgfT92dM= - - hash2 - - XbLTQv8ymc/oYWml9uyBNEE1qIL0Qsh9EX4ME+G9M4c= - - - Headers/glm/detail/type_mat2x3.inl - - hash - - dlhHFphUMP4gWP/BH0WD1j7qdQM= - - hash2 - - mrS7UBHhaBgpD2y/krehdU1sipHzNjthzXnX4e3M6bE= - - - Headers/glm/detail/type_mat2x4.hpp - - hash - - tHCeF2ElpYCIMs+SZuk4hqc10lw= - - hash2 - - GvSipz0n/Ms89WOmtrBbw4tp9DpfGKxqyZ7KQIjtGk8= - - - Headers/glm/detail/type_mat2x4.inl - - hash - - uj78Nx4VKxxxdII7ahAMSYFzhGs= - - hash2 - - Xm/IPMRN5eaHReYGZlutJDDoIXT8TtUj2mhFqjx7GLQ= - - - Headers/glm/detail/type_mat3x2.hpp - - hash - - nYzZA0V8g9DmIbmQeaPftD+dy0w= - - hash2 - - 0mZOaD6wFPz6Q70KwSUozXEhcV357x2uIiv7CbUMB70= - - - Headers/glm/detail/type_mat3x2.inl - - hash - - yVx6XFQ61QTADfY4uNcvNrUP2o4= - - hash2 - - l10NCU+aOiS/oHBkIfCutDQpJkBoYqZea5c4cLqYgvk= - - - Headers/glm/detail/type_mat3x3.hpp - - hash - - NXCfrnM83lkiqiaHJ6NqMlmNGCg= - - hash2 - - x+TBMAGDj2sUU703eVwn4+OJq3h3V6/hHJsJOyTALVs= - - - Headers/glm/detail/type_mat3x3.inl - - hash - - +CReYrRXLuve8oIxPvFkDmyw1v4= - - hash2 - - lZQVWpk2+cENAlaDtIOBX9w9WDskBhwqmFSQ/bzRidU= - - - Headers/glm/detail/type_mat3x4.hpp - - hash - - OIpkT7UR64LRR2OmXI6o5/oVhNU= - - hash2 - - YVezCdgK1kafo8rbiNGQdzazH8cUtBLv+XGPD8qrssA= - - - Headers/glm/detail/type_mat3x4.inl - - hash - - bPmPoYYsYFfXTGEhQNBz2nMSli4= - - hash2 - - nRuRchwYQJEUO8i9xrgIhmpqGmEivOuFQawo1anMExg= - - - Headers/glm/detail/type_mat4x2.hpp - - hash - - /1ELQFYHwr4EEkuUcGecdNYSJ2o= - - hash2 - - etifzOvXBaPsXF9+4iSPIa9l9CJoEEU0ps068Y7po1g= - - - Headers/glm/detail/type_mat4x2.inl - - hash - - 24xrMcuSzKL2ojb1p6FE89ghLhI= - - hash2 - - qzZZSqB3lBZenNiPT2thyVLQOFD4CtS9/mrKYdT70c0= - - - Headers/glm/detail/type_mat4x3.hpp - - hash - - s3dxr7DcpbMEo1mEgDQuqbPJD40= - - hash2 - - khBp0aPXRP9xBl5Vpt4d4TtaKTj3l9h0QhbAe9OoolQ= - - - Headers/glm/detail/type_mat4x3.inl - - hash - - oyCcv7BNGzG+ZMhS/FYmaPadjF8= - - hash2 - - i0ZzzU1Mm7d/4wAA0P9Sk69xSkRfBjUrsWl4c7nGzmc= - - - Headers/glm/detail/type_mat4x4.hpp - - hash - - nEuruftHTigtDRqjNhPpaF/noYo= - - hash2 - - Mj3N/daJEUBUOhb+hYKg3Lt7PKVbkkSsVO6DDKH5FqQ= - - - Headers/glm/detail/type_mat4x4.inl - - hash - - LyJwFyg6sAC4xjlSOK8aJCf+Du8= - - hash2 - - kyymHEBN5D0fbZ6C3gj8NUd7WO1MQXq3r8x2/1sn93w= - - - Headers/glm/detail/type_mat4x4_simd.inl - - hash - - FtUTa0k+7BpyQAwDGBZGtSOa8lI= - - hash2 - - H78SQuMqXS4B0SnYqVhxGWAv/IvpwXz0UqiewhGcohc= - - - Headers/glm/detail/type_vec.hpp - - hash - - rPSWy5Msv9P1vSogWTTrffgWM9I= - - hash2 - - TFnS3lrm0syO9tg791iiq0Q6vu0ARG1bKJs1s+nwUIU= - - - Headers/glm/detail/type_vec.inl - - hash - - trRK6qh5PoGx1c1E+xDewhOQzlw= - - hash2 - - 773VAeNKHfI2PWR5dMSHZGjtAPgNyZRUxI4Qtw5nK4o= - - - Headers/glm/detail/type_vec1.hpp - - hash - - j7SSCq7qlAfIFkM+E1OVfstCx+k= - - hash2 - - T7x8TJeGIcBwR3NTlfZVfSRYeTlaXca70Uq8RYxb1Rg= - - - Headers/glm/detail/type_vec1.inl - - hash - - KTX/8gyRAuffK8+tacEPOtDtjYw= - - hash2 - - pzlvivGp2GmY1TteBUS9ymmMzDGuuXZZF3u14yQsrOE= - - - Headers/glm/detail/type_vec2.hpp - - hash - - 323GbVfGWpElo/Fq4lpgHaQ9EEQ= - - hash2 - - UIo4jdyxT8b/TZ9UYkwB3+ACiZSxmCfimuZxFLRap7M= - - - Headers/glm/detail/type_vec2.inl - - hash - - Uk1ZuqeRD71VnvO3M+WPJnIuQPc= - - hash2 - - HngADwdA6/8+35Ev0culFlBLkG4+1XhMYEq0lg6f/lI= - - - Headers/glm/detail/type_vec3.hpp - - hash - - 8pEmWIYQM7KC0NIsw9A6YYE+FJU= - - hash2 - - kT7CrnO25y/7NvkyVF9skmUVwmkC8wh1gFAnicXn5Fc= - - - Headers/glm/detail/type_vec3.inl - - hash - - q0I+OaFqb6C1Tk5GTP+jz0t/q2g= - - hash2 - - YhfjOnWZsc+hPAd6jyljBF/TVHynYhJqyey+2mKEBcQ= - - - Headers/glm/detail/type_vec4.hpp - - hash - - 3r4L3t6iFR/HNaVkbs1xygqg0JY= - - hash2 - - HrHJAZ8pRPlGEHfAx+ISrKGS993eDE6uaxcT48f+Y34= - - - Headers/glm/detail/type_vec4.inl - - hash - - QftYgwdLMv4jjGt6wcWuv3EPX50= - - hash2 - - L0EG2kxcPDiFAwmtrTbygOv0+npQ01xhcMbxDrwuD+U= - - - Headers/glm/detail/type_vec4_simd.inl - - hash - - 64g9QybhHhHeYeX95pcKjPndjHc= - - hash2 - - Ycn9nbn9Ss2R/DfMxvRVKSmUnK6cRqDY1Xg4is4rTHI= - - - Headers/glm/exponential.hpp - - hash - - CoZi/mwDoaj8Yn1axlpYZXYFPEo= - - hash2 - - CahedJXGY8Iogb3dL93M2evzvMR1Ki5VYCYSZsRC85I= - - - Headers/glm/ext.hpp - - hash - - 3Zvr4S/+3Jbk5xuFN2YAqJ07w/c= - - hash2 - - YuhQEB9FR6jgio02uFAedqQ9lx8ABrhBPxnktR5qK3A= - - - Headers/glm/fwd.hpp - - hash - - 6Diza5adx7dxjJ6q8SVJ71vsrEE= - - hash2 - - 76YmDTcxxDYkYT+egmba7qKF1jBiVE+Y1y9wJRaGPDQ= - - - Headers/glm/geometric.hpp - - hash - - RWF9oFlYaId1FZX9fPQ1h7FFDtY= - - hash2 - - L1pr3Smv5Zq9h0Kx54xCQTvrUax3aOYmlCNWtoXCHSQ= - - - Headers/glm/glm.hpp - - hash - - 8q5sn+8Ixc/VAkRoVz1aVGfnjM4= - - hash2 - - HDfe15ZTQLn/waQutSKEPW3CyHYtUa6BBB6JIlYh1Ko= - - - Headers/glm/gtc/bitfield.hpp - - hash - - /sTDwY3z1mL13Nbw0rg+X4CV04s= - - hash2 - - p8tIZyd41JoWTSLuuGAooNNOpGhei4ny+RCaHndL06s= - - - Headers/glm/gtc/bitfield.inl - - hash - - CY+0u7qODCQCgk9qfv9ulTBT0Xc= - - hash2 - - aWeFX3GcT70QPEacG5fxXq98VbS3yxovE5f8I4fL4SQ= - - - Headers/glm/gtc/color_encoding.inl - - hash - - sh6TIGwKSTWf/071dRicOMwpDKk= - - hash2 - - ss3lvljruWCf24KYxoUjUQltn6FPafEF9dKQ13S4XQM= - - - Headers/glm/gtc/color_space.hpp - - hash - - CfgMmgRrhKepAWJ6ddXxaOsbg/U= - - hash2 - - PJFJ64fhtAOwNJ8S5u1sBVWW0Ub7zrgXVyV0BPCVDpk= - - - Headers/glm/gtc/color_space.inl - - hash - - Jwb2rIZbvZXJSJOvjtqaJuEFalE= - - hash2 - - x4G6LbABzFo9Ri+HOpgzVu9T8qyl3+oQIEY/LjfyEoA= - - - Headers/glm/gtc/constants.hpp - - hash - - 6a1Fh+XpXqhoe58jQHjru6SbR2I= - - hash2 - - /CJvikQtfu2MTKCUPd21k4+gD06nygo0MPOan/KcyKU= - - - Headers/glm/gtc/constants.inl - - hash - - JQHQsT0TuRWEx5b1yPG3BSX4+bs= - - hash2 - - vd8A7Q4VpvAIi1XdUitgTPvugMcyXW/F9OIJ9Kg1AhU= - - - Headers/glm/gtc/epsilon.hpp - - hash - - kHBQMSjfe37KPVsfoVu0sn7R8k8= - - hash2 - - 4eHdRczzzx9qWscFgLv1se9idI1Ju5OqhbmDnrIBf3I= - - - Headers/glm/gtc/epsilon.inl - - hash - - W2BbmZTuJ3Lvk8lZV7nrxFQnExI= - - hash2 - - 0G2ysduuRCO16e1J3FNZkiSK+i3rVRZZzFVurcuz1ac= - - - Headers/glm/gtc/functions.hpp - - hash - - 8cCOrqDITwYLyV50flmLcte2MMo= - - hash2 - - g0mGWtjjWFsskvevg2cEpvdYt/TxSZOdaKSSSHPveQ8= - - - Headers/glm/gtc/functions.inl - - hash - - tknaoQBONIz/tFETSPGID7eBEpQ= - - hash2 - - fLJdVODgogg07JqTicRXOqb/WvhQESKNkvUUAqDWX2c= - - - Headers/glm/gtc/integer.hpp - - hash - - kYH9BwmwVt56UAx2Mt6su+Bd5O4= - - hash2 - - 7VNyMWQDAbUgftf/kR9A+rp38XRVWIWwUU6ATwR95YU= - - - Headers/glm/gtc/integer.inl - - hash - - LTwyG1AML9+31n+vadL/la6M5Rg= - - hash2 - - BfUoddYlZ/Q+AfShiXrl1+nX89+L944bfdyQhvjucSU= - - - Headers/glm/gtc/matrix_access.hpp - - hash - - vktUkQGtslUUMZtvgQP4PI0/+1s= - - hash2 - - DEoZUMLxrURXHqXDjc3UGa3uA83XhCv8vj0OyX2zNOc= - - - Headers/glm/gtc/matrix_access.inl - - hash - - yjsD08wtxk8MmlIcdw/bZVLCaTw= - - hash2 - - i0Dg/ODAos3lcVML0d0gbYZ6S7wqVd8GmpmF8pywGp0= - - - Headers/glm/gtc/matrix_integer.hpp - - hash - - Y79LAgkDRizb3QBaKab2YLkjuDM= - - hash2 - - 2biVbDBA5hKDVje0JtgSI1jqDgviC4X7c/mB9PHlrkI= - - - Headers/glm/gtc/matrix_inverse.hpp - - hash - - xaYJHIeY6zIlIDMivTK4sKnnL5s= - - hash2 - - YjEBGTsMvjN9udibJNDIQ0XQZrQCo5shyN/BnWZvPwE= - - - Headers/glm/gtc/matrix_inverse.inl - - hash - - FTHJXuoUbnsqcG+cxFHejh1ma9Q= - - hash2 - - YGVrPYa8WjChCpEizGgJ6GF3lAlPHWCr/juojRe2udM= - - - Headers/glm/gtc/matrix_transform.hpp - - hash - - fZfpUTM4S1W4WKRxjqeyDrvG66Q= - - hash2 - - RZghO7L3AZcZj56yMffst4+Tp8C4/zwg7MHV6y0BS2g= - - - Headers/glm/gtc/matrix_transform.inl - - hash - - BkWwIMixxL6DEn80IID3ObYvFIE= - - hash2 - - cKhUNmpwQti1gYnIsUWaty/Edzn42vTGUMFXrMokbAw= - - - Headers/glm/gtc/noise.hpp - - hash - - /vM+k2sNisK8unEwXORcVPUVQHQ= - - hash2 - - R2YA2u1qcyUkGJ2Y3YkzV9nANYm/Y+DR57/Nag58mKg= - - - Headers/glm/gtc/noise.inl - - hash - - sAj8tQ+5swpgcCZXrcrtbHO/CDM= - - hash2 - - TeOr6y3rkm5rpTmFWTlAnwqAKnyNUw2C6NBqlNHOX+g= - - - Headers/glm/gtc/packing.hpp - - hash - - rk0JcDILSgt5BNNlDZ40Nr8NEjI= - - hash2 - - YnqN2S9WHOP2nfxX+s0EvDpIh8BRmqEClDe+96VUft0= - - - Headers/glm/gtc/packing.inl - - hash - - dTNU7VjrjdUFwhsEW6+aDx5My7c= - - hash2 - - P8pvyrxqyOvDsJIq2saUCPB02USe/JUuYCkg7yksmNo= - - - Headers/glm/gtc/quaternion.hpp - - hash - - z3v53nWbvJ3omg7toz0unrqz9KM= - - hash2 - - bRG65Idw1jgiloIRR8SHqnc9LuKon2e8nucT2cz3zyA= - - - Headers/glm/gtc/quaternion.inl - - hash - - JZzj77yTFHod5QtkYIZuCICKneg= - - hash2 - - XcqbTg5+jbjKiNnxoVmJYYY2WbNVAmqCV9LBvwyKXpQ= - - - Headers/glm/gtc/quaternion_simd.inl - - hash - - xQL9miNmQL4lJkqOxSUjNzS5m+4= - - hash2 - - to6RW7MRu7ujReKuHE1oUgTE2E1x+ojuEv85iOs/Nno= - - - Headers/glm/gtc/random.hpp - - hash - - 5a4svIlOJF3Q/osffPQQ5Ct8lCI= - - hash2 - - 6678TXheLUfSPeVjwMS55G08Y9xbneHfm47LhzPzaNM= - - - Headers/glm/gtc/random.inl - - hash - - I294peBC4wwwbdr3Zvug9oR1Lb4= - - hash2 - - MgB/HxefMm4Z/CT7RkHAvpW5oNZnB3fvQB1TGTMrtmA= - - - Headers/glm/gtc/reciprocal.hpp - - hash - - BusgdIdDoYAPZ85IZlOsR+TLnL8= - - hash2 - - uah1BDAdbnWQNWo/sk+Djm9fdfaRhbnkF+U5L48DCGg= - - - Headers/glm/gtc/reciprocal.inl - - hash - - IXz8lH5H9NfhqTPtJ2t15RE8b4E= - - hash2 - - xuUGPryxDopsnJtCQrq1UDVdV9wXaiwr3kQuF1jmB8A= - - - Headers/glm/gtc/round.hpp - - hash - - 4lpF3YsztoOo5ldBhyjPGXLmEwA= - - hash2 - - G5ee8utukEI+669TU7DR8PhOg2fqHdzqTuHwpAKQLYI= - - - Headers/glm/gtc/round.inl - - hash - - DaOeuGFGhUo26TwmCc4yrUyoCck= - - hash2 - - y/uN7rDI+UkSPWNj/w/21RyjvGtyPj+abwOIavhOLzw= - - - Headers/glm/gtc/type_aligned.hpp - - hash - - 3OkmM8plgZhG8zjTGFVM0EGKU2o= - - hash2 - - IVADy0z35itovY3j6hU1LXcLOu0z/1zeNvLLByfQyV4= - - - Headers/glm/gtc/type_precision.hpp - - hash - - EUX62/anW42C6xNEh0ARTbqPUpk= - - hash2 - - 07HkVMc8ZsELRKW/9cSeQVhkcYNgbmbhG60gB2r0Qqg= - - - Headers/glm/gtc/type_precision.inl - - hash - - yirF9vl9G0CLpcekjDCcSeCLpcI= - - hash2 - - rvFGSAIzQ7VyvwMxpyz52GdE5DkJN+O5Dh8+p6YHq5s= - - - Headers/glm/gtc/type_ptr.hpp - - hash - - r7cY6NEYwh4cfo1BN/R2oGEuxtQ= - - hash2 - - XNrHXvhJdmzEBXJX3R1yWis9zMTt4Eo+aoWyyU8nRpE= - - - Headers/glm/gtc/type_ptr.inl - - hash - - gaW7ksVRvfLaunm7RmNGQvvi39Q= - - hash2 - - YBxgte4+jQxrufa3R+q8dtPEI/BErwK9D+tRF+2TtTY= - - - Headers/glm/gtc/ulp.hpp - - hash - - P+CcBb+RZVlHYWzZXEdXYa1nDNs= - - hash2 - - ZMLl9P8CudL8SuFZZAmcQresdECYt1nldM6OsGXkuF0= - - - Headers/glm/gtc/ulp.inl - - hash - - N+qR5Irm8nHCc7TENmWrak7hNWQ= - - hash2 - - jvF+zR0KCB8Q00YuNgVM+N8J8rwu/QgK//bwgMOlgoM= - - - Headers/glm/gtc/vec1.hpp - - hash - - hSqWdaq1f4knfdjOynH7zB0DOaI= - - hash2 - - MfKoUCdkK8zNeTCukHFuJZvw4nvJly5F49WaPOI5zeY= - - - Headers/glm/gtc/vec1.inl - - hash - - QAmFACA1VCnp8m8IWr5+s5gY1Uw= - - hash2 - - NSt1MZRuErEiq7mBv2NP8po/p4nRzFW8rtb/dRadrx8= - - - Headers/glm/gtx/associated_min_max.hpp - - hash - - fXyC+rBYs1efJt4HGfYh3+C4eNQ= - - hash2 - - F4EdHi3+unDEOKG/751TQxr7h1dstpffvpvwZHDxnLI= - - - Headers/glm/gtx/associated_min_max.inl - - hash - - f6rCzL1oWBiqUjaNl5JdJha20Ms= - - hash2 - - lQ506Hcq/8RlnsqZWLE78dH3nZKZ7viVI2LKaNUmiSM= - - - Headers/glm/gtx/bit.hpp - - hash - - dfiRXENxUE6VSHXbhn9DUutK+Pc= - - hash2 - - kpkvbFOmDmFzK14UlH0kmgjaO562VXYLcmQtlMUByIk= - - - Headers/glm/gtx/bit.inl - - hash - - IuI4Ss+vUsLdErJFSMfVLmV9TKI= - - hash2 - - F/dsc+6iNdnrsoYXfLf1CXLez0CLOuQSYBHuXdCuaYg= - - - Headers/glm/gtx/closest_point.hpp - - hash - - KEgJ0RRE5bxpymxx5cp09lHSabw= - - hash2 - - +R8OT4yNfdAzjyProCK4JWbZRwynI07Hi0E1CIf2AI0= - - - Headers/glm/gtx/closest_point.inl - - hash - - 5Y9snOJiiI5Epy382UZ5q3lMOFY= - - hash2 - - NxpDxPhAEm1c/xXYISknUrgw/6V1sNpqhysnRwsn8yU= - - - Headers/glm/gtx/color_space.hpp - - hash - - qrFFxuvk6QwlZeXe4OwZnNUl/aY= - - hash2 - - luoS6dN0jrRclUWFyHdS1usPHwdXGCWgeiIbE3kIigs= - - - Headers/glm/gtx/color_space.inl - - hash - - WOsjxhfzDD2rqiBCqt/93IgZANk= - - hash2 - - /5aJtwodJk5zMT9abzs8s1EaKujWkyi9UIaPtySk6Dw= - - - Headers/glm/gtx/color_space_YCoCg.hpp - - hash - - udc09heQw9HmhUYZDcTxgJ8RGS8= - - hash2 - - xCgWqfHmAL3G25kKfrVa4ICAzXaFKAo6gbm9TB37Up4= - - - Headers/glm/gtx/color_space_YCoCg.inl - - hash - - 3JWx755YLHhsnzWLUul2NMmXTRk= - - hash2 - - OGTjGtTFG5hjubRG+IHPJXUOHV3r77vDrmt+P/2piUw= - - - Headers/glm/gtx/common.hpp - - hash - - vZeuhWgYuJVdsjdsCLhXoXzE95M= - - hash2 - - gYhE5UrAv4s45hrbFIajRtRkQ+t/exWHAIEF7pGB1bk= - - - Headers/glm/gtx/common.inl - - hash - - JMNqcF5p2Pkrp4gosOGaGM8873E= - - hash2 - - 11xDM/Qg/rldMJQPCjuH3cAIOzaxHh3Wwm5MdrzJCd4= - - - Headers/glm/gtx/compatibility.hpp - - hash - - 1TIwDooCa2geTsWxW9ZCZVdkOCY= - - hash2 - - 2DgS752nsJI7ujkqGJq0DFJfKkLCznzfzElDJ3u42Kk= - - - Headers/glm/gtx/compatibility.inl - - hash - - ejprKQSpqeCTrkmZzouV8/wtfOo= - - hash2 - - dFT2uJk9KB/sRvnhH7luABwbypQx6zrSgGrlXfxAnKk= - - - Headers/glm/gtx/component_wise.hpp - - hash - - HpZs++RvZegufVgCN803ND3YI/0= - - hash2 - - l2rhP8G1+inj3SR9mz52fuojnOe11Dw41YkXOxqkpjc= - - - Headers/glm/gtx/component_wise.inl - - hash - - ehXstCKd3MoBmk2otrfU8Pgw+e4= - - hash2 - - Sf8/f0LANB3lnwYMtndA9HIZUlxyMgzw9aZ9bT7VlY8= - - - Headers/glm/gtx/dual_quaternion.hpp - - hash - - ueeMd6b0omyoQ0AECSUIMvFImsg= - - hash2 - - Vts3gt4VERWsEdf7wwGPRjJUGx/eLkL/WkvltGAL2q8= - - - Headers/glm/gtx/dual_quaternion.inl - - hash - - +vsn2hVXsT1l9uJ4IS3tcneHtVk= - - hash2 - - 5L/vfrh4YvMKfDHxlnv7P5OmqqUjjIR2bqPJHcFAjGc= - - - Headers/glm/gtx/euler_angles.hpp - - hash - - qgQEO35jBwOO9BClChxtkENp2tg= - - hash2 - - g8H18vwtzE19mfkwtqop4JZ3300RSKfYY4nqjCqaXdA= - - - Headers/glm/gtx/euler_angles.inl - - hash - - HqlzU90pWML/eEZ3tya/+0N7WKI= - - hash2 - - gvQNVCCw6rScBh90mys2CtTSpfokIVQoZUT7O6ak40g= - - - Headers/glm/gtx/extend.hpp - - hash - - UH0Cne9I7PssdQXJuw5kFcGY/EY= - - hash2 - - mg69PHJBQOOKnBi8Udb7XRIIpifqLmJILQMrWBs17Cc= - - - Headers/glm/gtx/extend.inl - - hash - - jiys5NYozDzkWgo9zf8A52kDAOs= - - hash2 - - xaRB1UlfP+4ADY+uioG1kyrjyeV3YCckzz//5c3KaaQ= - - - Headers/glm/gtx/extended_min_max.hpp - - hash - - ZWIJ3Gt98uO4bG21+ae1o7xJwiM= - - hash2 - - GNU30m+t1f4aI1ULP/+TyGCYtAkSVE5s7DCOVkmB0Ys= - - - Headers/glm/gtx/extended_min_max.inl - - hash - - X+9dcVrvmYObhgL5UIRyXHmkahs= - - hash2 - - pmkOzcHbvGelglbCyvdGaDhTw769UybbW36MgRGb4Kc= - - - Headers/glm/gtx/fast_exponential.hpp - - hash - - oWQTS2KeH7FXsz75DcsS9Is8wbE= - - hash2 - - ESzsQ4UEyBcbBgVkaLwYAHMixYJFGF0U/ijX5kerc3g= - - - Headers/glm/gtx/fast_exponential.inl - - hash - - zAKp27LXgDv+PK1Ff+8NeGaO3Tk= - - hash2 - - rPfJ70VWkkowRQPhMsXXkPHJEV73uzwCiIuo+pzme6E= - - - Headers/glm/gtx/fast_square_root.hpp - - hash - - zhAeELXlkQytrka1/Flc2GR31n4= - - hash2 - - xqWmUrHMWqYT25k1cPZheRIpY1bzQPmAQPSmggPArJw= - - - Headers/glm/gtx/fast_square_root.inl - - hash - - ht4ntJ9/YC+yeSyJutZqXC9PfNw= - - hash2 - - 0f9EFhHHa6vRaV/nJhtRBUpMvF0sJmrAlfyoI0qEO1A= - - - Headers/glm/gtx/fast_trigonometry.hpp - - hash - - MX3uAMWO5BGmLGj6Jl6KmzkEhI0= - - hash2 - - H3k+rb6NqCp5ygmwBB9KQDeajLhStjsa8r0+/P8I7eM= - - - Headers/glm/gtx/fast_trigonometry.inl - - hash - - uGqVX5rffHcf/A6ryOR54PqMd/E= - - hash2 - - 0q4yNwJN1ZhwwI9cIfLlMHrBciRtks6XiW7ABHFUgbI= - - - Headers/glm/gtx/float_notmalize.inl - - hash - - GgdHSAwnJBRHB/ZpTapn+7P0lek= - - hash2 - - oksX57bh89J0Y801nimRRLi/c4q2CVgUGqtHDysihC0= - - - Headers/glm/gtx/gradient_paint.hpp - - hash - - wtbtdLG6yjZItrGf6KkRAOBiROI= - - hash2 - - fdqhlW5k/V51jlDN8ZI0CqBCSfAjpMLopT54tpimGlY= - - - Headers/glm/gtx/gradient_paint.inl - - hash - - Mv/w5ejSj0XxW/bu7WLEKHGeOQc= - - hash2 - - tRB0LEHnNSDyMQL31Oa33KLXHuOzP49ch8NI8qjH/Rc= - - - Headers/glm/gtx/handed_coordinate_space.hpp - - hash - - M18zhR4RiGZGe3A7mmbrG9v2CAo= - - hash2 - - y1tIzMNtX+fy0MeNw2TGP0pSgDOlpTbulCksp24RixU= - - - Headers/glm/gtx/handed_coordinate_space.inl - - hash - - lq1qQkBfyLf2Ch4diK2tFIbtfHI= - - hash2 - - oHRo8/JcKmz82sU/B70wVXUkNj+Tg25JiYGnsVe1VhU= - - - Headers/glm/gtx/hash.hpp - - hash - - hxKaysy2gDbgmTF/SMVP4OnOL0M= - - hash2 - - Kow8opO904FCGiYTkiDm7FnM2QF0Xme6Rx+n1sKLHFY= - - - Headers/glm/gtx/hash.inl - - hash - - CtcaQduC3D2ZQpgEOLigZA37kQk= - - hash2 - - PrzR43u5Pa7itBg5He7E3XgfAt+pR7VvC9kswBcEfQo= - - - Headers/glm/gtx/integer.hpp - - hash - - jlOoigwzJf1iD7HDkQxKIlt7uv4= - - hash2 - - GosBp3LMPG9Z42YpT5F+PJ4YdEP2d6LskupFSnGf17g= - - - Headers/glm/gtx/integer.inl - - hash - - FOIxUJFmOw3w/BjSHOhP04cFOXE= - - hash2 - - LYtMvT8bebnbmuYIcLBq4xRsDKXtJr2ZohGKIsU+p5A= - - - Headers/glm/gtx/intersect.hpp - - hash - - Ok9EVEgdEcSV9ZsKtTi5r80/UhY= - - hash2 - - XcMgO86JCboF2OWLy+v10NAvDypNG96YA4l5sFboTAs= - - - Headers/glm/gtx/intersect.inl - - hash - - hwVHIzWk3X4LfB5E1CO/RiH1fRg= - - hash2 - - eX8dxZ4PHAkDN7d77ssV9RvLHKKYMekV5fz1ciNrY5U= - - - Headers/glm/gtx/io.hpp - - hash - - POGjOqibKARARlEQoncx9iiaH2g= - - hash2 - - 6gLFiDBHktRJVnTz+Rr/lKKtqECAEoCBawEsJBRBIuQ= - - - Headers/glm/gtx/io.inl - - hash - - SZdKH9vDNjJsslXSwcGS4L0FXD4= - - hash2 - - haiD/3vxianaFB0F3sBUAr2KkyXudRCV+jKfoauzc5s= - - - Headers/glm/gtx/log_base.hpp - - hash - - 1G2KBd/xuNZuES4cbbJ3J6YwgI8= - - hash2 - - HzlWULsPojK35sRCiks1hCwOboFM7eA+Z2a//7nroPs= - - - Headers/glm/gtx/log_base.inl - - hash - - sky9cHbjAYuUmlDdRfAbY/Zmvec= - - hash2 - - XnS8ztuOFmGIl74OwqCKKnEPvlRnjDgcctkIenpBSyY= - - - Headers/glm/gtx/matrix_cross_product.hpp - - hash - - Ir1sbY7YppTTfgJqBmknmN2j79k= - - hash2 - - TQNN96ZivCliX7oqZrsN/otuspKH5D1HNuHgEb7PGeg= - - - Headers/glm/gtx/matrix_cross_product.inl - - hash - - M4oz2YXoUkNCumIcE0+RE6FeqgY= - - hash2 - - T1YbqxmjyP4Qo+AWxdKGnQv5XLSbqFpPy4SQv5u5uoc= - - - Headers/glm/gtx/matrix_decompose.hpp - - hash - - v9mvMoM58y+TPYwogHaudad7ZtM= - - hash2 - - prw6oafDP5CUcDE1TnWfwY2y1zRc2PpgpVwW3XhCFp8= - - - Headers/glm/gtx/matrix_decompose.inl - - hash - - aHB6hnMAPmiGachCP/cdcChuxuE= - - hash2 - - 55rY3E1qG5Q/5bT/brcmv4NfvdkcRaNP8GW4o21etoo= - - - Headers/glm/gtx/matrix_interpolation.hpp - - hash - - BgLkiBSgfj0izCGEuqByMlIygnU= - - hash2 - - RSFMEcFTDwStMxTUXQHZWkDVxD44L+y2qM+ptkM/pRo= - - - Headers/glm/gtx/matrix_interpolation.inl - - hash - - gZSfjc9ngpf9zEo1gy77FGASRNs= - - hash2 - - CbIx14hfgLknuHNEJuty9VyvhigiO1HcMalyrsOSMpw= - - - Headers/glm/gtx/matrix_major_storage.hpp - - hash - - uW/XAqQWz2HC29JXlQJL68EQ7cU= - - hash2 - - iQQUlPv6SZ1B7QX/8RiNC3ELzPGr22p8i0umNSlyt48= - - - Headers/glm/gtx/matrix_major_storage.inl - - hash - - EFIcj6V9sXg8nt9jENtXRLDzfF4= - - hash2 - - anK0H5spjFhtr7tC/D7YdY41XTRKIPUtdlThQintXh4= - - - Headers/glm/gtx/matrix_operation.hpp - - hash - - CrDAKJocOr//E4aBRY43XyLi0zU= - - hash2 - - v5jbyMZTYXWRIVH9yV5Tjz42UFHZeCpntAx/0b89Abk= - - - Headers/glm/gtx/matrix_operation.inl - - hash - - v2S8y7e7qkzx0kHf850Zr37osng= - - hash2 - - 2P6vDMG6VVM+9t+VDySlfOxIeUzhXg8nWMY30ulbFbI= - - - Headers/glm/gtx/matrix_query.hpp - - hash - - 30wR3HPMNGSnbuXlcJW/230DPgo= - - hash2 - - HvMwvURAbCmCtoVEtrJRopbooKfck/jcDiSceXzK4sU= - - - Headers/glm/gtx/matrix_query.inl - - hash - - GWQe+SbMr6o94y1Qp6r/q7lbgD0= - - hash2 - - FpRbVORyGBnRBL1htyqmeDuVktUJ7Wy8CGwUVfMGaXQ= - - - Headers/glm/gtx/matrix_transform_2d.hpp - - hash - - nsU/ILl+fo95F4xz5KR3J/hbwpo= - - hash2 - - ScvjehaIA3G96z2q4yOh9J2W6Jhh2TXHdqxI1KmouyM= - - - Headers/glm/gtx/matrix_transform_2d.inl - - hash - - YeGiJWtFphgiyGNUa1G6YLbs+mc= - - hash2 - - 5pieu0JDUXb+JAI04vu10pZBYZQKGDDJJA18Y3Vkj64= - - - Headers/glm/gtx/mixed_product.hpp - - hash - - M/XYv02ZXsjEtQ2Rx6KBo4L+lcE= - - hash2 - - R6uXEzwa/Haf4nQhTFPhAjWjqZopWiW15wScGh9/PDw= - - - Headers/glm/gtx/mixed_product.inl - - hash - - TH2N19CK10bPUu/wPcNYFXWUn64= - - hash2 - - Lvm9rwQoZiCncPVTG0enmqbZVSo/tiiLAyT5Y/nikic= - - - Headers/glm/gtx/norm.hpp - - hash - - n9sVefwuYHcFoGEj2aiGXOs1saA= - - hash2 - - YAMtM3JNiIX1/NmwtWQNgNrQsMqOrzEeoxi4jz0NBk8= - - - Headers/glm/gtx/norm.inl - - hash - - e9cPgtVCNCSVJyyi1EbWdJ5WfvY= - - hash2 - - 7ouOTMtQoJKSPFxj8D0NjIp0wkLzfBPp+ATn2FzdkQo= - - - Headers/glm/gtx/normal.hpp - - hash - - CflEIoPEARWKsDQDSw0V5ngfCeE= - - hash2 - - way3g/stLqvbMVlkCy9YkLKdb57toN+Yb7o+jsOAVVs= - - - Headers/glm/gtx/normal.inl - - hash - - hVxdXx/Tc9FKWt0Oa/xMfpIaJSw= - - hash2 - - c0ARjrOrEm01A0+u/rfz+l8efP0izne4KDP99PCt1SU= - - - Headers/glm/gtx/normalize_dot.hpp - - hash - - emorQs7BvvdW2905FyVFAqyeYRE= - - hash2 - - AiHCOLEeIjk5+mZ+tOqeANpD/fT205Iyt1gP02FZWsE= - - - Headers/glm/gtx/normalize_dot.inl - - hash - - gA8xTv1vwOPxmhr2r224Otm9vXo= - - hash2 - - +HvMgVhlvNfMIniK9IB096Xza9Iz95So6O+fSZ+Q+mY= - - - Headers/glm/gtx/number_precision.hpp - - hash - - GCd3+jyzd3sHyjt3s1kZmHtxwgE= - - hash2 - - v9SHpGz4nf2QrwQ7xreVeUgZ2N1aPrnl30u1IpBLhf8= - - - Headers/glm/gtx/number_precision.inl - - hash - - myZq9u38lOrVN8nPh5PSQhICq1U= - - hash2 - - BTJtIBo3iUPAHDNZHtCLVc0NgEW8wMB+U3bnS8quEag= - - - Headers/glm/gtx/optimum_pow.hpp - - hash - - HIkq5BnzSBWmPCNocbYgzJxxpaM= - - hash2 - - WxX7WIGaCCGiDISWis4JIJWNnwcT8CrtDOmn8uwfcJg= - - - Headers/glm/gtx/optimum_pow.inl - - hash - - jlJFCh0lKOnNhWnwFR2Z7MiKPYU= - - hash2 - - F755Fcw2rvbktxej/YzqbOAD5VD64hUVtYDfcyTA+SY= - - - Headers/glm/gtx/orthonormalize.hpp - - hash - - 6KyQ2NzZx623TUnbtIUroN/KCso= - - hash2 - - zz4EQvnfEle3Sjnsx55uO/rxAzld1uiYHPSz7juYDAE= - - - Headers/glm/gtx/orthonormalize.inl - - hash - - 7j1ej1HNTRAUGAYYctDLddwJiE0= - - hash2 - - g8Wui0sNk8tctiAQq7116QUzPnLBLnDJbKdEKjfW6Us= - - - Headers/glm/gtx/perpendicular.hpp - - hash - - 9KhfopHUla5v7ZYvy37dpx2RzgA= - - hash2 - - 2sQ/ZfMGJ3Y15tH2y8QpKMItimRGI8q3AvtGXgept9Y= - - - Headers/glm/gtx/perpendicular.inl - - hash - - 7cUFH+WJ/H+iDpo//zHelg8c4Hs= - - hash2 - - g5rojxl8YEGd4zBG1Zl5+/LsMIwRgEYkFyW7x40Ptl4= - - - Headers/glm/gtx/polar_coordinates.hpp - - hash - - ZlZHtQ/C+gr5tmAivvAU9Vujhn4= - - hash2 - - jD0AaErl6gvO2+i7DkdmiASdoADtgpKaZgB/t29TmOc= - - - Headers/glm/gtx/polar_coordinates.inl - - hash - - +kz4c45AJXBgyemiY+uuOJh2vik= - - hash2 - - xfMW3yQWP2yJtJ/9fs8/JcvrA0YQY5Ov/ytIO6VAYno= - - - Headers/glm/gtx/projection.hpp - - hash - - gJgG22czGn9NeDloInV9Mygatgo= - - hash2 - - 3v1uxmSF7sTdeId/ZVrVorTYXoSEd1yhiaV64bQQs1I= - - - Headers/glm/gtx/projection.inl - - hash - - FBMSVTcQrTwDIOI1SOAQsd5LBlc= - - hash2 - - RBxstxpvwumI2IkN1knu3u71n/83zuhAyqXZe5xg394= - - - Headers/glm/gtx/quaternion.hpp - - hash - - NWjN9XAmdulxigJEmYtGO8b+JBw= - - hash2 - - WlnfeDL4Y1xJjtGAD2Ktk7KQBb0JEpTQilK+tBkOt9s= - - - Headers/glm/gtx/quaternion.inl - - hash - - vGKtSiP3+LdgG4O1yYD1JVfaFlw= - - hash2 - - lHJuBZwstB7XTKkIaeeaBQBVjWp9VauKXQZR6XHsUvk= - - - Headers/glm/gtx/range.hpp - - hash - - Zl0hrJ1KeAfVFHKT7640NUg+nxQ= - - hash2 - - D0/gl/yj8Kp2HiBgbLRGxpR6mbsm50w3FCA7Cp5RO6s= - - - Headers/glm/gtx/raw_data.hpp - - hash - - iBjGzMypC5767CwUg0BNpadciYE= - - hash2 - - 6FZUCFi9u/7R2zGUlZab17NjpFuY68ILQGJnV2PjPRA= - - - Headers/glm/gtx/raw_data.inl - - hash - - c00Sdgx/YFN4DSyjViwRHZV/JHk= - - hash2 - - ZZBeyGVjBtGO+J531d5rmykYuK/4GpfFJpJlXBlAFvU= - - - Headers/glm/gtx/rotate_normalized_axis.hpp - - hash - - cjU2ELoh1h2LBaYvAahxV7ct2Cw= - - hash2 - - mHkn/wCLaZhQB+UGF9dsvy4OCbxMrWz7ptqxpR0ljZ4= - - - Headers/glm/gtx/rotate_normalized_axis.inl - - hash - - x+PR6wRDkkInzYZ9fKo1OaGtkcw= - - hash2 - - kf9AMoQ1zKugXlYrWO+PVO7qTMkpIq7RNkb5tXmiOqE= - - - Headers/glm/gtx/rotate_vector.hpp - - hash - - 9gedrVn2wqM7gGRx4T4Eb/m3Vpw= - - hash2 - - 88gNwkY+XXTpSODmTIsGDHdnh+0A56cum4fBsvy9+LQ= - - - Headers/glm/gtx/rotate_vector.inl - - hash - - 5ZTE5Sm8aA8kVJp+D4rohbrP/YA= - - hash2 - - b3GU0KIPocVIQtGT2PcpgIwu7h/EKYCGVj9rWIpGwAs= - - - Headers/glm/gtx/scalar_multiplication.hpp - - hash - - v5pgAw+mMJg8skJOi7gWHwbvrxE= - - hash2 - - YohYA3omGtD2QK3nh140GAuhI7bL1lDfnwhnmphmrb0= - - - Headers/glm/gtx/scalar_relational.hpp - - hash - - lw6f8a1VmQ2AtXaK8Hk9y7Es3UI= - - hash2 - - iNK3nU9YGOADgGmw0gBrVc01IWg7+9JeFND4CW3NBFk= - - - Headers/glm/gtx/scalar_relational.inl - - hash - - tDMJdcj/RLgleUH+cW5FPjtwO9M= - - hash2 - - LluHLbnCfoxEWsho0D8IP0lT0xxsQ9Q4uP2HZERhZlg= - - - Headers/glm/gtx/spline.hpp - - hash - - WiwQiWYW0tbvShAorGAVdO4k5Is= - - hash2 - - hWH3NTqiFc2WJ/T0HaWN9hxYxaEqAPVasY3uIJ/mNWE= - - - Headers/glm/gtx/spline.inl - - hash - - XmoSjwhtH+lAkc3RY21ofmC9Lr0= - - hash2 - - k14kF7MB93s+1QQUa+NIJH9ZBJRrfrVSxrww/tD/YBU= - - - Headers/glm/gtx/std_based_type.hpp - - hash - - 5sCJcgPHPhLEDGF2vWg4fHIxbHI= - - hash2 - - XKD7oQCRxOSCgfcsHx3N3IKoAx5P4gukYdR5rUSIgnk= - - - Headers/glm/gtx/std_based_type.inl - - hash - - XtvEUckGVylbc7hT/8d0QbL00U8= - - hash2 - - 0AT9sB/weH2rEiVlBQHfpvutzSSi8UIuZ1XgRoes1kA= - - - Headers/glm/gtx/string_cast.hpp - - hash - - zMRud/tkllrbPXntAJKQ5ZEjfWY= - - hash2 - - qluCwa4UJu8+HbBS5jct4CBbgWqCyhVxYE9WXfjEpVw= - - - Headers/glm/gtx/string_cast.inl - - hash - - 76jKk939fviLeBi1p3ulp8dvQrE= - - hash2 - - xWw6jr5XSYVDWG0E/zzaPaJcwjUdfHgfVLR7c/KWnyg= - - - Headers/glm/gtx/transform.hpp - - hash - - 3yOJsigU+JG/wd22ulu/Tg3/Q90= - - hash2 - - Q8YLncVuZMam9e9vRHz0RSX7lXRNMVkMYEmp/15+n7Q= - - - Headers/glm/gtx/transform.inl - - hash - - yJenP/AMZhWIVJEm7GtUjgsuvL4= - - hash2 - - rgwiS9rSPyJKIgmkxeLmEyGBJw+96mMeFg0VEGiD3ec= - - - Headers/glm/gtx/transform2.hpp - - hash - - umV11DsLL3VudNDtEw3IviN8+xU= - - hash2 - - L1ILyXaAbQhLCDuoFJEOiKrphBbeoG8O4b2jF0m7g9k= - - - Headers/glm/gtx/transform2.inl - - hash - - rlHZ2qpOAqw6TCPfvUwicVfe9Cc= - - hash2 - - Ix187nzfHNCKDAu9aXOLFu+tUqNlUmZtJhrYT5t8Z50= - - - Headers/glm/gtx/type_aligned.hpp - - hash - - jOhhu6dl0AqoZ1ZZ9i66ETcDZPY= - - hash2 - - p8r1s9zpTsOTMWKSB317pyRPHXS0hHTM2mMvbEDMKuY= - - - Headers/glm/gtx/type_aligned.inl - - hash - - JHWxhKeBZW0IFSHlgCnbHimbWcM= - - hash2 - - 5n34INMwklu9hVz1jQhv0wS8z9O/TcfWUSiiLe11kNw= - - - Headers/glm/gtx/type_trait.hpp - - hash - - Ev6v2+PAWoHTL2KE+3GXAVLLwVw= - - hash2 - - BB8+9A9ZH9gXR/u4ZpYI+0IstzWrrkEm1OE/bsJYUwc= - - - Headers/glm/gtx/type_trait.inl - - hash - - 2jmj7l5rSw0yVb/vlWAYkK/YBwk= - - hash2 - - 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= - - - Headers/glm/gtx/vector_angle.hpp - - hash - - Vn5Fqne9tIVK32lDkq66JGI64qI= - - hash2 - - A+f+8spx5XFXfN9j+Xl5az210tHck421x2c1mCLxRtQ= - - - Headers/glm/gtx/vector_angle.inl - - hash - - VnUNEmPWcQdiv6bU8B11HZyL52w= - - hash2 - - 6kX/bLRQWtGqnf7+OEBa5eMOvWWN9p/mb3KbAbyuKHQ= - - - Headers/glm/gtx/vector_query.hpp - - hash - - 9vQ+ZTb+HuNfpl2TS/NuTdp5ycA= - - hash2 - - 9/ULDnOqies9ihAz7Uv0IQjAiSa8TK/Vk+WKihyjHm8= - - - Headers/glm/gtx/vector_query.inl - - hash - - sfLoWdnHWcg0esc89sKqQ4MRHwo= - - hash2 - - 335taNPfa5OQsxIv+39meg7s+zEfLFxddm9UXEb9chs= - - - Headers/glm/gtx/wrap.hpp - - hash - - ulX2YAxOMba2lCVF0lksYjRfDQ4= - - hash2 - - C6ysGGq91cZqtWm4zNPVoyOnUghrPjH5MUI1v3gdKtA= - - - Headers/glm/gtx/wrap.inl - - hash - - YGjSzCZQNZ/2yKpjIm4hkAVtI+E= - - hash2 - - xzWR9KvEjvmi0+GfAHhPBV5M4FtmhmdKoANagQaUDyU= - - - Headers/glm/integer.hpp - - hash - - fDUnCCzJIx1l3yE1rwYtTkbCxXk= - - hash2 - - jhtzy4Iwkrm9ZuU8Sywsj2twDbxBL0B00T9fRxVFLLc= - - - Headers/glm/mat2x2.hpp - - hash - - VPqsUnW5yfl/cn1558XBF/Jy6Uk= - - hash2 - - L87yGk/M/Kwp0Z404G7Efc3oJ/3DnyVWVPgoPOm9S1k= - - - Headers/glm/mat2x3.hpp - - hash - - tEOY1llVWdSg1kS0HmEhF+qCxxs= - - hash2 - - 4e9YpP3pzvIJS8+DpSg0Ql4aoB5nd5sh2iBeU8KzyTU= - - - Headers/glm/mat2x4.hpp - - hash - - 1veqeHRUcEc/f0VL6tNwrmW/9Jk= - - hash2 - - hrKbRMQB23VKwx+QPed5pjxVmjUnIvvMsZDsI9GbGVk= - - - Headers/glm/mat3x2.hpp - - hash - - /OWwmt+9x7QUpFimhlrRtTf56q0= - - hash2 - - jOcjmpQ/bweGoJ19PD/G4Of4+BoJfVhBId5G/U0uVgE= - - - Headers/glm/mat3x3.hpp - - hash - - EwHZXOjtRcVMuaMKtk4YBalojqE= - - hash2 - - 5X9thUnLdBAg0YGUyS38AbSZaAkOUoYYX9sI+4svfZg= - - - Headers/glm/mat3x4.hpp - - hash - - rYLB9qQk65Z8AyT78zXu+QSM7uc= - - hash2 - - bVGky2Yt1h93ZKQHarcqwSOyiGsiO9qPbAbsO+BG7vQ= - - - Headers/glm/mat4x2.hpp - - hash - - Vv7qWsJDlkuxaMYHGIBp0sxZMdE= - - hash2 - - A/Ws5JTbaOVTxNufpMCF+BnmvzkpgiW3dpMatQT60y0= - - - Headers/glm/mat4x3.hpp - - hash - - h1VI6eIqG+eM6Ip0A0NXDu8KPIA= - - hash2 - - xADe4gcwkovTkOozrkLqepa/cBfayp3+jTGQ6NdyKbA= - - - Headers/glm/mat4x4.hpp - - hash - - jQ9PkMH0wZBlxl0jL/HH46q6F6g= - - hash2 - - FgBdGuTamigxCy3IAl+mUcG+52tZOnifTxOZCLgo32E= - - - Headers/glm/matrix.hpp - - hash - - 14dmzuV17eugK+wBnDv1OqFUxZ8= - - hash2 - - jvbM01ZeSciYxFz5xf3M91K0WU7Y809bBScPVFFGeOU= - - - Headers/glm/packing.hpp - - hash - - P+OXApK0uqXE9vUq0i8fUUxEKBc= - - hash2 - - dYpTvFKmX/Bte5xOmMyuadHB2xFnVvw85ei7NtaCr9k= - - - Headers/glm/simd/exponential.h - - hash - - F3tx9nE/BWdIelpucJSEnABoBQg= - - hash2 - - mzaKbux00hLIA+oHFl1J7+Hmu+eeSb9BsOZsQukQIoU= - - - Headers/glm/simd/geometric.h - - hash - - U8IIoN4/8kZAlao9cCKXP48TClU= - - hash2 - - ajCZ0nNnh7E2zgXDh81g7gv0f18GsGncQtXT6wNc2dw= - - - Headers/glm/simd/integer.h - - hash - - UmnLqAfyVtvghyqrZ13cKg8CyJc= - - hash2 - - hnEdCzTS3FmYma4LK3TaY2BhE+DQZPTAHDPSerMlB+M= - - - Headers/glm/simd/matrix.h - - hash - - StIz2kdymrXmvYRaidEdTWyDKPk= - - hash2 - - 3JLZRN4ocLZbiVsc6+yq2324saOGpQ4byfndEAovhlE= - - - Headers/glm/simd/packing.h - - hash - - qUPv99nQlr0Er9KaVAuf34m7MJs= - - hash2 - - C3JEXVYoTWs1g8fVvqG7m87ny8IcYT9mHwPfVs31SKA= - - - Headers/glm/simd/platform.h - - hash - - WjtIzCx/SUt3uaAQNSPbCD+Ym4w= - - hash2 - - kPxUL+7xGU98yjixxONMbc1881Hrlwoz8iucvkNbXZE= - - - Headers/glm/simd/simd_common.h - - hash - - BxoF5Xb/NroKyHIl1Z3+m8IGwMg= - - hash2 - - 3gxSUS7Y/UKosIFEIljcocZ0VLw3Fw4osonniPcmeDQ= - - - Headers/glm/simd/trigonometric.h - - hash - - kiz0CT2hfqdycbkdAJxEqOE5QVs= - - hash2 - - DIlURpIdDgijAoyPMMQW2fgCwXj6YQ03c1dzrTAwWXQ= - - - Headers/glm/simd/vector_relational.h - - hash - - 2k6Ue2ZX+qRJedZ9u3Eul7uXh4M= - - hash2 - - j25ystNtNFJyFS/JVYCGWVOxt41uxtVKFMg2mMjn7jw= - - - Headers/glm/trigonometric.hpp - - hash - - H1eg8NlU5vJJgAXf8pUeV88wxzs= - - hash2 - - CQfQca57BZ4T/LFZT4Q7jYwX9ADsdneyxDuegbrat3Q= - - - Headers/glm/vec2.hpp - - hash - - Ipt5byZRjgjjs9OI/4fjEAoeR/E= - - hash2 - - 9PFxVFGr1gsqSs5dTNY3lVY6sxNVJHQIOiuo7B01olY= - - - Headers/glm/vec3.hpp - - hash - - UV0kbsFCQEN3ghGdifqEvwyZDsg= - - hash2 - - wOV0JaApm66YQqJ/qsyvvtmqo3+YqCbiLLEEPNfYaxI= - - - Headers/glm/vec4.hpp - - hash - - GNvK9a9nBLg0IXXSJXL+0M5sdWo= - - hash2 - - bku7NjeacDi6AR78OfVxgxi1mCPq86GceJGIjICzxM4= - - - Headers/glm/vector_relational.hpp - - hash - - rXzVsX60oVfg+Br04yQrBydDS5g= - - hash2 - - qyXzbD4KZkK6SZzmLVPLTAFmXlKSx1JKMpjQPvhzXpM= - - - Headers/optional.hpp - - hash - - UQWAPvqO3lZMCgspf0O5G68sNpA= - - hash2 - - Q1IjFQa2psEuQ4P7Y8y15aGPxqlPLdGaCxG4MJnv13g= - - - Headers/tiny_obj_loader.h - - hash - - fNagYI/VfcsFrtF3VvrdAnK6r8M= - - hash2 - - 0naOrDDGs1Y+O3uf2ny6zLtBUy5AtCTiub5WTVpyyFc= - - - MaterialRobotoFontLoader.bundle/Roboto-Black.ttf - - hash - - Vw7l8OeQVxE+rRXdeJYaZIu/zmA= - - hash2 - - GCkxB9GK4eQVUM0u87QUjVwql7iuz1e6SH9A9XosDw0= - - - MaterialRobotoFontLoader.bundle/Roboto-BlackItalic.ttf - - hash - - 7On5eW3hrxZSJdQY9rwWcK72O5Q= - - hash2 - - nt6jGLWVtuY+z5hl+I65Hy33DDbzkxCdnPBhw1FPYTU= - - - MaterialRobotoFontLoader.bundle/Roboto-Bold.ttf - - hash - - yZXHuAgmdHB5GqY3C1OT7pQiyAc= - - hash2 - - KJz2AtUaWzNJIcMlAniYuPJR/c+nk1Lbox4+Og+0des= - - - MaterialRobotoFontLoader.bundle/Roboto-BoldItalic.ttf - - hash - - k8ksE8oYji45zrOHJQP07TKLwFc= - - hash2 - - 2d8MO4yQDdxyDkDUhT4uh9j4sfPxbL6sNBOOR+eabCc= - - - MaterialRobotoFontLoader.bundle/Roboto-Italic.ttf - - hash - - bzcO65GKbBzbsKLqlYHQTyLC4S4= - - hash2 - - AitqAtF7JzkNJrUMxnEJBrZIurNf6aAAak17r1TaTJs= - - - MaterialRobotoFontLoader.bundle/Roboto-Light.ttf - - hash - - BhTqgM8ZTLlU0h4B+IOj6DThkxw= - - hash2 - - lyJXcrNgbL2B22s6qAn+evcgJp6caQQ6eLtIfH3ID58= - - - MaterialRobotoFontLoader.bundle/Roboto-LightItalic.ttf - - hash - - azDRmFM0CX3gumYS//3v1IizCII= - - hash2 - - BRcSdqe2pFp4kUSkUkoF8ZsKHQEQcydWiBIZPUgNTQw= - - - MaterialRobotoFontLoader.bundle/Roboto-Medium.ttf - - hash - - QjpSo27gUwDU3v1xfJNuEgt1WXU= - - hash2 - - Semt8or0YYSu6n7WxSWauW8PgCutGGTizFCdP+Jb0DI= - - - MaterialRobotoFontLoader.bundle/Roboto-MediumItalic.ttf - - hash - - 1FzjnQH4t5tfrBgLc0OG7phQdRk= - - hash2 - - CI/XYvRgECHz3CBfnK6OkjYdIlJnSxEi7cAiZdWhrUs= - - - MaterialRobotoFontLoader.bundle/Roboto-Regular.ttf - - hash - - Oxqvi5Nc1fJpg1LmIClU5RE3ass= - - hash2 - - xpnh/OQbirQTsFIJIn4YfeE+UBjiblSQL2KCcBwpiZw= - - - MaterialRobotoFontLoader.bundle/Roboto-Thin.ttf - - hash - - ev71aAmVntm3s56QGam2e9M0NYE= - - hash2 - - dQKeaVrXayqUZqFRy+qirCP3FAGYeXBnxeQobVN2nvA= - - - MaterialRobotoFontLoader.bundle/Roboto-ThinItalic.ttf - - hash - - fQgVc2LvXWArp3JRlKRBnK7v0fw= - - hash2 - - 6ZmVviLhpV17VTJoFwZduJ0xXHO+vwDMDOOSTthqSfE= - - - Modules/module.modulemap - - hash - - AmzopnVptSbPjzszrX2UEkL+YhI= - - hash2 - - nOyhpldSW7+nqKHqws00g3g/rmSxfzyE3z7AiIQu8lQ= - - - VROPolygon.h - - hash - - IiYpOSNZ7aF0g23Gs0hdTxLluxE= - - hash2 - - aqYoRvudkfn5EyoBxwIVM3Ftucb/cCHCe9LIaYfBv0M= - - - blank.png - - hash - - 2zF/fVHZCklks1GlonZyXK2nLXA= - - hash2 - - fxOIppnyBCWvBQwG4uAZAh8C30evVaNQcjETwN2nU4s= - - - bodymesh.mlmodelc/coremldata.bin - - hash - - oytokLT4r34jW/RAIq6K3pj9c2U= - - hash2 - - UDVceXP8OeUavfcfhkdH+27bh2Qdzjvn/hnpJbI6SyY= - - - bodymesh.mlmodelc/model.espresso.net - - hash - - zM/c62cw/OmQTuyCaB8K1KuBGww= - - hash2 - - 54pudxGzEXCPE+YU+7RfYVYStXrtf0o//tTFI1VFtj4= - - - bodymesh.mlmodelc/model.espresso.shape - - hash - - j6C6opwcKRzHMK3v535681Zrp7k= - - hash2 - - ubcohU6+SVi7WIAv/bLVrCOUqByqOyA0r3ZPSL0xFt0= - - - bodymesh.mlmodelc/model.espresso.weights - - hash - - Hv7jkWAoboCxJgtHOe/g4Uio7XA= - - hash2 - - SjAQE8dDZE/H/hx9i2McGycfbMn8Ff7zINR7HA4Egpk= - - - bodymesh.mlmodelc/model/coremldata.bin - - hash - - t2QsrTKfM0V7EitGUAjV6Fhw99E= - - hash2 - - deRsq4xUvSnr0EbILO5KWA/FBaIYJbDFNi51h6yhjLM= - - - bodymesh.mlmodelc/neural_network_optionals/coremldata.bin - - hash - - 3oqEe/+MND1puFOiFebud17y75Y= - - hash2 - - Zmh6rfhivXdsj8GLjp+OIAiXFIVu4jOzkCpZHQ1fKSU= - - - brdf_fsh.glsl - - hash - - 1J2Heg4cN8tVBhdSAfNCYmeAgB8= - - hash2 - - w/gPy5zhnkns2rOfGambrDcAErZgggi1IHTFNq8j02o= - - - brdf_vsh.glsl - - hash - - 9wjQqdI4Pd0M9Q9C/orS49x22Yk= - - hash2 - - y+PGMJDPm90RSZRKixSfAgQnaYxJ6sUwLaBNNcMRx1o= - - - constant_fsh.glsl - - hash - - IYOObRJJrAMb1t40JaHVn488GBc= - - hash2 - - FKFROucvW7LkZDj4Hts/AKrvC17tKbjIiuh8ULo1W+w= - - - constant_fsh_adreno.glsl - - hash - - M2SAm1EYv7iCbH2gqhqMDIsUTAw= - - hash2 - - PPqJTL76Bo3LQI41MAbrarqO9CG11aYgEUv5vV+cRfU= - - - constant_functions_fsh.glsl - - hash - - uyo/s+xZ5T5LN+wNQLTzAL9HuHs= - - hash2 - - WldJGS6nLy/fuM//hpOXOaBMMcq43Pp9eBXJoEv+Yh4= - - - constant_functions_fsh_adreno.glsl - - hash - - avXrPSjSjDIK5hzwdnvM2II7kKA= - - hash2 - - Bo4itINWr3xxLvlnECsLkqiEnLi7ECDr/vtPxmef3SY= - - - constant_q_fsh.glsl - - hash - - yDSyPYWuz11IWGshsx2VSnVucRc= - - hash2 - - h7ukWOBnKbvE5WrW0Air66Qi1Ikbz3Er32fdSLMzghk= - - - constant_q_fsh_adreno.glsl - - hash - - 6ii+kdfSMTfDI6Re4kPJWLs13rk= - - hash2 - - RWeelFQDVr1obzCcb1PCX8ocbiKgQCoipsjfrsDP+HE= - - - equirect_to_cube_fsh.glsl - - hash - - Cvg9P003xAGMA9KQNbMykn4rKt4= - - hash2 - - bhcpM0H9DFkZdYcw2/um3RoGkNQG5DnA1aMtBwaV25c= - - - equirect_to_cube_vsh.glsl - - hash - - uUK/NMEWuPt7ztgL/ob6JUrs+cE= - - hash2 - - QPVp3yWhe61M9p2NNLm90HH8CM9ozX5KkO2gAez49J8= - - - hourglass_2_1.mlmodelc/coremldata.bin - - hash - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hash2 - - 4S9SmPDeIMg0k1DKQqiHP2gomYXuJ2rReTVoeZ+bVZA= - - - hourglass_2_1.mlmodelc/model.espresso.net - - hash - - kCkGi+fKYgL5r2wPoG+DBzFO0V8= - - hash2 - - QxMrogAi75Lsj4cGtcYNcazIjGLr12t3nzZfoZFcqRo= - - - hourglass_2_1.mlmodelc/model.espresso.shape - - hash - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hash2 - - NIIW4dPbFHwKfqh+pJJP/xmYZeTswNciIsWHMyD9p2g= - - - hourglass_2_1.mlmodelc/model.espresso.weights - - hash - - FB5LJOTuHRKV+OPsWnw1ya9X084= - - hash2 - - H7I1Xo2+3NzKzNS248nfp9NOcnIEBSxmo3sOumlu48M= - - - hourglass_2_1.mlmodelc/model/coremldata.bin - - hash - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hash2 - - I3+XKiFmj2mG7oNk4HZjCVwNU0sVrC1QrC2BpH90mzE= - - - hourglass_2_1.mlmodelc/neural_network_optionals/coremldata.bin - - hash - - 3oqEe/+MND1puFOiFebud17y75Y= - - hash2 - - Zmh6rfhivXdsj8GLjp+OIAiXFIVu4jOzkCpZHQ1fKSU= - - - hourglass_2_1_ds_t.mlmodelc/coremldata.bin - - hash - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hash2 - - 4S9SmPDeIMg0k1DKQqiHP2gomYXuJ2rReTVoeZ+bVZA= - - - hourglass_2_1_ds_t.mlmodelc/model.espresso.net - - hash - - SHQ/R5zexqpBWljkqcadlcmCB90= - - hash2 - - ojTfRVeFxjhG/7ABj/FcttlmqFvQzht3aKrfWVCbYNg= - - - hourglass_2_1_ds_t.mlmodelc/model.espresso.shape - - hash - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hash2 - - NIIW4dPbFHwKfqh+pJJP/xmYZeTswNciIsWHMyD9p2g= - - - hourglass_2_1_ds_t.mlmodelc/model.espresso.weights - - hash - - 5iWq87elaYdhd3S/olb+UMhPlK0= - - hash2 - - +d1WaIvIhh3wHuK/ccj7UDK1pne+m0zM0GApi6cD9lc= - - - hourglass_2_1_ds_t.mlmodelc/model/coremldata.bin - - hash - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hash2 - - I3+XKiFmj2mG7oNk4HZjCVwNU0sVrC1QrC2BpH90mzE= - - - hourglass_2_1_ds_t.mlmodelc/neural_network_optionals/coremldata.bin - - hash - - 3oqEe/+MND1puFOiFebud17y75Y= - - hash2 - - Zmh6rfhivXdsj8GLjp+OIAiXFIVu4jOzkCpZHQ1fKSU= - - - hourglass_2_1_t.mlmodelc/coremldata.bin - - hash - - Gnqa5ekQwEL7ccHgsHB/0gyxLfI= - - hash2 - - 4S9SmPDeIMg0k1DKQqiHP2gomYXuJ2rReTVoeZ+bVZA= - - - hourglass_2_1_t.mlmodelc/model.espresso.net - - hash - - kCkGi+fKYgL5r2wPoG+DBzFO0V8= - - hash2 - - QxMrogAi75Lsj4cGtcYNcazIjGLr12t3nzZfoZFcqRo= - - - hourglass_2_1_t.mlmodelc/model.espresso.shape - - hash - - zJD3EBtViwKicwvqcgfgHzwiP0U= - - hash2 - - NIIW4dPbFHwKfqh+pJJP/xmYZeTswNciIsWHMyD9p2g= - - - hourglass_2_1_t.mlmodelc/model.espresso.weights - - hash - - 2/4MrDfiURpvbO8c7jK/WoRSeIg= - - hash2 - - KMOZfjSJZHcH182wm551CFKOA7BkEAQ3/79V7A72fiA= - - - hourglass_2_1_t.mlmodelc/model/coremldata.bin - - hash - - 0VZuivhZ/VyqpIkCLWUvN8BW9TY= - - hash2 - - I3+XKiFmj2mG7oNk4HZjCVwNU0sVrC1QrC2BpH90mzE= - - - hourglass_2_1_t.mlmodelc/neural_network_optionals/coremldata.bin - - hash - - 3oqEe/+MND1puFOiFebud17y75Y= - - hash2 - - Zmh6rfhivXdsj8GLjp+OIAiXFIVu4jOzkCpZHQ1fKSU= - - - image_fsh.glsl - - hash - - fxjVZE+CEkKBoz0hxIu9Mu2EYpU= - - hash2 - - yGxD7Pr9j7KHHWc5w8cC3Aqx3p/tc+FumzU3k8MgTaY= - - - image_vsh.glsl - - hash - - tT5mTlpg0WsXqBXmKLwdVF2De+4= - - hash2 - - VfgoZIn3yIl2Bb5UUDribNDqBofbUExdthWyB5+1J5o= - - - irradiance_convolution_fsh.glsl - - hash - - ceHkEHQadzQPAy+4kjbiXwN4d9s= - - hash2 - - 7AcpDOT8qQ17KWpiLf0+c6WTCjSFKce9zbe+XXbooq8= - - - irradiance_convolution_vsh.glsl - - hash - - uUK/NMEWuPt7ztgL/ob6JUrs+cE= - - hash2 - - QPVp3yWhe61M9p2NNLm90HH8CM9ozX5KkO2gAez49J8= - - - lighting_general_functions_fsh.glsl - - hash - - TDdj7gFYX496o9Wai/r17qhysBQ= - - hash2 - - oOvJhrEhq6lYFxAFyURorbp0Da1DdSGhspHqhWZsIlQ= - - - particles_fsh.glsl - - hash - - OHDxWWALxYa5XDl0lLEIhWEw3tA= - - hash2 - - qpIvfsAFSneG/DP7DtZsWYmLso7bzecc80Acru52eTA= - - - particles_vsh.glsl - - hash - - rbjf8l9np5ESrK1m5eysjr9N+uQ= - - hash2 - - 0UjhOhRKZQymmKGTFXa9ZzZsfSXXtpc35OrX3xyZT50= - - - pbr_fsh.glsl - - hash - - znDgKelsHVvLZvafFw/PZNNuMNc= - - hash2 - - CrJLO2jXU1KGFMoWesbohAGqUNJwPpKJkoYK3e3WXnk= - - - point_cloud.png - - hash - - 6iIOU0KZ2qaHAu8SQg/0TLwU5EM= - - hash2 - - vJdkXgpKPTuY63wJaWg6qz+M3ud7xmzoTYUD5WxIVKY= - - - prefilter_convolution_fsh.glsl - - hash - - Sn+PPelr34qFl5Yiqptt7VKqU8g= - - hash2 - - SUmssZ1AdBBvBVK9JB/XH0AECiHgMd09ocNeOI9F6AU= - - - prefilter_convolution_vsh.glsl - - hash - - YFwuSIyfBD6M2hSC9vorUcK11n0= - - hash2 - - FxSxExRR7+N+XyYssCj5pD7Eyg9OqQv1uFhtBAUMltU= - - - skinning_vsh.glsl - - hash - - 72fqVn0SmznCFaZxoYckZRT/51o= - - hash2 - - F1w/ByViSrlHEQeLngtGuSEg07FUOzO6ljwks9k3Fe0= - - - standard_fsh.glsl - - hash - - TE1HilHHlqCZleB5PHgSKyVqzco= - - hash2 - - D4hTsa2fKQH20Pu+TEhUyRACQczLVkQ32hZmRsjs2JI= - - - standard_vsh.glsl - - hash - - M6tybziH02FVjCYOHQZ0e7H2rus= - - hash2 - - 161ebfxooE1zoCMg0U4j67PtLWPc1qOcq9999LMHUYY= - - - standard_vsh_adreno.glsl - - hash - - 9FMcwbqVdK5UId/Hskcymu+WIMs= - - hash2 - - 7KMAbQd+2VDet4n7JFo46lzS9NIkg1EBIRiUevv/9dY= - - - surface_functions_fsh.glsl - - hash - - Je7gHqHn/0tVrmXguggoc3Oktwk= - - hash2 - - CyIWt7YdwBlTgy/0nR9CLySWrAMd6UoRzJH12IL1fI8= - - - surface_functions_fsh_adreno.glsl - - hash - - m+kPcsWxwRa4BvQW0TanlyHk8Fw= - - hash2 - - CIMPo2qij7BBiyxWYsVN2b83aSgx+vUldJ9L/m0KsQw= - - - test_uv.npy - - hash - - 69+126uupsE3aXLNqG/UtBOc5vQ= - - hash2 - - i9BjMGiUhmMqkb5dCODJ3o6Xk2Yb6dH8pN8V4jVOknI= - - - vbml_m_face_to_v.npy - - hash - - Pad3Y69rhm3DYLfRW/zN29sc8mg= - - hash2 - - 90ckr7fyMR6UfEvHU4Mwf0frmw0Lm81k5qamPRuu64c= - - - vbml_m_texcoords.npy - - hash - - W07o/SJZRbOgKuP/y7XS0sDmPoI= - - hash2 - - nSqv0R1mqr333JYITRFB44ot6Hg5PNPYfcEEeDMSp9s= - - - vbml_m_uv_mask.npy - - hash - - jR3UkUOz7+r4V6ersm23RxLfLCc= - - hash2 - - Z7eWmBwMe4wCYJpFmbwYNoIyLcuMVJDU/tx8LcEKomk= - - - vbml_m_v_to_vt.npy - - hash - - Lp5/DxzSwpYVJx9G3kZD+mDi1Xk= - - hash2 - - 3w0MMnDm+hIXE0VuMbJahNdBD9ffUTa7gVGd9mUiQWk= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh.glsl b/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh.glsl index 8922674c..0eb63f26 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh.glsl @@ -14,6 +14,7 @@ flat in int v_instance_id; in lowp mat3 v_tbn; in highp vec2 v_texcoord; in highp vec3 v_surface_position; +#pragma varying_in_declarations layout (location = 0) out highp vec4 frag_color; @@ -30,7 +31,6 @@ void main() { highp vec4 _output_color = vec4(_surface.diffuse_color.xyz * _surface.diffuse_intensity, _surface.alpha * _surface.diffuse_color.a); - // Alpha masking: discard fragments below the cutoff threshold if (material_alpha_cutoff > 0.0 && _output_color.a < material_alpha_cutoff) { discard; } diff --git a/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh_adreno.glsl b/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh_adreno.glsl index 6cde539f..a812656a 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh_adreno.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/constant_fsh_adreno.glsl @@ -13,6 +13,7 @@ flat in int v_instance_id; in lowp mat3 v_tbn; in highp vec2 v_texcoord; in highp vec3 v_surface_position; +#pragma varying_in_declarations layout (location = 0) out highp vec4 frag_color; diff --git a/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh.glsl b/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh.glsl index afeb5e86..acf81f9f 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh.glsl @@ -14,6 +14,7 @@ uniform samplerCube diffuse_texture; in lowp mat3 v_tbn; in highp vec2 v_texcoord; in highp vec3 v_surface_position; +#pragma varying_in_declarations layout (location = 0) out highp vec4 frag_color; diff --git a/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh_adreno.glsl b/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh_adreno.glsl index a07019ef..4363c237 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh_adreno.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/constant_q_fsh_adreno.glsl @@ -14,6 +14,7 @@ uniform samplerCube diffuse_texture; in lowp mat3 v_tbn; in highp vec2 v_texcoord; in highp vec3 v_surface_position; +#pragma varying_in_declarations layout (location = 0) out highp vec4 frag_color; diff --git a/ios/dist/ViroRenderer/ViroKit.framework/standard_fsh.glsl b/ios/dist/ViroRenderer/ViroKit.framework/standard_fsh.glsl index d31dc673..ae27c0de 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/standard_fsh.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/standard_fsh.glsl @@ -6,13 +6,13 @@ uniform highp vec3 camera_position; uniform highp vec4 material_diffuse_surface_color; uniform highp float material_diffuse_intensity; uniform lowp float material_alpha; -uniform lowp float material_alpha_cutoff; uniform lowp float material_shininess; uniform highp float material_roughness; uniform highp float material_roughness_intensity; uniform highp float material_metalness; uniform highp float material_metalness_intensity; uniform highp float material_ao; +uniform lowp float material_alpha_cutoff; uniform highp vec3 material_emissive_color; #pragma surface_modifier_uniforms @@ -22,6 +22,7 @@ uniform highp vec3 material_emissive_color; in lowp mat3 v_tbn; in highp vec2 v_texcoord; in highp vec3 v_surface_position; +#pragma varying_in_declarations layout (location = 0) out highp vec4 frag_color; @@ -69,7 +70,6 @@ void main() { material_emissive_color, _surface.alpha * _surface.diffuse_color.a); - // Alpha masking: discard fragments below the cutoff threshold if (material_alpha_cutoff > 0.0 && _output_color.a < material_alpha_cutoff) { discard; } diff --git a/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh.glsl b/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh.glsl index 22eeda64..8f272c69 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh.glsl @@ -54,6 +54,7 @@ out mat3 v_tbn; out vec2 v_texcoord; out vec3 v_surface_position; flat out int v_instance_id; +#pragma varying_out_declarations void main() { #inject vertex_assignments diff --git a/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh_adreno.glsl b/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh_adreno.glsl index 9f67cfbf..97beb0ca 100644 --- a/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh_adreno.glsl +++ b/ios/dist/ViroRenderer/ViroKit.framework/standard_vsh_adreno.glsl @@ -47,6 +47,7 @@ out mat3 v_tbn; out vec2 v_texcoord; out vec3 v_surface_position; flat out int v_instance_id; +#pragma varying_out_declarations void main() { _geometry_position = position; diff --git a/ios/dist/armv7_arm64/libViroReact.a b/ios/dist/armv7_arm64/libViroReact.a deleted file mode 100644 index 5f34409b..00000000 Binary files a/ios/dist/armv7_arm64/libViroReact.a and /dev/null differ diff --git a/ios/dist/include/VRTARSceneNavigator.h b/ios/dist/include/VRTARSceneNavigator.h index 18846081..5676975b 100644 --- a/ios/dist/include/VRTARSceneNavigator.h +++ b/ios/dist/include/VRTARSceneNavigator.h @@ -48,6 +48,7 @@ @property (nonatomic, readwrite) BOOL shadowsEnabled; @property (nonatomic, readwrite) BOOL multisamplingEnabled; @property (nonatomic, copy) NSString *occlusionMode; +@property (nonatomic, assign) BOOL depthEnabled; @property (nonatomic, assign) BOOL depthDebugEnabled; @property (nonatomic, copy) NSString *cloudAnchorProvider; @property (nonatomic, copy) NSString *geospatialAnchorProvider; @@ -150,6 +151,81 @@ typedef void (^GeospatialAnchorCompletionHandler)(BOOL success, - (void)removeGeospatialAnchor:(NSString *)anchorId; +// ReactVision-specific: save GPS anchor to backend (returns platform UUID), no local AR anchor +- (void)hostGeospatialAnchor:(double)latitude + longitude:(double)longitude + altitude:(double)altitude + altitudeMode:(NSString *)altitudeMode + completionHandler:(void (^)(BOOL success, NSString * _Nullable platformUuid, NSString * _Nullable error))completionHandler; + +// ReactVision-specific: fetch GPS coords from backend by UUID + create local AR anchor +- (void)resolveGeospatialAnchor:(NSString *)platformUuid + quaternion:(id)quaternion + completionHandler:(GeospatialAnchorCompletionHandler)completionHandler; + +// ReactVision Geospatial CRUD +- (void)rvGetGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvFindNearbyGeospatialAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvUpdateGeospatialAnchor:(NSString *)anchorId + sceneAssetId:(NSString *)sceneAssetId + sceneId:(NSString *)sceneId + name:(NSString *)name + userAssetId:(NSString *)userAssetId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvUploadAsset:(NSString *)filePath + assetType:(NSString *)assetType + fileName:(NSString *)fileName + appUserId:(NSString *)appUserId + completionHandler:(void (^)(BOOL success, NSString *userAssetId, NSString *fileUrl, NSString *error))completionHandler; +- (void)rvDeleteGeospatialAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvListGeospatialAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; + +// Cloud anchor management +- (void)rvGetCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvListCloudAnchors:(int)limit + offset:(int)offset + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvUpdateCloudAnchor:(NSString *)anchorId + name:(NSString *)name + description:(NSString *)description + isPublic:(BOOL)isPublic + completionHandler:(void (^)(BOOL success, NSDictionary *anchorData, NSString *error))completionHandler; +- (void)rvDeleteCloudAnchor:(NSString *)anchorId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvFindNearbyCloudAnchors:(double)latitude + longitude:(double)longitude + radius:(double)radius + limit:(int)limit + completionHandler:(void (^)(BOOL success, NSArray *anchors, NSString *error))completionHandler; +- (void)rvAttachAssetToCloudAnchor:(NSString *)anchorId + fileUrl:(NSString *)fileUrl + fileSize:(int64_t)fileSize + name:(NSString *)name + assetType:(NSString *)assetType + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvRemoveAssetFromCloudAnchor:(NSString *)anchorId + assetId:(NSString *)assetId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; +- (void)rvTrackCloudAnchorResolution:(NSString *)anchorId + success:(BOOL)success + confidence:(double)confidence + matchCount:(int)matchCount + inlierCount:(int)inlierCount + processingTimeMs:(int)processingTimeMs + platform:(NSString *)platform + externalUserId:(NSString *)externalUserId + completionHandler:(void (^)(BOOL success, NSString *error))completionHandler; + #pragma mark - Scene Semantics API Methods // Check if Scene Semantics mode is supported on this device diff --git a/ios/dist/lib/libViroReact.a b/ios/dist/lib/libViroReact.a index 5f34409b..9fc9ba2e 100644 Binary files a/ios/dist/lib/libViroReact.a and b/ios/dist/lib/libViroReact.a differ diff --git a/package.json b/package.json index 30697900..847199b5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", - "version": "2.52.1", + "version": "2.53.0", "license": "MIT", "publishConfig": { "registry": "https://registry.npmjs.org/" diff --git a/plugins/withViro.ts b/plugins/withViro.ts index bab9729a..4feca369 100644 --- a/plugins/withViro.ts +++ b/plugins/withViro.ts @@ -11,18 +11,17 @@ const LOCATION_USAGE = "Allow $(PRODUCT_NAME) to use your location for AR experi export type XrMode = "GVR" | "AR" | "OVR_MOBILE"; /** - * Cloud Anchors provider type. - * - "none": Cloud Anchors disabled - * - "arcore": Use ARCore Cloud Anchors (works on both iOS and Android) + * Anchor provider type. + * - "none": Disabled + * - "arcore": Use ARCore Cloud Anchors / Geospatial API + * - "reactvision": Use ReactVision backend (requires libreactvisioncca) */ -export type CloudAnchorProvider = "none" | "arcore"; +export type Provider = "none" | "arcore" | "reactvision"; -/** - * Geospatial Anchor provider type. - * - "none": Geospatial API disabled - * - "arcore": Use ARCore Geospatial API (works on both iOS and Android) - */ -export type GeospatialAnchorProvider = "none" | "arcore"; +/** @deprecated Use Provider */ +export type CloudAnchorProvider = Provider; +/** @deprecated Use Provider */ +export type GeospatialAnchorProvider = Provider; /** * iOS framework linkage type. @@ -40,15 +39,15 @@ export interface ViroConfigurationOptions { * When set to "dynamic", uses dynamic frameworks which is required for ARCore SDK. * When set to "static", uses static frameworks for smaller binary size. * - * Note: If using cloudAnchorProvider or geospatialAnchorProvider with "arcore", - * this will be automatically set to "dynamic" regardless of the configured value. + * Note: If using provider: "arcore", this will be automatically set to "dynamic". * * DEFAULTS TO: undefined (uses project default, typically static) */ iosLinkage?: IosLinkage; + /** * Google Cloud API key for ARCore Cloud Anchors and Geospatial API. - * Required if using cloudAnchorProvider: "arcore" or geospatialAnchorProvider: "arcore" + * Required if using provider: "arcore". * * Get your API key from Google Cloud Console: * https://console.cloud.google.com/apis/credentials @@ -58,19 +57,42 @@ export interface ViroConfigurationOptions { googleCloudApiKey?: string; /** - * Cloud Anchors provider for cross-platform anchor sharing. - * When set to "arcore", enables ARCore Cloud Anchors on both iOS and Android. + * ReactVision API key for ReactVision Cloud Anchors and Geospatial API. + * Required if using provider: "reactvision" (the default). * - * DEFAULTS TO: "none" + * Written to AndroidManifest as com.reactvision.RVApiKey and to Info.plist as RVApiKey. */ - cloudAnchorProvider?: CloudAnchorProvider; + rvApiKey?: string; + + /** + * ReactVision Project ID for ReactVision Cloud Anchors and Geospatial API. + * Required if using provider: "reactvision" (the default). + * + * Written to AndroidManifest as com.reactvision.RVProjectId and to Info.plist as RVProjectId. + */ + rvProjectId?: string; /** - * Geospatial Anchor provider for location-based AR. - * When set to "arcore", enables ARCore Geospatial API on both iOS and Android. - * Requires googleCloudApiKey to be set. + * Anchor provider for both cloud anchors and geospatial anchors. + * Replaces the deprecated cloudAnchorProvider + geospatialAnchorProvider props. * - * DEFAULTS TO: "none" + * - "reactvision": Use ReactVision backend (requires rvApiKey + rvProjectId) + * - "arcore": Use ARCore Cloud Anchors / Geospatial API (requires googleCloudApiKey) + * - "none": Disable both + * + * DEFAULTS TO: "reactvision" + */ + provider?: Provider; + + /** + * @deprecated Use provider instead. + * Cloud Anchors provider. Overrides provider for cloud anchors only if set. + */ + cloudAnchorProvider?: CloudAnchorProvider; + + /** + * @deprecated Use provider instead. + * Geospatial Anchor provider. Overrides provider for geospatial only if set. */ geospatialAnchorProvider?: GeospatialAnchorProvider; @@ -108,12 +130,12 @@ export interface ViroConfigurationOptions { /** * Whether to include ARCore SDK pods. * When true, adds ARCore/CloudAnchors, ARCore/Geospatial, and ARCore/Semantics pods. - * This is automatically set to true when using cloudAnchorProvider or geospatialAnchorProvider with "arcore". + * This is automatically set to true when using provider: "arcore". * * ViroKit is built with weak linking, so ARCore pods are optional. * Without ARCore pods, cloud anchors, geospatial, and semantics features will be disabled at runtime. * - * DEFAULTS TO: false (unless cloudAnchorProvider or geospatialAnchorProvider is "arcore") + * DEFAULTS TO: false (unless provider is "arcore") */ includeARCore?: boolean; }; diff --git a/plugins/withViroAndroid.ts b/plugins/withViroAndroid.ts index f53f6cd1..20c51dc3 100644 --- a/plugins/withViroAndroid.ts +++ b/plugins/withViroAndroid.ts @@ -261,6 +261,15 @@ const withViroManifest = (config: ExpoConfig) => if (Array.isArray(viroPlugin) && viroPlugin.length > 1) { const pluginOptions = viroPlugin[1] as ViroConfigurationOptions; + + // Resolve unified provider prop; old geospatialAnchorProvider overrides for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent) but provider + // is not explicitly set — avoids injecting location permissions for apps with no credentials. + const legacyOpts = pluginOptions as { geospatialAnchorProvider?: string }; + const geospatialAnchorProvider = legacyOpts.geospatialAnchorProvider + ?? pluginOptions.provider + ?? (pluginOptions.rvApiKey ? "reactvision" : undefined); + if (pluginOptions.googleCloudApiKey) { contents?.manifest?.application?.[0]["meta-data"]?.push({ $: { @@ -269,6 +278,38 @@ const withViroManifest = (config: ExpoConfig) => }, }); } + if (pluginOptions.rvApiKey) { + contents?.manifest?.application?.[0]["meta-data"]?.push({ + $: { + "android:name": "com.reactvision.RVApiKey", + "android:value": pluginOptions.rvApiKey, + }, + }); + } + if (pluginOptions.rvProjectId) { + contents?.manifest?.application?.[0]["meta-data"]?.push({ + $: { + "android:name": "com.reactvision.RVProjectId", + "android:value": pluginOptions.rvProjectId, + }, + }); + } + + // Add location permissions when geospatial provider is active + if (geospatialAnchorProvider === "arcore" || geospatialAnchorProvider === "reactvision") { + const existingPermissions: string[] = (contents.manifest["uses-permission"] || []) + .map((p: any) => p.$?.["android:name"]); + if (!existingPermissions.includes("android.permission.ACCESS_FINE_LOCATION")) { + contents.manifest["uses-permission"].push({ + $: { "android:name": "android.permission.ACCESS_FINE_LOCATION" }, + }); + } + if (!existingPermissions.includes("android.permission.ACCESS_COARSE_LOCATION")) { + contents.manifest["uses-permission"].push({ + $: { "android:name": "android.permission.ACCESS_COARSE_LOCATION" }, + }); + } + } } if ( diff --git a/plugins/withViroIos.ts b/plugins/withViroIos.ts index f391b8b9..630b1a51 100644 --- a/plugins/withViroIos.ts +++ b/plugins/withViroIos.ts @@ -30,8 +30,12 @@ const withViroPods = (config: ExpoConfig) => { ); if (Array.isArray(pluginConfig) && pluginConfig.length > 1) { const options = pluginConfig[1] as ViroConfigurationOptions; - cloudAnchorProvider = options.cloudAnchorProvider; - geospatialAnchorProvider = options.geospatialAnchorProvider; + // Resolve unified provider prop; old props override for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent). + const defaultProvider = options.rvApiKey ? "reactvision" : undefined; + const legacyOpts = options as { cloudAnchorProvider?: string; geospatialAnchorProvider?: string }; + cloudAnchorProvider = legacyOpts.cloudAnchorProvider ?? options.provider ?? defaultProvider; + geospatialAnchorProvider = legacyOpts.geospatialAnchorProvider ?? options.provider ?? defaultProvider; iosLinkage = options.iosLinkage; includeARCore = options.ios?.includeARCore; } @@ -214,6 +218,8 @@ export const withDefaultInfoPlist: ConfigPlugin = ( let microphoneUsagePermission = DEFAULTS.ios.microphoneUsagePermission; let locationUsagePermission = DEFAULTS.ios.locationUsagePermission; let googleCloudApiKey: string | undefined; + let rvApiKey: string | undefined; + let rvProjectId: string | undefined; let cloudAnchorProvider: string | undefined; let geospatialAnchorProvider: string | undefined; let includeARCore: boolean | undefined; @@ -235,8 +241,14 @@ export const withDefaultInfoPlist: ConfigPlugin = ( locationUsagePermission = pluginOptions.ios?.locationUsagePermission || locationUsagePermission; googleCloudApiKey = pluginOptions.googleCloudApiKey; - cloudAnchorProvider = pluginOptions.cloudAnchorProvider; - geospatialAnchorProvider = pluginOptions.geospatialAnchorProvider; + rvApiKey = pluginOptions.rvApiKey; + rvProjectId = pluginOptions.rvProjectId; + // Resolve unified provider prop; old props override for backward compat. + // Default to "reactvision" only when rvApiKey is present (implies RV intent). + const defaultProvider2 = pluginOptions.rvApiKey ? "reactvision" : undefined; + const legacyOpts2 = pluginOptions as { cloudAnchorProvider?: string; geospatialAnchorProvider?: string }; + cloudAnchorProvider = legacyOpts2.cloudAnchorProvider ?? pluginOptions.provider ?? defaultProvider2; + geospatialAnchorProvider = legacyOpts2.geospatialAnchorProvider ?? pluginOptions.provider ?? defaultProvider2; includeARCore = pluginOptions.ios?.includeARCore; } } @@ -259,8 +271,16 @@ export const withDefaultInfoPlist: ConfigPlugin = ( config.ios.infoPlist.GARAPIKey = googleCloudApiKey; } + // Add ReactVision credentials for ReactVision Cloud Anchors and Geospatial API (iOS) + if (rvApiKey) { + config.ios.infoPlist.RVApiKey = rvApiKey; + } + if (rvProjectId) { + config.ios.infoPlist.RVProjectId = rvProjectId; + } + // Add location permissions for Geospatial API - if (geospatialAnchorProvider === "arcore" || includeARCore === true) { + if (geospatialAnchorProvider === "arcore" || geospatialAnchorProvider === "reactvision" || includeARCore === true) { config.ios.infoPlist.NSLocationWhenInUseUsageDescription = config.ios.infoPlist.NSLocationWhenInUseUsageDescription || locationUsagePermission; config.ios.infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription =