RenderKit / embree

Embree ray tracing kernels repository.
Apache License 2.0
2.32k stars 383 forks source link

Simple point query with curve example, RTCPointQueryFunction is never called #480

Open olihey opened 3 months ago

olihey commented 3 months ago

Hej, I am experimenting with finding the closest 2d line to a pixel and wanted to use embree 4 for that. Therefore I create a small example but no matter what I do, my RTCPointQueryFunction is never called? Am I missing something? The single flat linear line is going from (-10, -10) to (10, 10). A point query at (0, 0) with a radius of 2.0 should definitely find the curve and trigger the query function, but nothing happens. (all z are 0 because I only work in 2d)

#include <iostream>

#include <embree4/rtcore.h>

float vertices[] = {
    -10.0f, -10.0f, 0.0f,  // Start point
     10.0f,  10.0f, 0.0f }; // End point
int indices[] = { 0, 1 }; // Single curve segment

bool query_function(struct RTCPointQueryFunctionArguments* args)
{
    std::cout << "Called" << std::endl << std::flush;
    return true;
}

int main(int argc, char *argv[])
{
    RTCDevice _rtc_device = rtcNewDevice(nullptr);
    RTCScene _edges_scene = rtcNewScene(_rtc_device);

    RTCGeometry rtc_line = rtcNewGeometry(_rtc_device, RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE);
    rtcSetSharedGeometryBuffer(rtc_line, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, vertices, 0, 3 * sizeof(float), 2);
    rtcSetSharedGeometryBuffer(rtc_line, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT, indices, 0, 2 * sizeof(int), 1);

    rtcCommitGeometry(rtc_line);
    rtcAttachGeometry(_edges_scene, rtc_line);
    rtcReleaseGeometry(rtc_line);

    rtcCommitScene(_edges_scene);

    RTCPointQuery point_query;
    point_query.x = 0.0f;
    point_query.y = 0.0f;
    point_query.z = 0.0f;
    point_query.radius = 2.0f;
    point_query.time = 0.0f;

    RTCPointQueryContext context;
    rtcInitPointQueryContext(&context);

    rtcPointQuery(_edges_scene, &point_query, &context, query_function, nullptr);

    rtcReleaseScene(_edges_scene);
    rtcReleaseDevice(_rtc_device);

    std::cout << "DONE" << std::endl << std::flush;

    return EXIT_SUCCESS;
}