VP 10.0.0 Changelog
------------------------

- the next generation of Visual Pinball finally arrives!
  due to this, VP10 breaks a lot of backwards compatibility for ramps, lights, physics, colors/images/materials, and more, so
  most existing VP9 and VP8 tables will not work correctly or will even output script errors when run, -but they will load-, so you can reuse all existing work!

  -> TL.DR up-front conversion hints:
     - pull lightsource->ambient down to 0,0,0 (or at least a small value to avoid loss in fidelity of the colors)
     - crank up lightsource->emission to 255,255,255 and tweak the color from there (to get a good contrast on the shading)
     - tweak the lightsource->height and the two emission-scales (and try to keep the light range really really really large before tweaking the rest of the light parameters!)
     - if doing nightmods, try to avoid manually toning down all images and materials, but rather just use the light emission settings
       including the new night->day slider (this will allow the user to tweak the brightness of the table on his/her own afterwards)
     - revisit all physics settings, even if you used VP9Physmod(5) before (only the re-enabled friction and scatter in the physmod5 case though)
     - take a look into the new material editor and assign a material to each object on the table
     - use flashers when doing special lighting effects/gi-changes/night mods (and tweak existing ones by playing with the opacity (can be >100%) and modulate options),
       otherwise try to stick with the newly redone (bulb-)light elements (flashers and bulblights are cheaper to render than other elements)
     - revisit CommandReference.txt for all commands that have changed names/behavior, were replaced or deleted


- a special thanks has to go out to our awesome alpha testers/improvers: Unclewilly, JPSalas and JimmyFingers!

- for all the changes regarding the core vbs script file package (like cvpmTrough,cvpmSaucer,BallMass,UseVPMDMD,UseVPMColoredDMD, the Controller abstraction (DOF,B2S,VPM,EM) and the new Coindoor key functionality)
  look into core.vbs for the full changelog


- physics mostly redone (also previously known as 'physmod(5)')
  due to this it is now also possible to enable vsync without physics sideeffects like stutter or bad aiming (set FPS limiter to 1)

  -> additional changes since physmod5, note that these will also -force- you to revisit existing physmod5 physics table settings:
     - friction is no longer ignored (e.g. it was always constant at 0.3 before) on the playfield, walls, slingshots, primitives, ramps, gates (and more?!)
     - scatter is no longer ignored for kickers and all kinds of collisions. also the global fallback behavior was changed: only if scatter < 0 then the global scatter value (=0.5) is used (before it was also used if scatter=0)
     - elasticity, elasticity falloff and scatter are now exposed as new playfield properties (before these were fixed at elasticity=0.2 and the other two at 0)
     - import/export of the physics options sets is fixed and can be used again
     - flipper properties strength,mass,return are wired up correctly and can be used from the script again
     - collision heuristics are adapted for all ball sizes (e.g. different from the default radius of 25), so it should be safer to use strange ball sizes now
       (note: remember to always also tweak the ball mass if changing the ball radius (the kicker now supports CreateSizedBallWithMass),
       as otherwise you will get a "floaty" ball (mass = k*radius^3)), thus (hopefully) no more ball-falling-through-playfield problem
     - add IsBottomSolid to Walls to have Walls optionally completely closed (bottom was always open)

  -> the data-format of the physics sets (*.vpp files) is basically the same, although the parameters inside are different, so unfortunately you need to set them up from scratch again
  
  -> kicker physics changed: The kicker bevel will influence the ball's motion and won't grab the ball like a magnet anymore.
     The old behaviour can be set via the 'Legacy' checkbox and is recommended for 'invisible' kickers like the trough as it can be much faster.
     Also use 'Legacy' on kickers that are (ab)used as triggers (e.g. to create balls once or 'warp' balls).

- changed the plunger physics to make the launch behavior more linear and controllable, for both keyboard and mechanical 
  plunger interfaces

- added new plunger visual styles, Flat and Custom, along with new properties for more control over the appearance; it 
  should now be possible to create a photo-realistic plunger with the precise appearance desired using the built-in
  plunger object

- Select Elements dialog improved. It shows the type of the element and if supported the used images. 
  
- new Camera & Light Mode added to the Table menu. This mode starts the player in a special mode where you can change backdrop & lighting settings with the following keys:
     left flipper key = decrease value
     right flipper key = increase value
     left magna save key = previous backdrop/light option
     right magna save key = next backdrop/light option

- new setting in the video preferences to setup rotation for cabinet mode (or otherwise standard desktop)
  this allows a table to be used in/setup for both DT and FS by setting the backglass options correctly for both modes

- adjust cabinets: in the video options select "Cabinet anti-stretch the ball" and depending on your screen you can enter a correction offset for the
                   aspect ratio. If you use a 16:9 screen use a correction offset of X=0.0 and Y=1.5. For a 16:10 screen use X=0.0 and Y=0.0 for best results.
                   This option only applies to rotated and fullscreen rendered tables (cabinet mode)!
                   Even with this option you might need to adjust the backdrop settings. The biggest problem for an egg-shaped ball is the Layback value.
                   Values over 70-80 are way too high and should be lowered. The scaling can become a problem too.
                   To find a better POV with a round ball over the playfield do the following:
                   - set the min/max slope to 0 and start the table in Camera Mode (menu Table -> Camera Mode)
                   - enter debug mode and activate "Throw balls in player"
                   - drop balls all over the table and adjust the POV settings

- new table field height setting in the "Dimension & Slope Settings":
  Now you can define a real playfield height. If this value is raised, all elements on the table are also moved by that amount.
  For example: "table field height"=50 means everything on the table is raised by 50 units. This allows for real ball tunnels and more.
