Skip to main content

Optional Effekseer Backend

Effekseer is a graphical VFX editor and runtime. Nebulon supports it as an optional authoring choice for developers who prefer an editor over writing shaders — it never replaces Nebulon's native renderer or material API.

Nebulon core contains no Effekseer runtime or native binaries. It only publishes the immutable EffekseerEffect description and the client-side EffekseerBackend provider contract, so a separate companion mod can opt in.


Using Effekseer effects

A consuming mod checks availability first; clients without a provider simply have no renderer for EffekseerEffect, and all native Nebulon effects continue to work:

if (NebulonEffekseer.isAvailable()) {
EffekseerEffect effect = NebulonEffekseer.effect(
Identifier.of("my_mod", "effects/fireball.efkefc"))
.at(position)
.rotation(new Quaternionf())
.scale(1.25f)
.speed(1.0f)
.loop(false)
.dynamicInput(0, charge) // 4 dynamic input slots (0–3)
.cullingRadius(12)
.maxRenderDistance(128)
.build();

NebulonRendering.effects().spawn(world, effect, 80);
}

Effekseer effects are ordinary world effects: they use the same handles, lifetimes, culling, and (with a codec) synchronization.

Relevant formats:

FormatPurpose
.efkefcEditable effect format and runtime input
.efkPlay-only exported binary
.efkpkgPackage containing effects and referenced resources

Providing a backend

A provider mod registers its renderer during client initialization:

NebulonEffekseer.registerBackend(new MyEffekseerBackend());

The provider owns everything native: per-OS/architecture artifacts, safe extraction and loading, resource resolution, camera and framebuffer translation, OpenGL state restoration, device/context shutdown order, and feature reporting. This boundary also allows a future pure-Java importer to implement the same effect type.


Roadmap position

The longer-term plan keeps effect authoring portable rather than binding Nebulon to one runtime: expand native presets and deterministic timelines first, define a versioned intermediate effect model, then import the Effekseer subset that maps cleanly (sprites, rings, ribbons/tracks, transforms, spawn, lifetime, color/scale curves, textures) — reporting unsupported features instead of silently changing an effect.