24#include "RNA_prototypes.hh"
32#if PXR_VERSION >= 2411
33# include <pxr/external/boost/python/call_method.hpp>
34# include <pxr/external/boost/python/class.hpp>
35# include <pxr/external/boost/python/dict.hpp>
36# include <pxr/external/boost/python/import.hpp>
37# include <pxr/external/boost/python/list.hpp>
38# include <pxr/external/boost/python/ref.hpp>
39# include <pxr/external/boost/python/return_value_policy.hpp>
40# include <pxr/external/boost/python/to_python_converter.hpp>
41# include <pxr/external/boost/python/tuple.hpp>
42# define PYTHON_NS pxr::pxr_boost::python
43# define REF pxr::pxr_boost::python::ref
45using namespace pxr::pxr_boost;
47# include <boost/python/call_method.hpp>
48# include <boost/python/class.hpp>
49# include <boost/python/import.hpp>
50# include <boost/python/return_value_policy.hpp>
51# include <boost/python/to_python_converter.hpp>
52# include <boost/python/tuple.hpp>
53# define PYTHON_NS boost::python
54# define REF boost::ref
85 [hook](
const std::unique_ptr<USDHook> &item) {
return item.get() == hook; });
91 if (
hook_list().empty() || (idname ==
nullptr) || (idname[0] == 0)) {
95 USDHookList::iterator hook_iter = std::find_if(
97 return STREQ(item->idname, idname);
164 (*prim_map_dict)[path] = PYTHON_NS::list();
167 PYTHON_NS::list list = PYTHON_NS::extract<PYTHON_NS::list>((*
prim_map_dict)[path]);
168 for (
const auto &ptr_rna : ids) {
169 list.append(ptr_rna);
222 if (
params.export_textures) {
262 return PYTHON_NS::make_tuple(asset_path,
false);
267 params.import_textures_dir;
272 params.tex_name_collision_mode;
275 asset_path.c_str(), textures_dir, name_collision_mode,
reports);
277 if (import_path == asset_path) {
279 return PYTHON_NS::make_tuple(asset_path,
false);
283 return PYTHON_NS::make_tuple(import_path, is_temporary);
293 static bool registered =
false;
306 PyGILState_STATE gilstate = PyGILState_Ensure();
309 python::import(
"pxr.Usd");
310 python::import(
"pxr.UsdShade");
313 python::to_python_converter<PointerRNA, PointerRNAToPython>();
316 python::class_<USDSceneExportContext>(
"USDSceneExportContext")
318 .def(
"get_depsgraph",
320 python::return_value_policy<python::return_by_value>());
322 python::class_<USDMaterialExportContext>(
"USDMaterialExportContext")
326 python::class_<USDSceneImportContext>(
"USDSceneImportContext")
330 python::class_<USDMaterialImportContext>(
"USDMaterialImportContext")
334 PyGILState_Release(gilstate);
340 if (!PyErr_Occurred()) {
348 "An exception occurred invoking USD hook '%s'. Please see the console for details",
368 PyGILState_STATE gilstate = PyGILState_Ensure();
372 USDHookList::const_iterator hook_iter =
hook_list().begin();
380 USDHook *hook = hook_iter->get();
388 PyObject *hook_obj =
static_cast<PyObject *
>(hook->
rna_ext.
data);
396 catch (python::error_already_set
const &) {
406 PyGILState_Release(gilstate);
450 pxr::UsdShadeMaterial usd_material_;
456 const pxr::UsdShadeMaterial &usd_material,
460 hook_context_(stage, export_params,
reports),
461 usd_material_(usd_material)
469 return "on_material_export";
474 python::call_method<bool>(
475 hook_obj,
function_name(),
REF(hook_context_), material_ptr_, usd_material_);
502 hook_context_.release();
509 pxr::UsdShadeMaterial usd_material_;
510 bool result_ =
false;
514 const pxr::UsdShadeMaterial &usd_material,
518 hook_context_(stage, import_params,
reports),
519 usd_material_(usd_material)
531 return "material_import_poll";
539 result_ = python::call_method<bool>(
548 pxr::UsdShadeMaterial usd_material_;
550 bool result_ =
false;
555 const pxr::UsdShadeMaterial &usd_material,
559 hook_context_(stage, import_params,
reports),
560 usd_material_(usd_material)
573 return "on_material_import";
578 result_ |= python::call_method<bool>(
579 hook_obj,
function_name(),
REF(hook_context_), material_ptr_, usd_material_);
595 const pxr::UsdShadeMaterial &usd_material,
604 stage, material, usd_material, export_params,
reports);
605 on_material_export.
call();
627 Object *ob = reader->object();
646 const pxr::UsdShadeMaterial &usd_material,
662 const pxr::UsdShadeMaterial &usd_material,
671 stage, material, usd_material, import_params,
reports);
672 on_material_import.
call();
673 return on_material_import.
result();
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
BPy_StructRNA * depsgraph
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
void foreach_item(const FuncT &func) const
void append(const T &value)
Value & lookup_or_add_default(const Key &key)
const char * function_name() const override
MaterialImportPollInvoker(pxr::UsdStageRefPtr stage, const pxr::UsdShadeMaterial &usd_material, const USDImportParams &import_params, ReportList *reports)
void call_hook(PyObject *hook_obj) override
void call_hook(PyObject *hook_obj) override
OnExportInvoker(pxr::UsdStageRefPtr stage, Depsgraph *depsgraph, ReportList *reports)
const char * function_name() const override
void call_hook(PyObject *hook_obj) override
void release_in_gil() override
const char * function_name() const override
OnImportInvoker(pxr::UsdStageRefPtr stage, const ImportedPrimMap &prim_map, ReportList *reports)
const char * function_name() const override
void call_hook(PyObject *hook_obj) override
OnMaterialExportInvoker(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, const USDExportParams &export_params, ReportList *reports)
OnMaterialImportInvoker(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, const USDImportParams &import_params, ReportList *reports)
const char * function_name() const override
void call_hook(PyObject *hook_obj) override
USDHookInvoker(ReportList *reports)
virtual void release_in_gil()
virtual void init_in_gil()
virtual const char * function_name() const =0
virtual void call_hook(PyObject *hook_obj)=0
pxr::UsdStageRefPtr stage()
const ImportSettings & settings() const
const blender::Vector< USDPrimReader * > & readers() const
bool pyrna_id_FromPyObject(PyObject *obj, ID **id)
const char * temp_textures_dir()
bool should_import_asset(const std::string &path)
bool have_material_import_hook(pxr::UsdStageRefPtr stage, const pxr::UsdShadeMaterial &usd_material, const USDImportParams &import_params, ReportList *reports)
void USD_unregister_hook(USDHook *hook)
std::string import_asset(const char *src, const char *import_dir, eUSDTexNameCollisionMode name_collision_mode, ReportList *reports)
static void export_texture(const USDExporterContext &usd_export_context, bNode *node)
void USD_register_hook(std::unique_ptr< USDHook > hook)
static USDHookList & hook_list()
@ USD_TEX_NAME_COLLISION_OVERWRITE
std::list< std::unique_ptr< USDHook > > USDHookList
static std::string get_tex_image_asset_filepath(const USDExporterContext &usd_export_context, bNode *node)
void call_import_hooks(USDStageReader *archive, ReportList *reports)
Map< pxr::SdfPath, Vector< PointerRNA > > ImportedPrimMap
bool call_material_import_hooks(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, const USDImportParams &import_params, ReportList *reports)
void call_material_export_hooks(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, const USDExportParams &export_params, ReportList *reports)
void call_export_hooks(pxr::UsdStageRefPtr stage, Depsgraph *depsgraph, ReportList *reports)
USDHook * USD_find_hook_name(const char idname[])
static void handle_python_error(USDHook *hook, ReportList *reports)
void register_hook_converters()
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
blender::Map< pxr::SdfPath, Material * > usd_path_to_mat
static PyObject * convert(PointerRNA ptr)
USDMaterialExportContext()
pxr::UsdStageRefPtr get_stage() const
pxr::UsdStageRefPtr stage
std::string export_texture(PYTHON_NS::object obj) const
USDMaterialExportContext(pxr::UsdStageRefPtr in_stage, const USDExportParams &in_params, ReportList *in_reports)
pxr::UsdStageRefPtr stage
pxr::UsdStageRefPtr get_stage() const
PYTHON_NS::tuple import_texture(const std::string &asset_path) const
USDMaterialImportContext(pxr::UsdStageRefPtr in_stage, const USDImportParams &in_params, ReportList *in_reports)
USDMaterialImportContext()
USDSceneExportContext()=default
pxr::UsdStageRefPtr get_stage() const
USDSceneExportContext(pxr::UsdStageRefPtr in_stage, Depsgraph *depsgraph)
const PointerRNA & get_depsgraph() const
pxr::UsdStageRefPtr stage
USDSceneImportContext(pxr::UsdStageRefPtr in_stage, const ImportedPrimMap &in_prim_map)
PYTHON_NS::dict get_prim_map()
pxr::UsdStageRefPtr get_stage() const
pxr::UsdStageRefPtr stage
PYTHON_NS::dict * prim_map_dict
USDSceneImportContext()=default