78 lines
2.5 KiB
C++
78 lines
2.5 KiB
C++
// 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*);
|
|
}
|