Epok Engine
Documentation/Start here

Project Settings and Editor Preferences

START WITH THE BIG PICTURE

What does this part of Epok do?

Project Settings change what the game builds; Editor Preferences change how this computer works with Epok. Keeping those two scopes separate makes projects portable.

  1. 01Choose the correct settings window
  2. 02Review validation and memory impact
  3. 03Apply and rebuild when required

What is happening under the hood?

  • Rendering settings select supported NTSC dimensions and resource budgets.
  • Maps, Play profiles, streaming and transitions travel with the project.
  • MCP, emulator and serial choices stay with the local user.

Field note: If a teammate should receive the change, it probably belongs in Project Settings.

Open Edit > Project Settings... or Edit > Editor Preferences.... Both windows use a dark category sidebar, searchable property sections and an Apply button. Search spans all categories. Changes remain drafts until applied; close the window and reopen it to discard a draft. Apply is disabled while compiling or playing.

Project Settings

These settings live in the root .epokproject YAML descriptor and travel with the game project.

Category Options
Project / Description Project name shown in the Hub, the default SoundBank and the default scene Blueprint parent
Project / Maps & Build Startup scene, automatic asset reports (on by default), Build/Play profile, scene selection and loading transitions
Engine / Rendering Native output resolution, retained packets and precomputed visibility
Engine / Streaming Geometry streaming, page pool, RAM budget and disc music behavior
Engine / Debug Independent runtime FPS, CPU, Geometry/GTE, GPU DMA and SPU RAM overlays

Default Scene Blueprint Parent names the class proposed in Map Settings when a map's scene Blueprint is created. It is a suggestion only: changing it never modifies a map that already has one, and each map can choose a different parent. Leaving it unset proposes epok::SceneScriptActor.

The default is 640 x 480 interlaced NTSC, including existing projects that do not yet have a rendering entry. Widths of 256, 320, 368, 512 and 640 are available at 240 progressive or 480 interlaced lines. PAL output is not exposed by this runtime yet.

Debug overlays are off by default, persist in the descriptor's debug section, and apply on the next build. See counter meanings and cost.

Apply saves project settings without reopening the scene, refreshing script declarations or starting a build. Existing compiled consumers are marked stale; the next Play/Build uses the new values. Compilation is always requested explicitly through Build, Play or memory analysis. Legacy auto_build fields are accepted for compatibility but never schedule compilation. Scene View updates independently.

The Game view toolbar has Fit (4:3), Stretch, and Integer (4:3). Fit is the default: it fills the available width or height without cropping, leaving bars only on the other axis. Stretch fills both axes and may distort the image. Integer keeps whole scale factors when possible. These modes also appear under Editor Preferences > Play > Game View and are local display preferences: they work during Play and never change native resolution or build the game. Existing preference files start in Fit; Integer remains selectable.

rendering:
  width: 640
  height: 480
  retained_geometry: true
  precomputed_visibility: false
  streaming_geometry: false
  streaming_pool_pages: 4
  streaming_triangle_budget: 4096
  streaming_prefetch: true

Retained Packets (retained_geometry, default on) keeps the GPU packets of static meshes alive between frames: corner colours, page UVs and texture words are written once and rebuilt only when the material, lighting, texture bank, transform basis or entity generation changes. Each frame writes screen coordinates, links the packet into the ordering table and refreshes colours only where fog applies. Animated (skeletal) meshes and materials with UV scrolling always use the per-frame path. The switch reaches the runtime through display.hh and changes nothing in the image; see performance for the measured effect. Turn it off to compare against the per-frame path or when RAM is tight: retention uses one record per allocated quad, bounded by the per-frame triangle budget in streaming builds.

Precomputed Visibility — Experimental (precomputed_visibility, default off) adds conservative selection of editable-mesh chunks. Camera, object and parent transforms remain supported. It does not add occlusion or increase the visible range, and it may lower FPS.

