Jump to content

Ultra Engine testing


Josh
 Share

Recommended Posts

True, but as soon as you trigger the pbr-pipeline the background and transparent objects are not visible anmyore:

just add this to the sample above: 

auto specmap = LoadTexture("Materials/Environment/Storm/specular.dds");
    auto diffmap = LoadTexture("Materials/Environment/Storm/diffuse.dds");

    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_BACKGROUND);
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_SPECULAR);
    world->SetEnvironmentMap(diffmap, ENVIRONMENTMAP_DIFFUSE);

and you will see, that with tesselation the background is not rendering, without tesselation it works.

  • Windows 10 Pro 64-Bit-Version
  • NVIDIA Geforce 1080 TI
Link to comment
Share on other sites

2 hours ago, klepto2 said:

True, but as soon as you trigger the pbr-pipeline the background and transparent objects are not visible anmyore:

just add this to the sample above: 



auto specmap = LoadTexture("Materials/Environment/Storm/specular.dds");
    auto diffmap = LoadTexture("Materials/Environment/Storm/diffuse.dds");

    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_BACKGROUND);
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_SPECULAR);
    world->SetEnvironmentMap(diffmap, ENVIRONMENTMAP_DIFFUSE);

and you will see, that with tesselation the background is not rendering, without tesselation it works.

Fixed!

You will need to call Material::SetTessellation(true) for tessellation to appear, in addition to having it enabled on a per-camera basis.

Tessellation is always enabled for terrain, if the camera has the setting enabled.

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

Works much better now, but i have found another issue:

#include "UltraEngine.h"
#include "ComponentSystem.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    //Get the display list
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Terrain Paint", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

    //Create a world
    auto world = CreateWorld();
    world->SetAmbientLight(0);

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a camera
    auto camera = CreateCamera(world);
    camera->SetFov(70);
    camera->SetPosition(0, 100, -100);
    camera->SetRotation(45, 0, 0);
    camera->SetClearColor(0.125);

    //Sunlight
    auto light = CreateDirectionalLight(world);
    light->SetRotation(45, 35, 0);
    light->SetColor(2);

    //Create terrain
    auto terrain = CreateTerrain(world, 512);
    terrain->LoadHeightmap("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Terrain/512.r16");
    terrain->SetScale(1, 100, 1);

    //Create base material
    auto ground = CreateMaterial();
    auto diffusemap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/river_small_rocks_diff_4k.dds");
    auto normalmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/river_small_rocks_nor_gl_4k.dds");
    ground->SetTexture(diffusemap, TEXTURE_DIFFUSE);
    ground->SetTexture(normalmap, TEXTURE_NORMAL);
    terrain->SetMaterial(ground);

    //Create paint material
    auto rocks = CreateMaterial();
    diffusemap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k.dds");
    normalmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k_dot3.dds");
    auto dispmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k_disp.dds");
    rocks->SetTexture(diffusemap, TEXTURE_DIFFUSE);
    rocks->SetTexture(normalmap, TEXTURE_NORMAL);
    rocks->SetTexture(dispmap, TEXTURE_DISPLACEMENT);

    //Camera controls
    auto actor = CreateActor(camera);
    actor->AddComponent<CameraControls>();

    auto specmap = LoadTexture("Materials/Environment/Storm/specular.dds");
    auto diffmap = LoadTexture("Materials/Environment/Storm/diffuse.dds");

    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_BACKGROUND);
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_SPECULAR);
    world->SetEnvironmentMap(diffmap, ENVIRONMENTMAP_DIFFUSE);

    auto plane_mat = CreateMaterial();
    plane_mat->SetTessellation(false);
    plane_mat->SetTransparent(true);
    plane_mat->SetColor(0.0, 0.0, 1.0, 0.5);

    auto plane = CreatePlane(world, 2048, 2048,64,64);
    plane->SetMaterial(plane_mat);
    plane->SetPosition(0.0, 35.0, 0.0);

    bool refraction = false;
    bool tesselation = false;
    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        if (window->KeyHit(KEY_F1)) camera->SetWireframe(!camera->GetWireframe());
        if (window->KeyHit(KEY_F2))
        {
            tesselation = !tesselation;
            if (tesselation)
                camera->SetTessellation(8.0);
            else
                camera->SetTessellation(0.0);
        }
        if (window->KeyHit(KEY_F3))
        {
            refraction = !refraction;
            camera->SetRefraction(refraction);
        }

        if (window->MouseDown(MOUSE_LEFT))
        {
            auto mousepos = window->GetMousePosition();
            auto pickinfo = camera->Pick(framebuffer, mousepos.x, mousepos.y);



            if (pickinfo.success)
            {
                if (pickinfo.entity == terrain)
                {
                    iVec2 pos;
                    pos.x = Round(pickinfo.position.x) + terrain->resolution.x / 2;
                    pos.y = Round(pickinfo.position.z) + terrain->resolution.y / 2;
                    int radius = 20;
                    for (int x = pos.x - radius; x < pos.x + radius; ++x)
                    {
                        for (int y = pos.y - radius; y < pos.y + radius; ++y)
                        {
                            float strength = 1.0f - Vec3(x, y, 0).DistanceToPoint(Vec3(pos.x, pos.y, 0)) / float(radius);
                            if (strength <= 0.0f) continue;
                            float wt = terrain->GetMaterialWeight(x, y, rocks);
                            wt += 0.1f;
                            terrain->SetMaterial(x, y, rocks, wt);
                        }
                    }
                }
            }
        }
        world->Update();
        world->Render(framebuffer);

        WString title = "Tesselation - Test: ";
        title += "F1 - Wireframe(" + WString(camera->GetWireframe() ? "true" : "false") + ") ";
        title += "F2 - Tesselation(" + WString(tesselation ? "true" : "false") + ") ";
        title += "F3 - Refraction(" + WString(refraction ? "true" : "false") + ") ";
        window->SetText(title);
    }
    return 0;
} 