- objects can be placed -under- the playfield or move 'through' the playfield (think Ringmaster or Trolls)
  and will still be visible through alpha channel/cutouts in the playfield image (note that only -dynamic- objects will show up though, due to restrictions in the engine)

- new rubber element
  rubber object can be rotated around the X/Y/Z axis and shown in the editor if the checkbox "Show In Editor" is checked

- the thickness of a wire trigger can be scaled. 0 is the default thickness. To make it thicker use values like 0.5, 1, 1.5, 2... 

- spinners are mesh based. If the spinner bracket isn't the right one disable the "Show Bracket" settings and you will only see the spinner plate.

- introducing drop/hit target element. A drop/hit target is now a separate VP element. It is mesh based and different shapes can be selected from a drop
  down list. A target fires a hit event and has it's own timer like walls when used as drop targets.
  
- kickers are mesh based. In the kicker settings you can set "Fall through" so that if a ball hits a kicker(hole) the ball will fall through the 
  surface which is attached to it. This only works if the wall is higher than the playfield, it won't work if the hole is on the playfield.
  
- gates are mesh based. Another option was added to the gate element "Two Way" if set the ball can roll from both sides through the gate

- flippers can now feature an image

- add material editor
  
  -> quick and basic explanation:
     - First of all select if you want to design a metal material (steel, gold, silver, aluminium, etc)
       or any other one (plastic, wood, rubber, etc)

     - Then select the base color of your material
       (note that this can/will be modulated by the (optional) image on your object(s) later-on,
        so if you need your object image to look as true to the original as possible, set the base color to full white,
        otherwise you can also just use the base color to change the brightness or colors of the object image)

     - If you selected a non-metal material you can now in addition add some subtle reflectivity via the glossy layer color
       (otherwise simply set it to full black, but leave at grey to full white for a more natural behavior)

     - Then select the shininess of your material (0.0 means very very dull reflections, 1.0 means perfect mirror-like reflections),
       of course this only has an effect on metals or if you used the glossy layer

     - For some materials it can now also be realistic to add an additional clearcoat layer on top of everything
       (otherwise simply set it to full black)

     - After testing the look of the material on an object (use a curved one if possible, e.g. the default rubber (with thickness >30) or a complex primitive),
       you can tweak the edge brightness parameter: Usually it should just be left at 1, but if you think the edges are unnaturally bright, reduce it

  -> pro tip:
     - In nature, each object has a bit of glossy, so try to -never- set the glossy layer to full black on non-metal materials!

- assign sound-,image-,material- and collection-manager to hot keys (F2,F3,F4 and F8)

- new shader based inserts/lights/bulbs
  bulbs are special in many aspects:
   - They optionally feature a built-in mesh that "emits" light to the viewer
   - One can use them to add a lighting effect over other elements (use the Modulate option to blend between additive (0) and multiplicative (1) behavior, try to keep this around 0.9 to best support the day->night slider)
   - In addition they can be used to add a lighting effect from below for all transparent materials (like playfield plastics and transparent ramps) via the Transmit option

- new shader based mesh ball

