Add IBL support #29

Merged
Bogdan Nagirniak merged 5 commits from BLEN-385 into hydra-render 2023-04-27 09:25:11 +02:00
14 changed files with 117 additions and 109 deletions

View File

@ -58,8 +58,6 @@ set(SRC
viewport_engine.cc
camera.h
camera.cc
utils.h
utils.cc
render_task_delegate.cc
render_task_delegate.h
@ -84,6 +82,8 @@ set(SRC
scene_delegate/world.cc
scene_delegate/instancer.h
scene_delegate/instancer.cc
scene_delegate/image.h
scene_delegate/image.cc
)
set(LIB

View File

@ -3,9 +3,10 @@
#include "DNA_camera_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
#include "camera.h"
#include "utils.h"
#include "scene_delegate/object.h"
namespace blender::render::hydra {

View File

@ -13,11 +13,8 @@
#include "final_engine.h"
#include "preview_engine.h"
#include "utils.h"
#include "viewport_engine.h"
#include "BLI_timer.h"
namespace blender::render::hydra {
static PyObject *init_func(PyObject * /*self*/, PyObject *args)

View File

@ -6,7 +6,6 @@
#include "DEG_depsgraph_query.h"
#include "DNA_scene_types.h"
#include "..\utils.h"
#include "blender_scene_delegate.h"
namespace blender::render::hydra {
@ -191,7 +190,7 @@ pxr::SdfPath BlenderSceneDelegate::prim_id(ID *id, const char *prefix) const
{
/* Making id of object in form like <prefix>_<pointer in 16 hex digits format> */
char str[32];
snprintf(str, 32, "%s_%016llx", prefix, (uint64_t)id);
snprintf(str, 32, "%s_%016llx", prefix, (uintptr_t)id);
return GetDelegateID().AppendElementString(str);
}

View File

@ -0,0 +1,78 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#include <pxr/imaging/hio/imageRegistry.h>
#include "BKE_appdir.h"
#include "BKE_image.h"
#include "BKE_image_save.h"
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "DNA_windowmanager_types.h"
#include "blender_scene_delegate.h"
#include "image.h"
namespace blender::render::hydra {
static std::string cache_image_file(Image *image,
BlenderSceneDelegate *scene_delegate,
ImageUser *iuser,
bool check_exist)
{
std::string file_path(FILE_MAX, 0);
char file_name[32];
snprintf(file_name, 32, "img_%016llx.hdr", (uintptr_t)image);
BLI_path_join(file_path.data(),
file_path.capacity(),
BKE_tempdir_session(),
"hydra_image_cache",
file_name);
if (check_exist && BLI_exists(file_path.c_str())) {
return file_path;
}
Main *main = CTX_data_main(scene_delegate->context);
ImageSaveOptions opts;
opts.im_format.imtype = R_IMF_IMTYPE_RADHDR;
if (BKE_image_save_options_init(&opts, main, scene_delegate->scene, image, iuser, true, false)) {
STRNCPY(opts.filepath, file_path.c_str());
ReportList reports;
if (!BKE_image_save(&reports, main, image, iuser, &opts)) {
file_path = "";
};
}
BKE_image_save_options_free(&opts);
CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s -> %s", image->id.name, file_path.c_str());
return file_path;
}
std::string cache_or_get_image_file(Image *image,
BlenderSceneDelegate *scene_delegate,
ImageUser *iuser)
{
std::string file_path(FILE_MAX, 0);
if (image->source == IMA_SRC_GENERATED) {
file_path = cache_image_file(image, scene_delegate, iuser, false);
}
else if (BKE_image_has_packedfile(image)) {
file_path = cache_image_file(image, scene_delegate, iuser, true);
}
else {
Main *main = CTX_data_main(scene_delegate->context);
BKE_image_user_file_path_ex(main, iuser, image, file_path.data(), false, true);
if (!pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(file_path)) {
file_path = cache_image_file(image, scene_delegate, iuser, true);
}
}
CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s -> %s", image->id.name, file_path.c_str());
return file_path;
}
} // namespace blender::render::hydra

View File

@ -0,0 +1,17 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#pragma once
#include "BKE_image.h"
#include "BKE_image_save.h"
namespace blender::render::hydra {
class BlenderSceneDelegate;
std::string cache_or_get_image_file(Image *image,
BlenderSceneDelegate *scene_delegate,
ImageUser *iuser);
} // namespace blender::render::hydra

View File

@ -3,7 +3,6 @@
#include <pxr/base/gf/vec2f.h>
#include "../utils.h"
#include "blender_scene_delegate.h"
#include "instancer.h"

View File

@ -9,7 +9,6 @@
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "../utils.h"
#include "blender_scene_delegate.h"
#include "mesh.h"

View File

@ -3,7 +3,6 @@
#include "BKE_object.h"
#include "../utils.h"
#include "blender_scene_delegate.h"
#include "light.h"
#include "mesh.h"
@ -84,4 +83,15 @@ void ObjectData::write_transform()
transform = gf_matrix_from_transform(((Object *)id)->object_to_world);
}
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4])
{
pxr::GfMatrix4d ret;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
ret[i][j] = m[i][j];
}
}
return ret;
}
} // namespace blender::render::hydra

View File

@ -35,4 +35,6 @@ class ObjectData : public IdData {
using ObjectDataMap =
pxr::TfHashMap<pxr::SdfPath, std::unique_ptr<ObjectData>, pxr::SdfPath::Hash>;
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4]);
} // namespace blender::render::hydra

View File

@ -13,15 +13,14 @@
#include "BKE_context.h"
#include "DNA_node_types.h"
#include "DNA_windowmanager_types.h"
#include "BKE_image.h"
#include "BKE_node.h"
#include "BKE_node_runtime.hh"
#include "BLI_path_util.h"
#include "NOD_shader.h"
#include "../utils.h"
#include "blender_scene_delegate.h"
#include "image.h"
#include "world.h"
/* TODO : add custom tftoken "transparency"? */
@ -96,16 +95,8 @@ void WorldData::init()
if (color_input_node->type == SH_NODE_TEX_IMAGE) {
NodeTexImage *tex = static_cast<NodeTexImage *>(color_input_node->storage);
Image *image = (Image *)color_input_node->id;
if (image) {
Main *bmain = CTX_data_main(scene_delegate_->context);
Scene *scene = scene_delegate_->scene;
ReportList reports;
ImageSaveOptions opts;
opts.im_format.imtype = R_IMF_IMTYPE_PNG;
std::string image_path = cache_image(bmain, scene, image, &tex->iuser, &opts, &reports);
std::string image_path = cache_or_get_image_file(image, scene_delegate_, &tex->iuser);
if (!image_path.empty()) {
data_[pxr::HdLightTokens->textureFile] = pxr::SdfAssetPath(image_path, image_path);
}

View File

@ -1,63 +0,0 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#include <filesystem>
#include <pxr/base/tf/stringUtils.h>
#include "BKE_appdir.h"
#include "BKE_image_save.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "DNA_camera_types.h"
#include "utils.h"
namespace blender::render::hydra {
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4])
{
pxr::GfMatrix4d ret = pxr::GfMatrix4d();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
ret[i][j] = m[i][j];
}
}
return ret;
}
std::string cache_image(Main *bmain,
Scene *scene,
Image *image,
ImageUser *iuser,
ImageSaveOptions *opts,
ReportList *reports)
{
const char *default_format = ".png";
char tempfile[FILE_MAX];
if (!BKE_image_save_options_init(opts, bmain, scene, image, iuser, true, false)) {
BKE_image_save_options_free(opts);
return "";
}
char image_name[32];
snprintf(image_name, 32, "img_%016llx", (uint64_t)image);
strcat(image_name, default_format);
BLI_path_join(
tempfile, sizeof(tempfile), BKE_tempdir_session(), "hydra_image_cache", image_name);
STRNCPY(opts->filepath, tempfile);
if (!BKE_image_save(reports, bmain, image, iuser, opts)) {
BKE_image_save_options_free(opts);
return "";
};
BKE_image_save_options_free(opts);
return tempfile;
}
} // namespace blender::render::hydra

View File

@ -1,23 +0,0 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#pragma once
#include <string>
#include <pxr/base/gf/matrix4d.h>
#include "BKE_image.h"
#include "BKE_image_save.h"
namespace blender::render::hydra {
pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4]);
std::string cache_image(Main *bmain,
Scene *scene,
Image *image,
ImageUser *iuser,
ImageSaveOptions *opts,
ReportList *reports);
} // namespace blender::render::hydra

View File

@ -1535,6 +1535,7 @@ if((DEFINED LIBDIR) AND TARGETDIR_LIB)
)
install(DIRECTORY
${LIBDIR}/usd/plugin/usd/usdShaders
${LIBDIR}/usd/plugin/usd/hioOiio
DESTINATION "./blender.shared/usd"
)
elseif(USD_PYTHON_SUPPORT)