if you run this, you will see a terrain with a transparent plane (as pseudo water). The water is only visible under the following conditions:

  • Tesselation on, Refraction off
  • Tesselation off, Refraction on
  • Tesselation off, Refrection off (just to clarify that it all works, when now refraction is used)

Also the plane_mat->SetTesselation has no effect. The plane is always tesselated when the camera uses tesselation.

  • Windows 10 Pro 64-Bit-Version
  • NVIDIA Geforce 1080 TI
Link to comment
Share on other sites

Okay, I put some more time into it and I think the tessellation problems are fixed. It's a little bit complicated....

I think it is all working correctly now.

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

Client version 14 is uploaded. This adds a list of "files never to update" in the settings panel:
https://www.ultraengine.com/community/topic/61132-ultra-engine-testing/#comment-296282

This will prevent files like the project file or main.cpp from ever being overwritten.

 

  • Like 3

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

I wonder if the backups for files that have been updated should be moved to a single folder in the project directory rather than having mountains of .bak's lurking about, especially in the shaders folder.  It could keep the same hierarchy in the backups folder so you can find stuff.   I take it Ultra is going to be heavily updated over the coming months / years so it could get out of hand pretty quick.  Just a thought :)

EDIT : Or has is been done already.. <_<

Link to comment
Share on other sites

 "backup" folder will be created in the project directory. Inside, the subfolder structure of the project will be created and file revisions will be saved.

  • Like 1

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

In practice I am finding the backup files don't take much space. Binaries for plugins rarely change. Most of the project template files are small text files. Shader SPVs are probably the biggest files that frequently change, but they are still pretty small.

  • Like 1

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

This has me extremely puzzled - I just started working with kinematic joints again, and all was good, I could set its position with SetPose() and other things, but then a few builds later CreateKinematicJoint() started returning nullptr for no reason same as the slider joint too.  I uninstalled Ultra and reinstalled with no luck.  

Here's an example project where 'k' is empty.

#include "UltraEngine.h"
#include "ComponentSystem.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    auto plugin = LoadPlugin("Plugins/LELegacy.dll");

    //Get the displays
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

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

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a camera
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.125);
    camera->SetFov(70);
    camera->SetPosition(0, 1, -3);

    //Create a light
    auto light = CreateBoxLight(world);
    light->SetRotation(35, 45, 0);
    light->SetRange(-10, 10);

    auto p = CreatePivot(world);
    auto k = CreateKinematicJoint(Vec3(0, 0, 0), p);



    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}  

 

