Recreate PreviewEngine when render_delegate_name is changed #36

Merged
Bogdan Nagirniak merged 6 commits from BLEN-404 into hydra-render 2023-05-05 14:49:30 +02:00
5 changed files with 21 additions and 11 deletions

View File

@ -25,7 +25,7 @@ Engine::Engine(RenderEngine *bl_engine, const std::string &render_delegate_name)
pxr::TF_PY_ALLOW_THREADS_IN_SCOPE(); pxr::TF_PY_ALLOW_THREADS_IN_SCOPE();
render_delegate_ = registry.CreateRenderDelegate(pxr::TfToken(render_delegate_name_)); render_delegate_ = registry.CreateRenderDelegate(pxr::TfToken(render_delegate_name_));
/* Current USD (23.02) has limited support for Vulkan. To make it works USD should be built /* USD has limited support for Vulkan. To make it works USD should be built
* with PXR_ENABLE_VULKAN_SUPPORT=TRUE which is not possible now */ * with PXR_ENABLE_VULKAN_SUPPORT=TRUE which is not possible now */
if (GPU_backend_get_type() == GPU_BACKEND_VULKAN) { if (GPU_backend_get_type() == GPU_BACKEND_VULKAN) {
BLI_setenv("HGI_ENABLE_VULKAN", "1"); BLI_setenv("HGI_ENABLE_VULKAN", "1");

View File

@ -14,16 +14,16 @@ const double LIFETIME = 180.0;
std::unique_ptr<PreviewEngine> PreviewEngine::instance_; std::unique_ptr<PreviewEngine> PreviewEngine::instance_;
PreviewEngine *PreviewEngine::get_instance(RenderEngine *bl_engine, PreviewEngine *PreviewEngine::get_instance(RenderEngine *bl_engine,
const std::string &render_delegate_id) const std::string &render_delegate_name)
{ {
if (!instance_) { if (!instance_) {
instance_ = std::make_unique<PreviewEngine>(bl_engine, render_delegate_id); instance_ = std::make_unique<PreviewEngine>(bl_engine, render_delegate_name);
} }
if (BLI_timer_is_registered((uintptr_t)instance_.get())) { if (BLI_timer_is_registered((uintptr_t)instance_.get())) {
/* Unregister timer while PreviewEngine is working */ /* Unregister timer while PreviewEngine is working */
BLI_timer_unregister((uintptr_t)instance_.get()); BLI_timer_unregister((uintptr_t)instance_.get());
} }
instance_->update(bl_engine, render_delegate_id); instance_->update(bl_engine, render_delegate_name);
return instance_.get(); return instance_.get();
} }
@ -96,10 +96,13 @@ double PreviewEngine::free_instance(uintptr_t uuid, void *user_data)
return -1; return -1;
} }
void PreviewEngine::update(RenderEngine *bl_engine, const std::string &render_delegate_id) void PreviewEngine::update(RenderEngine *bl_engine, const std::string &render_delegate_name)
{ {
this->bl_engine_ = bl_engine; bl_engine_ = bl_engine;
/* TODO: recreate render_delegate when render_delegate_id is changed */ if (render_delegate_name != render_delegate_name_) {
render_delegate_->Stop();
instance_.reset(new PreviewEngine(bl_engine, render_delegate_name));
}
} }
void PreviewEngine::update_render_result(std::vector<float> &pixels) void PreviewEngine::update_render_result(std::vector<float> &pixels)

View File

@ -12,7 +12,7 @@ class PreviewEngine : public FinalEngine {
using FinalEngine::FinalEngine; using FinalEngine::FinalEngine;
static PreviewEngine *get_instance(RenderEngine *bl_engine, static PreviewEngine *get_instance(RenderEngine *bl_engine,
const std::string &render_delegate_id); const std::string &render_delegate_name);
static void schedule_free(); static void schedule_free();
void sync(Depsgraph *depsgraph, void sync(Depsgraph *depsgraph,
@ -25,7 +25,7 @@ class PreviewEngine : public FinalEngine {
static double free_instance(uintptr_t uuid, void *user_data); static double free_instance(uintptr_t uuid, void *user_data);
static std::unique_ptr<PreviewEngine> instance_; static std::unique_ptr<PreviewEngine> instance_;
void update(RenderEngine *bl_engine, const std::string &render_delegate_id); void update(RenderEngine *bl_engine, const std::string &render_delegate_name);
void update_render_result(std::vector<float> &pixels); void update_render_result(std::vector<float> &pixels);
}; };

View File

@ -15,7 +15,7 @@ CLG_LOGREF_DECLARE_GLOBAL(LOG_RENDER_HYDRA_SCENE, "render.hydra.scene");
BlenderSceneDelegate::BlenderSceneDelegate(pxr::HdRenderIndex *parent_index, BlenderSceneDelegate::BlenderSceneDelegate(pxr::HdRenderIndex *parent_index,
pxr::SdfPath const &delegate_id, pxr::SdfPath const &delegate_id,
BlenderSceneDelegate::EngineType engine_type, BlenderSceneDelegate::EngineType engine_type,
std::string render_delegate_name) const std::string &render_delegate_name)
: HdSceneDelegate(parent_index, delegate_id), : HdSceneDelegate(parent_index, delegate_id),
engine_type(engine_type), engine_type(engine_type),
render_delegate_name(render_delegate_name) render_delegate_name(render_delegate_name)
@ -187,6 +187,11 @@ void BlenderSceneDelegate::clear()
objects_.clear(); objects_.clear();
instancers_.clear(); instancers_.clear();
materials_.clear(); materials_.clear();
depsgraph = nullptr;
context = nullptr;
scene = nullptr;
view3d = nullptr;
} }
pxr::SdfPath BlenderSceneDelegate::prim_id(ID *id, const char *prefix) const pxr::SdfPath BlenderSceneDelegate::prim_id(ID *id, const char *prefix) const
@ -253,6 +258,8 @@ InstancerData *BlenderSceneDelegate::instancer_data(pxr::SdfPath const &id, bool
{ {
pxr::SdfPath p_id; pxr::SdfPath p_id;
if (child_id) { if (child_id) {
/* Getting instancer path id from child Mesh instance (consist with 3 path elements) and
* Light instance (consist with 4 path elements) */
int n = id.GetPathElementCount(); int n = id.GetPathElementCount();
if (n == 3) { if (n == 3) {
p_id = id.GetParentPath(); p_id = id.GetParentPath();

View File

@ -30,7 +30,7 @@ class BlenderSceneDelegate : public pxr::HdSceneDelegate {
BlenderSceneDelegate(pxr::HdRenderIndex *parent_index, BlenderSceneDelegate(pxr::HdRenderIndex *parent_index,
pxr::SdfPath const &delegate_id, pxr::SdfPath const &delegate_id,
BlenderSceneDelegate::EngineType engine_type, BlenderSceneDelegate::EngineType engine_type,
std::string render_delegate_name); const std::string &render_delegate_name);
~BlenderSceneDelegate() override = default; ~BlenderSceneDelegate() override = default;
/* Delegate methods */ /* Delegate methods */