Taxi¶
Taxi is a Williams System 11 table that went through extensive VPW development with baked GI textures, 4-step GI fading, RTX ball shadows, and detailed physics tuning. The project involved multiple contributors including Sixtoe (VR, fixes), tomate80 (models, textures), iaakki (fading code, inserts), oqqsan (inserts, GI), and apophis79 (physics, sounds, shadows).
Build Notes¶
Version History¶
Key milestones:
- v002: Fleep sound package added
- v006: VR support -- backbox/DMD/backglass, unified timers, cabinet mode (Sixtoe)
- v009: GI-on baked textures, warm LUT, plastic ramp retouching (tomate)
- v011: All inserts cut, 4-step GI on sidewalls and playfield (oqqsan)
- v016: RTX ball shadow, GI lights for ball reflections (apophis)
- v018: Target bouncer, flipper rubberizer, coil ramp up options (apophis)
- v1.0: Released on VPUniverse
- v1.2.3: Clark Kent plastic ramps, collidable ramps fixed (tomate)
- v1.2.4e: Unused LEDTimer removed, GameTimer per-frame, VR backbox fix (Niwak)
GI Lighting with Flashers¶
VPX lights produce hard shadow edges. The workaround:
- Use VPX lights (default circular shape) for general GI illumination
- Use flasher images for the shadow shapes (drawn by hand or rendered in Blender)
- Script flashers to fade with GI rather than just on/off
- Reference: Maverick table, layer 6,
FlasherGI001
Drop Target Shadows¶
Dynamic drop target shadows using Blender and flashers:
- Render shadows using a shadow catcher in Blender
- Place on flasher objects
- Toggle with
visible=0/visible=1when targets go up/down - The rothbauerw drop scripting has built-in provision for shadow handling
RTX Ball Shadow¶
- Shadow falloff increased from 100 to 200 for more natural appearance
- Equation adjusted from
25 * opacityto15 * opacity + 5 - Ball shadow DB: RTX at -10/-11, ambient at -12, ball shadows at -1000/-1100/-1200
- Remove ball shadow z-position dependency for tables without significant height changes
Bumper Cap Implementation¶
Taxi uses Williams System 11 clear style caps (no grooves), same as Flupper's bumper kit and BK2000. Different colors achieved via VPX material settings. DL randomness for realistic power flicker on hit:
Simplified GI step formula: caps_prim.blenddisablelighting = (5-gistep)*0.25
Permissions¶
Permission obtained from icpjuggla (last author) via VPForums before release.
Scripting¶
GI On/Off Texture Swapping¶
VPX Limitation
Playfield image swapping via script only works when started with F6 (debug mode). During normal gameplay, use a flasher overlay for the "off" state instead.
For sidewalls, place textures outside the color-mod if-statement. For the playfield off texture, a flasher approach requires insert cutouts in the off-image.
GI Step Fading for Primitives¶
This changes blend disable lighting between 0.3 and 1.3 based on the GI step.
Insert Fading Fix (NFadeLm vs NFadeL)¶
Incorrect:
Correct:
Force GI On at Init¶
GI was never turned ON at table initialization, causing RTX shadows to not work initially. Add a GI initialization call in table init to force GI on at startup.
Slingshot Sound Reference¶
Slingshot positional sounds require a reference object with X and Y properties near the slings. If the object is deleted or renamed, sounds break. A GI light under the slingshot can serve as the position reference.
Catapult Timer¶
The catapult animation timer at 1ms caused super slow performance on lower-end hardware. Fix: set to 10ms (100fps) which looks better and runs smoothly.
3D & Art¶
Playfield Noise Removal¶
Baked playfield textures had visible noise artifacts at 4K resolution. Simple fix in Photoshop using denoising tools.
Playfield Material Grey Cast¶
A grey/washed-out appearance on part of the playfield was caused by incorrect material settings.
Sideblade Textures¶
A single texture can work for both normal and double-height sideblades (cabinet mode) without stretching. The key is subdividing the mesh.
Plastic Appearance¶
For realistic plastics:
- Bevel/cap material should have very little roughness
- Very little reflection
- If plastics look too dark when lights go off, check these settings
Screw Primitive Warning¶
A single screw primitive had 10,216 faces and was 27 MB. Extremely excessive for a small object.
Scanned vs Rendered Playfield¶
Scanned playfields provide much more exact positioning of all objects, better texture quality than AI-upscaled images, and enable accurate post transfers.
Troubleshooting¶
Ball Shadow Disappearing¶
When timers were unified, BallShadowUpdate was accidentally omitted from the game timer.
Playfield GI Flasher Not Covering¶
The GI off flasher color was set to black (0/0/0), which was masked out. Fix: set to medium grey (124/124/124).
Null Error in NF Flipper SpoofBall¶
Intermittent null error when unhit event does not fire on flipper trigger. Fix: increase hit height of TriggerLF and TriggerRF to 150, and add polarity correction in drain_hit:
Division by Zero in COR¶
Quick fix for cor.ballvel returning zero:
Ramp Decal Backlight¶
Ramp decals not showing flasher backlight: set depth bias to -100 while flashers remain at 0. Set "DL from below" to 0 on ramp decal prims.
Ball Jumping Over Apron¶
Add helper walls with height 0-100 in upper-left/upper-right areas. Non-visible apron walls should be height 100 by default.
VR Playfield Wobble¶
Fix: create a new physical playfield mesh, convert old mesh to visible-only. Also check that materials/objects are set to "active" not "static."
Bell Sound Volume¶
The multiball bell sound was extremely loud. Replaced with a properly leveled version.
Game Knowledge¶
Rubberizer Settings¶
Tournament play comparison:
- Setting 0: Ball too dead
- Setting 1: Too bouncy, unexpected micro-bounces
- Setting 2: Most realistic feel, better control
- Flipper coil ramp-up: Fast (0) preferred for truer aim
Resources¶
Texture Guidelines¶
- Cabinet side textures need 4K (span full table length)
- No texture should need expanding or contracting at target resolution
- GI step images (4096x4096 each) are the main file size contributors
Best Practices¶
- Ship with cabinet mode off as default (cabinet users know how to enable it)
- Set sync mode to -1 to respect user's global VPX settings