A wild engine appears!

Posted By: MasterQ32

A wild engine appears! - 01/18/14 01:12

Hello fellow game engine trainer!

I have to announce a new open source game engine on the market.
OpenWorld.Engine

Oh man, another engine again? Yep and this time it's super effective!
I have done some research into game engines but i coulnd't find an engine that fits my needs.

But what about...
...Acknex? Way too limited to create something quickly and portable.
...Unity3D? Why do you even ask?
...JMonkey? Nope, it's Java.
...UDK? Can i has money?
...CryEngine3? Can i has even more money?
...Rayne? I'm sorry, but i wanted a managed environment with reflection.

Why should i look at it?
Okay, so you want to know what is so special about this engine?
This engine supports both high and low level coding. It features node based scene management, a GUI framework, custom post processing pipelines, physics, sound, an asset pipeline and other stuff you may want to use. But it also allows you to code your own rendering with OpenGL 3.3.
Every method is documented and the API has a clear design.

For a complete list of features, click here:
Features

Also, the engine is theoretically multi-platform but i haven't tested it yet.

What techniques are you using?
The engine is written in C# based on .NET 4.0. The renderer is based on OpenGL 3.3, the physics engine is Jitter (a full managed phyiscs engine), sound is provided by OpenAL.

Why have you done this?
My current game project is a game like GarrysMod. Fully scriptable, multiplayer and user created content. I was searching for an engine that could allow me to create those features easily. But Acknex was too limited in case of asset loading, in Unity3D you can't create a good only-source game, other engines are badly documented or are just outdated. So i've done this engine. The basic API is oriented on the XNA API design because my first version of the game was written with XNA and i kinda wrote the engine so the game compiles with little changes.

Why is there no binary download?
This engine is in an early stage. A lot of features are missing, others could be refactored and your code will be broken. So a compiled binary will be released as soon as we have some stable and tested release.

Can i participate?
Sure, just contact me via E-Mail (felix [at] masterq32.de) or via PN. You should have collected some experience with game programming and C#.

Any questions still open?
Just ask here in the thread!

Okay, i hope i haven't forgotten something.

Have fun destroying my dream of a success release of my engine.
Felix

Click to reveal.. (???)

Oh well, i forgot something: Screenshots!
Those screenshots are made with my game, not with the engine. But it is planned to port this rendering pipeline into the engine itself, so everyone of you will have some nice graphics.





Posted By: sivan

Re: A wild engine appears! - 01/20/14 13:56

yeah, another crazy stuff. it is not totally clear what features are working currently, and what is the timeframe of deveopment. unfortunately I'm not familiar with C#...
Posted By: MasterQ32

Re: A wild engine appears! - 01/20/14 13:57

Okay, i'll do some feature list this evening (i don't know it either tongue )
The engine is in development since 30.12.2013 so not that old....
Posted By: WretchedSid

Re: A wild engine appears! - 01/20/14 15:56

Originally Posted By: MasterQ32
...Rayne? I'm sorry, but i wanted a managed environment with reflection.


So, kind of like this? tongue
Code:
void Foobar()
{
	RN::MetaClass *meta = RN::Catalogue::GetSharedInstance()->GetClassWithName("RN::Entity");
	RN::Object *object = meta->Construct();

	if(object->IsKindOfClass(RN::Array::MetaClass()))
	{
		throw "If you run into this, hide in your basement and good luck survivng the apocalypse";
	}

	object->SetValueForKey(RN::Model::WithFile("myModel"), RNCSTR("model"));
}



I mean, it's an useless example that I just pulled out of my ass, but it's used for serialization/deserialization and runtime generics...
But I digress, just wanted to say that Rayne DOES have a runtime type introspection system.... No managed environment though, unless you drop to a scripting language that supports it.

Anyways, good luck with your engine! laugh
Posted By: MasterQ32

Re: A wild engine appears! - 01/20/14 15:58

Damn! But the reflection is only for Rayne objects, right?
But cool to see that you have this!

And thanks, you too!
Posted By: MasterQ32

Re: A wild engine appears! - 01/20/14 18:04

Created a feature list:
https://github.com/MasterQ32/OpenWorld.Engine/blob/master/Features.txt
Posted By: WretchedSid

Re: A wild engine appears! - 01/20/14 18:06

Originally Posted By: MasterQ32
Damn! But the reflection is only for Rayne objects, right?

