20 # include <embree3/rtcore_geometry.h>
41 "Object and Embree max motion steps inconsistent");
43 "Object and Geometry max motion steps inconsistent");
45 static size_t unaccounted_mem = 0;
47 static bool rtc_memory_monitor_func(
void *userPtr,
const ssize_t bytes,
const bool)
70 static void rtc_error_func(
void *,
enum RTCError,
const char *
str)
75 static double progress_start_time = 0.0;
77 static bool rtc_progress_func(
void *user_ptr,
const double n)
81 if (
time_dt() - progress_start_time < 0.25) {
87 progress_start_time =
time_dt();
92 BVHEmbree::BVHEmbree(
const BVHParams ¶ms_,
95 :
BVH(params_, geometry_, objects_),
98 build_quality(RTC_BUILD_QUALITY_REFIT)
103 BVHEmbree::~BVHEmbree()
106 rtcReleaseScene(
scene);
112 rtc_device = rtc_device_;
115 rtcSetDeviceErrorFunction(rtc_device, rtc_error_func,
NULL);
116 rtcSetDeviceMemoryMonitorFunction(rtc_device, rtc_memory_monitor_func, stats);
121 rtcReleaseScene(
scene);
126 const bool compact =
params.use_compact_structure;
128 scene = rtcNewScene(rtc_device);
129 const RTCSceneFlags scene_flags = (dynamic ? RTC_SCENE_FLAG_DYNAMIC : RTC_SCENE_FLAG_NONE) |
130 (compact ? RTC_SCENE_FLAG_COMPACT : RTC_SCENE_FLAG_NONE) |
131 RTC_SCENE_FLAG_ROBUST;
132 rtcSetSceneFlags(
scene, scene_flags);
133 build_quality = dynamic ? RTC_BUILD_QUALITY_LOW :
134 (
params.use_spatial_split ? RTC_BUILD_QUALITY_HIGH :
135 RTC_BUILD_QUALITY_MEDIUM);
136 rtcSetSceneBuildQuality(
scene, build_quality);
139 foreach (
Object *ob, objects) {
145 if (!ob->get_geometry()->is_instanced()) {
164 rtcSetSceneProgressMonitorFunction(
scene, rtc_progress_func, &progress);
165 rtcCommitScene(
scene);
168 void BVHEmbree::add_object(
Object *ob,
int i)
170 Geometry *geom = ob->get_geometry();
175 add_triangles(ob,
mesh, i);
179 Hair *hair =
static_cast<Hair *
>(geom);
181 add_curves(ob, hair, i);
187 add_points(ob, pointcloud, i);
192 void BVHEmbree::add_instance(
Object *ob,
int i)
194 BVHEmbree *instance_bvh = (BVHEmbree *)(ob->get_geometry()->bvh);
195 assert(instance_bvh !=
NULL);
197 const size_t num_object_motion_steps = ob->
use_motion() ? ob->get_motion().size() : 1;
198 const size_t num_motion_steps =
min(num_object_motion_steps, (
size_t)RTC_MAX_TIME_STEP_COUNT);
199 assert(num_object_motion_steps <= RTC_MAX_TIME_STEP_COUNT);
201 RTCGeometry geom_id = rtcNewGeometry(rtc_device, RTC_GEOMETRY_TYPE_INSTANCE);
202 rtcSetGeometryInstancedScene(geom_id, instance_bvh->scene);
203 rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
208 for (
size_t step = 0; step < num_motion_steps; ++step) {
209 RTCQuaternionDecomposition rtc_decomp;
210 rtcInitQuaternionDecomposition(&rtc_decomp);
211 rtcQuaternionDecompositionSetQuaternion(
212 &rtc_decomp, decomp[step].
x.w, decomp[step].x.x, decomp[step].x.y, decomp[step].x.z);
213 rtcQuaternionDecompositionSetScale(
214 &rtc_decomp, decomp[step].
y.w, decomp[step].z.w, decomp[step].w.w);
215 rtcQuaternionDecompositionSetTranslation(
216 &rtc_decomp, decomp[step].
y.x, decomp[step].y.y, decomp[step].y.z);
217 rtcQuaternionDecompositionSetSkew(
218 &rtc_decomp, decomp[step].
z.x, decomp[step].z.y, decomp[step].w.x);
219 rtcSetGeometryTransformQuaternion(geom_id, step, &rtc_decomp);
223 rtcSetGeometryTransform(
224 geom_id, 0, RTC_FORMAT_FLOAT3X4_ROW_MAJOR, (
const float *)&ob->get_tfm());
227 rtcSetGeometryUserData(geom_id, (
void *)instance_bvh->scene);
230 rtcCommitGeometry(geom_id);
231 rtcAttachGeometryByID(
scene, geom_id, i * 2);
232 rtcReleaseGeometry(geom_id);
235 void BVHEmbree::add_triangles(
const Object *ob,
const Mesh *
mesh,
int i)
240 size_t num_motion_steps = 1;
244 num_motion_steps =
mesh->get_motion_steps();
248 assert(num_motion_steps <= RTC_MAX_TIME_STEP_COUNT);
249 num_motion_steps =
min(num_motion_steps, (
size_t)RTC_MAX_TIME_STEP_COUNT);
253 RTCGeometry geom_id = rtcNewGeometry(rtc_device, RTC_GEOMETRY_TYPE_TRIANGLE);
254 rtcSetGeometryBuildQuality(geom_id, build_quality);
255 rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
257 unsigned *rtc_indices = (
unsigned *)rtcSetNewGeometryBuffer(
258 geom_id, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3,
sizeof(
int) * 3, num_triangles);
265 for (
size_t j = 0; j < num_triangles; ++j) {
267 rtc_indices[j * 3] =
t.v[0];
268 rtc_indices[j * 3 + 1] =
t.v[1];
269 rtc_indices[j * 3 + 2] =
t.v[2];
272 set_tri_vertex_buffer(geom_id,
mesh,
false);
274 rtcSetGeometryUserData(geom_id, (
void *)prim_offset);
279 rtcCommitGeometry(geom_id);
280 rtcAttachGeometryByID(
scene, geom_id, i * 2);
281 rtcReleaseGeometry(geom_id);
284 void BVHEmbree::set_tri_vertex_buffer(RTCGeometry geom_id,
const Mesh *
mesh,
const bool update)
287 size_t num_motion_steps = 1;
292 num_motion_steps =
mesh->get_motion_steps();
293 t_mid = (num_motion_steps - 1) / 2;
294 if (num_motion_steps > RTC_MAX_TIME_STEP_COUNT) {
296 num_motion_steps = RTC_MAX_TIME_STEP_COUNT;
300 const size_t num_verts =
mesh->get_verts().
size();
302 for (
int t = 0;
t < num_motion_steps; ++
t) {
308 int t_ = (
t > t_mid) ? (
t - 1) :
t;
312 float *rtc_verts = (
update) ?
313 (
float *)rtcGetGeometryBufferData(geom_id, RTC_BUFFER_TYPE_VERTEX,
t) :
314 (
float *)rtcSetNewGeometryBuffer(geom_id,
315 RTC_BUFFER_TYPE_VERTEX,
323 for (
size_t j = 0; j < num_verts; ++j) {
324 rtc_verts[0] =
verts[j].x;
325 rtc_verts[1] =
verts[j].y;
326 rtc_verts[2] =
verts[j].z;
332 rtcUpdateGeometryBuffer(geom_id, RTC_BUFFER_TYPE_VERTEX,
t);
337 void BVHEmbree::set_curve_vertex_buffer(RTCGeometry geom_id,
const Hair *hair,
const bool update)
340 size_t num_motion_steps = 1;
344 num_motion_steps = hair->get_motion_steps();
350 for (
size_t j = 0; j < num_curves; ++j) {
352 num_keys +=
c.num_keys;
356 size_t num_keys_embree = num_keys;
357 num_keys_embree += num_curves * 2;
360 const int t_mid = (num_motion_steps - 1) / 2;
361 const float *curve_radius = &hair->get_curve_radius()[0];
362 for (
int t = 0;
t < num_motion_steps; ++
t) {
364 if (
t == t_mid || attr_mP ==
NULL) {
365 verts = &hair->get_curve_keys()[0];
368 int t_ = (
t > t_mid) ? (
t - 1) :
t;
373 geom_id, RTC_BUFFER_TYPE_VERTEX,
t) :
374 (
float4 *)rtcSetNewGeometryBuffer(geom_id,
375 RTC_BUFFER_TYPE_VERTEX,
384 for (
size_t j = 0; j < num_curves; ++j) {
386 int fk =
c.first_key;
388 for (; k <
c.num_keys + 1; ++k, ++fk) {
390 rtc_verts[k].w = curve_radius[fk];
393 rtc_verts[0] = rtc_verts[1];
394 rtc_verts[k] = rtc_verts[k - 1];
395 rtc_verts +=
c.num_keys + 2;
400 rtcUpdateGeometryBuffer(geom_id, RTC_BUFFER_TYPE_VERTEX,
t);
405 void BVHEmbree::set_point_vertex_buffer(RTCGeometry geom_id,
410 size_t num_motion_steps = 1;
414 num_motion_steps = pointcloud->get_motion_steps();
418 const size_t num_points = pointcloud->
num_points();
421 const int t_mid = (num_motion_steps - 1) / 2;
422 const float *radius = pointcloud->get_radius().data();
423 for (
int t = 0;
t < num_motion_steps; ++
t) {
425 if (
t == t_mid || attr_mP ==
NULL) {
426 verts = pointcloud->get_points().data();
429 int t_ = (
t > t_mid) ? (
t - 1) :
t;
434 geom_id, RTC_BUFFER_TYPE_VERTEX,
t) :
435 (
float4 *)rtcSetNewGeometryBuffer(geom_id,
436 RTC_BUFFER_TYPE_VERTEX,
444 for (
size_t j = 0; j < num_points; ++j) {
446 rtc_verts[j].w = radius[j];
451 rtcUpdateGeometryBuffer(geom_id, RTC_BUFFER_TYPE_VERTEX,
t);
456 void BVHEmbree::add_points(
const Object *ob,
const PointCloud *pointcloud,
int i)
461 size_t num_motion_steps = 1;
465 num_motion_steps = pointcloud->get_motion_steps();
469 enum RTCGeometryType
type = RTC_GEOMETRY_TYPE_SPHERE_POINT;
471 RTCGeometry geom_id = rtcNewGeometry(rtc_device,
type);
473 rtcSetGeometryBuildQuality(geom_id, build_quality);
474 rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
476 set_point_vertex_buffer(geom_id, pointcloud,
false);
478 rtcSetGeometryUserData(geom_id, (
void *)prim_offset);
483 rtcCommitGeometry(geom_id);
484 rtcAttachGeometryByID(
scene, geom_id, i * 2);
485 rtcReleaseGeometry(geom_id);
488 void BVHEmbree::add_curves(
const Object *ob,
const Hair *hair,
int i)
493 size_t num_motion_steps = 1;
497 num_motion_steps = hair->get_motion_steps();
501 assert(num_motion_steps <= RTC_MAX_TIME_STEP_COUNT);
502 num_motion_steps =
min(num_motion_steps, (
size_t)RTC_MAX_TIME_STEP_COUNT);
505 size_t num_segments = 0;
506 for (
size_t j = 0; j < num_curves; ++j) {
508 assert(
c.num_segments() > 0);
509 num_segments +=
c.num_segments();
513 RTC_GEOMETRY_TYPE_FLAT_CATMULL_ROM_CURVE :
514 RTC_GEOMETRY_TYPE_ROUND_CATMULL_ROM_CURVE);
516 RTCGeometry geom_id = rtcNewGeometry(rtc_device,
type);
517 rtcSetGeometryTessellationRate(geom_id,
params.curve_subdivisions + 1);
518 unsigned *rtc_indices = (
unsigned *)rtcSetNewGeometryBuffer(
519 geom_id, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT,
sizeof(
int), num_segments);
520 size_t rtc_index = 0;
521 for (
size_t j = 0; j < num_curves; ++j) {
523 for (
size_t k = 0; k <
c.num_segments(); ++k) {
524 rtc_indices[rtc_index] =
c.first_key + k;
526 rtc_indices[rtc_index] += j * 2;
532 rtcSetGeometryBuildQuality(geom_id, build_quality);
533 rtcSetGeometryTimeStepCount(geom_id, num_motion_steps);
535 set_curve_vertex_buffer(geom_id, hair,
false);
537 rtcSetGeometryUserData(geom_id, (
void *)prim_offset);
544 rtcSetGeometryOccludedFilterFunction(geom_id,
549 rtcCommitGeometry(geom_id);
550 rtcAttachGeometryByID(
scene, geom_id, i * 2 + 1);
551 rtcReleaseGeometry(geom_id);
559 unsigned geom_id = 0;
560 foreach (
Object *ob, objects) {
561 if (!
params.top_level || (ob->
is_traceable() && !ob->get_geometry()->is_instanced())) {
562 Geometry *geom = ob->get_geometry();
567 RTCGeometry geom = rtcGetGeometry(
scene, geom_id);
568 set_tri_vertex_buffer(geom,
mesh,
true);
570 rtcCommitGeometry(geom);
574 Hair *hair =
static_cast<Hair *
>(geom);
576 RTCGeometry geom = rtcGetGeometry(
scene, geom_id + 1);
577 set_curve_vertex_buffer(geom, hair,
true);
579 rtcCommitGeometry(geom);
585 RTCGeometry geom = rtcGetGeometry(
scene, geom_id);
586 set_point_vertex_buffer(geom, pointcloud,
true);
587 rtcCommitGeometry(geom);
594 rtcCommitScene(
scene);
typedef float(TangentPoint)[2]
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ATOMIC_INLINE size_t atomic_add_and_fetch_z(size_t *p, size_t x)
ATOMIC_INLINE size_t atomic_sub_and_fetch_z(size_t *p, size_t x)
void refit(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
void build(btStridingMeshInterface *triangles, bool useQuantizedAabbCompression, const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax)
Attribute * find(ustring name) const
static const uint MAX_MOTION_STEPS
bool has_motion_blur() const
Curve get_curve(size_t i) const
size_t curve_segment_offset
size_t num_curves() const
CurveShapeType curve_shape
void set_substatus(const string &substatus_)
void mem_free(size_t size)
void mem_alloc(size_t size)
#define CCL_NAMESPACE_END
ccl_device void kernel_embree_filter_occluded_func(const RTCFilterFunctionNArguments *args)
ccl_device void kernel_embree_filter_occluded_func_backface_cull(const RTCFilterFunctionNArguments *args)
ccl_device void kernel_embree_filter_intersection_func(const RTCFilterFunctionNArguments *args)
ccl_device void kernel_embree_filter_func_backface_cull(const RTCFilterFunctionNArguments *args)
@ ATTR_STD_MOTION_VERTEX_POSITION
static void update(bNodeTree *ntree)
#define SIMD_SET_FLUSH_TO_ZERO
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
Triangle get_triangle(size_t i) const
size_t num_triangles() const
static const uint MAX_MOTION_STEPS
bool is_traceable() const
uint visibility_for_tracing() const
size_t num_points() const
CCL_NAMESPACE_BEGIN double time_dt()
ccl_device_inline float4 float3_to_float4(const float3 a)