Path: blob/master/thirdparty/embree/kernels/common/rtcore.cpp
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#define RTC_EXPORT_API45#include "default.h"6#include "device.h"7#include "scene.h"8#include "context.h"9#include "../geometry/filter.h"10#include "../../include/embree4/rtcore_ray.h"11using namespace embree;1213RTC_NAMESPACE_BEGIN;1415#define RTC_ENTER_DEVICE(arg) \16DeviceEnterLeave enterleave(arg);1718/* mutex to make API thread safe */19static MutexSys g_mutex;2021RTC_API RTCDevice rtcNewDevice(const char* config)22{23RTC_CATCH_BEGIN;24RTC_TRACE(rtcNewDevice);25Lock<MutexSys> lock(g_mutex);26Device* device = new Device(config);27return (RTCDevice) device->refInc();28RTC_CATCH_END(nullptr);29return (RTCDevice) nullptr;30}3132#if defined(EMBREE_SYCL_SUPPORT)3334RTC_API RTCDevice rtcNewSYCLDeviceInternal(sycl::context sycl_context, const char* config)35{36RTC_CATCH_BEGIN;37RTC_TRACE(rtcNewSYCLDevice);38Lock<MutexSys> lock(g_mutex);3940DeviceGPU* device = new DeviceGPU(sycl_context,config);41return (RTCDevice) device->refInc();42RTC_CATCH_END(nullptr);43return (RTCDevice) nullptr;44}4546RTC_API bool rtcIsSYCLDeviceSupported(const sycl::device device)47{48try {49RTC_TRACE(rtcIsSYCLDeviceSupported);50return rthwifIsSYCLDeviceSupported(device) > 0;51} catch (...) {52return false;53}54return false;55}5657RTC_API int rtcSYCLDeviceSelector(const sycl::device device)58{59try {60RTC_TRACE(rtcSYCLDeviceSelector);61return rthwifIsSYCLDeviceSupported(device);62} catch (...) {63return -1;64}65return -1;66}6768RTC_API void rtcSetDeviceSYCLDevice(RTCDevice hdevice, const sycl::device sycl_device)69{70RTC_CATCH_BEGIN;71RTC_TRACE(rtcSetDeviceSYCLDevice);72RTC_VERIFY_HANDLE(hdevice);7374Lock<MutexSys> lock(g_mutex);7576DeviceGPU* device = dynamic_cast<DeviceGPU*>((Device*) hdevice);77if (device == nullptr)78throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "passed device must be an Embree SYCL device")7980device->setSYCLDevice(sycl_device);8182RTC_CATCH_END(nullptr);83}8485RTC_API_CPP sycl::event rtcCommitSceneWithQueue (RTCScene hscene, sycl::queue queue)86{87Scene* scene = (Scene*) hscene;88RTC_CATCH_BEGIN;89RTC_TRACE(rtcCommitSceneWithQueue);90RTC_VERIFY_HANDLE(hscene);91RTC_ENTER_DEVICE(hscene);92return scene->commit(false, queue);93RTC_CATCH_END2(scene);94return sycl::event();95}9697RTC_API_CPP sycl::event rtcCommitBufferWithQueue(RTCBuffer hbuffer, sycl::queue queue) {98Buffer* buffer = (Buffer*)hbuffer;99RTC_CATCH_BEGIN;100RTC_TRACE(rtcCommitBufferWithQueue);101RTC_VERIFY_HANDLE(hbuffer);102RTC_ENTER_DEVICE(hbuffer);103return buffer->commit(queue);104RTC_CATCH_END2(buffer);105return sycl::event();106}107108#endif109110RTC_API void rtcRetainDevice(RTCDevice hdevice)111{112Device* device = (Device*) hdevice;113RTC_CATCH_BEGIN;114RTC_TRACE(rtcRetainDevice);115RTC_VERIFY_HANDLE(hdevice);116Lock<MutexSys> lock(g_mutex);117device->refInc();118RTC_CATCH_END(nullptr);119}120121RTC_API void rtcReleaseDevice(RTCDevice hdevice)122{123Device* device = (Device*) hdevice;124RTC_CATCH_BEGIN;125RTC_TRACE(rtcReleaseDevice);126RTC_VERIFY_HANDLE(hdevice);127Lock<MutexSys> lock(g_mutex);128device->refDec();129RTC_CATCH_END(nullptr);130}131132RTC_API ssize_t rtcGetDeviceProperty(RTCDevice hdevice, RTCDeviceProperty prop)133{134Device* device = (Device*) hdevice;135RTC_CATCH_BEGIN;136RTC_TRACE(rtcGetDeviceProperty);137RTC_VERIFY_HANDLE(hdevice);138Lock<MutexSys> lock(g_mutex);139return device->getProperty(prop);140RTC_CATCH_END(device);141return 0;142}143144RTC_API void rtcSetDeviceProperty(RTCDevice hdevice, const RTCDeviceProperty prop, ssize_t val)145{146Device* device = (Device*) hdevice;147RTC_CATCH_BEGIN;148RTC_TRACE(rtcSetDeviceProperty);149const bool internal_prop = (size_t)prop >= 1000000 && (size_t)prop < 1000004;150if (!internal_prop) RTC_VERIFY_HANDLE(hdevice); // allow NULL device for special internal settings151Lock<MutexSys> lock(g_mutex);152device->setProperty(prop,val);153RTC_CATCH_END(device);154}155156RTC_API RTCError rtcGetDeviceError(RTCDevice hdevice)157{158Device* device = (Device*) hdevice;159RTC_CATCH_BEGIN;160RTC_TRACE(rtcGetDeviceError);161if (device == nullptr) return Device::getThreadErrorCode();162else return device->getDeviceErrorCode();163RTC_CATCH_END(device);164return RTC_ERROR_UNKNOWN;165}166167RTC_API const char* rtcGetDeviceLastErrorMessage(RTCDevice hdevice)168{169Device* device = (Device*) hdevice;170RTC_CATCH_BEGIN;171RTC_TRACE(rtcGetDeviceLastErrorMessage);172if (device == nullptr) return Device::getThreadLastErrorMessage();173else return device->getDeviceLastErrorMessage();174RTC_CATCH_END(device);175return "";176}177178RTC_API void rtcSetDeviceErrorFunction(RTCDevice hdevice, RTCErrorFunction error, void* userPtr)179{180Device* device = (Device*) hdevice;181RTC_CATCH_BEGIN;182RTC_TRACE(rtcSetDeviceErrorFunction);183RTC_VERIFY_HANDLE(hdevice);184device->setErrorFunction(error, userPtr);185RTC_CATCH_END(device);186}187188RTC_API void rtcSetDeviceMemoryMonitorFunction(RTCDevice hdevice, RTCMemoryMonitorFunction memoryMonitor, void* userPtr)189{190Device* device = (Device*) hdevice;191RTC_CATCH_BEGIN;192RTC_TRACE(rtcSetDeviceMemoryMonitorFunction);193device->setMemoryMonitorFunction(memoryMonitor, userPtr);194RTC_CATCH_END(device);195}196197RTC_API RTCBuffer rtcNewBuffer(RTCDevice hdevice, size_t byteSize)198{199RTC_CATCH_BEGIN;200RTC_TRACE(rtcNewBuffer);201RTC_VERIFY_HANDLE(hdevice);202RTC_ENTER_DEVICE(hdevice);203Buffer* buffer = new Buffer((Device*)hdevice, byteSize, nullptr);204return (RTCBuffer)buffer->refInc();205RTC_CATCH_END((Device*)hdevice);206return nullptr;207}208209RTC_API RTCBuffer rtcNewBufferHostDevice(RTCDevice hdevice, size_t byteSize)210{211RTC_CATCH_BEGIN;212RTC_TRACE(rtcNewBufferHostDevice);213RTC_VERIFY_HANDLE(hdevice);214RTC_ENTER_DEVICE(hdevice);215Buffer* buffer = new Buffer((Device*)hdevice, byteSize, nullptr, nullptr);216return (RTCBuffer)buffer->refInc();217RTC_CATCH_END((Device*)hdevice);218return nullptr;219}220221RTC_API RTCBuffer rtcNewSharedBuffer(RTCDevice hdevice, void* ptr, size_t byteSize)222{223RTC_CATCH_BEGIN;224RTC_TRACE(rtcNewSharedBuffer);225RTC_VERIFY_HANDLE(hdevice);226RTC_ENTER_DEVICE(hdevice);227Buffer* buffer = new Buffer((Device*)hdevice, byteSize, ptr);228return (RTCBuffer)buffer->refInc();229RTC_CATCH_END((Device*)hdevice);230return nullptr;231}232233RTC_API RTCBuffer rtcNewSharedBufferHostDevice(RTCDevice hdevice, void* ptr, size_t byteSize)234{235RTC_CATCH_BEGIN;236RTC_TRACE(rtcNewSharedBufferHostDevice);237RTC_VERIFY_HANDLE(hdevice);238RTC_ENTER_DEVICE(hdevice);239Buffer* buffer = new Buffer((Device*)hdevice, byteSize, ptr, nullptr);240return (RTCBuffer)buffer->refInc();241RTC_CATCH_END((Device*)hdevice);242return nullptr;243}244245RTC_API void* rtcGetBufferDataDevice(RTCBuffer hbuffer)246{247Buffer* buffer = (Buffer*)hbuffer;248RTC_CATCH_BEGIN;249RTC_TRACE(rtcGetBufferDataDevice);250RTC_VERIFY_HANDLE(hbuffer);251RTC_ENTER_DEVICE(hbuffer);252return buffer->dataDevice();253RTC_CATCH_END2(buffer);254return nullptr;255}256257RTC_API void* rtcGetBufferData(RTCBuffer hbuffer)258{259Buffer* buffer = (Buffer*)hbuffer;260RTC_CATCH_BEGIN;261RTC_TRACE(rtcGetBufferData);262RTC_VERIFY_HANDLE(hbuffer);263RTC_ENTER_DEVICE(hbuffer);264return buffer->data();265RTC_CATCH_END2(buffer);266return nullptr;267}268269RTC_API void rtcRetainBuffer(RTCBuffer hbuffer)270{271Buffer* buffer = (Buffer*)hbuffer;272RTC_CATCH_BEGIN;273RTC_TRACE(rtcRetainBuffer);274RTC_VERIFY_HANDLE(hbuffer);275RTC_ENTER_DEVICE(hbuffer);276buffer->refInc();277RTC_CATCH_END2(buffer);278}279280RTC_API void rtcReleaseBuffer(RTCBuffer hbuffer)281{282Buffer* buffer = (Buffer*)hbuffer;283RTC_CATCH_BEGIN;284RTC_TRACE(rtcReleaseBuffer);285RTC_VERIFY_HANDLE(hbuffer);286RTC_ENTER_DEVICE(hbuffer);287buffer->refDec();288RTC_CATCH_END2(buffer);289}290291RTC_API void rtcCommitBuffer(RTCBuffer hbuffer) {292Buffer* buffer = (Buffer*)hbuffer;293RTC_CATCH_BEGIN;294RTC_TRACE(rtcCommitBuffer);295RTC_VERIFY_HANDLE(hbuffer);296RTC_ENTER_DEVICE(hbuffer);297buffer->commit();298RTC_CATCH_END2(buffer);299}300301RTC_API RTCScene rtcNewScene (RTCDevice hdevice)302{303RTC_CATCH_BEGIN;304RTC_TRACE(rtcNewScene);305RTC_VERIFY_HANDLE(hdevice);306RTC_ENTER_DEVICE(hdevice);307Scene* scene = new Scene((Device*)hdevice);308return (RTCScene) scene->refInc();309RTC_CATCH_END((Device*)hdevice);310return nullptr;311}312313RTC_API RTCDevice rtcGetSceneDevice(RTCScene hscene)314{315Scene* scene = (Scene*) hscene;316RTC_CATCH_BEGIN;317RTC_TRACE(rtcGetSceneDevice);318RTC_VERIFY_HANDLE(hscene);319return (RTCDevice)scene->device->refInc(); // user will own one additional device reference320RTC_CATCH_END2(scene);321return (RTCDevice)nullptr;322}323324RTC_API RTCTraversable rtcGetSceneTraversable(RTCScene hscene)325{326Scene* scene = (Scene*) hscene;327RTC_CATCH_BEGIN;328RTC_TRACE(rtcGetSceneTraversable);329RTC_VERIFY_HANDLE(hscene);330RTCTraversable traversable = (RTCTraversable)scene->getTraversable();331if (!traversable)332throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Traversable is NULL. The scene has to be committed first.");333return traversable;334RTC_CATCH_END2(scene);335return (RTCTraversable)nullptr;336}337338RTC_API void rtcSetSceneProgressMonitorFunction(RTCScene hscene, RTCProgressMonitorFunction progress, void* ptr)339{340Scene* scene = (Scene*) hscene;341RTC_CATCH_BEGIN;342RTC_TRACE(rtcSetSceneProgressMonitorFunction);343RTC_VERIFY_HANDLE(hscene);344RTC_ENTER_DEVICE(hscene);345Lock<MutexSys> lock(g_mutex);346scene->setProgressMonitorFunction(progress,ptr);347RTC_CATCH_END2(scene);348}349350RTC_API void rtcSetSceneBuildQuality (RTCScene hscene, RTCBuildQuality quality)351{352Scene* scene = (Scene*) hscene;353RTC_CATCH_BEGIN;354RTC_TRACE(rtcSetSceneBuildQuality);355RTC_VERIFY_HANDLE(hscene);356RTC_ENTER_DEVICE(hscene);357if (quality != RTC_BUILD_QUALITY_LOW &&358quality != RTC_BUILD_QUALITY_MEDIUM &&359quality != RTC_BUILD_QUALITY_HIGH)360abort(); //throw std::runtime_error("invalid build quality");361scene->setBuildQuality(quality);362RTC_CATCH_END2(scene);363}364365RTC_API void rtcSetSceneFlags (RTCScene hscene, RTCSceneFlags flags)366{367Scene* scene = (Scene*) hscene;368RTC_CATCH_BEGIN;369RTC_TRACE(rtcSetSceneFlags);370RTC_VERIFY_HANDLE(hscene);371RTC_ENTER_DEVICE(hscene);372scene->setSceneFlags(flags);373RTC_CATCH_END2(scene);374}375376RTC_API RTCSceneFlags rtcGetSceneFlags(RTCScene hscene)377{378Scene* scene = (Scene*) hscene;379RTC_CATCH_BEGIN;380RTC_TRACE(rtcGetSceneFlags);381RTC_VERIFY_HANDLE(hscene);382//RTC_ENTER_DEVICE(hscene);383return scene->getSceneFlags();384RTC_CATCH_END2(scene);385return RTC_SCENE_FLAG_NONE;386}387388RTC_API_EXTERN_C bool prefetchUSMSharedOnGPU(RTCScene scene);389390RTC_API void rtcCommitScene (RTCScene hscene)391{392Scene* scene = (Scene*) hscene;393RTC_CATCH_BEGIN;394RTC_TRACE(rtcCommitScene);395RTC_VERIFY_HANDLE(hscene);396RTC_ENTER_DEVICE(hscene);397398scene->commit(false);399400#if defined(EMBREE_SYCL_SUPPORT)401//prefetchUSMSharedOnGPU(hscene);402#endif403404RTC_CATCH_END2(scene);405}406407RTC_API void rtcJoinCommitScene (RTCScene hscene)408{409Scene* scene = (Scene*) hscene;410RTC_CATCH_BEGIN;411RTC_TRACE(rtcJoinCommitScene);412RTC_VERIFY_HANDLE(hscene);413RTC_ENTER_DEVICE(hscene);414415scene->commit(true);416RTC_CATCH_END2(scene);417}418419RTC_API void rtcGetSceneBounds(RTCScene hscene, RTCBounds* bounds_o)420{421Scene* scene = (Scene*) hscene;422RTC_CATCH_BEGIN;423RTC_TRACE(rtcGetSceneBounds);424RTC_VERIFY_HANDLE(hscene);425RTC_ENTER_DEVICE(hscene);426if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");427BBox3fa bounds = scene->bounds.bounds();428bounds_o->lower_x = bounds.lower.x;429bounds_o->lower_y = bounds.lower.y;430bounds_o->lower_z = bounds.lower.z;431bounds_o->align0 = 0;432bounds_o->upper_x = bounds.upper.x;433bounds_o->upper_y = bounds.upper.y;434bounds_o->upper_z = bounds.upper.z;435bounds_o->align1 = 0;436RTC_CATCH_END2(scene);437}438439RTC_API void rtcGetSceneLinearBounds(RTCScene hscene, RTCLinearBounds* bounds_o)440{441Scene* scene = (Scene*) hscene;442RTC_CATCH_BEGIN;443RTC_TRACE(rtcGetSceneBounds);444RTC_VERIFY_HANDLE(hscene);445RTC_ENTER_DEVICE(hscene);446if (bounds_o == nullptr)447throw_RTCError(RTC_ERROR_INVALID_OPERATION,"invalid destination pointer");448if (scene->isModified())449throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");450451bounds_o->bounds0.lower_x = scene->bounds.bounds0.lower.x;452bounds_o->bounds0.lower_y = scene->bounds.bounds0.lower.y;453bounds_o->bounds0.lower_z = scene->bounds.bounds0.lower.z;454bounds_o->bounds0.align0 = 0;455bounds_o->bounds0.upper_x = scene->bounds.bounds0.upper.x;456bounds_o->bounds0.upper_y = scene->bounds.bounds0.upper.y;457bounds_o->bounds0.upper_z = scene->bounds.bounds0.upper.z;458bounds_o->bounds0.align1 = 0;459bounds_o->bounds1.lower_x = scene->bounds.bounds1.lower.x;460bounds_o->bounds1.lower_y = scene->bounds.bounds1.lower.y;461bounds_o->bounds1.lower_z = scene->bounds.bounds1.lower.z;462bounds_o->bounds1.align0 = 0;463bounds_o->bounds1.upper_x = scene->bounds.bounds1.upper.x;464bounds_o->bounds1.upper_y = scene->bounds.bounds1.upper.y;465bounds_o->bounds1.upper_z = scene->bounds.bounds1.upper.z;466bounds_o->bounds1.align1 = 0;467RTC_CATCH_END2(scene);468}469470RTC_API void rtcCollide (RTCScene hscene0, RTCScene hscene1, RTCCollideFunc callback, void* userPtr)471{472Scene* scene0 = (Scene*) hscene0;473Scene* scene1 = (Scene*) hscene1;474RTC_CATCH_BEGIN;475RTC_TRACE(rtcCollide);476#if defined(DEBUG)477RTC_VERIFY_HANDLE(hscene0);478RTC_VERIFY_HANDLE(hscene1);479if (scene0->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");480if (scene1->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");481if (scene0->device != scene1->device) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scenes are from different devices");482auto nUserPrims0 = scene0->getNumPrimitives (Geometry::MTY_USER_GEOMETRY, false);483auto nUserPrims1 = scene1->getNumPrimitives (Geometry::MTY_USER_GEOMETRY, false);484if (scene0->numPrimitives() != nUserPrims0 && scene1->numPrimitives() != nUserPrims1) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scenes must only contain user geometries with a single timestep");485#endif486scene0->intersectors.collide(scene0,scene1,callback,userPtr);487RTC_CATCH_END(scene0->device);488}489490inline bool pointQuery(Scene* scene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)491{492bool changed = false;493if (userContext->instStackSize > 0)494{495const AffineSpace3fa transform = AffineSpace3fa_load_unaligned((AffineSpace3fa*)userContext->world2inst[userContext->instStackSize-1]);496497float similarityScale = 0.f;498const bool similtude = similarityTransform(transform, &similarityScale);499assert((similtude && similarityScale > 0) || (!similtude && similarityScale == 0.f));500501PointQuery query_inst;502query_inst.p = xfmPoint(transform, Vec3fa(query->x, query->y, query->z));503query_inst.radius = query->radius * similarityScale;504query_inst.time = query->time;505506PointQueryContext context_inst(scene, (PointQuery*)query,507similtude ? POINT_QUERY_TYPE_SPHERE : POINT_QUERY_TYPE_AABB,508queryFunc, userContext, similarityScale, userPtr);509changed = scene->intersectors.pointQuery((PointQuery*)&query_inst, &context_inst);510}511else512{513PointQueryContext context(scene, (PointQuery*)query,514POINT_QUERY_TYPE_SPHERE, queryFunc, userContext, 1.f, userPtr);515changed = scene->intersectors.pointQuery((PointQuery*)query, &context);516}517return changed;518}519520RTC_API bool rtcPointQuery(RTCScene hscene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)521{522Scene* scene = (Scene*) hscene;523RTC_CATCH_BEGIN;524RTC_TRACE(rtcPointQuery);525#if defined(DEBUG)526RTC_VERIFY_HANDLE(hscene);527RTC_VERIFY_HANDLE(userContext);528if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");529if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");530if (((size_t)userContext) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "context not aligned to 16 bytes");531#endif532533return pointQuery(scene, query, userContext, queryFunc, userPtr);534RTC_CATCH_END2_FALSE(scene);535}536537RTC_API bool rtcPointQuery4 (const int* valid, RTCScene hscene, RTCPointQuery4* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)538{539Scene* scene = (Scene*) hscene;540RTC_CATCH_BEGIN;541RTC_TRACE(rtcPointQuery4);542543#if defined(DEBUG)544RTC_VERIFY_HANDLE(hscene);545if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");546if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");547if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");548#endif549STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);550STAT3(point_query.travs,cnt,cnt,cnt);551552bool changed = false;553PointQuery4* query4 = (PointQuery4*)query;554PointQuery query1;555for (size_t i=0; i<4; i++) {556if (!valid[i]) continue;557query4->get(i,query1);558changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);559query4->set(i,query1);560}561return changed;562RTC_CATCH_END2_FALSE(scene);563}564565RTC_API bool rtcPointQuery8 (const int* valid, RTCScene hscene, RTCPointQuery8* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)566{567Scene* scene = (Scene*) hscene;568RTC_CATCH_BEGIN;569RTC_TRACE(rtcPointQuery8);570571#if defined(DEBUG)572RTC_VERIFY_HANDLE(hscene);573if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");574if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");575if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");576#endif577STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);578STAT3(point_query.travs,cnt,cnt,cnt);579580bool changed = false;581PointQuery8* query8 = (PointQuery8*)query;582PointQuery query1;583for (size_t i=0; i<8; i++) {584if (!valid[i]) continue;585query8->get(i,query1);586changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);587query8->set(i,query1);588}589return changed;590RTC_CATCH_END2_FALSE(scene);591}592593RTC_API bool rtcPointQuery16 (const int* valid, RTCScene hscene, RTCPointQuery16* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)594{595Scene* scene = (Scene*) hscene;596RTC_CATCH_BEGIN;597RTC_TRACE(rtcPointQuery16);598599#if defined(DEBUG)600RTC_VERIFY_HANDLE(hscene);601if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");602if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");603if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");604#endif605STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);606STAT3(point_query.travs,cnt,cnt,cnt);607608bool changed = false;609PointQuery16* query16 = (PointQuery16*)query;610PointQuery query1;611for (size_t i=0; i<16; i++) {612if (!valid[i]) continue;613PointQuery query1; query16->get(i,query1);614changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);615query16->set(i,query1);616}617return changed;618RTC_CATCH_END2_FALSE(scene);619}620621RTC_API void rtcIntersect1 (RTCScene hscene, RTCRayHit* rayhit, RTCIntersectArguments* args)622{623Scene* scene = (Scene*) hscene;624RTC_CATCH_BEGIN;625RTC_TRACE(rtcIntersect1);626#if defined(DEBUG)627RTC_VERIFY_HANDLE(hscene);628if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");629if (((size_t)rayhit) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");630#endif631STAT3(normal.travs,1,1,1);632633RTCIntersectArguments defaultArgs;634if (unlikely(args == nullptr)) {635rtcInitIntersectArguments(&defaultArgs);636args = &defaultArgs;637}638RTCRayQueryContext* user_context = args->context;639640RTCRayQueryContext defaultContext;641if (unlikely(user_context == nullptr)) {642rtcInitRayQueryContext(&defaultContext);643user_context = &defaultContext;644}645RayQueryContext context(scene,user_context,args);646647scene->intersectors.intersect(*rayhit,&context);648#if defined(DEBUG)649((RayHit*)rayhit)->verifyHit();650#endif651RTC_CATCH_END2(scene);652}653654RTC_API void rtcForwardIntersect1 (const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)655{656rtcForwardIntersect1Ex(args, hscene, iray_, instID, 0);657}658659RTC_API void rtcForwardIntersect1Ex(const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)660{661Scene* scene = (Scene*) hscene;662RTC_CATCH_BEGIN;663RTC_TRACE(rtcForwardIntersect1Ex);664#if defined(DEBUG)665RTC_VERIFY_HANDLE(hscene);666if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");667if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");668#endif669670Ray* iray = (Ray*) iray_;671RayHit* oray = (RayHit*)args->rayhit;672RTCRayQueryContext* user_context = args->context;673const Vec3ff ray_org_tnear = oray->org;674const Vec3ff ray_dir_time = oray->dir;675oray->org = iray->org;676oray->dir = iray->dir;677STAT3(normal.travs,1,1,1);678679RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;680RayQueryContext context(scene,user_context,iargs);681682instance_id_stack::push(user_context, instID, instPrimID);683scene->intersectors.intersect(*(RTCRayHit*)oray,&context);684instance_id_stack::pop(user_context);685686oray->org = ray_org_tnear;687oray->dir = ray_dir_time;688689RTC_CATCH_END2(scene);690}691692RTC_API void rtcIntersect4 (const int* valid, RTCScene hscene, RTCRayHit4* rayhit, RTCIntersectArguments* args)693{694Scene* scene = (Scene*) hscene;695RTC_CATCH_BEGIN;696RTC_TRACE(rtcIntersect4);697698#if defined(DEBUG)699RTC_VERIFY_HANDLE(hscene);700if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");701if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");702if (((size_t)rayhit) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 16 bytes");703#endif704STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);705STAT3(normal.travs,cnt,cnt,cnt);706707RTCIntersectArguments defaultArgs;708if (unlikely(args == nullptr)) {709rtcInitIntersectArguments(&defaultArgs);710args = &defaultArgs;711}712RTCRayQueryContext* user_context = args->context;713714RTCRayQueryContext defaultContext;715if (unlikely(user_context == nullptr)) {716rtcInitRayQueryContext(&defaultContext);717user_context = &defaultContext;718}719RayQueryContext context(scene,user_context,args);720721if (likely(scene->intersectors.intersector4))722scene->intersectors.intersect4(valid,*rayhit,&context);723724else {725RayHit4* ray4 = (RayHit4*) rayhit;726for (size_t i=0; i<4; i++) {727if (!valid[i]) continue;728RayHit ray1; ray4->get(i,ray1);729scene->intersectors.intersect((RTCRayHit&)ray1,&context);730ray4->set(i,ray1);731}732}733734RTC_CATCH_END2(scene);735}736737template<int N> void copy(float* dst, float* src);738739template<>740__forceinline void copy<4>(float* dst, float* src) {741vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));742}743744template<>745__forceinline void copy<8>(float* dst, float* src) {746vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));747vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));748}749750template<>751__forceinline void copy<16>(float* dst, float* src) {752vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));753vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));754vfloat4::storeu(&dst[8],vfloat4::loadu(&src[8]));755vfloat4::storeu(&dst[12],vfloat4::loadu(&src[12]));756}757758template<typename RTCRay, typename RTCRayHit, int N>759__forceinline void rtcForwardIntersectN(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)760{761Scene* scene = (Scene*) hscene;762RTCRayHit* oray = (RTCRayHit*)args->rayhit;763RTCRayQueryContext* user_context = args->context;764765__aligned(16) float ray_org_x[N];766__aligned(16) float ray_org_y[N];767__aligned(16) float ray_org_z[N];768__aligned(16) float ray_dir_x[N];769__aligned(16) float ray_dir_y[N];770__aligned(16) float ray_dir_z[N];771772copy<N>(ray_org_x,oray->ray.org_x);773copy<N>(ray_org_y,oray->ray.org_y);774copy<N>(ray_org_z,oray->ray.org_z);775copy<N>(ray_dir_x,oray->ray.dir_x);776copy<N>(ray_dir_y,oray->ray.dir_y);777copy<N>(ray_dir_z,oray->ray.dir_z);778779copy<N>(oray->ray.org_x,iray->org_x);780copy<N>(oray->ray.org_y,iray->org_y);781copy<N>(oray->ray.org_z,iray->org_z);782copy<N>(oray->ray.dir_x,iray->dir_x);783copy<N>(oray->ray.dir_y,iray->dir_y);784copy<N>(oray->ray.dir_z,iray->dir_z);785786STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);787STAT3(normal.travs,cnt,cnt,cnt);788789RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;790RayQueryContext context(scene,user_context,iargs);791792instance_id_stack::push(user_context, instID, instPrimID);793scene->intersectors.intersect(valid,*oray,&context);794instance_id_stack::pop(user_context);795796copy<N>(oray->ray.org_x,ray_org_x);797copy<N>(oray->ray.org_y,ray_org_y);798copy<N>(oray->ray.org_z,ray_org_z);799copy<N>(oray->ray.dir_x,ray_dir_x);800copy<N>(oray->ray.dir_y,ray_dir_y);801copy<N>(oray->ray.dir_z,ray_dir_z);802}803804RTC_API void rtcForwardIntersect4(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)805{806RTC_TRACE(rtcForwardIntersect4);807return rtcForwardIntersect4Ex(valid, args, hscene, iray, instID, 0);808}809810RTC_API void rtcForwardIntersect4Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)811{812Scene* scene = (Scene*) hscene;813RTC_CATCH_BEGIN;814RTC_TRACE(rtcForwardIntersect4);815rtcForwardIntersectN<RTCRay4,RTCRayHit4,4>(valid,args,hscene,iray,instID,instPrimID);816RTC_CATCH_END2(scene);817}818819RTC_API void rtcIntersect8 (const int* valid, RTCScene hscene, RTCRayHit8* rayhit, RTCIntersectArguments* args)820{821Scene* scene = (Scene*) hscene;822RTC_CATCH_BEGIN;823RTC_TRACE(rtcIntersect8);824825#if defined(DEBUG)826RTC_VERIFY_HANDLE(hscene);827if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");828if (((size_t)valid) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 32 bytes");829if (((size_t)rayhit) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 32 bytes");830#endif831STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);832STAT3(normal.travs,cnt,cnt,cnt);833834RTCIntersectArguments defaultArgs;835if (unlikely(args == nullptr)) {836rtcInitIntersectArguments(&defaultArgs);837args = &defaultArgs;838}839RTCRayQueryContext* user_context = args->context;840841RTCRayQueryContext defaultContext;842if (unlikely(user_context == nullptr)) {843rtcInitRayQueryContext(&defaultContext);844user_context = &defaultContext;845}846RayQueryContext context(scene,user_context,args);847848if (likely(scene->intersectors.intersector8))849scene->intersectors.intersect8(valid,*rayhit,&context);850851else852{853RayHit8* ray8 = (RayHit8*) rayhit;854for (size_t i=0; i<8; i++) {855if (!valid[i]) continue;856RayHit ray1; ray8->get(i,ray1);857scene->intersectors.intersect((RTCRayHit&)ray1,&context);858ray8->set(i,ray1);859}860}861862RTC_CATCH_END2(scene);863}864865RTC_API void rtcForwardIntersect8(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)866{867RTC_TRACE(rtcForwardIntersect8);868return rtcForwardIntersect8Ex(valid, args, hscene, iray, instID, 0);869}870871RTC_API void rtcForwardIntersect8Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)872{873Scene* scene = (Scene*) hscene;874RTC_CATCH_BEGIN;875RTC_TRACE(rtcForwardIntersect8Ex);876rtcForwardIntersectN<RTCRay8,RTCRayHit8,8>(valid,args,hscene,iray,instID,instPrimID);877RTC_CATCH_END2(scene);878}879880RTC_API void rtcIntersect16 (const int* valid, RTCScene hscene, RTCRayHit16* rayhit, RTCIntersectArguments* args)881{882Scene* scene = (Scene*) hscene;883RTC_CATCH_BEGIN;884RTC_TRACE(rtcIntersect16);885886#if defined(DEBUG)887RTC_VERIFY_HANDLE(hscene);888if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");889if (((size_t)valid) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 64 bytes");890if (((size_t)rayhit) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 64 bytes");891#endif892STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);893STAT3(normal.travs,cnt,cnt,cnt);894895RTCIntersectArguments defaultArgs;896if (unlikely(args == nullptr)) {897rtcInitIntersectArguments(&defaultArgs);898args = &defaultArgs;899}900RTCRayQueryContext* user_context = args->context;901902RTCRayQueryContext defaultContext;903if (unlikely(user_context == nullptr)) {904rtcInitRayQueryContext(&defaultContext);905user_context = &defaultContext;906}907RayQueryContext context(scene,user_context,args);908909if (likely(scene->intersectors.intersector16))910scene->intersectors.intersect16(valid,*rayhit,&context);911912else {913RayHit16* ray16 = (RayHit16*) rayhit;914for (size_t i=0; i<16; i++) {915if (!valid[i]) continue;916RayHit ray1; ray16->get(i,ray1);917scene->intersectors.intersect((RTCRayHit&)ray1,&context);918ray16->set(i,ray1);919}920}921922RTC_CATCH_END2(scene);923}924925RTC_API void rtcForwardIntersect16(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)926{927RTC_TRACE(rtcForwardIntersect16);928return rtcForwardIntersect16Ex(valid, args, hscene, iray, instID, 0);929}930931RTC_API void rtcForwardIntersect16Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)932{933Scene* scene = (Scene*) hscene;934RTC_CATCH_BEGIN;935RTC_TRACE(rtcForwardIntersect16Ex);936rtcForwardIntersectN<RTCRay16,RTCRayHit16,16>(valid,args,hscene,iray,instID,instPrimID);937RTC_CATCH_END2(scene);938}939940RTC_API void rtcOccluded1 (RTCScene hscene, RTCRay* ray, RTCOccludedArguments* args)941{942Scene* scene = (Scene*) hscene;943RTC_CATCH_BEGIN;944RTC_TRACE(rtcOccluded1);945STAT3(shadow.travs,1,1,1);946#if defined(DEBUG)947RTC_VERIFY_HANDLE(hscene);948if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");949if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");950#endif951952RTCOccludedArguments defaultArgs;953if (unlikely(args == nullptr)) {954rtcInitOccludedArguments(&defaultArgs);955args = &defaultArgs;956}957RTCRayQueryContext* user_context = args->context;958959RTCRayQueryContext defaultContext;960if (unlikely(user_context == nullptr)) {961rtcInitRayQueryContext(&defaultContext);962user_context = &defaultContext;963}964RayQueryContext context(scene,user_context,args);965966scene->intersectors.occluded(*ray,&context);967RTC_CATCH_END2(scene);968}969970RTC_API void rtcForwardOccluded1 (const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)971{972RTC_TRACE(rtcForwardOccluded1);973return rtcForwardOccluded1Ex(args, hscene, iray_, instID, 0);974}975976RTC_API void rtcForwardOccluded1Ex(const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)977{978Scene* scene = (Scene*) hscene;979RTC_CATCH_BEGIN;980RTC_TRACE(rtcForwardOccluded1Ex);981STAT3(shadow.travs,1,1,1);982#if defined(DEBUG)983RTC_VERIFY_HANDLE(hscene);984if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");985if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");986#endif987988Ray* iray = (Ray*)iray_;989Ray* oray = (Ray*)args->ray;990RTCRayQueryContext* user_context = args->context;991const Vec3ff ray_org_tnear = oray->org;992const Vec3ff ray_dir_time = oray->dir;993oray->org = iray->org;994oray->dir = iray->dir;995996RTCIntersectArguments* iargs = ((OccludedFunctionNArguments*) args)->args;997RayQueryContext context(scene,user_context,iargs);998999instance_id_stack::push(user_context, instID, instPrimID);1000scene->intersectors.occluded(*(RTCRay*)oray,&context);1001instance_id_stack::pop(user_context);10021003oray->org = ray_org_tnear;1004oray->dir = ray_dir_time;10051006RTC_CATCH_END2(scene);1007}10081009RTC_API void rtcOccluded4 (const int* valid, RTCScene hscene, RTCRay4* ray, RTCOccludedArguments* args)1010{1011Scene* scene = (Scene*) hscene;1012RTC_CATCH_BEGIN;1013RTC_TRACE(rtcOccluded4);10141015#if defined(DEBUG)1016RTC_VERIFY_HANDLE(hscene);1017if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");1018if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");1019if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");1020#endif1021STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);1022STAT3(shadow.travs,cnt,cnt,cnt);10231024RTCOccludedArguments defaultArgs;1025if (unlikely(args == nullptr)) {1026rtcInitOccludedArguments(&defaultArgs);1027args = &defaultArgs;1028}1029RTCRayQueryContext* user_context = args->context;10301031RTCRayQueryContext defaultContext;1032if (unlikely(user_context == nullptr)) {1033rtcInitRayQueryContext(&defaultContext);1034user_context = &defaultContext;1035}1036RayQueryContext context(scene,user_context,args);10371038if (likely(scene->intersectors.intersector4))1039scene->intersectors.occluded4(valid,*ray,&context);10401041else {1042RayHit4* ray4 = (RayHit4*) ray;1043for (size_t i=0; i<4; i++) {1044if (!valid[i]) continue;1045RayHit ray1; ray4->get(i,ray1);1046scene->intersectors.occluded((RTCRay&)ray1,&context);1047ray4->geomID[i] = ray1.geomID;1048}1049}10501051RTC_CATCH_END2(scene);1052}10531054template<typename RTCRay, int N>1055__forceinline void rtcForwardOccludedN (const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)1056{1057Scene* scene = (Scene*) hscene;1058RTCRay* oray = (RTCRay*)args->ray;1059RTCRayQueryContext* user_context = args->context;10601061__aligned(16) float ray_org_x[N];1062__aligned(16) float ray_org_y[N];1063__aligned(16) float ray_org_z[N];1064__aligned(16) float ray_dir_x[N];1065__aligned(16) float ray_dir_y[N];1066__aligned(16) float ray_dir_z[N];10671068copy<N>(ray_org_x,oray->org_x);1069copy<N>(ray_org_y,oray->org_y);1070copy<N>(ray_org_z,oray->org_z);1071copy<N>(ray_dir_x,oray->dir_x);1072copy<N>(ray_dir_y,oray->dir_y);1073copy<N>(ray_dir_z,oray->dir_z);10741075copy<N>(oray->org_x,iray->org_x);1076copy<N>(oray->org_y,iray->org_y);1077copy<N>(oray->org_z,iray->org_z);1078copy<N>(oray->dir_x,iray->dir_x);1079copy<N>(oray->dir_y,iray->dir_y);1080copy<N>(oray->dir_z,iray->dir_z);10811082STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);1083STAT3(normal.travs,cnt,cnt,cnt);10841085RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;1086RayQueryContext context(scene,user_context,iargs);10871088instance_id_stack::push(user_context, instID, instPrimID);1089scene->intersectors.occluded(valid,*oray,&context);1090instance_id_stack::pop(user_context);10911092copy<N>(oray->org_x,ray_org_x);1093copy<N>(oray->org_y,ray_org_y);1094copy<N>(oray->org_z,ray_org_z);1095copy<N>(oray->dir_x,ray_dir_x);1096copy<N>(oray->dir_y,ray_dir_y);1097copy<N>(oray->dir_z,ray_dir_z);1098}10991100RTC_API void rtcForwardOccluded4(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)1101{1102RTC_TRACE(rtcForwardOccluded4);1103return rtcForwardOccluded4Ex(valid, args, hscene, iray, instID, 0);1104}11051106RTC_API void rtcForwardOccluded4Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)1107{1108Scene* scene = (Scene*) hscene;1109RTC_CATCH_BEGIN;1110RTC_TRACE(rtcForwardOccluded4);1111rtcForwardOccludedN<RTCRay4,4>(valid,args,hscene,iray,instID,instPrimID);1112RTC_CATCH_END2(scene);1113}11141115RTC_API void rtcOccluded8 (const int* valid, RTCScene hscene, RTCRay8* ray, RTCOccludedArguments* args)1116{1117Scene* scene = (Scene*) hscene;1118RTC_CATCH_BEGIN;1119RTC_TRACE(rtcOccluded8);11201121#if defined(DEBUG)1122RTC_VERIFY_HANDLE(hscene);1123if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");1124if (((size_t)valid) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 32 bytes");1125if (((size_t)ray) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 32 bytes");1126#endif1127STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);1128STAT3(shadow.travs,cnt,cnt,cnt);11291130RTCOccludedArguments defaultArgs;1131if (unlikely(args == nullptr)) {1132rtcInitOccludedArguments(&defaultArgs);1133args = &defaultArgs;1134}1135RTCRayQueryContext* user_context = args->context;11361137RTCRayQueryContext defaultContext;1138if (unlikely(user_context == nullptr)) {1139rtcInitRayQueryContext(&defaultContext);1140user_context = &defaultContext;1141}1142RayQueryContext context(scene,user_context,args);11431144if (likely(scene->intersectors.intersector8))1145scene->intersectors.occluded8(valid,*ray,&context);11461147else {1148RayHit8* ray8 = (RayHit8*) ray;1149for (size_t i=0; i<8; i++) {1150if (!valid[i]) continue;1151RayHit ray1; ray8->get(i,ray1);1152scene->intersectors.occluded((RTCRay&)ray1,&context);1153ray8->set(i,ray1);1154}1155}11561157RTC_CATCH_END2(scene);1158}11591160RTC_API void rtcForwardOccluded8(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)1161{1162RTC_TRACE(rtcForwardOccluded8);1163return rtcForwardOccluded8Ex(valid, args, hscene, iray, instID, 0);1164}11651166RTC_API void rtcForwardOccluded8Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)1167{1168Scene* scene = (Scene*) hscene;1169RTC_CATCH_BEGIN;1170RTC_TRACE(rtcForwardOccluded8Ex);1171rtcForwardOccludedN<RTCRay8,8>(valid, args, hscene, iray, instID, instPrimID);1172RTC_CATCH_END2(scene);1173}11741175RTC_API void rtcOccluded16 (const int* valid, RTCScene hscene, RTCRay16* ray, RTCOccludedArguments* args)1176{1177Scene* scene = (Scene*) hscene;1178RTC_CATCH_BEGIN;1179RTC_TRACE(rtcOccluded16);11801181#if defined(DEBUG)1182RTC_VERIFY_HANDLE(hscene);1183if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");1184if (((size_t)valid) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 64 bytes");1185if (((size_t)ray) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 64 bytes");1186#endif1187STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);1188STAT3(shadow.travs,cnt,cnt,cnt);11891190RTCOccludedArguments defaultArgs;1191if (unlikely(args == nullptr)) {1192rtcInitOccludedArguments(&defaultArgs);1193args = &defaultArgs;1194}1195RTCRayQueryContext* user_context = args->context;11961197RTCRayQueryContext defaultContext;1198if (unlikely(user_context == nullptr)) {1199rtcInitRayQueryContext(&defaultContext);1200user_context = &defaultContext;1201}1202RayQueryContext context(scene,user_context,args);12031204if (likely(scene->intersectors.intersector16))1205scene->intersectors.occluded16(valid,*ray,&context);12061207else {1208RayHit16* ray16 = (RayHit16*) ray;1209for (size_t i=0; i<16; i++) {1210if (!valid[i]) continue;1211RayHit ray1; ray16->get(i,ray1);1212scene->intersectors.occluded((RTCRay&)ray1,&context);1213ray16->set(i,ray1);1214}1215}12161217RTC_CATCH_END2(scene);1218}12191220RTC_API void rtcForwardOccluded16(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)1221{1222RTC_TRACE(rtcForwardOccluded16);1223return rtcForwardOccluded16Ex(valid, args, hscene, iray, instID, 0);1224}12251226RTC_API void rtcForwardOccluded16Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)1227{1228Scene* scene = (Scene*) hscene;1229RTC_CATCH_BEGIN;1230RTC_TRACE(rtcForwardOccluded16Ex);1231rtcForwardOccludedN<RTCRay16,16>(valid, args, hscene, iray, instID, instPrimID);1232RTC_CATCH_END2(scene);1233}12341235RTC_API bool rtcTraversablePointQuery(RTCTraversable htraversable, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)1236{1237return rtcPointQuery((RTCScene)htraversable, query, userContext, queryFunc, userPtr);1238}12391240RTC_API bool rtcTraversablePointQuery4 (const int* valid, RTCTraversable htraversable, RTCPointQuery4* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)1241{1242return rtcPointQuery4(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);1243}12441245RTC_API bool rtcTraversablePointQuery8 (const int* valid, RTCTraversable htraversable, RTCPointQuery8* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)1246{1247return rtcPointQuery8(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);1248}12491250RTC_API bool rtcTraversablePointQuery16 (const int* valid, RTCTraversable htraversable, RTCPointQuery16* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)1251{1252return rtcPointQuery16(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);1253}12541255RTC_API void rtcTraversableIntersect1 (RTCTraversable htraversable, RTCRayHit* rayhit, RTCIntersectArguments* args)1256{1257rtcIntersect1((RTCScene)htraversable, rayhit, args);1258}12591260RTC_API void rtcTraversableForwardIntersect1 (const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID)1261{1262rtcForwardIntersect1(args, (RTCScene)htraversable, iray_, instID);1263}12641265RTC_API void rtcTraversableForwardIntersect1Ex(const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)1266{1267rtcForwardIntersect1Ex(args, (RTCScene)htraversable, iray_, instID, instPrimID);1268}12691270RTC_API void rtcTraversableIntersect4 (const int* valid, RTCTraversable htraversable, RTCRayHit4* rayhit, RTCIntersectArguments* args)1271{1272rtcIntersect4(valid, (RTCScene)htraversable, rayhit, args);1273}12741275template<typename RTCRay, typename RTCRayHit, int N>1276__forceinline void rtcTraversableForwardIntersectN(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray, unsigned int instID, unsigned int instPrimID)1277{1278rtcForwardIntersetN(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1279}12801281RTC_API void rtcTraversableForwardIntersect4(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID)1282{1283rtcForwardIntersect4(valid, args, (RTCScene)htraversable, iray, instID);1284}12851286RTC_API void rtcTraversableForwardIntersect4Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)1287{1288rtcForwardIntersect4Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1289}12901291RTC_API void rtcTraversableIntersect8 (const int* valid, RTCTraversable htraversable, RTCRayHit8* rayhit, RTCIntersectArguments* args)1292{1293rtcIntersect8(valid, (RTCScene)htraversable, rayhit, args);1294}12951296RTC_API void rtcTraversableForwardIntersect8(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID)1297{1298rtcForwardIntersect8(valid, args, (RTCScene)htraversable, iray, instID);1299}13001301RTC_API void rtcTraversableForwardIntersect8Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)1302{1303rtcForwardIntersect8Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1304}13051306RTC_API void rtcTraversableIntersect16 (const int* valid, RTCTraversable htraversable, RTCRayHit16* rayhit, RTCIntersectArguments* args)1307{1308rtcIntersect16(valid, (RTCScene)htraversable, rayhit, args);1309}13101311RTC_API void rtcTraversableForwardIntersect16(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID)1312{1313rtcForwardIntersect16(valid, args, (RTCScene)htraversable, iray, instID);1314}13151316RTC_API void rtcTraversableForwardIntersect16Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)1317{1318rtcForwardIntersect16Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1319}13201321RTC_API void rtcTraversableOccluded1 (RTCTraversable htraversable, RTCRay* ray, RTCOccludedArguments* args)1322{1323rtcOccluded1((RTCScene)htraversable, ray, args);1324}13251326RTC_API void rtcTraversableForwardOccluded1 (const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID)1327{1328rtcForwardOccluded1(args, (RTCScene)htraversable, iray_, instID);1329}13301331RTC_API void rtcTraversableForwardOccluded1Ex(const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)1332{1333rtcForwardOccluded1Ex(args, (RTCScene)htraversable, iray_, instID, instPrimID);1334}13351336RTC_API void rtcTraversableOccluded4 (const int* valid, RTCTraversable htraversable, RTCRay4* ray, RTCOccludedArguments* args)1337{1338rtcOccluded4(valid, (RTCScene)htraversable, ray, args);1339}13401341template<typename RTCRay, int N>1342__forceinline void rtcTraversableForwardOccludedN (const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray, unsigned int instID, unsigned int instPrimID)1343{1344rtcForwardOccludedN(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1345}13461347RTC_API void rtcTraversableForwardOccluded4(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID)1348{1349rtcForwardOccluded4(valid, args, (RTCScene)htraversable, iray, instID);1350}13511352RTC_API void rtcTraversableForwardOccluded4Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)1353{1354rtcForwardOccluded4Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1355}13561357RTC_API void rtcTraversableOccluded8 (const int* valid, RTCTraversable htraversable, RTCRay8* ray, RTCOccludedArguments* args)1358{1359rtcOccluded8(valid, (RTCScene)htraversable, ray, args);1360}13611362RTC_API void rtcTraversableForwardOccluded8(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID)1363{1364rtcForwardOccluded8(valid, args, (RTCScene)htraversable, iray, instID);1365}13661367RTC_API void rtcTraversableForwardOccluded8Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)1368{1369rtcForwardOccluded8Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1370}13711372RTC_API void rtcTraversableOccluded16 (const int* valid, RTCTraversable htraversable, RTCRay16* ray, RTCOccludedArguments* args)1373{1374rtcOccluded16(valid, (RTCScene)htraversable, ray, args);1375}13761377RTC_API void rtcTraversableForwardOccluded16(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID)1378{1379rtcForwardOccluded16(valid, args, (RTCScene)htraversable, iray, instID);1380}13811382RTC_API void rtcTraversableForwardOccluded16Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)1383{1384rtcForwardOccluded16Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);1385}13861387RTC_API void rtcRetainScene (RTCScene hscene)1388{1389Scene* scene = (Scene*) hscene;1390RTC_CATCH_BEGIN;1391RTC_TRACE(rtcRetainScene);1392RTC_VERIFY_HANDLE(hscene);1393RTC_ENTER_DEVICE(hscene);1394scene->refInc();1395RTC_CATCH_END2(scene);1396}13971398RTC_API void rtcReleaseScene (RTCScene hscene)1399{1400Scene* scene = (Scene*) hscene;1401RTC_CATCH_BEGIN;1402RTC_TRACE(rtcReleaseScene);1403RTC_VERIFY_HANDLE(hscene);1404RTC_ENTER_DEVICE(hscene);1405scene->refDec();1406RTC_CATCH_END2(scene);1407}14081409RTC_API void rtcSetGeometryInstancedScene(RTCGeometry hgeometry, RTCScene hscene)1410{1411Geometry* geometry = (Geometry*) hgeometry;1412Ref<Scene> scene = (Scene*) hscene;1413RTC_CATCH_BEGIN;1414RTC_TRACE(rtcSetGeometryInstancedScene);1415RTC_VERIFY_HANDLE(hgeometry);1416RTC_VERIFY_HANDLE(hscene);1417RTC_ENTER_DEVICE(hgeometry);1418geometry->setInstancedScene(scene);1419RTC_CATCH_END2(geometry);1420}14211422RTC_API void rtcSetGeometryInstancedScenes(RTCGeometry hgeometry, RTCScene* scenes, size_t numScenes)1423{1424Geometry* geometry = (Geometry*) hgeometry;1425RTC_CATCH_BEGIN;1426RTC_TRACE(rtcSetGeometryInstancedScene);1427RTC_VERIFY_HANDLE(hgeometry);1428RTC_VERIFY_HANDLE(scenes);1429RTC_ENTER_DEVICE(hgeometry);1430geometry->setInstancedScenes(scenes, numScenes);1431RTC_CATCH_END2(geometry);1432}14331434AffineSpace3fa loadTransform(RTCFormat format, const float* xfm)1435{1436AffineSpace3fa space = one;1437switch (format)1438{1439case RTC_FORMAT_FLOAT3X4_ROW_MAJOR:1440space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 4], xfm[ 8]),1441Vec3fa(xfm[ 1], xfm[ 5], xfm[ 9]),1442Vec3fa(xfm[ 2], xfm[ 6], xfm[10]),1443Vec3fa(xfm[ 3], xfm[ 7], xfm[11]));1444break;14451446case RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR:1447space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 1], xfm[ 2]),1448Vec3fa(xfm[ 3], xfm[ 4], xfm[ 5]),1449Vec3fa(xfm[ 6], xfm[ 7], xfm[ 8]),1450Vec3fa(xfm[ 9], xfm[10], xfm[11]));1451break;14521453case RTC_FORMAT_FLOAT4X4_COLUMN_MAJOR:1454space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 1], xfm[ 2]),1455Vec3fa(xfm[ 4], xfm[ 5], xfm[ 6]),1456Vec3fa(xfm[ 8], xfm[ 9], xfm[10]),1457Vec3fa(xfm[12], xfm[13], xfm[14]));1458break;14591460default:1461throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid matrix format");1462break;1463}1464return space;1465}14661467RTC_API void rtcSetGeometryTransform(RTCGeometry hgeometry, unsigned int timeStep, RTCFormat format, const void* xfm)1468{1469Geometry* geometry = (Geometry*) hgeometry;1470RTC_CATCH_BEGIN;1471RTC_TRACE(rtcSetGeometryTransform);1472RTC_VERIFY_HANDLE(hgeometry);1473RTC_VERIFY_HANDLE(xfm);1474RTC_ENTER_DEVICE(hgeometry);1475const AffineSpace3fa transform = loadTransform(format, (const float*)xfm);1476geometry->setTransform(transform, timeStep);1477RTC_CATCH_END2(geometry);1478}14791480RTC_API void rtcSetGeometryTransformQuaternion(RTCGeometry hgeometry, unsigned int timeStep, const RTCQuaternionDecomposition* qd)1481{1482Geometry* geometry = (Geometry*) hgeometry;1483RTC_CATCH_BEGIN;1484RTC_TRACE(rtcSetGeometryTransformQuaternion);1485RTC_VERIFY_HANDLE(hgeometry);1486RTC_VERIFY_HANDLE(qd);1487RTC_ENTER_DEVICE(hgeometry);14881489AffineSpace3fx transform;1490transform.l.vx.x = qd->scale_x;1491transform.l.vy.y = qd->scale_y;1492transform.l.vz.z = qd->scale_z;1493transform.l.vy.x = qd->skew_xy;1494transform.l.vz.x = qd->skew_xz;1495transform.l.vz.y = qd->skew_yz;1496transform.l.vx.y = qd->translation_x;1497transform.l.vx.z = qd->translation_y;1498transform.l.vy.z = qd->translation_z;1499transform.p.x = qd->shift_x;1500transform.p.y = qd->shift_y;1501transform.p.z = qd->shift_z;15021503// normalize quaternion1504Quaternion3f q(qd->quaternion_r, qd->quaternion_i, qd->quaternion_j, qd->quaternion_k);1505q = normalize(q);1506transform.l.vx.w = q.i;1507transform.l.vy.w = q.j;1508transform.l.vz.w = q.k;1509transform.p.w = q.r;15101511geometry->setQuaternionDecomposition(transform, timeStep);1512RTC_CATCH_END2(geometry);1513}15141515RTC_API void rtcGetGeometryTransform(RTCGeometry hgeometry, float time, RTCFormat format, void* xfm)1516{1517Geometry* geometry = (Geometry*) hgeometry;1518RTC_CATCH_BEGIN;1519RTC_TRACE(rtcGetGeometryTransform);1520//RTC_ENTER_DEVICE(hgeometry); // no allocation required1521const AffineSpace3fa transform = geometry->getTransform(time);1522storeTransform(transform, format, (float*)xfm);1523RTC_CATCH_END2(geometry);1524}15251526RTC_API void rtcGetGeometryTransformEx(RTCGeometry hgeometry, unsigned int instPrimID, float time, RTCFormat format, void* xfm)1527{1528Geometry* geometry = (Geometry*) hgeometry;1529RTC_CATCH_BEGIN;1530RTC_TRACE(rtcGetGeometryTransformEx);1531//RTC_ENTER_DEVICE(hgeometry); // no allocation required1532const AffineSpace3fa transform = geometry->getTransform(instPrimID, time);1533storeTransform(transform, format, (float*)xfm);1534RTC_CATCH_END2(geometry);1535}15361537RTC_API void rtcGetGeometryTransformFromScene(RTCScene hscene, unsigned int geomID, float time, RTCFormat format, void* xfm)1538{1539Scene* scene = (Scene*) hscene;1540RTC_CATCH_BEGIN;1541RTC_TRACE(rtcGetGeometryTransformFromScene);1542//RTC_ENTER_DEVICE(hscene); // no allocation required1543const AffineSpace3fa transform = scene->get(geomID)->getTransform(time);1544storeTransform(transform, format, (float*)xfm);1545RTC_CATCH_END2(scene);1546}15471548RTC_API void rtcGetGeometryTransformFromTraversable(RTCTraversable htraversable, unsigned int geomID, float time, RTCFormat format, void* xfm)1549{1550rtcGetGeometryTransformFromScene((RTCScene)htraversable, geomID, time, format, xfm);1551}15521553RTC_API void rtcInvokeIntersectFilterFromGeometry(const struct RTCIntersectFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)1554{1555IntersectFunctionNArguments* args = (IntersectFunctionNArguments*) args_i;1556if (args->geometry->intersectionFilterN)1557args->geometry->intersectionFilterN(filter_args);1558}15591560RTC_API void rtcInvokeOccludedFilterFromGeometry(const struct RTCOccludedFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)1561{1562OccludedFunctionNArguments* args = (OccludedFunctionNArguments*) args_i;1563if (args->geometry->occlusionFilterN)1564args->geometry->occlusionFilterN(filter_args);1565}15661567RTC_API RTCGeometry rtcNewGeometry (RTCDevice hdevice, RTCGeometryType type)1568{1569Device* device = (Device*) hdevice;1570RTC_CATCH_BEGIN;1571RTC_TRACE(rtcNewGeometry);1572RTC_ENTER_DEVICE(hdevice);1573RTC_VERIFY_HANDLE(hdevice);15741575switch (type)1576{1577case RTC_GEOMETRY_TYPE_TRIANGLE:1578{1579#if defined(EMBREE_GEOMETRY_TRIANGLE)1580createTriangleMeshTy createTriangleMesh = nullptr;1581SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createTriangleMesh);1582Geometry* geom = createTriangleMesh(device);1583return (RTCGeometry) geom->refInc();1584#else1585throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_TRIANGLE is not supported");1586#endif1587}15881589case RTC_GEOMETRY_TYPE_QUAD:1590{1591#if defined(EMBREE_GEOMETRY_QUAD)1592createQuadMeshTy createQuadMesh = nullptr;1593SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createQuadMesh);1594Geometry* geom = createQuadMesh(device);1595return (RTCGeometry) geom->refInc();1596#else1597throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_QUAD is not supported");1598#endif1599}16001601case RTC_GEOMETRY_TYPE_SPHERE_POINT:1602case RTC_GEOMETRY_TYPE_DISC_POINT:1603case RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT:1604{1605#if defined(EMBREE_GEOMETRY_POINT)1606createPointsTy createPoints = nullptr;1607SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_builder_cpu_features, createPoints);16081609Geometry *geom;1610switch(type) {1611case RTC_GEOMETRY_TYPE_SPHERE_POINT:1612geom = createPoints(device, Geometry::GTY_SPHERE_POINT);1613break;1614case RTC_GEOMETRY_TYPE_DISC_POINT:1615geom = createPoints(device, Geometry::GTY_DISC_POINT);1616break;1617case RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT:1618geom = createPoints(device, Geometry::GTY_ORIENTED_DISC_POINT);1619break;1620default:1621geom = nullptr;1622break;1623}1624return (RTCGeometry) geom->refInc();1625#else1626throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_POINT is not supported");1627#endif1628}16291630case RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE:1631case RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE:1632case RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE:16331634case RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE:1635case RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE:1636case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE:16371638case RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE:1639case RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE:1640case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE:16411642case RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE:1643case RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE:1644case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE:16451646case RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE:1647case RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE:1648case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE:1649{1650#if defined(EMBREE_GEOMETRY_CURVE)1651createLineSegmentsTy createLineSegments = nullptr;1652SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createLineSegments);1653createCurvesTy createCurves = nullptr;1654SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createCurves);16551656Geometry* geom;1657switch (type) {1658case RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_CONE_LINEAR_CURVE); break;1659case RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_ROUND_LINEAR_CURVE); break;1660case RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_FLAT_LINEAR_CURVE); break;1661//case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_ORIENTED_LINEAR_CURVE); break;16621663case RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_BEZIER_CURVE); break;1664case RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_BEZIER_CURVE); break;1665case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_BEZIER_CURVE); break;16661667case RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_BSPLINE_CURVE); break;1668case RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_BSPLINE_CURVE); break;1669case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_BSPLINE_CURVE); break;16701671case RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_HERMITE_CURVE); break;1672case RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_HERMITE_CURVE); break;1673case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_HERMITE_CURVE); break;16741675case RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_CATMULL_ROM_CURVE); break;1676case RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_CATMULL_ROM_CURVE); break;1677case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_CATMULL_ROM_CURVE); break;1678default: geom = nullptr; break;1679}1680return (RTCGeometry) geom->refInc();1681#else1682throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_CURVE is not supported");1683#endif1684}16851686case RTC_GEOMETRY_TYPE_SUBDIVISION:1687{1688#if defined(EMBREE_GEOMETRY_SUBDIVISION)1689createSubdivMeshTy createSubdivMesh = nullptr;1690SELECT_SYMBOL_DEFAULT_AVX(device->enabled_cpu_features,createSubdivMesh);1691//SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createSubdivMesh); // FIXME: this does not work for some reason?1692Geometry* geom = createSubdivMesh(device);1693return (RTCGeometry) geom->refInc();1694#else1695throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_SUBDIVISION is not supported");1696#endif1697}16981699case RTC_GEOMETRY_TYPE_USER:1700{1701#if defined(EMBREE_GEOMETRY_USER)1702createUserGeometryTy createUserGeometry = nullptr;1703SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createUserGeometry);1704Geometry* geom = createUserGeometry(device);1705return (RTCGeometry) geom->refInc();1706#else1707throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_USER is not supported");1708#endif1709}17101711case RTC_GEOMETRY_TYPE_INSTANCE:1712{1713#if defined(EMBREE_GEOMETRY_INSTANCE)1714createInstanceTy createInstance = nullptr;1715SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createInstance);1716Geometry* geom = createInstance(device);1717return (RTCGeometry) geom->refInc();1718#else1719throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_INSTANCE is not supported");1720#endif1721}17221723case RTC_GEOMETRY_TYPE_INSTANCE_ARRAY:1724{1725#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)1726createInstanceArrayTy createInstanceArray = nullptr;1727SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createInstanceArray);1728Geometry* geom = createInstanceArray(device);1729return (RTCGeometry) geom->refInc();1730#else1731throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_INSTANCE_ARRAY is not supported");1732#endif1733}17341735case RTC_GEOMETRY_TYPE_GRID:1736{1737#if defined(EMBREE_GEOMETRY_GRID)1738createGridMeshTy createGridMesh = nullptr;1739SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createGridMesh);1740Geometry* geom = createGridMesh(device);1741return (RTCGeometry) geom->refInc();1742#else1743throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_GRID is not supported");1744#endif1745}17461747default:1748throw_RTCError(RTC_ERROR_UNKNOWN,"invalid geometry type");1749}17501751RTC_CATCH_END(device);1752return nullptr;1753}17541755RTC_API void rtcSetGeometryUserPrimitiveCount(RTCGeometry hgeometry, unsigned int userPrimitiveCount)1756{1757Geometry* geometry = (Geometry*) hgeometry;1758RTC_CATCH_BEGIN;1759RTC_TRACE(rtcSetGeometryUserPrimitiveCount);1760RTC_VERIFY_HANDLE(hgeometry);1761RTC_ENTER_DEVICE(hgeometry);17621763if (unlikely(geometry->getType() != Geometry::GTY_USER_GEOMETRY))1764throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation only allowed for user geometries");17651766geometry->setNumPrimitives(userPrimitiveCount);1767RTC_CATCH_END2(geometry);1768}17691770RTC_API void rtcSetGeometryTimeStepCount(RTCGeometry hgeometry, unsigned int timeStepCount)1771{1772Geometry* geometry = (Geometry*) hgeometry;1773RTC_CATCH_BEGIN;1774RTC_TRACE(rtcSetGeometryTimeStepCount);1775RTC_VERIFY_HANDLE(hgeometry);1776RTC_ENTER_DEVICE(hgeometry);17771778if (timeStepCount > RTC_MAX_TIME_STEP_COUNT)1779throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"number of time steps is out of range");17801781geometry->setNumTimeSteps(timeStepCount);1782RTC_CATCH_END2(geometry);1783}17841785RTC_API void rtcSetGeometryTimeRange(RTCGeometry hgeometry, float startTime, float endTime)1786{1787Ref<Geometry> geometry = (Geometry*) hgeometry;1788RTC_CATCH_BEGIN;1789RTC_TRACE(rtcSetGeometryTimeRange);1790RTC_VERIFY_HANDLE(hgeometry);1791RTC_ENTER_DEVICE(hgeometry);17921793if (startTime > endTime)1794throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"startTime has to be smaller or equal to the endTime");17951796geometry->setTimeRange(BBox1f(startTime,endTime));1797RTC_CATCH_END2(geometry);1798}17991800RTC_API void rtcSetGeometryVertexAttributeCount(RTCGeometry hgeometry, unsigned int N)1801{1802Geometry* geometry = (Geometry*) hgeometry;1803RTC_CATCH_BEGIN;1804RTC_TRACE(rtcSetGeometryVertexAttributeCount);1805RTC_VERIFY_HANDLE(hgeometry);1806RTC_ENTER_DEVICE(hgeometry);1807geometry->setVertexAttributeCount(N);1808RTC_CATCH_END2(geometry);1809}18101811RTC_API void rtcSetGeometryTopologyCount(RTCGeometry hgeometry, unsigned int N)1812{1813Geometry* geometry = (Geometry*) hgeometry;1814RTC_CATCH_BEGIN;1815RTC_TRACE(rtcSetGeometryTopologyCount);1816RTC_VERIFY_HANDLE(hgeometry);1817RTC_ENTER_DEVICE(hgeometry);1818geometry->setTopologyCount(N);1819RTC_CATCH_END2(geometry);1820}18211822RTC_API void rtcSetGeometryBuildQuality (RTCGeometry hgeometry, RTCBuildQuality quality)1823{1824Geometry* geometry = (Geometry*) hgeometry;1825RTC_CATCH_BEGIN;1826RTC_TRACE(rtcSetGeometryBuildQuality);1827RTC_VERIFY_HANDLE(hgeometry);1828RTC_ENTER_DEVICE(hgeometry);1829if (quality != RTC_BUILD_QUALITY_LOW &&1830quality != RTC_BUILD_QUALITY_MEDIUM &&1831quality != RTC_BUILD_QUALITY_HIGH &&1832quality != RTC_BUILD_QUALITY_REFIT)1833abort(); //throw std::runtime_error("invalid build quality");1834geometry->setBuildQuality(quality);1835RTC_CATCH_END2(geometry);1836}18371838RTC_API void rtcSetGeometryMaxRadiusScale(RTCGeometry hgeometry, float maxRadiusScale)1839{1840Geometry* geometry = (Geometry*) hgeometry;1841RTC_CATCH_BEGIN;1842RTC_TRACE(rtcSetGeometryMaxRadiusScale);1843RTC_VERIFY_HANDLE(hgeometry);1844#if RTC_MIN_WIDTH1845if (maxRadiusScale < 1.0f) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"maximal radius scale has to be larger or equal to 1");1846geometry->setMaxRadiusScale(maxRadiusScale);1847#else1848throw_RTCError(RTC_ERROR_INVALID_OPERATION,"min-width feature is not enabled");1849#endif1850RTC_CATCH_END2(geometry);1851}18521853RTC_API void rtcSetGeometryMask (RTCGeometry hgeometry, unsigned int mask)1854{1855Geometry* geometry = (Geometry*) hgeometry;1856RTC_CATCH_BEGIN;1857RTC_TRACE(rtcSetGeometryMask);1858RTC_VERIFY_HANDLE(hgeometry);1859RTC_ENTER_DEVICE(hgeometry);1860geometry->setMask(mask);1861RTC_CATCH_END2(geometry);1862}18631864RTC_API void rtcSetGeometrySubdivisionMode (RTCGeometry hgeometry, unsigned topologyID, RTCSubdivisionMode mode)1865{1866Geometry* geometry = (Geometry*) hgeometry;1867RTC_CATCH_BEGIN;1868RTC_TRACE(rtcSetGeometrySubdivisionMode);1869RTC_VERIFY_HANDLE(hgeometry);1870RTC_ENTER_DEVICE(hgeometry);1871geometry->setSubdivisionMode(topologyID,mode);1872RTC_CATCH_END2(geometry);1873}18741875RTC_API void rtcSetGeometryVertexAttributeTopology(RTCGeometry hgeometry, unsigned int vertexAttributeID, unsigned int topologyID)1876{1877Geometry* geometry = (Geometry*) hgeometry;1878RTC_CATCH_BEGIN;1879RTC_TRACE(rtcSetGeometryVertexAttributeTopology);1880RTC_VERIFY_HANDLE(hgeometry);1881RTC_ENTER_DEVICE(hgeometry);1882geometry->setVertexAttributeTopology(vertexAttributeID, topologyID);1883RTC_CATCH_END2(geometry);1884}18851886RTC_API void rtcSetGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, RTCBuffer hbuffer, size_t byteOffset, size_t byteStride, size_t itemCount)1887{1888Geometry* geometry = (Geometry*) hgeometry;1889Ref<Buffer> buffer = (Buffer*)hbuffer;1890RTC_CATCH_BEGIN;1891RTC_TRACE(rtcSetGeometryBuffer);1892RTC_VERIFY_HANDLE(hgeometry);1893RTC_VERIFY_HANDLE(hbuffer);1894RTC_ENTER_DEVICE(hgeometry);18951896if (geometry->device != buffer->device)1897throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");18981899if (itemCount > 0xFFFFFFFFu)1900throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");19011902geometry->setBuffer(type, slot, format, buffer, byteOffset, byteStride, (unsigned int)itemCount);1903RTC_CATCH_END2(geometry);1904}19051906RTC_API void rtcSetSharedGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, const void* ptr, size_t byteOffset, size_t byteStride, size_t itemCount)1907{1908Geometry* geometry = (Geometry*) hgeometry;1909RTC_CATCH_BEGIN;1910RTC_TRACE(rtcSetSharedGeometryBuffer);1911RTC_VERIFY_HANDLE(hgeometry);1912RTC_ENTER_DEVICE(hgeometry);19131914if (itemCount > 0xFFFFFFFFu)1915throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");19161917Ref<Buffer> buffer = new Buffer(geometry->device, itemCount*byteStride, (char*)ptr + byteOffset);1918geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);1919RTC_CATCH_END2(geometry);1920}19211922RTC_API void rtcSetSharedGeometryBufferHostDevice(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, const void* ptr, const void* dptr, size_t byteOffset, size_t byteStride, size_t itemCount)1923{1924Geometry* geometry = (Geometry*) hgeometry;1925RTC_CATCH_BEGIN;1926RTC_TRACE(rtcSetSharedGeometryBufferHostDevice);1927RTC_VERIFY_HANDLE(hgeometry);1928RTC_ENTER_DEVICE(hgeometry);19291930#if defined(EMBREE_SYCL_SUPPORT)1931if (geometry->device->is_gpu())1932{1933if (itemCount > 0xFFFFFFFFu)1934throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");19351936if ((ptr == nullptr) || (dptr == nullptr))1937throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"host and device pointer may not be NULL pointers when using SYCL devices");19381939Ref<Buffer> buffer = new Buffer(geometry->device, itemCount*byteStride, (char*)ptr + byteOffset, (char*)dptr + byteOffset);1940geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);1941}1942else1943#endif1944{1945if (dptr != nullptr)1946throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"Embree device is no SYCL device. Device pointer argument must not be valid, pass NULL instead");1947rtcSetSharedGeometryBuffer(hgeometry, type, slot, format, ptr, byteOffset, byteStride, itemCount);1948}19491950RTC_CATCH_END2(geometry);1951}19521953RTC_API void* rtcSetNewGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount)1954{1955Geometry* geometry = (Geometry*) hgeometry;1956RTC_CATCH_BEGIN;1957RTC_TRACE(rtcSetNewGeometryBuffer);1958RTC_VERIFY_HANDLE(hgeometry);1959RTC_ENTER_DEVICE(hgeometry);19601961if (itemCount > 0xFFFFFFFFu)1962throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");19631964/* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */1965size_t bytes = itemCount*byteStride;1966if (type == RTC_BUFFER_TYPE_VERTEX || type == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE)1967bytes += (16 - (byteStride%16))%16;19681969Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr);1970geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);1971return buffer->data();1972RTC_CATCH_END2(geometry);1973return nullptr;1974}19751976RTC_API void rtcSetNewGeometryBufferHostDevice(RTCGeometry hgeometry, RTCBufferType bufferType, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount, void** ptr, void** dptr)1977{1978Geometry* geometry = (Geometry*) hgeometry;1979RTC_CATCH_BEGIN;1980RTC_TRACE(rtcSetNewGeometryBufferHostDevice);1981RTC_VERIFY_HANDLE(hgeometry);1982RTC_ENTER_DEVICE(hgeometry);19831984#if defined(EMBREE_SYCL_SUPPORT)1985if (geometry->device->is_gpu())1986{1987if (itemCount > 0xFFFFFFFFu)1988throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");19891990/* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */1991size_t bytes = itemCount*byteStride;1992if (bufferType == RTC_BUFFER_TYPE_VERTEX || bufferType == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE)1993bytes += (16 - (byteStride%16))%16;19941995Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr, nullptr);1996geometry->setBuffer(bufferType, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);19971998if(ptr)1999*ptr = buffer->getHostPtr();2000if (dptr)2001*dptr = buffer->getDevicePtr();2002}2003else2004#endif2005{2006void* tmp = rtcSetNewGeometryBuffer(hgeometry, bufferType, slot, format, byteStride, itemCount);2007if(ptr)2008*ptr = tmp;2009if (dptr) {2010*dptr = tmp;2011}2012}20132014RTC_CATCH_END2(geometry);2015}20162017RTC_API void* rtcGetGeometryBufferData(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)2018{2019Geometry* geometry = (Geometry*) hgeometry;2020RTC_CATCH_BEGIN;2021RTC_TRACE(rtcGetGeometryBufferData);2022RTC_VERIFY_HANDLE(hgeometry);2023RTC_ENTER_DEVICE(hgeometry);2024return geometry->getBufferData(type, slot, BufferDataPointerType::HOST);2025RTC_CATCH_END2(geometry);2026return nullptr;2027}20282029RTC_API void* rtcGetGeometryBufferDataDevice(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)2030{2031Geometry* geometry = (Geometry*) hgeometry;2032RTC_CATCH_BEGIN;2033RTC_TRACE(rtcGetGeometryBufferDataDevice);2034RTC_VERIFY_HANDLE(hgeometry);2035RTC_ENTER_DEVICE(hgeometry);2036return geometry->getBufferData(type, slot, BufferDataPointerType::DEVICE);2037RTC_CATCH_END2(geometry);2038return nullptr;2039}20402041RTC_API void rtcEnableGeometry (RTCGeometry hgeometry)2042{2043Geometry* geometry = (Geometry*) hgeometry;2044RTC_CATCH_BEGIN;2045RTC_TRACE(rtcEnableGeometry);2046RTC_VERIFY_HANDLE(hgeometry);2047RTC_ENTER_DEVICE(hgeometry);2048geometry->enable();2049RTC_CATCH_END2(geometry);2050}20512052RTC_API void rtcUpdateGeometryBuffer (RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)2053{2054Geometry* geometry = (Geometry*) hgeometry;2055RTC_CATCH_BEGIN;2056RTC_TRACE(rtcUpdateGeometryBuffer);2057RTC_VERIFY_HANDLE(hgeometry);2058RTC_ENTER_DEVICE(hgeometry);2059geometry->updateBuffer(type, slot);2060RTC_CATCH_END2(geometry);2061}20622063RTC_API void rtcDisableGeometry (RTCGeometry hgeometry)2064{2065Geometry* geometry = (Geometry*) hgeometry;2066RTC_CATCH_BEGIN;2067RTC_TRACE(rtcDisableGeometry);2068RTC_VERIFY_HANDLE(hgeometry);2069RTC_ENTER_DEVICE(hgeometry);2070geometry->disable();2071RTC_CATCH_END2(geometry);2072}20732074RTC_API void rtcSetGeometryTessellationRate (RTCGeometry hgeometry, float tessellationRate)2075{2076Geometry* geometry = (Geometry*) hgeometry;2077RTC_CATCH_BEGIN;2078RTC_TRACE(rtcSetGeometryTessellationRate);2079RTC_VERIFY_HANDLE(hgeometry);2080RTC_ENTER_DEVICE(hgeometry);2081geometry->setTessellationRate(tessellationRate);2082RTC_CATCH_END2(geometry);2083}20842085RTC_API void rtcSetGeometryUserData (RTCGeometry hgeometry, void* ptr)2086{2087Geometry* geometry = (Geometry*) hgeometry;2088RTC_CATCH_BEGIN;2089RTC_TRACE(rtcSetGeometryUserData);2090RTC_VERIFY_HANDLE(hgeometry);2091RTC_ENTER_DEVICE(hgeometry);2092geometry->setUserData(ptr);2093RTC_CATCH_END2(geometry);2094}20952096RTC_API void* rtcGetGeometryUserData (RTCGeometry hgeometry)2097{2098Geometry* geometry = (Geometry*) hgeometry; // no ref counting here!2099RTC_CATCH_BEGIN;2100RTC_TRACE(rtcGetGeometryUserData);2101RTC_VERIFY_HANDLE(hgeometry);2102//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons !2103return geometry->getUserData();2104RTC_CATCH_END2(geometry);2105return nullptr;2106}21072108RTC_API void* rtcGetGeometryUserDataFromScene (RTCScene hscene, unsigned int geomID)2109{2110Scene* scene = (Scene*) hscene;2111RTC_CATCH_BEGIN;2112RTC_TRACE(rtcGetGeometryUserDataFromScene);2113#if defined(DEBUG)2114RTC_VERIFY_HANDLE(hscene);2115RTC_VERIFY_GEOMID(geomID);2116#endif2117//RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons2118return scene->get(geomID)->getUserData();2119RTC_CATCH_END2(scene);2120return nullptr;2121}21222123RTC_API void* rtcGetGeometryUserDataFromTraversable (RTCTraversable htraversable, unsigned int geomID)2124{2125return rtcGetGeometryUserDataFromScene((RTCScene)htraversable, geomID);2126}21272128RTC_API void rtcSetGeometryBoundsFunction (RTCGeometry hgeometry, RTCBoundsFunction bounds, void* userPtr)2129{2130Geometry* geometry = (Geometry*) hgeometry;2131RTC_CATCH_BEGIN;2132RTC_TRACE(rtcSetGeometryBoundsFunction);2133RTC_VERIFY_HANDLE(hgeometry);2134RTC_ENTER_DEVICE(hgeometry);2135geometry->setBoundsFunction(bounds,userPtr);2136RTC_CATCH_END2(geometry);2137}21382139RTC_API void rtcSetGeometryDisplacementFunction (RTCGeometry hgeometry, RTCDisplacementFunctionN displacement)2140{2141Geometry* geometry = (Geometry*) hgeometry;2142RTC_CATCH_BEGIN;2143RTC_TRACE(rtcSetGeometryDisplacementFunction);2144RTC_VERIFY_HANDLE(hgeometry);2145RTC_ENTER_DEVICE(hgeometry);2146geometry->setDisplacementFunction(displacement);2147RTC_CATCH_END2(geometry);2148}21492150RTC_API void rtcSetGeometryIntersectFunction (RTCGeometry hgeometry, RTCIntersectFunctionN intersect)2151{2152Geometry* geometry = (Geometry*) hgeometry;2153RTC_CATCH_BEGIN;2154RTC_TRACE(rtcSetGeometryIntersectFunction);2155RTC_VERIFY_HANDLE(hgeometry);2156RTC_ENTER_DEVICE(hgeometry);2157geometry->setIntersectFunctionN(intersect);2158RTC_CATCH_END2(geometry);2159}21602161RTC_API void rtcSetGeometryPointQueryFunction(RTCGeometry hgeometry, RTCPointQueryFunction pointQuery)2162{2163Geometry* geometry = (Geometry*) hgeometry;2164RTC_CATCH_BEGIN;2165RTC_TRACE(rtcSetGeometryPointQueryFunction);2166RTC_VERIFY_HANDLE(hgeometry);2167RTC_ENTER_DEVICE(hgeometry);2168geometry->setPointQueryFunction(pointQuery);2169RTC_CATCH_END2(geometry);2170}21712172RTC_API unsigned int rtcGetGeometryFirstHalfEdge(RTCGeometry hgeometry, unsigned int faceID)2173{2174Geometry* geometry = (Geometry*) hgeometry;2175RTC_CATCH_BEGIN;2176RTC_TRACE(rtcGetGeometryFirstHalfEdge);2177//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2178return geometry->getFirstHalfEdge(faceID);2179RTC_CATCH_END2(geometry);2180return -1;2181}21822183RTC_API unsigned int rtcGetGeometryFace(RTCGeometry hgeometry, unsigned int edgeID)2184{2185Geometry* geometry = (Geometry*) hgeometry;2186RTC_CATCH_BEGIN;2187RTC_TRACE(rtcGetGeometryFace);2188//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2189return geometry->getFace(edgeID);2190RTC_CATCH_END2(geometry);2191return -1;2192}21932194RTC_API unsigned int rtcGetGeometryNextHalfEdge(RTCGeometry hgeometry, unsigned int edgeID)2195{2196Geometry* geometry = (Geometry*) hgeometry;2197RTC_CATCH_BEGIN;2198RTC_TRACE(rtcGetGeometryNextHalfEdge);2199//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2200return geometry->getNextHalfEdge(edgeID);2201RTC_CATCH_END2(geometry);2202return -1;2203}22042205RTC_API unsigned int rtcGetGeometryPreviousHalfEdge(RTCGeometry hgeometry, unsigned int edgeID)2206{2207Geometry* geometry = (Geometry*) hgeometry;2208RTC_CATCH_BEGIN;2209RTC_TRACE(rtcGetGeometryPreviousHalfEdge);2210//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2211return geometry->getPreviousHalfEdge(edgeID);2212RTC_CATCH_END2(geometry);2213return -1;2214}22152216RTC_API unsigned int rtcGetGeometryOppositeHalfEdge(RTCGeometry hgeometry, unsigned int topologyID, unsigned int edgeID)2217{2218Geometry* geometry = (Geometry*) hgeometry;2219RTC_CATCH_BEGIN;2220RTC_TRACE(rtcGetGeometryOppositeHalfEdge);2221//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2222return geometry->getOppositeHalfEdge(topologyID,edgeID);2223RTC_CATCH_END2(geometry);2224return -1;2225}22262227RTC_API void rtcSetGeometryOccludedFunction (RTCGeometry hgeometry, RTCOccludedFunctionN occluded)2228{2229Geometry* geometry = (Geometry*) hgeometry;2230RTC_CATCH_BEGIN;2231RTC_TRACE(rtcSetOccludedFunctionN);2232RTC_VERIFY_HANDLE(hgeometry);2233RTC_ENTER_DEVICE(hgeometry);2234geometry->setOccludedFunctionN(occluded);2235RTC_CATCH_END2(geometry);2236}22372238RTC_API void rtcSetGeometryIntersectFilterFunction (RTCGeometry hgeometry, RTCFilterFunctionN filter)2239{2240Geometry* geometry = (Geometry*) hgeometry;2241RTC_CATCH_BEGIN;2242RTC_TRACE(rtcSetGeometryIntersectFilterFunction);2243RTC_VERIFY_HANDLE(hgeometry);2244RTC_ENTER_DEVICE(hgeometry);2245geometry->setIntersectionFilterFunctionN(filter);2246RTC_CATCH_END2(geometry);2247}22482249RTC_API void rtcSetGeometryOccludedFilterFunction (RTCGeometry hgeometry, RTCFilterFunctionN filter)2250{2251Geometry* geometry = (Geometry*) hgeometry;2252RTC_CATCH_BEGIN;2253RTC_TRACE(rtcSetGeometryOccludedFilterFunction);2254RTC_VERIFY_HANDLE(hgeometry);2255RTC_ENTER_DEVICE(hgeometry);2256geometry->setOcclusionFilterFunctionN(filter);2257RTC_CATCH_END2(geometry);2258}22592260RTC_API void rtcSetGeometryEnableFilterFunctionFromArguments (RTCGeometry hgeometry, bool enable)2261{2262Geometry* geometry = (Geometry*) hgeometry;2263RTC_CATCH_BEGIN;2264RTC_TRACE(rtcSetGeometryEnableFilterFunctionFromArguments);2265RTC_VERIFY_HANDLE(hgeometry);2266RTC_ENTER_DEVICE(hgeometry);2267geometry->enableFilterFunctionFromArguments(enable);2268RTC_CATCH_END2(geometry);2269}22702271RTC_API void rtcInterpolate(const RTCInterpolateArguments* const args)2272{2273Geometry* geometry = (Geometry*) args->geometry;2274RTC_CATCH_BEGIN;2275RTC_TRACE(rtcInterpolate);2276#if defined(DEBUG)2277RTC_VERIFY_HANDLE(args->geometry);2278#endif2279//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2280geometry->interpolate(args);2281RTC_CATCH_END2(geometry);2282}22832284RTC_API void rtcInterpolateN(const RTCInterpolateNArguments* const args)2285{2286Geometry* geometry = (Geometry*) args->geometry;2287RTC_CATCH_BEGIN;2288RTC_TRACE(rtcInterpolateN);2289#if defined(DEBUG)2290RTC_VERIFY_HANDLE(args->geometry);2291#endif2292// RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons2293geometry->interpolateN(args);2294RTC_CATCH_END2(geometry);2295}22962297RTC_API void rtcCommitGeometry (RTCGeometry hgeometry)2298{2299Geometry* geometry = (Geometry*) hgeometry;2300RTC_CATCH_BEGIN;2301RTC_TRACE(rtcCommitGeometry);2302RTC_VERIFY_HANDLE(hgeometry);2303RTC_ENTER_DEVICE(hgeometry);2304return geometry->commit();2305RTC_CATCH_END2(geometry);2306}23072308RTC_API unsigned int rtcAttachGeometry (RTCScene hscene, RTCGeometry hgeometry)2309{2310Scene* scene = (Scene*) hscene;2311Geometry* geometry = (Geometry*) hgeometry;2312RTC_CATCH_BEGIN;2313RTC_TRACE(rtcAttachGeometry);2314RTC_VERIFY_HANDLE(hscene);2315RTC_VERIFY_HANDLE(hgeometry);2316RTC_ENTER_DEVICE(hgeometry);2317if (scene->device != geometry->device)2318throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");2319return scene->bind(RTC_INVALID_GEOMETRY_ID,geometry);2320RTC_CATCH_END2(scene);2321return -1;2322}23232324RTC_API void rtcAttachGeometryByID (RTCScene hscene, RTCGeometry hgeometry, unsigned int geomID)2325{2326Scene* scene = (Scene*) hscene;2327Geometry* geometry = (Geometry*) hgeometry;2328RTC_CATCH_BEGIN;2329RTC_TRACE(rtcAttachGeometryByID);2330RTC_VERIFY_HANDLE(hscene);2331RTC_VERIFY_HANDLE(hgeometry);2332RTC_VERIFY_GEOMID(geomID);2333RTC_ENTER_DEVICE(hscene);2334if (scene->device != geometry->device)2335throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");2336scene->bind(geomID,geometry);2337RTC_CATCH_END2(scene);2338}23392340RTC_API void rtcDetachGeometry (RTCScene hscene, unsigned int geomID)2341{2342Scene* scene = (Scene*) hscene;2343RTC_CATCH_BEGIN;2344RTC_TRACE(rtcDetachGeometry);2345RTC_VERIFY_HANDLE(hscene);2346RTC_VERIFY_GEOMID(geomID);2347RTC_ENTER_DEVICE(hscene);2348scene->detachGeometry(geomID);2349RTC_CATCH_END2(scene);2350}23512352RTC_API void rtcRetainGeometry (RTCGeometry hgeometry)2353{2354Geometry* geometry = (Geometry*) hgeometry;2355RTC_CATCH_BEGIN;2356RTC_TRACE(rtcRetainGeometry);2357RTC_VERIFY_HANDLE(hgeometry);2358RTC_ENTER_DEVICE(hgeometry);2359geometry->refInc();2360RTC_CATCH_END2(geometry);2361}23622363RTC_API void rtcReleaseGeometry (RTCGeometry hgeometry)2364{2365Geometry* geometry = (Geometry*) hgeometry;2366RTC_CATCH_BEGIN;2367RTC_TRACE(rtcReleaseGeometry);2368RTC_VERIFY_HANDLE(hgeometry);2369RTC_ENTER_DEVICE(hgeometry);2370geometry->refDec();2371RTC_CATCH_END2(geometry);2372}23732374RTC_API RTCGeometry rtcGetGeometry (RTCScene hscene, unsigned int geomID)2375{2376Scene* scene = (Scene*) hscene;2377RTC_CATCH_BEGIN;2378RTC_TRACE(rtcGetGeometry);2379#if defined(DEBUG)2380RTC_VERIFY_HANDLE(hscene);2381RTC_VERIFY_GEOMID(geomID);2382#endif2383//RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons2384return (RTCGeometry) scene->get(geomID);2385RTC_CATCH_END2(scene);2386return nullptr;2387}23882389RTC_API RTCGeometry rtcGetGeometryThreadSafe (RTCScene hscene, unsigned int geomID)2390{2391Scene* scene = (Scene*) hscene;2392RTC_CATCH_BEGIN;2393RTC_TRACE(rtcGetGeometryThreadSafe);2394#if defined(DEBUG)2395RTC_VERIFY_HANDLE(hscene);2396RTC_VERIFY_GEOMID(geomID);2397#endif2398Ref<Geometry> geom = scene->get_locked(geomID);2399return (RTCGeometry) geom.ptr;2400RTC_CATCH_END2(scene);2401return nullptr;2402}24032404RTC_API const char* rtcGetErrorString(RTCError error)2405{2406RTC_CATCH_BEGIN;2407RTC_TRACE(rtcGetErrorString);2408return Device::getErrorString(error);2409RTC_CATCH_END(nullptr);2410return nullptr;2411}241224132414RTC_NAMESPACE_END241524162417