Irrlicht Hello World!

In this tutorial, you will learn to write a simple “Hello World!” application to test whether your project has been set up correctly. At the end of this tutorial, you should be able to get this result:

Pretty cool right?

Before we start, let’s download the badass-looking beast model created by Psionic by clicking the image below:

After you’ve downloaded the zip file, extract everything to your project directory. Make sure “beast.b3d” and “beast1.jpg” are both at the same folder as your executable (.exe).

Now, let’s start writing some code!

First of all, you need to include the main Irrlicht header to your script:

#include <irrlicht.h>

After that, predefine all the irrlicht namespaces, like so:

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

If you don’t add in the codes above, you will need to call the namespaces manually everytime you use its child classes. Without predefining it, you need to call irr::scene::ISceneNode *node instead of ISceneNode *node, for example, which makes your code much longer and harder to read.

After that, define the main function:

int main(){

Note: If you don’t know what is a main function, you probably need to stop reading this tutorial, go ahead and pick up some basic C/C++ knowledge, and come back again after that.

Now, we will create an Irrlicht device and set the window caption by calling:

IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d(512,512), 32, false, false, false, 0);
device->setWindowCaption(L"Irrlicht Hello World Tutorial");

Let me explain a bit here. At the first line, we created an IrrlichtDevice pointer and named it as device. Then, we called createDevice() function to ask Irrlicht to create the rendering device based on 7 parameters which we have filled in. The parameters are explained below, in ascending order:

deviceType: Type of device. There are currently 5 options for us to choose from. As you can see, we’ve chosen OpenGL as the rendering device in this example.

  1. OpenGL – EDT_OPENGL
  2. DirectX 8 – EDT_DIRECT3D8
  3. DirectX 9 – EDT_DIRECT3D9
  4. Software – EDT_SOFTWARE
  5. Software 2 – EDT_BURNINGSVIDEO

windowSize: Size of the window. In this example, we set it as 512×512.
bits: Number of bits per pixel when running full screen mode (which will be ignored in windowed mode). It should be either 16 or 32.
fullscreen: Whether or not we enable full screen mode.
stencilbuffer: Specify if we want to use stencil buffer for drawing shadows.
vsync: Enable/disable vsync mode. Only useful when running full screen.
eventReceiver: An object which receives events. We set it as 0 because we are not going to use this parameter in this example.

Then, we will create a video driver, scene manager and GUI environment respectively by calling:

IVideoDriver *driver = device->getVideoDriver();
ISceneManager *smgr = device->getSceneManager();
IGUIEnvironment *guienv = device->getGUIEnvironment();

After that, we display a line of static text on the screen:

guienv->addStaticText(L"Hello World! You are now running Irrlicht Engine!", rect(10,10,200,22), true);

For the code above, we were calling the function addStaticText() which derives from the GUI environment class named guienv. There are 3 parameters for that particular functions: The first parameter is the text that you want to display on the screen. The second parameter is the size and location of the rectangular container where your text will be placed in. See the image below to help you understand more about text container and how you adjust the parameters. The third parameter is to specify whether we want the border line of the container to be shown.

Now, the most exciting part: We will now place the beast model into the scene!

IAnimatedMesh *mesh = smgr->getMesh("beast.b3d");
IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh);

if (node)
{
    node->setMaterialFlag(EMF_LIGHTING, false);
    ITexture *texture = driver->getTexture("beast1.png");
    node->setMaterialTexture(0, texture);
    node->setFrameLoop(1, 25);
    node->setRotation(vector3df(0, 180, 0));
}

At the first line, we loaded the mesh “beast.b3d” which you downloaded at the beginning. Please remember to place the file in the same directory as your executable binary file (.exe). Then, at the second line, we created a scene node, which stores information of your mesh, such as location, scale, attributes, materials, and so on. You can create many different individual node which uses the same mesh.

From the fourth line onwards, it means that if the animated scene node was successfully created, we will then:

  1. Disable lighting affecting the beast.
  2. Load a texture file called “beast1.png” from the directory.
  3. Apply the texture to the beast on the first UV layer. You can apply different textures on different layers, but we don’t need to do that for now.
  4. Load the animation from frame 1 to frame 25, and keep looping it.
  5. Rotate the node by 180 degree along the Y-axis.

After placing the beast, we need a camera to render the scene:

ICameraSceneNode *camera = smgr->addCameraSceneNode(0, vector3df(-100, 100, 150), vector3df(0, 5, 20));

