-
Notifications
You must be signed in to change notification settings - Fork 420
Open
Description
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
}
...
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels