Jump to content

Release Notes


Josh
 Share

Recommended Posts

Client build 24 is now available, same link as before:
https://www.ultraengine.com/files/UltraClient.exe

This will fix some small problems:

  • Crash at start that requires deletion of ProgramData/Ultra Engine folder.
  • Crash if no internet access is available.

The build number appears at the bottom-left:

Untitled.thumb.png.e9408447d29ccab985f7d6891abb4fb1.png

 

  • 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

  • Fixed bug where selection highlight in viewports would stop working if a model was opened in an asset window.
  • Fixed bug where converting textures to optimized formats would not detect normal and displacement maps and choose the correct compression format.
  • Fixed crash when loading Leadwerks maps with terrain.
  • Fixed terrain layer constraints and scale not loading.
  • Fixed typo in main menu file that was leaving out the shift modifier, which would cause you to accidentally switch mouse tools.
  • 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

  • Terrain picking and collision now matches visible geometry. Requires a shader update (sync your project).
  • Player sliding too much on walls fixed.
  • 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

  • Default channel is renamed to 0.9.0.
  • Client app is updated with change to EULA. $100K limit is removed and replaced with 20 person "total workforce" limit. I think this will be better for everyone and will not scare people.
  • Like 2
  • Thanks 1
  • Upvote 4

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

First implementation of the flowgraph in Ultra is up on the /dev channel.

  • Only the C++ static library is updated, Lua is not built or tested yet. (When it is, some of the things you have to do manually in C++ will be automated in Lua.)
  • Zooming is not supported yet, but it will not be too hard to add with the DPI scaling feature we have.
  • Method arguments are not yet supported.
  • CollisionTrigger component has been added to the C++ template, seems to work well.

Untitled.thumb.png.0c5343f50580d289558a270e9420b5b5.png

To expose methods as either inputs or outputs, add them to the JSON file:

        "inputs":
        [
            {
                "name": "Test1"
            },
            {
                "name": "Test2"
            }
        ],
        "outputs":
        [
            {
                "name": "Test1"
            },
            {
                "name": "Test2"
            }
        ]

In C++ you must manually call FireOutputs() in any methods that act as outputs:

    virtual void Test1()
    {
        Print("Test1");
        FireOutputs("Test1");
    }

To receive flowgraph connections, you must add CallMethod() to your component:

 

    virtual std::any CallMethod(shared_ptr<Component> caller, const WString& name, const std::vector<std::any>& args)
    {
        if (name == "Test1")
        {
            Test1();
        }
        else if (name == "Test2")
        {
            Test2();
        }
        return false;
    }

I will try to get some usable components that use this up soon.

  • Like 3
  • Thanks 1
  • Upvote 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

  • Added first pass at the sliding door component. It works nicely.
  • Editor now supports file path component properties. Create a string value and add settings for "filecategory" or "filepattern". category can be SOUND, MODEL, TEXTURE, or MATERIAL, and will get the file pattern for that asset type, including the types any import plugins include.
{
	"name": "myfile",
	"label": "My file",
	"filecategory": "SOUND"
},
{
	"name": "myfile2",
	"label": "My file 2",
	"filepattern": "Text Files (*.txt):txt"
}
  • Like 2
  • 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

Lua binaries are updated with support for flowgraph connections in maps. The starting map will work in Lua just like it does in C++.

ChatGPT did a nice job of converting my C++ components into Lua code. This is very interesting because map files themselves are language-agnostic. The same map can run in a Lua or C++ game, with all the same behavior.

You don't ever have to call FireOutputs() in Lua, as this will be handled automatically for you. :wub:

  • Like 3
  • 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

Fixed bug where a viewport mouse event would get triggered by double clicking on a file in the file requester dialog, and the underlying object would get selected.

  • Thanks 1
  • Upvote 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

  • Static library and Lua bins updated
  • All recent bugs fixed
  • Fixed it so at most only one trigger collision will occur per physics step, per object. Previously a lot of extra collisions were being created, and the door script was calling collectgarbage() so the Lua garbage collector would get run 500 times per second when the player was inside the collision trigger volume. :blink:
  • Added Timer:Stop()
  • Added Tags field in entity properties in editor. Separate tags by a comma.
  • 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

  • 2 weeks later...

Added a non-blocking ASyncDownloadFile() function (in Lua, in the editor)

Syntax

  • ASyncDownloadFile(url, localpath)

Returns a ASyncDownoadInfo object that has the following methods:
GetStatus(): returns DOWNLOAD_FINISHED, DOWNLOAD_FAILED, or DOWNLOAD_INPROGRESS
GetProgress(): returns the percentage progress complete.

These commands can all be called from the main thread at any time. I suggest creating a timer that updates every 500 or 1000 milliseconds and calls GetProgress() to display the download's progress in a status bar.

It's fine to have multiple downloads running at the same time. Each one will get its own thread.

Also added some missing Lua bindings for Model:GetBase(), which returns a ModelBase object, which is derived from the Asset class. This object can be opened in the asset editor to display a model.

  • Like 2
  • 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

Editor API additions:

  • program:BuildGI()
  • program.assetbrowser:SelectFolder(path)
  • program.assetbrowser:SelectFile(path)

Example:

program.assetbrowser:SelectFile("materials/developer/grid01.mat")
local i = program.sidepanel:FindItem("Project")
if i ~= 0 then
    program.sidepanel:SelectItem(i)
    EmitEvent(EVENT_WIDGETSELECT, program.sidepanel, i)
end

 

  • Like 1
  • 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

First build with support for VR is uploaded on the /dev channel.

  • OpenVR is being implemented initially, with plans to switch over to the more complicated OpenXR library in the future.
  • Add delayload:openvr_api.dll to your C++ projects in Solution Properties > C++ > Command line. This will allow non-VR apps to be distributed without the OpenVR DLL.
  • Sky rendering method is changed, so you need to sync your project to get some files.
  • Just HMD display and mirror-to-window is currently supported. No controls implemented yet.
  • Don't create a camera, it will be created automatically.
  • No access to HMD object or orientation yet.
  • Also fixed black viewport on first frame bug (Nvidia only).
  • Added ASyncDownloadFileInfo:Cancel() method.

Example:

#include "UltraEngine.h"

using namespace UltraEngine;

int main(int argc, const char* argv[])
{
    //Initialize engine in VR mode
    EngineSettings settings;
    settings.openvr = true;
    Initialize(settings);

    //Load the FreeImage texture plugin
    auto plugin = LoadPlugin("Plugins/FITextureLoader");

    //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 framebuffer
    auto framebuffer = CreateFramebuffer(window);

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

    //Environment maps
    auto specmap = LoadTexture("https://github.com/UltraEngine/Assets/raw/main/Materials/Environment/footprint_court/specular.dds");
    auto diffmap = LoadTexture("https://github.com/UltraEngine/Assets/raw/main/Materials/Environment/footprint_court/diffuse.dds");
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_BACKGROUND);
    world->SetEnvironmentMap(specmap, ENVIRONMENTMAP_SPECULAR);
    world->SetEnvironmentMap(diffmap, ENVIRONMENTMAP_DIFFUSE);

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

    //Load a model to display
    auto model = LoadModel(world, "https://github.com/UltraEngine/Documentation/raw/master/Assets/Models/Characters/cyber_samurai.glb");
    model->Turn(0, 180, 0, true);
    model->SetPosition(0, 0.25, 0);
    model->SetScale(0.9);

    //Add a floor
    auto floor = CreateBox(world, 5, 1, 5);
    floor->SetPosition(0, -0.5, 0);
    auto mtl = CreateMaterial();
    mtl->SetTexture(LoadTexture("https://github.com/UltraEngine/Documentation/raw/master/Assets/Materials/Developer/griid_gray.dds"));
    floor->SetMaterial(mtl);

    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        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

  • LoadTable now returns an actual Lua table, not a C++ table.
  • LoadTable can load a file from a path or from string info:
    t = LoadTable("{\"a\":1}") Print(t.a)

     

  • 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

Editor will now set a system environment variable called ULTRAENGINE with the path to the install directory, and project templates now use that instead of explicitly indicating the path on the user's machine. This is good because if you download a project from someone else and your Ultra Engine install folder is different from theirs, it will still compile with no changes.

The C++ component include / register stuff is moved into a separate file so main.cpp is simpler.

  • 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

Exposed Program.project member. Project class has these properties:

  • path: read-only string
  • name: read-only string
  • properties: C++ table with all the contents of Ultra.json.
  • Save(): method to save Ultra.json file.

You can use this to store any per-project settings. For example:

if type(program.project.properties["addons"]  ~= "userdata") then
	program.project.properties["addons"] = {}
end

if type(program.project.properties["addons"]["sketchfab"]  ~= "userdata") then
	program.project.properties["addons"]["sketchfab"] = {}
end

table.insert(program.project.properties["addons"]["sketchfab"], itemid)
program.project:Save()

 

  • 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

Removed the grid background from the flowgraph editor window, as I found this is what was making it sluggish. Although the rendering was done as efficiently as possible, only drawing a few big images to tile across the window, it seems simple image drawing can be quite slow in GDI.

Maybe some of these tips can be tried out in the future:
https://www.codeproject.com/Tips/66909/Rendering-fast-with-GDI-What-to-do-and-what-not-to

Also fixed it so flowgraph node positions are scaled when saved to and loaded from a map file, so their positions will be consistent at different DPIs.

  • 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 unlocked this topic
  • Josh locked this topic
Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...