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.

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

Next
Next

DevSnapshot: 6.2.0-beta.6