- new shader based materials/lighting (full HDR pipeline)

  -> due to the new lighting and materials the orientation of vertex normals on imported primitives is now extremely important!
     to test if everything is correct, try to tone down the environment emission scale and see if all your objects are correctly lit -only- from above

  -> always try to tweak the two lighting components (some lightsources above the table plus the environment image light surrounding the table) separately
     by setting one of the two emission scales to 0 and then configuring the other one on its own

  -> the new environment image -must- be in Latitude/Longitude format (see for example http://gl.ict.usc.edu/HDRShop/tutorial/tutorial04.php),
     and also keep the resolution low (512x256 should be enough)

  -> the night->day slider will scale these two lighting components, and in addition
     the script now offers NightDay, which returns the range in 0..100, so that additional tweaks can be done in the script, depending on this value
     this night->day setting can also be set automatically via the video preferences, but requires to fill in the correct latitude and longitude of your location
      (in decimal degrees,-90..90 (North positive) and -180..180 (East positive), like openstreetmap.org does)

- new (optional) playfield reflections
  This option is a table option and can't be blindly activated on all tables. Because authors have so many different ways to build tables it's nearly impossible to handle the reflection in every case.
  If you're building a table and you want to use this option the following rules apply:
  - the reflection only applies on the playfield not on upper playfield areas or separate walls used as a playfield.
  - don't overdo the reflection strength of the ball/playfield reflection. Depending on the playfield texture a value around 50-120 should be good enough. Otherwise it looks unnatural.
  - don't use decals of the size of the playfield as an overlay or you won't see the reflection neither.
  - the reflection effect is actually very simple. VP flips all static elements on the z-axis (z=0) and renders them into a texture. This texture is blended over the playfield. Therefore special care must be taken 
    for mesh primitives. You have to set the pivot point of a mesh well. If you try to compensate a wrong pivot point in VP by adjusting the xyz position it could result in a wrong mirrored element. You will notice it
    because e.g. a mirrored post isn't mirrored under the actual post instead it's rendered a bit below on the playfield and the reflection looks odd.
  - if needed, disable certain elements from the reflection via the respective flag in its options
  
- Ball reflection on playfield can be enabled/disabled via script for separate balls with "ReflectionEnabled". For example when you create a new ball from a kicker then: kicker1.CreateBall.ReflectionEnabled=1 activates the reflection on the playfield

- new (optional) color grading step
  like in movies or photography, one can now add an (almost) artificial color grading step at the very end of the rendering process
  (see https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/ColorGrading/index.html
   and skip to 'Color Correction' to learn more about how this is supposed to work and for a clean 1:1 mapped 256x16 LUT texture to start with, the default table also includes one as ColorGradeLUT256x16_1to1.png)
  you can load the 256x16 LUT texture via the Image Manager like any other image, and then select it in the Backdrop->Colors&Formatting options
  (it can also be changed dynamically via the ColorGradeImage variable of the table in the script,
   for example to change the look of a table completely (invert colors, make everything red/blue/whatever, etc))

  -> only after -finishing- up a table completely, you should use this functionality as the very final beautification step!
     (also make sure that there is not already a LUT selected in the backdrop settings when you take the screenshot in VP for the further tweaking)

  -> do not save the new LUT texture as jpg, but rather as lossless png or bmp!

- images/textures transparency is now -only- based on the alpha channel of the loaded images, no transparency color/hack support anymore

- images can now feature high dynamic range (HDR), via the .exr and .hdr file formats, which is supported on:
  - the ball image (use the Mirror Ball Map format, see http://gl.ict.usc.edu/HDRShop/tutorial/tutorial04.php),
  - flashers and (pass-through-mode-)lights and the background image (don't know where to get useful HDR images for these though),
  - and -especially- the environment image (use the Latitude/Longitude format, again see http://gl.ict.usc.edu/HDRShop/tutorial/tutorial04.php)

- add new PlayHit() and PlaySlingshotHit() function to the bumper / wall. If called the bumper/wall will play the hit animation as if a ball hits the element but without triggering the actual hit event.

- add LastCapturedBall function to the kicker element. It returns the last captured or the current captured ball. If no ball could be found or the ball is already destroyed an error message will be displayed

- EM Reels do not feature raw Text/Font input anymore, only Images (this was already unsupported in 9.9.X, but is now officially discarded)

- internal DMD support (access via script, input levels are 0..100 (or RGB/0..255 for DMDColoredPixels))
  to display the DMD, use a TextBox with the magic keyword "DMD" as text
  to be able to connect to VPM, use a recent VPM (2.6 or newer) and a recent core.vbs (3.44 or newer) and follow the instructions there
- DMDWidth, DMDHeight, DMDPixels (or DMDColoredPixels) to steer the DMD added to Table Script methods

- improved smoothness for ramps (centripetal Catmull-Rom splines)
- ramps can now in addition use the height parameter of their control points (its used as an offset in addition to the normal ramp behaviour)
- in the editor: control points of ramps have a new read-only "Real Height" information. The "Height Offset" is just an offset for the current height. 
  E.g.: Top/Bottom height of the ramp is 100. If you add 25 to the "Height Offset" the "Real Height" shows 125. This is more important if you use a sloped 
  ramp with bottom height 0 and top height 60 and add new control points on the ramp. The height information is interpolated from one control point to the 
  next one, so the "Real Height" shows you this value and the "Height Offset" can be used to easily adjust the height.  
- changed opacity/transparency handling for ramps (Alpha/Acrylic have been deleted, only the material opacity value is supported now)
- the control point for the bottom ramp has a blue color to identify which side of the ramp is the bottom one

- GetElement, GetElementByName, GetBalls added to Table Script methods to have simple access to the elements and all active balls on the table
- OnBallBallCollision(ball1, ball2, velocity) can be used as a Callback in the script to handle Ball to Ball collisions
- renaming of IsVisible properties (flasher, ramp) to Visible

- a whole lot of script-editor changes:
  Dwell Tool Tip
   When the mouse pointer is left to "dwell" over a keyword, the Script Editor can display additional information:

   e.g. for: 1056 dim scoringTimer:scoringTimer = 0 'How long DOUBLE SCORING will go on
    
   - The actual definition of the keyword. [dim scoringTimer]
   - The line number of the definition of the keyword. [Line 1056]
   - Any help/comment associated with the keyword. [How long DOUBLE SCORING will go on]
  Dwell start time and the display of the help/comment may be adjusted in the Code View preferences.

  Highlighting
   This is done by keywords that fall into the following categories:
    1. Visual Basic reserved words.
    2. Table Script Subs, Functions, Dims, Consts, Properties and any member of these.
    3. Table components.
    4. Visual Pinball Core.vbs file.
    5. Comments
    6. Literals
    7. Default Text
   The following properties of each keyword may be adjusted in the Code View preferences:
   Active, font, color, size, bold, italic, etc. 
   If a keyword is already defined outside the table script it will be highlighted in the original definition color,
   but the dwell tool tip will be of the re-defined keyword in the table script.

  Auto complete    
   Suggestions which keywords are displayed in a dropdownbox underneath your typing according to the characters you have typed.
   The number of typed characters before suggestions are displayed can be adjusted in the Code View preferences.

  Word highlighting
   When double clicking a word it will be highlighted throughout the Table Script.

- two new methods of ball decals added. If 'Logo mode' is unchecked the decal texture will be additively blended based on it's alpha values.
  This way you can add scratches to the ball (see the default table for an example). In 'Logo mode' the decal texture is blended as an overlay 
  (blend mode 'Screen' in Photoshop/Gimp) to apply a logo or a second image on the normal ball texture.

- flasher supports custom shapes and multi texturing. You can define two separate images and define a filter to blend these two images.
  in addition there is now a modulate option to define how the flasher blends with the underlying elements (0(=full additive)..1=(only modulate), try to stick with something like 0.9 to best support the day->night slider)
  plus the opacity and amount parameters can be set to values > 100%
  to fade a set of flashers in/out easily you can use the IntensityScale in the script, so that you do not need to use different opacity values
  look into the CommandReference.txt for additional changes to the functions that can be used
  
- collections can now group elements together. If you enable 'Group elements together' flag and you click on one element of the group all other members 
  of that group are selected. So you can move/scale/rotate them without multi-select element by element. If you want to select just one element of that group
  just shift-left click on the element and you can manipulate only that element. Unchecking the 'Group elements together' flag disable this feature for this collection.

- ctrl+mouse wheel zooms in/out. The old way of using ctrl+left click for zooming in and ctrl+right click for zooming out is still possible.

- enable "Throw Balls in Player" mode, and by pressing the middle mouse button a ball will fall from the table glass height onto the table. This way you can place some balls on tables if a wall is used as the playfield.

- extend right click behavior for multi-select to hidden items

- the property menu can now be a floating window (old behavior can be restored in the editor options)
  
- remove old shadowing code and replace it with optional screen space ambient occlusion
  additionally one can also enable ambient occlusion for dynamic objects (via the global video preferences and also the table options)

- its not necessary anymore to manually override the texture filtering quality in the global gfx cards options (NVIDIA control panel, etc)
  if you need HQ filtering, please only use the checkbox in the VP video preferences instead

- new 4x Anti-Aliasing mode that does brute force oversampling
  (can optionally be combined with VPs builtin FXAA or the control panel FXAA/SMAA/etc for even more smoothing)

- add third mode for FXAA: extreme (and retweak the quality FXAA mode)

- 3D stereo now also works on most Intel and AMD systems, not just on NVIDIA 
- removed 3D stereo AA, its always enabled now
- added 3D stereo offset, which can be used to offset the table "into" or "nearer to" the monitor

- add flag "Alternative Depth Buffer processing" to the video options
  use this option if you get the corresponding error message on table launch

- adaptive vsync works again, it will disable vsync automatically if FPS drop below monitor refresh rate (not on windows XP though due to missing functionality there)
  enable it by setting the FPS Limiter to 2 (1 will still be using 'real' VSync and any number above the monitor refresh rate (usually 60Hz) will just limit the FPS)
  - additional note: remember to -not- disable Aero on Windows 7/8/10 to be able to use vsync!

- optional texture compression to save some gfx video memory (at the cost of rendering quality and loading time)
  (for now the textures have to be a multiple of 4 in both x & y resolution to make them compressable.
   this can be abused though to 'disable' texture compression on certain critical textures by making them -not- a multiple of 4)

- support primitive vertex sizes > 65535 and redo primitive drawing in the editor-UI 
  (there is now a new setting for each primitive, set to 0 to switch to the old approximate drawing mode (usually fast),
   1 to draw each and every triangle (usually slow) or inbetween to approximate the outlines of the object (lower values are faster))
   
- primitives can optionally be reduced for the use in the physics core (so that highly detailed objects do not cause stutter on collisions)
  by setting the new 'reduce polygons' options (0=no reduction and no slowdown on loading .. 1=high reduction of polygons and slower loading)

- export of the entire table to an .obj file (Menu File -> Export -> OBJ Mesh)

- mesh import dialog added. The options are:
  * "Convert coordinate system" : Converts a mesh to the left handed coordinate system used by DirectX
  * "Center mesh to it's midpoint" : The midpoint(pivot) of a mesh is calculated and the whole mesh is moved so that the midpoint is at the origin (0,0,0)
  * "Place at primitive's position" : The old/normal placement function. The mesh isn't moved and will be placed relative to the primitives base position
  * "Place at mesh's absolute position (use mesh's middpoint)": The mesh is transformed so that it's midpoint(pivot) is at the origin (0,0,0) and then moved to it's absolute position
                                                                where it was placed in the 3D editor (e.g. Blender)
  The last option is useful for the following workflow:
   1. export the table as one huge .obj file (File -> Export -> OBJ Mesh)
   2. import this obj file into your 3D editor
   3. place additional meshes on the table or replace existing objects
   4. export each object you have added or replaced into a separate .obj file
   5. import each .obj file and in the import dialog select "Place at mesh's absolute position (use mesh's midpoint)"
      so that the object's pivot point will be the object's midpoint and the base position of the primitive is changed to the position from the 3D editor

  * "Import mesh's material" : Loads the corresponding .mtl file and adds the first material in that file.
                               For instance: if the mesh .obj file is called "bumper.obj", then there should be a file "bumper.mtl" in the same directory.
							   But only some basic material settings are imported due to the limited .mtl format, for Blender the used material parameters are:
                                Blender diffuse color -> VP base color
                                Blender specular color -> VP glossy layer
                                Blender specular hardness -> VP shininess value
                                Blender transparency alpha value -> VP opacity amount
                               When imported the primitive has the imported material automatically assigned.
							   Note that any textures aren't imported automatically though, this must be done as usual with the help of the image manager.

- add additional debug mode when pressing F11 multiple times to visualize the content of only the static buffer.
  this can be used to optimize for performance by trying to put as many elements as possible into this buffer, for example:
  - objects that are un-necessarily using a material with opacity enabled
  - objects missing the static rendering flag (if there is one for this type)
  - walls that can drop but never use this flag

- reactivate old VP9.0 easter egg (and improve it :))

- new external audio library for music playback (BASS)
  this allows to use different formats than just MP3, e.g. OGG

- use miniz library to compress primitives

- 64bit port (handle with care, might still cause issues)

- script editor updated to use custom extensions within Scintilla (based on 3.6.2)

- technical compile note: make sure to install Microsoft SDK 5.0,7.0A,7.1 or 7.1A, if you compile VP and get missing header errors (optionally set the include path inc\winsdk)

VP 9.9.2 Changelog
------------------------
- new plunger code (see Plunger pdf)

- fix text selection if in previous selected text box a change was made

- extend right click behavior for multi-select to hidden items

- fix EMReel crash when image is missing and reel value is nonzero

- updated to latest FreeImage.dll (3.17.0)
- script editor updated to use latest scintilla (3.6.2)

VP 9.9.1 Changelog
------------------------
- fixed some memory leaks

- fixed rendering of overlapping balls

- include optional nudge filtering (selectable in the keys dialog)
  and remove implicit dead zone handling (if you have the dead zone setting at 0% and now experience problems, set it to at least 1%)

- native support for the Pinscape Controller

- script editor updated to use latest scintilla (3.5.1)

VP 9.9.0 Changelog
------------------------
- rendering engine has been ported to DirectX 9 and now takes much better advantage of 3D hardware

- Region Updates, Region Optimization, Alternate Render are not needed anymore due to the new graphics pipeline and have been removed

- true fullscreen setting has been removed due to incompatibility with VPinMAME. Instead, a windowed fullscreen option has been added to the list of video modes

- add options for wire ramps (define diameter and distance x/y of wires)
- add sphere mapping to wired ramps if an image was assigned to a wired ramp

- add CurrentAngle function to spinner

- add depth bias option to flasher, light, primitive and ramp to fine tune depth sorting

- enable NVIDIA Optimus cards by default

- new video setting: Force anisotropic texture filtering. This results in higher quality results, but can affect performance on lower end cards

- stereo 3D AA is now basically for free and can always be enabled if stereo 3D output is used (currently stereo 3D is limited to NVIDIA only though)
  Note that the depth/parameters of stereo had to be changed. As a positive side effect, the two stereo parameters are the same for most tables now,
  so there is now a global setting in the video preferences. These can still be overwritten per table though.

- FXAA now has two modes: Fast (similar to old setting) and Quality

- new FPS limiter field in Video Options:
  0: disable frame limiting
  1: enable vsync
  If set to anything higher than the monitor refresh rate, the engine will limit the FPS to this rate (but of course without using real hardware vsync).
  Adaptive vsync had to be disabled for now for compatibility with Windows XP.

- new field "Maximum prerendered frames" in Video Options:
  Lowering this value will reduce input lag and sometimes also stutter, but may come at a performance cost.

- running as administrator is no longer required (except for tables which write high scores to system directories). UAC setting removed from executable.

- updated to latest FreeImage.dll (3.16.0)
- script editor updated to use latest scintilla (3.4.1)

- technical note: the minimum version to compile VP is now visual studio 2008 (incl. feature pack)

- take a look at https://github.com/c-f-h/vpinball/wiki/Table-Upgrade-Guide for some additional help with problematic VP 9.2.1 (or lower) tables (and more)

VP 9.2.1 Changelog
------------------------
- this is the final release to be based on DirectX 7

- add "To Collection" to the context menu to assign a selected element to a collection
- add moving of single selected collection in the collection manager

- add CurrentAngle() function to the gate object

- add "Is Toy" checkbox to disable collision handling on mesh primitives completely. 

- add collision detection to mesh primitives together with hit threshold and hit event

- add Z offset to the backdrop options. With this settings you're able to zoom in/out the table without changing FOV/Inclination/Layback settings
- add Z scale option to the backdrop options. With this setting you're able to reduce/increase the overall depth of a table.

- add table dimension manager for an easy way to calculate real table dimensions into VP table units and vice versa

- add a ball throwing feature to VP. To use it check "Throw Balls in Player" in the debug window (ESC -> "Debug Window") and by left clicking and holding the left mouse 
  button you create a new ball and it throws the balls in that direction you move the mouse cursor when you release the left mouse button. If you click on a non 
  moving ball you can reuse that ball and no new calls will be created. A right click on a ball will remove that ball from the table.

- add touch support for tablets (windows 8 and upwards)
  current mapping:
   upper left - add credit
   middle upper left - left magna save/2nd button
   middle lower left - left flipper
   lower left - start
   upper right - quit (press for 2 seconds to exit VP completely)
   middle upper right - right magna save/2nd button
   middle lower right - right flipper
   lower right - plunger 

- add Alpha-Flasher element. Use this element to add (additive) alpha flashers instead of abusing the alpha ramp element. The flasher is a 'dynamic' element, that means it is not pre-rendered
  and it'll be updated every frame.
  Limitations:
  If 'Display Image In Editor' option is selected and the flasher is rotated the image won't rotate due to a DX7 limitation.
  If the flasher is not an additive alpha flasher you can colorize the image with 'Color' if you don't want that effect set the color to blank white (RGB 255,255,255).

- add height offset to bumper element

- add additional (optional) parameters to PlaySound to increase/decrease the frequency, apply all the settings to an already playing sample and choose if to restart this sample from the beginning or not
  all parameters are now: PlaySound "name",loopcount,volume,pan,randompitch,pitch,useexisting,restart
  pitch can be positive or negative and directly adds onto the standard sample frequency
  useexisting is 0 or 1 (if no existing/playing copy of the sound is found, then a new one is created)
  restart is 0 or 1 (only useful if useexisting is 1)

- per table setting of adaptive vsync (-1 = default, 0 = off, 1 = automatic detection, anything else: refresh rate in Hz)
- change per table settings for AA, FXAA and ball reflection (-1 takes the default from the video preferences, 0 forces off, 1 forces on)

- tweak key input code to save one frame (or more?) of lag

- change the old 'Physics Max.Looptime' setting to 'Physics Max. Loops'
  it allows to specify the maximum number of iterations spent in the physics update.
  by setting it f.e. to 1, the rendered frame updates will -always- match the physics updates, everything above 1 allows for multiple physics updates per frame
  (2, 3 or 4 can be good values for this, as it slows down the physics temporarily if the FPS drop below 50, 33 or 25 in these cases).

- import/export of global physics options sets
- import/export of local/table physics options sets (that could then be reused globally of course and the other way round)
  Note that for local/table export the first found flipper is used to export the flipper physics settings (and for import all flippers will be assigned with the same settings)

- add optional ball trails/motion blur (also adjustable per-table)
- add script option 'DisableLighting' for balls to disable lighting. This also allows to change the color of the ball via 'Color' directly

- add enabled flag to flippers

- separate/new texture maps for the lighting of lights (more details) and bumpers (brighter)

- fix problem with DMD/VPinMAME window being hidden behind VP window

- secondary/backglass sound output (by DJRobX)
  if a sound effect contains 'bgout_' in the name or '* Backglass Output *' in its path then it is played via the secondary sound output (music always)
  this can also be done with existing tables by using the new 'To BG Out' button in the sound manager

- script editor updated to use latest scintilla (3.3.9)

VP 9.2.0 Changelog
------------------------
- alpha ramps can now select to trigger region updates (also via script: Toggle via UpdateRegions or a single one via TriggerSingleUpdate) to avoid having to use the refresh-light trick
- primitives can now select to trigger region updates (also via script: Toggle via UpdateRegions or a single one via TriggerSingleUpdate) to avoid having to use the refresh-light trick

- add 'real' 3D mesh primitives, these can be loaded via .obj files (for example exported out of Blender)
- add lighting option for primitives
- add sphere mapping to 3D mesh primitives (useful to fake reflections)
- add static rendering feature to primitives: if you set the 'Static Rendering' option, the primitive will be pre-rendered and you can't change any parameters from within the script. This is
  helpful if you want to use 3D meshes for posts or toys which won't be animated at all.
- add static rotation for primitives (ObjRotX, ObjRotY, ObjRotZ) to change the basic orientation of a primitive. The old rotation/translation settings animate the primitive. 
  all rotation/translation settings can be used out of the script.
- rotation/translation of primitives can be changed from within the script with the properties .RotX, .RotY, .RotZ, .TransX, .TransY, .TransZ, .ObjRotX, .ObjRotY, .ObjRotZ
  or for backwards compatibility you can use .rotandtrans0-8

- add configurable lightsources: point, directional, spot; these share the same coordinate system as the table geometry (angle/rotation/scale independent! setting the direction of a directional light to 0,0,0 restores the old behavior though)
  note that DX7 is still vertex lighting based, thus all lit objects MUST feature reasonable triangulation, like f.e. huge walls (the playfield itself is triangulated 100x100)
  look at the built-in default table to get a feeling for the setup of these lightsources
- add exact lighting option to table (if you experience lighting problems with dynamic ramps, primitives or the ball, please enable this)
- add shadow orientation. In the table options under Lightsources you can change the shadow orientation by adding a factor to X and Y. Doing that you can change the projection of the shadow on the table.
  This is needed if you use the extra light sources to create a more real lighting/shadowing.
- add flag to walls and gates to disable lighting and shadows (to assist in using fully artist driven lighting)
- add flag to light objects to disable the lighting calculations when the 'On Image' is set (so that behavior is the same as when only using a color)
- add lightmap for light objects: If option "'On Image' Is Lightmap" is checked you can define a lightmap for the on image. If the light is switched on the lightmap is rendered together with the off image.

- add flag for alpha ramps to optionally use additive blending (to cope with 2D-lighting-hacks like halos/flashers)
  note that in order to implement fake GI/lighting or flashers via alpha ramps you should follow the following guidelines:
  1) if multiple alpha ramps overlap, then the drawing order (see below) and the height level of these ramps have to match, so that the lowest ramp gets drawn first, etc (make sure to move same height alpha ramps to slightly different heights first!)
  2) uncheck the 'normal 3D stereo' to not have each 3D user have to do this on his/her own (please do this only for lighting or flashers!)
  3) to go for maximum performance disable visibility or the alpha flag for turned off lights/flashers via the script