Link to comment
Share on other sites

Client version 15 is available in the first post in this thread. All previous builds will stop working with no warnings in a few days.

This update adds a check to see if the client version is supported (this will rarely change) and has better license authentication. The client version will be shown in the lower left corner of the window.

  • Like 2

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

6 hours ago, Josh said:

Benchmarks are updated with build-in FPS displays, since FRAPS is reportedly not working with some Vulkan drivers:
https://github.com/UltraEngine/Benchmarks

I decided to run some of these with my GTX 1050 TI with 2 GB of VRAM and here are my weird results.

Animation

Leadwerks: 4 FPS

Ultra: 300 FPS

Unity (DX11): 54 FPS

Unity (Vulkan): 56 FPS

 

Instanced Geometry

Leadwerks: 48 FPS

Ultra: 440 FPS

Unity (DX11): 32 FPS

Unity (Vulkan): 32 FPS

 

Lighting

Leadwerks: 380-500 FPS

Ultra: 170 FPS

Unity (DX11): 88 FPS

Unity (Vulkan): 100 FPS

 

 

Unique Geometry

Leadwerks: 42 FPS

Ultra: 1223 FPS 

Unity (DX11): 2 FPS

Unity (Vulkan): 2 FPS

 

I'm confused why Leadwerks is fastest in the lighting, and why Ultra is faster running unique geometry over instanced geometry. 

  • Upvote 1

Cyclone - Ultra Game System - Component PreprocessorTex2TGA - Darkness Awaits Template (Leadwerks)

If you like my work, consider supporting me on Patreon!

Link to comment
Share on other sites

Ultra runs the unique geometry test faster because it has fewer objects. The Instanced geometry test has 32768 boxes and the unique geometry test only has 4096 boxes. Since unique geometry is no problem for Ultra, that one runs much faster.

On my sort of low-end laptop GPU Ultra is slightly faster than Leadwerks on the lighting test. On my GEForce 1080 Ultra was running much faster. However, that was a build from ITSEC last year. I tried the old build on my laptop, and it was a little bit slower than the current build on the same laptop. I still have some questions about that test, but right now it looks like Leadwerks might run faster on low-end cards due to the more expensive PBR calculations, whereas Ultra runs faster on mid to high end cards due to the decreased memory bandwidth of the forward renderer.

  • Like 1

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

I threw together a quick example for you showing some of the issues I'm still seeing with entities popping in and out.  The green cube pops in and out and in my other project so does the player cylinder, doesn't seem to happen here though.  The entities are always in the centre of the camera and they still pop in and out.  If you remove the player cylinder the blue cube seems to fine, it's just the cube attached the slider.

