Skip to content

Commit

Permalink
Intersection cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
xelatihy committed Jan 30, 2024
1 parent c5ff247 commit 07dc2dd
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 20 deletions.
34 changes: 14 additions & 20 deletions libs/yocto/yocto_raycasting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,8 +367,7 @@ static intersection3f intersect_elements_bvh(const bvh_tree& bvh,
auto primitive = bvh.primitives[node.start + idx];
auto eintersection = intersect_element(primitive, ray);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
ray.tmax = eintersection.distance;
}
}
Expand Down Expand Up @@ -414,8 +413,7 @@ static intersection3f overlap_elements_bvh(const bvh_tree& bvh, vec3f pos,
auto primitive = bvh.primitives[node.start + idx];
auto eintersection = overlap_element(primitive, pos, max_distance);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
max_distance = eintersection.distance;
}
}
Expand Down Expand Up @@ -784,7 +782,7 @@ intersection3f intersect_scene_bvh(const scene_bvh& sbvh,
scene.shapes[instance_.shape], inv_ray, find_any);
if (!sintersection.hit) continue;
intersection = {bvh.primitives[idx], sintersection.element,
sintersection.uv, sintersection.distance, true};
sintersection.uv, sintersection.distance};
ray.tmax = sintersection.distance;
}
}
Expand All @@ -803,8 +801,8 @@ intersection3f intersect_instance_bvh(const scene_bvh& sbvh,
auto intersection = intersect_shape_bvh(sbvh.shapes[instance.shape],
scene.shapes[instance.shape], inv_ray, find_any);
if (!intersection.hit) return {};
return {instance_, intersection.element, intersection.uv,
intersection.distance, true};
return {
instance_, intersection.element, intersection.uv, intersection.distance};
}

} // namespace yocto
Expand Down Expand Up @@ -852,8 +850,7 @@ intersection3f overlap_shape_bvh(const shape_bvh& sbvh, const shape_data& shape,
auto eintersection = overlap_point(
pos, max_distance, shape.positions[p], shape.radius[p]);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
max_distance = eintersection.distance;
}
} else if (!shape.lines.empty()) {
Expand All @@ -864,8 +861,7 @@ intersection3f overlap_shape_bvh(const shape_bvh& sbvh, const shape_data& shape,
shape.positions[l.x], shape.positions[l.y], shape.radius[l.x],
shape.radius[l.y]);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
max_distance = eintersection.distance;
}
} else if (!shape.triangles.empty()) {
Expand All @@ -876,8 +872,7 @@ intersection3f overlap_shape_bvh(const shape_bvh& sbvh, const shape_data& shape,
shape.positions[t.x], shape.positions[t.y], shape.positions[t.z],
shape.radius[t.x], shape.radius[t.y], shape.radius[t.z]);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
max_distance = eintersection.distance;
}
} else if (!shape.quads.empty()) {
Expand All @@ -889,8 +884,7 @@ intersection3f overlap_shape_bvh(const shape_bvh& sbvh, const shape_data& shape,
shape.positions[q.w], shape.radius[q.x], shape.radius[q.y],
shape.radius[q.z], shape.radius[q.w]);
if (!eintersection.hit) continue;
intersection = {invalidid, primitive, eintersection.uv,
eintersection.distance, true};
intersection = {primitive, eintersection.uv, eintersection.distance};
max_distance = eintersection.distance;
}
}
Expand Down Expand Up @@ -942,7 +936,7 @@ intersection3f overlap_scene_bvh(const scene_bvh& sbvh, const scene_data& scene,
scene.shapes[instance_.shape], inv_pos, max_distance, find_any);
if (!sintersection.hit) continue;
intersection = {primitive, sintersection.element, sintersection.uv,
sintersection.distance, true};
sintersection.distance};
max_distance = sintersection.distance;
}
}
Expand Down Expand Up @@ -1246,7 +1240,7 @@ intersection3f intersect_shape_ebvh(const shape_ebvh& sbvh,
auto element = (int)embree_ray.hit.primID;
auto uv = vec2f{embree_ray.hit.u, embree_ray.hit.v};
auto distance = embree_ray.ray.tfar;
return {invalidid, element, uv, distance, true};
return {element, uv, distance};
}

intersection3f intersect_scene_ebvh(const scene_ebvh& sbvh,
Expand All @@ -1271,7 +1265,7 @@ intersection3f intersect_scene_ebvh(const scene_ebvh& sbvh,
auto element = (int)embree_ray.hit.primID;
auto uv = vec2f{embree_ray.hit.u, embree_ray.hit.v};
auto distance = embree_ray.ray.tfar;
return {instance, element, uv, distance, true};
return {instance, element, uv, distance};
}

intersection3f intersect_instance_ebvh(const scene_ebvh& sbvh,
Expand All @@ -1281,8 +1275,8 @@ intersection3f intersect_instance_ebvh(const scene_ebvh& sbvh,
auto intersection = intersect_shape_ebvh(sbvh.shapes[instance.shape],
scene.shapes[instance.shape], inv_ray, find_any);
if (!intersection.hit) return {};
return {instance_, intersection.element, intersection.uv,
intersection.distance, true};
return {
instance_, intersection.element, intersection.uv, intersection.distance};
}

#else
Expand Down
16 changes: 16 additions & 0 deletions libs/yocto/yocto_raycasting.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,22 @@ struct intersection3f {
vec2f uv = {0, 0};
float distance = 0;
bool hit = false;

// Default constructor for no intersection.
intersection3f() {}
// Primitive intersection.
intersection3f(vec2f uv, float distance)
: uv{uv}, distance{distance}, hit{true} {}
// Shape intersection.
intersection3f(int element, vec2f uv, float distance)
: element{element}, uv{uv}, distance{distance}, hit{true} {}
// Scene intersection.
intersection3f(int instance, int element, vec2f uv, float distance)
: instance{instance}
, element{element}
, uv{uv}
, distance{distance}
, hit{true} {}
};

} // namespace yocto
Expand Down

0 comments on commit 07dc2dd

Please sign in to comment.