- add modern plunger texture mapping support and correct coloring

- add per-table sound & music volume settings (0..100% scaling of the global VP settings)
- add per-table software FXAA setting (only works if also enabled in the video settings)
- add per-table alpha ramp accuracy
- add per-table region updates and region optimization (-1 takes the default from the video preferences, 0 forces off, 1 forces on)

- add layering of table elements
- add selection dialog where you can select one or more elements out of a list of all elements in the table
- add easy selection mode if you right-click on an element in the context menu you can select those elements which are stacked under the mouse cursor
- add drawing order (via 2 modes: Hit and Select), you can move elements up/down in a list to change the drawing order
  Hit:    If you click on an element all elements which are over/under that clicked element are shown in the list box
  Select: If you select a bunch of elements, then the selected elements are shown in the list box
- add editor panning feature. In the editor hold ALT and move the mouse and the view will change in the direction the mouse was moved. 
  It just reacts on mouse movements if you don't move the mouse nothing will happen.

- add reflection option for balls (configurable per table). If you enable this option the ball is mirrored on the table. With reflection strength you can define how much the ball will reflect. 
  If the value is too high the mirror effect will look odd.
- add fake antialiasing(AA) as a global option in the video settings and a per table setting
- add 8 sets of global physics options to tweak some of the table and flipper settings that can then optionally override the table settings (when enabled in the table physics options and/or the flipper physics options)
  this enables quick changes to flipper and physics settings for a whole bunch of tables (for example to tweak for less input lag or adapt the ball simulation/'speed')
  the 8 different sets can be used f.e. to tweak for different hardware generations or the manufacturer

