diff --git a/source/blender/render/hydra/CMakeLists.txt b/source/blender/render/hydra/CMakeLists.txt index 97a0c98eb159..aaa4e07c7e72 100644 --- a/source/blender/render/hydra/CMakeLists.txt +++ b/source/blender/render/hydra/CMakeLists.txt @@ -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 diff --git a/source/blender/render/hydra/camera.cc b/source/blender/render/hydra/camera.cc index b9917061fdd6..09a7b923b4fc 100644 --- a/source/blender/render/hydra/camera.cc +++ b/source/blender/render/hydra/camera.cc @@ -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 { diff --git a/source/blender/render/hydra/python.cc b/source/blender/render/hydra/python.cc index c4d10e8b24c3..5f6f319f62c1 100644 --- a/source/blender/render/hydra/python.cc +++ b/source/blender/render/hydra/python.cc @@ -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) diff --git a/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc b/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc index bb6614f2be8a..1adbb624ca0c 100644 --- a/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc +++ b/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc @@ -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 _ */ 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); } diff --git a/source/blender/render/hydra/scene_delegate/image.cc b/source/blender/render/hydra/scene_delegate/image.cc new file mode 100644 index 000000000000..02f88d66ae84 --- /dev/null +++ b/source/blender/render/hydra/scene_delegate/image.cc @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright 2011-2022 Blender Foundation */ + +#include + +#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 diff --git a/source/blender/render/hydra/scene_delegate/image.h b/source/blender/render/hydra/scene_delegate/image.h new file mode 100644 index 000000000000..886385963051 --- /dev/null +++ b/source/blender/render/hydra/scene_delegate/image.h @@ -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 diff --git a/source/blender/render/hydra/scene_delegate/instancer.cc b/source/blender/render/hydra/scene_delegate/instancer.cc index 554eac79d12d..b05a12bdb604 100644 --- a/source/blender/render/hydra/scene_delegate/instancer.cc +++ b/source/blender/render/hydra/scene_delegate/instancer.cc @@ -3,7 +3,6 @@ #include -#include "../utils.h" #include "blender_scene_delegate.h" #include "instancer.h" diff --git a/source/blender/render/hydra/scene_delegate/mesh.cc b/source/blender/render/hydra/scene_delegate/mesh.cc index 50f65f26a269..c2797a05ae3c 100644 --- a/source/blender/render/hydra/scene_delegate/mesh.cc +++ b/source/blender/render/hydra/scene_delegate/mesh.cc @@ -9,7 +9,6 @@ #include "BKE_mesh_runtime.h" #include "BKE_object.h" -#include "../utils.h" #include "blender_scene_delegate.h" #include "mesh.h" diff --git a/source/blender/render/hydra/scene_delegate/object.cc b/source/blender/render/hydra/scene_delegate/object.cc index ea7de70e4b91..658960dcdce5 100644 --- a/source/blender/render/hydra/scene_delegate/object.cc +++ b/source/blender/render/hydra/scene_delegate/object.cc @@ -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 diff --git a/source/blender/render/hydra/scene_delegate/object.h b/source/blender/render/hydra/scene_delegate/object.h index f7fd44c76168..b0a7371e27a9 100644 --- a/source/blender/render/hydra/scene_delegate/object.h +++ b/source/blender/render/hydra/scene_delegate/object.h @@ -35,4 +35,6 @@ class ObjectData : public IdData { using ObjectDataMap = pxr::TfHashMap, pxr::SdfPath::Hash>; +pxr::GfMatrix4d gf_matrix_from_transform(float m[4][4]); + } // namespace blender::render::hydra diff --git a/source/blender/render/hydra/scene_delegate/world.cc b/source/blender/render/hydra/scene_delegate/world.cc index 08f7a326db10..d2dc79d37b2f 100644 --- a/source/blender/render/hydra/scene_delegate/world.cc +++ b/source/blender/render/hydra/scene_delegate/world.cc @@ -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(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); } diff --git a/source/blender/render/hydra/utils.cc b/source/blender/render/hydra/utils.cc deleted file mode 100644 index 9a0462fc4ae3..000000000000 --- a/source/blender/render/hydra/utils.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 - * Copyright 2011-2022 Blender Foundation */ - -#include - -#include - -#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 diff --git a/source/blender/render/hydra/utils.h b/source/blender/render/hydra/utils.h deleted file mode 100644 index e71c64e9b5d8..000000000000 --- a/source/blender/render/hydra/utils.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 - * Copyright 2011-2022 Blender Foundation */ - -#pragma once - -#include - -#include - -#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 diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index c5bf712a7a78..c4b252787c3f 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -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)