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.
This commit is contained in:
Sergey Sharybin
2015-01-27 21:36:14 +05:00
parent 332cf291e4
commit 3b50d3a04f
3 changed files with 69 additions and 20 deletions

View File

@@ -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