FYSE ENGINEA commercially used engine with Vulkan C++
What is this Fyse Engine?
The name is currently "Fyse Engine" is an in-house
game engine, created for the purpose of teaching children how to make video games from scratch.
We aimed to make it easier for developers to just skip the linker and additional include directories.
Since this engine is directed a children consumer audience who seek the challenge of learning C++,
but lack the hardware for Unreal Engine's requirements. Everything we do in this engine to design
choices and structures are to ensure that even children can easily program in C++.
Objective
Most designed to bridge in-between Unity's simplicity and Unreal's structure.
Helping the students being taught how to use this engine C++ and understanding
low-level programming at RP4K.
Some cases in classes too I have taught children how to program and utilize Vulkan,
getting some of their images onto the screen and also get 3D models imported, with
their textures and paste them onto the meshes. Offering and delivering low-level
programming experiences to children.
FeaturesWhat does it offer?
Most of the features and syntax of Fyse Engine is meant for ease and simplicity,
since the audience of Fyse Engine is for children, as an introduction into C++.
All features were designed with so many workarounds and fail safes to ensure ease
for the children developing their games on!! There is a build in Math Library, that
covers Vector and Matrix math, alongside Rotations!! An automatic texture loader
(that can be disabled) to load in all the textures inside a given directory.
Many features will be covered within this "Features" segment...
Features ->Built-In Math Library
The built-in library allows developers to easily read lines and implement
vector/matrix math easily into their projects. Usually most people opt for
GLM (OpenGL Math Library), for their mathematical applications. For multiple
reason we've decided to make our own math library. Simply aiming for the simple
implementation, skipping linking steps, namespace collisions, just to name a few.
It was developed for this engine in substitution of GLM.
With some time and remaking the Math Library in Fyse Engine. Vector math is included
from Vector2 -> Vector4,
with most required vector math operations, with scalar values and other vector values. Though the
most complex part of this library was writing the matrix multiplication. Keeping matrix-related
math in Row Major, since for children at least it's very straight forward.
= { , , }; [] ; .;
= { { , , }, { , , }, { , , }
}
[][] ; [].;
Features ->Math Library Benchmark
This engines math library has some number of reasons and little downsides to its competitor
OpenGL GLM. It's time to compute the
following matrices and vectors are basically within the computer's computation error range.
Basically reaching a point of no real winner. In terms or memory size and allocation, both
of these structures take the in both regards.
= { { , , , }, { , , , }, { , , , }, { , , , }
}
= { { , , , }, { , , , }, { , , , }, { , , , }
}
Features ->Configurations
Fyse Engine also offers some settings for how the engine should act. The EngineConfig
are still being modified and expanded more as the demand for more features is pretty high. Although simple,
it does offer some MSAA (Multisampling Anti-Aliasing), an Auto Load Texture,
DEBUG_LOG, Background color and soon to be even more!! This is an optional
feature and Fyse Engine will attempt to figure out the most optimal settings for your device.
Fyse Engine is being designed to be that middle ground of learning fundamental C++
to avoid the bloat from C#, but also have an easy time to develop your games. While
also offering a very small size, since it's a static library that you use. Usually
for the children they will have a project folder with linkers and everything set up,
since linkers suck haha. Creating custom components in Fyse Engine is extremely
simple, and after creation of your custom component class, it can be immediately
used and compiled with!!
Advantages ->GameObjects & Components
Instantiating GameObjects and creating components are very similar to Unity's Syntax! But having the combination of
C++ and Unity, to blend the simplicity of Unity's API syntax, with the C++ syntax!!
C++ is a low level language, and to make it more difficult, there are multiple syntaxes
for writing code for constructors, functions, lambdas etc. So many of the difficulties
faced in the development of this engine was how to make a system, and syntax flexible
with the multiple ways of writing code in C++? I go along talking not only with math
related topics but also other obstacles in the engines development!!
Challenges ->Math Library Syntax!!
Talking from before, C++ can offer many ways for accessing members and values from classes or structures.
Let alone instantiating these classes/structs have multiple syntaxes, small details that lead to much confusion.
So I allowed multiple ways to access members with unions and overloading the
operator[]. Most of the objects from the Math Library have some modified
way of accessing these members and their values! I like to use braced-initialization for these objects, but
there's nothing wrong with using the constructor or other forms of creating objects... Exhibit A!!
= { , , };
[] ; .;
= { , , }; .; .; .; .;
= { { , , }, { , , }, { , , }
}
[][] ; [].;
As you saw from the example, Vector3, Rotator,
and Matrix3x3, (others included: Vector2
and Vector3, Matrix2x2,
Matrix4x4) all allow this accessibility. With Rotator
having multiple different ways to access it, using XYZ (Euler),
PitchYawRoll (Tait-Bryan) or Angle2D
(for simple 2D purposes). Exposing children to different formats and systems
& []() { () { :; :; :; :; } ;
}
& []() { [];
}
Solution ->Vector/Matrix Access!!
If you looked at the example above "Vector/Matrix Accessibility", it shows how I got around to solving
this easy syntax of accessing the components of Vectors and Matrices. For the switch, there should maybe be a default case for that
statement, but "logically" doesn't affect anything, but performance wise unknown... For the Matrix4x4
bit, as you might see there isn't any protection towards going under or over the number of rows you can access.
this can be solved by a nice little min() and max()
chain for give it a range, or a check with multiple if statements, which
can cost performance. Part of my reason is for performance and predictability for what value it tries to
prefetch to save performance, and missed cache hits. But leaves open for possible misuse. Let's be honest though,
younger children will probably not be touching Matrix Math :3...
& []() { ( < ) []; ( > ) []; [];
}
; & []() { [(, (, ))];
}
So What Now?Where am I taking this?
There are still a list of features I would like to add into Fyse Engine. In no order at all:
With all of these tasks and such, this is an engine more catered towards children. Learning the
core concepts of detecting collisions, understanding forces and velocities, vector math with directions
and translations, so having such tool and features for sure, will be amazing to have a foundation to
construct a game off of. Perhaps making a stripped, limited version of it to have children develop on,
then develop these features on a more completed branch.