Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 02:37:07 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 06:54:05 +0300
commit267d8923265a284c5d9a462e1d86305d613fcad8 (patch)
tree7e0bd31d403a4d878ec65aaac3883bbfea67cc20 /intern/cycles/render
parent6c4ddfc5d9833b6c4f0ae3da93645556fee97caf (diff)
Code refactor: motion blur cleanups, preparing for next commit.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/camera.cpp52
-rw-r--r--intern/cycles/render/camera.h1
-rw-r--r--intern/cycles/render/mesh.cpp26
-rw-r--r--intern/cycles/render/mesh.h5
-rw-r--r--intern/cycles/render/object.cpp39
-rw-r--r--intern/cycles/render/object.h4
-rw-r--r--intern/cycles/render/scene.cpp4
-rw-r--r--intern/cycles/render/scene.h4
8 files changed, 71 insertions, 64 deletions
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<float> Object::motion_times()
-{
- /* compute times at which we sample motion for this object */
- vector<float> 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<float> 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<KernelObject> objects;
- device_vector<Transform> objects_vector;
+ device_vector<Transform> object_motion_pass;
+ device_vector<uint> object_flag;
/* attributes */
device_vector<uint4> attributes_map;
@@ -107,7 +108,6 @@ public:
/* shaders */
device_vector<int4> svm_nodes;
device_vector<KernelShader> shaders;
- device_vector<uint> object_flag;
/* lookup tables */
device_vector<float> lookup_table;