There are 3 parameters used by the camera. The first one is the id number for that particular camera node, the second parameter is the camera location and third parameter is the viewing target of the camera.

Then, we will start running the main loop. Everything will be rendered to the screen at this point including all the objects in the scene and even the user interface.

while(device->run())
{
    driver->beginScene(true, true, SColor(255, 100, 101, 140));
    smgr->drawAll();
    guienv->drawAll();
    driver->endScene();
}
device->drop();
return 0;}

There are 3 parameters in the function beginScene(): The first one is to enable/disable back buffer, second parameter is to enable/disable z-buffer and the third parameter is the color used to clear the screen. Please remember that everything must be drawn between beginScene() and endScene() functions.

You can now build your project and that’s all for this tutorial. For those who are lazy, the whole script is shown below:

#include <irrlicht.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

int main()
{
    IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d(512,512), 32, false, false, false, 0);
    device->setWindowCaption(L"Irrlicht Hello World Tutorial");

    IVideoDriver *driver = device->getVideoDriver();
    ISceneManager *smgr = device->getScenemanager();
    IGUIEnvironment *guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"Hello World! You are now running Irrlicht Engine!", rect(10,10,200,22), true);

    IAnimatedMesh *mesh = smgr->getMesh("beast.b3d");
    IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode(mesh);

    if (node)
    {
        node->setMaterialFlag(EMF_LIGHTING, false);
        ITexture *texture = driver->getTexture("beast1.png");
        node->setFrameLoop(1, 25);
        node->setMaterialTexture(0, texture);
        node->setRotation(vector3df(0, 180, 0));

    }

    ICameraSceneNode *camera = smgr->addCameraSceneNode(0, vector3df(-100, 100, 150), vector3df(0, 5, 20));

    while(device->run())
    {
        driver->beginScene(true, true, SColor(255, 100, 101, 140));
        smgr->drawAll();
        guienv->drawAll();
        driver->endScene();
    }
    device->drop();
    return 0;
}

If an error appears when you’re launching your program, it’s most probably because you didn’t copy the important irrlicht DLL file into your project directory. The DLL file needs to be placed in the same folder as your executable file (.exe).

If you want to remove the ugly console window, open up the project properties window, and change your project from console application to GUI application.

Have fun!

Setting Up Irrlicht Project

In this tutorial, I will guide you step-by-step on how to set up Irrlicht Engine on Code::Blocks so that you can start writing your first 3D game in C/C++ language. Before we start, please make sure that you have installed or downloaded the following programs:

Irrlicht Engine
Code::Blocks with MinGW

Once you have installed Code::Blocks, launch the program and create a new project by calling File->New->Project, like so:

We are not going to use a template for now, so we’ll create an empty project instead:

Now that you have created an empty project, you need to create your first empty source file by going to File->New->Empty file

A window will pop out and ask you whether you want to add the file to your project. Click “Yes” and proceed to save it to your project directory. Make sure that the file type is “C/C++ files”:

Another window will pop out and ask you which target should the file belongs to. In this example, we will tick both options. Occasionally you would want a source file to be included in just a single target but that happens quite rarely.

After that, your file will appear under the “Sources” folder. Double click your source file you just saved (i.e. main.cpp) and it will get launched at the right hand panel.

Now that you have successfully created a working project in Code::Blocks, you need to link your compiler with the Irrlicht Engine so that you can access to its API. In order to do that, go to Project->Build options:

A window will then pop out. Click your project name instead of just “Debug” or “Release” because we are going to adjust the settings that affect both targets. Please do not simply change the project settings unless you know what you are doing. You might not be able to compile your app if you mess the settings up.

In this example, we will change 2 things: the “Linker settings” and “Search directories”. First, go to the “Linker settings” tab and click the “Add” button. A window will pop out and ask you which library file should be included to your project. Normally the library file is located at [irrlicht dir]\lib\Win32-gcc\libIrrlicht.a if you’re running Windows. [irrlicht dir] is the directory where you installed/extracted the Irrlicht Engine.

Now that you have added the library file to your compiler, you will need to link some of the Irrlicht directories to the compiler as well so that it can access to its header files. Click the “Search directories” tab and select the “Add” button under “Compiler” child tab. Add the particular folder which contains all the Irrlicht header files which usually located at [irrlicht dir]\include:

Press the “OK” button and you’re done!