85 SOCKET_NODE(geometry,
"Geometry", Geometry::get_node_base_type());
92 SOCKET_BOOLEAN(hide_on_missing_motion,
"Hide on Missing Motion",
false);
96 SOCKET_FLOAT(shadow_terminator_offset,
"Terminator Offset", 0.0f);
101 SOCKET_NODE(particle_system,
"Particle System", ParticleSystem::get_node_type());
109 particle_system =
NULL;
125 bool have_motion =
false;
127 for (
size_t i = 0; i < motion.size(); i++) {
129 if (hide_on_missing_motion) {
145 have_motion = have_motion || motion[i] != tfm;
156 BoundBox mbounds = geometry->bounds;
167 for (
float t = 0.0f;
t < 1.0f;
t += (1.0f / 128.0f)) {
176 if (geometry->transform_applied) {
190 geometry->apply_transform(tfm, apply_to_motion);
195 geometry->transform_negative_scaled =
true;
198 geometry->compute_bounds();
213 if (use_holdout_is_modified()) {
219 if (tfm_is_modified()) {
223 if (visibility_is_modified()) {
227 foreach (
Node *
node, geometry->get_used_shaders()) {
229 if (
shader->get_use_mis() &&
shader->has_surface_emission)
240 return (motion.size() > 1);
245 return (
use_motion()) ? 2.0f * step / (motion.size() - 1) - 1.0f : 0.0f;
251 for (
size_t step = 0; step < motion.size(); step++) {
273 uint trace_visibility = visibility;
274 if (is_shadow_catcher) {
280 return trace_visibility;
296 float step_rate = FLT_MAX;
301 if ((
shader->get_heterogeneous_volume() &&
shader->has_volume_spatial_varying) ||
302 (
shader->has_volume_attribute_dependency)) {
303 step_rate =
fminf(
shader->get_volume_step_rate(), step_rate);
308 if (step_rate == FLT_MAX) {
313 float step_size = FLT_MAX;
327 float voxel_step_size = volume->get_step_size();
329 if (voxel_step_size == 0.0f) {
346 else if (volume->get_object_space()) {
352 if (voxel_step_size > 0.0f) {
353 step_size =
fminf(voxel_step_size, step_size);
359 if (step_size == FLT_MAX) {
364 step_size *= step_rate;
390 if (
static_cast<Volume *
>(geom)->get_object_space()) {
414 float pass_id = ob->pass_id;
415 float random_number = (
float)ob->random_id * (1.0f / (
float)0xFFFFFFFF);
417 ob->particle_index +
state->particle_offset[ob->particle_system] :
423 kobject.
color[0] = color.
x;
424 kobject.
color[1] = color.
y;
425 kobject.
color[2] = color.
z;
431 if (geom->get_use_motion_blur()) {
432 state->have_motion =
true;
450 tfm_pre = ob->motion[0];
451 tfm_post = ob->motion[ob->motion.size() - 1];
462 tfm_pre = tfm_pre * itfm;
463 tfm_post = tfm_post * itfm;
467 object_motion_pass[motion_pass_offset + 0] = tfm_pre;
468 object_motion_pass[motion_pass_offset + 1] = tfm_post;
475 if (ob->tfm_is_modified() || update_all) {
481 state->have_motion =
true;
490 static_cast<Hair *
>(geom)->get_curve_keys().size() :
492 kobject.
dupli_uv[0] = ob->dupli_uv[0];
493 kobject.
dupli_uv[1] = ob->dupli_uv[1];
494 int totalsteps = geom->get_motion_steps();
495 kobject.
numsteps = (totalsteps - 1) / 2;
498 static_cast<Mesh *
>(geom)->get_verts().
size() :
503 if (ob->asset_name_is_modified() || update_all) {
513 if (ob->use_holdout) {
517 state->object_volume_step[ob->
index] = FLT_MAX;
521 state->have_curves =
true;
529 state.have_motion =
false;
530 state.have_curves =
false;
532 state.queue_start_object = 0;
547 uint motion_offset = 0;
550 *motion_offsets = motion_offset;
555 motion_offset += ob->motion.size();
564 int numparticles = 1;
566 state.particle_offset[psys] = numparticles;
575 static const int OBJECTS_PER_TASK = 32;
577 [&](
const blocked_range<size_t> &
r) {
578 for (size_t i = r.begin(); i != r.end(); i++) {
579 Object *ob = state.scene->objects[i];
580 device_update_object_transform(&state, ob, update_all);
584 if (progress.get_cancel()) {
588 dscene->objects.copy_to_device_if_modified();
590 dscene->object_motion_pass.copy_to_device();
593 dscene->object_motion.copy_to_device();
596 dscene->data.bvh.have_motion =
state.have_motion;
597 dscene->data.bvh.have_curves =
state.have_curves;
599 dscene->objects.clear_modified();
600 dscene->object_motion_pass.clear_modified();
601 dscene->object_motion.clear_modified();
639 scene->update_stats->object.times.add_entry({
"device_update (assign index)", time});
645 object->index = index++;
663 scene->update_stats->object.times.add_entry(
664 {
"device_update (copy objects to device)", time});
668 progress.set_status(
"Updating Objects",
"Copying Transformations to device");
669 device_update_transforms(dscene,
scene, progress);
672 if (progress.get_cancel())
680 scene->update_stats->object.times.add_entry(
681 {
"device_update (apply static transforms)", time});
685 progress.set_status(
"Updating Objects",
"Applying Static Transformations");
686 apply_static_transforms(dscene,
scene, progress);
690 object->clear_modified();
702 scene->update_stats->object.times.add_entry({
"device_update_flags", time});
706 update_flags = UPDATE_NONE;
707 need_flags_update =
false;
713 uint *object_flag = dscene->object_flag.data();
714 float *object_volume_step = dscene->object_volume_step.data();
718 bool has_volume_objects =
false;
720 if (object->geometry->has_volume) {
722 volume_objects.push_back(
object);
724 has_volume_objects =
true;
725 object_volume_step[
object->index] =
object->compute_volume_step_size();
728 object_volume_step[
object->index] = FLT_MAX;
733 if (object->geometry->has_volume) {
747 if (object->is_shadow_catcher) {
755 foreach (
Object *volume_object, volume_objects) {
756 if (
object == volume_object) {
765 else if (has_volume_objects) {
774 dscene->object_flag.copy_to_device();
775 dscene->object_volume_step.copy_to_device();
777 dscene->object_flag.clear_modified();
778 dscene->object_volume_step.clear_modified();
796 if (
mesh->patch_table) {
808 size_t attr_map_offset =
object->attr_map_offset;
811 if (attr_map_offset == 0) {
841 map<Geometry *, int> geometry_users;
848 map<Geometry *, int>::iterator it = geometry_users.find(object->geometry);
850 if (it == geometry_users.end())
851 geometry_users[
object->geometry] = 1;
886 object->apply_transform(apply_to_motion);
905 update_flags |= flag;
938 string manifest =
"{";
940 unordered_set<ustring, ustringHash> objects;
942 if (objects.count(object->
name)) {
945 objects.insert(object->
name);
949 manifest[manifest.size() - 1] =
'}';
955 string manifest =
"{";
956 unordered_set<ustring, ustringHash> assets;
958 if (assets.count(ob->asset_name)) {
961 assets.insert(ob->asset_name);
963 manifest +=
string_printf(
"\"%s\":\"%08x\",", ob->asset_name.c_str(), hash_asset);
965 manifest[manifest.size() - 1] =
'}';
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 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 GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
list< Attribute > attributes
Attribute * find(ustring name) const
ImageHandle & data_voxel()
device_vector< DecomposedTransform > object_motion
device_vector< Transform > object_motion_pass
device_vector< float > object_volume_step
device_vector< uint > object_flag
device_vector< KernelObject > objects
void tag_update(Scene *scene, uint32_t flag)
bool has_true_displacement() const
bool transform_negative_scaled
void tag_update(Scene *scene, uint32_t flag)
string get_cryptomatte_objects(Scene *scene)
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
void tag_update(Scene *scene, uint32_t flag)
void device_free(Device *device, DeviceScene *dscene, bool force_free)
string get_cryptomatte_assets(Scene *scene)
void device_update_transforms(DeviceScene *dscene, Scene *scene, Progress &progress)
void apply_static_transforms(DeviceScene *dscene, Scene *scene, Progress &progress)
void device_update_flags(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress, bool bounds_valid=true)
void device_update_mesh_offsets(Device *device, DeviceScene *dscene, Scene *scene)
void device_update_object_transform(UpdateObjectTransformState *state, Object *ob, bool update_all)
T * alloc(size_t width, size_t height=0, size_t depth=0)
void free_if_need_realloc(bool force_free)
ccl_device_inline uint particle_index(KernelGlobals *kg, int particle)
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
@ ATTR_STD_MOTION_VERTEX_POSITION
@ PATH_RAY_SHADOW_NON_CATCHER
@ PATH_RAY_SHADOW_CATCHER
#define OBJECT_MOTION_PASS_SIZE
@ SD_OBJECT_HAS_VOLUME_ATTRIBUTES
@ SD_OBJECT_INTERSECTS_VOLUME
@ SD_OBJECT_SHADOW_CATCHER
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_HAS_VERTEX_MOTION
@ SD_OBJECT_NEGATIVE_SCALE_APPLIED
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
static void update(bNodeTree *ntree)
#define SOCKET_POINT(name, ui_name, default_value,...)
#define SOCKET_FLOAT(name, ui_name, default_value,...)
#define SOCKET_INT(name, ui_name, default_value,...)
#define SOCKET_NODE(name, ui_name, node_type,...)
#define SOCKET_TRANSFORM(name, ui_name, default_value,...)
#define SOCKET_UINT(name, ui_name, default_value,...)
#define SOCKET_COLOR(name, ui_name, default_value,...)
#define SOCKET_TRANSFORM_ARRAY(name, ui_name, default_value,...)
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
#define SOCKET_POINT2(name, ui_name, default_value,...)
#define SOCKET_STRING(name, ui_name, default_value,...)
static float object_volume_density(const Transform &tfm, Geometry *geom)
BoundBox transformed(const Transform *tfm) const
__forceinline bool valid() const
__forceinline float3 size() const
__forceinline bool intersects(const BoundBox &other)
__forceinline void grow(const float3 &pt)
float shadow_terminator_offset
uint attribute_map_offset
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
void compute_bounds(bool motion_blur)
int motion_step(float time) const
NODE_DECLARE BoundBox bounds
vector< ParamValue > attributes
int get_device_index() const
void apply_transform(bool apply_to_motion)
float compute_volume_step_size() const
bool is_traceable() const
uint visibility_for_tracing() const
void tag_update(Scene *scene)
float motion_time(int step) const
vector< ParticleSystem * > particle_systems
vector< Object * > objects
ObjectManager * object_manager
LightManager * light_manager
SceneUpdateStats * update_stats
GeometryManager * geometry_manager
ccl_device_inline float2 normalize(const float2 &a)
ccl_device_inline float2 zero_float2()
ccl_device_inline float average(const float2 &a)
ccl_device_inline float2 fabs(const float2 &a)
ccl_device_inline float3 one_float3()
ccl_device_inline float min3(float3 a)
ccl_device_inline float3 zero_float3()
float util_hash_to_float(uint32_t hash)
uint32_t util_murmur_hash3(const void *key, int len, uint32_t seed)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT
@ IMAGE_DATA_TYPE_NANOVDB_FLOAT3