From 194f2d392d8a13ee1c07379cc76ced88c6ca2744 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Mon, 24 Apr 2023 14:41:27 +0300 Subject: [PATCH 1/5] add IBL support for RPRHydra --- .../render/hydra/scene_delegate/world.cc | 24 ++++++++++++------- source/creator/CMakeLists.txt | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/source/blender/render/hydra/scene_delegate/world.cc b/source/blender/render/hydra/scene_delegate/world.cc index 08f7a326db10..7a9b892d74e4 100644 --- a/source/blender/render/hydra/scene_delegate/world.cc +++ b/source/blender/render/hydra/scene_delegate/world.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "BKE_context.h" @@ -97,18 +98,23 @@ void WorldData::init() NodeTexImage *tex = static_cast(color_input_node->storage); Image *image = (Image *)color_input_node->id; + char image_path[1024]; + Main *main = CTX_data_main(scene_delegate_->context); if (image) { - Main *bmain = CTX_data_main(scene_delegate_->context); - Scene *scene = scene_delegate_->scene; + if (!pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(image->filepath)) { + ReportList reports; + ImageSaveOptions opts; + opts.im_format.imtype = R_IMF_IMTYPE_PNG; - 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); - if (!image_path.empty()) { - data_[pxr::HdLightTokens->textureFile] = pxr::SdfAssetPath(image_path, image_path); + strcpy(image_path, + cache_image(main, scene_delegate_->scene, image, &tex->iuser, &opts, &reports) + .c_str()); + if (image_path && !image_path[0]) { + data_[pxr::HdLightTokens->textureFile] = pxr::SdfAssetPath(image_path, image_path); + } } + BKE_image_user_file_path_ex(main, &tex->iuser, image, image_path, false, true); + data_[pxr::HdLightTokens->textureFile] = pxr::SdfAssetPath(image_path, image_path); } } } 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) -- 2.30.2 From 38135e6662db32189915610d8c299000caae355b Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Tue, 25 Apr 2023 19:22:21 +0300 Subject: [PATCH 2/5] Refactored: moved utils.h|.cc -> scene_delegate/image.h|.cc. Improved working with cache_or_get_image_file() --- source/blender/render/hydra/CMakeLists.txt | 4 +- source/blender/render/hydra/camera.cc | 3 +- source/blender/render/hydra/python.cc | 3 - .../scene_delegate/blender_scene_delegate.cc | 1 - .../render/hydra/scene_delegate/image.cc | 64 +++++++++++++++++++ .../render/hydra/scene_delegate/image.h | 17 +++++ .../render/hydra/scene_delegate/instancer.cc | 1 - .../render/hydra/scene_delegate/mesh.cc | 1 - .../render/hydra/scene_delegate/object.cc | 12 +++- .../render/hydra/scene_delegate/object.h | 2 + .../render/hydra/scene_delegate/world.cc | 25 ++------ source/blender/render/hydra/utils.cc | 63 ------------------ source/blender/render/hydra/utils.h | 23 ------- 13 files changed, 102 insertions(+), 117 deletions(-) create mode 100644 source/blender/render/hydra/scene_delegate/image.cc create mode 100644 source/blender/render/hydra/scene_delegate/image.h delete mode 100644 source/blender/render/hydra/utils.cc delete mode 100644 source/blender/render/hydra/utils.h 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..f2cf794771d8 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 "scene_delegate/object.h" #include "camera.h" -#include "utils.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..e58b37c9e5ce 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 { 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..ed2007733e13 --- /dev/null +++ b/source/blender/render/hydra/scene_delegate/image.cc @@ -0,0 +1,64 @@ +/* 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_path_util.h" +#include "BLI_string.h" + +#include "DNA_camera_types.h" +#include "DNA_windowmanager_types.h" + +#include "blender_scene_delegate.h" +#include "image.h" + +namespace blender::render::hydra { + +std::string cache_or_get_image_file(Image *image, + BlenderSceneDelegate *scene_delegate, + ImageUser *iuser) +{ + CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s", image->id.name); + + std::string image_path(FILE_MAX, 0); + Main *main = CTX_data_main(scene_delegate->context); + if (pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(image->filepath)) { + BKE_image_user_file_path_ex(main, iuser, image, image_path.data(), false, true); + return image_path; + } + + 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)) { + BKE_image_save_options_free(&opts); + return ""; + } + + char image_name[32]; + snprintf(image_name, 32, "img_%016llx.hdr", (uint64_t)image); + + BLI_path_join(image_path.data(), + image_path.capacity(), + BKE_tempdir_session(), + "hydra_image_cache", + image_name); + STRNCPY(opts.filepath, image_path.c_str()); + + ReportList reports; + if (!BKE_image_save(&reports, main, image, iuser, &opts)) { + BKE_image_save_options_free(&opts); + return ""; + }; + + BKE_image_save_options_free(&opts); + + CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s: cached=%s", image->id.name, image_path.c_str()); + return image_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 7a9b892d74e4..c5e208e0cff9 100644 --- a/source/blender/render/hydra/scene_delegate/world.cc +++ b/source/blender/render/hydra/scene_delegate/world.cc @@ -9,20 +9,18 @@ #include #include #include -#include #include #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"? */ @@ -97,23 +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; - - char image_path[1024]; - Main *main = CTX_data_main(scene_delegate_->context); - if (image) { - if (!pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(image->filepath)) { - ReportList reports; - ImageSaveOptions opts; - opts.im_format.imtype = R_IMF_IMTYPE_PNG; - - strcpy(image_path, - cache_image(main, scene_delegate_->scene, image, &tex->iuser, &opts, &reports) - .c_str()); - if (image_path && !image_path[0]) { - data_[pxr::HdLightTokens->textureFile] = pxr::SdfAssetPath(image_path, image_path); - } - } - BKE_image_user_file_path_ex(main, &tex->iuser, image, image_path, false, true); + 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 -- 2.30.2 From 3236544ab526026849f6f175eaf814f2224dbeb5 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Wed, 26 Apr 2023 10:57:37 +0300 Subject: [PATCH 3/5] Implemented more correct image caching --- source/blender/render/hydra/camera.cc | 2 +- .../scene_delegate/blender_scene_delegate.cc | 2 +- .../render/hydra/scene_delegate/image.cc | 86 +++++++++++-------- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/source/blender/render/hydra/camera.cc b/source/blender/render/hydra/camera.cc index f2cf794771d8..09a7b923b4fc 100644 --- a/source/blender/render/hydra/camera.cc +++ b/source/blender/render/hydra/camera.cc @@ -5,8 +5,8 @@ #include "DNA_screen_types.h" #include "DNA_view3d_types.h" -#include "scene_delegate/object.h" #include "camera.h" +#include "scene_delegate/object.h" namespace blender::render::hydra { 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 e58b37c9e5ce..1adbb624ca0c 100644 --- a/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc +++ b/source/blender/render/hydra/scene_delegate/blender_scene_delegate.cc @@ -190,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 index ed2007733e13..cd04ee4ea662 100644 --- a/source/blender/render/hydra/scene_delegate/image.cc +++ b/source/blender/render/hydra/scene_delegate/image.cc @@ -6,6 +6,7 @@ #include "BKE_appdir.h" #include "BKE_image.h" #include "BKE_image_save.h" +#include "BLI_fileops.h" #include "BLI_path_util.h" #include "BLI_string.h" @@ -17,48 +18,63 @@ 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) { - CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s", image->id.name); + 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); - std::string image_path(FILE_MAX, 0); - Main *main = CTX_data_main(scene_delegate->context); - if (pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(image->filepath)) { - BKE_image_user_file_path_ex(main, iuser, image, image_path.data(), false, true); - return image_path; + if (!pxr::HioImageRegistry::GetInstance().IsSupportedImageFile(file_path)) { + file_path = cache_image_file(image, scene_delegate, iuser, true); + } } - 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)) { - BKE_image_save_options_free(&opts); - return ""; - } - - char image_name[32]; - snprintf(image_name, 32, "img_%016llx.hdr", (uint64_t)image); - - BLI_path_join(image_path.data(), - image_path.capacity(), - BKE_tempdir_session(), - "hydra_image_cache", - image_name); - STRNCPY(opts.filepath, image_path.c_str()); - - ReportList reports; - if (!BKE_image_save(&reports, main, image, iuser, &opts)) { - BKE_image_save_options_free(&opts); - return ""; - }; - - BKE_image_save_options_free(&opts); - - CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s: cached=%s", image->id.name, image_path.c_str()); - return image_path; + CLOG_INFO(LOG_RENDER_HYDRA_SCENE, 2, "%s -> %s", image->id.name, file_path.c_str()); + return file_path; } } // namespace blender::render::hydra -- 2.30.2 From d5ead16c0b623aadd9572c9c2f8442702289211f Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Wed, 26 Apr 2023 17:38:05 +0300 Subject: [PATCH 4/5] Fixed crash --- source/blender/render/hydra/scene_delegate/world.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/blender/render/hydra/scene_delegate/world.cc b/source/blender/render/hydra/scene_delegate/world.cc index c5e208e0cff9..d2dc79d37b2f 100644 --- a/source/blender/render/hydra/scene_delegate/world.cc +++ b/source/blender/render/hydra/scene_delegate/world.cc @@ -95,9 +95,11 @@ 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; - 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); + if (image) { + 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); + } } } } -- 2.30.2 From c5ba68f0088ea13fdaf3d8384afb0eb423d9a1b6 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Wed, 26 Apr 2023 18:29:08 +0300 Subject: [PATCH 5/5] cleanup --- source/blender/render/hydra/scene_delegate/image.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/blender/render/hydra/scene_delegate/image.cc b/source/blender/render/hydra/scene_delegate/image.cc index cd04ee4ea662..02f88d66ae84 100644 --- a/source/blender/render/hydra/scene_delegate/image.cc +++ b/source/blender/render/hydra/scene_delegate/image.cc @@ -8,9 +8,7 @@ #include "BKE_image_save.h" #include "BLI_fileops.h" #include "BLI_path_util.h" -#include "BLI_string.h" -#include "DNA_camera_types.h" #include "DNA_windowmanager_types.h" #include "blender_scene_delegate.h" -- 2.30.2