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@pandora.be>2012-10-17 21:27:30 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-10-17 21:27:30 +0400
commit4ad103ceddd87ed36dac7f9fed4f1d058c6161b6 (patch)
tree8c8813e0a19273f9ac79f638bc7f1be02829f074
parent11908552db8c7ddba63d67577a6010869d72b0c7 (diff)
Fix cycles motion blur not working correct with shutter time > 2.0. The soft
limit is 2.0, and anything beyond that is extrapolation which might not work so well but is still allowed.
-rw-r--r--intern/cycles/render/mesh.cpp4
-rw-r--r--intern/cycles/render/object.cpp9
-rw-r--r--intern/cycles/render/object.h2
3 files changed, 10 insertions, 5 deletions
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 3f2fe4ab093..3c41b4f1ad3 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -19,6 +19,7 @@
#include "bvh.h"
#include "bvh_build.h"
+#include "camera.h"
#include "device.h"
#include "shader.h"
#include "light.h"
@@ -722,6 +723,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
foreach(Shader *shader, scene->shaders)
shader->need_update_attributes = false;
+ float shuttertime = scene->camera->shuttertime;
#ifdef __OBJECT_MOTION__
Scene::MotionType need_motion = scene->need_motion(device->info.advanced_shading);
bool motion_blur = need_motion == Scene::MOTION_BLUR;
@@ -730,7 +732,7 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
#endif
foreach(Object *object, scene->objects)
- object->compute_bounds(motion_blur);
+ object->compute_bounds(motion_blur, shuttertime);
if(progress.get_cancel()) return;
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 63e904511e6..0b87a530725 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -51,7 +51,7 @@ Object::~Object()
{
}
-void Object::compute_bounds(bool motion_blur)
+void Object::compute_bounds(bool motion_blur, float shuttertime)
{
BoundBox mbounds = mesh->bounds;
@@ -64,7 +64,10 @@ void Object::compute_bounds(bool motion_blur)
/* todo: this is really terrible. according to pbrt there is a better
* way to find this iteratively, but did not find implementation yet
* or try to implement myself */
- for(float t = 0.0f; t < 1.0f; t += 1.0f/128.0f) {
+ float start_t = 0.5f - shuttertime*0.5f;
+ float end_t = 0.5f - shuttertime*0.5f;
+
+ for(float t = start_t; t < end_t; t += (1.0f/128.0f)*shuttertime) {
Transform ttfm;
transform_motion_interpolate(&ttfm, &decomp, t);
@@ -109,7 +112,7 @@ void Object::apply_transform()
if(bounds.valid()) {
mesh->compute_bounds();
- compute_bounds(false);
+ compute_bounds(false, 0.0f);
}
/* tfm is not reset to identity, all code that uses it needs to check the
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index e2c3ad4e071..922c886d961 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -59,7 +59,7 @@ public:
void tag_update(Scene *scene);
- void compute_bounds(bool motion_blur);
+ void compute_bounds(bool motion_blur, float shuttertime);
void apply_transform();
};