Yes, and only for subclasses of RN::Object. Which is the main class for everything high level, but for example RN::Matrix or RN::Vector2/3/4 and similar don't subclass from it to remain trivially copyable.

It tries to capture the best of both worlds, having handy high level objects, but not imposing the overhead for every object there is. And it allows us to not having to rely on any custom pre-processor.



Anyways, I looked into the Demo subfolder, and what I'm missing a bit is high level abstractions. For example in the asset demo, why do you have to rotate the object through its shader?! And why is setting up OpenGL state necessary, can't the renderer do that? Dunno, at least that's how it seems, I might be wrong since I really just took a short look.

On the plus side, the naming is consistent from what I can tell, and no bullshit abbreviations that no one gets and for which you have to consult the documentation every fricking time.
Posted By: MasterQ32

Re: A wild engine appears! - 01/20/14 18:14

Originally Posted By: JustSid
Anyways, I looked into the Demo subfolder, and what I'm missing a bit is high level abstractions. For example in the asset demo, why do you have to rotate the object through its shader?! And why is setting up OpenGL state necessary, can't the renderer do that? Dunno, at least that's how it seems, I might be wrong since I really just took a short look.

On the plus side, the naming is consistent from what I can tell, and no bullshit abbreviations that no one gets and for which you have to consult the documentation every fricking time.


Oh thanks! I definitly need to rewrite the asset demo! If you take a look at SceneManagementDemo.cs you can see that you don't need to write a custom rendering like i did in the asset demo. But the thing with the render states is true, i should take some time to clear this into a better abstraction. Maybe i need to adjust my renderer so you can decide what things will be cleared before rendering...

And also thanks for the naming and stuff. I'm working after the microsoft coding guidelines and complete rulessets (those will be applied every two to four weeks) so the code stays clean, consistent and intuitive to read.
Posted By: MasterQ32

Re: A wild engine appears! - 02/02/14 13:43

Long time no update. I'm still working on the engine, but my free time reduced so progress is slower than before. I've reworked the rendering process to be more flexible, also i'm working on multithreading. Also i will add deferred asset loading so your game won't freeze on loading a 150 MB 3D model.
Next thing to come is transparency and an asset preprocessor with encryption and compression for your assets.

Have a nice day!
Felix
Posted By: MasterQ32

Re: A wild engine appears! - 02/09/14 12:00

Damn spam bots...

Just some updates:
I'm having exams time right now so not that much time to work on the engine...
But here is a screenshot:



The screenshot features the deferred renderer, a character controller and physics. You can push the box around with the character and the red light is rotating around the char, so you can see different lighting effects.

Code for creating the walkable, physics player:
Code:
SceneNode player = new SceneNode();
player.Transform.LocalPosition = new Vector3(0, 3, 0);
player.Components.Add<CharacterController>();
player.Components.Add<Renderer>().Model = Game.Assets.Load<Model>("models/character");
player.Components.Add<PlayerInput>();
player.Parent = this.scene.Root;

SceneNode swirl = new SceneNode();
swirl.Transform.LocalPosition = new Vector3(2, 0, 0);
swirl.Components.Add<Scriptable>().Script =
    @"function update(self, time)
        self.Node.Transform:Rotate(0, 60 * time.DeltaTime, 5 * time.DeltaTime)
    end";
swirl.Parent = player;

SceneNode light = new SceneNode();
light.Components.Add<PointLight>().Color = Color.Red;
light.Parent = swirl;



For those who never worked outside Gametudio:
SceneNode is some kind of "ENTITY" that allows you to create objects in your scene. The nodes build up a scene hierarchy so every child object moves relative to its parent.

Also every SceneNode has an arbitrary number of components. A component defines a behaviour or information for the scene node like a Gamestudio "action".
The main difference is that an action is started and then runs until it dies. Components can be enabled or disabled, also expose variables you can change at runtime. So you start the light component and then you can just get the light from the SceneNode and modify its color.

There are some premade components already like RigidBody for physics and different shapes for their appearance. Unlike gamestudio you can define your physics shape pretty good and the shape is not depending on the model you use.

Next there is the Renderer component. It does what its name says: It renders something. Well, not exactly, but you can see the effects. The Renderer component adds a 3D model to the render list with the transformation (position, rotation) of the scene node. Then the SceneRenderer draws the whole scene.

