diff options
Diffstat (limited to 'intern/cycles/blender/blender_object.cpp')
-rw-r--r-- | intern/cycles/blender/blender_object.cpp | 88 |
1 files changed, 62 insertions, 26 deletions
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 6ffc8c81ce6..f5945a68fc1 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -217,9 +217,11 @@ void BlenderSync::sync_background_light() /* Object */ -Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::DupliObject b_dupli_ob, Transform& tfm, uint layer_flag, int motion, bool hide_tris) +Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::DupliObject b_dupli_ob, + Transform& tfm, uint layer_flag, float motion_time, bool hide_tris) { BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent); + bool motion = motion_time != 0.0f; /* light is handled separately */ if(object_is_light(b_ob)) { @@ -243,18 +245,21 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P object = object_map.find(key); if(object) { + /* object transformation */ if(tfm != object->tfm) { - if(motion == -1) + if(motion_time == -1.0f) { object->motion.pre = tfm; - else + object->use_motion = true; + } + else if(motion_time == 1.0f) { object->motion.post = tfm; - - object->use_motion = true; + object->use_motion = true; + } } - /* mesh deformation blur not supported yet */ - if(!scene->integrator->motion_blur) - sync_mesh_motion(b_ob, object->mesh, motion); + /* mesh deformation */ + if(object->mesh) + sync_mesh_motion(b_ob, object, motion_time); } return object; @@ -314,6 +319,20 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P object->motion.post = tfm; object->use_motion = false; + /* motion blur */ + if(scene->need_motion() == Scene::MOTION_BLUR && object->mesh) { + Mesh *mesh = object->mesh; + + if(true) { + if(true) + mesh->motion_steps = 3; + + vector<float> times = object->motion_times(); + foreach(float time, times) + motion_times.insert(time); + } + } + /* random number */ object->random_id = hash_string(object->name.c_str()); @@ -412,10 +431,11 @@ static bool object_render_hide_duplis(BL::Object b_ob) /* Object Loop */ -void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) +void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time) { /* layer data */ uint scene_layer = render_layer.scene_layer; + bool motion = motion_time != 0.0f; if(!motion) { /* prepare for sync */ @@ -424,6 +444,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) object_map.pre_sync(); mesh_synced.clear(); particle_system_map.pre_sync(); + motion_times.clear(); } else { mesh_motion_synced.clear(); @@ -468,7 +489,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup->persistent_id(); /* sync object and mesh or light data */ - Object *object = sync_object(*b_ob, persistent_id.data, *b_dup, tfm, ob_layer, motion, hide_tris); + Object *object = sync_object(*b_ob, persistent_id.data, *b_dup, tfm, ob_layer, motion_time, hide_tris); /* sync possible particle data, note particle_id * starts counting at 1, first is dummy particle */ @@ -488,7 +509,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, int motion) if(!object_render_hide(*b_ob, true, true, hide_tris)) { /* object itself */ Transform tfm = get_transform(b_ob->matrix_world()); - sync_object(*b_ob, NULL, PointerRNA_NULL, tfm, ob_layer, motion, hide_tris); + sync_object(*b_ob, NULL, PointerRNA_NULL, tfm, ob_layer, motion_time, hide_tris); } } @@ -528,31 +549,46 @@ void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override, void b_cam = b_override; Camera prevcam = *(scene->camera); - - /* go back and forth one frame */ - int frame = b_scene.frame_current(); - for(int motion = -1; motion <= 1; motion += 2) { - /* we need to set the python thread state again because this - * function assumes it is being executed from python and will - * try to save the thread state */ + int frame_center = b_scene.frame_current(); + + /* always sample these times for camera motion */ + motion_times.insert(-1.0f); + motion_times.insert(1.0f); + + /* note iteration over motion_times set happens in sorted order */ + foreach(float relative_time, motion_times) { + /* sync camera, only supports two times at the moment */ + if(relative_time == -1.0f || relative_time == 1.0f) + sync_camera_motion(b_cam, relative_time); + + /* fixed shutter time to get previous and next frame for motion pass */ + float shuttertime; + + if(scene->need_motion() == Scene::MOTION_PASS) + shuttertime = 2.0f; + else + shuttertime = scene->camera->shuttertime; + + /* compute frame and subframe time */ + float time = frame_center + relative_time * shuttertime * 0.5f; + int frame = (int)floorf(time); + float subframe = time - frame; + + /* change frame */ python_thread_state_restore(python_thread_state); - b_scene.frame_set(frame + motion, 0.0f); + b_scene.frame_set(frame, subframe); python_thread_state_save(python_thread_state); - /* camera object */ - if(b_cam) - sync_camera_motion(b_cam, motion); - - /* mesh objects */ - sync_objects(b_v3d, motion); + /* sync object */ + sync_objects(b_v3d, relative_time); } /* we need to set the python thread state again because this * function assumes it is being executed from python and will * try to save the thread state */ python_thread_state_restore(python_thread_state); - b_scene.frame_set(frame, 0.0f); + b_scene.frame_set(frame_center, 0.0f); python_thread_state_save(python_thread_state); /* tag camera for motion update */ |