| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | // Copyright 2009-2021 Intel Corporation
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | // 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; | 
					
						
							| 
									
										
										
										
											2024-02-24 12:40:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     __forceinline float projectedPrimitiveArea(const size_t i) const { return 0.0f; } | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   namespace isa | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     struct UserGeometryISA : public UserGeometry | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       UserGeometryISA (Device* device) | 
					
						
							|  |  |  |         : UserGeometry(device) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-24 12:40:55 +01:00
										 |  |  |       PrimInfo createPrimRefArray(PrimRef* prims, const range<size_t>& r, size_t k, unsigned int geomID) const | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |       { | 
					
						
							|  |  |  |         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; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-02-24 12:40:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       PrimInfo createPrimRefArrayMB(PrimRef* prims, const BBox1f& time_range, const range<size_t>& 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; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |       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*); | 
					
						
							|  |  |  | } |