This approach allows you to create a custom scene rendering without changing anything on the scene logic itself. So changing from a simple texture rendering without lighting to a complex tiled forward renderer is possible. You don't even have to change a line of code in your whole scene, you just need to switch the renderer.

Regards
Felix

PS.: The engine now uses a multithreaded approach. It renders now while updating the physics.

PPS.: Ask me questions!
Posted By: FBL

Re: A wild engine appears! - 02/09/14 13:14

Das sieht vom Script her schon fast wie Unity aus... laugh
Posted By: MasterQ32

Re: A wild engine appears! - 02/09/14 13:39

Originally Posted By: Firoball
Das sieht vom Script her schon fast wie Unity aus... laugh

Yep, oriented myself on the Unity API. I like the component based design, but if you want, you can also subclass SceneNode to create a self-contained entity.
Posted By: the_clown

Re: A wild engine appears! - 03/17/14 09:42

Any new developments on this? laugh
Posted By: MasterQ32

Re: A wild engine appears! - 03/17/14 11:13

Yep, still working on this. Had a lot to do the last month, so no time for the engine.

Yesterday i discarded all UI code and i'm now looking into other techniques.
Thinking about implementing WebKit or Gecko as a UI engine but this could be overkill or a huge pile of work.
So my current plans are: Finding an easy solution for a web browser UI or writing a system similar to XAML/WPF and HTML to create your UI by XML and not by code.

Also there were a lot of changes in my development branch:
Huge improvements on the shader system (single shader file)
Shaders now have automatic uniform assignments (from properties)
Normal Mapping is now supported
Removed jitter, added Bullet
Engine now uses multithreading, can defer routines and has a coroutine system
Deferred Asset loading (in other thread)
Game has GameStates that allow to create different states for a game (Menu, Ingame, ...)

Known bugs:
Sound completly broken right now smirk
Posted By: Hummel

Re: A wild engine appears! - 03/17/14 15:32

Do you use OpenTK for the OpenGL/AL stuff?
Posted By: MasterQ32

Re: A wild engine appears! - 03/17/14 15:33

Yes, why do you ask?
Posted By: Hummel

Re: A wild engine appears! - 03/17/14 15:51

I will most likely switch from SharpDX to OpenTK for my engine framework soon. Since I started to follow all those fancy developers on Twitter I kinda feel lonely/dumb using DX.
Posted By: MasterQ32

Re: A wild engine appears! - 03/17/14 15:52

Yeah, i really like OpenGL4. The shader programming is imho much better and easier to understand and you don't need those weird semantics for variables.
Also vertex layouting is more flexible.
Posted By: MasterQ32

Re: A wild engine appears! - 03/21/14 00:32

Little update: Started working on my game:
UI is coded with HTML5/Javascript and Awesomium. Models in the scene are created via Drag'n'Drop
Posted By: MasterQ32

Re: A wild engine appears! - 03/27/14 17:32

Next Update:
Integrated bloom and improved overall shader programming:

Posted By: the_clown

Re: A wild engine appears! - 03/28/14 11:58

Uh nice, Awesomium. May I ask how long the integration took you?
Posted By: MasterQ32

Re: A wild engine appears! - 03/28/14 12:01

Without searching for the bug because of a wrong thread context:
20 Minutes

Creating WebCore, WebSession, WebView, Default BitmapSurface that copies itself on update into a Texture2D, calling WebCore.Update from the update loop and drawing the Texture2D on the screen.

Javascript Integration is also pretty easy.

I can post an example project if you like...
Posted By: the_clown

Re: A wild engine appears! - 03/28/14 14:24

Oh, an example project would be extremely nice.
Fun fact, I'm writing this very post from within a simple openGL context window - I call it the most primitive browser ever seen xD so obviously, basic integration is really fluffy so far, but I'd greatly appreciate a small example.
Posted By: MasterQ32

Re: A wild engine appears! - 03/28/14 19:10

Okay, it will take some time to write you the example because i'm refactoring the whole shader system right now.
The current system was a bad designed patchwork class that just served its job but was not really the way i want a good shader system...

So i'm rewriting the whole system right now, posting an example as soon as it is finished.
Posted By: the_clown

Re: A wild engine appears! - 03/28/14 20:05

Ah great thank you very much laugh
Good luck with the shader system. tongue
Posted By: MasterQ32

Re: A wild engine appears! - 03/28/14 20:07

Heh thanks! I'm really excited how it will turn out. I got some ideas i think other engines do not have.
I'm trying to have better usability now and also flexibility.