- add additional (optional) parameters to PlaySound to set the pan and/or randomize the pitch of the played sound effect: Instead of  PlaySound "name",loopcount,volume  one can now use  PlaySound "name",loopcount,volume,pan,randompitch
  pan ranges from -1.0 (left) over 0.0 (both) to 1.0 (right)
  randompitch ranges from 0.0 (no randomization) to 1.0 (vary between half speed to double speed)
  so f.e. PlaySound "FlipperUp",0,0.5,-1.0,1.0 would play the sound not looped (0), at half the volume (0.5), only on left speaker (-1.0), with varying pitch (1.0)
  look at the built-in default table to get a feeling for the setup of these parameters

- script editor updated to use latest scintilla (3.3.6)
- add multi comment/uncomment feature to the script editor
- add function list to the script editor

VP 9.1.5 Changelog
------------------------
- add flag for ramps to optionally make them not influence the 3D stereo rendering (to cope with 2D-hacks like halos/flashers/GI)
- expose new 'Region Updates' in Video Options (disabling this can be faster on some graphicsboards, especially NVIDIA Optimus Laptops)
- expose new 'Region Optimization' in Video Options (disabling this can help issues with NVIDIA AA, enabling this can help performance and fixes issues with NVIDIA FXAA)
- optimize alpha ramps a bit
- enable some caching for DirectX functions to help performance
- fix more problems with primitive rendering
- correct issue with adaptive vsync
- fix some micro stuttering on multi-CPU systems
- add purely software/CPU-based FXAA workaround (please do -not- enable FXAA in the NVIDIA driver then if you need to use this!)
- cleanup some of the UI
- add correct UAC setting (no more 'Run as Administrator' necessary)
- add large address handling (no more '4GB patching' necessary)
- replace default ball/lamp images and some of the default table settings (mainly physics related)
- correct stylized table rendering in backdrop editor view
- fix command line parser (problems with running tables like playboy from hyperpin, etc)
- optimizations/small fixes
- updated to latest FreeImage.dll (3.15.4)

