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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions