GG Engine - Groogy's Game EngineGroogy's Game Engine is a multi-threaded 3D game engine I have been working on for the past year. I don't got much of imagination when it comes to names so I named it to
Groogy's Game Engine but lucky enough it's acronym results into
GG Engine, GG which is also an acronym for Good Game.
So what's so good about it? Well I've tried to make the complex and hard things to be simple to work with. For instance threading in the SDK is non-existent for the user and does not need to concern himself about it at all. Most of the 3D math for rendering is also handled internally by the engine and most optimisations that needs to be done will be hidden behind the public API. What will be in focus is to make a game and not a decent frame rate or how things are culled by a frustum.
The UsersWho is this aimed at? Well I made it for use by myself but who knows there might be someone else that want to jump straight into game making without having to worry about multi threading, model loading, skeleton animation, efficient culling and the like.
FeaturesHere's a list of the features that it currently support:
- Seamless multi-threaded input, logic, rendering. The user only need to define the logics.
- Nice wrap around OpenGL for 3D rendering.
- Nice wrap around SFML for Windowing, Input and 2D Rendering.
- Object-oriented interface to rendering.
- Instance-Model Graphs.
- Wavefront Object and Material file parsing.
- Helper Design Patterns like Singleton, Component-based Objects, Observer Objects, etc. etc. (These are added overtime, not all have been made yet)
- Resource Management.
- Flexible post master system(though I call it signals)
- Vector and Matrix classes for 3D uses.
- An Orientation class that makes Matrixes and Vector's easier to use for newcommers to 3D math.
- Automatic Frustrum against Oct-tree culling for rendering thread.
- Easy to implement and use debug information at runtime.
And a list for things that is planned to be implemented:
- Generate bounding boxes when loading a model.
- A modifiable origin for 3D objects.(Kind of like sprites in SFML)
- Skeleton Animations.
- An interface that is easier to work against
- System to handle configurations and parsing from a file or maybe the OS.
- State stack with some predefined states.
- Properly pass material parameters to OpenGL for use in shaders.
- Lighting interface to the rendering thread.
- Allow object-specific shaders.
- Shader function library for common used things.
What I am thinking about but is not my highest priority:
- Encapsulate SFML entirely so the user don't even need to know that SFML is used.
- Bindings to ruby, since only one thread is exposed to the user it's perfect.
- Base GUI system.
- Plugin system.
- Rendering Optimization, currently everything is rendered intermediate.
- Dynamical Destructible Objects(Won't look good but can be disabled)
ExampleAn example that will render a sprite and a rotating 3D model on screen. Will handle the even that the window closes and also let's you move around in the 3D world.
#include <GGE/Application/Application.hpp>
#include <GGE/Application/ApplicationLogics.hpp>
#include <GGE/Application/Sprite.hpp>
#include <GGE/Application/Text.hpp>
#include <GGE/Application/Object.hpp>
#include <GGE/Application/Camera.hpp>
#include <GGE/Application/BasicCameraController.hpp>
class MyApplication : public GGE::ApplicationLogics, GGE::Signals::Receiver
{
public:
MyApplication()
{
myRotation = 0;
GetSignalSender().SubscribeReceiver( this, "Signal.Window.Quit" );
GetSignalSender().SubscribeReceiver( &myPlayer, "Signal.Mouse.Moved" );
GetSignalSender().SubscribeReceiver( &myPlayer, "Signal.Keyboard.Pressed" );
GetSignalSender().SubscribeReceiver( &myPlayer, "Signal.Keyboard.Released" );
}
~MyApplication()
{
GetSignalSender().UnsubscribeReceiver( this, "Signal.Window.Quit" );
}
void Initiate()
{
GGE::Graphics::TextureHandle texture = GGE::Graphics::TextureManager::Instance().Get( "resources/hal-9000-eye.jpg" );
GGE::Graphics::ModelHandle model = GGE::Graphics::ModelManager::Instance().Get( "resources/TexturedCube.obj" );
myTestText = GGE::Interface::Text( "test.text" );
myTestText.SetString( "Hello World!" );
myTestText.EnableRender();
myTestSprite = GGE::Interface::Sprite( "test.sprite" );
myTestSprite.SetTexture( texture );
myTestSprite.SetScale( 0.5f, 0.5f );
myTestSprite.SetPosition( 100, 100 );
myTestSprite.EnableRender();
myTestObject = GGE::Interface::Object( "test.object" );
myTestObject.SetModel( model );
myTestObject.EnableRender();
GetContext().GetCamera().SetPosition( 0, 0, 10 );
myPlayer.SetCamera( GetContext().GetCamera() );
}
void Update( const sf::Uint32 aDelta )
{
myRotation += aDelta / 1000.f;
myTestObject.SetRotation( 0, myRotation, 0 );
myPlayer.Update( aDelta );
}
private:
bool ReceiveSignal(const GGE::Signals::Base &aSignal)
{
if( aSignal.GetType() == "Signal.Window.Quit" )
{
GGE::Application::Instance().Exit();
return true;
}
return false;
}
GGE::Interface::Text myTestText;
GGE::Interface::Sprite myTestSprite;
GGE::Interface::Object myTestObject;
GGE::Utilities::BasicCameraController myPlayer;
float myRotation;
};
int main()
{
GGE::Application::Create( new MyApplication() );
GGE::Application::Instance().MainLoop();
GGE::Application::Release();
return 0;
}
The SDKAlright I would say an alpha version has been released now:
https://github.com/Groogy/GGESo far everything to my knowledge works and it's stable.
A lot of more features will be implemented. If you feel "I need this thing now" then just give me a message about it and I'll implement it as fast as I can.
DocumentationGroogy's Game Engine Tutorial 1 - Introduction:
,
DownloadGroogy's Game Engine Tutorial 2 - Getting Started Part 1:
,
DownloadGroogy's Game Engine Tutorial 2 - Getting Started Part 2:
,
Download part 1,
Download part 2Groogy's Game Engine Tutorial 3 - Drawing 3D:
,
Download part 1,
Download part 2Questions & SuggestionsI am very happy to answer any questions or listen to suggestions you might have. You can ask/suggest privately or here in the thread. Of course you can also send me a message on Github or use any of the great tools Github provides for communication.