VP 9.1.4 Changelog
------------------------
- corrected primitive rendering - thanks Toxie!
- optimizations/fixes
- Added support for different sound device output

VP 9.1.3 Changelog
------------------------
- Added controller button support to key options for all controllers - Koadic!
- Added single wire ramp object type - thanks Rascal!
- Added modern plunger type - thanks Rascal!
- Added plunger color options
- Added support for 3D TV rendering - Toxie!!!

VP 9.1.2 Changelog
------------------------
Fixed bugs:
- Set as Defaults is ensured safe - loading a table will ignore the stored defaults to ensure the table is loaded how it was saved
- Deadzone slider is modified to reflect how deadzone worked in previous revisions
- SSE was going to be utilized, but magnets reacted sluggish, so reverted to 'fast' code without SSE again.

VP 9.1.1 Changelog
------------------------
Fixed bugs:
- Copy and Paste Decals
- Layback causing Graphic glitches with ball decals
- Radio buttons in Video Options Dialog
- Tabstops in Backlass Options
- unhandled exception with script errors
- Text Decals not showing
- Kickers and Triggers that are in the same position caused lockups
- transparency issue with 32bpp bmp Files
- bumpers and slingshots were disabled at start of the game when not visible
- Textures were cropped at MaxTexDim at very special conditions
- Alpha Ramps were not showing with Balls created from script.
- Textures near screen border were distorted on some tables
- Scale Dialog default field was checkbox - changed to scaleX-value

