Skip to content

Add an accessor for getting the Instanced Scene(s) from an RTCGeometry instance. #588

@dbs4261

Description

@dbs4261

Unless I am missing something here, there is no way to get the access the buffers or user pointer of a geometry in an instanced scene without duplicate book keeping in a user's application. This gap comes from not being able to access the instanced scene (or traversable representing it) from the top level scene and geometry. Example:

RTCScene basic_setup(RTCDevice device, auto user_data) {
    auto geom_tris = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_TRIANGLE);
    rtcSetGeometryUserData(geom_tris, &user_data);
    rtcCommitGeometry(geom_tris);
    auto subscene = rtcNewScene(device);
    auto geom_id = rtcAttachGeometry(subscene, geom_tris);
    rtcCommitScene(subscene);
    auto instance = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_INSTANCE);
    rtcSetGeometryInstancedScene(instance, subscene);
    rtcCommmitGeometry(instance);
    auto toplevel_scene = rtcNewScene(device);
    auto instance_id = rtcAttachGeometry(toplevel_scene, instance);
    rtcCommitScene(toplevel_scene);
    return toplevel_scene;
}

// There can be a hidden error because, by default geom_id = 0 and also instance_id = 0
void ray_query(RTCScene toplevel_scene, RTCRay ray) {
    RTCRayHit rayhit{.ray=ray, .hit=...};
    rtcIntersect1(scene, &rayhit, nullptr);
    if (rayhit.hit.instID[0] != RTC_INVALID_GEOMETRY_ID) {
        auto geom_tris = rtcGetGeometry(toplevel_scene, rayhit.hit.geomID);  // This will run but retrieve the instance instead because both are ID 0
        // assert(rtcGetGeometryType(toplevel_scene, rayhit.hit.geomID) == RTC_GEOMETRY_TYPE_TRIANGLE);  // rtcGetGeometryType does not exist but would be helpful
        // void* user_data = rtcGetGeometryUserData(geom_tris);  // This will be the user data pointer on the instance not the triangles because of the aforementioned hidden error
        // void* user_data = rtcGetGeometryUserDataFromScene(subscene, rayhit.hit.geomID);  // No access to subscene
        auto instance = rtcGetGeometry(toplevel_scene, rayhit.hit.instID[0]);
        // RTCScene subscene = rtcGetGeometryInstancedScene(instance); // rtcGetGeometryInstancedScene does not exist
        // RTCScene subscene = rtcGetGeometryInstancedSceneFromScene(scene, rayhit.hit.instID[0]); // Even better, but rtcGetGeometryInstancedSceneFromScene does not exist
        // auto subscene = static_cast<RTCScene>(rtcGetGeometryBufferData(instance, RTC_BUFFER_TYPE_INSTANCED_SCENE));  // This could also be an approach
    }
    ...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions