Blender V5.0
final_engine.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "final_engine.hh"
6#include "camera.hh"
7
8#include <pxr/imaging/hd/light.h>
9#include <pxr/imaging/hd/renderBuffer.h>
10
11#include "DNA_scene_types.h"
12
13#include "BLI_listbase.h"
14#include "BLI_time.h"
15#include "BLI_timecode.h"
16
17#include "BKE_lib_id.hh"
18
20
21#include "IMB_imbuf_types.hh"
22
23#include "RE_engine.h"
24
25namespace blender::render::hydra {
26
28{
30
31 char scene_name[MAX_ID_FULL_NAME];
32 BKE_id_full_name_get(scene_name, &scene_->id, 0);
33
34 const RenderData &r = scene_->r;
35 pxr::GfVec4f border(0, 0, 1, 1);
36 if (r.mode & R_BORDER) {
37 border.Set(r.border.xmin,
38 r.border.ymin,
39 r.border.xmax - r.border.xmin,
40 r.border.ymax - r.border.ymin);
41 }
42 pxr::GfVec2i image_res(r.xsch * r.size / 100, r.ysch * r.size / 100);
43 int width = image_res[0] * border[2];
44 int height = image_res[1] * border[3];
45
46 pxr::GfCamera camera = gf_camera(scene_->camera, image_res, border);
47
48 free_camera_delegate_->SetCamera(camera);
49 render_task_delegate_->set_viewport(pxr::GfVec4d(0, 0, width, height));
51 light_tasks_delegate_->set_viewport(pxr::GfVec4d(0, 0, width, height));
52 }
53
55 RenderLayer *rlayer = (RenderLayer *)rr->layers.first;
56 LISTBASE_FOREACH (RenderPass *, rpass, &rlayer->passes) {
57 pxr::TfToken *aov_token = aov_tokens_.lookup_ptr(rpass->name);
58 if (!aov_token) {
59 CLOG_WARN(LOG_HYDRA_RENDER, "Couldn't find AOV token for render pass: %s", rpass->name);
60 continue;
61 }
62 render_task_delegate_->add_aov(*aov_token);
63 }
64 if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) {
65 /* For GPU context engine color and depth AOVs has to be added anyway */
66 render_task_delegate_->add_aov(pxr::HdAovTokens->color);
67 render_task_delegate_->add_aov(pxr::HdAovTokens->depth);
68 }
69
71
72 auto t = tasks();
73
74 char elapsed_time[32];
75 double time_begin = BLI_time_now_seconds();
76 float percent_done = 0.0;
77
78 while (true) {
79 engine_->Execute(render_index_.get(), &t);
80
82 break;
83 }
84
85 percent_done = renderer_percent_done();
87 elapsed_time, sizeof(elapsed_time), BLI_time_now_seconds() - time_begin);
88 notify_status(percent_done / 100.0,
89 std::string(scene_name) + ": " + view_layer->name,
90 std::string("Render Time: ") + elapsed_time +
91 " | Done: " + std::to_string(int(percent_done)) + "%");
92
93 if (render_task_delegate_->is_converged()) {
94 break;
95 }
96
97 update_render_result(width, height, view_layer->name);
98 }
99
100 update_render_result(width, height, view_layer->name);
101 render_task_delegate_->unbind();
102}
103
104void FinalEngine::set_render_setting(const std::string &key, const pxr::VtValue &val)
105{
106 if (STRPREFIX(key.c_str(), "aovToken:")) {
107 aov_tokens_.add_overwrite(key.substr(key.find(":") + 1),
108 pxr::TfToken(val.UncheckedGet<std::string>()));
109 return;
110 }
112}
113
114void FinalEngine::notify_status(float progress, const std::string &title, const std::string &info)
115{
117 RE_engine_update_stats(bl_engine_, title.c_str(), info.c_str());
118}
119
120void FinalEngine::update_render_result(int width, int height, const char *layer_name)
121{
122 RenderResult *rr = RE_engine_begin_result(bl_engine_, 0, 0, width, height, layer_name, nullptr);
123
124 RenderLayer *rlayer = static_cast<RenderLayer *>(
125 BLI_findstring(&rr->layers, layer_name, offsetof(RenderLayer, name)));
126
127 if (rlayer) {
128 LISTBASE_FOREACH (RenderPass *, rpass, &rlayer->passes) {
129 pxr::TfToken *aov_token = aov_tokens_.lookup_ptr(rpass->name);
130 if (aov_token) {
131 render_task_delegate_->read_aov(*aov_token, rpass->ibuf->float_buffer.data);
132 }
133 }
134 }
135
136 RE_engine_end_result(bl_engine_, rr, false, false, false);
137}
138
139} // namespace blender::render::hydra
void BKE_id_full_name_get(char name[MAX_ID_FULL_NAME], const ID *id, char separator_char)
Definition lib_id.cc:2432
#define MAX_ID_FULL_NAME
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:608
Platform independent time functions.
double BLI_time_now_seconds(void)
Definition time.cc:113
size_t BLI_timecode_string_from_time_simple(char *str, size_t maxncpy, double time_seconds) ATTR_NONNULL()
Definition timecode.cc:170
#define STRPREFIX(a, b)
#define CLOG_WARN(clg_ref,...)
Definition CLG_log.h:189
ViewLayer * DEG_get_evaluated_view_layer(const Depsgraph *graph)
@ R_BORDER
@ RE_USE_GPU_CONTEXT
Definition RE_engine.h:50
const Value * lookup_ptr(const Key &key) const
Definition BLI_map.hh:508
RenderEngine * bl_engine_
Definition engine.hh:36
pxr::HdTaskSharedPtrVector tasks()
std::unique_ptr< RenderTaskDelegate > render_task_delegate_
Definition engine.hh:51
std::unique_ptr< io::hydra::CameraDelegate > free_camera_delegate_
Definition engine.hh:47
std::unique_ptr< pxr::HdRenderIndex > render_index_
Definition engine.hh:45
virtual void set_render_setting(const std::string &key, const pxr::VtValue &val)
std::unique_ptr< LightTasksDelegate > light_tasks_delegate_
Definition engine.hh:52
std::unique_ptr< pxr::HdEngine > engine_
Definition engine.hh:53
void set_render_setting(const std::string &key, const pxr::VtValue &val) override
void notify_status(float progress, const std::string &title, const std::string &info) override
#define offsetof(t, d)
RenderResult * RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
RenderResult * RE_engine_get_result(RenderEngine *engine)
bool RE_engine_test_break(RenderEngine *engine)
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
void RE_engine_end_result(RenderEngine *engine, RenderResult *result, bool cancel, bool highlight, bool merge_results)
void RE_engine_update_progress(RenderEngine *engine, float progress)
struct CLG_LogRef * LOG_HYDRA_RENDER
static pxr::GfCamera gf_camera(const CameraParams &params, const pxr::GfVec2i &res, const pxr::GfVec4f &border)
const char * name
void * first
ListBase passes
Definition RE_pipeline.h:94
ListBase layers
char name[64]
float xmax
float xmin
float ymax
float ymin