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);
117 pxr::UsdStageRefPtr stage_;
135 return depsgraph_ptr_;
142 pxr::UsdStageRefPtr stage_;
144 PYTHON_NS::dict *prim_map_dict_ =
nullptr;
150 : stage_(in_stage), prim_map_(in_prim_map)
156 delete prim_map_dict_;
166 if (!prim_map_dict_) {
167 prim_map_dict_ =
new PYTHON_NS::dict;
170 if (!prim_map_dict_->has_key(path)) {
171 (*prim_map_dict_)[path] = PYTHON_NS::list();
174 PYTHON_NS::list list = PYTHON_NS::extract<PYTHON_NS::list>((*prim_map_dict_)[path]);
175 for (
const auto &ptr_rna : ids) {
176 list.append(ptr_rna);
181 return *prim_map_dict_;
188 pxr::UsdStageRefPtr stage_;
198 : stage_(stage), params_(
params), reports_(reports)
231 if (params_.export_textures) {
242 pxr::UsdStageRefPtr stage_;
252 : stage_(stage), params_(
params), reports_(reports)
273 return PYTHON_NS::make_tuple(asset_path,
false);
278 params_.import_textures_dir;
283 params_.tex_name_collision_mode;
286 asset_path, textures_dir, name_collision_mode, reports_);
288 if (import_path == asset_path) {
290 return PYTHON_NS::make_tuple(asset_path,
false);
294 return PYTHON_NS::make_tuple(import_path, is_temporary);
300 static bool registered =
false;
313 PyGILState_STATE gilstate = PyGILState_Ensure();
316 python::import(
"pxr.Usd");
317 python::import(
"pxr.UsdShade");
320 python::to_python_converter<PointerRNA, PointerRNAToPython>();
323 python::class_<USDSceneExportContext>(
"USDSceneExportContext")
325 .def(
"get_depsgraph",
327 python::return_value_policy<python::return_by_value>());
329 python::class_<USDMaterialExportContext>(
"USDMaterialExportContext")
333 python::class_<USDSceneImportContext>(
"USDSceneImportContext")
337 python::class_<USDMaterialImportContext>(
"USDMaterialImportContext")
341 PyGILState_Release(gilstate);
347 if (!PyErr_Occurred()) {
355 "An exception occurred invoking USD hook '%s'. Please see the console for details",
379 PyGILState_STATE gilstate = PyGILState_Ensure();
383 USDHookList::const_iterator hook_iter =
hook_list().begin();
391 USDHook *hook = hook_iter->get();
399 PyObject *hook_obj =
static_cast<PyObject *
>(hook->
rna_ext.
data);
407 catch (python::error_already_set
const &) {
412 reports_,
RPT_ERROR,
"An exception occurred invoking USD hook '%s'", hook->
name);
417 PyGILState_Release(gilstate);
449 void call_hook(PyObject *hook_obj)
override
458 pxr::UsdShadeMaterial usd_material_;
464 const pxr::UsdShadeMaterial &usd_material,
468 hook_context_(stage, export_params, reports),
469 usd_material_(usd_material)
477 return "on_material_export";
480 void call_hook(PyObject *hook_obj)
override
482 python::call_method<bool>(
483 hook_obj,
function_name(),
REF(hook_context_), material_ptr_, usd_material_);
503 void call_hook(PyObject *hook_obj)
override
517 pxr::UsdShadeMaterial usd_material_;
518 bool result_ =
false;
522 const pxr::UsdShadeMaterial &usd_material,
526 hook_context_(stage, import_params, reports),
527 usd_material_(usd_material)
539 return "material_import_poll";
542 void call_hook(PyObject *hook_obj)
override
547 result_ = python::call_method<bool>(
556 pxr::UsdShadeMaterial usd_material_;
558 bool result_ =
false;
563 const pxr::UsdShadeMaterial &usd_material,
567 hook_context_(stage, import_params, reports),
568 usd_material_(usd_material)
581 return "on_material_import";
584 void call_hook(PyObject *hook_obj)
override
586 result_ |= python::call_method<bool>(
587 hook_obj,
function_name(),
REF(hook_context_), material_ptr_, usd_material_);
603 const pxr::UsdShadeMaterial &usd_material,
612 stage, material, usd_material, export_params, reports);
613 on_material_export.
call();
635 Object *ob = reader->object();
654 const pxr::UsdShadeMaterial &usd_material,
670 const pxr::UsdShadeMaterial &usd_material,
679 stage, material, usd_material, import_params, reports);
680 on_material_import.
call();
681 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)
MaterialImportPollInvoker(pxr::UsdStageRefPtr stage, const pxr::UsdShadeMaterial &usd_material, const USDImportParams &import_params, ReportList *reports)
OnExportInvoker(pxr::UsdStageRefPtr stage, Depsgraph *depsgraph, ReportList *reports)
OnImportInvoker(pxr::UsdStageRefPtr stage, const ImportedPrimMap &prim_map, ReportList *reports)
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)
USDHookInvoker(ReportList *reports)
virtual void release_in_gil()
virtual void init_in_gil()
virtual ~USDHookInvoker()=default
virtual const char * function_name() const =0
virtual void call_hook(PyObject *hook_obj)=0
pxr::UsdStageRefPtr get_stage() const
USDMaterialExportContext(pxr::UsdStageRefPtr stage, const USDExportParams ¶ms, ReportList *reports)
USDMaterialExportContext()=default
std::string export_texture(PYTHON_NS::object obj) const
pxr::UsdStageRefPtr get_stage() const
USDMaterialImportContext(pxr::UsdStageRefPtr stage, const USDImportParams ¶ms, ReportList *reports)
PYTHON_NS::tuple import_texture(const std::string &asset_path) const
USDMaterialImportContext()=default
USDSceneExportContext(pxr::UsdStageRefPtr stage, Depsgraph *depsgraph)
USDSceneExportContext()=default
pxr::UsdStageRefPtr get_stage() const
const PointerRNA & get_depsgraph() const
USDSceneImportContext(pxr::UsdStageRefPtr in_stage, const ImportedPrimMap &in_prim_map)
PYTHON_NS::dict get_prim_map()
pxr::UsdStageRefPtr get_stage() const
USDSceneImportContext()=default
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()
void USD_unregister_hook(const USDHook *hook)
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)
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)
std::string import_asset(const std::string &src, const char *import_dir, eUSDTexNameCollisionMode name_collision_mode, 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)