# Portal A VR immersive media viewer. Wrap a 3D tunnel with a sphere of video tiles around you — float inside a psychedelic portalscape. ## Tech Stack - **Engine**: Godot 4.6 (Forward Plus / Mobile renderer) - **Language**: GDScript - **XR**: OpenXR (hand tracking, controllers, haptics) - **Physics**: Jolt Physics - **Video format**: Ogg (`.ogv`) - **Audio format**: MP3 (`.mp3`) - **Platforms**: Windows (D3D12), Linux, Android / Meta Quest ## Opening in Godot ```bash # Editor path: /home/kyle/Downloads/Apps/Godot_v4.6.1-stable_linux.x86_64 # Open the project: /path/to/godot4.6 --path /home/kyle/Documents/portal # Or just double-click `project.godot` if your file manager knows Godot. ``` Main scene: `boot.tscn` ## Converting Video Drop a video file onto `convert.sh` to transcode it to Godot-friendly Ogg format: ```bash chmod +x convert.sh ./convert.sh my_video.mp4 # Produces: my_video.mp4.ogv # The script uses ffmpeg with these flags: # -vf "scale=-1:420" → scale to 420p height, width auto # -q:v 2 → video quality (near-lossless, good for Godot) # -q:a 1 → audio quality # -g:v 50 → keyframe interval (50 frames) ``` Drop the resulting `.ogv` file into the project, reference it from `EmissionPoint` in `portal.tscn`, and rebuild your export preset. ## Content Variants Different builds play different videos. Each is controlled via an export preset in `export_presets.cfg`: | Variant | Video Pattern | |---|---| | stoner_dad_2 | `*stoner_dad_2*.ogv` | | stoner_dad_3 | `*stoner_dad_3*.ogv` | | stoner_plastic | `*stoner_plastic*.ogv` | | chubs_compilation | `*chubs*.ogv` | | 420_special | `*420_special*.ogv` | | 420_special_diet | `*420_special_diet*.ogv` | | orc_domination | `*orc*.ogv` | | furry_poppers_daddy | `*poppers*.ogv` | | furry_poppers_stable_stud | `*poppers*.ogv` | | toon_goon | `*toon*.ogv` | | furry_goon_encouragement | `*furry_goon*.ogv` | | furry_big_bad_wolf | `*wolf*.ogv` | To add a new variant, create a new export preset in Godot's Export dialog and set: - **`custom_features`**: comma-separated flags (used at runtime for conditional logic) - **`include_filter`**: glob for the video file to bundle (e.g. `my_video.ogv`) - **`export_path`**: output binary path (e.g. `bin/windows/portal_my_variant.exe`) ## Platforms - **Windows** — 3 export presets (Desktop 64-bit, D3D12, etc.) - **Linux** — 4 export presets - **Android** — 17 Meta Quest presets (APK, arm64-v8a) ## Project Structure Everything lives flat in the project root: ``` project.godot Godot project config boot.tscn Entry scene (loads portal.tscn) portal.tscn Main scene (tunnels, emission point, prompts) emission_point.tscn Video sphere manager tile.tscn Reusable tile scene game_loader.gd Boot loader script (1 line) portal.gd Main scene controller emission_point.gd Video sphere + tile layout tile.gd Individual video tile cap.gdshader Blurry sphere cap shader cloud_1.gdshader Tunnel cloud + spiral shader convert.sh Video conversion utility ```