What's New:
LIMITATIONS:
- Broken PROC support
- Broken SMAA postprocessing, will be fixed in 10.8.1
FEATURES:
- VPX and VPVR are finally reunited!
So, similar to the VP9.9 release, this pretty much rearchitects VPs whole rendering pipeline, but still allows to play all tables with (hopefully) pretty much the same look and feel.
Some of the changes that came in via VPVR:- added SDL2 / OpenGL / OpenGLES as an additional render pipeline.
switching between DirectX 9 and OpenGL is (for now) only possible at compile time, thus two executables are shipped. - the new OpenGL pipeline is also capable to render to VR devices (support for SteamVR):
To use VR you need a SteamVR compatible HMD, a Steam account, and the Steam client/app
with SteamVR client installed. More information on OpenVR + SteamVR can be found on http://steamvr.com
You may also want to check out OpenComposite, as it seems to provide a performance boost for some users. - autodetection of SteamVR driver installation. If its not installed, the standard 2D mode is started up instead.
If VR drivers are installed, and the HMD is turned on, VPX starts in VR mode. Otherwise a prompt shows up to choose between VR mode and 2D mode (can be disabled). - the new OpenGL pipeline also is no longer computing/approximating Stereo3D only from depth buffer information.
If any stereo mode is enabled, the table is then always rendered to two independent eye buffers instead.
This increases CPU and GPU load for all stereo modes, but increases the image quality.
Also anti-aliasing can be enabled for all stereo modes. - super-sampling based anti-aliasing can now be adjusted with a slider from 0.5 (downsampling) up to 2.
The factor describes the scaling in X and Y direction, so 2 increases the overall pixel-count by a factor of 4. - the new OpenGL pipeline in addition has full support for GPU multisample antialiasing (MSAA) which offers very good results for a fairly low performance overhead compared to super-sampling
- splitted the video settings into the 'old' 2D based video settings menu and a new VR settings menu.
Also different registry entries are used to store the various settings like stereo mode, display, resolution, postprocessing etc. separately.
Things like Ball rendering and Day/Night cycle are used for both.
To configure VR, go to the new Preferences->VR Settings menu and (de-)select it in the upper left drop down menu.
If you have performance issues, try disabling things like Ambient Occlusion, Supersampling (=1), Postprocess AA & Sharpen, Reflections, and Bloom.
One can also select an additional VR Preview window that shows the VR rendering on the screen as Side-By-Side. - when using VR, the near plane can be adjusted (in centimeters). It is like a wall in front of the player. Everything between the player and the near-
plane is invisible. It might be helpful if one wants to adjust visibility when moving or if one has changed the scaling too much. Having too small values for the near-plane will cause Z/depth-fighting rendering artifacts. - scaling of the table is now possible within the VR settings. One can either set a factor (e.g. 1.1 increases the table size by 10%) or one can
scale all tables to a fixed width (in centimeters) to match a PinSim Controller. The scaling factor has no lower/upper limit (so yes,
one can scale up the table to play soccer ;) Or be attacked by a giant rolling Indy-Trap Or scale it down to matchbox car size If it gets
weird we warned you). If you have issues locating the table or getting nightmares, it is NOT our fault.
Default values are: box unchecked and 1. - note that the VPVR fork did not support the roughness property of metallic parts (=always mirror like metal instead). Some VR-only tables thus feature wrong material shininess that will lead to
incorrect rendering of metal parts. These table's materials need to be updated to re-adjust the shininess of metal materials. - note that adaptive vsync (=mode value 2) is recommended (at least) on macOS/iOS and Android
- added rudimentary support for BAM Headtracking (thanks to Rafal from ravarcade.pl). Usage:
It works almost the same way as with Arcade Pinball, but one doesn't have control over the table location.- The User needs a working Future Pinball installation with head tracking enabled (FP is just used to setup the head tracking, FP can then be closed).
- Start BAM-Tracker.exe, select head tracking method, leave it running.
- Run VPinballX (the OpenGL version)
https://www.youtube.com/watch?v=g-EpTp_3wKo
- added SDL2 / OpenGL / OpenGLES as an additional render pipeline.
- completely revamped F11 (note that on macOS its F1)/ESC menu, including much more detailed live editing options of table elements
- the playfield is now processed like all the other parts, i.e. its not forced as static/preprocessed anymore, and thus underlying table elements will work as expected now (so no more under playfield clipping, and alpha blending is not limited to simple alpha clipping/cutouts anymore):
- if the 'playfield_mesh' primitive has 'Static rendering' disabled, it will be rendered with transparent parts (this results in the 'playfield_mesh' to be blended like plain primitives, so no more need for alpha test or insert overlays)
- parts under the playfield (like a lower playfield or 3D inserts) can have 'Static rendering' checked and can feature materials without the 'Active' checkbox (previously, under-playfield parts without these flags were clipped)
- the playfield texture can now be changed at runtime through the script (see CommandReference.txt)
- playfield reflections are now rendered using a 'reflection probe' instead of a 'fullscreen mirror overlay':
- performance may change a bit (better or worse) depending on the table and display configuration
- reflection settings are now unified between balls/playfield and the interactive camera/light editing mode (F6),
and were extended with new rendering modes:- Disabled: NEW remove all reflections
- Balls Only: dynamic balls only
- Static Only: reflection of static parts only (no change)
- Static & Balls: reflection of static parts and dynamic balls (no change)
- Static & Unsynced Dynamic: NEW reflection of static parts and dynamic parts without depth buffer synchronisation. Overlapping of dynamic-over-static and of static-over-dynamic reflections is thus incorrect (features just a limited performance cost, added for lower end systems)
- Dynamic: NEW dynamic reflection of all parts. It provides the best results without any overlapping artefact at the cost of a little bit more performance (recommended)
- additional roughness parameter
- add support for preliminary refraction to primitives (using 'refraction probe's). This feature is still preliminary and will evolve in the coming updates.
- add refraction tint to the material parameters
- add native ball shadows for bulb lights, as well as to flashers & primitives that are used as lightmaps (using additive blending)
- reworked lights:
- now lights have a z coordinate (relative to the surface they are on) that is used for shadows and bulb rendering
- allow to hide light rendering (still allowing for ball reflections or shadows through primitives or flashers). This was only possible through scripting before
- allow the bulb mesh to work for both classic lights as well as bulb lights
- allow the reflection on ball to work for both classic lights as well as bulb lights
- add support for 'modulated' lights (through script only, corresponding to PWModulated outputs of most 1990+ pinballs)
- allow to select a fading behavior between linear (backwards compatible) / LED (no fading) / Incandescent (physical model of an incandescent bulb, including tinting when filament cool down)
- try to make the user interface more intuitive
- add support for more than one DMD (for original tables, in-game DMD menu,...)
- add new log file functionality (vpinball.log), with script and error information. It can be en/disabled in the UI/Editor preferences.
The ability to do a rough performance profiling of the table loading phase by using the 'Profile.txt' has thus been removed in favor of the new logging
(all the profile events will be in the log file with timestamps) - the settings are now stored in a file named 'VPinballX.ini' located in the standard Windows location for application data: %AppData%/VPinballX/
(optionally this can be changed in the INI/Editor/UI preferences to be located in the same folder as the executable)
This file will be automatically created and initialized from existing settings if found in Windows registry. This change was made to:- allow per table settings,
- allow easier edition (manually or by a third party application),
- allow to use different settings by specifying a custom ini file on the command line for the app or table settings (see CommandLineParameters.txt),
- settings are the same and can be shared between Windows version of VPX and the standalone version (Linux, Mac, Android, iOS, Raspberry,...),
- allow to see all the available settings at once (not so easy before, since there are a few hundreds of them),
- allow easier collaboration by being able to share the setting file with bug reports.
If a file with the exact same name as the one of the table file but with '.ini' extension is found along the table file, it will be used as a settings override for that table.
- settings were also extended to support overriding some table properties, like camera properties or other things that used to be adjusted in the 'User' property pane. This change allows to
adjust a table to user preferences without modifying the table. Only the table settings (the ini file along the table) will be adjusted. This way:- updating a table to a new version can be done more easily, by simply renaming the ini file to the new table name, keeping all adjusted settings,
- all properties and settings use the same approach: load data from the table, optionally overriden in the app ini settings, optionally overriden in the table ini settings,
- POV files are not needed anymore and therefore deprecated (these are still read and used, unless an ini file has been created, for backwards compatibility).
- some settings were moved/changed to benefit from the new settings system:
- Player/GlobalDifficulty is now TableOverride/Difficulty, expressed as a decimal value
- Playfield & Ball reflection on/off were removed from the table settings, since this was redundant and conflicting with overall application and reflection probes settings. We now directly
define reflections in the render probe. Table authors can disable the default playfield reflection by setting PF reflection strength to 0. Players use the app/table settings to tweak in addition.
- the camera mode was replaced by a user setting 'tweak' mode which allows to edit the point of view like before, but also adjust table settings.
This mode will not modify the table like it used to do, but only adjust the settings (in table's ini file). The settings are only saved when the credit key is pressed.
This mode can be started from the ui, from the commandline, or entered while playing using the (new) dedicated key shortcut.
Tables can declare custom options from the script that will be presented to the player in this mode (see script reference). For example:
Sub Table1_OptionEvent(ByVal eventId)
Dim mod1: mod1 = Table1.Option("Option", 1, 4, 1, 1, 0, Array("Option 1", "Option 2", "Option 3", "Option 4"))
Dim mod2: mod2 = Table1.Option("Percent", 0, 1, 0.01, 0.5, 1)
' Adjust table according to the value of 'mod1' and 'mod2'. Note that mod1 is a value between 1 and 4. mod2 is a value between 0 and 1 (displayed as a percent in the UI).
End Sub
Tweak mode also allows to view information and rules from the table. 'Rules' supports a limited markdown syntax allowing for headers, horizontal rule, lists and images (for example rule card). - remove Anti-Aliasing and Postprocessed Anti-Aliasing options from the table properties (and use an .ini based override instead)
- the application is now fully 'DPI aware'. This means that one can use multiple monitors at different DPI settings.
This may require to adjust the position of windows on existing installs. - add 2 new camera layout modes which work better for cabinets, and for anaglyph stereo (as well as other use cases) and allows:
- to setup the player position in real word units, measuring from the bottom center of the playfield in centimeters. This should allow to have a single position corresponding to your size and play position for all your tables.
- to setup the camera like a 'real' camera: there is no more layback but a view offset, the other properties being simply the inclination and the field of view.
- for camera mode, adjust the user interface to show this information and allow to easily reset to a default position by pressing the plunger key.
- support a new 'window' mode, designed for pincab users, where the screen is not orthogonal to the viewer, requiring an adjusted projection.
- change camera mode buttons to match the ones when starting VPX with -povedit (Start = Export POV, Credit = Reset/Quit, Plunger = Defaults)
- change view mode selection settings, you can choose between:
- Desktop & FSS: automatically selects one of the 2 depending if the table has enabled FSS (because it includes a backglass)
- Cabinet: use the cabinet view setup (also named 'Fullscreen')
- Desktop: use the desktop view setup (never use the FSS settings, even for tables including a backglass)
The UI also allows table authors to quickly switch between these mode from the camera property pane.
- stereo rendering has been rewritten:
- use new projections which are well-designed for stereo rendering (same as for VR, no more parallel or toe-in with artefacts)
- compute exact depth information when using the new 'window' POV mode (note that you should have the same X/Y/Z scene scale to get good results)
- add support for fake stereo to OpenGL (like DirectX): real stereo is way better but needs a more powerful setup
- add 'Luminance' filter mode which creates anaglyph based on real display/glasses/viewer calibration. The calibration is only possible from the new Live Editor.
This new mode adapts to any glasses based on user calibration. It is especially useful when glasses are not conforming standard filter colors, on HDR display or
for (partially) color blinded people. The calibration is performed from the new 'Live Editor' in the Live Editor > Preferences > Video Settings dialog. It consists
of measuring the perceived luminance of your display through your glasses and eyes. To do so, the viewer adjusts the luminance of a reference image showing 2 faces
until it finds the point where the most prominent faces change sides. - Additionally to toggling stereo on/off, F10 shortcut also circles through the anaglyph glasses settings, Flipper Key + F10 circles backward
- add complete support for anaglyph amber/blue & blue/amber glasses
- allow to adjust image brightness and per eye contrast
- add all stereo settings to the Live Editor to get live feedback (in the Live Editor > Preferences > Video Settings dialog)
Note that the DirectX flavor of VPX does not support real stereo rendering. The OpenGL flavor should be preferred when using stereo (at the cost of some performance requirements)
- the ball texture can now be set as either a spherical map (the default, like it used to be before 10.8), or as an equirectangular map. Equirectangular maps
are also used already for the environment lighting. The benefit of using them is that the reflections are view dependent and that they can match
the table environment lighting image for full consistency between the lighting and reflections. - the ball is now shaded using the previous frame for computing the reflections of the playfield on the ball. This allows to have correct reflections of the playfield on balls
when using a playfield_mesh, to reflect the inserts and all the full shading/lighting applied (so no more need to enable ball reflections for insert lights unless you want some extra reflected light). - new 'Force round ball' option in the video preferences to replace the old, manual anti-stretch parameters
- timers with a -1 interval used to be ran 1 or 2 times per frame (depending on user latency reduction setting). They now are always ran once per frame only.
timers with a -2 interval are now considered as controller sync timers and will be ran as many time per frame as needed, depending on user settings. - a new folder named 'Cache' was added to VPX's main directory for caching data to improve performance. For the time being, it is used to store the list of textures which are used
by each table during play. This allows for preloading of the needed textures when a table is started, limiting stutters during play. - add an option to primitives to toggle 'depth masking', which is otherwise used during rendering to hide all parts behind the primitive. If unchecked, the primitive will not hide parts behind it and it will also not be visible to ambient occlusion.
For example, this is needed to employ primitives to render user/fake shadows without breaking ambient occlusion, or for transparents part with self overlapping parts like plastic ramps. - as the script is initially started, the Init events are now called before the static parts are prerendered.
This allows a table script to adjust the properties of static parts during startup. - video synchronization and target frame rate are now 2 separate settings and a new video synchronization mode for low latency input/physics/rendering has been added. The choices are:
- None: no synchronization, VPX just runs as fast as possible. Unless when playing on a very powerful system, this should lead to some input latency (due to lack of input syncing) and render latency
(due to flooding the GPU frame queue). This setting used to be 'Adaptive Sync: 0' - VSync: synchronize on the display vertical blank signal. This can limit stutters and avoids tearing, but will lead to high input latency. This used to be mode 'Adaptive Sync: 1'
- Adaptive VSync: same as 'VSync', but when a frame is late (=missing the refresh rate), it is displayed immediately. This should reduce stutters but features the same input latency.
The DirectX 9 version uses software synchronization, while OpenGL uses hardware (driver) synchronization which should give slightly better results. This used to be mode 'Adaptive Sync: 2' - Frame Pacing: NEW VPX will try to run the input & physics simulation continuously in real time instead of only once per frame. This lowers the input latency, especially if the
computer is powerful enough to run at the monitor refresh rate. This also allows to have the input synchronized to PinMAME when enabling it, fixing some synchronization bugs like in
seen in video modes with fast button presses (Lethal Weapon, Black Rose,...).
Due to these changes, the target frame rate is now a separate setting. If defined, it will lead VPX to perform its own synchronization, trying to achieve the requested frame rate.
The synchronization settings still apply. Therefore, selecting a frame rate that is higher than the monitor refresh rate requires the use of the 'None' synchronization mode!
- None: no synchronization, VPX just runs as fast as possible. Unless when playing on a very powerful system, this should lead to some input latency (due to lack of input syncing) and render latency
- additive blended primitives are now rendered 'unshaded', so without any material/lighting applied (same as flashers), this is more natural and allows for some performance optimizations
- add staged left/right flipper key configuration to the preferences
- when renaming a surface/wall, ask if all elements (lights, etc) that reference the surface name should also use this new name
- it is now possible to choose between 3 tonemappers (the part of the rendering which handles the way overbright parts are displayed on non-HDR displays):
- Reinhard, which is the one used by VPX until the 10.8 release,
- AgX, which is an improved tonemapper especially regarding handling very bright saturated colors (used also in Blender),
- Filmic curve, which is common e.g. in modern games
- the full table can now be locked to prevent unintended user changes (can be changed anytime)
- one can now export a 'tournament score' file via the pause menu (or when keeping the Lockbar-key pressed and then pressing the Start-key, too)
if playing in the new 'locked' mode, and also not having any unsaved table changes.
This is currently limited to PinMAME-emulated machines, and the script HAS to enforce a connection to the DMD or alpha-segments display via 'UseVPMDMD = True'
(if its an emulated DMD machine, 'UseVPMColoredDMD = True' will also work), thus the file contains the encoded content of the display at that point in time.
The content of this text file can then be posted to the tournament administrators and converted by them via the '-TournamentFile tablename textfilename' command line option to a .png again.
Note that the VPX version used to play AND to convert must exactly match (incl. same revision/build, same OS, DXvsGL, 32vs64bit) - add/correct more data to the dimensions database
- add 'Sync' button to the Layers dialog to allow for faster finding
when toggled on, the 'Sync' keeps the selected element in the main screen highlighted in the layer screen to allow for quicker usage within the dialog - add support for new I/O controller capabilities, for compatible controller devices; see the new docs/ sections
and http://mjrnet.org/pinscape/OpenPinballDevice/NewPinCabInput.htm, http://mjrnet.org/pinscape/OpenPinballDevice/OpenPinballDeviceHID.htm- velocity-based nudge input
- plunger speed input
- Open Pinball Device HID
Additional docs explaining all these new features with images are provided in the docs folder of the project: https://github.com/vpinball/vpinball/tree/master/docs
FIXES:
- timers with a -1 interval are always fired after physics and animation, but before rendering, allowing the script to update visual parts accordingly without any visual lag.
This also applies to the new 'Animate' event which is designed for this purpose. - adapt physics ball-rest collision filter: its now based on ball travel distance instead of time
- filter out ball hit events only if they happen in the same place during the next 2 physics iterations
- fix visible depth range evaluation, allowing to simplify VR settings and to edit large VR rooms within the LiveUI.
Note that loading pre-10.8 tables will take a bit longer (until they are saved again with 10.8) due to this, as these need to compute 3D-bounds for each part. - fix analogue nudge not working for joysticks/gamepads in XInput mode
- implement support for mouse based left/center/right nudge
and cleaned up issue where flippers only worked with a respective fixed mouse button - fix wrong keyboard characters in dialogs for non QWERTY keyboards
- fix saving of custom keys for joypad input
- fix using multiple joypads/sticks in combination with a touchscreen and/or the mouse
- fix some problems with playing sounds via BASS: pitch/frequency change and loop/restart should now be matching the 'old' player
- reinitialize sounds each time their output device changes
- fix longstanding textbox font size bug
- reflections now work in the interactive camera/light editing mode (F6) as well
- fix overbrightness in F6 (interactive camera/light editing) mode
- fix noise on small-scaled DMDs (e.g. on FSS setups)
- fix longstanding bug in the bilateral CAS filter
- fix swapped red & blue channels when exporting from BMPs
- handle broken tables better and try to load as much as possible
- static element preprocessing is now done on the GPU (which leads to a faster VPX-player start)
- increase preprocessing sample rate for the static parts of the table
- cleanup Light Debugger dialog and fix 2nd color button
- improve script editing performance again
- fix crash during script editing
- improve mouse cursor hide/unhide in (windowed) fullscreen
- fix 'O'-key ball debugging
- fix crash if sound card(s) hardware/driver setup changed
- fix crash on tables with weird table info
- fix out of memory crashes (Video capture and Image Manager)
- fix wrong detection of alpha when loading BMPs stored in .vpx
- fix potential multi-threading screw-up when loading textures
- fix changing the timer settings not marking the table as dirty
- fix 'paste at' (and others) coordinates
- fix deleting of sub part included in a collection warning
- fix keyboard navigation in Material dialogue
- fix .bmp export in the Image Manager
- fix Image manager overwriting alpha mask value for selected images on import
- fix gate two-way flag import from VP9/8 .vpts
- improve UI scaling on high resolutions (e.g. 4K)
- fix the resize of the line number column in the script editor to accommodate for larger font sizes and size of script loaded
- update example tables with new raytraced ball shadows enabled and other new features
- add better wood texture
- update FreeImage library to latest 3.19.0 beta (custom build with more optimizations enabled, less dependencies, and a special FP16 path for .exr files)
see https://github.com/toxieainc/freeimage
CORE SCRIPTS:
- Setup PinMameTimer to be a controller sync timer (interval = -2)
- Update lights only once per frame or if FrameIndex is not available at 100Hz max
- Added staged flippers functionality to all kinds of machine .vbs files
- Changed "UseVPMModSol" to match the new VPinMAME 3.6 PWM support:
True or 1 for the previous/legacy modulated solenoids (0..255 value), or 2 for physical solenoids/lamps/GI/AlphaNumSegments (0..1 value) - Increase conMaxTimers to 50
- Added solarwars.vbs (based on peyper.vbs)
- Added LTDPecmen.vbs
- Added BallyG.vbs
COMMAND REFERENCE:
- add LoadTexture to the globals
- add DisableStaticPrerendering to the globals
- add StagedLeftFlipperKey, StagedRightFlipperKey and JoyCustomKey
- add TablesDirectory, MusicDirectory, ScriptsDirectory, PlatformOS, PlatformCPU, PlatformBits and ShowCursor to the globals
- add Animate event to Bumper, Light, Flipper, Gate, Spinner, Trigger, Targets and EMReel. This event is called when the object's visual properties are animated, in order to easily sync with custom visuals
- add CurrentAnimOffset to the Trigger and Target elements
- add CurrentRingOffset, RotX, RotY to the Bumper Element
- add support for 'modulated' lights by changing the previous light state (0=Off,1=On,2=Blinking) to float (see State, GetInPlayState and Duration), and allowing it to be also defined between 0 and 1 (2 remains the blinking state)
- add FilamentTemperature property to lights to get the 'blackbody' temperature of the filament according to the light current intensity, full intensity corresponding to a temperature of 2700K
- add support for multiple custom DMDs by adding DMDWidth/DMDHeight/DMDPixels/DMDColoredPixels to flashers. The flasher will use the provided data if any, or defaults to the table data (captured or directly defined)
- add Shadows property to Light element
- add EnableDepthMask to the primitive element
- YieldTime will now do nothing anymore
- add Option property to table to store options that are presented to the user in the Tweak mode
- add global FrameIndex
- add Setting property to the globals
- document missing GetTextFile