New features:
- Added slider for Alpharamps Accuracy. If Alpharamps are causing performance problems (and they will likely do!), try setting this slider to the left. Ramps are displayed with less surfaces then.
- New experimental feature: Ball stretching against table and monitor stretching. Three options: 1st: like before, 2nd: don't stretch ball, 3rd: don't stretch ball and take Pixel aspect ratio of monitor into consideration. Choose ( R) Monitors only if you have a rotated Windows desktop.
- Implemented right click 'Set as Default'. This options sets the current properties of an object as the new defaults for that object type.
- little optimizations

Important:
Tables made with 9.1.x may be incompatible with older versions due to the new features, but tables made with 9.0.x can be loaded and played in 9.1.x.

VP 9.0.10 Changelog
------------------------
Thanks to Scrooby's help, I think we have an appropriate deadzone interface now.  It is a global setting for all tables and doesn't affect the keyboard for X and Y axis.
HD Render and Reorder has been moved to video options

You can now set maximum texture dimensions for lower powered graphic hardware without exporting images (BMPs will still need to be exported and resized if they are too big)
*Added Kicker.CreateSizedBall (float radius) - Returns Ball
*Added Video Option for Chipset graphics that cannot create big textures (only non BMPs supported). Redesigned dialog.
*Added Layback feature (Should we rename this feature? I don't know a better name. Does anybody have a better description?).
Layback is located under the field of view field on the backdrop options for the table.
Basically it appears to change the vertical orientation of the final rendered table.  It is an alternate version of Field of View rendering, and will only be available from 9.10 and newer.
Field of View must be greater than 0 for Layback values to be used to render a table.

Items on table are now displayed in a non-kartesian world to give the viewer the imagination to stand more in front of the table instead of flying over it, when using FOV.

*Fixed Near-Plane Bug with inclination set to 0.
*Added Support for various Picture formats (*.jpg;*.jpeg;*.png;*.gif;*.ico;*.IFF;*.PCX;*.PICT;*.psd;*.tga;*.tiff;*.tif)
*Added Alpha Support for Ramps

More optimizations and testing by Toxie

Cupid added PNG support using FreeImage.  VP 910 will require freeimage.dll to be located in the directory VP is being loaded from - perhaps someday we'll have PNG built into VP to eliminate this dependency

As required by the FreeImage Public License:
If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. (such as this changelog file)
"The contents of this file are subject to the FreeImage Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://freeimage.sourceforge.net/freeimage-license.txt
Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License."
No modifications were made to the freeimage.dll file, or internal freeimage source code, so that covers our use of the dll in a free capacity.


VP 9.0.8 Changelog
------------------------
Corrected keyboard handler for message boxes
implemented 10% dead zone to motion/slope/analog axis controls


VP 9.0.7 Changelog -- 9.0.6 skipped
------------------------
emreel lock not loaded after save (noah)
ball needs to be allowed outside playfield area (scapino)
removed remaining minimum black masks for ramps, reels, images, lights, kickers, and top and side surfaces
Corrected volume control

Plunger scatter velocity requires global table difficulty to be >0
Global table difficulty valid values from 0.0 to 1.0 - affects amount of scatter on walls as well as plunger variance


VP 9.0.5 Changelog
------------------------
December 27, 2009 - updated VP9 for your playing amusement. Approved by Nanotech Entertainment.
changelog

1) Finalized PinballWizard and ushock motion controls - should be accurate for X/Y/Z axis and no more changes should need to be made to it again

