Known Issues¶
The following are known issues with the current version of SplashEdit and psxsplash. Pull requests are welcome for any of these - the project has grown significantly and contributions are greatly appreciated.
Rendering¶
Exterior scene BVH rendering may have issues¶
The BVH frustum culling system has been rewritten with a proper frustum extraction and AABB test, but may still have edge cases. Interior scene type with rooms and portals is still recommended for best performance.
BVH preview visualization is broken¶
The BVH preview toggle in the Scene Exporter inspector does not display correctly. The Rooms/Portals preview works fine.
Near-plane triangle artifacts¶
Triangles crossing the near plane are subdivided in 3D and re-projected. This replaced the previous Sutherland-Hodgman clipping approach. Rasterizer-limit triangles use vertex clamping instead of subdivision to avoid T-junction cracks. Minor visual artifacts may still appear on triangles very close to the camera.
Fog edge cases¶
Distance fog uses a Silent Hill-style two-pass approach (per-vertex fog blending with additive overlay). Most configurations work well, but extreme density values or very close geometry may produce visual artifacts.
PSX UI images overblown with white tint¶
Using a full white tint (255, 255, 255) on PSXUIImage elements causes washed-out, overblown colors. Use a tint around 128, 128, 128 for normal appearance.
Portal visibility at close range¶
Portal projection has been improved (int16 overflow fix, conservative fullscreen rect for near-camera portals), but edge cases may remain when standing exactly on a portal boundary.
Scene Setup¶
Interior scenes need at least one room defined¶
If you set the scene type to Interior but don't add any PSXRoom components, rendering glitches will occur. Always define at least one room volume.
All geometry must be enclosed in rooms¶
In interior scenes, geometry not contained within any PSXRoom volume goes to a catch-all bucket that's always rendered. Make sure room volumes fully enclose all visible geometry.
Textures must be power-of-two¶
All textures must be power-of-two in both width and height, with a maximum size of 256x256. SplashEdit does NOT validate this - incorrect textures produce broken results silently.
Physics & Navigation¶
Navigation mesh plane error on terrain¶
On undulating terrain, some navigation regions may have high floor-plane error, causing the player to float above or sink below the actual surface. Use the Terrain preset or lower the Merge Region Area and Max Edge Length to produce smaller regions that track terrain height more accurately. The build statistics panel in the PSXPlayer inspector flags regions exceeding the Max Plane Error threshold.
Rotating objects doesn't update collision bounds¶
Rotating objects via Lua does not recalculate their AABB (axis-aligned bounding box) collision bounds. The collision volume stays in the original orientation. Position changes via Entity.SetPosition now correctly shift the AABB and mark the object as dynamically moved for proper frustum culling.
CD-DA audio requires ISO build¶
CD-DA playback only works from a disc image. It will not produce any audio when running via PCdrv (Emulator or Real Hardware build targets). Use the ISO build target.
API Limitations¶
Camera API overridden by navigation controller¶
In scenes with a PSXPlayer and navigation regions, the navigation controller continuously overrides camera position and rotation. Use Camera.FollowPsxPlayer(false) to take manual control of the camera from Lua. The Camera API is also usable during cutscenes, which temporarily suspend the nav controller.
Camera.LookAt is incomplete¶
The Camera.LookAt() function exists in the Lua API but is a placeholder. It does not correctly point the camera at the target position.
Debug.DrawLine and Debug.DrawBox draw nothing¶
Both are registered and accept their arguments, but neither queues a primitive, so nothing appears on screen. Calls are harmless and can be left in a script.
onPathBlocked is never fired¶
The agent callback is recognised and dispatchable, but nothing in the engine raises it. An agent whose destination is unreachable stops moving with no event. Poll Agent.IsMoving against a timeout instead. See Agents.
Agent onTargetSeen passes nil for the player¶
An agent with no explicit Agent.SetTarget senses the player by default, and the player has no GameObject, so the callback's target argument is nil. Treat nil as "the player". Hearing a target sets the alert state but does not fire onTargetSeen at all.
Sprites have no per-sprite alpha¶
Sprite.SetColor tints; it cannot fade. A translucent overlay drawn as a dimmed rectangle comes out fully opaque. To darken part of the screen, draw a mask with a hole cut in it. See Sprites.
Tilemap movement deltas are whole pixels¶
Tile.MoveActor truncates its deltas to integers, so a speed below one pixel per frame rounds to zero and the actor never moves. Accumulate in sub-pixels and spend whole ones. See Tilemaps.
Network version and scene mismatches are terminal and silent¶
Net.State() 3 (version mismatch) and 4 (scene mismatch) latch: the console stops talking and nothing retries or times out. Draw the state somewhere the player can see it, or a mismatched pair of discs looks identical to an unplugged cable. See Networking.
Persist storage limited to 16 entries¶
The cross-scene Persist data system supports only 16 key-value pairs (numbers only) and exceeding this limit silently fails. For larger or structured state — and for data that must survive power-off — use the memory card API, which serializes whole nested tables.
Memory report is very approximate¶
The memory preview in the Control Panel is very limited and approximate. Do not trust the numbers as accurate. A safe margin is when it shows around 50%.
Platform¶
Can get a little moody on Linux¶
Some editor functionality may behave inconsistently on Linux. The primary development and testing platform is Windows.
macOS support is experimental¶
macOS (Apple Silicon) is supported end-to-end via the setup wizard: it detects the toolchain across Homebrew paths, downloads and wraps PCSX-Redux from the .dmg (with a font fallback to avoid an ImGui crash), and guides you through the one-time MIPS compiler install through Homebrew. See Installation → macOS Setup. It has not been as extensively tested as Windows, so edge cases may remain — especially around GUI-app PATH detection.
Build Pipeline¶
PCSX-Redux startup logs may be missed¶
When launching the emulator from the Control Panel, Unity can hang briefly during the process launch. Early console output from PCSX-Redux may be lost. This doesn't affect gameplay.
Fonts¶
Custom fonts can have character cropping issues¶
Individual characters in custom bitmap fonts may appear slightly cropped or cut off.
Internal¶
Controller rumble has no Lua API¶
The PS1 runtime supports DualShock rumble/vibration motors, and they can be driven via Rumble Small and Rumble Large tracks in cutscenes and animations. However, there is no Lua API for controlling rumble directly from scripts yet. This will be exposed in a future update.
Default ISO license shows "Made with psxsplash"¶
When building an ISO without a custom license file, the default license displays "Made with psxsplash" on boot. Provide your own .dat license file in the build settings to override this.