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 }
63 if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) {
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.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
@ RE_USE_GPU_CONTEXT
Definition RE_engine.h:54
const Value * lookup_ptr(const Key &key) const
Definition BLI_map.hh:484
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
ListBase passes
Definition RE_pipeline.h:97
ListBase layers
char name[64]
float xmax
float xmin
float ymax
float ymin