// 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; __forceinline float projectedPrimitiveArea(const size_t i) const { return 0.0f; } }; namespace isa { struct UserGeometryISA : public UserGeometry { UserGeometryISA (Device* device) : UserGeometry(device) {} PrimInfo createPrimRefArray(PrimRef* prims, const range& r, size_t k, unsigned int geomID) const { PrimInfo pinfo(empty); for (size_t j=r.begin(); j& prims, size_t itime, const range& r, size_t k, unsigned int geomID) const { PrimInfo pinfo(empty); for (size_t j=r.begin(); j& r, size_t k, unsigned int geomID) const { PrimInfo pinfo(empty); const BBox1f t0t1 = BBox1f::intersect(getTimeRange(), time_range); if (t0t1.empty()) return pinfo; for (size_t j = r.begin(); j < r.end(); j++) { LBBox3fa lbounds = empty; if (!linearBounds(j, t0t1, lbounds)) continue; const PrimRef prim(lbounds.bounds(), geomID, unsigned(j)); pinfo.add_center2(prim); prims[k++] = prim; } return pinfo; } PrimInfoMB createPrimRefMBArray(mvector& prims, const BBox1f& t0t1, const range& r, size_t k, unsigned int geomID) const { PrimInfoMB pinfo(empty); for (size_t j=r.begin(); jnumTimeSegments(),this->time_range,this->numTimeSegments(),geomID,unsigned(j)); pinfo.add_primref(prim); prims[k++] = prim; } return pinfo; } }; } DECLARE_ISA_FUNCTION(UserGeometry*, createUserGeometry, Device*); }