It will be possible to write a custom shader with vertex animations and stuff that will work out-of-the-box with the deferred rendering or any other custom renderers if they are implemented right.
Posted By: MasterQ32

Re: A wild engine appears! - 03/29/14 12:32

So finally only one thing is still missing from the new system:
The shader source code format

I've thought about it, the user should be able to have a maximum of flexibility to write their shaders but i also want a unified shader interface.
So i need some kind of markup language around the shader source files

XML doesn't really work because the contained glsl code may contains < or > so no option
JSON is another spread markup language. But its syntax isn't that easy to read.
So my solution was Lua. The engine already has a lua scripting interface so easy integration for me. Also way more options for the user to create shaders.

Here is a basic example for an object shader:

Code:
-- We compile with GLSL Version 3.3
shader.version = "330"

-- Add a global shader source file that is accessible from all shaders:
shader.add
{
	type = "global",
	source = 
[[
	uniform mat4 matWorld;
	uniform mat4 matView;
	uniform mat4 matProjection;
	uniform sampler2D meshDiffuseTexture;
]]
}

-- Add a vertex shader. The input variables and layout is specified by the input entry
shader.add
{
	type = "vertex",
	input = "mesh",
	source = 
[[
	out vec2 uv;

	void main()
	{
		vec4 pos = vec4(vertexPosition, 1);
		gl_Position = matProjection * matView * matWorld * pos;
		
		uv = vertexUV;
	}
]]
}

-- Add a fragment shader. Simple alpha-testing shader.
shader.add
{
	type = "fragment",
	source = 
[[
	layout(location = 0) out vec4 color;
	in vec2 uv;
	void main()
	{
		color = texture(meshDiffuseTexture, uv);
		if(color.a < 0.5f) discard;
	}
]]
}



Imho this solution is really acceptible because it is easy to read and provides flexibility.
The coolest thing is that your shaders are not static code.
You can easily create a shader based on the system specs or some dynamic settings based on os, graphics card, ...

What do you think?
Posted By: the_clown

Re: A wild engine appears! - 03/29/14 13:26

Now THAT looks smooth.
Posted By: MasterQ32

Re: A wild engine appears! - 03/29/14 18:57

Okay, i reworked the whole shader system. Was a bunch of work but it's great now. Much easier as to use as long as you don't write custom renderning. Then you have to write 3 lines instead of one tongue

The engine now has only one default shader that will expand with the rest of the engine. It will be compiled on demand with the correct subshaders so it works for forward rendering as well as deferred rendering.

Here an example:

Click to reveal.. (Shader Source)

Code:
shader:add
{
	type = "global",
	source = 
[[
	// Transformation matrices
	uniform mat4 matWorld;
	uniform mat4 matView;
	uniform mat4 matProjection;

	// Mesh textures
	uniform sampler2D meshDiffuseTexture;
	uniform sampler2D meshSpecularTexture;
	uniform sampler2D meshEmissiveTexture;

	// Deferred renderer uniforms
	uniform sampler2D renderDiffuseLightBuffer;
	uniform sampler2D renderSpecularLightBuffer;

	// Material Values
	uniform vec4 mtlDiffuse;
	uniform vec4 mtlSpecular;
	uniform vec4 mtlEmissive;
	uniform float mtlEmissiveScale;
]]
}

shader:add
{
	type = "vertex",
	input = "mesh",
	source = 
[[
	out vec3 position;
	out vec3 normal;
	out vec3 tangent;
	out vec3 bitangent;
	out vec2 uv;
	out vec4 screenSpaceUV;

	void main()
	{
		vec4 pos = vec4(vertexPosition, 1);
		gl_Position = matProjection * matView * matWorld * pos;

		position = (matWorld * pos).xyz;

		mat3 mv3x3 = mat3(matWorld);
		normal = normalize(mv3x3 * vertexNormal);
		tangent = normalize(mv3x3 * vertexTangent);
		bitangent = normalize(mv3x3 * vertexBiTangent);

		uv = vertexUV;
		screenSpaceUV = gl_Position;
	}
]]
}

shader:add
{
	type = "fragment",
	source = 
[[
	layout(location = 0) out vec4 color;
	in vec2 uv;
	void main()
	{
		color = texture(meshDiffuseTexture, uv);
		if(color.a < 0.5f) discard;
	}
]]
}

shader:add
{
	type = "fragment",
	class = "DeferredRenderer",
	source = 
[[
	in vec2 uv;
	in vec4 screenSpaceUV;

	layout(location = 0) out vec4 color;

	void main()
	{
		vec4 diffuseColor = texture(meshDiffuseTexture, uv);
		vec3 specularColor = texture(meshSpecularTexture, uv).rgb;
		vec3 emissiveColor = texture(meshEmissiveTexture, uv).rgb;

		vec2 ss = 0.5f + 0.5f * screenSpaceUV.xy / screenSpaceUV.w;

		color.rgb = mtlDiffuse.rgb * diffuseColor.rgb * textureLod(renderDiffuseLightBuffer, ss, 0.0f).rgb;
		color.rgb += mtlSpecular.rgb * specularColor * textureLod(renderSpecularLightBuffer, ss, 0.0f).rgb;
	
		color.rgb += emissiveColor * mtlEmissiveScale * mtlEmissive.rgb;

		color.a = diffuseColor.a;
		if(color.a < 0.5f) discard;
	}
]]
}




As you can see, the shader defines two fragment shaders. One without a class. That's the default fragment shader that will be used.
To bind a shader, we use the Shader.Select method:
Code:
// Select the default shader:
CompiledShader cs = shader.Select();

// Bind it!
cs.Bind();



To bind the shader with the class, we use:
Code:
// Select the shader with class modifier:
CompiledShader cs = shader.Select("DeferredRenderer");
// Bind it (again)
cs.Bind();



But that's not all!
We can also override some subshaders if we want/need to.
Code:
// Create a custom fragment shader
var geometryPixelShader = new ShaderFragment(ShaderType.FragmentShader, geomPixSource);

// Select the shader with class and override the pixel shader.
CompiledShader cs = shader.Select("DeferredRenderer", geometryPixelShader);

// Should be known already
cs.Bind();


I'm using this functionality in the deferred renderer. Just provide any custom shader and my renderer can use it (if the output variables of the vertex/geometry/tesselation shader are right wink )

Oh, how do you load a shader?
Several possibilities: Using the AssetManager, create it in the engine with Shader.Load or even built it with CompiledShader and ShaderFragment.

I hope I could give some insight on how the new shader system works.

Don't hesitate to ask me some questions!

Regards
Felix
Posted By: MasterQ32

Re: A wild engine appears! - 03/29/14 20:25

@the_clown:
Your Awesomium example is here!

Code:
using Awesomium.Core;
using OpenTK;
using OpenTK.Graphics.OpenGL4;
using OpenWorld.Engine;
using System;

namespace WebDemo
{
	class Program : Game
	{
		static void Main(string[] args)
		{
			Program pgm = new Program();
			pgm.Run();
		}

		protected override PresentationParameters GetPresentationParameters()
		{
			var def = base.GetPresentationParameters();
			def.Title = "OpenWorld goes Web";
			return def;
		}

		Texture2D webTexture;
		WebSession session;
		WebView view;

		protected override void OnLoad()
		{
			base.OnLoad();

			FrameBuffer.ClearColor = Color.White;
			this.webTexture = new Texture2D(
				this.Width,
				this.Height,
				PixelInternalFormat.Rgba,
				PixelFormat.Rgba,
				PixelType.UnsignedByte);

			WebConfig config = new WebConfig()
			{

			};
			WebCore.Initialize(config, true);

			this.session = WebCore.CreateWebSession(new WebPreferences()
			{
				WebAudio = true,
				WebGL = true,
				AllowInsecureContent = true,
				WebSecurity = false,
				AppCache = false,
				CanScriptsOpenWindows = false,
				CanScriptsCloseWindows = false,
				CanScriptsAccessClipboard = true,
				Plugins = false,
			});

			this.view = WebCore.CreateWebView(this.webTexture.Width, this.webTexture.Height, this.session, WebViewType.Offscreen);
			this.view.IsTransparent = true; // Website background is transparent

			this.view.CreateSurface += (s, e) =>
			{
				// Create Awesomium default bitmap surface
				var bmpSurface = new BitmapSurface(e.Width, e.Height);
				bmpSurface.Updated += (s1, e1) =>
				{
					// If the surface changes, update the OpenGL texture
					this.webTexture.Load(bmpSurface.Buffer, bmpSurface.Width, bmpSurface.Height);
				};
				e.Surface = bmpSurface;
			};

			// Set injection events
			Input.Mouse.Move += Mouse_Move;
			Input.Mouse.ButtonDown += Mouse_ButtonDown;
			Input.Mouse.ButtonUp += Mouse_ButtonUp;
			Input.Mouse.WheelChanged += Mouse_WheelChanged;

			view.Source = new Uri("http://masterq32.de/");
		}

