The main goal of this project is to develop a very flexible engine that can be used to create a wide variety
of games, ranging from a first person shooter to a third person adventure game to procedurally generating worlds.
Essentially I am creating a virtual playground for myself where I will be able to experiment with all levels of the game
programming pipeline whether it's rendering techniques, animation, physics, gameplay, or network code.
Network and Threads
The latest addition to the project is network functionality. I use asio as my API to
set up and handle sockets. The overall implementation is fairly simple and is based on an old
project detailed below that used winsock 2.0. The main differences between my old project
and my current one is that this network code is running on its own thread, is completely cross platform, and
can handle more than two clients (the official maximum is uncertain at this time). Setting up threading
is the part of this system that I'm most excited about because it gave me a lot of insight and practice for
if the scale of my engine grows and I decide to run physics, user input, or gameplay on separate threads
than rendering to boost performance.
Windows, Props, and Gameplay
I have updated my project to be capable of being built and run on Windows platforms along with
mac platforms. I'm very excited for implementing this because it will allow me to incorporate
cross platform networking in the future. In addition to now being able to run on Windows I have
also done some more work with animations. I can now play multiple animations and can even attach
props to characters so they move the same way. In addition to adding in props I started to implement
some simple gameplay mechanics to try and get a feel with how to time gameplay actions with frames in
an animation.
GUI and Physics
My engine is now capable of displaying a 2D GUI that handles buttons and text rendering (the text is
generated with FreeType). I have also implemented an input manager which allowed for the creation of a
3rd person character controller and a first person free camera. Along with the character controller
I have also implemented some collision detection/reaction using the Separating Axis Theorem and Oriented Bounding Boxes.
The OBBs can be displayed or hidden. I have also added in a line rendering class to my engine,
even though it is not showcased in the video it was very helpful with debugging the collision
reactions and is a very important addition to my engine.
Animations, Sounds, and Cube Maps
The above video showcases the current features of my engine. The models and animation data
are loaded in using Assimp. The bone data is selected based on the elapsed time and then sent to
a shader where the vertices get transformed. The audio is being loaded in by a .wav loader I made
and is then being handled by OpenAL. Since I wrote the file loader from scratch this unfortunately means that
my engine can only support .wav files at the moment, but I hope to expand compatibility to .ogg files.
I also implemented cube map textures and shaders which allowed me to utilize skyboxes and fun effects like
reflection and refraction.
New Foundation
My original code base was in DirectX and was a fun little tech demo that showcased an implementation
of some network code. Two players could set up a server, connect to each other, and then battle it out
in a simple 3rd person shooter game. My plan was to build on top of that and expand its functionality.
However the only computer that I am now able to work with is a macbook pro, meaning that I would have to
keep using boot camp to run windows and use directX but my macbook doesn't run windows very well. So in
the end I decided to restart and build up a new project in openGL. Doing this has the added benefit of allowing me
to share my project more easily since openGL is cross platform.
Currently my project uses Assimp to load in 3d models so I can handle a wide variety of formats and also has
simple lighting implemented. Unfortunately I had to ditch my network code because I relied on winsock 2.0,
but I am keeping in mind what I learned in the past so I will be able to add in networked functionality in the future
with hopefully as little hassle as possible.
Small Beginnings
Every great project has to start somewhere, and this is where my engine begins. Graphically
it's not the most impressive showcase, since all it has on screen is a couple of cubes with some
diffuse lighting and normal maps. However there is more going on behind the scenes.
Before I dove deeper into the world of graphics I wanted to toy around with getting some
network features up and running, and I succeeded in doing just that. In my current engine I used winsock 2.0
to set up a system where two clients send data to a server which then relays that data to all the players.
It's not the most efficient system but it is functional and I was able to get a small death match demo running.
Though mine isn't the best I now have some more understanding of how networking code works.
Hopefully as I continue my project I'll be able to design my engine in a way where it's easy to expand upon
and refine this feature later on. I'd much rather build my engine with the capabilities to use network code
then try and add it in later and have to rewrite my entire rendering pipeline.