Jump to content

GetCollider()->IntersectsPoint() does not work correctly in release mode


Dreikblack
 Share

Go to solution Solved by Josh,

Recommended Posts

Debug mode has no such problem but TransformPoint in same code in release mode don't returns true when it should.

A model becomes yellow when it goes through a box in debug( i.e. TransformPoint() returns true).

#include "UltraEngine.h"
#include "Components/Mover.hpp"

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, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

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

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

    //Create a camera    
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.8);
    camera->Turn(35, 0, 0);
    camera->Move(0, 0, -2);
    camera->SetDebugPhysicsMode(true);

    //Create light
    auto light = CreateBoxLight(world);
    light->SetRange(-20, 20);
    light->SetArea(20, 20);
    light->SetRotation(35, 35, 0);

    auto unlitMaterial = CreateMaterial();
    auto unlitShader = LoadShaderFamily("Shaders/Unlit.json");
    unlitMaterial->SetShaderFamily(unlitShader);

    int width = 2, height = 1, length = 3;
    auto model = CreateModel(world);
    auto mesh = model->AddMesh();

    mesh->AddVertex(0, 0, 0); //S
    mesh->AddVertex(-width * 0.5, -height * 0.5, length);//NW
    mesh->AddVertex(width * 0.5, -height * 0.5, length);//NE

    mesh->AddPrimitive(2, 1, 0);//S , NW, NE

    mesh->AddVertex(-width * 0.5, height * 0.5, length);//NW h
    mesh->AddVertex(width * 0.5, height * 0.5, length);//NE h

    mesh->AddPrimitive(0, 3, 4);//S , NW h, NE h

    mesh->AddPrimitive(0, 1, 3);//left

    mesh->AddPrimitive(4, 3, 1); //"face"
    mesh->AddPrimitive(2, 4, 1); //"face"


    mesh->AddPrimitive(0, 4, 2); //"right"

    auto& mat = unlitMaterial;
    mat->SetTransparent(true);
    model->SetMaterial(mat);
    model->SetColor(0.5f, 0.8f, 0, 0.25f);
    model->SetPosition(0, 0, 0);

    auto collider = CreateConvexHullCollider(mesh);
    model->SetCollider(collider);

    Vec3 targetPos(2, 0, 0);
    auto box = CreateBox(world, 0.1f);
    box->SetPosition(targetPos);

    auto component = model->AddComponent<Mover>();
    component->rotationspeed.y = 45;
    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        auto newTargetPos = TransformPoint(targetPos, Mat4(), model->GetMatrix());
        bool isInside = model->GetCollider()->IntersectsPoint(newTargetPos);
        if (isInside)
        {
            model->SetColor(1, 1, 0, 1);
        }
        else {
            model->SetColor(1, 0, 0, 1);
        }
        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}

 

Link to comment
Share on other sites

  • 1 month later...

Sometimes it works in release and sometimes it does not. This is evidence that an unintialized boolean value might be somewhere in that routine's code....

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 have simplified your example a bit:

#include "UltraEngine.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, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR);

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

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

    //Create a camera    
    auto camera = CreateCamera(world);
    camera->SetClearColor(0.8);
    camera->Turn(35, 0, 0);
    camera->Move(0, 0, -2);
    camera->SetDebugPhysicsMode(true);

    //Create light
    auto light = CreateBoxLight(world);
    light->SetRange(-20, 20);
    light->SetArea(20, 20);
    light->SetRotation(35, 35, 0);

    auto unlitMaterial = CreateMaterial();
    auto unlitShader = LoadShaderFamily("Shaders/Unlit.json");
    unlitMaterial->SetShaderFamily(unlitShader);

    int width = 2, height = 1, length = 3;
    auto model = CreateModel(world);
    auto mesh = model->AddMesh();

    mesh->AddVertex(0, 0, 0); //S
    mesh->AddVertex(-width * 0.5, -height * 0.5, length);//NW
    mesh->AddVertex(width * 0.5, -height * 0.5, length);//NE

    mesh->AddPrimitive(2, 1, 0);//S , NW, NE

    mesh->AddVertex(-width * 0.5, height * 0.5, length);//NW h
    mesh->AddVertex(width * 0.5, height * 0.5, length);//NE h

    mesh->AddPrimitive(0, 3, 4);//S , NW h, NE h

    mesh->AddPrimitive(0, 1, 3);//left

    mesh->AddPrimitive(4, 3, 1); //"face"
    mesh->AddPrimitive(2, 4, 1); //"face"


    mesh->AddPrimitive(0, 4, 2); //"right"

    auto& mat = unlitMaterial;
    mat->SetTransparent(true);
    model->SetMaterial(mat);
    model->SetColor(0.5f, 0.8f, 0, 0.25f);
    model->SetPosition(0, 0, 0);

    auto collider = CreateConvexHullCollider(mesh);
    model->SetCollider(collider);

    Vec3 targetPos(2, 0, 0);
    auto box = CreateBox(world, 0.1f);
    box->SetPosition(targetPos);

    //auto component = model->AddComponent<Mover>();
    //component->rotationspeed.y = 45;
    
    model->Turn(0, 90, 0);

    //Main loop
    while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false)
    {
        auto newTargetPos = TransformPoint(targetPos, NULL, model);

        newTargetPos = Vec3(0, 0, 2);
         
        //auto newTargetPos = TransformPoint(targetPos, Mat4(), model->GetMatrix());
        bool isInside = model->GetCollider()->IntersectsPoint(newTargetPos);
        if (isInside)
        {
            model->SetColor(0, 1, 0, 1);
        }
        else {
            model->SetColor(1, 0, 0, 1);
        }
        world->Update();
        world->Render(framebuffer);
    }
    return 0;
}

 

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