#include "UltraEngine.h"
#include "ComponentSystem.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    auto plugin = LoadPlugin("Plugins/LELegacy.dll");

    //Get the displays
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

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

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a camera
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.125);
    camera->SetFov(70);


    //Create a light
    auto light = CreateDirectionalLight(world);
    light->SetRotation(35, 45, 0);
    light->SetRange(-10, 10);

    auto floor = CreateBox(world, 100, 0.1, 100);
    floor->SetPosition(0, -1, 0);


    auto hub_pivot = CreateBox(world, 0.25f);
    hub_pivot->SetCollider(nullptr);
    hub_pivot->SetMass(1.0f);
    hub_pivot->SetColor(0, 1, 0);

    auto slider_pivot = CreateBox(world, 0.25f);
    slider_pivot->SetMass(1.0f);
    slider_pivot->SetColor(0, 0, 1);

    auto player = CreateCylinder(world, 0.5f, 1.8f);
    player->SetCollider(nullptr);
    player->SetParent(slider_pivot);

    auto cam_pivot = CreatePivot(world);
    cam_pivot->SetParent(slider_pivot);
    cam_pivot->SetPosition(0.0f, 2.5f, 0.0f, true);

    camera->SetParent(cam_pivot);
    camera->SetPosition(0.0f, 1.8f, -5.0f, true);
    camera->SetRotation(25.0f, 0.0f, 0.0f);

    auto k = CreateKinematicJoint(Vec3(0, 0, 0), hub_pivot);
    auto s = CreateSliderJoint(Vec3(0, 0, 0), Vec3(0, 1, 0), hub_pivot, slider_pivot);

    Vec3 mousepos;
    float lookspeed = 0.1f;
    float looksmoothing = 0.5f;

    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        auto _displaySize = window->GetSize();
        float cx = Round((float)_displaySize.x / 2.0f);
        float cy = Round((float)_displaySize.y / 2.0f);

        auto mouse_position = Vec3(window->GetMousePosition().x, window->GetMousePosition().y, window->GetMousePosition().z);
        window->SetMousePosition(cx, cy);
        mouse_position = mouse_position * looksmoothing + mousepos * (1 - looksmoothing);
        auto dx = (mouse_position.x - cx) * lookspeed;
        auto dy = (mouse_position.y - cy) * lookspeed;

        auto camrot = cam_pivot->GetRotation();
        camrot.x += dy;
        camrot.y += dx;
        cam_pivot->SetRotation(camrot);
        mousepos = mouse_position;

        float angle = cam_pivot->GetRotation().y;
        Vec3 pos = hub_pivot->GetPosition(true);
        Vec3 up = Vec3(0.0f, 1.0f, 0.0f);
        Vec3 direction = Vec3(Sin(angle), 0, Cos(angle));
        Vec3 strafe = direction.Cross(up).Normalize();

        if (window->KeyDown(KEY_W)) { k->SetPose(pos + direction, Vec3()); }
        if (window->KeyDown(KEY_S)) { k->SetPose(pos - direction, Vec3()); }
        if (window->KeyDown(KEY_A)) { k->SetPose(pos + strafe, Vec3()); }
        if (window->KeyDown(KEY_D)) { k->SetPose(pos - strafe, Vec3()); }

        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}  

 

Link to comment
Share on other sites

