207 lines
6 KiB
C++
207 lines
6 KiB
C++
// Copyright 2009-2021 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#pragma once
|
|
|
|
#include "../common/ray.h"
|
|
#include "../common/context.h"
|
|
#include "filter_sycl.h"
|
|
|
|
namespace embree
|
|
{
|
|
template<typename Ray>
|
|
struct Intersect1Epilog1_HWIF;
|
|
|
|
template<>
|
|
struct Intersect1Epilog1_HWIF<RayHit>
|
|
{
|
|
RayHit& ray;
|
|
sycl::private_ptr<RayQueryContext> context;
|
|
const unsigned int geomID;
|
|
const unsigned int primID;
|
|
const bool filter;
|
|
|
|
__forceinline Intersect1Epilog1_HWIF(RayHit& ray,
|
|
sycl::private_ptr<RayQueryContext> context,
|
|
const unsigned int geomID,
|
|
const unsigned int primID,
|
|
const bool filter)
|
|
: ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}
|
|
|
|
template<typename Hit_i>
|
|
__forceinline bool operator() (Hit_i& hit_i) const
|
|
{
|
|
hit_i.finalize();
|
|
|
|
Scene* scene MAYBE_UNUSED = context->scene;
|
|
Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
|
|
|
|
/* ray mask test */
|
|
#if defined(EMBREE_RAY_MASK)
|
|
if ((geometry->mask & ray.mask) == 0)
|
|
return false;
|
|
#endif
|
|
|
|
/* call intersection filter function */
|
|
#if defined(EMBREE_FILTER_FUNCTION)
|
|
if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))
|
|
{
|
|
Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);
|
|
float old_t = ray.tfar;
|
|
ray.tfar = hit_i.t;
|
|
bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
|
|
if (!found) {
|
|
ray.tfar = old_t;
|
|
return false;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
ray.tfar = hit_i.t;
|
|
ray.u = hit_i.u;
|
|
ray.v = hit_i.v;
|
|
ray.Ng.x = hit_i.Ng.x;
|
|
ray.Ng.y = hit_i.Ng.y;
|
|
ray.Ng.z = hit_i.Ng.z;
|
|
ray.geomID = geomID;
|
|
ray.primID = primID;
|
|
instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);
|
|
#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
|
|
instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
template<typename Hit_i>
|
|
__forceinline bool operator() (bool, Hit_i& hit_i) const
|
|
{
|
|
hit_i.finalize();
|
|
|
|
Scene* scene MAYBE_UNUSED = context->scene;
|
|
Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
|
|
|
|
/* ray mask test */
|
|
#if defined(EMBREE_RAY_MASK)
|
|
if ((geometry->mask & ray.mask) == 0)
|
|
return false;
|
|
#endif
|
|
|
|
const Vec3fa Ng = hit_i.Ng();
|
|
const Vec2f uv = hit_i.uv();
|
|
|
|
/* call intersection filter function */
|
|
#if defined(EMBREE_FILTER_FUNCTION)
|
|
if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))
|
|
{
|
|
Hit h(context->user,geomID,primID,uv,Ng);
|
|
float old_t = ray.tfar;
|
|
ray.tfar = hit_i.t();
|
|
bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
|
|
if (!found) {
|
|
ray.tfar = old_t;
|
|
return false;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
ray.tfar = hit_i.t();
|
|
ray.u = uv.x;
|
|
ray.v = uv.y;
|
|
ray.Ng.x = Ng.x;
|
|
ray.Ng.y = Ng.y;
|
|
ray.Ng.z = Ng.z;
|
|
ray.geomID = geomID;
|
|
ray.primID = primID;
|
|
instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);
|
|
#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
|
|
instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);
|
|
#endif
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct Intersect1Epilog1_HWIF<Ray>
|
|
{
|
|
Ray& ray;
|
|
sycl::private_ptr<RayQueryContext> context;
|
|
const unsigned int geomID;
|
|
const unsigned int primID;
|
|
const bool filter;
|
|
|
|
__forceinline Intersect1Epilog1_HWIF(Ray& ray,
|
|
sycl::private_ptr<RayQueryContext> context,
|
|
const unsigned int geomID,
|
|
const unsigned int primID,
|
|
const bool filter)
|
|
: ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}
|
|
|
|
template<typename Hit_i>
|
|
__forceinline bool operator() (Hit_i& hit_i) const
|
|
{
|
|
hit_i.finalize();
|
|
|
|
Scene* scene MAYBE_UNUSED = context->scene;
|
|
Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
|
|
|
|
/* ray mask test */
|
|
#if defined(EMBREE_RAY_MASK)
|
|
if ((geometry->mask & ray.mask) == 0)
|
|
return false;
|
|
#endif
|
|
|
|
/* call intersection filter function */
|
|
#if defined(EMBREE_FILTER_FUNCTION)
|
|
if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))
|
|
{
|
|
Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);
|
|
float old_t = ray.tfar;
|
|
ray.tfar = hit_i.t;
|
|
bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
|
|
if (!found) {
|
|
ray.tfar = old_t;
|
|
return false;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
ray.tfar = neg_inf;
|
|
return true;
|
|
}
|
|
|
|
template<typename Hit_i>
|
|
__forceinline bool operator() (bool, Hit_i& hit_i) const
|
|
{
|
|
hit_i.finalize();
|
|
|
|
Scene* scene MAYBE_UNUSED = context->scene;
|
|
Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
|
|
|
|
/* ray mask test */
|
|
#if defined(EMBREE_RAY_MASK)
|
|
if ((geometry->mask & ray.mask) == 0)
|
|
return false;
|
|
#endif
|
|
|
|
/* call intersection filter function */
|
|
#if defined(EMBREE_FILTER_FUNCTION)
|
|
if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))
|
|
{
|
|
const Vec3fa Ng = hit_i.Ng();
|
|
const Vec2f uv = hit_i.uv();
|
|
Hit h(context->user,geomID,primID,uv,Ng);
|
|
float old_t = ray.tfar;
|
|
ray.tfar = hit_i.t();
|
|
bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
|
|
if (!found) {
|
|
ray.tfar = old_t;
|
|
return false;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
ray.tfar = neg_inf;
|
|
return true;
|
|
}
|
|
};
|
|
}
|