		void Mouse_ButtonDown(object sender, OpenTK.Input.MouseButtonEventArgs e)
		{
			switch (e.Button)
			{
				case OpenTK.Input.MouseButton.Left:
					view.InjectMouseDown(MouseButton.Left);
					break;
				case OpenTK.Input.MouseButton.Middle:
					view.InjectMouseDown(MouseButton.Middle);
					break;
				case OpenTK.Input.MouseButton.Right:
					view.InjectMouseDown(MouseButton.Right);
					break;
			}
		}

		void Mouse_ButtonUp(object sender, OpenTK.Input.MouseButtonEventArgs e)
		{
			switch (e.Button)
			{
				case OpenTK.Input.MouseButton.Left:
					view.InjectMouseUp(MouseButton.Left);
					break;
				case OpenTK.Input.MouseButton.Middle:
					view.InjectMouseUp(MouseButton.Middle);
					break;
				case OpenTK.Input.MouseButton.Right:
					view.InjectMouseUp(MouseButton.Right);
					break;
			}
		}

		void Mouse_WheelChanged(object sender, OpenTK.Input.MouseWheelEventArgs e)
		{
			if (Input.Keyboard[OpenTK.Input.Key.ShiftLeft])
				view.InjectMouseWheel(0, 20 * e.Delta);
			else
				view.InjectMouseWheel(20 * e.Delta, 0);
		}

		void Mouse_Move(object sender, OpenTK.Input.MouseMoveEventArgs e)
		{
			view.InjectMouseMove(e.X, e.Y);
		}

		protected override void OnUpdate(GameTime time)
		{
			// WebCore.Update must be called in OpenGL-Thread
			OpenGL.Invoke(WebCore.Update);
			base.OnUpdate(time);
		}

		protected override void OnDrawPreState(GameTime time)
		{
			// Clears the screen
			FrameBuffer.Clear();
		}

		protected override void OnDrawPostState(GameTime time)
		{
			// Draws the web interface over everything else
			this.Utilities.Draw(new Box2(0, 0, this.Width, this.Height), this.webTexture);
		}
	}
}

Posted By: the_clown

Re: A wild engine appears! - 03/29/14 22:38

Uh that's much less code than I'd expected from what the first glance tells me. Thank you very much, this is for sure very helpful. laugh
Posted By: MasterQ32

Re: A wild engine appears! - 03/29/14 22:49

You're welcome. I was surprised as well how easy the integration works.
Only thing that is a little bit nervy right now is that it takes about 3 seconds to start up the rendering process. For testing not so good, but in a final game it won't be a problem imho.

EDIT:
Any comments on the shader system?
Posted By: the_clown

Re: A wild engine appears! - 01/29/15 19:39

Digging this up again, I noticed you were using OpenTK for this, did you experience any problems with the library? I've read some diffuse statements about problems with VBOs and the general windowing, did you notice anything about that?
Posted By: MasterQ32

Re: A wild engine appears! - 01/29/15 21:48

I never had any problems with OpenTK, the library itself is well made and stable. I don't know what could go wrong with the VBOs as OpenTK is only a thin wrapper over OpenGL. Only the Window Part was pretty heavy but it worked perfectly for me.
Posted By: the_clown

Re: A wild engine appears! - 01/30/15 09:55

Could you elaborate what you mean by the window part was very heavy? (I'm really sorry I'm abusing this thread)
Posted By: MasterQ32

Re: A wild engine appears! - 01/30/15 12:24

Heavy is "wrapper" terms. OpenTK is pretty much a thin wrapper where every function is wrapped like this:
Code:
void function(...)
{
glGetErrror(); // Reset error
GL.function(...);
checkErrorAndThrowExceptionIfAny(glGetError());
}



Heavy means that it abstracts stuff away (like window creation under different OS). You just create a new GameWindow object and you have a window open.

In terms of usability, this is awesome wink
Posted By: the_clown

Re: A wild engine appears! - 01/30/15 12:26

Ah I see what you mean. Well that's a good thing then. wink
© 2024 lite-C Forums