Roc is a thoroughly-modern real-time game engine.
What does that mean?
- Roc is easy to get along with:
Modern tools and technologies like Bun, TypeScript, AssemblyScript, WebAssembly, SIMD, and WebGPU enable Roc to be simple to use & work with while also being incredibly efficient - Roc is smol:
A long-standing axiom in development is "Smaller things are easier to understand, change, and fix"; Roc follows this axiom by using lots of little pieces, each focused on doing a single thing, to construct nuanced behavior - Roc has strong opinions:
"Simple" and "flexible" are, often, antithetical; whenever this is the case, Roc simplifies things for you and I by making an opinionated decision - meaning that there absolutely is an "Roc's Way"
- Athenaeum: A colleciton of super-useful things
- Benzaiten: Generates procedural meshes
- Eunomia: Just a little thing that keeps the engine in good running order
- Finesse: Flexible, sensible, shockingly-adept input handling
- Kali: A tiny tool that makes scaling time in the engine as easy as a single method call
- Legion: An implementation of the ECS design pattern
- Sunya A library of helpful mathmatical functions for 3D data structures
- Strata: UI tooling. It's all of Roc's buttons, switches, dialogs, and stuff
- Xenon: A blisteringly-fast, elegant rendering engine
- Yggdrasil: Manages all the FidelityTrees; ensuring the engine is always running at peak perfomance, while hitting the frame rate target you specify
- Simplicity: Using the various pieces of Roc should be straightforward and require very little upfront work
- Composability: Roc's pieces should be organized such that using them together is unambiguous and intuitive
- Efficiency: Roc strives to make the best use of available resources; including our time as developers/designers
It's important to note that flexibility is not one of Roc's goals. Roc is not intended to render 2D graphics, for example. It is also not designed or intended to load static 3D assets generated using external tools. I understand this will be frustrating and feels limiting. Roc is intended to generate and simulate things. It is also intended to be as self-contained as possible.
This is all new to me 😊
I've been a hobbyist game developer for several years, but this is my first time attempting to create my own simulation/game engine. I'm going to make mistakes, bad calls, and change my mind about things - when I learn something I thought was a great idea won't, in fact, work. This already happened, actually; I originally thought Roc could do all instanced and indexed rendering. I found out the hard way that that isn't really feasible in the context of purely runtime-generated meshes 😅 I'm sure there will be more situations like that - so if you read design goal or decision and think to yourself "That will not work" I'll likely realize that shortly too 👍🏻