Jump to content

Josh

Staff
  • Posts

    23,137
  • Joined

  • Last visited

Posts posted by Josh

  1. 17 minutes ago, klepto2 said:

    Actually this should be possible, as you cast the sampler back to uint.

    Wouldn't it have to be cast to a uvec2? The first four bytes could form a zero and the second four bytes could be another value, and an uint would not detect that.

  2. I will do this so it will choose the type based on what is in the shader, and you can use either. It also stores a shared pointer to the texture so it can't get deleted as long as it is bound to the shader:

    void RenderShader::SetUniform(const int location, std::shared_ptr<RenderTexture> tex)
    {
      if (not Finalize()) return;
      if (location < 0 or location >= uniforms.size()) return;
      auto& u = uniforms[location];
      if (u.defined and u.resource == tex) return;
      if (u.size != 1) return;
      GLuint64 handle = 0;
      switch (u.type)
      {
        case GL_UNSIGNED_INT64_ARB:
          if (tex) handle = tex->GetHandle();
          glProgramUniformHandleui64ARB(program, u.location, handle);
          break;
        case GL_UNSIGNED_INT_VEC2:
          if (tex) handle = tex->GetHandle();
          glProgramUniform2uiv(program, u.location, 1, (GLuint*)handle);
          break;
        default:
          return;
          break;
      }
      glCheckError();
      u.defined = true;
      u.resource = nullptr;
      if (handle) u.resource = tex;
    }

     

  3. Here is an example program. The thickness parameter will work in the next build that goes up:

    #include "UltraEngine.h"
    #include "ComponentSystem.h"
    
    using namespace UltraEngine;
    
    int main(int argc, const char* argv[])
    {
        //Get the displays
        auto displays = GetDisplays();
    
        //Create a window
        auto window = CreateWindow("Ultra Engine", 0, 0, 1280*2, 2*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, -2);
    
        //Create a light
        auto light = CreateBoxLight(world);
        light->SetRotation(35, 45, 0);
        light->SetRange(-10, 10);
    
        //Create a box
        auto box = CreateBox(world);
    
        camera->AddPostEffect(LoadPostEffect("Shaders/Outline.fx"));
        //camera->SetUniform(0, "Thickness", 50);
    
        //Main loop
        while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
        {
            box->Turn(0, 1, 0);
            world->Update();
            world->Render(framebuffer);
        }
        return 0;
    }

    image.thumb.png.65282694d6a658c49f6287114d05bce5.png

  4. How do I trigger the bug in your program? I tried adding this code right before the main loop but there was no error:
     

    sounds = {}
    for t=1, 28 do
        sounds[t] = LoadSound("https://raw.githubusercontent.com/UltraEngine/Documentation/master/Assets/Sound/notification.wav", LOAD_UNMANAGED )
    end
    sounds[28]:Play()
    
    while window:KeyDown(KEY_ESCAPE) == false and window:Closed() == false do

     

×
×
  • Create New...