Pico3D: Open World 3D Game Engine for the PicoSystem (RP2040 Microcontroller)
github.com
github.com
I wish I had the time to do this, but it looks like it would be relatively simple to modify render_rasterize.cpp [0] to do perspective-correct texture mapping [1]. I also wonder if going for a scanline approach [2] would be faster than iterating over the whole screen calculating barycentric coordinates?
[0] https://github.com/bernhardstrobl/Pico3D/blob/main/engine/re...
[1] https://gabrielgambetta.com/computer-graphics-from-scratch/1...
[2] https://gabrielgambetta.com/computer-graphics-from-scratch/0...
What do you mean by "sorting 1500 triangles"? You mean sorting their vertices? I believe you already do that in a couple of places; since you're using a depth buffer, I don't think you need to sort them back-to-front, so I'm not sure what you mean.
True that a 120x120 display is tiny, but that also means that you can get away with two static arrays of 120 elements for the left and right sides of the triangle, no need to do any allocation or use tons of memory.
The method allows saving substantially on any overdraw since fillrate is really the primary bottleneck here.
I did a quick check on your page and it seems the implementation describes a per triangle setup vs the more complicated solution by Carmack and his team? Could still work well for larger triangles, maybe with a check on triangle size to avoid really small ones.
Quake did after all utilize 3 different rasterizers to optimize performance depending on use case.
Triangle, surely...
Fine grained visibility determination (span, coverage buffers, etc) https://www.flipcode.com/harmless/issue01.htm
Tom Forsyth, How To Draw Ugly Lines Fast https://cohost.org/tomforsyth/post/648716-how-to-draw-ugly-l...
Ned Greene, Hierarchical Polygon Tiling with Coverage Masks https://www.cs.princeton.edu/courses/archive/spring01/cs598b...
This UC Davis lecture video explains rasterization rules really well: https://youtu.be/z3fWd7G3mrU
The original Nintendo DS also had two ARM cores (33MHz and 66MHz IIRC). People made some amazing things, including a Portal clone:
The most impressive is the GBA port of Driv3r. More or less stripped down Grand Theft Auto 3 style sandbox game, squashed down onto the GBA.
Driv3r Video: https://www.youtube.com/watch?v=xXq3jH8TQNo&t=32s
History/showcase of various 3d GBA games: https://www.youtube.com/watch?v=79fgH08z6xs
IIRC, the ARM7 one was essentially identical to the ARM7 used in the GBA, and was used for the GBA backwards compatibility mode on the original DS/lite.
All of our products meet the REACH and RoHS requiements for restricted and hazardous materials.
TL;DR It's fine.
Use of PCB as a human user interface started in hobbyist world, because it was cheap and easy to create sturdy front panels and was good enough for creating prototypes, but it was never meant for mainstream commercial use in this way - as PCBs even if they meet RoHS, still can contain dangerous chemicals - like flame retardants.
https://github.com/fhoedemakers/PicoSystem_InfoNes
It’s still in early stages, no sound and no save points, but thoroughly cute and addictive nonetheless!
https://youtube.com/watch?v=n6bECGQyNuk
It achieves this by using both cores & clocking the RP2040 at 250Mhz (via Picosystem's SDK).
(Well, and probably also being decently coded...)
The Pico3D is 1/2 the performance (133 MHz if you use only one core for rendering), but 1/8 as many pixels (240x240 display).
Definitely a cool project, but based on specs it's actually not that surprising this is possible.
Whereas a '97 PC would be in the many tens of MB or possibly hundreds, and at least a few MB dedicated VRAM on a video card. So not an equivalent comparison really, this is a much more constrained environment.
So no need to have a complete framebuffer in the first place. Lack of memory just limits the number of textures you can have.
I seem to recall running Windows 95 on a 200mhz - 300mhz processor with 64mb ram.
It wasnt top of the line but I don't think windows 95 was top of the line either. My ex corporate windows 2000 pc upgrade had 128mb ram. Neither had fancy graphics cards.
Mechwarrior as I recall ran on my 486 with 8mb ram. I'd guess that's in the same ball park of 256k for ram with xip flash. With a lot of hand waving of course. It could certainly run doom.
https://lavarails.com/download/open_world_3D_microcontroller...
It describes a lot of previous commercial game devices, but doesn't really discuss current alternatives to the PicoSystem. I wonder if there are more capable open-firmware devices at around the same price?
It seems like Pimoroni spent time to get those aspects right, and so while there aren't that many games (yet?) - the good quality ones are a joy to play feel-wise, eg Square Bros (which comes installed on a new unit).
The SDK is well thought-out and simple, and has a unified API - micropython or c/c++.
They are apparently working on a successor that plugs into a TV or monitor via HDMI. IIRC it will use two RP2040's.
EDIT: Yes, two chips:
https://www.tomshardware.com/news/pimoroni-stick-pi-gaming-c...
> The dual RP2040 chips on the DV Stick will allow it to have one CPU that does the software processing and another that just drives the display. Each of the chips has its own PS RAM chip, which means that there will be more memory than the 264K that comes standard with RP2040 chips / Raspberry Pi Picos.
> "Each of the chips has a PS RAM chip for the frame buffer and, on VSync they swap," Williamson said. "So we have an analog mux that basically swaps the chips between the two so the application processor writes into the frame buffer in one RAM chip then, when VSync occurs in the display, it hands that RAM chip over to the display processor which hands its RAM chip back to the application processor so the display outputs on the screen."
Thanks for the link!
I would guess judging by the games that the Saturn was more capable with 2D games.