1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "../common/geometry.h"
#include "../common/ray.h"
#include "../common/hit.h"
#include "../common/context.h"
namespace embree
{
namespace isa
{
__forceinline bool runIntersectionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
if (geometry->intersectionFilterN)
{
geometry->intersectionFilterN(args);
if (args->valid[0] == 0)
return false;
}
if (context->getFilter())
{
if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
context->getFilter()(args);
if (args->valid[0] == 0)
return false;
}
copyHitToRay(*(RayHit*)args->ray,*(Hit*)args->hit);
return true;
}
__forceinline bool runIntersectionFilter1(const Geometry* const geometry, RayHit& ray, RayQueryContext* context, Hit& hit)
{
RTCFilterFunctionNArguments args;
int mask = -1;
args.valid = &mask;
args.geometryUserPtr = geometry->userPtr;
args.context = context->user;
args.ray = (RTCRayN*)&ray;
args.hit = (RTCHitN*)&hit;
args.N = 1;
return runIntersectionFilter1Helper(&args,geometry,context);
}
__forceinline bool runOcclusionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
if (geometry->occlusionFilterN)
{
geometry->occlusionFilterN(args);
if (args->valid[0] == 0)
return false;
}
if (context->getFilter())
{
if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
context->getFilter()(args);
if (args->valid[0] == 0)
return false;
}
return true;
}
__forceinline bool runOcclusionFilter1(const Geometry* const geometry, Ray& ray, RayQueryContext* context, Hit& hit)
{
RTCFilterFunctionNArguments args;
int mask = -1;
args.valid = &mask;
args.geometryUserPtr = geometry->userPtr;
args.context = context->user;
args.ray = (RTCRayN*)&ray;
args.hit = (RTCHitN*)&hit;
args.N = 1;
return runOcclusionFilter1Helper(&args,geometry,context);
}
template<int K>
__forceinline vbool<K> runIntersectionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
vint<K>* mask = (vint<K>*) args->valid;
if (geometry->intersectionFilterN)
geometry->intersectionFilterN(args);
vbool<K> valid_o = *mask != vint<K>(zero);
if (none(valid_o)) return valid_o;
if (context->getFilter()) {
if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
context->getFilter()(args);
}
valid_o = *mask != vint<K>(zero);
if (none(valid_o)) return valid_o;
copyHitToRay(valid_o,*(RayHitK<K>*)args->ray,*(HitK<K>*)args->hit);
return valid_o;
}
template<int K>
__forceinline vbool<K> runIntersectionFilter(const vbool<K>& valid, const Geometry* const geometry, RayHitK<K>& ray, RayQueryContext* context, HitK<K>& hit)
{
RTCFilterFunctionNArguments args;
vint<K> mask = valid.mask32();
args.valid = (int*)&mask;
args.geometryUserPtr = geometry->userPtr;
args.context = context->user;
args.ray = (RTCRayN*)&ray;
args.hit = (RTCHitN*)&hit;
args.N = K;
return runIntersectionFilterHelper<K>(&args,geometry,context);
}
template<int K>
__forceinline vbool<K> runOcclusionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
vint<K>* mask = (vint<K>*) args->valid;
if (geometry->occlusionFilterN)
geometry->occlusionFilterN(args);
vbool<K> valid_o = *mask != vint<K>(zero);
if (none(valid_o)) return valid_o;
if (context->getFilter()) {
if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
context->getFilter()(args);
}
valid_o = *mask != vint<K>(zero);
RayK<K>* ray = (RayK<K>*) args->ray;
ray->tfar = select(valid_o, vfloat<K>(neg_inf), ray->tfar);
return valid_o;
}
template<int K>
__forceinline vbool<K> runOcclusionFilter(const vbool<K>& valid, const Geometry* const geometry, RayK<K>& ray, RayQueryContext* context, HitK<K>& hit)
{
RTCFilterFunctionNArguments args;
vint<K> mask = valid.mask32();
args.valid = (int*)&mask;
args.geometryUserPtr = geometry->userPtr;
args.context = context->user;
args.ray = (RTCRayN*)&ray;
args.hit = (RTCHitN*)&hit;
args.N = K;
return runOcclusionFilterHelper<K>(&args,geometry,context);
}
}
}
|