Revision control
++ // Copyright 2009-2021 Intel Corporation
++ // SPDX-License-Identifier: Apache-2.0
++
++ #pragma once
++
++ #include "accelset.h"
++
++ namespace embree
++ {
++ /*! User geometry with user defined intersection functions */
++ struct UserGeometry : public AccelSet
++ {
++ /*! type of this geometry */
++ static const Geometry::GTypeMask geom_type = Geometry::MTY_USER_GEOMETRY;
++
++ public:
++ UserGeometry (Device* device, unsigned int items = 0, unsigned int numTimeSteps = 1);
++ virtual void setMask (unsigned mask);
++ virtual void setBoundsFunction (RTCBoundsFunction bounds, void* userPtr);
++ virtual void setIntersectFunctionN (RTCIntersectFunctionN intersect);
++ virtual void setOccludedFunctionN (RTCOccludedFunctionN occluded);
++ virtual void build() {}
++ virtual void addElementsToCount (GeometryCounts & counts) const;
++ };
++
++ namespace isa
++ {
++ struct UserGeometryISA : public UserGeometry
++ {
++ UserGeometryISA (Device* device)
++ : UserGeometry(device) {}
++
++ PrimInfo createPrimRefArray(mvector<PrimRef>& prims, const range<size_t>& r, size_t k, unsigned int geomID) const
++ {
++ PrimInfo pinfo(empty);
++ for (size_t j=r.begin(); j<r.end(); j++)
++ {
++ BBox3fa bounds = empty;
++ if (!buildBounds(j,&bounds)) continue;
++ const PrimRef prim(bounds,geomID,unsigned(j));
++ pinfo.add_center2(prim);
++ prims[k++] = prim;
++ }
++ return pinfo;
++ }
++
++ PrimInfo createPrimRefArrayMB(mvector<PrimRef>& prims, size_t itime, const range<size_t>& r, size_t k, unsigned int geomID) const
++ {
++ PrimInfo pinfo(empty);
++ for (size_t j=r.begin(); j<r.end(); j++)
++ {
++ BBox3fa bounds = empty;
++ if (!buildBounds(j,itime,bounds)) continue;
++ const PrimRef prim(bounds,geomID,unsigned(j));
++ pinfo.add_center2(prim);
++ prims[k++] = prim;
++ }
++ return pinfo;
++ }
++
++ PrimInfoMB createPrimRefMBArray(mvector<PrimRefMB>& prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const
++ {
++ PrimInfoMB pinfo(empty);
++ for (size_t j=r.begin(); j<r.end(); j++)
++ {
++ if (!valid(j, timeSegmentRange(t0t1))) continue;
++ const PrimRefMB prim(linearBounds(j,t0t1),this->numTimeSegments(),this->time_range,this->numTimeSegments(),geomID,unsigned(j));
++ pinfo.add_primref(prim);
++ prims[k++] = prim;
++ }
++ return pinfo;
++ }
++ };
++ }
++
++ DECLARE_ISA_FUNCTION(UserGeometry*, createUserGeometry, Device*);
++ }