Skip to main content

Prisma UI F4: 1.0 vs 2.0

Status: beta

Prisma UI F4 2.0 (the CEF-based rewrite) is in beta. The core view lifecycle and on-mesh rendering carry over unchanged from 1.0 and are stable, but the CEF backend itself is new and hasn't had the same amount of real-world mileage 1.0 had. Expect rough edges on Next-Gen/AE in particular (see the known limitation below), and report anything unexpected.

The big change: Ultralight to CEF

Prisma UI F4 1.0 rendered through the Ultralight SDK, a WebKit-based embedded browser. 2.0 replaces it with CEF (Chromium Embedded Framework) - a real, full Chromium build. This didn't require any change to the plugin-facing API: IVPrismaUI1 through IVPrismaUI5, the entire interface surface 1.0 shipped with, are unchanged. An existing 1.0 plugin recompiles against 2.0's header and runs as-is.

What the switch buys you:

  • A real Chromium rendering pipeline instead of a WebKit variant - current JS/CSS, WebGL, and full video/audio support.
  • No Ultralight SDK dependency, and no Ultralight EULA obligations. Prisma UI F4's own license no longer inherits Ultralight's commercial-use cap or its reverse-engineering restriction.
  • Chrome DevTools for debugging your views, opened in your normal desktop browser and attached to the game over a remote-debugging port, replacing 1.0's in-game inspector overlay (CreateInspectorView/SetInspectorBounds still exist for source compatibility, but SetInspectorBounds is now a no-op since there's no in-game window to position).

Under the hood, 2.0 also composites every view as an iframe inside one shared CEF browser (the "shell"), drawn into the game through a single D3D11 Present hook, instead of each view owning a separate render surface. This is an internal detail - it doesn't change how you call CreateView or anything else on the API - but it's the reason all views share one process and one GPU texture pipeline now.

New since 2.0

These were added during and after the CEF migration, so they only exist on 2.0:

  • V6 - SuppressHUDWidget, SuppressVanillaMenu, CloseVanillaMenu: hide or close pieces of the vanilla HUD/menu system so your own UI can replace them cleanly.
  • V7 - SuppressVanillaMenuIf, EnableActivateChoiceFilter, SuppressActivateChoicePerk: conditional vanilla menu suppression and activate-choice menu control.
  • V8 - EnumerateViewsEx (adds owner-plugin tracking to view enumeration), GetActivateChoiceLabel, TriggerActivateChoice, GetViewHealth, SetViewOffscreenSize.
  • V9 - gamepad/controller support (IsUsingGamepad, GetControllerStyle/SetControllerStyle, NoteInputDevice, GetButtonPrompt, GetGamepadButtonName), SetViewOwnsEscape, and SetViewOffscreenBackground (lets an on-mesh view render transparently over its bound geometry instead of a hardcoded opaque background).
  • V10 - view roles: SetViewRole/GetViewRole, GetFocusedView, IsAnyPanelVisible. Tag a view as a panel, HUD widget, or overlay so other plugins can ask whether an interactive panel is already on screen before opening their own. Give any view that takes input a role; an undeclared view is never counted by IsAnyPanelVisible, so other plugins will open on top of it.

Everything from 1.0 - core view lifecycle, console logging, Papyrus translations, BindUIEvent, and on-mesh rendering via BindViewToGeometry/BindViewToScreenTexture/GetViewSRV/ SetViewOffscreen - is unchanged and works exactly the same way it did before the CEF switch.

Known limitation in this beta

SuppressHUDWidget and EnableActivateChoiceFilter (V6/V7) only work on Old-Gen (1.10.163) right now. The vtable addresses they hook are hardcoded and haven't been mapped for Next-Gen/AE yet, so on those runtimes both calls just log a warning and do nothing instead of patching a guessed address.

Upgrading an existing 1.0 plugin

Nothing in your code needs to change. Recompile against the new PrismaUI_F4_API.h, deploy the new framework files (PrismaUI_F4.dll, PrismaUI_F4_Host.dll, and the PrismaUI_F4_CEF/ runtime folder, replacing any old Ultralight libs/resources folders rather than mixing them in), and your plugin runs unmodified.