New Addon: Video Playback for All Polyphase Systems
Video playback is finally here for Polyphase Engine including support for Windows, Linux, Wii, GameCube, and Nintendo 3DS.
The new com.polyphase.formats.video addon adds a fully integrated cross-platform video playback system directly into the engine with:
VideoPlayer3D nodes
VideoClip assets
Lua playback control
Async decoding
Editor integration
Console-friendly fallback formats
FFmpeg support on desktop platforms
Whether you want animated billboards, cutscenes, CRT TVs, FMVs, UI backgrounds, or full in-game cinematics — this addon is designed to make video playback feel native to Polyphase.
Supported Platforms
| Platform | Decoder Backend |
| Windows | FFmpeg |
| Linux | FFmpeg |
| GameCube | THP / PCV1 |
| Wii | THP / PCV1 |
| Nintendo 3DS | N3MV |
| Future Platforms | Extensible decoder system |
Features
VideoPlayer3D nodes
VideoClip assets
Lua playback control
Async decoding
Playback events/signals
Editor asset importing
Native addon hot-reloading
Texture-based rendering
Console-friendly playback pipelines
The addon is built entirely on top of Polyphase’s Native Addon system.
Built for Real Engine Workflows
The addon integrates directly into:
the Asset System
Lua scripting
the Renderer
the Editor UI
the Addon pipeline
No hacks. No external player windows.
Just drag in a video, assign it to a node, and play. Or simply just set a file path to open a supported video file (PC & Linux) with importing it into your project.
Simple Lua API
Playback intentionally stays lightweight and dynamic:
videoManager = {}
function videoManager:GatherProperties()
{"name"="player", type = Node3D},
{"name"="video1AssetPath", type = String},
{"name"="video2Path", type = String},
end
function videoManager:Start()
if self.player ~= nill then
self:PlayAsset()
end
end
function videoManager:PlayAsset()
if self.player ~= nill then
self.player:SetVideoClip(LoadAsset(self.video1AssetPath))
self.player:Play()
self.player:SetLoop(true)
self.player:SetVolume(0.8)
end
end
function videoManager:PlayFilePath()
if self.player ~= nill then
self.player:SetFilePath(self.video2Path)
self.player:Play()
self.player:SetLoop(true)
self.player:SetVolume(0.8)
end
end
Playback events:
introVideoPlayer = {}
function introVideoPlayer:OnFinished()
Log.Debug("Playback complete")
end
function introVideoPlayer:OnReady()
Log.Debug("Playback ready")
end
function introVideoPlayer:OnPlay()
Log.Debug("Playback running")
end
function introVideoPlayer:OnLoop()
Log.Debug("Playback looped")
end
function introVideoPlayer:OnError(args)
Error("Playback Error")
end
Built-In Connectors
Connector scripts are provided to allow developers and artist to easily apply Video’s do Nodes/Widgets without code.
Apply a video to a Quad Widget
Override a Material’s texture with a Video.
That’s all most projects need.
FFmpeg Support
Desktop playback uses FFmpeg, but users must package their own binaries.
This keeps licensing/distribution flexible while allowing projects to choose their own FFmpeg builds.
Example:
Importing Videos
Once installed, simply import supported video files into the Polyphase Asset Browser.
The addon registers custom importers directly into the editor pipeline using the Native Addon system.
Supported desktop formats depend on your FFmpeg build, but commonly include:
MP4
MOV
AVI
MKV
WEBM
Console targets use optimized converted formats.
Console-Friendly Workflow
Retro consoles have very different performance constraints than desktop systems.
Instead of trying to brute-force modern codecs on limited hardware, the addon supports optimized native playback formats.
This allows:
lower memory usage
hardware-friendly decoding
stable framerates
smaller runtime overhead
Built on the Polyphase Native Addon System
The video addon demonstrates what’s possible with Polyphase’s extensible architecture:
custom Node types
custom Asset types
editor integration
Lua bindings
platform-specific builds
hot reloading
external libraries
runtime systems