Author Topic: KiDOOM - DOOM in KiCad, plus ScopeDOOM on a scope  (Read 623 times)

0 Members and 1 Guest are viewing this topic.

Offline AxlesTopic starter

  • Newbie
  • Posts: 4
KiDOOM - DOOM in KiCad, plus ScopeDOOM on a scope
« on: November 26, 2025, 08:40:32 pm »
Hi All,
   
I got DOOM running in KiCad by rendering it with PCB traces and footprints instead of pixels.
Walls are rendered as PCB_TRACK traces, and entities (enemies, items, player) are actual component footprints - SOT-23 for small items, SOIC-8 for decorations, QFP-64 for enemies and the player.

How I did it:

Started by patching DOOM's source code to extract vector data directly from the engine. Instead of trying to render 64,000 pixels (which would be impossibly slow), I grab the geometry DOOM already calculates internally - the drawsegs[] array for walls and vissprites[] for entities.

Added a field to the vissprite_t structure to capture entity types (MT_SHOTGUY, MT_PLAYER, etc.) during R_ProjectSprite(). This lets me map 150+ entity types to appropriate footprint categories.

The DOOM engine sends this vector data over a Unix socket to a Python plugin running in KiCad. The plugin pre-allocates pools of traces and footprints at startup, then just updates their positions each frame instead of creating/destroying objects. Calls pcbnew.Refresh() to update the display.

Runs at 10-25 FPS depending on hardware. The bottleneck is KiCad's refresh, not DOOM or the data transfer.

Also renders to an SDL window (for actual gameplay) and a Python wireframe window (for debugging), so you get three views running simultaneously.

Follow-up: ScopeDoom

After getting the wireframe renderer working, I wanted to push it somewhere more physical. Oscilloscopes in X-Y mode are vector displays - feed X coordinates to one channel, Y to the other. I didn't have a function generator, so I used my MacBook's headphone jack instead.

The sound card is just a dual-channel DAC at 44.1kHz. Wired 3.5mm jack → 1kΩ resistors → scope CH1 (X) and CH2 (Y). Reused the same vector extraction from KiDoom, but the Python script converts coordinates to ±1V range and streams them as audio samples.

Each wall becomes a wireframe box, the scope traces along each line. With ~7,000 points per frame at 44.1kHz, refresh rate is about 6 Hz - slow enough to be a slideshow, but level geometry is clearly recognizable. A 96kHz audio interface or analog scope would improve it significantly (digital scopes do sample-and-hold instead of continuous beam tracing).

Links:

KiDoom GitHub: https://github.com/MichaelAyles/KiDoom, writeup: https://www.mikeayles.com/#kidoom

ScopeDoom GitHub: https://github.com/MichaelAyles/ScopeDoom, writeup: https://www.mikeayles.com/#scopedoom


 
The following users thanked this post: thm_w, Kean, xvr

Online Benta

  • Super Contributor
  • ***
  • Posts: 7176
  • Country: de
Re: KiDOOM - DOOM in KiCad, plus ScopeDOOM on a scope
« Reply #1 on: November 26, 2025, 11:17:50 pm »
There's a life out there. Try it.
« Last Edit: November 26, 2025, 11:28:48 pm by Benta »
 

Offline Psi

  • Super Contributor
  • ***
  • Posts: 12650
  • Country: nz
Re: KiDOOM - DOOM in KiCad, plus ScopeDOOM on a scope
« Reply #2 on: November 26, 2025, 11:29:47 pm »
Get a life.

Stop attacking new members.

People gain a lot of skills and experiences pulling things apart and putting them back together like this.
Greek letter 'Psi' (not Pounds per Square Inch)
 
The following users thanked this post: Axles, thm_w, Kean

Online SteveThackery

  • Super Contributor
  • ***
  • Posts: 3378
  • Country: gb
  • 50 year novice
Re: KiDOOM - DOOM in KiCad, plus ScopeDOOM on a scope
« Reply #3 on: November 26, 2025, 11:33:52 pm »
Hi All,
   
I got DOOM running in KiCad by rendering it with PCB traces and footprints instead of pixels.
Walls are rendered as PCB_TRACK traces, and entities (enemies, items, player) are actual component footprints - SOT-23 for small items, SOIC-8 for decorations, QFP-64 for enemies and the player.

Very impressive! And I bet you learned loads on the way.
 
The following users thanked this post: Psi, Axles


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf

 

-->