Jump to content

Interface deletion


Go to solution Solved by Josh,

Recommended Posts

Posted

I'm creating an Interface like so.

 

        uihotbars = CreateInterface(world, sysfont, framebuffer.size)
        uihotbars:SetRenderLayers(2)
        uihotbars.background:SetColor(0,0,0,0)

 

But while loading a new character I wish to delete this interface so I can recreate it with different data.
So I use the only means possible to remove the interface - 

 

function DestroyHotbarsUI()
 
    for t, s in pairs ( tbl_hotbarpanels ) do
        s.pan = nil
        s=nil
        table.remove(tbl_hotbarpanels, t)
    end
 
    tbl_hotbarpanels = nil
    uihotbars = nil
    collectgarbage()
    tbl_hotbarpanels = {}
 
end

 

But it still remains. 

 

 

 

 

 

 

 

 

Posted

This C++ example shows that deletion is working correctly.

Are you sure there isn't a reference to the variable somewhere else in your code?

#include "UltraEngine.h"

using namespace UltraEngine;

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

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

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

    //Create world
    auto world = CreateWorld();

    //Create main camera
    auto camera = CreateCamera(world);
    camera->SetPosition(0, 0, -3);

    //Create a model
    auto box = CreateBox(world);

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

    //Load a font
    auto font = LoadFont("Fonts/arial.ttf");

    //Create user interface with a semi-transparent background
    auto ui = CreateInterface(world, font, framebuffer->size);
    ui->background->SetColor(0, 0, 0, 0.5);

    //Create widget
    iVec2 sz = ui->background->ClientSize();
    auto button = CreateButton("Button", sz.x / 2 - 75, sz.y / 2 - 15, 150, 30, ui->background);

    //Create camera
    auto orthocamera = CreateCamera(world, PROJECTION_ORTHOGRAPHIC);
    orthocamera->SetClearMode(CLEAR_DEPTH);
    orthocamera->SetPosition(float(framebuffer->size.x) * 0.5f, float(framebuffer->size.y) * 0.5f, 0);

    //UI will only appear in orthographic camera
    orthocamera->SetRenderLayers(2);
    ui->SetRenderLayers(2);

    while (true)
    {
        box->Turn(0, 1, 0);

        while (PeekEvent())
        {
            const Event ev = WaitEvent();
            switch (ev.id)
            {
            case EVENT_WINDOWCLOSE:
                if (ev.source == window)
                {
                    return 0;
                }
                break;
            default:
                if (ui) ui->ProcessEvent(ev);
                break;
            }
        }

        if (window->KeyHit(KEY_SPACE)) ui = nullptr;

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

 

Let's build cool stuff and have fun. :)

  • 5 months later...
Posted

Tested in Lua, to be sure. There must be another reference to the variable in question somewhere.

-- Get the displays
local displays = GetDisplays()

-- Create window
local window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[1])

-- Create framebuffer
local framebuffer = CreateFramebuffer(window)

-- Create world
local world = CreateWorld()

-- Create main camera
local camera = CreateCamera(world)
camera:SetPosition(0, 0, -3)

-- Create a model
local box = CreateBox(world)

-- Create a light
local light = CreateBoxLight(world)
light:SetRange(-5, 5)
light:SetRotation(34, 45, 0)

-- Load a font
local font = LoadFont("Fonts/arial.ttf")

-- Create user interface with a semi-transparent background
local ui = CreateInterface(world, font, framebuffer.size)
ui.background:SetColor(0, 0, 0, 0.5)

-- Create widget
local sz = ui.background:ClientSize()
local button = CreateButton("Button", sz.x / 2 - 75, sz.y / 2 - 15, 150, 30, ui.background)

-- Create orthographic camera
local orthocamera = CreateCamera(world, PROJECTION_ORTHOGRAPHIC)
orthocamera:SetClearMode(CLEAR_DEPTH)
orthocamera:SetPosition(framebuffer.size.x * 0.5, framebuffer.size.y * 0.5, 0)

-- UI will only appear in orthographic camera
orthocamera:SetRenderLayers(2)
ui:SetRenderLayers(2)

while true do
    box:Turn(0, 1, 0)

    while PeekEvent() do
        local ev = WaitEvent()
        if ev.id == EVENT_WINDOWCLOSE then
            if ev.source == window then
                return 0
            end
        else
            if ui then ui:ProcessEvent(ev) end
        end
    end

    if window:KeyHit(KEY_SPACE) then
        ui = nil
	    button = nil
        collectgarbage()
    end

    world:Update()
    world:Render(framebuffer)
end

However, I did find that sprites are not getting hidden if the widget is assigned NULL as a parent...

Let's build cool stuff and have fun. :)

  • 3 months later...
  • Solution
Posted

One final test in 0.9.9 shows this working. Make sure you call collectgarbage() in Lua after setting the variable to nil.

#include "UltraEngine.h"

using namespace UltraEngine;

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

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

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

    //Create world
    auto world = CreateWorld();

    //Create main camera
    auto camera = CreateCamera(world);
    camera->SetPosition(0, 0, -3);

    //Create a model
    auto box = CreateBox(world);

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

    //Load a font
    auto font = LoadFont("Fonts/arial.ttf");

    //Create user interface with a semi-transparent background
    auto ui = CreateInterface(camera, font, framebuffer->size);
    ui->background->SetColor(0, 0, 0, 0.5);

    //Create widget
    iVec2 sz = ui->background->ClientSize();
    auto button = CreateButton("Button", sz.x / 2 - 75, sz.y / 2 - 15, 150, 30, ui->background);

    while (true)
    {
        box->Turn(0, 1, 0);

        while (PeekEvent())
        {
            const Event ev = WaitEvent();
            switch (ev.id)
            {
            case EVENT_WINDOWCLOSE:
                if (ev.source == window)
                {
                    return 0;
                }
                break;
            default:
                if (ui) ui->ProcessEvent(ev);
                break;
            }
        }

        if (window->KeyHit(KEY_SPACE)) ui = nullptr;

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

 

  • Like 1

Let's build cool stuff and have fun. :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   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...