// 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 struct SphereMiIntersector1 { typedef PointMi 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(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom); const vbool valid = sphere.valid(); SphereIntersector1::intersect( valid, ray, context, geom, pre, v0, Intersect1EpilogM(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(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom); const vbool valid = sphere.valid(); return SphereIntersector1::intersect( valid, ray, context, geom, pre, v0, Occluded1EpilogM(ray, context, sphere.geomID(), sphere.primID())); } static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& sphere) { return PrimitivePointQuery1::pointQuery(query, context, sphere); } }; template struct SphereMiMBIntersector1 { typedef PointMi 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(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom, ray.time()); const vbool valid = sphere.valid(); SphereIntersector1::intersect( valid, ray, context, geom, pre, v0, Intersect1EpilogM(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(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom, ray.time()); const vbool valid = sphere.valid(); return SphereIntersector1::intersect( valid, ray, context, geom, pre, v0, Occluded1EpilogM(ray, context, sphere.geomID(), sphere.primID())); } static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& sphere) { return PrimitivePointQuery1::pointQuery(query, context, sphere); } }; template struct SphereMiIntersectorK { typedef PointMi Primitive; typedef CurvePrecalculationsK Precalculations; static __forceinline void intersect( const Precalculations& pre, RayHitK& ray, size_t k, RayQueryContext* context, const Primitive& sphere) { STAT3(normal.trav_prims, 1, 1, 1); const Points* geom = context->scene->get(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom); const vbool valid = sphere.valid(); SphereIntersectorK::intersect( valid, ray, k, context, geom, pre, v0, Intersect1KEpilogM(ray, k, context, sphere.geomID(), sphere.primID())); } static __forceinline bool occluded( const Precalculations& pre, RayK& ray, size_t k, RayQueryContext* context, const Primitive& sphere) { STAT3(shadow.trav_prims, 1, 1, 1); const Points* geom = context->scene->get(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom); const vbool valid = sphere.valid(); return SphereIntersectorK::intersect( valid, ray, k, context, geom, pre, v0, Occluded1KEpilogM(ray, k, context, sphere.geomID(), sphere.primID())); } }; template struct SphereMiMBIntersectorK { typedef PointMi Primitive; typedef CurvePrecalculationsK Precalculations; static __forceinline void intersect( const Precalculations& pre, RayHitK& ray, size_t k, RayQueryContext* context, const Primitive& sphere) { STAT3(normal.trav_prims, 1, 1, 1); const Points* geom = context->scene->get(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom, ray.time()[k]); const vbool valid = sphere.valid(); SphereIntersectorK::intersect( valid, ray, k, context, geom, pre, v0, Intersect1KEpilogM(ray, k, context, sphere.geomID(), sphere.primID())); } static __forceinline bool occluded( const Precalculations& pre, RayK& ray, size_t k, RayQueryContext* context, const Primitive& sphere) { STAT3(shadow.trav_prims, 1, 1, 1); const Points* geom = context->scene->get(sphere.geomID()); Vec4vf v0; sphere.gather(v0, geom, ray.time()[k]); const vbool valid = sphere.valid(); return SphereIntersectorK::intersect( valid, ray, k, context, geom, pre, v0, Occluded1KEpilogM(ray, k, context, sphere.geomID(), sphere.primID())); } }; } // namespace isa } // namespace embree