From 267d8923265a284c5d9a462e1d86305d613fcad8 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 10 Mar 2018 00:37:07 +0100 Subject: Code refactor: motion blur cleanups, preparing for next commit. --- intern/cycles/render/camera.cpp | 52 ++++++++++++++++++++--------------------- intern/cycles/render/camera.h | 1 - intern/cycles/render/mesh.cpp | 26 +++++++++++++++++++++ intern/cycles/render/mesh.h | 5 ++++ intern/cycles/render/object.cpp | 39 ++++++++----------------------- intern/cycles/render/object.h | 4 +--- intern/cycles/render/scene.cpp | 4 ++-- intern/cycles/render/scene.h | 4 ++-- 8 files changed, 71 insertions(+), 64 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 5e8c5db6c0e..a1c6a279956 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -302,23 +302,6 @@ void Camera::update(Scene *scene) frustum_top_normal = normalize(make_float3(0.0f, v.z, -v.y)); } - /* TODO(sergey): Support other types of camera. */ - if(type == CAMERA_PERSPECTIVE) { - /* TODO(sergey): Move to an utility function and de-duplicate with - * calculation above. - */ - ProjectionTransform screentocamera_pre = - projection_inverse(projection_perspective(fov_pre, - nearclip, - farclip)); - ProjectionTransform screentocamera_post = - projection_inverse(projection_perspective(fov_post, - nearclip, - farclip)); - perspective_motion.pre = screentocamera_pre * rastertoscreen; - perspective_motion.post = screentocamera_post * rastertoscreen; - } - /* Compute kernel camera data. */ KernelCamera *kcam = &kernel_camera; @@ -341,22 +324,22 @@ void Camera::update(Scene *scene) /* TODO(sergey): Support perspective (zoom, fov) motion. */ if(type == CAMERA_PANORAMA) { if(use_motion) { - kcam->pass_motion.pre = transform_inverse(motion.pre); - kcam->pass_motion.post = transform_inverse(motion.post); + kcam->motion_pass_pre = transform_inverse(motion.pre); + kcam->motion_pass_post = transform_inverse(motion.post); } else { - kcam->pass_motion.pre = kcam->worldtocamera; - kcam->pass_motion.post = kcam->worldtocamera; + kcam->motion_pass_pre = kcam->worldtocamera; + kcam->motion_pass_post = kcam->worldtocamera; } } else { if(use_motion) { - kcam->perspective_motion.pre = cameratoraster * transform_inverse(motion.pre); - kcam->perspective_motion.post = cameratoraster * transform_inverse(motion.post); + kcam->perspective_pre = cameratoraster * transform_inverse(motion.pre); + kcam->perspective_post = cameratoraster * transform_inverse(motion.post); } else { - kcam->perspective_motion.pre = worldtoraster; - kcam->perspective_motion.post = worldtoraster; + kcam->perspective_pre = worldtoraster; + kcam->perspective_post = worldtoraster; } } } @@ -365,8 +348,23 @@ void Camera::update(Scene *scene) transform_motion_decompose(&kcam->motion, &motion, &matrix); kcam->have_motion = 1; } - if(use_perspective_motion) { - kcam->perspective_motion = perspective_motion; + + /* TODO(sergey): Support other types of camera. */ + if(use_perspective_motion && type == CAMERA_PERSPECTIVE) { + /* TODO(sergey): Move to an utility function and de-duplicate with + * calculation above. + */ + ProjectionTransform screentocamera_pre = + projection_inverse(projection_perspective(fov_pre, + nearclip, + farclip)); + ProjectionTransform screentocamera_post = + projection_inverse(projection_perspective(fov_post, + nearclip, + farclip)); + + kcam->perspective_pre = screentocamera_pre * rastertoscreen; + kcam->perspective_post = screentocamera_post * rastertoscreen; kcam->have_perspective_motion = 1; } } diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h index aa4e53a347b..8f49a372f24 100644 --- a/intern/cycles/render/camera.h +++ b/intern/cycles/render/camera.h @@ -144,7 +144,6 @@ public: MotionTransform motion; bool use_motion, use_perspective_motion; float fov_pre, fov_post; - PerspectiveMotionTransform perspective_motion; /* computed camera parameters */ ProjectionTransform screentoworld; diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 71cbf5c24b6..9166d3bcd5e 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -1117,6 +1117,32 @@ bool Mesh::has_true_displacement() const return false; } +float Mesh::motion_time(int step) const +{ + return (motion_steps > 1) ? 2.0f * step / (motion_steps - 1) - 1.0f : 0.0f; +} + +int Mesh::motion_step(float time) const +{ + if(motion_steps > 1) { + int attr_step = 0; + + for(int step = 0; step < motion_steps; step++) { + float step_time = motion_time(step); + if(step_time == time) { + return attr_step; + } + + /* Center step is stored in a separate attribute. */ + if(step != motion_steps / 2) { + attr_step++; + } + } + } + + return -1; +} + bool Mesh::need_build_bvh() const { return !transform_applied || has_surface_bssrdf; diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h index c0d1513bee0..6042faccad5 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -304,6 +304,11 @@ public: bool has_motion_blur() const; bool has_true_displacement() const; + /* Convert between normalized -1..1 motion time and index + * in the VERTEX_MOTION attribute. */ + float motion_time(int step) const; + int motion_step(float time) const; + /* Check whether the mesh should have own BVH built separately. Briefly, * own BVH is needed for mesh, if: * diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index b9702cfe531..6201775b992 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -57,7 +57,8 @@ struct UpdateObjectTransformState { /* Packed object arrays. Those will be filled in. */ uint *object_flag; KernelObject *objects; - Transform *objects_vector; + Transform *object_motion_pass; + DecomposedTransform *object_motion; /* Flags which will be synchronized to Integrator. */ bool have_motion; @@ -274,27 +275,7 @@ void Object::tag_update(Scene *scene) scene->object_manager->need_update = true; } -vector Object::motion_times() -{ - /* compute times at which we sample motion for this object */ - vector times; - - if(!mesh || mesh->motion_steps == 1) - return times; - - int motion_steps = mesh->motion_steps; - - for(int step = 0; step < motion_steps; step++) { - if(step != motion_steps / 2) { - float time = 2.0f * step / (motion_steps - 1) - 1.0f; - times.push_back(time); - } - } - - return times; -} - -bool Object::is_traceable() +bool Object::is_traceable() const { /* Mesh itself can be empty,can skip all such objects. */ if(!bounds.valid() || bounds.size() == make_float3(0.0f, 0.0f, 0.0f)) { @@ -332,7 +313,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s int object_index) { KernelObject& kobject = state->objects[object_index]; - Transform *objects_vector = state->objects_vector; + Transform *object_motion_pass = state->object_motion_pass; Mesh *mesh = ob->mesh; uint flag = 0; @@ -434,8 +415,8 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s mtfm.post = mtfm.post * itfm; } - objects_vector[object_index*OBJECT_VECTOR_SIZE+0] = mtfm.pre; - objects_vector[object_index*OBJECT_VECTOR_SIZE+1] = mtfm.post; + object_motion_pass[object_index*OBJECT_MOTION_PASS_SIZE+0] = mtfm.pre; + object_motion_pass[object_index*OBJECT_MOTION_PASS_SIZE+1] = mtfm.post; } else if(state->need_motion == Scene::MOTION_BLUR) { if(ob->use_motion) { @@ -528,10 +509,10 @@ void ObjectManager::device_update_transforms(DeviceScene *dscene, state.objects = dscene->objects.alloc(scene->objects.size()); state.object_flag = dscene->object_flag.alloc(scene->objects.size()); - state.objects_vector = NULL; + state.object_motion_pass = NULL; if(state.need_motion == Scene::MOTION_PASS) { - state.objects_vector = dscene->objects_vector.alloc(OBJECT_VECTOR_SIZE*scene->objects.size()); + state.object_motion_pass = dscene->object_motion_pass.alloc(OBJECT_MOTION_PASS_SIZE*scene->objects.size()); } /* Particle system device offsets @@ -574,7 +555,7 @@ void ObjectManager::device_update_transforms(DeviceScene *dscene, dscene->objects.copy_to_device(); if(state.need_motion == Scene::MOTION_PASS) { - dscene->objects_vector.copy_to_device(); + dscene->object_motion_pass.copy_to_device(); } dscene->data.bvh.have_motion = state.have_motion; @@ -724,7 +705,7 @@ void ObjectManager::device_update_mesh_offsets(Device *, DeviceScene *dscene, Sc void ObjectManager::device_free(Device *, DeviceScene *dscene) { dscene->objects.free(); - dscene->objects_vector.free(); + dscene->object_motion_pass.free(); dscene->object_flag.free(); } diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index 3f6d120b372..7cf1528c4a7 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -70,12 +70,10 @@ public: void compute_bounds(bool motion_blur); void apply_transform(bool apply_to_motion); - vector motion_times(); - /* Check whether object is traceable and it worth adding it to * kernel scene. */ - bool is_traceable(); + bool is_traceable() const; /* Combine object's visibility with all possible internal run-time * determined flags which denotes trace-time visibility. diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp index f5b8e2fd6a6..e9b9b417e30 100644 --- a/intern/cycles/render/scene.cpp +++ b/intern/cycles/render/scene.cpp @@ -60,7 +60,8 @@ DeviceScene::DeviceScene(Device *device) curve_keys(device, "__curve_keys", MEM_TEXTURE), patches(device, "__patches", MEM_TEXTURE), objects(device, "__objects", MEM_TEXTURE), - objects_vector(device, "__objects_vector", MEM_TEXTURE), + object_motion_pass(device, "__object_motion_pass", MEM_TEXTURE), + object_flag(device, "__object_flag", MEM_TEXTURE), attributes_map(device, "__attributes_map", MEM_TEXTURE), attributes_float(device, "__attributes_float", MEM_TEXTURE), attributes_float3(device, "__attributes_float3", MEM_TEXTURE), @@ -72,7 +73,6 @@ DeviceScene::DeviceScene(Device *device) particles(device, "__particles", MEM_TEXTURE), svm_nodes(device, "__svm_nodes", MEM_TEXTURE), shaders(device, "__shaders", MEM_TEXTURE), - object_flag(device, "__object_flag", MEM_TEXTURE), lookup_table(device, "__lookup_table", MEM_TEXTURE), sobol_directions(device, "__sobol_directions", MEM_TEXTURE) { diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index cd5c9c1dadc..aebd84f92d8 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -87,7 +87,8 @@ public: /* objects */ device_vector objects; - device_vector objects_vector; + device_vector object_motion_pass; + device_vector object_flag; /* attributes */ device_vector attributes_map; @@ -107,7 +108,6 @@ public: /* shaders */ device_vector svm_nodes; device_vector shaders; - device_vector object_flag; /* lookup tables */ device_vector lookup_table; -- cgit v1.2.3