2) added Plunger.MotionDevice scriptable property - 0=nothing connected, 1=PinballWizard, 2=uShock Board

3) Plunger.Position now returns a value from 0-25.  No scripted math calculations are required.

4) Export Sound now works for all supported sound formats

5) EMReels now have overlapping transparency compatible with Randy's vp8.1 implementation

6) added Plunger.Visible property - this is not scriptable, but allows the plunger to not be rendered

7) Corrected key mapping for Add Credit 2 - you can now remap that key

8) Key Preferences screen is now properly fixed for accepting new keycodes - before if you clicked a bunch of buttons without pressing a key it looked messy with ???? in each clicked button field, now it is neater.

9) corrected crash to desktop error when table name was deleted from properties window - this error had existed since the inception of visual pinball

10) Reordering of table elements added - this will increase compatibility with ATI cards.  This changes the rendering order of all table objects.
DROPWALLS
BUMPERS
GATES
SPINNERS
FLIPPERS
LIGHTS
/RAMPS - needs more work

Textboxes are drawn first, EMReels are drawn second, Decals, Kickers, Acryllic Ramps are drawn last

11) Corrected issue with control points - left mouse button held down followed by right mouse button was not firing the left button release code routine, causing the undo buffer to skip all subsequent events.

12) Restored 16-bit display modes.  Windowed mode uses your desktop color depth.

13) Translate now works for Textboxes and EmReels - select more than 1 item to get the option.

14) Updated compiler to VS Net 2008



VP 9.0.4 Changelog
------------------------
December 6, 2009 - updated VP9 for your playing amusement. Approved by Nanotech Entertainment.
changelog

1) worked some more on the pinball wizard plunger "Z" axis
2) corrected attached joystick/gamepad interference with the player - For those game controllers please use software like Joy2Key
3) removed ball blurs, as well as frame updates from spinners, gates, and moving objects will be smoother with increased framerate.
4) restored functionality of RGB 0/0/0 for invisible gates, spinners, flippers, and bumpers
5) Corrected unitialized/unvalidated info for loaded flipper and textbox settings.
6) Removed requirement for msvcr71.dll


VP 9.0.3 Changelog
------------------------
October 12 2009 - updated VP9 for your playing amusement. Approved by Nanotech Entertainment.
changelog

1) Edit Properties Pane status is now corrected. It has been broken since tech beta 5. It is persistent, meaning if it was visible last time vp was open, it will be visible next time you open vp. Edit/Options now works again.
2) VP8 Colored slingshots are now available. This is fully compatible with Randy's vp8 implementation
3) PlungerName.Position is now available to the script. This will provide a raw value of the mechanical plunger for Pinball Wizard and Cabinet users. Divide the returned value by .04 to get a number from 0-25. You can then base an emreel, wall animation, or other graphical representation on that number to custom animate the plunger object. You could also use the mechanical pinball wizard plunger as an entirely separate type of interface, with accurate pull strength - ie pool cues, balloon/rubber band/spring tension, I'm sure you can come up with more.
4) Nudge has been reversed. A right nudge - moving the machine to the left, moves the ball to the right. A left nudge, moving the machine to the right, pushes the ball to the left.
5) Ball decals work again.


VP 9.0.2 Changelog
------------------------
1) Fixed command line options
2) Fixed windowed mode
3) Fixed checkboxes
4) Corrected reversed pinball wizard plunger
5) fixed crash bug on exiting unsaved tables
6) corrected version display
7) remapped ball diagnostic key from "B" to "O"

VP 9.0.1 Changelog
------------------------
 updated VP9 for your playing amusement. Approved by Nanotech Entertainment.
1) Fixed Crash on exit
2) enabled blinking lights
3) EMReels & Decals enabled by default


VP 9.0.0 Changelog
------------------------
December 2 2008 - VP9 for your playing amusement. Brought to you by Nanotech Entertainment.
FEATURES
    * Optimized for vpm.
    * LOTR runs close to full speed with emulated sound.
    * Ball blurring/stutters/etc have been greatly reduced.
    * This still has lag/issues with 26 balls in play on Johnny Mnemonic.
    * Translate locked triggers.
    * Plunger and all other objects can be locked in the editor.
    * Sound/graphic exporter/table unlocker.
    * Dual display span mode support so vp has full control over the backbox display as well as table.
    * Table rotation - 360 degrees possible.
    * Full physics options for slope, oblique correction, flipper settings, ball dampening, scatter angle, friction, gravity.
    * Table scaling support X+Y.
    * Table bottom height - set the bottom of the table lower than the playfield surface for realistic holes.
    * Scriptable exit table to desktop method.
    * Reduced engine crashes.
    * Support for Pinball Wizard Input Controller.
