Fixed border rendering for Hydra render engines (Hydra Storm). #113376

Merged
Brecht Van Lommel merged 1 commits from BogdanNagirniak/blender:fix-hydra-border-render into blender-v4.0-release 2023-10-09 16:02:07 +02:00
1 changed files with 16 additions and 18 deletions

View File

@ -113,35 +113,32 @@ ViewSettings::ViewSettings(bContext *context)
}
else {
if (view3d->flag2 & V3D_RENDER_BORDER) {
int x = x1, y = y1;
int dx = x2 - x1, dy = y2 - y1;
x1 = int(x + view3d->render_border.xmin * dx);
x2 = int(x + view3d->render_border.xmax * dx);
y1 = int(y + view3d->render_border.ymin * dy);
y2 = int(y + view3d->render_border.ymax * dy);
x1 = view3d->render_border.xmin * screen_width;
x2 = view3d->render_border.xmax * screen_width;
y1 = view3d->render_border.ymin * screen_height;
y2 = view3d->render_border.ymax * screen_height;
}
}
border = pxr::GfVec4i(x1, y1, x2 - x1, y2 - y1);
border = pxr::GfVec4i(x1, y1, x2, y2);
}
int ViewSettings::width()
{
return border[2];
return border[2] - border[0];
}
int ViewSettings::height()
{
return border[3];
return border[3] - border[1];
}
pxr::GfCamera ViewSettings::gf_camera()
{
return camera_data.gf_camera(pxr::GfVec4f(float(border[0]) / screen_width,
float(border[1]) / screen_height,
float(border[2]) / screen_width,
float(border[3]) / screen_height));
float(width()) / screen_width,
float(height()) / screen_height));
}
DrawTexture::DrawTexture()
@ -221,10 +218,7 @@ void ViewportEngine::render()
pxr::GfCamera gf_camera = view_settings.gf_camera();
free_camera_delegate_->SetCamera(gf_camera);
pxr::GfVec4d viewport(view_settings.border[0],
view_settings.border[1],
view_settings.border[2],
view_settings.border[3]);
pxr::GfVec4d viewport(0.0, 0.0, view_settings.width(), view_settings.height());
render_task_delegate_->set_viewport(viewport);
if (light_tasks_delegate_) {
light_tasks_delegate_->set_viewport(viewport);
@ -245,15 +239,19 @@ void ViewportEngine::render()
GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE);
GPU_shader_bind(shader);
pxr::GfVec4d draw_viewport(view_settings.border[0],
view_settings.border[1],
view_settings.border[2],
view_settings.border[3]);
GPURenderTaskDelegate *gpu_task = dynamic_cast<GPURenderTaskDelegate *>(
render_task_delegate_.get());
if (gpu_task) {
draw_texture_.draw(shader, viewport, gpu_task->aov_texture(pxr::HdAovTokens->color));
draw_texture_.draw(shader, draw_viewport, gpu_task->aov_texture(pxr::HdAovTokens->color));
}
else {
draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr);
render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture());
draw_texture_.draw(shader, viewport);
draw_texture_.draw(shader, draw_viewport);
}
GPU_shader_unbind();