| 1 | // Copyright 2009-2021 Intel Corporation |
| 2 | // SPDX-License-Identifier: Apache-2.0 |
| 3 | |
| 4 | #pragma once |
| 5 | |
| 6 | #include "accelset.h" |
| 7 | |
| 8 | namespace embree |
| 9 | { |
| 10 | /*! User geometry with user defined intersection functions */ |
| 11 | struct UserGeometry : public AccelSet |
| 12 | { |
| 13 | /*! type of this geometry */ |
| 14 | static const Geometry::GTypeMask geom_type = Geometry::MTY_USER_GEOMETRY; |
| 15 | |
| 16 | public: |
| 17 | UserGeometry (Device* device, unsigned int items = 0, unsigned int numTimeSteps = 1); |
| 18 | virtual void setMask (unsigned mask); |
| 19 | virtual void setBoundsFunction (RTCBoundsFunction bounds, void* userPtr); |
| 20 | virtual void setIntersectFunctionN (RTCIntersectFunctionN intersect); |
| 21 | virtual void setOccludedFunctionN (RTCOccludedFunctionN occluded); |
| 22 | virtual void build() {} |
| 23 | virtual void addElementsToCount (GeometryCounts & counts) const; |
| 24 | }; |
| 25 | |
| 26 | namespace isa |
| 27 | { |
| 28 | struct UserGeometryISA : public UserGeometry |
| 29 | { |
| 30 | UserGeometryISA (Device* device) |
| 31 | : UserGeometry(device) {} |
| 32 | |
| 33 | PrimInfo createPrimRefArray(mvector<PrimRef>& prims, const range<size_t>& r, size_t k, unsigned int geomID) const |
| 34 | { |
| 35 | PrimInfo pinfo(empty); |
| 36 | for (size_t j=r.begin(); j<r.end(); j++) |
| 37 | { |
| 38 | BBox3fa bounds = empty; |
| 39 | if (!buildBounds(j,&bounds)) continue; |
| 40 | const PrimRef prim(bounds,geomID,unsigned(j)); |
| 41 | pinfo.add_center2(prim); |
| 42 | prims[k++] = prim; |
| 43 | } |
| 44 | return pinfo; |
| 45 | } |
| 46 | |
| 47 | PrimInfo createPrimRefArrayMB(mvector<PrimRef>& prims, size_t itime, const range<size_t>& r, size_t k, unsigned int geomID) const |
| 48 | { |
| 49 | PrimInfo pinfo(empty); |
| 50 | for (size_t j=r.begin(); j<r.end(); j++) |
| 51 | { |
| 52 | BBox3fa bounds = empty; |
| 53 | if (!buildBounds(j,itime,bounds)) continue; |
| 54 | const PrimRef prim(bounds,geomID,unsigned(j)); |
| 55 | pinfo.add_center2(prim); |
| 56 | prims[k++] = prim; |
| 57 | } |
| 58 | return pinfo; |
| 59 | } |
| 60 | |
| 61 | PrimInfoMB createPrimRefMBArray(mvector<PrimRefMB>& prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const |
| 62 | { |
| 63 | PrimInfoMB pinfo(empty); |
| 64 | for (size_t j=r.begin(); j<r.end(); j++) |
| 65 | { |
| 66 | if (!valid(j, timeSegmentRange(t0t1))) continue; |
| 67 | const PrimRefMB prim(linearBounds(j,t0t1),this->numTimeSegments(),this->time_range,this->numTimeSegments(),geomID,unsigned(j)); |
| 68 | pinfo.add_primref(prim); |
| 69 | prims[k++] = prim; |
| 70 | } |
| 71 | return pinfo; |
| 72 | } |
| 73 | }; |
| 74 | } |
| 75 | |
| 76 | DECLARE_ISA_FUNCTION(UserGeometry*, createUserGeometry, Device*); |
| 77 | } |
| 78 | |