95 lines
3.1 KiB
Markdown
95 lines
3.1 KiB
Markdown
# 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
|
|
```
|