Improved Performance

You can now fit ArmorPaint onto two 1.44MB floppy disks (if you ever wanted to)!

This is a more technical post for those who are curious how ArmorPaint works behind the scenes.

A lot has been done to transform the code base of ArmorPaint when going from version 0.9 to 1.0. Originally ArmorPaint started in the Haxe language and was powered by V8. This setup actually worked great (still a big fan of ncannesse!) but with ArmorPaint reaching much bigger scale than I anticipated, I wanted less dependencies and more control to easily develop and maintain ArmorPaint in years to come and make it as optimized as I can.

ArmorPaint is now fully written in C, does not use external libraries and no longer uses a garbage collector. Almost everything is custom built - it uses its own 3D engine, 2D drawing and UI library. The code has been reorganized into a single monolithic repository with massive code size reduction.

Just for fun - on Linux, a tiny c compiler (tcc) which can compile ArmorPaint on its own is actually included in the repository, so you do not need to even install a compiler. For distributed builds, clang compiler is used with the C23 embed feature - a single-file portable binary is produced.

ArmorPaint originates from the amazing Kore (hardware abstraction) and Kongruent (shader lang and compiler) libraries by RobDangerous. Without these, ArmorPaint would not exist as it does today. The libraries have been included in the monolithic repository now and modified to only do what ArmorPaint requires, to keep the code lines to a minimum.

ArmorPaint now runs on D3D12, Vulkan, Metal and WebGPU. Ray-tracing is implemented on D3D12 (Windows), Vulkan (Linux + Android) and Metal (macOS + iOS).

A lot of effort has been placed into memory and speed optimizations for the 1.0 release. For textures, bc7 compression is now used which resulted in a big video memory usage reduction. With the removal of external dependencies, the compressed program size now sits at just 2.8MB. Comparing version 0.9 to 1.0 on my Linux machine:

800 MB .obj = 7M triangles

With reduced memory usage ArmorPaint can load bigger models, handle more layers, paint higher resolution textures on the same hardware and more. With the current state of memory prices, optimizing memory usage is very useful.

Another area that saw improvement is build time. This is important to keep development iteration speed high. First debug build - 2.9s, next build with code change - 1.4s, next build with no code change. 0.1s.

Please feel welcome to post any feedback on the forums or contact me directly. The final ArmorPaint 1.0 release notes will be posted soon at Release: 1.0 rc3 .