#include "UltraEngine.h"
#include "ComponentSystem.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    //Get the display list
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Terrain Paint", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

    //Create a world
    auto world = CreateWorld();
    world->SetAmbientLight(0);

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a camera
    auto camera = CreateCamera(world);
    camera->SetFov(70);
    camera->SetPosition(0, 100, -100);
    camera->SetRotation(45, 0, 0);
    camera->SetClearColor(0.125);

    //Sunlight
    auto light = CreateDirectionalLight(world);
    light->SetRotation(45, 35, 0);
    light->SetColor(2);

    //Create terrain
    auto terrain = CreateTerrain(world, 512);
    terrain->LoadHeightmap("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Terrain/512.r16");
    terrain->SetScale(1, 100, 1);

    //Create base material
    auto ground = CreateMaterial();
    auto diffusemap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/river_small_rocks_diff_4k.dds");
    auto normalmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/river_small_rocks_nor_gl_4k.dds");
    ground->SetTexture(diffusemap, TEXTURE_DIFFUSE);
    ground->SetTexture(normalmap, TEXTURE_NORMAL);
    terrain->SetMaterial(ground);

    //Create paint material
    auto rocks = CreateMaterial();
    diffusemap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k.dds");
    normalmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k_dot3.dds");
    auto dispmap = LoadTexture("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Materials/Ground/Rocks_Dirt_Ground_2k_disp.dds");
    rocks->SetTexture(diffusemap, TEXTURE_DIFFUSE);
    rocks->SetTexture(normalmap, TEXTURE_NORMAL);
    rocks->SetTexture(dispmap, TEXTURE_DISPLACEMENT);
    rocks->SetDisplacement(0.5);

    //Camera controls
    auto actor = CreateActor(camera);
    actor->AddComponent<CameraControls>();

    auto specmap = LoadTexture("Materials/Environment/Storm/specular.dds");
    auto diffmap = LoadTexture("Materials/Environment/Storm/diffuse.dds");

    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_BACKGROUND);
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_SPECULAR);
    world->SetEnvironmentMap(diffmap, ENVIRONMENTMAP_DIFFUSE);

    auto plane_mat = CreateMaterial();
    plane_mat->SetTessellation(true);
    plane_mat->SetTransparent(true);
    plane_mat->SetColor(0.0, 0.0, 1.0, 0.5);

    auto plane = CreatePlane(world, 4096, 4096, 64, 64);
    plane->SetMaterial(plane_mat);
    plane->SetPosition(0.0, 35.0, 0.0);

    auto camera_second = CreateCamera(world);
    camera_second->SetTessellation(2.0);

    auto textbuffer = CreateTextureBuffer(256, 256);
    camera_second->SetRenderTarget(textbuffer);

    bool refraction = false;
    bool tesselation = false;
    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        if (window->KeyHit(KEY_F1)) camera->SetWireframe(!camera->GetWireframe());
        if (window->KeyHit(KEY_F2))
        {
            tesselation = !tesselation;
            if (tesselation)
                camera->SetTessellation(32.0);
            else
                camera->SetTessellation(0.0);
        }
        if (window->KeyHit(KEY_F3))
        {
            refraction = !refraction;
            camera->SetRefraction(refraction);
        }

        if (window->MouseDown(MOUSE_LEFT))
        {
            auto mousepos = window->GetMousePosition();
            auto pickinfo = camera->Pick(framebuffer, mousepos.x, mousepos.y);



            if (pickinfo.success)
            {
                if (pickinfo.entity == terrain)
                {
                    iVec2 pos;
                    pos.x = Round(pickinfo.position.x) + terrain->resolution.x / 2;
                    pos.y = Round(pickinfo.position.z) + terrain->resolution.y / 2;
                    int radius = 20;
                    for (int x = pos.x - radius; x < pos.x + radius; ++x)
                    {
                        for (int y = pos.y - radius; y < pos.y + radius; ++y)
                        {
                            float strength = 1.0f - Vec3(x, y, 0).DistanceToPoint(Vec3(pos.x, pos.y, 0)) / float(radius);
                            if (strength <= 0.0f) continue;
                            float wt = terrain->GetMaterialWeight(x, y, rocks);
                            wt += 0.1f;
                            terrain->SetMaterial(x, y, rocks, wt);
                        }
                    }
                }
            }
        }
        world->Update();
        world->Render(framebuffer);

        WString title = "Tesselation - Test: ";
        title += "F1 - Wireframe(" + WString(camera->GetWireframe() ? "true" : "false") + ") ";
        title += "F2 - Tesselation(" + WString(tesselation ? "true" : "false") + ") ";
        title += "F3 - Refraction(" + WString(refraction ? "true" : "false") + ") ";
        window->SetText(title);
    }
    return 0;
}

1. Tesselation and Refraction (with transparent objects) still doesn't work.

2. in this sample i have a second camera with a high tesselation (2.0)  and the main camera has a tesselation-factor of 32. Now if you turn on tesselation you might notice that everything is tesselated with factor 2.0 instead of 32.0. In more complex samples you can see that it might be a uniform issue as it seems to switch between 2 and 32 randomly.

  • Windows 10 Pro 64-Bit-Version
  • NVIDIA Geforce 1080 TI
Link to comment
Share on other sites

@SpiderPig Here is a simpler app that demonstrates the erorr:
 

#include "UltraEngine.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    auto plugin = LoadPlugin("Plugins/LELegacy.dll");

    //Get the displays
    auto displays = GetDisplays();

    //Create a window
    auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

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

    //Create a framebuffer
    auto framebuffer = CreateFramebuffer(window);

    //Create a camera
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.125);
    camera->SetFov(70);
    camera->SetPosition(0, 0, -4);

    auto box = CreateBox(world);
    box->SetColor(1, 0, 0);

    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {        
        if (window->KeyDown(KEY_D)) { camera->Move(1, 0, 0); box->Move(1, 0, 0); }
        if (window->KeyDown(KEY_A)) { camera->Move(-1, 0, 0); box->Move(-1, 0, 0); }

        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}

 

  • Thanks 1

My job is to make tools you love, with the features you want, and performance you can't live without.

Link to comment
Share on other sites

  • Josh locked this topic
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...