Position Interpolation (motion_interpolation, default on) under Engine > Rendering > Movement smooths entity and camera translations between the fixed 60 Hz simulation steps. It does not change movement speed, collision positions or input sampling. It adds up to one simulation tick (~16.7 ms) of visual delay, plus fixed RAM and CPU work; compare it on/off for your project. It does not interpolate rotation, scale, skeletal poses or particle positions. Camera cuts, scene changes and pauses reset the history. For a scripted teleport, call epok::reset_motion_interpolation() after changing the transform to snap immediately. The setting applies on the next build, including C++ exports.

Geometry Streaming — Experimental (streaming_geometry, default off) stores immutable editable-mesh geometry in 64 KiB CD pages. It may lower FPS or stall frames. A generated CD image is required. Textures, collision, scripts and other resources retain their existing storage paths. Visibility and streaming can be enabled independently.

Streaming Pool Pages (streaming_pool_pages, default 4, range 2–8) reserves 128–512 KiB for resident page payloads. Active pages load before gameplay when they fit the pool; later required reads may stall rendering. XA music pauses during required reads and restarts at the beginning of the track.

Per-frame Triangle Budget (streaming_triangle_budget, default 4096, range 512–8192) caps triangle storage in streamed builds, including resident geometry and clipped triangles. Lower values save RAM. Excess triangles are omitted and counted as dropped. Retained packets share this bounded capacity; objects that do not fit use per-frame packets.

Preload Nearby Geometry — Experimental (streaming_prefetch, default on, inactive while streaming is off) requests a nearby page when a free slot and the CD controller are available. Additional work may lower FPS. Disable it to compare demand-only loading. It does not interrupt XA playback or evict loaded pages for speculative reads.

These controls appear under Engine > Streaming and apply on rebuild. See Using geometry streaming for the CD launch requirements and runtime behavior.

Resolution changes apply on the next build. The generated display.hh travels with standalone C++ exports; runtime GPU setup, projection, clipping and blob-shadow projection use that configuration. The image keeps the same camera field of view and is presented at 4:3, including modes with nonsquare pixels.

The output mode currently applies to every scene in the build. Per-scene modes and runtime resolution changes are not implemented; choosing 512 x 240 here also changes the title and gameplay scenes, not just menus.

HUD coordinates are native output pixels. Anchors follow the selected canvas size; text remains an 8 x 16 bitmap font. A centered panel stays centered when resolution changes, but an authored 100-pixel width remains 100 pixels. The editor's 2D HUD canvas follows the selected resolution too.

Analog displays and video converters may crop the outer lines. Keep important HUD content inside margins and verify it on the intended display; backgrounds can still reach the edges. Changing the GPU display range changes the visible region, not the pixel size, so it does not automatically scale a HUD to fit. See the PSX display range reference.

640 x 480 contains four times the pixels of 320 x 240. The higher mode costs more GPU fill work; it does not increase geometry or animation budgets. Interlaced modes can flicker on a CRT. Measured elapsed time drives fixed 60 Hz simulation with at most eight catch-up steps per rendered frame; see input and time. Hardware validation is pending.

Reset Rendering restores the rendering defaults without changing streaming, project identity or the startup scene. Reset Streaming restores streaming to off, its pool to four pages, its triangle budget to 4096 and preloading to on without changing rendering. A startup-scene change takes effect when the project is reopened.

Editor Preferences

Preferences are stored in the user's Epok data directory (%LOCALAPPDATA%/Epok/Editor.epokprefs on Windows). They apply across projects and are not included in game exports.

Category Options
General / Viewports Default grid visibility and flight speed
General / Play Integer scaling in Game and smoothing in the external emulator window
General / AI / MCP Enable the local MCP server, choose its port, rotate the access key and copy HTTP/stdio client configurations

Applying viewport preferences updates the current view. A template's saved starting view can override the navigation defaults on opening. Integer scaling uses whole display-scale steps when space allows; smaller Game panels fit the image instead. Game always uses point filtering.

Smooth Image controls PCSX-Redux's external debugger window and takes effect on the next Play. It is off by default to keep pixels crisp. Other emulator settings are preserved.

Enable MCP Server is off by default. Apply starts or stops the server for the open project; MCP preferences can be applied while Play is running. The access key stays in local editor preferences. See AI assistants / MCP for available tools, screenshots and connection instructions.

Expanded for the web and checked against develop · View technical source · 8ba2896