I've always loved messing around with the Toybox Paint Shop inside my Tesla, but trying to visualize how a custom wrap, pattern, or color shift would look on a real Model 3 or Cybertruck using just a flat color picker is incredibly frustrating. I wanted a way to design and preview complex patterns, matte finishes, and multi-tone wraps in real-time, then grab the exact configuration files instantly.
Since nothing clean existed online, I built TeslaPaintShop over a couple of weekends. Here is how I solved the technical challenges of rendering complex automotive wraps dynamically in the browser.
The Core Tech Stack
To keep the application lightweight, fast, and entirely client-side, I went with:
- Three.js / WebGL for the 3D rendering pipeline.
- Vite + Vanilla JS to avoid framework overhead and keep the bundle size tiny.
- HTML5 Canvas API for real-time procedural texture and pattern generation before projecting them onto the 3D model.
Challenge 1: Optimizing 3D Vehicle Meshes for the Web
The biggest hurdle was asset size. Standard CAD models of a Tesla Model Y or Cybertruck are hundreds of megabytes. Downloading those on a mobile connection is a terrible user experience.
I imported the raw models into Blender and aggressively decimated the geometry. I reduced the polygon count by over 85% while preserving sharp feature lines using split-normals. To handle different body panels, I separated the meshes into logical components (hood, doors, roof, trunk) so users could apply distinct materials to individual parts of the car. The final GLB assets are under 1.8MB each!
Challenge 2: Dynamic Wrap & Pattern Mapping
Applying a flat color is easy. Applying a seamless repeating wrap pattern (like carbon fiber, camo, or custom decals) across complex curved car panels is where it gets tricky.
Instead of pre-rendering texture maps, I used dynamic HTML5 canvases as texture sources. When a user tweaks a pattern scale, angle, or metallic finish:
- The app draws the pattern procedurally onto a hidden 2D canvas.
- It flags the Three.js
CanvasTexturewithneedsUpdate = true. - The WebGL shader recalculates the UV wrapping in real-time.
For the Cybertruck, the flat stainless steel panels were a breeze. But mapping wraps onto the curved wheel arches of the Model 3 required precision UV mapping to avoid ugly texture stretching.
Challenge 3: Generating Toybox Compatible Outputs
The final step was allowing users to export their designs. Since the Tesla custom toybox system reads specific color codes and configuration setups, the app translates the visual material properties (roughness, metalness, and hex colors) into instant, compatible layout files that match the exact parameters expected by the carβs system.
I'd love to get your feedback on the rendering performance! Check it out at teslapaintshop.org and let me know what you think of the WebGL material transitions in the comments.

Top comments (0)