Wow. It’s been a full year since the last Nova development blog post. That’s... a long time. I want to get these out more often than that. We’ll see what happens.
A lot has happened with Nova in the last year.
When the year began we were hard at work implementing GUI rendering for the main menu. We finished the framework for that, and added all the pages that were needed to load into a world. There’s still a lot of GUI pages that we haven’t explicitly touched, and probably a few crashes hiding in there, but we have enough to load into the game.
The people who had joined to make the GUI got busy with real life, so I also developed the chunk rendering code. Nova is able to render chunks like Minecraft with Smooth Lighting turned off (getting smooth lighting working would have been hard). There was actually a lot of difficulty here. Minecraft groups the faces in a model by the face of a cube that they would be up against, and it provides an enum for each face of the cube. This would be fine, except that it uses the value `null` (which is never a member of an enum) for all the faces that are not directly against the side of a cube. That is, if you iterate over all the enum values and get each of their faces, you still have to ask for the faces with `null` instead of an actual enum value. This is incredibly silly and caused me a lot of grief
E3 2017 happened. During it, Microsoft announced the Super Duper Graphics Pack for Minecraft. Minecraft: Windows 10, Pocket Edition, Switch, and XBox were moving to a new engine, Bedrock, and Minecraft 1.3 would add support for user-defined shaders - and the Super Duper Graphics Pack would be built using that support.
This changed many things. One of Nova’s main goals was compatibility with existing shaderpacks. At the time I started Nova this meant compatibility with shadersmod shaders, which soon become Optifine shaders when Karyonix gave the shadersmod code to sp614x. While watching E3, I decided to support Bedrock shaders as well. Users will be able to use many existing shaderpacks from all versions of Minecraft with Nova.
Support for Bedrock Shaderpacks was added to the backlog, but there was more work to be done for chunk rendering. Adding the code to support Bedrock Shaderpacks would have to wait.
In September, another revelation dropped - The Windows 10 (and probably XBox) versions of Minecraft were moving to DirectX 12. This would allow Minecraft greater performance on many systems, but it had an affect on Nova. Using Vulkan for Nova had been the original plan, and it’s something I had put on the backburner while I was learning how to work with Minecraft: Java Edition’s code. This new revelation was a challenge: surely I could make Minecraft: Java Edition render as well as Windows 10.
Conversion to Vulkan began mid-October. I first had to learn Vulkan, or at least get a grasp of the basics. I decided that, since I had been spurned to convert Nova to Vulkan by Bedrock, I should add in support for Bedrock Shaderpacks while I was converting to Vulkan. That decision has caused me a lot of pain, since supporting Bedrock shaderpacks, Optifine shaderpacks, and Nova’s extensions to both added a lot of complexity to what Nova had to do. I moved across the USA, started a new job, and travelled a lot for the winter holidays - all things that have taken away from Nova.
That brings us to today. Nova continues to plod steadily on. Nova can load Bedrock material files, and is reasonably good at initializing its Vulkan context. Nova can load textures and shaders without too much difficulty.
The immediate roadmap sees rendering commands added to Nova. This will allow Nova to render the GUI and chunks, like the OpenGL version of Nova.
Once that feature parity is achieved, I’ll take a step back and look at the progress of Minecraft: Java Edition. MC:JE is making significant changes to its renderer for 1.13, and I want to move Nova to Forge instead of raw MCP. Adapting to 1.13 and to Forge are both significant changes, and I want to do them at the same time. If Forge for 1.13 releases before Vulkan Nova has feature parity with OpenGL Nova, we’ll be able to jump right in to the Forge conversion without any delay.
However, if I have to wait for Forge, there’s numerous other tasks I can do. These will all be focused on optimizing Nova so we can render the maximum number of pixels per second. Some items on this list are:
- Multithreaded command buffer generation and submission
Indirect chunk rendering
Once the Forge conversion is complete, I’ll likely spend a bit of time working through making GUI and chunk rendering really nice. We’ll dive into Minecraft’s GUI, making sure each page renders properly through Nova. I’ll work on making chunk rendering respond to the rendering options in the options GUI, such as the setting for fancy leaves or the render distance. When I'm satisfied with that, we’ll begin conquering entities. They’ll have a good bit of complexity with tracking their position, rotation, and animation state, but it’s nothing we can’t handle.
The future of Nova is bright. This project has taken a long time already, and I expect there’s still a lot of time before it’s anywhere close to done, but I promise all this work will be worth it.