┌──────────────────────────────────────────────┐ │UIController │ ├──────────────────────────────────────────────┤ │+ Load(from: string) // "SfM" or "splat file"│ │+ Update() │ │+ Start() │ │+ Stop() │ │+ Edit() │ └──────────────────────────────────────────────┘ | | ┌───────────────────┐ │GaussianSplatPlugin│ ├───────────────────┤ │+ Load() │ │+ OnUpdate() │ │+ Cleanup() │ └───────────────────┘ ┌──────────────────┐ │OpenGLRenderer │ ┌───────────────┐ ├──────────────────┤ ┌─────────────────────────────────┐ │SplatLoader │ │+ InitBuffers() │ │gz::rendering::RenderEnginePlugin│ ├───────────────┤ │+ UploadToGPU() │ ├─────────────────────────────────┤ │+ LoadSfMData()│ │+ RenderSplats() │ └─────────────────────────────────┘ │+ LoadFile() │ │+ FrustumCulling()│ └───────────────┘ │+ LODAdjustment() │ | └──────────────────┘ | ┌───────────────────┐ ┌───────────────────────┐ │SfMProcessor │ │SimulationController │ ├───────────────────┤ ├───────────────────────┤ │+ Extract3DPoints()│ │+ IsSimulationRunning()│ │+ OptimizeSplats() │ │+ UpdateSimulation() │ │+ SaveSplatFile() │ └───────────────────────┘ └───────────────────┘