Blender V4.3
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_time.h"
14#include "BLI_timecode.h"
15
16#include "BKE_lib_id.hh"
17
19
20#include "IMB_imbuf_types.hh"
21
22#include "RE_engine.h"
23
24namespace blender::render::hydra {
25
27{
29
30 char scene_name[MAX_ID_FULL_NAME];
31 BKE_id_full_name_get(scene_name, &scene_->id, 0);
32
33 const RenderData &r = scene_->r;
34 pxr::GfVec4f border(0, 0, 1, 1);
35 if (r.mode & R_BORDER) {
36 border.Set(r.border.xmin,
37 r.border.ymin,
38 r.border.xmax - r.border.xmin,
39 r.border.ymax - r.border.ymin);
40 }
41 pxr::GfVec2i image_res(r.xsch * r.size / 100, r.ysch * r.size / 100);
42 int width = image_res[0] * border[2];
43 int height = image_res[1] * border[3];
44
45 pxr::GfCamera camera = gf_camera(scene_->camera, image_res, border);
46
47 free_camera_delegate_->SetCamera(camera);
48 render_task_delegate_->set_viewport(pxr::GfVec4d(0, 0, width, height));
50 light_tasks_delegate_->set_viewport(pxr::GfVec4d(0, 0, width, height));
51 }
52
54 RenderLayer *rlayer = (RenderLayer *)rr->layers.first;
55 LISTBASE_FOREACH (RenderPass *, rpass, &rlayer->passes) {
56 pxr::TfToken *aov_token = aov_tokens_.lookup_ptr(rpass->name);
57 if (!aov_token) {
58 CLOG_WARN(LOG_HYDRA_RENDER, "Couldn't find AOV token for render pass: %s", rpass->name);
59 continue;
60 }
61 render_task_delegate_->add_aov(*aov_token);
62 }
64 /* For GPU context engine color and depth AOVs has to be added anyway */
65 render_task_delegate_->add_aov(pxr::HdAovTokens->color);
66 render_task_delegate_->add_aov(pxr::HdAovTokens->depth);
67 }
68
70
71 auto t = tasks();
72 engine_->Execute(render_index_.get(), &t);
73
74 char elapsed_time[32];
75 double time_begin = BLI_time_now_seconds();
76 float percent_done = 0.0;
77
78 while (true) {
80 break;
81 }
82
83 percent_done = renderer_percent_done();
85 elapsed_time, sizeof(elapsed_time), BLI_time_now_seconds() - time_begin);
86 notify_status(percent_done / 100.0,
87 std::string(scene_name) + ": " + view_layer->name,
88 std::string("Render Time: ") + elapsed_time +
89 " | Done: " + std::to_string(int(percent_done)) + "%");
90
91 if (render_task_delegate_->is_converged()) {
92 break;
93 }
94
95 update_render_result(width, height, view_layer->name);
96 }
97
98 update_render_result(width, height, view_layer->name);
99 render_task_delegate_->unbind();
100}
101
102void FinalEngine::set_render_setting(const std::string &key, const pxr::VtValue &val)
103{
104 if (STRPREFIX(key.c_str(), "aovToken:")) {
105 aov_tokens_.add_overwrite(key.substr(key.find(":") + 1),
106 pxr::TfToken(val.UncheckedGet<std::string>()));
107 return;
108 }
110}
111
112void FinalEngine::notify_status(float progress, const std::string &title, const std::string &info)
113{
115 RE_engine_update_stats(bl_engine_, title.c_str(), info.c_str());
116}
117
118void FinalEngine::update_render_result(int width, int height, const char *layer_name)
119{
120 RenderResult *rr = RE_engine_begin_result(bl_engine_, 0, 0, width, height, layer_name, nullptr);
121
122 RenderLayer *rlayer = static_cast<RenderLayer *>(
123 BLI_findstring(&rr->layers, layer_name, offsetof(RenderLayer, name)));
124
125 if (rlayer) {
126 LISTBASE_FOREACH (RenderPass *, rpass, &rlayer->passes) {
127 pxr::TfToken *aov_token = aov_tokens_.lookup_ptr(rpass->name);
128 if (aov_token) {
129 render_task_delegate_->read_aov(*aov_token, rpass->ibuf->float_buffer.data);
130 }
131 }
132 }
133
134 RE_engine_end_result(bl_engine_, rr, false, false, false);
135}
136
137} // 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:2365
#define MAX_ID_FULL_NAME
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
Platform independent time functions.
double BLI_time_now_seconds(void)
Definition time.c:65
size_t BLI_timecode_string_from_time_simple(char *str, size_t maxncpy, double time_seconds) ATTR_NONNULL()
Definition timecode.c:171
#define STRPREFIX(a, b)
#define CLOG_WARN(clg_ref,...)
Definition CLG_log.h:181
ViewLayer * DEG_get_evaluated_view_layer(const Depsgraph *graph)
@ R_BORDER
Contains defines and structs used throughout the imbuf module.
@ RE_USE_GPU_CONTEXT
Definition RE_engine.h:54
const Value * lookup_ptr(const Key &key) const
Definition BLI_map.hh:484
bool add_overwrite(const Key &key, const Value &value)
Definition BLI_map.hh:301
RenderEngine * bl_engine_
Definition engine.hh:36
std::unique_ptr< pxr::HdxFreeCameraSceneDelegate > free_camera_delegate_
Definition engine.hh:51
pxr::HdTaskSharedPtrVector tasks()
std::unique_ptr< RenderTaskDelegate > render_task_delegate_
Definition engine.hh:50
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)
void * first
RenderEngineType * type
Definition RE_engine.h:134
ListBase passes
Definition RE_pipeline.h:97
ListBase layers
struct RenderData r
struct Object * camera
char name[64]
float xmax
float xmin
float ymax
float ymin