From 3b50d3a04f2c3b7202b935652a81a8888b47c84a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 27 Jan 2015 21:36:14 +0500 Subject: Fix T43346: Window mapping is wrong in preview render The issue was caused by the whole viewplane used for mapping calculation which would for sure lead to differences between final camera render and viewport render from the camera view. This commit makes it so window texture mapping is the same as final render when viewing from the camera in viewport render. It's not totally clear what's the right thing to do when viewport is not in the camera view mode and that part is left unchanged. --- intern/cycles/render/camera.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'intern/cycles/render/camera.cpp') diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 7be3949d138..9d03a9e360e 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -109,16 +109,17 @@ void Camera::update() { if(!need_update) return; - + + /* Full viewport to camera border in the viewport. */ + Transform fulltoborder = transform_from_viewplane(viewport_camera_border); + Transform bordertofull = transform_inverse(fulltoborder); + /* ndc to raster */ Transform screentocamera; - Transform ndctoraster = transform_scale(width, height, 1.0f); + Transform ndctoraster = transform_scale(width, height, 1.0f) * bordertofull; /* raster to screen */ - Transform screentondc = - transform_scale(1.0f/(viewplane.right - viewplane.left), - 1.0f/(viewplane.top - viewplane.bottom), 1.0f) * - transform_translate(-viewplane.left, -viewplane.bottom, 0.0f); + Transform screentondc = fulltoborder * transform_from_viewplane(viewplane); Transform screentoraster = ndctoraster * screentondc; Transform rastertoscreen = transform_inverse(screentoraster); @@ -398,5 +399,15 @@ BoundBox Camera::viewplane_bounds_get() return bounds; } -CCL_NAMESPACE_END +Transform Camera::transform_from_viewplane(BoundBox2D &viewplane) +{ + return + transform_scale(1.0f / (viewplane.right - viewplane.left), + 1.0f / (viewplane.top - viewplane.bottom), + 1.0f) * + transform_translate(-viewplane.left, + -viewplane.bottom, + 0.0f); +} +CCL_NAMESPACE_END -- cgit v1.2.3