Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/kernels/common/rtcore.cpp
9905 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#define RTC_EXPORT_API
5
6
#include "default.h"
7
#include "device.h"
8
#include "scene.h"
9
#include "context.h"
10
#include "../geometry/filter.h"
11
#include "../../include/embree4/rtcore_ray.h"
12
using namespace embree;
13
14
RTC_NAMESPACE_BEGIN;
15
16
#define RTC_ENTER_DEVICE(arg) \
17
DeviceEnterLeave enterleave(arg);
18
19
/* mutex to make API thread safe */
20
static MutexSys g_mutex;
21
22
RTC_API RTCDevice rtcNewDevice(const char* config)
23
{
24
RTC_CATCH_BEGIN;
25
RTC_TRACE(rtcNewDevice);
26
Lock<MutexSys> lock(g_mutex);
27
Device* device = new Device(config);
28
return (RTCDevice) device->refInc();
29
RTC_CATCH_END(nullptr);
30
return (RTCDevice) nullptr;
31
}
32
33
#if defined(EMBREE_SYCL_SUPPORT)
34
35
RTC_API RTCDevice rtcNewSYCLDeviceInternal(sycl::context sycl_context, const char* config)
36
{
37
RTC_CATCH_BEGIN;
38
RTC_TRACE(rtcNewSYCLDevice);
39
Lock<MutexSys> lock(g_mutex);
40
41
DeviceGPU* device = new DeviceGPU(sycl_context,config);
42
return (RTCDevice) device->refInc();
43
RTC_CATCH_END(nullptr);
44
return (RTCDevice) nullptr;
45
}
46
47
RTC_API bool rtcIsSYCLDeviceSupported(const sycl::device device)
48
{
49
try {
50
RTC_TRACE(rtcIsSYCLDeviceSupported);
51
return rthwifIsSYCLDeviceSupported(device) > 0;
52
} catch (...) {
53
return false;
54
}
55
return false;
56
}
57
58
RTC_API int rtcSYCLDeviceSelector(const sycl::device device)
59
{
60
try {
61
RTC_TRACE(rtcSYCLDeviceSelector);
62
return rthwifIsSYCLDeviceSupported(device);
63
} catch (...) {
64
return -1;
65
}
66
return -1;
67
}
68
69
RTC_API void rtcSetDeviceSYCLDevice(RTCDevice hdevice, const sycl::device sycl_device)
70
{
71
RTC_CATCH_BEGIN;
72
RTC_TRACE(rtcSetDeviceSYCLDevice);
73
RTC_VERIFY_HANDLE(hdevice);
74
75
Lock<MutexSys> lock(g_mutex);
76
77
DeviceGPU* device = dynamic_cast<DeviceGPU*>((Device*) hdevice);
78
if (device == nullptr)
79
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "passed device must be an Embree SYCL device")
80
81
device->setSYCLDevice(sycl_device);
82
83
RTC_CATCH_END(nullptr);
84
}
85
86
RTC_API_CPP sycl::event rtcCommitSceneWithQueue (RTCScene hscene, sycl::queue queue)
87
{
88
Scene* scene = (Scene*) hscene;
89
RTC_CATCH_BEGIN;
90
RTC_TRACE(rtcCommitSceneWithQueue);
91
RTC_VERIFY_HANDLE(hscene);
92
RTC_ENTER_DEVICE(hscene);
93
return scene->commit(false, queue);
94
RTC_CATCH_END2(scene);
95
return sycl::event();
96
}
97
98
RTC_API_CPP sycl::event rtcCommitBufferWithQueue(RTCBuffer hbuffer, sycl::queue queue) {
99
Buffer* buffer = (Buffer*)hbuffer;
100
RTC_CATCH_BEGIN;
101
RTC_TRACE(rtcCommitBufferWithQueue);
102
RTC_VERIFY_HANDLE(hbuffer);
103
RTC_ENTER_DEVICE(hbuffer);
104
return buffer->commit(queue);
105
RTC_CATCH_END2(buffer);
106
return sycl::event();
107
}
108
109
#endif
110
111
RTC_API void rtcRetainDevice(RTCDevice hdevice)
112
{
113
Device* device = (Device*) hdevice;
114
RTC_CATCH_BEGIN;
115
RTC_TRACE(rtcRetainDevice);
116
RTC_VERIFY_HANDLE(hdevice);
117
Lock<MutexSys> lock(g_mutex);
118
device->refInc();
119
RTC_CATCH_END(nullptr);
120
}
121
122
RTC_API void rtcReleaseDevice(RTCDevice hdevice)
123
{
124
Device* device = (Device*) hdevice;
125
RTC_CATCH_BEGIN;
126
RTC_TRACE(rtcReleaseDevice);
127
RTC_VERIFY_HANDLE(hdevice);
128
Lock<MutexSys> lock(g_mutex);
129
device->refDec();
130
RTC_CATCH_END(nullptr);
131
}
132
133
RTC_API ssize_t rtcGetDeviceProperty(RTCDevice hdevice, RTCDeviceProperty prop)
134
{
135
Device* device = (Device*) hdevice;
136
RTC_CATCH_BEGIN;
137
RTC_TRACE(rtcGetDeviceProperty);
138
RTC_VERIFY_HANDLE(hdevice);
139
Lock<MutexSys> lock(g_mutex);
140
return device->getProperty(prop);
141
RTC_CATCH_END(device);
142
return 0;
143
}
144
145
RTC_API void rtcSetDeviceProperty(RTCDevice hdevice, const RTCDeviceProperty prop, ssize_t val)
146
{
147
Device* device = (Device*) hdevice;
148
RTC_CATCH_BEGIN;
149
RTC_TRACE(rtcSetDeviceProperty);
150
const bool internal_prop = (size_t)prop >= 1000000 && (size_t)prop < 1000004;
151
if (!internal_prop) RTC_VERIFY_HANDLE(hdevice); // allow NULL device for special internal settings
152
Lock<MutexSys> lock(g_mutex);
153
device->setProperty(prop,val);
154
RTC_CATCH_END(device);
155
}
156
157
RTC_API RTCError rtcGetDeviceError(RTCDevice hdevice)
158
{
159
Device* device = (Device*) hdevice;
160
RTC_CATCH_BEGIN;
161
RTC_TRACE(rtcGetDeviceError);
162
if (device == nullptr) return Device::getThreadErrorCode();
163
else return device->getDeviceErrorCode();
164
RTC_CATCH_END(device);
165
return RTC_ERROR_UNKNOWN;
166
}
167
168
RTC_API const char* rtcGetDeviceLastErrorMessage(RTCDevice hdevice)
169
{
170
Device* device = (Device*) hdevice;
171
RTC_CATCH_BEGIN;
172
RTC_TRACE(rtcGetDeviceLastErrorMessage);
173
if (device == nullptr) return Device::getThreadLastErrorMessage();
174
else return device->getDeviceLastErrorMessage();
175
RTC_CATCH_END(device);
176
return "";
177
}
178
179
RTC_API void rtcSetDeviceErrorFunction(RTCDevice hdevice, RTCErrorFunction error, void* userPtr)
180
{
181
Device* device = (Device*) hdevice;
182
RTC_CATCH_BEGIN;
183
RTC_TRACE(rtcSetDeviceErrorFunction);
184
RTC_VERIFY_HANDLE(hdevice);
185
device->setErrorFunction(error, userPtr);
186
RTC_CATCH_END(device);
187
}
188
189
RTC_API void rtcSetDeviceMemoryMonitorFunction(RTCDevice hdevice, RTCMemoryMonitorFunction memoryMonitor, void* userPtr)
190
{
191
Device* device = (Device*) hdevice;
192
RTC_CATCH_BEGIN;
193
RTC_TRACE(rtcSetDeviceMemoryMonitorFunction);
194
device->setMemoryMonitorFunction(memoryMonitor, userPtr);
195
RTC_CATCH_END(device);
196
}
197
198
RTC_API RTCBuffer rtcNewBuffer(RTCDevice hdevice, size_t byteSize)
199
{
200
RTC_CATCH_BEGIN;
201
RTC_TRACE(rtcNewBuffer);
202
RTC_VERIFY_HANDLE(hdevice);
203
RTC_ENTER_DEVICE(hdevice);
204
Buffer* buffer = new Buffer((Device*)hdevice, byteSize, nullptr);
205
return (RTCBuffer)buffer->refInc();
206
RTC_CATCH_END((Device*)hdevice);
207
return nullptr;
208
}
209
210
RTC_API RTCBuffer rtcNewBufferHostDevice(RTCDevice hdevice, size_t byteSize)
211
{
212
RTC_CATCH_BEGIN;
213
RTC_TRACE(rtcNewBufferHostDevice);
214
RTC_VERIFY_HANDLE(hdevice);
215
RTC_ENTER_DEVICE(hdevice);
216
Buffer* buffer = new Buffer((Device*)hdevice, byteSize, nullptr, nullptr);
217
return (RTCBuffer)buffer->refInc();
218
RTC_CATCH_END((Device*)hdevice);
219
return nullptr;
220
}
221
222
RTC_API RTCBuffer rtcNewSharedBuffer(RTCDevice hdevice, void* ptr, size_t byteSize)
223
{
224
RTC_CATCH_BEGIN;
225
RTC_TRACE(rtcNewSharedBuffer);
226
RTC_VERIFY_HANDLE(hdevice);
227
RTC_ENTER_DEVICE(hdevice);
228
Buffer* buffer = new Buffer((Device*)hdevice, byteSize, ptr);
229
return (RTCBuffer)buffer->refInc();
230
RTC_CATCH_END((Device*)hdevice);
231
return nullptr;
232
}
233
234
RTC_API RTCBuffer rtcNewSharedBufferHostDevice(RTCDevice hdevice, void* ptr, size_t byteSize)
235
{
236
RTC_CATCH_BEGIN;
237
RTC_TRACE(rtcNewSharedBufferHostDevice);
238
RTC_VERIFY_HANDLE(hdevice);
239
RTC_ENTER_DEVICE(hdevice);
240
Buffer* buffer = new Buffer((Device*)hdevice, byteSize, ptr, nullptr);
241
return (RTCBuffer)buffer->refInc();
242
RTC_CATCH_END((Device*)hdevice);
243
return nullptr;
244
}
245
246
RTC_API void* rtcGetBufferDataDevice(RTCBuffer hbuffer)
247
{
248
Buffer* buffer = (Buffer*)hbuffer;
249
RTC_CATCH_BEGIN;
250
RTC_TRACE(rtcGetBufferDataDevice);
251
RTC_VERIFY_HANDLE(hbuffer);
252
RTC_ENTER_DEVICE(hbuffer);
253
return buffer->dataDevice();
254
RTC_CATCH_END2(buffer);
255
return nullptr;
256
}
257
258
RTC_API void* rtcGetBufferData(RTCBuffer hbuffer)
259
{
260
Buffer* buffer = (Buffer*)hbuffer;
261
RTC_CATCH_BEGIN;
262
RTC_TRACE(rtcGetBufferData);
263
RTC_VERIFY_HANDLE(hbuffer);
264
RTC_ENTER_DEVICE(hbuffer);
265
return buffer->data();
266
RTC_CATCH_END2(buffer);
267
return nullptr;
268
}
269
270
RTC_API void rtcRetainBuffer(RTCBuffer hbuffer)
271
{
272
Buffer* buffer = (Buffer*)hbuffer;
273
RTC_CATCH_BEGIN;
274
RTC_TRACE(rtcRetainBuffer);
275
RTC_VERIFY_HANDLE(hbuffer);
276
RTC_ENTER_DEVICE(hbuffer);
277
buffer->refInc();
278
RTC_CATCH_END2(buffer);
279
}
280
281
RTC_API void rtcReleaseBuffer(RTCBuffer hbuffer)
282
{
283
Buffer* buffer = (Buffer*)hbuffer;
284
RTC_CATCH_BEGIN;
285
RTC_TRACE(rtcReleaseBuffer);
286
RTC_VERIFY_HANDLE(hbuffer);
287
RTC_ENTER_DEVICE(hbuffer);
288
buffer->refDec();
289
RTC_CATCH_END2(buffer);
290
}
291
292
RTC_API void rtcCommitBuffer(RTCBuffer hbuffer) {
293
Buffer* buffer = (Buffer*)hbuffer;
294
RTC_CATCH_BEGIN;
295
RTC_TRACE(rtcCommitBuffer);
296
RTC_VERIFY_HANDLE(hbuffer);
297
RTC_ENTER_DEVICE(hbuffer);
298
buffer->commit();
299
RTC_CATCH_END2(buffer);
300
}
301
302
RTC_API RTCScene rtcNewScene (RTCDevice hdevice)
303
{
304
RTC_CATCH_BEGIN;
305
RTC_TRACE(rtcNewScene);
306
RTC_VERIFY_HANDLE(hdevice);
307
RTC_ENTER_DEVICE(hdevice);
308
Scene* scene = new Scene((Device*)hdevice);
309
return (RTCScene) scene->refInc();
310
RTC_CATCH_END((Device*)hdevice);
311
return nullptr;
312
}
313
314
RTC_API RTCDevice rtcGetSceneDevice(RTCScene hscene)
315
{
316
Scene* scene = (Scene*) hscene;
317
RTC_CATCH_BEGIN;
318
RTC_TRACE(rtcGetSceneDevice);
319
RTC_VERIFY_HANDLE(hscene);
320
return (RTCDevice)scene->device->refInc(); // user will own one additional device reference
321
RTC_CATCH_END2(scene);
322
return (RTCDevice)nullptr;
323
}
324
325
RTC_API RTCTraversable rtcGetSceneTraversable(RTCScene hscene)
326
{
327
Scene* scene = (Scene*) hscene;
328
RTC_CATCH_BEGIN;
329
RTC_TRACE(rtcGetSceneTraversable);
330
RTC_VERIFY_HANDLE(hscene);
331
RTCTraversable traversable = (RTCTraversable)scene->getTraversable();
332
if (!traversable)
333
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"Traversable is NULL. The scene has to be committed first.");
334
return traversable;
335
RTC_CATCH_END2(scene);
336
return (RTCTraversable)nullptr;
337
}
338
339
RTC_API void rtcSetSceneProgressMonitorFunction(RTCScene hscene, RTCProgressMonitorFunction progress, void* ptr)
340
{
341
Scene* scene = (Scene*) hscene;
342
RTC_CATCH_BEGIN;
343
RTC_TRACE(rtcSetSceneProgressMonitorFunction);
344
RTC_VERIFY_HANDLE(hscene);
345
RTC_ENTER_DEVICE(hscene);
346
Lock<MutexSys> lock(g_mutex);
347
scene->setProgressMonitorFunction(progress,ptr);
348
RTC_CATCH_END2(scene);
349
}
350
351
RTC_API void rtcSetSceneBuildQuality (RTCScene hscene, RTCBuildQuality quality)
352
{
353
Scene* scene = (Scene*) hscene;
354
RTC_CATCH_BEGIN;
355
RTC_TRACE(rtcSetSceneBuildQuality);
356
RTC_VERIFY_HANDLE(hscene);
357
RTC_ENTER_DEVICE(hscene);
358
if (quality != RTC_BUILD_QUALITY_LOW &&
359
quality != RTC_BUILD_QUALITY_MEDIUM &&
360
quality != RTC_BUILD_QUALITY_HIGH)
361
abort(); //throw std::runtime_error("invalid build quality");
362
scene->setBuildQuality(quality);
363
RTC_CATCH_END2(scene);
364
}
365
366
RTC_API void rtcSetSceneFlags (RTCScene hscene, RTCSceneFlags flags)
367
{
368
Scene* scene = (Scene*) hscene;
369
RTC_CATCH_BEGIN;
370
RTC_TRACE(rtcSetSceneFlags);
371
RTC_VERIFY_HANDLE(hscene);
372
RTC_ENTER_DEVICE(hscene);
373
scene->setSceneFlags(flags);
374
RTC_CATCH_END2(scene);
375
}
376
377
RTC_API RTCSceneFlags rtcGetSceneFlags(RTCScene hscene)
378
{
379
Scene* scene = (Scene*) hscene;
380
RTC_CATCH_BEGIN;
381
RTC_TRACE(rtcGetSceneFlags);
382
RTC_VERIFY_HANDLE(hscene);
383
//RTC_ENTER_DEVICE(hscene);
384
return scene->getSceneFlags();
385
RTC_CATCH_END2(scene);
386
return RTC_SCENE_FLAG_NONE;
387
}
388
389
RTC_API_EXTERN_C bool prefetchUSMSharedOnGPU(RTCScene scene);
390
391
RTC_API void rtcCommitScene (RTCScene hscene)
392
{
393
Scene* scene = (Scene*) hscene;
394
RTC_CATCH_BEGIN;
395
RTC_TRACE(rtcCommitScene);
396
RTC_VERIFY_HANDLE(hscene);
397
RTC_ENTER_DEVICE(hscene);
398
399
scene->commit(false);
400
401
#if defined(EMBREE_SYCL_SUPPORT)
402
//prefetchUSMSharedOnGPU(hscene);
403
#endif
404
405
RTC_CATCH_END2(scene);
406
}
407
408
RTC_API void rtcJoinCommitScene (RTCScene hscene)
409
{
410
Scene* scene = (Scene*) hscene;
411
RTC_CATCH_BEGIN;
412
RTC_TRACE(rtcJoinCommitScene);
413
RTC_VERIFY_HANDLE(hscene);
414
RTC_ENTER_DEVICE(hscene);
415
416
scene->commit(true);
417
RTC_CATCH_END2(scene);
418
}
419
420
RTC_API void rtcGetSceneBounds(RTCScene hscene, RTCBounds* bounds_o)
421
{
422
Scene* scene = (Scene*) hscene;
423
RTC_CATCH_BEGIN;
424
RTC_TRACE(rtcGetSceneBounds);
425
RTC_VERIFY_HANDLE(hscene);
426
RTC_ENTER_DEVICE(hscene);
427
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
428
BBox3fa bounds = scene->bounds.bounds();
429
bounds_o->lower_x = bounds.lower.x;
430
bounds_o->lower_y = bounds.lower.y;
431
bounds_o->lower_z = bounds.lower.z;
432
bounds_o->align0 = 0;
433
bounds_o->upper_x = bounds.upper.x;
434
bounds_o->upper_y = bounds.upper.y;
435
bounds_o->upper_z = bounds.upper.z;
436
bounds_o->align1 = 0;
437
RTC_CATCH_END2(scene);
438
}
439
440
RTC_API void rtcGetSceneLinearBounds(RTCScene hscene, RTCLinearBounds* bounds_o)
441
{
442
Scene* scene = (Scene*) hscene;
443
RTC_CATCH_BEGIN;
444
RTC_TRACE(rtcGetSceneBounds);
445
RTC_VERIFY_HANDLE(hscene);
446
RTC_ENTER_DEVICE(hscene);
447
if (bounds_o == nullptr)
448
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"invalid destination pointer");
449
if (scene->isModified())
450
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
451
452
bounds_o->bounds0.lower_x = scene->bounds.bounds0.lower.x;
453
bounds_o->bounds0.lower_y = scene->bounds.bounds0.lower.y;
454
bounds_o->bounds0.lower_z = scene->bounds.bounds0.lower.z;
455
bounds_o->bounds0.align0 = 0;
456
bounds_o->bounds0.upper_x = scene->bounds.bounds0.upper.x;
457
bounds_o->bounds0.upper_y = scene->bounds.bounds0.upper.y;
458
bounds_o->bounds0.upper_z = scene->bounds.bounds0.upper.z;
459
bounds_o->bounds0.align1 = 0;
460
bounds_o->bounds1.lower_x = scene->bounds.bounds1.lower.x;
461
bounds_o->bounds1.lower_y = scene->bounds.bounds1.lower.y;
462
bounds_o->bounds1.lower_z = scene->bounds.bounds1.lower.z;
463
bounds_o->bounds1.align0 = 0;
464
bounds_o->bounds1.upper_x = scene->bounds.bounds1.upper.x;
465
bounds_o->bounds1.upper_y = scene->bounds.bounds1.upper.y;
466
bounds_o->bounds1.upper_z = scene->bounds.bounds1.upper.z;
467
bounds_o->bounds1.align1 = 0;
468
RTC_CATCH_END2(scene);
469
}
470
471
RTC_API void rtcCollide (RTCScene hscene0, RTCScene hscene1, RTCCollideFunc callback, void* userPtr)
472
{
473
Scene* scene0 = (Scene*) hscene0;
474
Scene* scene1 = (Scene*) hscene1;
475
RTC_CATCH_BEGIN;
476
RTC_TRACE(rtcCollide);
477
#if defined(DEBUG)
478
RTC_VERIFY_HANDLE(hscene0);
479
RTC_VERIFY_HANDLE(hscene1);
480
if (scene0->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
481
if (scene1->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
482
if (scene0->device != scene1->device) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scenes are from different devices");
483
auto nUserPrims0 = scene0->getNumPrimitives (Geometry::MTY_USER_GEOMETRY, false);
484
auto nUserPrims1 = scene1->getNumPrimitives (Geometry::MTY_USER_GEOMETRY, false);
485
if (scene0->numPrimitives() != nUserPrims0 && scene1->numPrimitives() != nUserPrims1) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scenes must only contain user geometries with a single timestep");
486
#endif
487
scene0->intersectors.collide(scene0,scene1,callback,userPtr);
488
RTC_CATCH_END(scene0->device);
489
}
490
491
inline bool pointQuery(Scene* scene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)
492
{
493
bool changed = false;
494
if (userContext->instStackSize > 0)
495
{
496
const AffineSpace3fa transform = AffineSpace3fa_load_unaligned((AffineSpace3fa*)userContext->world2inst[userContext->instStackSize-1]);
497
498
float similarityScale = 0.f;
499
const bool similtude = similarityTransform(transform, &similarityScale);
500
assert((similtude && similarityScale > 0) || (!similtude && similarityScale == 0.f));
501
502
PointQuery query_inst;
503
query_inst.p = xfmPoint(transform, Vec3fa(query->x, query->y, query->z));
504
query_inst.radius = query->radius * similarityScale;
505
query_inst.time = query->time;
506
507
PointQueryContext context_inst(scene, (PointQuery*)query,
508
similtude ? POINT_QUERY_TYPE_SPHERE : POINT_QUERY_TYPE_AABB,
509
queryFunc, userContext, similarityScale, userPtr);
510
changed = scene->intersectors.pointQuery((PointQuery*)&query_inst, &context_inst);
511
}
512
else
513
{
514
PointQueryContext context(scene, (PointQuery*)query,
515
POINT_QUERY_TYPE_SPHERE, queryFunc, userContext, 1.f, userPtr);
516
changed = scene->intersectors.pointQuery((PointQuery*)query, &context);
517
}
518
return changed;
519
}
520
521
RTC_API bool rtcPointQuery(RTCScene hscene, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)
522
{
523
Scene* scene = (Scene*) hscene;
524
RTC_CATCH_BEGIN;
525
RTC_TRACE(rtcPointQuery);
526
#if defined(DEBUG)
527
RTC_VERIFY_HANDLE(hscene);
528
RTC_VERIFY_HANDLE(userContext);
529
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
530
if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");
531
if (((size_t)userContext) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "context not aligned to 16 bytes");
532
#endif
533
534
return pointQuery(scene, query, userContext, queryFunc, userPtr);
535
RTC_CATCH_END2_FALSE(scene);
536
}
537
538
RTC_API bool rtcPointQuery4 (const int* valid, RTCScene hscene, RTCPointQuery4* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
539
{
540
Scene* scene = (Scene*) hscene;
541
RTC_CATCH_BEGIN;
542
RTC_TRACE(rtcPointQuery4);
543
544
#if defined(DEBUG)
545
RTC_VERIFY_HANDLE(hscene);
546
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
547
if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");
548
if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");
549
#endif
550
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
551
STAT3(point_query.travs,cnt,cnt,cnt);
552
553
bool changed = false;
554
PointQuery4* query4 = (PointQuery4*)query;
555
PointQuery query1;
556
for (size_t i=0; i<4; i++) {
557
if (!valid[i]) continue;
558
query4->get(i,query1);
559
changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);
560
query4->set(i,query1);
561
}
562
return changed;
563
RTC_CATCH_END2_FALSE(scene);
564
}
565
566
RTC_API bool rtcPointQuery8 (const int* valid, RTCScene hscene, RTCPointQuery8* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
567
{
568
Scene* scene = (Scene*) hscene;
569
RTC_CATCH_BEGIN;
570
RTC_TRACE(rtcPointQuery8);
571
572
#if defined(DEBUG)
573
RTC_VERIFY_HANDLE(hscene);
574
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
575
if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");
576
if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");
577
#endif
578
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
579
STAT3(point_query.travs,cnt,cnt,cnt);
580
581
bool changed = false;
582
PointQuery8* query8 = (PointQuery8*)query;
583
PointQuery query1;
584
for (size_t i=0; i<8; i++) {
585
if (!valid[i]) continue;
586
query8->get(i,query1);
587
changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);
588
query8->set(i,query1);
589
}
590
return changed;
591
RTC_CATCH_END2_FALSE(scene);
592
}
593
594
RTC_API bool rtcPointQuery16 (const int* valid, RTCScene hscene, RTCPointQuery16* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
595
{
596
Scene* scene = (Scene*) hscene;
597
RTC_CATCH_BEGIN;
598
RTC_TRACE(rtcPointQuery16);
599
600
#if defined(DEBUG)
601
RTC_VERIFY_HANDLE(hscene);
602
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene got not committed");
603
if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");
604
if (((size_t)query) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "query not aligned to 16 bytes");
605
#endif
606
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
607
STAT3(point_query.travs,cnt,cnt,cnt);
608
609
bool changed = false;
610
PointQuery16* query16 = (PointQuery16*)query;
611
PointQuery query1;
612
for (size_t i=0; i<16; i++) {
613
if (!valid[i]) continue;
614
PointQuery query1; query16->get(i,query1);
615
changed |= pointQuery(scene, (RTCPointQuery*)&query1, userContext, queryFunc, userPtrN?userPtrN[i]:NULL);
616
query16->set(i,query1);
617
}
618
return changed;
619
RTC_CATCH_END2_FALSE(scene);
620
}
621
622
RTC_API void rtcIntersect1 (RTCScene hscene, RTCRayHit* rayhit, RTCIntersectArguments* args)
623
{
624
Scene* scene = (Scene*) hscene;
625
RTC_CATCH_BEGIN;
626
RTC_TRACE(rtcIntersect1);
627
#if defined(DEBUG)
628
RTC_VERIFY_HANDLE(hscene);
629
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
630
if (((size_t)rayhit) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
631
#endif
632
STAT3(normal.travs,1,1,1);
633
634
RTCIntersectArguments defaultArgs;
635
if (unlikely(args == nullptr)) {
636
rtcInitIntersectArguments(&defaultArgs);
637
args = &defaultArgs;
638
}
639
RTCRayQueryContext* user_context = args->context;
640
641
RTCRayQueryContext defaultContext;
642
if (unlikely(user_context == nullptr)) {
643
rtcInitRayQueryContext(&defaultContext);
644
user_context = &defaultContext;
645
}
646
RayQueryContext context(scene,user_context,args);
647
648
scene->intersectors.intersect(*rayhit,&context);
649
#if defined(DEBUG)
650
((RayHit*)rayhit)->verifyHit();
651
#endif
652
RTC_CATCH_END2(scene);
653
}
654
655
RTC_API void rtcForwardIntersect1 (const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)
656
{
657
rtcForwardIntersect1Ex(args, hscene, iray_, instID, 0);
658
}
659
660
RTC_API void rtcForwardIntersect1Ex(const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
661
{
662
Scene* scene = (Scene*) hscene;
663
RTC_CATCH_BEGIN;
664
RTC_TRACE(rtcForwardIntersect1Ex);
665
#if defined(DEBUG)
666
RTC_VERIFY_HANDLE(hscene);
667
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
668
if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
669
#endif
670
671
Ray* iray = (Ray*) iray_;
672
RayHit* oray = (RayHit*)args->rayhit;
673
RTCRayQueryContext* user_context = args->context;
674
const Vec3ff ray_org_tnear = oray->org;
675
const Vec3ff ray_dir_time = oray->dir;
676
oray->org = iray->org;
677
oray->dir = iray->dir;
678
STAT3(normal.travs,1,1,1);
679
680
RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
681
RayQueryContext context(scene,user_context,iargs);
682
683
instance_id_stack::push(user_context, instID, instPrimID);
684
scene->intersectors.intersect(*(RTCRayHit*)oray,&context);
685
instance_id_stack::pop(user_context);
686
687
oray->org = ray_org_tnear;
688
oray->dir = ray_dir_time;
689
690
RTC_CATCH_END2(scene);
691
}
692
693
RTC_API void rtcIntersect4 (const int* valid, RTCScene hscene, RTCRayHit4* rayhit, RTCIntersectArguments* args)
694
{
695
Scene* scene = (Scene*) hscene;
696
RTC_CATCH_BEGIN;
697
RTC_TRACE(rtcIntersect4);
698
699
#if defined(DEBUG)
700
RTC_VERIFY_HANDLE(hscene);
701
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
702
if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");
703
if (((size_t)rayhit) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 16 bytes");
704
#endif
705
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
706
STAT3(normal.travs,cnt,cnt,cnt);
707
708
RTCIntersectArguments defaultArgs;
709
if (unlikely(args == nullptr)) {
710
rtcInitIntersectArguments(&defaultArgs);
711
args = &defaultArgs;
712
}
713
RTCRayQueryContext* user_context = args->context;
714
715
RTCRayQueryContext defaultContext;
716
if (unlikely(user_context == nullptr)) {
717
rtcInitRayQueryContext(&defaultContext);
718
user_context = &defaultContext;
719
}
720
RayQueryContext context(scene,user_context,args);
721
722
if (likely(scene->intersectors.intersector4))
723
scene->intersectors.intersect4(valid,*rayhit,&context);
724
725
else {
726
RayHit4* ray4 = (RayHit4*) rayhit;
727
for (size_t i=0; i<4; i++) {
728
if (!valid[i]) continue;
729
RayHit ray1; ray4->get(i,ray1);
730
scene->intersectors.intersect((RTCRayHit&)ray1,&context);
731
ray4->set(i,ray1);
732
}
733
}
734
735
RTC_CATCH_END2(scene);
736
}
737
738
template<int N> void copy(float* dst, float* src);
739
740
template<>
741
__forceinline void copy<4>(float* dst, float* src) {
742
vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
743
}
744
745
template<>
746
__forceinline void copy<8>(float* dst, float* src) {
747
vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
748
vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));
749
}
750
751
template<>
752
__forceinline void copy<16>(float* dst, float* src) {
753
vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
754
vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));
755
vfloat4::storeu(&dst[8],vfloat4::loadu(&src[8]));
756
vfloat4::storeu(&dst[12],vfloat4::loadu(&src[12]));
757
}
758
759
template<typename RTCRay, typename RTCRayHit, int N>
760
__forceinline void rtcForwardIntersectN(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
761
{
762
Scene* scene = (Scene*) hscene;
763
RTCRayHit* oray = (RTCRayHit*)args->rayhit;
764
RTCRayQueryContext* user_context = args->context;
765
766
__aligned(16) float ray_org_x[N];
767
__aligned(16) float ray_org_y[N];
768
__aligned(16) float ray_org_z[N];
769
__aligned(16) float ray_dir_x[N];
770
__aligned(16) float ray_dir_y[N];
771
__aligned(16) float ray_dir_z[N];
772
773
copy<N>(ray_org_x,oray->ray.org_x);
774
copy<N>(ray_org_y,oray->ray.org_y);
775
copy<N>(ray_org_z,oray->ray.org_z);
776
copy<N>(ray_dir_x,oray->ray.dir_x);
777
copy<N>(ray_dir_y,oray->ray.dir_y);
778
copy<N>(ray_dir_z,oray->ray.dir_z);
779
780
copy<N>(oray->ray.org_x,iray->org_x);
781
copy<N>(oray->ray.org_y,iray->org_y);
782
copy<N>(oray->ray.org_z,iray->org_z);
783
copy<N>(oray->ray.dir_x,iray->dir_x);
784
copy<N>(oray->ray.dir_y,iray->dir_y);
785
copy<N>(oray->ray.dir_z,iray->dir_z);
786
787
STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);
788
STAT3(normal.travs,cnt,cnt,cnt);
789
790
RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
791
RayQueryContext context(scene,user_context,iargs);
792
793
instance_id_stack::push(user_context, instID, instPrimID);
794
scene->intersectors.intersect(valid,*oray,&context);
795
instance_id_stack::pop(user_context);
796
797
copy<N>(oray->ray.org_x,ray_org_x);
798
copy<N>(oray->ray.org_y,ray_org_y);
799
copy<N>(oray->ray.org_z,ray_org_z);
800
copy<N>(oray->ray.dir_x,ray_dir_x);
801
copy<N>(oray->ray.dir_y,ray_dir_y);
802
copy<N>(oray->ray.dir_z,ray_dir_z);
803
}
804
805
RTC_API void rtcForwardIntersect4(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)
806
{
807
RTC_TRACE(rtcForwardIntersect4);
808
return rtcForwardIntersect4Ex(valid, args, hscene, iray, instID, 0);
809
}
810
811
RTC_API void rtcForwardIntersect4Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
812
{
813
Scene* scene = (Scene*) hscene;
814
RTC_CATCH_BEGIN;
815
RTC_TRACE(rtcForwardIntersect4);
816
rtcForwardIntersectN<RTCRay4,RTCRayHit4,4>(valid,args,hscene,iray,instID,instPrimID);
817
RTC_CATCH_END2(scene);
818
}
819
820
RTC_API void rtcIntersect8 (const int* valid, RTCScene hscene, RTCRayHit8* rayhit, RTCIntersectArguments* args)
821
{
822
Scene* scene = (Scene*) hscene;
823
RTC_CATCH_BEGIN;
824
RTC_TRACE(rtcIntersect8);
825
826
#if defined(DEBUG)
827
RTC_VERIFY_HANDLE(hscene);
828
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
829
if (((size_t)valid) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 32 bytes");
830
if (((size_t)rayhit) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 32 bytes");
831
#endif
832
STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);
833
STAT3(normal.travs,cnt,cnt,cnt);
834
835
RTCIntersectArguments defaultArgs;
836
if (unlikely(args == nullptr)) {
837
rtcInitIntersectArguments(&defaultArgs);
838
args = &defaultArgs;
839
}
840
RTCRayQueryContext* user_context = args->context;
841
842
RTCRayQueryContext defaultContext;
843
if (unlikely(user_context == nullptr)) {
844
rtcInitRayQueryContext(&defaultContext);
845
user_context = &defaultContext;
846
}
847
RayQueryContext context(scene,user_context,args);
848
849
if (likely(scene->intersectors.intersector8))
850
scene->intersectors.intersect8(valid,*rayhit,&context);
851
852
else
853
{
854
RayHit8* ray8 = (RayHit8*) rayhit;
855
for (size_t i=0; i<8; i++) {
856
if (!valid[i]) continue;
857
RayHit ray1; ray8->get(i,ray1);
858
scene->intersectors.intersect((RTCRayHit&)ray1,&context);
859
ray8->set(i,ray1);
860
}
861
}
862
863
RTC_CATCH_END2(scene);
864
}
865
866
RTC_API void rtcForwardIntersect8(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)
867
{
868
RTC_TRACE(rtcForwardIntersect8);
869
return rtcForwardIntersect8Ex(valid, args, hscene, iray, instID, 0);
870
}
871
872
RTC_API void rtcForwardIntersect8Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
873
{
874
Scene* scene = (Scene*) hscene;
875
RTC_CATCH_BEGIN;
876
RTC_TRACE(rtcForwardIntersect8Ex);
877
rtcForwardIntersectN<RTCRay8,RTCRayHit8,8>(valid,args,hscene,iray,instID,instPrimID);
878
RTC_CATCH_END2(scene);
879
}
880
881
RTC_API void rtcIntersect16 (const int* valid, RTCScene hscene, RTCRayHit16* rayhit, RTCIntersectArguments* args)
882
{
883
Scene* scene = (Scene*) hscene;
884
RTC_CATCH_BEGIN;
885
RTC_TRACE(rtcIntersect16);
886
887
#if defined(DEBUG)
888
RTC_VERIFY_HANDLE(hscene);
889
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
890
if (((size_t)valid) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 64 bytes");
891
if (((size_t)rayhit) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit not aligned to 64 bytes");
892
#endif
893
STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);
894
STAT3(normal.travs,cnt,cnt,cnt);
895
896
RTCIntersectArguments defaultArgs;
897
if (unlikely(args == nullptr)) {
898
rtcInitIntersectArguments(&defaultArgs);
899
args = &defaultArgs;
900
}
901
RTCRayQueryContext* user_context = args->context;
902
903
RTCRayQueryContext defaultContext;
904
if (unlikely(user_context == nullptr)) {
905
rtcInitRayQueryContext(&defaultContext);
906
user_context = &defaultContext;
907
}
908
RayQueryContext context(scene,user_context,args);
909
910
if (likely(scene->intersectors.intersector16))
911
scene->intersectors.intersect16(valid,*rayhit,&context);
912
913
else {
914
RayHit16* ray16 = (RayHit16*) rayhit;
915
for (size_t i=0; i<16; i++) {
916
if (!valid[i]) continue;
917
RayHit ray1; ray16->get(i,ray1);
918
scene->intersectors.intersect((RTCRayHit&)ray1,&context);
919
ray16->set(i,ray1);
920
}
921
}
922
923
RTC_CATCH_END2(scene);
924
}
925
926
RTC_API void rtcForwardIntersect16(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)
927
{
928
RTC_TRACE(rtcForwardIntersect16);
929
return rtcForwardIntersect16Ex(valid, args, hscene, iray, instID, 0);
930
}
931
932
RTC_API void rtcForwardIntersect16Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
933
{
934
Scene* scene = (Scene*) hscene;
935
RTC_CATCH_BEGIN;
936
RTC_TRACE(rtcForwardIntersect16Ex);
937
rtcForwardIntersectN<RTCRay16,RTCRayHit16,16>(valid,args,hscene,iray,instID,instPrimID);
938
RTC_CATCH_END2(scene);
939
}
940
941
RTC_API void rtcOccluded1 (RTCScene hscene, RTCRay* ray, RTCOccludedArguments* args)
942
{
943
Scene* scene = (Scene*) hscene;
944
RTC_CATCH_BEGIN;
945
RTC_TRACE(rtcOccluded1);
946
STAT3(shadow.travs,1,1,1);
947
#if defined(DEBUG)
948
RTC_VERIFY_HANDLE(hscene);
949
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
950
if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
951
#endif
952
953
RTCOccludedArguments defaultArgs;
954
if (unlikely(args == nullptr)) {
955
rtcInitOccludedArguments(&defaultArgs);
956
args = &defaultArgs;
957
}
958
RTCRayQueryContext* user_context = args->context;
959
960
RTCRayQueryContext defaultContext;
961
if (unlikely(user_context == nullptr)) {
962
rtcInitRayQueryContext(&defaultContext);
963
user_context = &defaultContext;
964
}
965
RayQueryContext context(scene,user_context,args);
966
967
scene->intersectors.occluded(*ray,&context);
968
RTC_CATCH_END2(scene);
969
}
970
971
RTC_API void rtcForwardOccluded1 (const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)
972
{
973
RTC_TRACE(rtcForwardOccluded1);
974
return rtcForwardOccluded1Ex(args, hscene, iray_, instID, 0);
975
}
976
977
RTC_API void rtcForwardOccluded1Ex(const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
978
{
979
Scene* scene = (Scene*) hscene;
980
RTC_CATCH_BEGIN;
981
RTC_TRACE(rtcForwardOccluded1Ex);
982
STAT3(shadow.travs,1,1,1);
983
#if defined(DEBUG)
984
RTC_VERIFY_HANDLE(hscene);
985
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
986
if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
987
#endif
988
989
Ray* iray = (Ray*)iray_;
990
Ray* oray = (Ray*)args->ray;
991
RTCRayQueryContext* user_context = args->context;
992
const Vec3ff ray_org_tnear = oray->org;
993
const Vec3ff ray_dir_time = oray->dir;
994
oray->org = iray->org;
995
oray->dir = iray->dir;
996
997
RTCIntersectArguments* iargs = ((OccludedFunctionNArguments*) args)->args;
998
RayQueryContext context(scene,user_context,iargs);
999
1000
instance_id_stack::push(user_context, instID, instPrimID);
1001
scene->intersectors.occluded(*(RTCRay*)oray,&context);
1002
instance_id_stack::pop(user_context);
1003
1004
oray->org = ray_org_tnear;
1005
oray->dir = ray_dir_time;
1006
1007
RTC_CATCH_END2(scene);
1008
}
1009
1010
RTC_API void rtcOccluded4 (const int* valid, RTCScene hscene, RTCRay4* ray, RTCOccludedArguments* args)
1011
{
1012
Scene* scene = (Scene*) hscene;
1013
RTC_CATCH_BEGIN;
1014
RTC_TRACE(rtcOccluded4);
1015
1016
#if defined(DEBUG)
1017
RTC_VERIFY_HANDLE(hscene);
1018
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
1019
if (((size_t)valid) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 16 bytes");
1020
if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
1021
#endif
1022
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
1023
STAT3(shadow.travs,cnt,cnt,cnt);
1024
1025
RTCOccludedArguments defaultArgs;
1026
if (unlikely(args == nullptr)) {
1027
rtcInitOccludedArguments(&defaultArgs);
1028
args = &defaultArgs;
1029
}
1030
RTCRayQueryContext* user_context = args->context;
1031
1032
RTCRayQueryContext defaultContext;
1033
if (unlikely(user_context == nullptr)) {
1034
rtcInitRayQueryContext(&defaultContext);
1035
user_context = &defaultContext;
1036
}
1037
RayQueryContext context(scene,user_context,args);
1038
1039
if (likely(scene->intersectors.intersector4))
1040
scene->intersectors.occluded4(valid,*ray,&context);
1041
1042
else {
1043
RayHit4* ray4 = (RayHit4*) ray;
1044
for (size_t i=0; i<4; i++) {
1045
if (!valid[i]) continue;
1046
RayHit ray1; ray4->get(i,ray1);
1047
scene->intersectors.occluded((RTCRay&)ray1,&context);
1048
ray4->geomID[i] = ray1.geomID;
1049
}
1050
}
1051
1052
RTC_CATCH_END2(scene);
1053
}
1054
1055
template<typename RTCRay, int N>
1056
__forceinline void rtcForwardOccludedN (const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
1057
{
1058
Scene* scene = (Scene*) hscene;
1059
RTCRay* oray = (RTCRay*)args->ray;
1060
RTCRayQueryContext* user_context = args->context;
1061
1062
__aligned(16) float ray_org_x[N];
1063
__aligned(16) float ray_org_y[N];
1064
__aligned(16) float ray_org_z[N];
1065
__aligned(16) float ray_dir_x[N];
1066
__aligned(16) float ray_dir_y[N];
1067
__aligned(16) float ray_dir_z[N];
1068
1069
copy<N>(ray_org_x,oray->org_x);
1070
copy<N>(ray_org_y,oray->org_y);
1071
copy<N>(ray_org_z,oray->org_z);
1072
copy<N>(ray_dir_x,oray->dir_x);
1073
copy<N>(ray_dir_y,oray->dir_y);
1074
copy<N>(ray_dir_z,oray->dir_z);
1075
1076
copy<N>(oray->org_x,iray->org_x);
1077
copy<N>(oray->org_y,iray->org_y);
1078
copy<N>(oray->org_z,iray->org_z);
1079
copy<N>(oray->dir_x,iray->dir_x);
1080
copy<N>(oray->dir_y,iray->dir_y);
1081
copy<N>(oray->dir_z,iray->dir_z);
1082
1083
STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);
1084
STAT3(normal.travs,cnt,cnt,cnt);
1085
1086
RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
1087
RayQueryContext context(scene,user_context,iargs);
1088
1089
instance_id_stack::push(user_context, instID, instPrimID);
1090
scene->intersectors.occluded(valid,*oray,&context);
1091
instance_id_stack::pop(user_context);
1092
1093
copy<N>(oray->org_x,ray_org_x);
1094
copy<N>(oray->org_y,ray_org_y);
1095
copy<N>(oray->org_z,ray_org_z);
1096
copy<N>(oray->dir_x,ray_dir_x);
1097
copy<N>(oray->dir_y,ray_dir_y);
1098
copy<N>(oray->dir_z,ray_dir_z);
1099
}
1100
1101
RTC_API void rtcForwardOccluded4(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)
1102
{
1103
RTC_TRACE(rtcForwardOccluded4);
1104
return rtcForwardOccluded4Ex(valid, args, hscene, iray, instID, 0);
1105
}
1106
1107
RTC_API void rtcForwardOccluded4Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
1108
{
1109
Scene* scene = (Scene*) hscene;
1110
RTC_CATCH_BEGIN;
1111
RTC_TRACE(rtcForwardOccluded4);
1112
rtcForwardOccludedN<RTCRay4,4>(valid,args,hscene,iray,instID,instPrimID);
1113
RTC_CATCH_END2(scene);
1114
}
1115
1116
RTC_API void rtcOccluded8 (const int* valid, RTCScene hscene, RTCRay8* ray, RTCOccludedArguments* args)
1117
{
1118
Scene* scene = (Scene*) hscene;
1119
RTC_CATCH_BEGIN;
1120
RTC_TRACE(rtcOccluded8);
1121
1122
#if defined(DEBUG)
1123
RTC_VERIFY_HANDLE(hscene);
1124
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
1125
if (((size_t)valid) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 32 bytes");
1126
if (((size_t)ray) & 0x1F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 32 bytes");
1127
#endif
1128
STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);
1129
STAT3(shadow.travs,cnt,cnt,cnt);
1130
1131
RTCOccludedArguments defaultArgs;
1132
if (unlikely(args == nullptr)) {
1133
rtcInitOccludedArguments(&defaultArgs);
1134
args = &defaultArgs;
1135
}
1136
RTCRayQueryContext* user_context = args->context;
1137
1138
RTCRayQueryContext defaultContext;
1139
if (unlikely(user_context == nullptr)) {
1140
rtcInitRayQueryContext(&defaultContext);
1141
user_context = &defaultContext;
1142
}
1143
RayQueryContext context(scene,user_context,args);
1144
1145
if (likely(scene->intersectors.intersector8))
1146
scene->intersectors.occluded8(valid,*ray,&context);
1147
1148
else {
1149
RayHit8* ray8 = (RayHit8*) ray;
1150
for (size_t i=0; i<8; i++) {
1151
if (!valid[i]) continue;
1152
RayHit ray1; ray8->get(i,ray1);
1153
scene->intersectors.occluded((RTCRay&)ray1,&context);
1154
ray8->set(i,ray1);
1155
}
1156
}
1157
1158
RTC_CATCH_END2(scene);
1159
}
1160
1161
RTC_API void rtcForwardOccluded8(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)
1162
{
1163
RTC_TRACE(rtcForwardOccluded8);
1164
return rtcForwardOccluded8Ex(valid, args, hscene, iray, instID, 0);
1165
}
1166
1167
RTC_API void rtcForwardOccluded8Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
1168
{
1169
Scene* scene = (Scene*) hscene;
1170
RTC_CATCH_BEGIN;
1171
RTC_TRACE(rtcForwardOccluded8Ex);
1172
rtcForwardOccludedN<RTCRay8,8>(valid, args, hscene, iray, instID, instPrimID);
1173
RTC_CATCH_END2(scene);
1174
}
1175
1176
RTC_API void rtcOccluded16 (const int* valid, RTCScene hscene, RTCRay16* ray, RTCOccludedArguments* args)
1177
{
1178
Scene* scene = (Scene*) hscene;
1179
RTC_CATCH_BEGIN;
1180
RTC_TRACE(rtcOccluded16);
1181
1182
#if defined(DEBUG)
1183
RTC_VERIFY_HANDLE(hscene);
1184
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
1185
if (((size_t)valid) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 64 bytes");
1186
if (((size_t)ray) & 0x3F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 64 bytes");
1187
#endif
1188
STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);
1189
STAT3(shadow.travs,cnt,cnt,cnt);
1190
1191
RTCOccludedArguments defaultArgs;
1192
if (unlikely(args == nullptr)) {
1193
rtcInitOccludedArguments(&defaultArgs);
1194
args = &defaultArgs;
1195
}
1196
RTCRayQueryContext* user_context = args->context;
1197
1198
RTCRayQueryContext defaultContext;
1199
if (unlikely(user_context == nullptr)) {
1200
rtcInitRayQueryContext(&defaultContext);
1201
user_context = &defaultContext;
1202
}
1203
RayQueryContext context(scene,user_context,args);
1204
1205
if (likely(scene->intersectors.intersector16))
1206
scene->intersectors.occluded16(valid,*ray,&context);
1207
1208
else {
1209
RayHit16* ray16 = (RayHit16*) ray;
1210
for (size_t i=0; i<16; i++) {
1211
if (!valid[i]) continue;
1212
RayHit ray1; ray16->get(i,ray1);
1213
scene->intersectors.occluded((RTCRay&)ray1,&context);
1214
ray16->set(i,ray1);
1215
}
1216
}
1217
1218
RTC_CATCH_END2(scene);
1219
}
1220
1221
RTC_API void rtcForwardOccluded16(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)
1222
{
1223
RTC_TRACE(rtcForwardOccluded16);
1224
return rtcForwardOccluded16Ex(valid, args, hscene, iray, instID, 0);
1225
}
1226
1227
RTC_API void rtcForwardOccluded16Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
1228
{
1229
Scene* scene = (Scene*) hscene;
1230
RTC_CATCH_BEGIN;
1231
RTC_TRACE(rtcForwardOccluded16Ex);
1232
rtcForwardOccludedN<RTCRay16,16>(valid, args, hscene, iray, instID, instPrimID);
1233
RTC_CATCH_END2(scene);
1234
}
1235
1236
RTC_API bool rtcTraversablePointQuery(RTCTraversable htraversable, RTCPointQuery* query, RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void* userPtr)
1237
{
1238
return rtcPointQuery((RTCScene)htraversable, query, userContext, queryFunc, userPtr);
1239
}
1240
1241
RTC_API bool rtcTraversablePointQuery4 (const int* valid, RTCTraversable htraversable, RTCPointQuery4* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
1242
{
1243
return rtcPointQuery4(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);
1244
}
1245
1246
RTC_API bool rtcTraversablePointQuery8 (const int* valid, RTCTraversable htraversable, RTCPointQuery8* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
1247
{
1248
return rtcPointQuery8(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);
1249
}
1250
1251
RTC_API bool rtcTraversablePointQuery16 (const int* valid, RTCTraversable htraversable, RTCPointQuery16* query, struct RTCPointQueryContext* userContext, RTCPointQueryFunction queryFunc, void** userPtrN)
1252
{
1253
return rtcPointQuery16(valid, (RTCScene)htraversable, query, userContext, queryFunc, userPtrN);
1254
}
1255
1256
RTC_API void rtcTraversableIntersect1 (RTCTraversable htraversable, RTCRayHit* rayhit, RTCIntersectArguments* args)
1257
{
1258
rtcIntersect1((RTCScene)htraversable, rayhit, args);
1259
}
1260
1261
RTC_API void rtcTraversableForwardIntersect1 (const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID)
1262
{
1263
rtcForwardIntersect1(args, (RTCScene)htraversable, iray_, instID);
1264
}
1265
1266
RTC_API void rtcTraversableForwardIntersect1Ex(const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
1267
{
1268
rtcForwardIntersect1Ex(args, (RTCScene)htraversable, iray_, instID, instPrimID);
1269
}
1270
1271
RTC_API void rtcTraversableIntersect4 (const int* valid, RTCTraversable htraversable, RTCRayHit4* rayhit, RTCIntersectArguments* args)
1272
{
1273
rtcIntersect4(valid, (RTCScene)htraversable, rayhit, args);
1274
}
1275
1276
template<typename RTCRay, typename RTCRayHit, int N>
1277
__forceinline void rtcTraversableForwardIntersectN(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
1278
{
1279
rtcForwardIntersetN(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1280
}
1281
1282
RTC_API void rtcTraversableForwardIntersect4(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID)
1283
{
1284
rtcForwardIntersect4(valid, args, (RTCScene)htraversable, iray, instID);
1285
}
1286
1287
RTC_API void rtcTraversableForwardIntersect4Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
1288
{
1289
rtcForwardIntersect4Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1290
}
1291
1292
RTC_API void rtcTraversableIntersect8 (const int* valid, RTCTraversable htraversable, RTCRayHit8* rayhit, RTCIntersectArguments* args)
1293
{
1294
rtcIntersect8(valid, (RTCScene)htraversable, rayhit, args);
1295
}
1296
1297
RTC_API void rtcTraversableForwardIntersect8(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID)
1298
{
1299
rtcForwardIntersect8(valid, args, (RTCScene)htraversable, iray, instID);
1300
}
1301
1302
RTC_API void rtcTraversableForwardIntersect8Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
1303
{
1304
rtcForwardIntersect8Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1305
}
1306
1307
RTC_API void rtcTraversableIntersect16 (const int* valid, RTCTraversable htraversable, RTCRayHit16* rayhit, RTCIntersectArguments* args)
1308
{
1309
rtcIntersect16(valid, (RTCScene)htraversable, rayhit, args);
1310
}
1311
1312
RTC_API void rtcTraversableForwardIntersect16(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID)
1313
{
1314
rtcForwardIntersect16(valid, args, (RTCScene)htraversable, iray, instID);
1315
}
1316
1317
RTC_API void rtcTraversableForwardIntersect16Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
1318
{
1319
rtcForwardIntersect16Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1320
}
1321
1322
RTC_API void rtcTraversableOccluded1 (RTCTraversable htraversable, RTCRay* ray, RTCOccludedArguments* args)
1323
{
1324
rtcOccluded1((RTCScene)htraversable, ray, args);
1325
}
1326
1327
RTC_API void rtcTraversableForwardOccluded1 (const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID)
1328
{
1329
rtcForwardOccluded1(args, (RTCScene)htraversable, iray_, instID);
1330
}
1331
1332
RTC_API void rtcTraversableForwardOccluded1Ex(const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
1333
{
1334
rtcForwardOccluded1Ex(args, (RTCScene)htraversable, iray_, instID, instPrimID);
1335
}
1336
1337
RTC_API void rtcTraversableOccluded4 (const int* valid, RTCTraversable htraversable, RTCRay4* ray, RTCOccludedArguments* args)
1338
{
1339
rtcOccluded4(valid, (RTCScene)htraversable, ray, args);
1340
}
1341
1342
template<typename RTCRay, int N>
1343
__forceinline void rtcTraversableForwardOccludedN (const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
1344
{
1345
rtcForwardOccludedN(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1346
}
1347
1348
RTC_API void rtcTraversableForwardOccluded4(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID)
1349
{
1350
rtcForwardOccluded4(valid, args, (RTCScene)htraversable, iray, instID);
1351
}
1352
1353
RTC_API void rtcTraversableForwardOccluded4Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
1354
{
1355
rtcForwardOccluded4Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1356
}
1357
1358
RTC_API void rtcTraversableOccluded8 (const int* valid, RTCTraversable htraversable, RTCRay8* ray, RTCOccludedArguments* args)
1359
{
1360
rtcOccluded8(valid, (RTCScene)htraversable, ray, args);
1361
}
1362
1363
RTC_API void rtcTraversableForwardOccluded8(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID)
1364
{
1365
rtcForwardOccluded8(valid, args, (RTCScene)htraversable, iray, instID);
1366
}
1367
1368
RTC_API void rtcTraversableForwardOccluded8Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
1369
{
1370
rtcForwardOccluded8Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1371
}
1372
1373
RTC_API void rtcTraversableOccluded16 (const int* valid, RTCTraversable htraversable, RTCRay16* ray, RTCOccludedArguments* args)
1374
{
1375
rtcOccluded16(valid, (RTCScene)htraversable, ray, args);
1376
}
1377
1378
RTC_API void rtcTraversableForwardOccluded16(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID)
1379
{
1380
rtcForwardOccluded16(valid, args, (RTCScene)htraversable, iray, instID);
1381
}
1382
1383
RTC_API void rtcTraversableForwardOccluded16Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCTraversable htraversable, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
1384
{
1385
rtcForwardOccluded16Ex(valid, args, (RTCScene)htraversable, iray, instID, instPrimID);
1386
}
1387
1388
RTC_API void rtcRetainScene (RTCScene hscene)
1389
{
1390
Scene* scene = (Scene*) hscene;
1391
RTC_CATCH_BEGIN;
1392
RTC_TRACE(rtcRetainScene);
1393
RTC_VERIFY_HANDLE(hscene);
1394
RTC_ENTER_DEVICE(hscene);
1395
scene->refInc();
1396
RTC_CATCH_END2(scene);
1397
}
1398
1399
RTC_API void rtcReleaseScene (RTCScene hscene)
1400
{
1401
Scene* scene = (Scene*) hscene;
1402
RTC_CATCH_BEGIN;
1403
RTC_TRACE(rtcReleaseScene);
1404
RTC_VERIFY_HANDLE(hscene);
1405
RTC_ENTER_DEVICE(hscene);
1406
scene->refDec();
1407
RTC_CATCH_END2(scene);
1408
}
1409
1410
RTC_API void rtcSetGeometryInstancedScene(RTCGeometry hgeometry, RTCScene hscene)
1411
{
1412
Geometry* geometry = (Geometry*) hgeometry;
1413
Ref<Scene> scene = (Scene*) hscene;
1414
RTC_CATCH_BEGIN;
1415
RTC_TRACE(rtcSetGeometryInstancedScene);
1416
RTC_VERIFY_HANDLE(hgeometry);
1417
RTC_VERIFY_HANDLE(hscene);
1418
RTC_ENTER_DEVICE(hgeometry);
1419
geometry->setInstancedScene(scene);
1420
RTC_CATCH_END2(geometry);
1421
}
1422
1423
RTC_API void rtcSetGeometryInstancedScenes(RTCGeometry hgeometry, RTCScene* scenes, size_t numScenes)
1424
{
1425
Geometry* geometry = (Geometry*) hgeometry;
1426
RTC_CATCH_BEGIN;
1427
RTC_TRACE(rtcSetGeometryInstancedScene);
1428
RTC_VERIFY_HANDLE(hgeometry);
1429
RTC_VERIFY_HANDLE(scenes);
1430
RTC_ENTER_DEVICE(hgeometry);
1431
geometry->setInstancedScenes(scenes, numScenes);
1432
RTC_CATCH_END2(geometry);
1433
}
1434
1435
AffineSpace3fa loadTransform(RTCFormat format, const float* xfm)
1436
{
1437
AffineSpace3fa space = one;
1438
switch (format)
1439
{
1440
case RTC_FORMAT_FLOAT3X4_ROW_MAJOR:
1441
space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 4], xfm[ 8]),
1442
Vec3fa(xfm[ 1], xfm[ 5], xfm[ 9]),
1443
Vec3fa(xfm[ 2], xfm[ 6], xfm[10]),
1444
Vec3fa(xfm[ 3], xfm[ 7], xfm[11]));
1445
break;
1446
1447
case RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR:
1448
space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 1], xfm[ 2]),
1449
Vec3fa(xfm[ 3], xfm[ 4], xfm[ 5]),
1450
Vec3fa(xfm[ 6], xfm[ 7], xfm[ 8]),
1451
Vec3fa(xfm[ 9], xfm[10], xfm[11]));
1452
break;
1453
1454
case RTC_FORMAT_FLOAT4X4_COLUMN_MAJOR:
1455
space = AffineSpace3fa(Vec3fa(xfm[ 0], xfm[ 1], xfm[ 2]),
1456
Vec3fa(xfm[ 4], xfm[ 5], xfm[ 6]),
1457
Vec3fa(xfm[ 8], xfm[ 9], xfm[10]),
1458
Vec3fa(xfm[12], xfm[13], xfm[14]));
1459
break;
1460
1461
default:
1462
throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid matrix format");
1463
break;
1464
}
1465
return space;
1466
}
1467
1468
RTC_API void rtcSetGeometryTransform(RTCGeometry hgeometry, unsigned int timeStep, RTCFormat format, const void* xfm)
1469
{
1470
Geometry* geometry = (Geometry*) hgeometry;
1471
RTC_CATCH_BEGIN;
1472
RTC_TRACE(rtcSetGeometryTransform);
1473
RTC_VERIFY_HANDLE(hgeometry);
1474
RTC_VERIFY_HANDLE(xfm);
1475
RTC_ENTER_DEVICE(hgeometry);
1476
const AffineSpace3fa transform = loadTransform(format, (const float*)xfm);
1477
geometry->setTransform(transform, timeStep);
1478
RTC_CATCH_END2(geometry);
1479
}
1480
1481
RTC_API void rtcSetGeometryTransformQuaternion(RTCGeometry hgeometry, unsigned int timeStep, const RTCQuaternionDecomposition* qd)
1482
{
1483
Geometry* geometry = (Geometry*) hgeometry;
1484
RTC_CATCH_BEGIN;
1485
RTC_TRACE(rtcSetGeometryTransformQuaternion);
1486
RTC_VERIFY_HANDLE(hgeometry);
1487
RTC_VERIFY_HANDLE(qd);
1488
RTC_ENTER_DEVICE(hgeometry);
1489
1490
AffineSpace3fx transform;
1491
transform.l.vx.x = qd->scale_x;
1492
transform.l.vy.y = qd->scale_y;
1493
transform.l.vz.z = qd->scale_z;
1494
transform.l.vy.x = qd->skew_xy;
1495
transform.l.vz.x = qd->skew_xz;
1496
transform.l.vz.y = qd->skew_yz;
1497
transform.l.vx.y = qd->translation_x;
1498
transform.l.vx.z = qd->translation_y;
1499
transform.l.vy.z = qd->translation_z;
1500
transform.p.x = qd->shift_x;
1501
transform.p.y = qd->shift_y;
1502
transform.p.z = qd->shift_z;
1503
1504
// normalize quaternion
1505
Quaternion3f q(qd->quaternion_r, qd->quaternion_i, qd->quaternion_j, qd->quaternion_k);
1506
q = normalize(q);
1507
transform.l.vx.w = q.i;
1508
transform.l.vy.w = q.j;
1509
transform.l.vz.w = q.k;
1510
transform.p.w = q.r;
1511
1512
geometry->setQuaternionDecomposition(transform, timeStep);
1513
RTC_CATCH_END2(geometry);
1514
}
1515
1516
RTC_API void rtcGetGeometryTransform(RTCGeometry hgeometry, float time, RTCFormat format, void* xfm)
1517
{
1518
Geometry* geometry = (Geometry*) hgeometry;
1519
RTC_CATCH_BEGIN;
1520
RTC_TRACE(rtcGetGeometryTransform);
1521
//RTC_ENTER_DEVICE(hgeometry); // no allocation required
1522
const AffineSpace3fa transform = geometry->getTransform(time);
1523
storeTransform(transform, format, (float*)xfm);
1524
RTC_CATCH_END2(geometry);
1525
}
1526
1527
RTC_API void rtcGetGeometryTransformEx(RTCGeometry hgeometry, unsigned int instPrimID, float time, RTCFormat format, void* xfm)
1528
{
1529
Geometry* geometry = (Geometry*) hgeometry;
1530
RTC_CATCH_BEGIN;
1531
RTC_TRACE(rtcGetGeometryTransformEx);
1532
//RTC_ENTER_DEVICE(hgeometry); // no allocation required
1533
const AffineSpace3fa transform = geometry->getTransform(instPrimID, time);
1534
storeTransform(transform, format, (float*)xfm);
1535
RTC_CATCH_END2(geometry);
1536
}
1537
1538
RTC_API void rtcGetGeometryTransformFromScene(RTCScene hscene, unsigned int geomID, float time, RTCFormat format, void* xfm)
1539
{
1540
Scene* scene = (Scene*) hscene;
1541
RTC_CATCH_BEGIN;
1542
RTC_TRACE(rtcGetGeometryTransformFromScene);
1543
//RTC_ENTER_DEVICE(hscene); // no allocation required
1544
const AffineSpace3fa transform = scene->get(geomID)->getTransform(time);
1545
storeTransform(transform, format, (float*)xfm);
1546
RTC_CATCH_END2(scene);
1547
}
1548
1549
RTC_API void rtcGetGeometryTransformFromTraversable(RTCTraversable htraversable, unsigned int geomID, float time, RTCFormat format, void* xfm)
1550
{
1551
rtcGetGeometryTransformFromScene((RTCScene)htraversable, geomID, time, format, xfm);
1552
}
1553
1554
RTC_API void rtcInvokeIntersectFilterFromGeometry(const struct RTCIntersectFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
1555
{
1556
IntersectFunctionNArguments* args = (IntersectFunctionNArguments*) args_i;
1557
if (args->geometry->intersectionFilterN)
1558
args->geometry->intersectionFilterN(filter_args);
1559
}
1560
1561
RTC_API void rtcInvokeOccludedFilterFromGeometry(const struct RTCOccludedFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
1562
{
1563
OccludedFunctionNArguments* args = (OccludedFunctionNArguments*) args_i;
1564
if (args->geometry->occlusionFilterN)
1565
args->geometry->occlusionFilterN(filter_args);
1566
}
1567
1568
RTC_API RTCGeometry rtcNewGeometry (RTCDevice hdevice, RTCGeometryType type)
1569
{
1570
Device* device = (Device*) hdevice;
1571
RTC_CATCH_BEGIN;
1572
RTC_TRACE(rtcNewGeometry);
1573
RTC_ENTER_DEVICE(hdevice);
1574
RTC_VERIFY_HANDLE(hdevice);
1575
1576
switch (type)
1577
{
1578
case RTC_GEOMETRY_TYPE_TRIANGLE:
1579
{
1580
#if defined(EMBREE_GEOMETRY_TRIANGLE)
1581
createTriangleMeshTy createTriangleMesh = nullptr;
1582
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createTriangleMesh);
1583
Geometry* geom = createTriangleMesh(device);
1584
return (RTCGeometry) geom->refInc();
1585
#else
1586
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_TRIANGLE is not supported");
1587
#endif
1588
}
1589
1590
case RTC_GEOMETRY_TYPE_QUAD:
1591
{
1592
#if defined(EMBREE_GEOMETRY_QUAD)
1593
createQuadMeshTy createQuadMesh = nullptr;
1594
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createQuadMesh);
1595
Geometry* geom = createQuadMesh(device);
1596
return (RTCGeometry) geom->refInc();
1597
#else
1598
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_QUAD is not supported");
1599
#endif
1600
}
1601
1602
case RTC_GEOMETRY_TYPE_SPHERE_POINT:
1603
case RTC_GEOMETRY_TYPE_DISC_POINT:
1604
case RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT:
1605
{
1606
#if defined(EMBREE_GEOMETRY_POINT)
1607
createPointsTy createPoints = nullptr;
1608
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_builder_cpu_features, createPoints);
1609
1610
Geometry *geom;
1611
switch(type) {
1612
case RTC_GEOMETRY_TYPE_SPHERE_POINT:
1613
geom = createPoints(device, Geometry::GTY_SPHERE_POINT);
1614
break;
1615
case RTC_GEOMETRY_TYPE_DISC_POINT:
1616
geom = createPoints(device, Geometry::GTY_DISC_POINT);
1617
break;
1618
case RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT:
1619
geom = createPoints(device, Geometry::GTY_ORIENTED_DISC_POINT);
1620
break;
1621
default:
1622
geom = nullptr;
1623
break;
1624
}
1625
return (RTCGeometry) geom->refInc();
1626
#else
1627
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_POINT is not supported");
1628
#endif
1629
}
1630
1631
case RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE:
1632
case RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE:
1633
case RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE:
1634
1635
case RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE:
1636
case RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE:
1637
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE:
1638
1639
case RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE:
1640
case RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE:
1641
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE:
1642
1643
case RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE:
1644
case RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE:
1645
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE:
1646
1647
case RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE:
1648
case RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE:
1649
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE:
1650
{
1651
#if defined(EMBREE_GEOMETRY_CURVE)
1652
createLineSegmentsTy createLineSegments = nullptr;
1653
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createLineSegments);
1654
createCurvesTy createCurves = nullptr;
1655
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createCurves);
1656
1657
Geometry* geom;
1658
switch (type) {
1659
case RTC_GEOMETRY_TYPE_CONE_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_CONE_LINEAR_CURVE); break;
1660
case RTC_GEOMETRY_TYPE_ROUND_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_ROUND_LINEAR_CURVE); break;
1661
case RTC_GEOMETRY_TYPE_FLAT_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_FLAT_LINEAR_CURVE); break;
1662
//case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_LINEAR_CURVE : geom = createLineSegments (device,Geometry::GTY_ORIENTED_LINEAR_CURVE); break;
1663
1664
case RTC_GEOMETRY_TYPE_ROUND_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_BEZIER_CURVE); break;
1665
case RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_BEZIER_CURVE); break;
1666
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BEZIER_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_BEZIER_CURVE); break;
1667
1668
case RTC_GEOMETRY_TYPE_ROUND_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_BSPLINE_CURVE); break;
1669
case RTC_GEOMETRY_TYPE_FLAT_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_BSPLINE_CURVE); break;
1670
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_BSPLINE_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_BSPLINE_CURVE); break;
1671
1672
case RTC_GEOMETRY_TYPE_ROUND_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_HERMITE_CURVE); break;
1673
case RTC_GEOMETRY_TYPE_FLAT_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_HERMITE_CURVE); break;
1674
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_HERMITE_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_HERMITE_CURVE); break;
1675
1676
case RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_ROUND_CATMULL_ROM_CURVE); break;
1677
case RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_FLAT_CATMULL_ROM_CURVE); break;
1678
case RTC_GEOMETRY_TYPE_NORMAL_ORIENTED_CATMULL_ROM_CURVE : geom = createCurves(device,Geometry::GTY_ORIENTED_CATMULL_ROM_CURVE); break;
1679
default: geom = nullptr; break;
1680
}
1681
return (RTCGeometry) geom->refInc();
1682
#else
1683
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_CURVE is not supported");
1684
#endif
1685
}
1686
1687
case RTC_GEOMETRY_TYPE_SUBDIVISION:
1688
{
1689
#if defined(EMBREE_GEOMETRY_SUBDIVISION)
1690
createSubdivMeshTy createSubdivMesh = nullptr;
1691
SELECT_SYMBOL_DEFAULT_AVX(device->enabled_cpu_features,createSubdivMesh);
1692
//SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createSubdivMesh); // FIXME: this does not work for some reason?
1693
Geometry* geom = createSubdivMesh(device);
1694
return (RTCGeometry) geom->refInc();
1695
#else
1696
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_SUBDIVISION is not supported");
1697
#endif
1698
}
1699
1700
case RTC_GEOMETRY_TYPE_USER:
1701
{
1702
#if defined(EMBREE_GEOMETRY_USER)
1703
createUserGeometryTy createUserGeometry = nullptr;
1704
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createUserGeometry);
1705
Geometry* geom = createUserGeometry(device);
1706
return (RTCGeometry) geom->refInc();
1707
#else
1708
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_USER is not supported");
1709
#endif
1710
}
1711
1712
case RTC_GEOMETRY_TYPE_INSTANCE:
1713
{
1714
#if defined(EMBREE_GEOMETRY_INSTANCE)
1715
createInstanceTy createInstance = nullptr;
1716
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createInstance);
1717
Geometry* geom = createInstance(device);
1718
return (RTCGeometry) geom->refInc();
1719
#else
1720
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_INSTANCE is not supported");
1721
#endif
1722
}
1723
1724
case RTC_GEOMETRY_TYPE_INSTANCE_ARRAY:
1725
{
1726
#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
1727
createInstanceArrayTy createInstanceArray = nullptr;
1728
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createInstanceArray);
1729
Geometry* geom = createInstanceArray(device);
1730
return (RTCGeometry) geom->refInc();
1731
#else
1732
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_INSTANCE_ARRAY is not supported");
1733
#endif
1734
}
1735
1736
case RTC_GEOMETRY_TYPE_GRID:
1737
{
1738
#if defined(EMBREE_GEOMETRY_GRID)
1739
createGridMeshTy createGridMesh = nullptr;
1740
SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createGridMesh);
1741
Geometry* geom = createGridMesh(device);
1742
return (RTCGeometry) geom->refInc();
1743
#else
1744
throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_GRID is not supported");
1745
#endif
1746
}
1747
1748
default:
1749
throw_RTCError(RTC_ERROR_UNKNOWN,"invalid geometry type");
1750
}
1751
1752
RTC_CATCH_END(device);
1753
return nullptr;
1754
}
1755
1756
RTC_API void rtcSetGeometryUserPrimitiveCount(RTCGeometry hgeometry, unsigned int userPrimitiveCount)
1757
{
1758
Geometry* geometry = (Geometry*) hgeometry;
1759
RTC_CATCH_BEGIN;
1760
RTC_TRACE(rtcSetGeometryUserPrimitiveCount);
1761
RTC_VERIFY_HANDLE(hgeometry);
1762
RTC_ENTER_DEVICE(hgeometry);
1763
1764
if (unlikely(geometry->getType() != Geometry::GTY_USER_GEOMETRY))
1765
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation only allowed for user geometries");
1766
1767
geometry->setNumPrimitives(userPrimitiveCount);
1768
RTC_CATCH_END2(geometry);
1769
}
1770
1771
RTC_API void rtcSetGeometryTimeStepCount(RTCGeometry hgeometry, unsigned int timeStepCount)
1772
{
1773
Geometry* geometry = (Geometry*) hgeometry;
1774
RTC_CATCH_BEGIN;
1775
RTC_TRACE(rtcSetGeometryTimeStepCount);
1776
RTC_VERIFY_HANDLE(hgeometry);
1777
RTC_ENTER_DEVICE(hgeometry);
1778
1779
if (timeStepCount > RTC_MAX_TIME_STEP_COUNT)
1780
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"number of time steps is out of range");
1781
1782
geometry->setNumTimeSteps(timeStepCount);
1783
RTC_CATCH_END2(geometry);
1784
}
1785
1786
RTC_API void rtcSetGeometryTimeRange(RTCGeometry hgeometry, float startTime, float endTime)
1787
{
1788
Ref<Geometry> geometry = (Geometry*) hgeometry;
1789
RTC_CATCH_BEGIN;
1790
RTC_TRACE(rtcSetGeometryTimeRange);
1791
RTC_VERIFY_HANDLE(hgeometry);
1792
RTC_ENTER_DEVICE(hgeometry);
1793
1794
if (startTime > endTime)
1795
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"startTime has to be smaller or equal to the endTime");
1796
1797
geometry->setTimeRange(BBox1f(startTime,endTime));
1798
RTC_CATCH_END2(geometry);
1799
}
1800
1801
RTC_API void rtcSetGeometryVertexAttributeCount(RTCGeometry hgeometry, unsigned int N)
1802
{
1803
Geometry* geometry = (Geometry*) hgeometry;
1804
RTC_CATCH_BEGIN;
1805
RTC_TRACE(rtcSetGeometryVertexAttributeCount);
1806
RTC_VERIFY_HANDLE(hgeometry);
1807
RTC_ENTER_DEVICE(hgeometry);
1808
geometry->setVertexAttributeCount(N);
1809
RTC_CATCH_END2(geometry);
1810
}
1811
1812
RTC_API void rtcSetGeometryTopologyCount(RTCGeometry hgeometry, unsigned int N)
1813
{
1814
Geometry* geometry = (Geometry*) hgeometry;
1815
RTC_CATCH_BEGIN;
1816
RTC_TRACE(rtcSetGeometryTopologyCount);
1817
RTC_VERIFY_HANDLE(hgeometry);
1818
RTC_ENTER_DEVICE(hgeometry);
1819
geometry->setTopologyCount(N);
1820
RTC_CATCH_END2(geometry);
1821
}
1822
1823
RTC_API void rtcSetGeometryBuildQuality (RTCGeometry hgeometry, RTCBuildQuality quality)
1824
{
1825
Geometry* geometry = (Geometry*) hgeometry;
1826
RTC_CATCH_BEGIN;
1827
RTC_TRACE(rtcSetGeometryBuildQuality);
1828
RTC_VERIFY_HANDLE(hgeometry);
1829
RTC_ENTER_DEVICE(hgeometry);
1830
if (quality != RTC_BUILD_QUALITY_LOW &&
1831
quality != RTC_BUILD_QUALITY_MEDIUM &&
1832
quality != RTC_BUILD_QUALITY_HIGH &&
1833
quality != RTC_BUILD_QUALITY_REFIT)
1834
abort(); //throw std::runtime_error("invalid build quality");
1835
geometry->setBuildQuality(quality);
1836
RTC_CATCH_END2(geometry);
1837
}
1838
1839
RTC_API void rtcSetGeometryMaxRadiusScale(RTCGeometry hgeometry, float maxRadiusScale)
1840
{
1841
Geometry* geometry = (Geometry*) hgeometry;
1842
RTC_CATCH_BEGIN;
1843
RTC_TRACE(rtcSetGeometryMaxRadiusScale);
1844
RTC_VERIFY_HANDLE(hgeometry);
1845
#if RTC_MIN_WIDTH
1846
if (maxRadiusScale < 1.0f) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"maximal radius scale has to be larger or equal to 1");
1847
geometry->setMaxRadiusScale(maxRadiusScale);
1848
#else
1849
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"min-width feature is not enabled");
1850
#endif
1851
RTC_CATCH_END2(geometry);
1852
}
1853
1854
RTC_API void rtcSetGeometryMask (RTCGeometry hgeometry, unsigned int mask)
1855
{
1856
Geometry* geometry = (Geometry*) hgeometry;
1857
RTC_CATCH_BEGIN;
1858
RTC_TRACE(rtcSetGeometryMask);
1859
RTC_VERIFY_HANDLE(hgeometry);
1860
RTC_ENTER_DEVICE(hgeometry);
1861
geometry->setMask(mask);
1862
RTC_CATCH_END2(geometry);
1863
}
1864
1865
RTC_API void rtcSetGeometrySubdivisionMode (RTCGeometry hgeometry, unsigned topologyID, RTCSubdivisionMode mode)
1866
{
1867
Geometry* geometry = (Geometry*) hgeometry;
1868
RTC_CATCH_BEGIN;
1869
RTC_TRACE(rtcSetGeometrySubdivisionMode);
1870
RTC_VERIFY_HANDLE(hgeometry);
1871
RTC_ENTER_DEVICE(hgeometry);
1872
geometry->setSubdivisionMode(topologyID,mode);
1873
RTC_CATCH_END2(geometry);
1874
}
1875
1876
RTC_API void rtcSetGeometryVertexAttributeTopology(RTCGeometry hgeometry, unsigned int vertexAttributeID, unsigned int topologyID)
1877
{
1878
Geometry* geometry = (Geometry*) hgeometry;
1879
RTC_CATCH_BEGIN;
1880
RTC_TRACE(rtcSetGeometryVertexAttributeTopology);
1881
RTC_VERIFY_HANDLE(hgeometry);
1882
RTC_ENTER_DEVICE(hgeometry);
1883
geometry->setVertexAttributeTopology(vertexAttributeID, topologyID);
1884
RTC_CATCH_END2(geometry);
1885
}
1886
1887
RTC_API void rtcSetGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, RTCBuffer hbuffer, size_t byteOffset, size_t byteStride, size_t itemCount)
1888
{
1889
Geometry* geometry = (Geometry*) hgeometry;
1890
Ref<Buffer> buffer = (Buffer*)hbuffer;
1891
RTC_CATCH_BEGIN;
1892
RTC_TRACE(rtcSetGeometryBuffer);
1893
RTC_VERIFY_HANDLE(hgeometry);
1894
RTC_VERIFY_HANDLE(hbuffer);
1895
RTC_ENTER_DEVICE(hgeometry);
1896
1897
if (geometry->device != buffer->device)
1898
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
1899
1900
if (itemCount > 0xFFFFFFFFu)
1901
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
1902
1903
geometry->setBuffer(type, slot, format, buffer, byteOffset, byteStride, (unsigned int)itemCount);
1904
RTC_CATCH_END2(geometry);
1905
}
1906
1907
RTC_API void rtcSetSharedGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, const void* ptr, size_t byteOffset, size_t byteStride, size_t itemCount)
1908
{
1909
Geometry* geometry = (Geometry*) hgeometry;
1910
RTC_CATCH_BEGIN;
1911
RTC_TRACE(rtcSetSharedGeometryBuffer);
1912
RTC_VERIFY_HANDLE(hgeometry);
1913
RTC_ENTER_DEVICE(hgeometry);
1914
1915
if (itemCount > 0xFFFFFFFFu)
1916
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
1917
1918
Ref<Buffer> buffer = new Buffer(geometry->device, itemCount*byteStride, (char*)ptr + byteOffset);
1919
geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);
1920
RTC_CATCH_END2(geometry);
1921
}
1922
1923
RTC_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)
1924
{
1925
Geometry* geometry = (Geometry*) hgeometry;
1926
RTC_CATCH_BEGIN;
1927
RTC_TRACE(rtcSetSharedGeometryBufferHostDevice);
1928
RTC_VERIFY_HANDLE(hgeometry);
1929
RTC_ENTER_DEVICE(hgeometry);
1930
1931
#if defined(EMBREE_SYCL_SUPPORT)
1932
if (geometry->device->is_gpu())
1933
{
1934
if (itemCount > 0xFFFFFFFFu)
1935
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
1936
1937
if ((ptr == nullptr) || (dptr == nullptr))
1938
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"host and device pointer may not be NULL pointers when using SYCL devices");
1939
1940
Ref<Buffer> buffer = new Buffer(geometry->device, itemCount*byteStride, (char*)ptr + byteOffset, (char*)dptr + byteOffset);
1941
geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);
1942
}
1943
else
1944
#endif
1945
{
1946
if (dptr != nullptr)
1947
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"Embree device is no SYCL device. Device pointer argument must not be valid, pass NULL instead");
1948
rtcSetSharedGeometryBuffer(hgeometry, type, slot, format, ptr, byteOffset, byteStride, itemCount);
1949
}
1950
1951
RTC_CATCH_END2(geometry);
1952
}
1953
1954
RTC_API void* rtcSetNewGeometryBuffer(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount)
1955
{
1956
Geometry* geometry = (Geometry*) hgeometry;
1957
RTC_CATCH_BEGIN;
1958
RTC_TRACE(rtcSetNewGeometryBuffer);
1959
RTC_VERIFY_HANDLE(hgeometry);
1960
RTC_ENTER_DEVICE(hgeometry);
1961
1962
if (itemCount > 0xFFFFFFFFu)
1963
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
1964
1965
/* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */
1966
size_t bytes = itemCount*byteStride;
1967
if (type == RTC_BUFFER_TYPE_VERTEX || type == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE)
1968
bytes += (16 - (byteStride%16))%16;
1969
1970
Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr);
1971
geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);
1972
return buffer->data();
1973
RTC_CATCH_END2(geometry);
1974
return nullptr;
1975
}
1976
1977
RTC_API void rtcSetNewGeometryBufferHostDevice(RTCGeometry hgeometry, RTCBufferType bufferType, unsigned int slot, RTCFormat format, size_t byteStride, size_t itemCount, void** ptr, void** dptr)
1978
{
1979
Geometry* geometry = (Geometry*) hgeometry;
1980
RTC_CATCH_BEGIN;
1981
RTC_TRACE(rtcSetNewGeometryBufferHostDevice);
1982
RTC_VERIFY_HANDLE(hgeometry);
1983
RTC_ENTER_DEVICE(hgeometry);
1984
1985
#if defined(EMBREE_SYCL_SUPPORT)
1986
if (geometry->device->is_gpu())
1987
{
1988
if (itemCount > 0xFFFFFFFFu)
1989
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
1990
1991
/* vertex buffers need to get overallocated slightly as elements are accessed using SSE loads */
1992
size_t bytes = itemCount*byteStride;
1993
if (bufferType == RTC_BUFFER_TYPE_VERTEX || bufferType == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE)
1994
bytes += (16 - (byteStride%16))%16;
1995
1996
Ref<Buffer> buffer = new Buffer(geometry->device, bytes, nullptr, nullptr);
1997
geometry->setBuffer(bufferType, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);
1998
1999
if(ptr)
2000
*ptr = buffer->getHostPtr();
2001
if (dptr)
2002
*dptr = buffer->getDevicePtr();
2003
}
2004
else
2005
#endif
2006
{
2007
void* tmp = rtcSetNewGeometryBuffer(hgeometry, bufferType, slot, format, byteStride, itemCount);
2008
if(ptr)
2009
*ptr = tmp;
2010
if (dptr) {
2011
*dptr = tmp;
2012
}
2013
}
2014
2015
RTC_CATCH_END2(geometry);
2016
}
2017
2018
RTC_API void* rtcGetGeometryBufferData(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)
2019
{
2020
Geometry* geometry = (Geometry*) hgeometry;
2021
RTC_CATCH_BEGIN;
2022
RTC_TRACE(rtcGetGeometryBufferData);
2023
RTC_VERIFY_HANDLE(hgeometry);
2024
RTC_ENTER_DEVICE(hgeometry);
2025
return geometry->getBufferData(type, slot, BufferDataPointerType::HOST);
2026
RTC_CATCH_END2(geometry);
2027
return nullptr;
2028
}
2029
2030
RTC_API void* rtcGetGeometryBufferDataDevice(RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)
2031
{
2032
Geometry* geometry = (Geometry*) hgeometry;
2033
RTC_CATCH_BEGIN;
2034
RTC_TRACE(rtcGetGeometryBufferDataDevice);
2035
RTC_VERIFY_HANDLE(hgeometry);
2036
RTC_ENTER_DEVICE(hgeometry);
2037
return geometry->getBufferData(type, slot, BufferDataPointerType::DEVICE);
2038
RTC_CATCH_END2(geometry);
2039
return nullptr;
2040
}
2041
2042
RTC_API void rtcEnableGeometry (RTCGeometry hgeometry)
2043
{
2044
Geometry* geometry = (Geometry*) hgeometry;
2045
RTC_CATCH_BEGIN;
2046
RTC_TRACE(rtcEnableGeometry);
2047
RTC_VERIFY_HANDLE(hgeometry);
2048
RTC_ENTER_DEVICE(hgeometry);
2049
geometry->enable();
2050
RTC_CATCH_END2(geometry);
2051
}
2052
2053
RTC_API void rtcUpdateGeometryBuffer (RTCGeometry hgeometry, RTCBufferType type, unsigned int slot)
2054
{
2055
Geometry* geometry = (Geometry*) hgeometry;
2056
RTC_CATCH_BEGIN;
2057
RTC_TRACE(rtcUpdateGeometryBuffer);
2058
RTC_VERIFY_HANDLE(hgeometry);
2059
RTC_ENTER_DEVICE(hgeometry);
2060
geometry->updateBuffer(type, slot);
2061
RTC_CATCH_END2(geometry);
2062
}
2063
2064
RTC_API void rtcDisableGeometry (RTCGeometry hgeometry)
2065
{
2066
Geometry* geometry = (Geometry*) hgeometry;
2067
RTC_CATCH_BEGIN;
2068
RTC_TRACE(rtcDisableGeometry);
2069
RTC_VERIFY_HANDLE(hgeometry);
2070
RTC_ENTER_DEVICE(hgeometry);
2071
geometry->disable();
2072
RTC_CATCH_END2(geometry);
2073
}
2074
2075
RTC_API void rtcSetGeometryTessellationRate (RTCGeometry hgeometry, float tessellationRate)
2076
{
2077
Geometry* geometry = (Geometry*) hgeometry;
2078
RTC_CATCH_BEGIN;
2079
RTC_TRACE(rtcSetGeometryTessellationRate);
2080
RTC_VERIFY_HANDLE(hgeometry);
2081
RTC_ENTER_DEVICE(hgeometry);
2082
geometry->setTessellationRate(tessellationRate);
2083
RTC_CATCH_END2(geometry);
2084
}
2085
2086
RTC_API void rtcSetGeometryUserData (RTCGeometry hgeometry, void* ptr)
2087
{
2088
Geometry* geometry = (Geometry*) hgeometry;
2089
RTC_CATCH_BEGIN;
2090
RTC_TRACE(rtcSetGeometryUserData);
2091
RTC_VERIFY_HANDLE(hgeometry);
2092
RTC_ENTER_DEVICE(hgeometry);
2093
geometry->setUserData(ptr);
2094
RTC_CATCH_END2(geometry);
2095
}
2096
2097
RTC_API void* rtcGetGeometryUserData (RTCGeometry hgeometry)
2098
{
2099
Geometry* geometry = (Geometry*) hgeometry; // no ref counting here!
2100
RTC_CATCH_BEGIN;
2101
RTC_TRACE(rtcGetGeometryUserData);
2102
RTC_VERIFY_HANDLE(hgeometry);
2103
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons !
2104
return geometry->getUserData();
2105
RTC_CATCH_END2(geometry);
2106
return nullptr;
2107
}
2108
2109
RTC_API void* rtcGetGeometryUserDataFromScene (RTCScene hscene, unsigned int geomID)
2110
{
2111
Scene* scene = (Scene*) hscene;
2112
RTC_CATCH_BEGIN;
2113
RTC_TRACE(rtcGetGeometryUserDataFromScene);
2114
#if defined(DEBUG)
2115
RTC_VERIFY_HANDLE(hscene);
2116
RTC_VERIFY_GEOMID(geomID);
2117
#endif
2118
//RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons
2119
return scene->get(geomID)->getUserData();
2120
RTC_CATCH_END2(scene);
2121
return nullptr;
2122
}
2123
2124
RTC_API void* rtcGetGeometryUserDataFromTraversable (RTCTraversable htraversable, unsigned int geomID)
2125
{
2126
return rtcGetGeometryUserDataFromScene((RTCScene)htraversable, geomID);
2127
}
2128
2129
RTC_API void rtcSetGeometryBoundsFunction (RTCGeometry hgeometry, RTCBoundsFunction bounds, void* userPtr)
2130
{
2131
Geometry* geometry = (Geometry*) hgeometry;
2132
RTC_CATCH_BEGIN;
2133
RTC_TRACE(rtcSetGeometryBoundsFunction);
2134
RTC_VERIFY_HANDLE(hgeometry);
2135
RTC_ENTER_DEVICE(hgeometry);
2136
geometry->setBoundsFunction(bounds,userPtr);
2137
RTC_CATCH_END2(geometry);
2138
}
2139
2140
RTC_API void rtcSetGeometryDisplacementFunction (RTCGeometry hgeometry, RTCDisplacementFunctionN displacement)
2141
{
2142
Geometry* geometry = (Geometry*) hgeometry;
2143
RTC_CATCH_BEGIN;
2144
RTC_TRACE(rtcSetGeometryDisplacementFunction);
2145
RTC_VERIFY_HANDLE(hgeometry);
2146
RTC_ENTER_DEVICE(hgeometry);
2147
geometry->setDisplacementFunction(displacement);
2148
RTC_CATCH_END2(geometry);
2149
}
2150
2151
RTC_API void rtcSetGeometryIntersectFunction (RTCGeometry hgeometry, RTCIntersectFunctionN intersect)
2152
{
2153
Geometry* geometry = (Geometry*) hgeometry;
2154
RTC_CATCH_BEGIN;
2155
RTC_TRACE(rtcSetGeometryIntersectFunction);
2156
RTC_VERIFY_HANDLE(hgeometry);
2157
RTC_ENTER_DEVICE(hgeometry);
2158
geometry->setIntersectFunctionN(intersect);
2159
RTC_CATCH_END2(geometry);
2160
}
2161
2162
RTC_API void rtcSetGeometryPointQueryFunction(RTCGeometry hgeometry, RTCPointQueryFunction pointQuery)
2163
{
2164
Geometry* geometry = (Geometry*) hgeometry;
2165
RTC_CATCH_BEGIN;
2166
RTC_TRACE(rtcSetGeometryPointQueryFunction);
2167
RTC_VERIFY_HANDLE(hgeometry);
2168
RTC_ENTER_DEVICE(hgeometry);
2169
geometry->setPointQueryFunction(pointQuery);
2170
RTC_CATCH_END2(geometry);
2171
}
2172
2173
RTC_API unsigned int rtcGetGeometryFirstHalfEdge(RTCGeometry hgeometry, unsigned int faceID)
2174
{
2175
Geometry* geometry = (Geometry*) hgeometry;
2176
RTC_CATCH_BEGIN;
2177
RTC_TRACE(rtcGetGeometryFirstHalfEdge);
2178
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2179
return geometry->getFirstHalfEdge(faceID);
2180
RTC_CATCH_END2(geometry);
2181
return -1;
2182
}
2183
2184
RTC_API unsigned int rtcGetGeometryFace(RTCGeometry hgeometry, unsigned int edgeID)
2185
{
2186
Geometry* geometry = (Geometry*) hgeometry;
2187
RTC_CATCH_BEGIN;
2188
RTC_TRACE(rtcGetGeometryFace);
2189
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2190
return geometry->getFace(edgeID);
2191
RTC_CATCH_END2(geometry);
2192
return -1;
2193
}
2194
2195
RTC_API unsigned int rtcGetGeometryNextHalfEdge(RTCGeometry hgeometry, unsigned int edgeID)
2196
{
2197
Geometry* geometry = (Geometry*) hgeometry;
2198
RTC_CATCH_BEGIN;
2199
RTC_TRACE(rtcGetGeometryNextHalfEdge);
2200
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2201
return geometry->getNextHalfEdge(edgeID);
2202
RTC_CATCH_END2(geometry);
2203
return -1;
2204
}
2205
2206
RTC_API unsigned int rtcGetGeometryPreviousHalfEdge(RTCGeometry hgeometry, unsigned int edgeID)
2207
{
2208
Geometry* geometry = (Geometry*) hgeometry;
2209
RTC_CATCH_BEGIN;
2210
RTC_TRACE(rtcGetGeometryPreviousHalfEdge);
2211
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2212
return geometry->getPreviousHalfEdge(edgeID);
2213
RTC_CATCH_END2(geometry);
2214
return -1;
2215
}
2216
2217
RTC_API unsigned int rtcGetGeometryOppositeHalfEdge(RTCGeometry hgeometry, unsigned int topologyID, unsigned int edgeID)
2218
{
2219
Geometry* geometry = (Geometry*) hgeometry;
2220
RTC_CATCH_BEGIN;
2221
RTC_TRACE(rtcGetGeometryOppositeHalfEdge);
2222
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2223
return geometry->getOppositeHalfEdge(topologyID,edgeID);
2224
RTC_CATCH_END2(geometry);
2225
return -1;
2226
}
2227
2228
RTC_API void rtcSetGeometryOccludedFunction (RTCGeometry hgeometry, RTCOccludedFunctionN occluded)
2229
{
2230
Geometry* geometry = (Geometry*) hgeometry;
2231
RTC_CATCH_BEGIN;
2232
RTC_TRACE(rtcSetOccludedFunctionN);
2233
RTC_VERIFY_HANDLE(hgeometry);
2234
RTC_ENTER_DEVICE(hgeometry);
2235
geometry->setOccludedFunctionN(occluded);
2236
RTC_CATCH_END2(geometry);
2237
}
2238
2239
RTC_API void rtcSetGeometryIntersectFilterFunction (RTCGeometry hgeometry, RTCFilterFunctionN filter)
2240
{
2241
Geometry* geometry = (Geometry*) hgeometry;
2242
RTC_CATCH_BEGIN;
2243
RTC_TRACE(rtcSetGeometryIntersectFilterFunction);
2244
RTC_VERIFY_HANDLE(hgeometry);
2245
RTC_ENTER_DEVICE(hgeometry);
2246
geometry->setIntersectionFilterFunctionN(filter);
2247
RTC_CATCH_END2(geometry);
2248
}
2249
2250
RTC_API void rtcSetGeometryOccludedFilterFunction (RTCGeometry hgeometry, RTCFilterFunctionN filter)
2251
{
2252
Geometry* geometry = (Geometry*) hgeometry;
2253
RTC_CATCH_BEGIN;
2254
RTC_TRACE(rtcSetGeometryOccludedFilterFunction);
2255
RTC_VERIFY_HANDLE(hgeometry);
2256
RTC_ENTER_DEVICE(hgeometry);
2257
geometry->setOcclusionFilterFunctionN(filter);
2258
RTC_CATCH_END2(geometry);
2259
}
2260
2261
RTC_API void rtcSetGeometryEnableFilterFunctionFromArguments (RTCGeometry hgeometry, bool enable)
2262
{
2263
Geometry* geometry = (Geometry*) hgeometry;
2264
RTC_CATCH_BEGIN;
2265
RTC_TRACE(rtcSetGeometryEnableFilterFunctionFromArguments);
2266
RTC_VERIFY_HANDLE(hgeometry);
2267
RTC_ENTER_DEVICE(hgeometry);
2268
geometry->enableFilterFunctionFromArguments(enable);
2269
RTC_CATCH_END2(geometry);
2270
}
2271
2272
RTC_API void rtcInterpolate(const RTCInterpolateArguments* const args)
2273
{
2274
Geometry* geometry = (Geometry*) args->geometry;
2275
RTC_CATCH_BEGIN;
2276
RTC_TRACE(rtcInterpolate);
2277
#if defined(DEBUG)
2278
RTC_VERIFY_HANDLE(args->geometry);
2279
#endif
2280
//RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2281
geometry->interpolate(args);
2282
RTC_CATCH_END2(geometry);
2283
}
2284
2285
RTC_API void rtcInterpolateN(const RTCInterpolateNArguments* const args)
2286
{
2287
Geometry* geometry = (Geometry*) args->geometry;
2288
RTC_CATCH_BEGIN;
2289
RTC_TRACE(rtcInterpolateN);
2290
#if defined(DEBUG)
2291
RTC_VERIFY_HANDLE(args->geometry);
2292
#endif
2293
// RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
2294
geometry->interpolateN(args);
2295
RTC_CATCH_END2(geometry);
2296
}
2297
2298
RTC_API void rtcCommitGeometry (RTCGeometry hgeometry)
2299
{
2300
Geometry* geometry = (Geometry*) hgeometry;
2301
RTC_CATCH_BEGIN;
2302
RTC_TRACE(rtcCommitGeometry);
2303
RTC_VERIFY_HANDLE(hgeometry);
2304
RTC_ENTER_DEVICE(hgeometry);
2305
return geometry->commit();
2306
RTC_CATCH_END2(geometry);
2307
}
2308
2309
RTC_API unsigned int rtcAttachGeometry (RTCScene hscene, RTCGeometry hgeometry)
2310
{
2311
Scene* scene = (Scene*) hscene;
2312
Geometry* geometry = (Geometry*) hgeometry;
2313
RTC_CATCH_BEGIN;
2314
RTC_TRACE(rtcAttachGeometry);
2315
RTC_VERIFY_HANDLE(hscene);
2316
RTC_VERIFY_HANDLE(hgeometry);
2317
RTC_ENTER_DEVICE(hgeometry);
2318
if (scene->device != geometry->device)
2319
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
2320
return scene->bind(RTC_INVALID_GEOMETRY_ID,geometry);
2321
RTC_CATCH_END2(scene);
2322
return -1;
2323
}
2324
2325
RTC_API void rtcAttachGeometryByID (RTCScene hscene, RTCGeometry hgeometry, unsigned int geomID)
2326
{
2327
Scene* scene = (Scene*) hscene;
2328
Geometry* geometry = (Geometry*) hgeometry;
2329
RTC_CATCH_BEGIN;
2330
RTC_TRACE(rtcAttachGeometryByID);
2331
RTC_VERIFY_HANDLE(hscene);
2332
RTC_VERIFY_HANDLE(hgeometry);
2333
RTC_VERIFY_GEOMID(geomID);
2334
RTC_ENTER_DEVICE(hscene);
2335
if (scene->device != geometry->device)
2336
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
2337
scene->bind(geomID,geometry);
2338
RTC_CATCH_END2(scene);
2339
}
2340
2341
RTC_API void rtcDetachGeometry (RTCScene hscene, unsigned int geomID)
2342
{
2343
Scene* scene = (Scene*) hscene;
2344
RTC_CATCH_BEGIN;
2345
RTC_TRACE(rtcDetachGeometry);
2346
RTC_VERIFY_HANDLE(hscene);
2347
RTC_VERIFY_GEOMID(geomID);
2348
RTC_ENTER_DEVICE(hscene);
2349
scene->detachGeometry(geomID);
2350
RTC_CATCH_END2(scene);
2351
}
2352
2353
RTC_API void rtcRetainGeometry (RTCGeometry hgeometry)
2354
{
2355
Geometry* geometry = (Geometry*) hgeometry;
2356
RTC_CATCH_BEGIN;
2357
RTC_TRACE(rtcRetainGeometry);
2358
RTC_VERIFY_HANDLE(hgeometry);
2359
RTC_ENTER_DEVICE(hgeometry);
2360
geometry->refInc();
2361
RTC_CATCH_END2(geometry);
2362
}
2363
2364
RTC_API void rtcReleaseGeometry (RTCGeometry hgeometry)
2365
{
2366
Geometry* geometry = (Geometry*) hgeometry;
2367
RTC_CATCH_BEGIN;
2368
RTC_TRACE(rtcReleaseGeometry);
2369
RTC_VERIFY_HANDLE(hgeometry);
2370
RTC_ENTER_DEVICE(hgeometry);
2371
geometry->refDec();
2372
RTC_CATCH_END2(geometry);
2373
}
2374
2375
RTC_API RTCGeometry rtcGetGeometry (RTCScene hscene, unsigned int geomID)
2376
{
2377
Scene* scene = (Scene*) hscene;
2378
RTC_CATCH_BEGIN;
2379
RTC_TRACE(rtcGetGeometry);
2380
#if defined(DEBUG)
2381
RTC_VERIFY_HANDLE(hscene);
2382
RTC_VERIFY_GEOMID(geomID);
2383
#endif
2384
//RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons
2385
return (RTCGeometry) scene->get(geomID);
2386
RTC_CATCH_END2(scene);
2387
return nullptr;
2388
}
2389
2390
RTC_API RTCGeometry rtcGetGeometryThreadSafe (RTCScene hscene, unsigned int geomID)
2391
{
2392
Scene* scene = (Scene*) hscene;
2393
RTC_CATCH_BEGIN;
2394
RTC_TRACE(rtcGetGeometryThreadSafe);
2395
#if defined(DEBUG)
2396
RTC_VERIFY_HANDLE(hscene);
2397
RTC_VERIFY_GEOMID(geomID);
2398
#endif
2399
Ref<Geometry> geom = scene->get_locked(geomID);
2400
return (RTCGeometry) geom.ptr;
2401
RTC_CATCH_END2(scene);
2402
return nullptr;
2403
}
2404
2405
RTC_API const char* rtcGetErrorString(RTCError error)
2406
{
2407
RTC_CATCH_BEGIN;
2408
RTC_TRACE(rtcGetErrorString);
2409
return Device::getErrorString(error);
2410
RTC_CATCH_END(nullptr);
2411
return nullptr;
2412
}
2413
2414
2415
RTC_NAMESPACE_END
2416
2417