Ripley's Believe It or Not¶
A multi-year VPW project (2020-2025) for the Stern 2003/2004 Whitestar platform. The development lifecycle produced extensive knowledge on 3D insert techniques, Blender ramp workflow, PWM flasher integration, physics tuning, and release QA. Key contributors: benji084 (rendering/baking), iaakki (scripting/inserts), Flupper (insert techniques), Knorr (camera matching), bord1947 (physical construction), apophis79 (PWM/scripting), and sixtoe (VR).
Build Notes¶
Playfield Dimension Verification¶
Before investing significant effort, verify playfield dimensions against the real machine. Diagonal measurements (sling post to ramp post, flipper to orbit) taken on the real table revealed the playfield image had skew issues and the top orbit extended too high. Without a proper playfield scan, dimension inaccuracies compound through the entire build.
Physical Scoop/Subway Construction¶
Instead of destroying balls at kickers and teleporting them, build a physical subway so the ball visually interacts with all elements. The scoop edges should have a slight bevel so shots are not 100% binary.
Metal Wall Rattle Fix¶
Back metal walls that produce unwanted rattle sounds when balls pass through orbit loops can be fixed by increasing the hit threshold on those wall objects.
Layer Organization¶
Organize VPX table objects into logical layers: physics layer (collidable objects), main visual layer, subway layer, quarantine layer (for broken/disabled objects). Good layer organization makes debugging much easier.
dSleeves vs dPosts Collections¶
Sleeves (red objects with rubber covering) go in the dSleeves collection. Small pegs/posts (white rubber rings) go in the dPosts collection. dSleeves have more damping than dPosts. Getting this wrong makes rubbers feel too stiff or too bouncy.
Pop Bumper Radius¶
Collision radius should match the lower physical body (~38 units), not the decorative plastic cap (~45 units). Oversized radius makes bumper interactions feel wrong.
Scoop Entrance Width¶
A scoop entrance was only 53 units wide, barely wider than the 50-unit ball. The entrance should be at least 52 units wide, but wider is better. The exit can be tilted slightly uphill to compensate for table tilt.
TargetBouncer Removal for Standups¶
TargetBouncer code can cause extreme bounces on standup targets, especially near ramp entrances. For RBION, removing TargetBouncer from standups and just increasing elasticity produced better results.
Plastics Must Be Primitives¶
VPX walls have hard-coded depth bias that cannot be changed. All plastics should be converted from VPX walls to primitives so depth bias can be individually tuned, eliminating Z-fighting artifacts.
3D & Art¶
Insert Text Recreation¶
Match the original fonts precisely. RBION used Arial Black for uppercase text and Impact for some elements. Vector format future-proofs for resolution changes.
PSD Alpha Mask Gotcha¶
When working with insert alpha masks in Photoshop, transparent areas under the alpha mask must be filled with black, not white. White areas cause unwanted glow or bleed-through in VPX rendering.
Per-Insert Shadow Technique¶
Flupper's insert shadow technique creates per-insert AO-like shadows that parallel the text baseline of each insert, rather than casting from a single light source.
Screen Printing Dot Patterns¶
Playfield scans may show visible screen printing dot patterns from the original manufacturing process. These are normal artifacts and can be left for authenticity or smoothed carefully.
Environmental Image Impact¶
Changing the VPX environmental image dramatically affects the table's overall look. It affects all reflective surfaces globally -- choosing an appropriate one is critical.
Glossy Plastic Overlay Technique¶
Model the geometry of the plastic shape, render just the plastic material with specular highlights, and composite over the existing texture.
Pre-rendered Lighting Workflow¶
The goal is to pre-light everything in a 3D application (like TOTAN and Addams Family). Render the full table scene with proper lighting and use baked textures in VPX.
POV-Dependent Bakes in VR¶
Baked textures rendered from a fixed POV look poor in VR because the viewer moves around the table. Find methods for good refraction without locking to a single viewpoint.
Matching VPX POV Camera in 3D App¶
The VPX POV can be matched in Cinema 4D (or other 3D apps) so pre-rendered textures line up with VPX's camera perspective. Critical for ramp baking and pre-lit table effects.
Octane Render Transparency¶
The "Affect Alpha" checkbox in Octane Common settings allows the baking camera to include transparency directly in the rendered texture.
Depth Bias Ordering¶
Higher depth bias values render first (behind), lower values render in front. Playfield is at 0, sub-playfield uses positive values, above-playfield uses negative values. VPX walls have hard-coded depth bias and cannot be adjusted.
Blender Ramp Workflow¶
Correct order:
- Apply Solidify modifier (keep a copy)
- UV map on the solidified mesh
- Add Subdiv Surface (do NOT apply)
- Render/bake textures with Subdiv active
- Remove Subdiv
- Export without Subdiv
Never apply Subdiv then decimate -- it destroys sharp edges.
Mark Edges Sharp and Mean Crease¶
After applying Solidify, mark all appropriate edges as Sharp (Ctrl+E > Mark Sharp, turns light blue). Use Mean Crease (Shift+E, slide to 1) on edges that should stay crisp during Subdiv (turns pink). Apply to bottom edges, material thickness edges, and hole edges.
Bake Margin¶
Use at least 3 pixels for the margin value. UV islands should have 3-4 pixels of space between them to prevent visible seams.
VLM Dual Primitive Technique¶
Two primitives for the same object with different depth bias: the inner image shows the object without lighting, the outer adds only light using additive blend mode controlled by .opacity.
Flupper Bumper Cap Complexity¶
Flupper bumpers are the most complex primitive/material/light/depth-bias setup in VPX. One cannot simply swap a new cap -- the entire init system, materials, lights, and fading code are interdependent.
Scripting¶
DL Insert Implementation Workflow¶
- Disable all insert lamp bulbs first and make inserts work using DL only
- Swap inserton material to correct color for each on-primitive
- Once DL looks good without bulbs, re-enable lamps at very low intensity (3-5) for ball reflections
- Raise bulb height from -7 to -3
The insert should look good without the bulb first; the bulb is only for ball reflections.
Right Flipper Angle Must Be Negative¶
nFozzy flipper trick functions rely on flippers at ~120 and -120 degrees. A right flipper set to 240 degrees looks visually identical to -120 but breaks many physics functions including flipper nudge and live catch. This setting lives outside the physics tab and is not exported by VPX's .vpp export.
PWM Flasher Implementation¶
Full setup:
- Set
UseVPMModSol=1before LoadVPM - Initialize SolMasks with appropriate BulbType
- Set up SolModCallback array mapping solenoids to Lampz.SetLamp
- Write callbacks for each dome with power curves on opacity/intensity components
Whitestar PWM Compatibility¶
UseVPMModSol=1 was never cleanly implemented for Whitestar hardware. Options are UseVPMModSol=0 (traditional) or UseVPMModSol=2 (all modulated, requires adapting script for float callbacks).
Lampz Conversion from nFade¶
Replace the lamp assignment block (NFadeL/NFadeLm calls) with Lampz.MassAssign and Lampz.Callback statements. GI uses GICallback (binary) or GICallback2 (stepped).
GICallback2 Output Ranges¶
With UseVPMModSol=2: outputs 0 to 1 (float). With UseVPMModSol=1: outputs 0 to 8. All GI level multipliers must be adjusted when converting.
Duplicate Switch ID Fix¶
When two targets must trigger the same switch, give one a unique ID like 132 and use vpmTimer.PulseSw switch mod 100. The mod 100 operation works universally.
Flupper Dome Fading with Power Curves¶
Power curve exponents (^0.7, ^2, ^2.5, ^3) on different dome components simulate incandescent filament persistence. Without these, PWM flashers look "flat." Lampz FadeSpeedUp/Down values must be much higher for domes than normal lamps (e.g., 255/100 up and 255/300 down).
Troubleshooting¶
Duplicate VPX Objects Crash¶
Two light objects with identical names stacked on top of each other crash VPX when you delete one. Can happen when copy-pasting objects with full-length names (VPX appends an invisible number).
Mixed-Up Primitive and Lamp Numbers¶
When one primitive and lamp number get swapped in the DL mapping, the wrong insert lights up. Extremely hard to spot visually -- requires one-by-one verification.
Playfield Mesh Ball Fall-Through¶
Some meshes let balls fall through at certain points with no clear cause. Workarounds: delete and reimport the mesh (works ~50% of the time), or place hidden walls at problem areas.
DL Zeroed in Older VPX¶
Opening a 10.8 table in 10.7 causes DisableLighting values to be zeroed, breaking all DL-based insert lighting.
Standup Target Orientation¶
Visual primitives at 240 vs -120 breaks TransY animation. The inclined collidable prim behind the target uses CorTracker to redirect the ball.
VR Backglass Brightness¶
Ball reflections near flippers can blow out the ball entirely in VR. Tune VR backglass intensity separately and adjust UpdateBallBrightness.
VPX GL Debugger Workaround¶
Set the GL window size to one pixel less than actual screen size in both width and height. This prevents true fullscreen and allows the debugger to appear.
Best Practices¶
Licensing¶
Never include Zen Studios/PFX3 or Pinball Arcade assets directly. Using them as geometry reference (tracing paper) is acceptable since the final product contains no licensed assets.
Release Strategy¶
For physics-only updates and playfield touchups, offer changes back to the original author rather than releasing a separate mod. A separate release is justified only for substantial changes.
POV Boundary Objects¶
Adding objects outside the playfield boundary (like a primitive apron) can completely mess up POV values. Two tables with identical POV XML can look different if one has objects extending beyond the boundary.
Resources¶
- Farsight Pinball Arcade
.rezfiles can be extracted using pba-tool for rough reference meshes (measurements are not always accurate) - Use the same environmental image in both your 3D app and VPX for consistent reflections
- Render layer method in 3D applications outputs diffuse, specular, refraction, shadows separately for fine-grained VPX compositing