Jump to content

Turbo Game Engine (Leadwerks 5) beta updated



A new beta update is available for subscribers. What's new?

Point and spot lights are now supported in the new Vulkan renderer, with either PBR or Blinn-Phong lighting. Lighting is controlled by the shader in the material file. There are two main shaders you can use, "Shaders/PBR.spv" and "Shaders/Blinn-Phong.spv". See below for more details.


JSON Materials

Materials can now be loaded from JSON files. I am currently using the .json file extension instead of "mat", "mtl", or something else. If you load a scene and a JSON file is available with the same name as a material in that scene, the material will be loaded from a JSON file instead of the Leadwerks 4 .mat files. For example, you can create a JSON file named "brick01.json", place it in the same folder as "brick01.mat" and the new engine will load the JSON material if the brick material is used in a scene. However, it is not necessary to do this as the engine can also load Leadwerks 4 material files.

A Turbo JSON material file looks like this. The string tokens are more or less locked in now and it is safe to start using them.

	"turboMaterialDef": {
		"color": [ 1, 1, 1, 1 ],
		"emission": [ 0, 0, 0 ],
		"metallic": 0,
		"roughness": 0.6,
		"doubleSided": false,
		"blend": false,
		"albedoMap": "./concrete_clean_diff.tex",
		"normalMap": "./concrete_clean_dot3.tex",
		"metallicRoughnessMap": "",
		"emissionMap": "",
		"baseShader": "Shaders/PBR.spv",
		"shadowShader": "Shaders/Shadow.spv",
		"depthShader": "Shaders/DepthPass.spv"

You can also indicate a shader for the new engine to use in an old Leadwerks 4 material file by adding a text line like this to the .mat file:


You do not need to specify a shader unless you are using a custom shader. JSON material files, by default, will use the PBR shader. Leadwerks 4 material files, by default, will use the Blinn-Phong shader.

BC5 / BC7 Texture Compression
A ton of new compression formats have been added, including the BC7 and BC5 formats, which provide better quality than DXT compression. Visual Studio 2019 actually has some good built-in DDS tools, although the BC7 compressor Is very slow. A sample material is provided using DDS textures (see "Materials/Rough-rockface1.json").

Lua Commands
A set of simple global Lua commands has been added.

template<typename T>
void LuaSetGlobal(const std::string& name, T var)

template<typename T>
void LuaPushObject(const std::string& name, T var)

template<typename T>
T LuaToObject(const int index = -1)

int LuaCollectGarbage(const int what = LUA_GCCOLLECT, const int data = 0);
void LuaPushString(const std::string& s);
void LuaPushNumber(const double n);
void LuaPushBoolean(const bool b);
void LuaPushNil();
void LuaPushValue(const int index = -1);
bool LuaIsTable(const int index = -1);
bool LuaIsNumber(const int index = -1);
bool LuaIsString(const int index = -1);
bool LuaIsBoolean(const int index = -1);
bool LuaIsObject(const int index = -1);
bool LuaIsNil(const int index = -1);
bool LuaIsFunction(const int index = -1);
bool LuaToBoolean(const int index = -1);
std::string LuaToString(const int index = -1);
double LuaToNumber(const int index = -1);
int LuaType(const int index = -1);
int LuaGetField(const std::string& name, const int index = -1);
int LuaGetTable(const std::string& name, const int index = -1);
int LuaGetGlobal(const std::string& name);
void LuaSetField(const std::string& name, const int index = -1);
void LuaSetTable(const int index = -1);
void LuaPop(const int levels = 1);
void LuaRemove(const int index = -1);
void LuaSetStackSize(const int sz);
int LuaGetStackSize();
void LuaNewTable();

This makes our code simpler and more readable:

#include "Turbo.h"

using namespace Turbo;

int main(int argc, const char *argv[])
	//Create a window
	auto window = CreateWindow("MyGame", 0, 0, 1280, 720);
	//Create a rendering context
	auto context = CreateContext(window);

	//Set some variables in the script environment
	LuaSetGlobal("mainwindow", window);
	LuaSetGlobal("maincontext", context);

	//Create the world
	auto world = CreateWorld();

	//Load a scene
	auto scene = LoadScene(world, "Maps/start.map");

	//Show off a PBR material
	auto sphere = CreateSphere(world);
	auto mtl = LoadMaterial("Materials/Rough-rockface1.json");
	sphere->Move(0, 1, 0);

	while (window->KeyHit(KEY_ESCAPE) == false and window->Closed() == false)
	return 0;

You can gain access to the beta and support development by subscribing for just $5.

  • Like 5

1 Comment

Recommended Comments

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...