Cycles: border render now works in the viewport, when looking through the
camera, same as in render. It draws objects in solid draw mode outside of the border.
This commit is contained in:
@@ -56,6 +56,11 @@ struct BlenderCamera {
|
|||||||
float sensor_width;
|
float sensor_width;
|
||||||
float sensor_height;
|
float sensor_height;
|
||||||
|
|
||||||
|
float border_left;
|
||||||
|
float border_right;
|
||||||
|
float border_bottom;
|
||||||
|
float border_top;
|
||||||
|
|
||||||
Transform matrix;
|
Transform matrix;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -70,6 +75,8 @@ static void blender_camera_init(BlenderCamera *bcam)
|
|||||||
bcam->sensor_height = 18.0f;
|
bcam->sensor_height = 18.0f;
|
||||||
bcam->sensor_fit = BlenderCamera::AUTO;
|
bcam->sensor_fit = BlenderCamera::AUTO;
|
||||||
bcam->shuttertime = 1.0f;
|
bcam->shuttertime = 1.0f;
|
||||||
|
bcam->border_right = 1.0f;
|
||||||
|
bcam->border_top = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
|
static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
|
||||||
@@ -188,85 +195,94 @@ static Transform blender_camera_matrix(const Transform& tfm, CameraType type)
|
|||||||
return transform_clear_scale(result);
|
return transform_clear_scale(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
|
static void blender_camera_viewplane(BlenderCamera *bcam, int width, int height,
|
||||||
|
float *left, float *right, float *bottom, float *top, float *aspectratio, float *sensor_size)
|
||||||
{
|
{
|
||||||
/* copy camera to compare later */
|
|
||||||
Camera prevcam = *cam;
|
|
||||||
|
|
||||||
/* dimensions */
|
/* dimensions */
|
||||||
float xratio = width*bcam->pixelaspect.x;
|
float xratio = width*bcam->pixelaspect.x;
|
||||||
float yratio = height*bcam->pixelaspect.y;
|
float yratio = height*bcam->pixelaspect.y;
|
||||||
|
|
||||||
/* compute x/y aspect and ratio */
|
/* compute x/y aspect and ratio */
|
||||||
float aspectratio, xaspect, yaspect;
|
float xaspect, yaspect;
|
||||||
|
|
||||||
/* sensor fitting */
|
/* sensor fitting */
|
||||||
bool horizontal_fit;
|
bool horizontal_fit;
|
||||||
float sensor_size;
|
|
||||||
|
|
||||||
cam->sensorwidth = bcam->sensor_width;
|
|
||||||
cam->sensorheight = bcam->sensor_height;
|
|
||||||
|
|
||||||
if(bcam->sensor_fit == BlenderCamera::AUTO) {
|
if(bcam->sensor_fit == BlenderCamera::AUTO) {
|
||||||
horizontal_fit = (xratio > yratio);
|
horizontal_fit = (xratio > yratio);
|
||||||
sensor_size = bcam->sensor_width;
|
*sensor_size = bcam->sensor_width;
|
||||||
}
|
}
|
||||||
else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) {
|
else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) {
|
||||||
horizontal_fit = true;
|
horizontal_fit = true;
|
||||||
sensor_size = bcam->sensor_width;
|
*sensor_size = bcam->sensor_width;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
horizontal_fit = false;
|
horizontal_fit = false;
|
||||||
sensor_size = bcam->sensor_height;
|
*sensor_size = bcam->sensor_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(horizontal_fit) {
|
if(horizontal_fit) {
|
||||||
aspectratio= xratio/yratio;
|
*aspectratio= xratio/yratio;
|
||||||
xaspect= aspectratio;
|
xaspect= *aspectratio;
|
||||||
yaspect= 1.0f;
|
yaspect= 1.0f;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
aspectratio= yratio/xratio;
|
*aspectratio= yratio/xratio;
|
||||||
xaspect= 1.0f;
|
xaspect= 1.0f;
|
||||||
yaspect= aspectratio;
|
yaspect= *aspectratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* modify aspect for orthographic scale */
|
/* modify aspect for orthographic scale */
|
||||||
if(bcam->type == CAMERA_ORTHOGRAPHIC) {
|
if(bcam->type == CAMERA_ORTHOGRAPHIC) {
|
||||||
xaspect = xaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
xaspect = xaspect*bcam->ortho_scale/(*aspectratio*2.0f);
|
||||||
yaspect = yaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
yaspect = yaspect*bcam->ortho_scale/(*aspectratio*2.0f);
|
||||||
aspectratio = bcam->ortho_scale/2.0f;
|
*aspectratio = bcam->ortho_scale/2.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bcam->type == CAMERA_PANORAMA) {
|
if(bcam->type == CAMERA_PANORAMA) {
|
||||||
/* set viewplane */
|
/* set viewplane */
|
||||||
cam->left = 0.0f;
|
*left = 0.0f;
|
||||||
cam->right = 1.0f;
|
*right = 1.0f;
|
||||||
cam->bottom = 0.0f;
|
*bottom = 0.0f;
|
||||||
cam->top = 1.0f;
|
*top = 1.0f;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* set viewplane */
|
/* set viewplane */
|
||||||
cam->left = -xaspect;
|
*left = -xaspect;
|
||||||
cam->right = xaspect;
|
*right = xaspect;
|
||||||
cam->bottom = -yaspect;
|
*bottom = -yaspect;
|
||||||
cam->top = yaspect;
|
*top = yaspect;
|
||||||
|
|
||||||
/* zoom for 3d camera view */
|
/* zoom for 3d camera view */
|
||||||
cam->left *= bcam->zoom;
|
*left *= bcam->zoom;
|
||||||
cam->right *= bcam->zoom;
|
*right *= bcam->zoom;
|
||||||
cam->bottom *= bcam->zoom;
|
*bottom *= bcam->zoom;
|
||||||
cam->top *= bcam->zoom;
|
*top *= bcam->zoom;
|
||||||
|
|
||||||
/* modify viewplane with camera shift and 3d camera view offset */
|
/* modify viewplane with camera shift and 3d camera view offset */
|
||||||
float dx = 2.0f*(aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
|
float dx = 2.0f*(*aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
|
||||||
float dy = 2.0f*(aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
|
float dy = 2.0f*(*aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
|
||||||
|
|
||||||
cam->left += dx;
|
*left += dx;
|
||||||
cam->right += dx;
|
*right += dx;
|
||||||
cam->bottom += dy;
|
*bottom += dy;
|
||||||
cam->top += dy;
|
*top += dy;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
|
||||||
|
{
|
||||||
|
/* copy camera to compare later */
|
||||||
|
Camera prevcam = *cam;
|
||||||
|
float aspectratio, sensor_size;
|
||||||
|
|
||||||
|
/* viewplane */
|
||||||
|
blender_camera_viewplane(bcam, width, height,
|
||||||
|
&cam->left, &cam->right, &cam->bottom, &cam->top, &aspectratio, &sensor_size);
|
||||||
|
|
||||||
|
/* sensor */
|
||||||
|
cam->sensorwidth = bcam->sensor_width;
|
||||||
|
cam->sensorheight = bcam->sensor_height;
|
||||||
|
|
||||||
/* clipping distances */
|
/* clipping distances */
|
||||||
cam->nearclip = bcam->nearclip;
|
cam->nearclip = bcam->nearclip;
|
||||||
@@ -294,6 +310,12 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
|
|||||||
cam->use_motion = false;
|
cam->use_motion = false;
|
||||||
cam->shuttertime = bcam->shuttertime;
|
cam->shuttertime = bcam->shuttertime;
|
||||||
|
|
||||||
|
/* border */
|
||||||
|
cam->border_left = bcam->border_left;
|
||||||
|
cam->border_right = bcam->border_right;
|
||||||
|
cam->border_bottom = bcam->border_bottom;
|
||||||
|
cam->border_top = bcam->border_top;
|
||||||
|
|
||||||
/* set update flag */
|
/* set update flag */
|
||||||
if(cam->modified(prevcam))
|
if(cam->modified(prevcam))
|
||||||
cam->tag_update();
|
cam->tag_update();
|
||||||
@@ -313,6 +335,14 @@ void BlenderSync::sync_camera(BL::Object b_override, int width, int height)
|
|||||||
bcam.pixelaspect.y = r.pixel_aspect_y();
|
bcam.pixelaspect.y = r.pixel_aspect_y();
|
||||||
bcam.shuttertime = r.motion_blur_shutter();
|
bcam.shuttertime = r.motion_blur_shutter();
|
||||||
|
|
||||||
|
/* border */
|
||||||
|
if(r.use_border()) {
|
||||||
|
bcam.border_left = r.border_min_x();
|
||||||
|
bcam.border_right = r.border_max_x();
|
||||||
|
bcam.border_bottom = r.border_min_y();
|
||||||
|
bcam.border_top = r.border_max_y();
|
||||||
|
}
|
||||||
|
|
||||||
/* camera object */
|
/* camera object */
|
||||||
BL::Object b_ob = b_scene.camera();
|
BL::Object b_ob = b_scene.camera();
|
||||||
|
|
||||||
@@ -348,67 +378,142 @@ void BlenderSync::sync_camera_motion(BL::Object b_ob, int motion)
|
|||||||
|
|
||||||
/* Sync 3D View Camera */
|
/* Sync 3D View Camera */
|
||||||
|
|
||||||
void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
|
static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
|
||||||
{
|
{
|
||||||
BlenderCamera bcam;
|
|
||||||
blender_camera_init(&bcam);
|
|
||||||
|
|
||||||
/* 3d view parameters */
|
/* 3d view parameters */
|
||||||
bcam.nearclip = b_v3d.clip_start();
|
bcam->nearclip = b_v3d.clip_start();
|
||||||
bcam.farclip = b_v3d.clip_end();
|
bcam->farclip = b_v3d.clip_end();
|
||||||
bcam.lens = b_v3d.lens();
|
bcam->lens = b_v3d.lens();
|
||||||
bcam.shuttertime = b_scene.render().motion_blur_shutter();
|
bcam->shuttertime = b_scene.render().motion_blur_shutter();
|
||||||
|
|
||||||
if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA) {
|
if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA) {
|
||||||
/* camera view */
|
/* camera view */
|
||||||
BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
|
BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
|
||||||
|
|
||||||
if(b_ob) {
|
if(b_ob) {
|
||||||
blender_camera_from_object(&bcam, b_ob);
|
blender_camera_from_object(bcam, b_ob);
|
||||||
|
|
||||||
/* magic zoom formula */
|
/* magic zoom formula */
|
||||||
bcam.zoom = (float)b_rv3d.view_camera_zoom();
|
bcam->zoom = (float)b_rv3d.view_camera_zoom();
|
||||||
bcam.zoom = (1.41421f + bcam.zoom/50.0f);
|
bcam->zoom = (1.41421f + bcam->zoom/50.0f);
|
||||||
bcam.zoom *= bcam.zoom;
|
bcam->zoom *= bcam->zoom;
|
||||||
bcam.zoom = 2.0f/bcam.zoom;
|
bcam->zoom = 2.0f/bcam->zoom;
|
||||||
|
|
||||||
/* offset */
|
/* offset */
|
||||||
bcam.offset = get_float2(b_rv3d.view_camera_offset());
|
bcam->offset = get_float2(b_rv3d.view_camera_offset());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_ORTHO) {
|
else if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_ORTHO) {
|
||||||
/* orthographic view */
|
/* orthographic view */
|
||||||
bcam.farclip *= 0.5;
|
bcam->farclip *= 0.5;
|
||||||
bcam.nearclip = -bcam.farclip;
|
bcam->nearclip = -bcam->farclip;
|
||||||
|
|
||||||
bcam.type = CAMERA_ORTHOGRAPHIC;
|
bcam->type = CAMERA_ORTHOGRAPHIC;
|
||||||
bcam.ortho_scale = b_rv3d.view_distance();
|
bcam->ortho_scale = b_rv3d.view_distance();
|
||||||
}
|
}
|
||||||
|
|
||||||
bcam.zoom *= 2.0f;
|
bcam->zoom *= 2.0f;
|
||||||
|
|
||||||
/* 3d view transform */
|
/* 3d view transform */
|
||||||
bcam.matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
|
bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void blender_camera_border(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d,
|
||||||
|
BL::RegionView3D b_rv3d, int width, int height)
|
||||||
|
{
|
||||||
|
BL::RenderSettings r = b_scene.render();
|
||||||
|
|
||||||
|
if(!r.use_border())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* camera view? */
|
||||||
|
if(!(b_rv3d && b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA))
|
||||||
|
return;
|
||||||
|
|
||||||
|
BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
|
||||||
|
|
||||||
|
if(!b_ob)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bcam->border_left = r.border_min_x();
|
||||||
|
bcam->border_right = r.border_max_x();
|
||||||
|
bcam->border_bottom = r.border_min_y();
|
||||||
|
bcam->border_top = r.border_max_y();
|
||||||
|
|
||||||
|
float cam_left, cam_right, cam_bottom, cam_top;
|
||||||
|
float view_left, view_right, view_bottom, view_top;
|
||||||
|
float view_aspect, cam_aspect, sensor_size;
|
||||||
|
|
||||||
|
/* get viewport viewplane */
|
||||||
|
BlenderCamera view_bcam;
|
||||||
|
blender_camera_init(&view_bcam);
|
||||||
|
blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height);
|
||||||
|
|
||||||
|
blender_camera_viewplane(&view_bcam, width, height,
|
||||||
|
&view_left, &view_right, &view_bottom, &view_top, &view_aspect, &sensor_size);
|
||||||
|
|
||||||
|
view_left /= view_aspect;
|
||||||
|
view_right /= view_aspect;
|
||||||
|
view_bottom /= view_aspect;
|
||||||
|
view_top /= view_aspect;
|
||||||
|
|
||||||
|
/* get camera viewplane */
|
||||||
|
BlenderCamera cam_bcam;
|
||||||
|
blender_camera_init(&cam_bcam);
|
||||||
|
blender_camera_from_object(&cam_bcam, b_ob);
|
||||||
|
|
||||||
|
width = (int)(r.resolution_x()*r.resolution_percentage()/100);
|
||||||
|
height = (int)(r.resolution_y()*r.resolution_percentage()/100);
|
||||||
|
|
||||||
|
blender_camera_viewplane(&cam_bcam, width, height,
|
||||||
|
&cam_left, &cam_right, &cam_bottom, &cam_top, &cam_aspect, &sensor_size);
|
||||||
|
|
||||||
|
cam_left /= cam_aspect;
|
||||||
|
cam_right /= cam_aspect;
|
||||||
|
cam_bottom /= cam_aspect;
|
||||||
|
cam_top /= cam_aspect;
|
||||||
|
|
||||||
|
/* determine viewport subset matching camera border */
|
||||||
|
float tmp_left = ((cam_left - view_left) / (view_right - view_left));
|
||||||
|
float tmp_right = ((cam_right - view_left) / (view_right - view_left));
|
||||||
|
float tmp_bottom = ((cam_bottom - view_bottom) / (view_top - view_bottom));
|
||||||
|
float tmp_top = ((cam_top - view_bottom) / (view_top - view_bottom));
|
||||||
|
|
||||||
|
bcam->border_left = tmp_left + bcam->border_left*(tmp_right - tmp_left);
|
||||||
|
bcam->border_right = tmp_left + bcam->border_right*(tmp_right - tmp_left);
|
||||||
|
bcam->border_bottom = tmp_bottom + bcam->border_bottom*(tmp_top - tmp_bottom);
|
||||||
|
bcam->border_top = tmp_bottom + bcam->border_top*(tmp_top - tmp_bottom);
|
||||||
|
|
||||||
|
/* clamp */
|
||||||
|
bcam->border_left = max(bcam->border_left, 0.0f);
|
||||||
|
bcam->border_right = min(bcam->border_right, 1.0f);
|
||||||
|
bcam->border_bottom = max(bcam->border_bottom, 0.0f);
|
||||||
|
bcam->border_top = min(bcam->border_top, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
|
||||||
|
{
|
||||||
|
BlenderCamera bcam;
|
||||||
|
blender_camera_init(&bcam);
|
||||||
|
blender_camera_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height);
|
||||||
|
blender_camera_border(&bcam, b_scene, b_v3d, b_rv3d, width, height);
|
||||||
|
|
||||||
/* sync */
|
|
||||||
blender_camera_sync(scene->camera, &bcam, width, height);
|
blender_camera_sync(scene->camera, &bcam, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, BL::RegionView3D b_rv3d, int width, int height)
|
BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, Camera *cam, int width, int height)
|
||||||
{
|
{
|
||||||
BufferParams params;
|
BufferParams params;
|
||||||
|
|
||||||
params.full_width = width;
|
params.full_width = width;
|
||||||
params.full_height = height;
|
params.full_height = height;
|
||||||
|
|
||||||
/* border render */
|
if(b_scene.render().use_border()) {
|
||||||
BL::RenderSettings r = b_scene.render();
|
/* border render */
|
||||||
|
params.full_x = cam->border_left*width;
|
||||||
if(!b_rv3d && r.use_border()) {
|
params.full_y = cam->border_bottom*height;
|
||||||
params.full_x = r.border_min_x()*width;
|
params.width = (int)(cam->border_right*width) - params.full_x;
|
||||||
params.full_y = r.border_min_y()*height;
|
params.height = (int)(cam->border_top*height) - params.full_y;
|
||||||
params.width = (int)(r.border_max_x()*width) - params.full_x;
|
|
||||||
params.height = (int)(r.border_max_y()*height) - params.full_y;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
params.width = width;
|
params.width = width;
|
||||||
|
@@ -106,7 +106,7 @@ void BlenderSession::create_session()
|
|||||||
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
|
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
|
||||||
|
|
||||||
/* set buffer parameters */
|
/* set buffer parameters */
|
||||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
|
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, width, height);
|
||||||
session->reset(buffer_params, session_params.samples);
|
session->reset(buffer_params, session_params.samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ void BlenderSession::render()
|
|||||||
{
|
{
|
||||||
/* get buffer parameters */
|
/* get buffer parameters */
|
||||||
SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
|
SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
|
||||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
|
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, width, height);
|
||||||
int w = buffer_params.width, h = buffer_params.height;
|
int w = buffer_params.width, h = buffer_params.height;
|
||||||
|
|
||||||
/* create render result */
|
/* create render result */
|
||||||
@@ -326,7 +326,7 @@ void BlenderSession::synchronize()
|
|||||||
|
|
||||||
/* reset if needed */
|
/* reset if needed */
|
||||||
if(scene->need_reset()) {
|
if(scene->need_reset()) {
|
||||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
|
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, width, height);
|
||||||
session->reset(buffer_params, session_params.samples);
|
session->reset(buffer_params, session_params.samples);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,7 +364,7 @@ bool BlenderSession::draw(int w, int h)
|
|||||||
/* reset if requested */
|
/* reset if requested */
|
||||||
if(reset) {
|
if(reset) {
|
||||||
SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
|
SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
|
||||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
|
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, w, h);
|
||||||
|
|
||||||
session->reset(buffer_params, session_params.samples);
|
session->reset(buffer_params, session_params.samples);
|
||||||
}
|
}
|
||||||
@@ -374,7 +374,7 @@ bool BlenderSession::draw(int w, int h)
|
|||||||
update_status_progress();
|
update_status_progress();
|
||||||
|
|
||||||
/* draw */
|
/* draw */
|
||||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
|
BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, scene->camera, width, height);
|
||||||
|
|
||||||
return !session->draw(buffer_params);
|
return !session->draw(buffer_params);
|
||||||
}
|
}
|
||||||
|
@@ -63,7 +63,7 @@ public:
|
|||||||
static SceneParams get_scene_params(BL::Scene b_scene, bool background);
|
static SceneParams get_scene_params(BL::Scene b_scene, bool background);
|
||||||
static SessionParams get_session_params(BL::UserPreferences b_userpref, BL::Scene b_scene, bool background);
|
static SessionParams get_session_params(BL::UserPreferences b_userpref, BL::Scene b_scene, bool background);
|
||||||
static bool get_session_pause(BL::Scene b_scene, bool background);
|
static bool get_session_pause(BL::Scene b_scene, bool background);
|
||||||
static BufferParams get_buffer_params(BL::Scene b_scene, BL::RegionView3D b_rv3d, int width, int height);
|
static BufferParams get_buffer_params(BL::Scene b_scene, Camera *cam, int width, int height);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* sync */
|
/* sync */
|
||||||
|
@@ -311,8 +311,14 @@ void DisplayBuffer::draw_set(int width, int height)
|
|||||||
|
|
||||||
void DisplayBuffer::draw(Device *device)
|
void DisplayBuffer::draw(Device *device)
|
||||||
{
|
{
|
||||||
if(draw_width != 0 && draw_height != 0)
|
if(draw_width != 0 && draw_height != 0) {
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(params.full_x, params.full_y, 0.0f);
|
||||||
|
|
||||||
device->draw_pixels(rgba, 0, draw_width, draw_height, 0, params.width, params.height, transparent);
|
device->draw_pixels(rgba, 0, draw_width, draw_height, 0, params.width, params.height, transparent);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DisplayBuffer::draw_ready()
|
bool DisplayBuffer::draw_ready()
|
||||||
|
@@ -58,6 +58,11 @@ Camera::Camera()
|
|||||||
bottom = -1.0f;
|
bottom = -1.0f;
|
||||||
top = 1.0f;
|
top = 1.0f;
|
||||||
|
|
||||||
|
border_left = 0.0f;
|
||||||
|
border_right = 1.0f;
|
||||||
|
border_bottom = 0.0f;
|
||||||
|
border_top = 1.0f;
|
||||||
|
|
||||||
screentoworld = transform_identity();
|
screentoworld = transform_identity();
|
||||||
rastertoworld = transform_identity();
|
rastertoworld = transform_identity();
|
||||||
ndctoworld = transform_identity();
|
ndctoworld = transform_identity();
|
||||||
@@ -248,6 +253,10 @@ bool Camera::modified(const Camera& cam)
|
|||||||
(right == cam.right) &&
|
(right == cam.right) &&
|
||||||
(bottom == cam.bottom) &&
|
(bottom == cam.bottom) &&
|
||||||
(top == cam.top) &&
|
(top == cam.top) &&
|
||||||
|
(border_left == cam.border_left) &&
|
||||||
|
(border_right == cam.border_right) &&
|
||||||
|
(border_bottom == cam.border_bottom) &&
|
||||||
|
(border_top == cam.border_top) &&
|
||||||
(matrix == cam.matrix) &&
|
(matrix == cam.matrix) &&
|
||||||
(motion == cam.motion) &&
|
(motion == cam.motion) &&
|
||||||
(use_motion == cam.use_motion) &&
|
(use_motion == cam.use_motion) &&
|
||||||
|
@@ -67,6 +67,9 @@ public:
|
|||||||
int width, height;
|
int width, height;
|
||||||
float left, right, bottom, top;
|
float left, right, bottom, top;
|
||||||
|
|
||||||
|
/* border */
|
||||||
|
float border_left, border_right, border_bottom, border_top;
|
||||||
|
|
||||||
/* transformation */
|
/* transformation */
|
||||||
Transform matrix;
|
Transform matrix;
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "util_foreach.h"
|
#include "util_foreach.h"
|
||||||
#include "util_function.h"
|
#include "util_function.h"
|
||||||
|
#include "util_opengl.h"
|
||||||
#include "util_task.h"
|
#include "util_task.h"
|
||||||
#include "util_time.h"
|
#include "util_time.h"
|
||||||
|
|
||||||
|
@@ -1146,7 +1146,6 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
|
|||||||
|
|
||||||
/* border */
|
/* border */
|
||||||
if (scene->r.mode & R_BORDER) {
|
if (scene->r.mode & R_BORDER) {
|
||||||
|
|
||||||
cpack(0);
|
cpack(0);
|
||||||
x3 = x1 + scene->r.border.xmin * (x2 - x1);
|
x3 = x1 + scene->r.border.xmin * (x2 - x1);
|
||||||
y3 = y1 + scene->r.border.ymin * (y2 - y1);
|
y3 = y1 + scene->r.border.ymin * (y2 - y1);
|
||||||
@@ -2735,12 +2734,15 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
|
|||||||
BLF_draw_default_ascii(22, ar->winy - 17, 0.0f, printable, sizeof(printable));
|
BLF_draw_default_ascii(22, ar->winy - 17, 0.0f, printable, sizeof(printable));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar)
|
static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const char **grid_unit);
|
||||||
|
|
||||||
|
static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar, int draw_border)
|
||||||
{
|
{
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
View3D *v3d = CTX_wm_view3d(C);
|
View3D *v3d = CTX_wm_view3d(C);
|
||||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||||
RenderEngineType *type;
|
RenderEngineType *type;
|
||||||
|
GLint scissor[4];
|
||||||
|
|
||||||
/* create render engine */
|
/* create render engine */
|
||||||
if (!rv3d->render_engine) {
|
if (!rv3d->render_engine) {
|
||||||
@@ -2757,17 +2759,48 @@ static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar)
|
|||||||
view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
|
view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
|
||||||
|
|
||||||
/* background draw */
|
/* background draw */
|
||||||
|
ED_region_pixelspace(ar);
|
||||||
|
|
||||||
|
if (draw_border) {
|
||||||
|
/* for border draw, we only need to clear a subset of the 3d view */
|
||||||
|
rctf viewborder;
|
||||||
|
rcti cliprct;
|
||||||
|
|
||||||
|
ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, FALSE);
|
||||||
|
|
||||||
|
cliprct.xmin = viewborder.xmin + scene->r.border.xmin * (viewborder.xmax - viewborder.xmin);
|
||||||
|
cliprct.ymin = viewborder.ymin + scene->r.border.ymin * (viewborder.ymax - viewborder.ymin);
|
||||||
|
cliprct.xmax = viewborder.xmin + scene->r.border.xmax * (viewborder.xmax - viewborder.xmin);
|
||||||
|
cliprct.ymax = viewborder.ymin + scene->r.border.ymax * (viewborder.ymax - viewborder.ymin);
|
||||||
|
|
||||||
|
cliprct.xmin += ar->winrct.xmin;
|
||||||
|
cliprct.xmax += ar->winrct.xmin;
|
||||||
|
cliprct.ymin += ar->winrct.ymin;
|
||||||
|
cliprct.ymax += ar->winrct.ymin;
|
||||||
|
|
||||||
|
cliprct.xmin = MAX2(cliprct.xmin, ar->winrct.xmin);
|
||||||
|
cliprct.ymin = MAX2(cliprct.ymin, ar->winrct.ymin);
|
||||||
|
cliprct.xmax = MIN2(cliprct.xmax, ar->winrct.xmax);
|
||||||
|
cliprct.ymax = MIN2(cliprct.ymax, ar->winrct.ymax);
|
||||||
|
|
||||||
|
glGetIntegerv(GL_SCISSOR_BOX, scissor);
|
||||||
|
glScissor(cliprct.xmin, cliprct.ymin, cliprct.xmax - cliprct.xmin, cliprct.ymax - cliprct.ymin);
|
||||||
|
}
|
||||||
|
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
ED_region_pixelspace(ar);
|
|
||||||
|
|
||||||
/* render result draw */
|
|
||||||
if (v3d->flag & V3D_DISPBGPICS)
|
if (v3d->flag & V3D_DISPBGPICS)
|
||||||
view3d_draw_bgpic(scene, ar, v3d, FALSE, TRUE);
|
view3d_draw_bgpic(scene, ar, v3d, FALSE, TRUE);
|
||||||
else
|
else
|
||||||
fdrawcheckerboard(0, 0, ar->winx, ar->winy);
|
fdrawcheckerboard(0, 0, ar->winx, ar->winy);
|
||||||
|
|
||||||
|
if (draw_border) {
|
||||||
|
/* restore scissor as it was before */
|
||||||
|
glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* render result draw */
|
||||||
type = rv3d->render_engine->type;
|
type = rv3d->render_engine->type;
|
||||||
type->view_draw(rv3d->render_engine, C);
|
type->view_draw(rv3d->render_engine, C);
|
||||||
|
|
||||||
@@ -3028,16 +3061,22 @@ static void view3d_main_area_draw_info(const bContext *C, ARegion *ar, const cha
|
|||||||
|
|
||||||
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||||
{
|
{
|
||||||
|
Scene *scene = CTX_data_scene(C);
|
||||||
View3D *v3d = CTX_wm_view3d(C);
|
View3D *v3d = CTX_wm_view3d(C);
|
||||||
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||||
const char *grid_unit = NULL;
|
const char *grid_unit = NULL;
|
||||||
|
int draw_border = (rv3d->persp == RV3D_CAMOB && (scene->r.mode & R_BORDER));
|
||||||
|
|
||||||
/* draw viewport using external renderer? */
|
/* draw viewport using opengl */
|
||||||
if (!(v3d->drawtype == OB_RENDER && view3d_main_area_draw_engine(C, ar))) {
|
if (v3d->drawtype != OB_RENDER || draw_border) {
|
||||||
/* draw viewport using opengl */
|
|
||||||
view3d_main_area_draw_objects(C, ar, &grid_unit);
|
view3d_main_area_draw_objects(C, ar, &grid_unit);
|
||||||
ED_region_pixelspace(ar);
|
ED_region_pixelspace(ar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* draw viewport using external renderer */
|
||||||
|
if (v3d->drawtype == OB_RENDER)
|
||||||
|
view3d_main_area_draw_engine(C, ar, draw_border);
|
||||||
|
|
||||||
view3d_main_area_draw_info(C, ar, grid_unit);
|
view3d_main_area_draw_info(C, ar, grid_unit);
|
||||||
|
|
||||||
v3d->flag |= V3D_INVALID_BACKBUF;
|
v3d->flag |= V3D_INVALID_BACKBUF;
|
||||||
|
Reference in New Issue
Block a user