Path: blob/master/thirdparty/embree/kernels/geometry/intersector_iterators.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../common/scene.h"6#include "../common/ray.h"7#include "../common/point_query.h"8#include "../bvh/node_intersector1.h"9#include "../bvh/node_intersector_packet.h"1011namespace embree12{13namespace isa14{15template<typename Intersector>16struct ArrayIntersector117{18typedef typename Intersector::Primitive Primitive;19typedef typename Intersector::Precalculations Precalculations;2021template<int N, bool robust>22static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)23{24for (size_t i=0; i<num; i++) {25Intersector::intersect(pre,ray,context,prim[i]);26}27}2829template<int N, bool robust>30static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)31{32for (size_t i=0; i<num; i++) {33if (Intersector::occluded(pre,ray,context,prim[i]))34return true;35}36return false;37}3839template<int N>40static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t num, const TravPointQuery<N> &tquery, size_t& lazy_node)41{42bool changed = false;43for (size_t i=0; i<num; i++)44changed |= Intersector::pointQuery(query, context, prim[i]);45return changed;46}4748template<int K>49static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)50{51}5253template<int K>54static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)55{56return valid;57}58};5960template<int K, typename Intersector>61struct ArrayIntersectorK_162{63typedef typename Intersector::Primitive Primitive;64typedef typename Intersector::Precalculations Precalculations;6566template<bool robust>67static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)68{69for (size_t i=0; i<num; i++) {70Intersector::intersect(valid,pre,ray,context,prim[i]);71}72}7374template<bool robust>75static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)76{77vbool<K> valid0 = valid;78for (size_t i=0; i<num; i++) {79valid0 &= !Intersector::occluded(valid0,pre,ray,context,prim[i]);80if (none(valid0)) break;81}82return !valid0;83}8485template<int N, bool robust>86static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)87{88for (size_t i=0; i<num; i++) {89Intersector::intersect(pre,ray,k,context,prim[i]);90}91}9293template<int N, bool robust>94static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)95{96for (size_t i=0; i<num; i++) {97if (Intersector::occluded(pre,ray,k,context,prim[i]))98return true;99}100return false;101}102};103104// =============================================================================================105106template<int K, typename IntersectorK>107struct ArrayIntersectorKStream108{109typedef typename IntersectorK::Primitive PrimitiveK;110typedef typename IntersectorK::Precalculations PrecalculationsK;111112static __forceinline void intersectK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)113{114PrecalculationsK pre(valid,ray); // FIXME: might cause trouble115116for (size_t i=0; i<num; i++) {117IntersectorK::intersect(valid,pre,ray,context,prim[i]);118}119}120121static __forceinline vbool<K> occludedK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)122{123PrecalculationsK pre(valid,ray); // FIXME: might cause trouble124vbool<K> valid0 = valid;125for (size_t i=0; i<num; i++) {126valid0 &= !IntersectorK::occluded(valid0,pre,ray,context,prim[i]);127if (none(valid0)) break;128}129return !valid0;130}131132static __forceinline void intersect(const Accel::Intersectors* This, RayHitK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)133{134PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble135for (size_t i=0; i<num; i++) {136IntersectorK::intersect(pre,ray,k,context,prim[i]);137}138}139140static __forceinline bool occluded(const Accel::Intersectors* This, RayK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)141{142PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble143for (size_t i=0; i<num; i++) {144if (IntersectorK::occluded(pre,ray,k,context,prim[i]))145return true;146}147return false;148}149150static __forceinline size_t occluded(const Accel::Intersectors* This, size_t cur_mask, RayK<K>** __restrict__ inputPackets, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)151{152size_t m_occluded = 0;153for (size_t i=0; i<num; i++) {154size_t bits = cur_mask & (~m_occluded);155for (; bits!=0; )156{157const size_t rayID = bscf(bits);158RayHitK<K> &ray = *inputPackets[rayID / K];159const size_t k = rayID % K;160PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble161if (IntersectorK::occluded(pre,ray,k,context,prim[i]))162{163m_occluded |= (size_t)1 << rayID;164ray.tfar[k] = neg_inf;165}166}167}168return m_occluded;169}170};171}172}173174175