123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- // Copyright 2009-2021 Intel Corporation
- // SPDX-License-Identifier: Apache-2.0
- #pragma once
- #include "intersector_epilog.h"
- #include "pointi.h"
- #include "sphere_intersector.h"
- namespace embree
- {
- namespace isa
- {
- template<int M, bool filter>
- struct SphereMiIntersector1
- {
- typedef PointMi<M> Primitive;
- typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre,
- RayHit& ray,
- RayQueryContext* context,
- const Primitive& sphere)
- {
- STAT3(normal.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom);
- const vbool<M> valid = sphere.valid();
- SphereIntersector1<M>::intersect(
- valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
- }
- static __forceinline bool occluded(const Precalculations& pre,
- Ray& ray,
- RayQueryContext* context,
- const Primitive& sphere)
- {
- STAT3(shadow.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom);
- const vbool<M> valid = sphere.valid();
- return SphereIntersector1<M>::intersect(
- valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
- }
-
- static __forceinline bool pointQuery(PointQuery* query,
- PointQueryContext* context,
- const Primitive& sphere)
- {
- return PrimitivePointQuery1<Primitive>::pointQuery(query, context, sphere);
- }
- };
- template<int M, bool filter>
- struct SphereMiMBIntersector1
- {
- typedef PointMi<M> Primitive;
- typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre,
- RayHit& ray,
- RayQueryContext* context,
- const Primitive& sphere)
- {
- STAT3(normal.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom, ray.time());
- const vbool<M> valid = sphere.valid();
- SphereIntersector1<M>::intersect(
- valid, ray, context, geom, pre, v0, Intersect1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
- }
- static __forceinline bool occluded(const Precalculations& pre,
- Ray& ray,
- RayQueryContext* context,
- const Primitive& sphere)
- {
- STAT3(shadow.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom, ray.time());
- const vbool<M> valid = sphere.valid();
- return SphereIntersector1<M>::intersect(
- valid, ray, context, geom, pre, v0, Occluded1EpilogM<M, filter>(ray, context, sphere.geomID(), sphere.primID()));
- }
- static __forceinline bool pointQuery(PointQuery* query,
- PointQueryContext* context,
- const Primitive& sphere)
- {
- return PrimitivePointQuery1<Primitive>::pointQuery(query, context, sphere);
- }
- };
- template<int M, int K, bool filter>
- struct SphereMiIntersectorK
- {
- typedef PointMi<M> Primitive;
- typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
- {
- STAT3(normal.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom);
- const vbool<M> valid = sphere.valid();
- SphereIntersectorK<M, K>::intersect(
- valid, ray, k, context, geom, pre, v0,
- Intersect1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
- }
- static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
- {
- STAT3(shadow.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom);
- const vbool<M> valid = sphere.valid();
- return SphereIntersectorK<M, K>::intersect(
- valid, ray, k, context, geom, pre, v0,
- Occluded1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
- }
- };
- template<int M, int K, bool filter>
- struct SphereMiMBIntersectorK
- {
- typedef PointMi<M> Primitive;
- typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
- {
- STAT3(normal.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom, ray.time()[k]);
- const vbool<M> valid = sphere.valid();
- SphereIntersectorK<M, K>::intersect(
- valid, ray, k, context, geom, pre, v0,
- Intersect1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
- }
- static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
- {
- STAT3(shadow.trav_prims, 1, 1, 1);
- const Points* geom = context->scene->get<Points>(sphere.geomID());
- Vec4vf<M> v0; sphere.gather(v0, geom, ray.time()[k]);
- const vbool<M> valid = sphere.valid();
- return SphereIntersectorK<M, K>::intersect(
- valid, ray, k, context, geom, pre, v0,
- Occluded1KEpilogM<M, K, filter>(ray, k, context, sphere.geomID(), sphere.primID()));
- }
- };
- } // namespace isa
- } // namespace embree
|