tornavis/source/blender/io/usd/hydra/usd_scene_delegate.cc

84 lines
2.5 KiB
C++

/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "usd_scene_delegate.hh"
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "BKE_appdir.hh"
#include "BKE_report.hh"
#include "DEG_depsgraph_query.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "usd.hh"
#include "usd_private.hh"
using namespace blender::io::usd;
namespace blender::io::hydra {
USDSceneDelegate::USDSceneDelegate(pxr::HdRenderIndex *render_index,
pxr::SdfPath const &delegate_id)
: render_index_(render_index), delegate_id_(delegate_id)
{
/* Temporary directory to write any additional files to, like image or VDB files. */
char unique_name[FILE_MAXFILE];
SNPRINTF(unique_name, "%p", this);
char dir_path[FILE_MAX];
BLI_path_join(
dir_path, sizeof(dir_path), BKE_tempdir_session(), "usd_scene_delegate", unique_name);
BLI_dir_create_recursive(dir_path);
char file_path[FILE_MAX];
BLI_path_join(file_path, sizeof(file_path), dir_path, "scene.usdc");
temp_dir_ = dir_path;
temp_file_ = file_path;
}
USDSceneDelegate::~USDSceneDelegate()
{
BLI_delete(temp_dir_.c_str(), true, true);
}
void USDSceneDelegate::populate(Depsgraph *depsgraph)
{
USDExportParams params;
params.use_instancing = true;
params.relative_paths = false; /* Unnecessary. */
params.export_textures = false; /* Don't copy all textures, is slow. */
params.evaluation_mode = DEG_get_mode(depsgraph);
/* NOTE: Since the reports list will be `nullptr` here, reports generated by export code from
* this call will only be printed to console. */
wmJobWorkerStatus worker_status = {};
ReportList worker_reports = {};
BKE_reports_init(&worker_reports, RPT_PRINT | RPT_STORE);
worker_status.reports = &worker_reports;
params.worker_status = &worker_status;
/* Create clean directory for export. */
BLI_delete(temp_dir_.c_str(), true, true);
BLI_dir_create_recursive(temp_dir_.c_str());
/* Free previous delegate and stage first to save memory. */
delegate_.reset();
stage_.Reset();
/* Convert depsgraph to stage + additional file in temp directory. */
stage_ = io::usd::export_to_stage(params, depsgraph, temp_file_.c_str());
delegate_ = std::make_unique<pxr::UsdImagingDelegate>(render_index_, delegate_id_);
delegate_->Populate(stage_->GetPseudoRoot());
WM_reports_from_reports_move(nullptr, &worker_reports);
}
} // namespace blender::io::hydra