Path: blob/master/thirdparty/embree/kernels/geometry/disci_intersector.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "disc_intersector.h"6#include "intersector_epilog.h"7#include "pointi.h"89namespace embree10{11namespace isa12{13template<int M, bool filter>14struct DiscMiIntersector115{16typedef PointMi<M> Primitive;17typedef CurvePrecalculations1 Precalculations;1819static __forceinline void intersect(const Precalculations& pre,20RayHit& ray,21RayQueryContext* context,22const Primitive& Disc)23{24STAT3(normal.trav_prims, 1, 1, 1);25const Points* geom = context->scene->get<Points>(Disc.geomID());26Vec4vf<M> v0; Disc.gather(v0, geom);27const vbool<M> valid = Disc.valid();28DiscIntersector1<M>::intersect(29valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));30}3132static __forceinline bool occluded(const Precalculations& pre,33Ray& ray,34RayQueryContext* context,35const Primitive& Disc)36{37STAT3(shadow.trav_prims, 1, 1, 1);38const Points* geom = context->scene->get<Points>(Disc.geomID());39Vec4vf<M> v0; Disc.gather(v0, geom);40const vbool<M> valid = Disc.valid();41return DiscIntersector1<M>::intersect(42valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));43}44};4546template<int M, bool filter>47struct DiscMiMBIntersector148{49typedef PointMi<M> Primitive;50typedef CurvePrecalculations1 Precalculations;5152static __forceinline void intersect(const Precalculations& pre,53RayHit& ray,54RayQueryContext* context,55const Primitive& Disc)56{57STAT3(normal.trav_prims, 1, 1, 1);58const Points* geom = context->scene->get<Points>(Disc.geomID());59Vec4vf<M> v0; Disc.gather(v0, geom, ray.time());60const vbool<M> valid = Disc.valid();61DiscIntersector1<M>::intersect(62valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));63}6465static __forceinline bool occluded(const Precalculations& pre,66Ray& ray,67RayQueryContext* context,68const Primitive& Disc)69{70STAT3(shadow.trav_prims, 1, 1, 1);71const Points* geom = context->scene->get<Points>(Disc.geomID());72Vec4vf<M> v0; Disc.gather(v0, geom, ray.time());73const vbool<M> valid = Disc.valid();74return DiscIntersector1<M>::intersect(75valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));76}77};7879template<int M, int K, bool filter>80struct DiscMiIntersectorK81{82typedef PointMi<M> Primitive;83typedef CurvePrecalculationsK<K> Precalculations;8485static __forceinline void intersect(86const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)87{88STAT3(normal.trav_prims, 1, 1, 1);89const Points* geom = context->scene->get<Points>(Disc.geomID());90Vec4vf<M> v0; Disc.gather(v0, geom);91const vbool<M> valid = Disc.valid();92DiscIntersectorK<M, K>::intersect(93valid, ray, k, context, geom, pre, v0,94Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));95}9697static __forceinline bool occluded(98const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)99{100STAT3(shadow.trav_prims, 1, 1, 1);101const Points* geom = context->scene->get<Points>(Disc.geomID());102Vec4vf<M> v0; Disc.gather(v0, geom);103const vbool<M> valid = Disc.valid();104return DiscIntersectorK<M, K>::intersect(105valid, ray, k, context, geom, pre, v0,106Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));107}108};109110template<int M, int K, bool filter>111struct DiscMiMBIntersectorK112{113typedef PointMi<M> Primitive;114typedef CurvePrecalculationsK<K> Precalculations;115116static __forceinline void intersect(117const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)118{119STAT3(normal.trav_prims, 1, 1, 1);120const Points* geom = context->scene->get<Points>(Disc.geomID());121Vec4vf<M> v0; Disc.gather(v0, geom, ray.time()[k]);122const vbool<M> valid = Disc.valid();123DiscIntersectorK<M, K>::intersect(124valid, ray, k, context, geom, pre, v0,125Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));126}127128static __forceinline bool occluded(129const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)130{131STAT3(shadow.trav_prims, 1, 1, 1);132const Points* geom = context->scene->get<Points>(Disc.geomID());133Vec4vf<M> v0; Disc.gather(v0, geom, ray.time()[k]);134const vbool<M> valid = Disc.valid();135return DiscIntersectorK<M, K>::intersect(136valid, ray, k, context, geom, pre, v0, Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));137}138};139140template<int M, bool filter>141struct OrientedDiscMiIntersector1142{143typedef PointMi<M> Primitive;144typedef CurvePrecalculations1 Precalculations;145146static __forceinline void intersect(const Precalculations& pre,147RayHit& ray,148RayQueryContext* context,149const Primitive& Disc)150{151STAT3(normal.trav_prims, 1, 1, 1);152const Points* geom = context->scene->get<Points>(Disc.geomID());153Vec4vf<M> v0; Vec3vf<M> n0;154Disc.gather(v0, n0, geom);155const vbool<M> valid = Disc.valid();156DiscIntersector1<M>::intersect(157valid, ray, context, geom, pre, v0, n0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));158}159160static __forceinline bool occluded(const Precalculations& pre,161Ray& ray,162RayQueryContext* context,163const Primitive& Disc)164{165STAT3(shadow.trav_prims, 1, 1, 1);166const Points* geom = context->scene->get<Points>(Disc.geomID());167Vec4vf<M> v0; Vec3vf<M> n0;168Disc.gather(v0, n0, geom);169const vbool<M> valid = Disc.valid();170return DiscIntersector1<M>::intersect(171valid, ray, context, geom, pre, v0, n0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));172}173};174175template<int M, bool filter>176struct OrientedDiscMiMBIntersector1177{178typedef PointMi<M> Primitive;179typedef CurvePrecalculations1 Precalculations;180181static __forceinline void intersect(const Precalculations& pre,182RayHit& ray,183RayQueryContext* context,184const Primitive& Disc)185{186STAT3(normal.trav_prims, 1, 1, 1);187const Points* geom = context->scene->get<Points>(Disc.geomID());188Vec4vf<M> v0; Vec3vf<M> n0;189Disc.gather(v0, n0, geom, ray.time());190const vbool<M> valid = Disc.valid();191DiscIntersector1<M>::intersect(192valid, ray, context, geom, pre, v0, n0, Intersect1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));193}194195static __forceinline bool occluded(const Precalculations& pre,196Ray& ray,197RayQueryContext* context,198const Primitive& Disc)199{200STAT3(shadow.trav_prims, 1, 1, 1);201const Points* geom = context->scene->get<Points>(Disc.geomID());202Vec4vf<M> v0; Vec3vf<M> n0;203Disc.gather(v0, n0, geom, ray.time());204const vbool<M> valid = Disc.valid();205return DiscIntersector1<M>::intersect(206valid, ray, context, geom, pre, v0, n0, Occluded1EpilogM<M, filter>(ray, context, Disc.geomID(), Disc.primID()));207}208};209210template<int M, int K, bool filter>211struct OrientedDiscMiIntersectorK212{213typedef PointMi<M> Primitive;214typedef CurvePrecalculationsK<K> Precalculations;215216static __forceinline void intersect(217const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)218{219STAT3(normal.trav_prims, 1, 1, 1);220const Points* geom = context->scene->get<Points>(Disc.geomID());221Vec4vf<M> v0; Vec3vf<M> n0;222Disc.gather(v0, n0, geom);223const vbool<M> valid = Disc.valid();224DiscIntersectorK<M, K>::intersect(225valid, ray, k, context, geom, pre, v0, n0,226Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));227}228229static __forceinline bool occluded(230const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)231{232STAT3(shadow.trav_prims, 1, 1, 1);233const Points* geom = context->scene->get<Points>(Disc.geomID());234Vec4vf<M> v0; Vec3vf<M> n0;235Disc.gather(v0, n0, geom);236const vbool<M> valid = Disc.valid();237return DiscIntersectorK<M, K>::intersect(238valid, ray, k, context, geom, pre, v0, n0,239Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));240}241};242243template<int M, int K, bool filter>244struct OrientedDiscMiMBIntersectorK245{246typedef PointMi<M> Primitive;247typedef CurvePrecalculationsK<K> Precalculations;248249static __forceinline void intersect(250const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)251{252STAT3(normal.trav_prims, 1, 1, 1);253const Points* geom = context->scene->get<Points>(Disc.geomID());254Vec4vf<M> v0; Vec3vf<M> n0;255Disc.gather(v0, n0, geom, ray.time()[k]);256const vbool<M> valid = Disc.valid();257DiscIntersectorK<M, K>::intersect(258valid, ray, k, context, geom, pre, v0, n0,259Intersect1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));260}261262static __forceinline bool occluded(263const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)264{265STAT3(shadow.trav_prims, 1, 1, 1);266const Points* geom = context->scene->get<Points>(Disc.geomID());267Vec4vf<M> v0; Vec3vf<M> n0;268Disc.gather(v0, n0, geom, ray.time()[k]);269const vbool<M> valid = Disc.valid();270return DiscIntersectorK<M, K>::intersect(271valid, ray, k, context, geom, pre, v0, n0,272Occluded1KEpilogM<M, K, filter>(ray, k, context, Disc.geomID(), Disc.primID()));273}274};275} // namespace isa276} // namespace embree277278279