Cycles: Solve dependency between camera and object synchronization

IN theory object might depend on camera location (spatial adaptive subdivisions
for example) which became not possible to achieve after camera in volume support.

Should be no functional changes for artists.
This commit is contained in:
Sergey Sharybin 2015-02-02 22:06:31 +05:00
parent ddba5c27a7
commit 30e4009f0a
3 changed files with 24 additions and 9 deletions

@ -278,11 +278,20 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
kcam->nearclip = nearclip; kcam->nearclip = nearclip;
kcam->cliplength = (farclip == FLT_MAX)? FLT_MAX: farclip - nearclip; kcam->cliplength = (farclip == FLT_MAX)? FLT_MAX: farclip - nearclip;
need_device_update = false;
previous_need_motion = need_motion;
/* Camera in volume. */ /* Camera in volume. */
kcam->is_inside_volume = 0; kcam->is_inside_volume = 0;
previous_need_motion = need_motion;
}
void Camera::device_update_volume(Device *device,
DeviceScene *dscene,
Scene *scene)
{
if(!need_device_update) {
return;
}
KernelCamera *kcam = &dscene->data.cam;
BoundBox viewplane_boundbox = viewplane_bounds_get(); BoundBox viewplane_boundbox = viewplane_bounds_get();
for(size_t i = 0; i < scene->objects.size(); ++i) { for(size_t i = 0; i < scene->objects.size(); ++i) {
Object *object = scene->objects[i]; Object *object = scene->objects[i];
@ -294,6 +303,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
break; break;
} }
} }
need_device_update = false;
} }
void Camera::device_free(Device *device, DeviceScene *dscene) void Camera::device_free(Device *device, DeviceScene *dscene)

@ -116,6 +116,7 @@ public:
void update(); void update();
void device_update(Device *device, DeviceScene *dscene, Scene *scene); void device_update(Device *device, DeviceScene *dscene, Scene *scene);
void device_update_volume(Device *device, DeviceScene *dscene, Scene *scene);
void device_free(Device *device, DeviceScene *dscene); void device_free(Device *device, DeviceScene *dscene);
bool modified(const Camera& cam); bool modified(const Camera& cam);

@ -165,6 +165,11 @@ void Scene::device_update(Device *device_, Progress& progress)
if(progress.get_cancel() || device->have_error()) return; if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Camera");
camera->device_update(device, &dscene, this);
if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Objects"); progress.set_status("Updating Objects");
object_manager->device_update(device, &dscene, this, progress); object_manager->device_update(device, &dscene, this, progress);
@ -185,6 +190,11 @@ void Scene::device_update(Device *device_, Progress& progress)
if(progress.get_cancel() || device->have_error()) return; if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Camera Volume");
camera->device_update_volume(device, &dscene, this);
if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Hair Systems"); progress.set_status("Updating Hair Systems");
curve_system_manager->device_update(device, &dscene, this, progress); curve_system_manager->device_update(device, &dscene, this, progress);
@ -195,12 +205,6 @@ void Scene::device_update(Device *device_, Progress& progress)
if(progress.get_cancel() || device->have_error()) return; if(progress.get_cancel() || device->have_error()) return;
/* TODO(sergey): Make sure camera is not needed above. */
progress.set_status("Updating Camera");
camera->device_update(device, &dscene, this);
if(progress.get_cancel() || device->have_error()) return;
progress.set_status("Updating Lights"); progress.set_status("Updating Lights");
light_manager->device_update(device, &dscene, this, progress); light_manager->device_update(device, &dscene, this, progress);