40#include <pxr/base/tf/stringUtils.h>
44# include <pxr/usd/sdf/copyUtils.h>
45# include <pxr/usd/usdMtlx/materialXConfigAPI.h>
46# include <pxr/usd/usdMtlx/reader.h>
55static const pxr::TfToken
clearcoat(
"clearcoat", pxr::TfToken::Immortal);
57static const pxr::TfToken
diffuse_color(
"diffuseColor", pxr::TfToken::Immortal);
58static const pxr::TfToken
emissive_color(
"emissiveColor", pxr::TfToken::Immortal);
59static const pxr::TfToken
metallic(
"metallic", pxr::TfToken::Immortal);
60static const pxr::TfToken
preview_shader(
"previewShader", pxr::TfToken::Immortal);
61static const pxr::TfToken
preview_surface(
"UsdPreviewSurface", pxr::TfToken::Immortal);
62static const pxr::TfToken
UsdTransform2d(
"UsdTransform2d", pxr::TfToken::Immortal);
63static const pxr::TfToken
uv_texture(
"UsdUVTexture", pxr::TfToken::Immortal);
64static const pxr::TfToken
primvar_float(
"UsdPrimvarReader_float", pxr::TfToken::Immortal);
65static const pxr::TfToken
primvar_float2(
"UsdPrimvarReader_float2", pxr::TfToken::Immortal);
66static const pxr::TfToken
primvar_float3(
"UsdPrimvarReader_float3", pxr::TfToken::Immortal);
67static const pxr::TfToken
primvar_vector(
"UsdPrimvarReader_vector", pxr::TfToken::Immortal);
68static const pxr::TfToken
roughness(
"roughness", pxr::TfToken::Immortal);
69static const pxr::TfToken
specular(
"specular", pxr::TfToken::Immortal);
70static const pxr::TfToken
opacity(
"opacity", pxr::TfToken::Immortal);
72static const pxr::TfToken
surface(
"surface", pxr::TfToken::Immortal);
73static const pxr::TfToken
displacement(
"displacement", pxr::TfToken::Immortal);
74static const pxr::TfToken
rgb(
"rgb", pxr::TfToken::Immortal);
75static const pxr::TfToken
r(
"r", pxr::TfToken::Immortal);
76static const pxr::TfToken
g(
"g", pxr::TfToken::Immortal);
77static const pxr::TfToken
b(
"b", pxr::TfToken::Immortal);
78static const pxr::TfToken
a(
"a", pxr::TfToken::Immortal);
79static const pxr::TfToken
st(
"st", pxr::TfToken::Immortal);
80static const pxr::TfToken
result(
"result", pxr::TfToken::Immortal);
81static const pxr::TfToken
varname(
"varname", pxr::TfToken::Immortal);
82static const pxr::TfToken
out(
"out", pxr::TfToken::Immortal);
83static const pxr::TfToken
normal(
"normal", pxr::TfToken::Immortal);
84static const pxr::TfToken
ior(
"ior", pxr::TfToken::Immortal);
85static const pxr::TfToken
file(
"file", pxr::TfToken::Immortal);
86static const pxr::TfToken
raw(
"raw", pxr::TfToken::Immortal);
87static const pxr::TfToken
scale(
"scale", pxr::TfToken::Immortal);
88static const pxr::TfToken
bias(
"bias", pxr::TfToken::Immortal);
89static const pxr::TfToken
sRGB(
"sRGB", pxr::TfToken::Immortal);
91static const pxr::TfToken
black(
"black", pxr::TfToken::Immortal);
92static const pxr::TfToken
clamp(
"clamp", pxr::TfToken::Immortal);
93static const pxr::TfToken
repeat(
"repeat", pxr::TfToken::Immortal);
94static const pxr::TfToken
mirror(
"mirror", pxr::TfToken::Immortal);
95static const pxr::TfToken
wrapS(
"wrapS", pxr::TfToken::Immortal);
96static const pxr::TfToken
wrapT(
"wrapT", pxr::TfToken::Immortal);
97static const pxr::TfToken
in(
"in", pxr::TfToken::Immortal);
98static const pxr::TfToken
translation(
"translation", pxr::TfToken::Immortal);
99static const pxr::TfToken
rotation(
"rotation", pxr::TfToken::Immortal);
119 const pxr::UsdShadeMaterial &material,
123 const pxr::UsdShadeMaterial &material,
127 const pxr::UsdShadeMaterial &material,
128 const pxr::TfToken &primvar_type,
132 pxr::UsdShadeMaterial &usd_material,
133 pxr::UsdShadeInput &usd_input,
134 const std::string &active_uvmap_name,
151template<
typename T1,
typename T2>
157 const T1 *cast_value =
static_cast<const T1 *
>(value);
162 const pxr::GfVec4f scale,
163 const pxr::GfVec4f bias)
167 scale_attr = usd_shader.CreateInput(
usdtokens::scale, pxr::SdfValueTypeNames->Float4);
169 scale_attr.Set(scale);
173 bias_attr = usd_shader.CreateInput(
usdtokens::bias, pxr::SdfValueTypeNames->Float4);
179 pxr::UsdShadeMaterial &usd_material,
180 pxr::UsdShadeShader &shader,
182 const std::string &active_uvmap_name,
190 if (spec ==
nullptr) {
197 float input_scale = 1.0;
202 *node,
SOCK_IN,
"Emission Strength");
203 if (!emission_strength_sock) {
208 if (input_scale == 0.0f) {
213 bool processed =
false;
221 usd_export_context, usd_material, input_node);
224 pxr::TfToken source_name;
225 if (input_spec.
input_type == pxr::SdfValueTypeNames->Float) {
230 if (input_link_sep_color) {
245 usd_shader.CreateOutput(source_name, pxr::SdfValueTypeNames->
Float);
249 usd_shader.CreateOutput(
usdtokens::rgb, pxr::SdfValueTypeNames->Float3);
253 pxr::UsdShadeConnectionSourceInfo source_info(
254 usd_shader.ConnectableAPI(), source_name, pxr::UsdShadeAttributeType::Output);
256 .ConnectToSource(source_info);
279 *vector_math_node,
SOCK_IN,
"Vector");
282 vector_math_node = temp_link->
fromnode;
286 *vector_math_node,
SOCK_IN,
"Vector_001");
288 *vector_math_node,
SOCK_IN,
"Vector_002");
289 const float *scale_value =
291 const float *bias_value =
294 const pxr::GfVec4f scale(scale_value[0], scale_value[1], scale_value[2], 1.0f);
295 const pxr::GfVec4f bias(bias_value[0], bias_value[1], bias_value[2], 0.0f);
303 const float midlevel_value =
307 const float adjusted_bias = -midlevel_value * scale_value;
308 const pxr::GfVec4f scale(scale_value, scale_value, scale_value, 1.0f);
309 const pxr::GfVec4f bias(adjusted_bias, adjusted_bias, adjusted_bias, 0.0f);
315 if (pxr::UsdShadeInput st_input = usd_shader.CreateInput(
usdtokens::st,
316 pxr::SdfValueTypeNames->Float2))
319 usd_export_context, socket, usd_material, st_input, active_uvmap_name, reports);
325 float threshold = 0.0f;
329 if (math_link && math_link->
fromnode) {
341 if (math_link && math_link->
fromnode) {
347 *math_node,
SOCK_IN,
"Value_001");
355 if (threshold > 0.0f) {
356 pxr::UsdShadeInput opacity_threshold_input = shader.CreateInput(
358 opacity_threshold_input.GetAttr().Set(pxr::VtValue(threshold));
376 pxr::SdfValueTypeName output_type;
377 pxr::UsdShadeShader usd_shader;
379 output_type = pxr::SdfValueTypeNames->Float3;
384 output_type = pxr::SdfValueTypeNames->Float3;
389 output_type = pxr::SdfValueTypeNames->Float;
398 pxr::UsdShadeConnectionSourceInfo source_info(usd_shader.ConnectableAPI(),
400 pxr::UsdShadeAttributeType::Output,
403 .ConnectToSource(source_info);
415 switch (sock->type) {
418 shader, input_spec, sock->default_value, input_scale);
422 shader, input_spec, sock->default_value, input_scale);
426 shader, input_spec, sock->default_value, input_scale);
437 pxr::UsdShadeMaterial &usd_material,
438 const std::string &active_uvmap_name,
454 usd_export_context, usd_material, surface_node);
458 usd_export_context, usd_material, preview_surface, surface_node, active_uvmap_name, reports);
464 "Skipping displacement. Only Object Space displacement is supported by the "
465 "UsdPreviewSurface.");
471 if (sock_mid->
link || sock_scale->
link) {
472 CLOG_WARN(&
LOG,
"Skipping displacement. Midlevel and Scale must be constants.");
476 usd_material.CreateDisplacementOutput().ConnectToSource(preview_surface.ConnectableAPI(),
480 if (sock_height->
link) {
495 const float displacement_value = (height_value - mid_value) * scale_value;
513 pxr::TfToken shader_id;
528 scale_attr = usd_shader.CreateInput(
usdtokens::scale, pxr::SdfValueTypeNames->Float4);
530 scale_attr.Set(pxr::GfVec4f(2.0f, 2.0f, 2.0f, 2.0f));
535 bias_attr = usd_shader.CreateInput(
usdtokens::bias, pxr::SdfValueTypeNames->Float4);
537 bias_attr.Set(pxr::GfVec4f(-1.0f, -1.0f, -1.0f, -1.0f));
543 const pxr::UsdShadeMaterial &usd_material)
547 pxr::UsdShadeShader shader = pxr::UsdShadeShader::Define(usd_export_context.
stage, shader_path);
551 .Set(pxr::GfVec3f(material->
r, material->
g, material->
b));
556 usd_material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(),
usdtokens::surface);
592 const pxr::UsdShadeMaterial &usd_material,
593 const pxr::UsdShadeInput &usd_input,
594 const std::string &active_uvmap_name,
602 const StringRef shader_name = uv_node ? uv_node->
name :
"uvmap";
605 usd_export_context, usd_material, shader_name,
SH_NODE_UVMAP);
612 std::string uv_name = active_uvmap_name;
613 if (uv_node && uv_node->
storage) {
615 uv_name = shader_uv_map->
uv_map;
629 pxr::UsdShadeMaterial &usd_material,
630 pxr::UsdShadeInput &usd_input,
631 const std::string &uvmap_name,
646 create_uv_input(usd_export_context, socket, usd_material, usd_input, uvmap_name, reports);
652 usd_export_context, usd_material, mapping_node);
654 if (!transform2d_shader) {
659 usd_input.ConnectToSource(transform2d_shader.ConnectableAPI(),
usdtokens::result);
661 float scale[3] = {1.0f, 1.0f, 1.0f};
662 float loc[3] = {0.0f, 0.0f, 0.0f};
663 float rot[3] = {0.0f, 0.0f, 0.0f};
684 if (pxr::UsdShadeInput scale_input = transform2d_shader.CreateInput(
687 pxr::GfVec2f scale_val(scale[0], scale[1]);
688 scale_input.Set(scale_val);
691 if (pxr::UsdShadeInput trans_input = transform2d_shader.CreateInput(
694 pxr::GfVec2f trans_val(loc[0], loc[1]);
695 trans_input.Set(trans_val);
699 pxr::SdfValueTypeNames->Float))
702 float rot_val =
rot[2] * 180.0f /
M_PI;
703 rot_input.Set(rot_val);
707 if (pxr::UsdShadeInput in_input = transform2d_shader.CreateInput(
710 create_uv_input(usd_export_context, socket, usd_material, in_input, uvmap_name, reports);
717 pxr::UsdShadeMaterial &usd_material,
718 pxr::UsdShadeInput &usd_input,
719 const std::string &active_uvmap_name,
722 if (!(usd_material && usd_input)) {
731 usd_export_context, mapping_link, usd_material, usd_input, uvmap_name, reports);
739 usd_export_context, uvmap_link, usd_material, usd_input, active_uvmap_name, reports);
744 bool any_generated =
false;
747 any_generated =
true;
751 return any_generated;
772 if (!(is_generated || is_dirty || is_packed)) {
790 if (is_packed && ima->
filepath[0] !=
'\0') {
805 SNPRINTF(file_name,
"%s.<UDIM>%s", file_body, file_ext);
812 const std::string &export_dir,
815 const bool allow_overwrite,
824 if (!allow_overwrite &&
BLI_exists(export_path)) {
833 CLOG_DEBUG(&
LOG,
"Exporting in-memory texture to '%s'", export_path);
837 reports,
RPT_WARNING,
"USD export: couldn't export in-memory texture to %s", export_path);
842 const std::string &export_dir,
843 const bool allow_overwrite,
856 STRNCPY(file_name, file.c_str());
873 char *udim_pattern =
nullptr;
884 tile_filepath, udim_pattern, tile_format,
tile->tile_number);
901 const std::string &export_dir,
902 const bool allow_overwrite,
906 if (!imapf || !imapf->packedfile || !imapf->packedfile->data || !imapf->packedfile->size) {
915 if (imapf->filepath[0] !=
'\0') {
936 SNPRINTF(tile_number,
".%d", imapf->tile_number);
949 const std::string export_path(export_path_buf);
960 CLOG_DEBUG(&
LOG,
"Exporting packed texture to '%s'", export_path.c_str());
979 return pxr::TfToken();
982 const Image *ima =
reinterpret_cast<const Image *
>(node->
id);
991 return pxr::TfToken();
997 return pxr::TfToken();
1000 if (node->
storage ==
nullptr) {
1001 return pxr::TfToken();
1031 if (!(
input->link &&
input->link->fromnode &&
input->link->fromsock)) {
1082 const pxr::UsdShadeMaterial &material,
1086 pxr::SdfPath shader_path = material.GetPath().AppendChild(
1088 pxr::UsdShadeShader shader = pxr::UsdShadeShader::Define(usd_export_context.
stage, shader_path);
1107 material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(),
usdtokens::surface);
1128 const pxr::UsdShadeMaterial &material,
1140 if (!imagePath.empty()) {
1142 .Set(pxr::SdfAssetPath(imagePath));
1146 if (!colorSpace.IsEmpty()) {
1151 if (!
wrap.IsEmpty()) {
1161 const pxr::UsdShadeMaterial &material,
1162 const pxr::TfToken &primvar_type,
1165 pxr::SdfPath shader_path = material.GetPath().AppendChild(
1167 pxr::UsdShadeShader shader = pxr::UsdShadeShader::Define(usd_export_context.
stage, shader_path);
1169 shader.CreateIdAttr(pxr::VtValue(primvar_type));
1178 return std::string(filepath);
1189 const pxr::UsdStageRefPtr stage,
1192 std::string stage_path = stage->GetRootLayer()->GetRealPath();
1216 else if (ima->
filepath[0] !=
'\0') {
1226 const std::string &stage_path,
1246 if (stage_path.empty()) {
1260 if (stage_path.empty()) {
1265 if (rel_path.empty()) {
1275 const pxr::UsdStageRefPtr stage,
1285 const std::string &dest_dir,
1286 const bool allow_overwrite,
1297 CLOG_WARN(&
LOG,
"Unsupported tile format for '%s'", src_path);
1306 src_tile_path, udim_pattern, tile_format,
tile->tile_number);
1314 if (!allow_overwrite &&
BLI_exists(dest_tile_path)) {
1323 CLOG_DEBUG(&
LOG,
"Copying texture tile from '%s' to '%s'", src_tile_path, dest_tile_path);
1326 if (
BLI_copy(src_tile_path, dest_tile_path) != 0) {
1329 "USD export: could not copy texture tile from %s to %s",
1339 const std::string &dest_dir,
1340 const bool allow_overwrite,
1352 if (!allow_overwrite &&
BLI_exists(dest_path)) {
1361 CLOG_DEBUG(&
LOG,
"Copying texture from '%s' to '%s'", source_path, dest_path);
1364 if (
BLI_copy(source_path, dest_path) != 0) {
1367 "USD export: could not copy texture from %s to %s",
1374 const pxr::UsdStageRefPtr stage,
1375 const bool allow_overwrite,
1379 if (dest_dir.empty()) {
1380 CLOG_ERROR(&
LOG,
"Couldn't determine textures directory path");
1403 usd_export_context.
stage,
1408#ifdef WITH_MATERIALX
1412 usd_export_context.stage,
1413 usd_export_context.export_params.overwrite_textures,
1414 usd_export_context.export_params.worker_status->reports);
1419 const pxr::UsdStageRefPtr stage,
1420 const bool allow_overwrite,
1440 if (spec ==
nullptr) {
1447#ifdef WITH_MATERIALX
1449static std::string materialx_export_image(
const USDExporterContext &usd_export_context,
1456 ima, usd_export_context.stage, usd_export_context.export_params);
1464static pxr::SdfPath reflow_materialx_paths(pxr::SdfPath input_path,
1465 pxr::SdfPath temp_path,
1466 const pxr::SdfPath &target_path,
1470 const std::string &input_path_string = input_path.GetString();
1474 const auto *value_lookup_ptr = rename_pairs.
lookup_ptr(input_path_string);
1475 if (value_lookup_ptr) {
1476 input_path = pxr::SdfPath(*value_lookup_ptr);
1479 for (
const auto &pair : rename_pairs.
items()) {
1480 if (input_path_string.length() > pair.key.length() &&
1481 pxr::TfStringStartsWith(input_path_string, pair.key) &&
1482 (input_path_string[pair.key.length()] ==
'/' ||
1483 input_path_string[pair.key.length()] ==
'.'))
1485 input_path = input_path.ReplacePrefix(pxr::SdfPath(pair.key), pxr::SdfPath(pair.value));
1491 return input_path.ReplacePrefix(temp_path, target_path);
1495static void create_usd_materialx_material(
const USDExporterContext &usd_export_context,
1496 pxr::SdfPath usd_path,
1498 const std::string &active_uvmap_name,
1499 const pxr::UsdShadeMaterial &usd_material)
1501 blender::nodes::materialx::ExportParams export_params = {
1503 usd_path.GetElementString(),
1506 (usd_export_context.export_image_fn) ?
1507 usd_export_context.export_image_fn :
1509 return materialx_export_image(usd_export_context,
main, scene, ima, iuser);
1512 (usd_export_context.export_params.rename_uvmaps) ?
"st" : active_uvmap_name,
1517 usd_export_context.depsgraph, material, export_params);
1525 Set<std::string> used_names;
1526 auto material_prim = usd_material.GetPrim();
1527 for (
const auto &child : material_prim.GetChildren()) {
1528 used_names.
add(child.GetName().GetString());
1540 auto temp_stage = pxr::UsdStage::CreateInMemory();
1541 pxr::UsdMtlxRead(doc, temp_stage, pxr::SdfPath(
"/root"));
1544 auto temp_material_path = pxr::SdfPath(
"/root/Materials");
1545 temp_material_path = temp_material_path.AppendChild(material_prim.GetName());
1546 auto temp_material_prim = temp_stage->GetPrimAtPath(temp_material_path);
1547 if (!temp_material_prim) {
1551 pxr::UsdShadeMaterial temp_material{temp_material_prim};
1552 if (!temp_material) {
1557 pxr::UsdMtlxMaterialXConfigAPI temp_config_api{temp_material_prim};
1558 if (temp_config_api) {
1559 pxr::UsdMtlxMaterialXConfigAPI materialx_config_api = pxr::UsdMtlxMaterialXConfigAPI::Apply(
1561 pxr::UsdAttribute temp_mtlx_version_attr = temp_config_api.GetConfigMtlxVersionAttr();
1562 pxr::VtValue mtlx_version;
1563 if (temp_mtlx_version_attr && temp_mtlx_version_attr.Get(&mtlx_version)) {
1564 materialx_config_api.CreateConfigMtlxVersionAttr(mtlx_version);
1570 Set<std::string> temp_used_names;
1571 for (
const auto &child : temp_material_prim.GetChildren()) {
1572 temp_used_names.
add(child.GetName().GetString());
1578 Map<std::string, std::string> rename_pairs;
1579 for (
const auto &temp_material_child : temp_material_prim.GetChildren()) {
1581 const std::string &
name = temp_material_child.GetName().GetString();
1582 std::string target_name =
name;
1583 while (used_names.
contains(target_name)) {
1585 target_name =
name +
"_mtlx" + std::to_string(conflict_counter);
1587 while (temp_used_names.
contains(target_name)) {
1589 target_name =
name +
"_mtlx" + std::to_string(conflict_counter);
1593 if (conflict_counter == 0) {
1597 temp_used_names.
add(target_name);
1598 const pxr::SdfPath &temp_material_child_path = temp_material_child.GetPath();
1599 const std::string &original_path = temp_material_child_path.GetString();
1600 const std::string new_path =
1601 temp_material_child.GetPath().ReplaceName(pxr::TfToken(target_name)).GetString();
1608 for (
const auto &temp_material_output : temp_material.GetOutputs()) {
1609 pxr::SdfPathVector output_paths;
1611 temp_material_output.GetAttr().GetConnections(&output_paths);
1612 if (output_paths.size() == 1) {
1613 output_paths[0] = reflow_materialx_paths(
1614 output_paths[0], temp_material_path, usd_path, rename_pairs);
1616 auto target_material_output = usd_material.CreateOutput(temp_material_output.GetBaseName(),
1617 temp_material_output.GetTypeName());
1618 target_material_output.GetAttr().SetConnections(output_paths);
1623 for (
const auto &temp_child : temp_material_prim.GetAllDescendants()) {
1625 auto temp_shader = pxr::UsdShadeShader(temp_child);
1631 for (
const auto &shader_input : temp_shader.GetInputs()) {
1632 pxr::SdfPathVector connection_paths;
1633 shader_input.GetAttr().GetConnections(&connection_paths);
1635 if (connection_paths.size() != 1) {
1639 const pxr::SdfPath &connection_path = connection_paths[0];
1641 auto connection_source = pxr::UsdShadeConnectionSourceInfo(temp_stage, connection_path);
1642 auto connection_source_prim = connection_source.source.GetPrim();
1643 if (connection_source_prim == temp_material_prim) {
1649 auto connection_source_attr = temp_stage->GetAttributeAtPath(connection_path);
1650 if (connection_source_attr && shader_input.DisconnectSource()) {
1652 if (connection_source_attr.Get(&val) && !val.IsEmpty()) {
1653 shader_input.GetAttr().Set(val);
1662 connection_paths[0] = reflow_materialx_paths(
1663 connection_paths[0], temp_material_path, usd_path, rename_pairs);
1664 shader_input.GetAttr().SetConnections(connection_paths);
1669 for (
const auto &shader_output : temp_shader.GetOutputs()) {
1670 pxr::SdfPathVector connection_paths;
1671 shader_output.GetAttr().GetConnections(&connection_paths);
1673 if (connection_paths.size() != 1) {
1677 connection_paths[0] = reflow_materialx_paths(
1678 connection_paths[0], temp_material_path, usd_path, rename_pairs);
1679 shader_output.GetAttr().SetConnections(connection_paths);
1684 auto temp_layer = temp_stage->Flatten();
1687 auto target_root_layer = usd_export_context.stage->GetRootLayer();
1688 for (
const auto &temp_material_child : temp_material_prim.GetChildren()) {
1689 auto target_path = reflow_materialx_paths(
1690 temp_material_child.GetPath(), temp_material_path, usd_path, rename_pairs);
1691 pxr::SdfCopySpec(temp_layer, temp_material_child.GetPath(), target_root_layer, target_path);
1697 pxr::SdfPath usd_path,
1699 const std::string &active_uvmap_name,
1702 pxr::UsdShadeMaterial usd_material = pxr::UsdShadeMaterial::Define(usd_export_context.
stage,
1707 usd_export_context, material, usd_material, active_uvmap_name, reports);
1713#ifdef WITH_MATERIALX
1715 create_usd_materialx_material(
1716 usd_export_context, usd_path, material, active_uvmap_name, usd_material);
1721 usd_export_context.
stage, material, usd_material, usd_export_context.
export_params, reports);
1723 return usd_material;
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
char * BKE_image_get_tile_strformat(const char *filepath, eUDIM_TILE_FORMAT *r_tile_format)
void BKE_image_set_filepath_from_tile_number(char *filepath, const char *pattern, eUDIM_TILE_FORMAT tile_format, int tile_number)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
bool BKE_image_is_dirty(Image *image)
bool BKE_image_has_packedfile(const Image *image)
bool BKE_image_is_filename_tokenized(char *filepath)
bool BKE_imbuf_write_as(ImBuf *ibuf, const char *filepath, const ImageFormatData *imf, bool save_copy)
#define SH_NODE_TEX_IMAGE
#define SH_NODE_BSDF_PRINCIPLED
#define SH_NODE_SEPARATE_COLOR
#define SH_NODE_TEX_COORD
#define SH_NODE_VECTOR_MATH
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_BSDF_DIFFUSE
#define SH_NODE_DISPLACEMENT
#define SH_NODE_ATTRIBUTE
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_copy(const char *path_src, const char *path_dst) ATTR_NONNULL()
#define LISTBASE_FOREACH(type, var, list)
MINLINE void copy_v3_v3(float r[3], const float a[3])
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
void void void BLI_path_split_file_part(const char *filepath, char *file, size_t file_maxncpy) ATTR_NONNULL(1
int BLI_path_cmp_normalized(const char *p1, const char *p2) ATTR_NONNULL(1
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
#define STRNCPY_RLEN(dst, src)
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
void BLI_string_split_suffix(const char *string, size_t string_maxlen, char *r_body, char *r_suf) ATTR_NONNULL(1
void BLI_string_replace_char(char *str, char src, char dst) ATTR_NONNULL(1)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_DEBUG(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
struct ImageUser ImageUser
@ NODE_VECTOR_MATH_MULTIPLY_ADD
@ SHD_IMAGE_EXTENSION_MIRROR
@ SHD_IMAGE_EXTENSION_CLIP
@ SHD_IMAGE_EXTENSION_REPEAT
@ SHD_IMAGE_EXTENSION_EXTEND
bool IMB_colormanagement_space_name_is_srgb(const char *name)
bool IMB_colormanagement_space_name_is_data(const char *name)
int IMB_test_image_type_from_memory(const unsigned char *buf, size_t buf_size)
Read Guarded memory(de)allocation.
bool add_overwrite(const Key &key, const Value &value)
bool contains(const Key &key) const
const Value * lookup_ptr(const Key &key) const
const Value & lookup(const Key &key) const
void add_new(const Key &key, const Value &value)
ItemIterator items() const &
#define pf(_x, _i)
Prefetch 64.
const ccl_global KernelWorkTile * tile
void MEM_freeN(void *vmemh)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
static void export_packed_texture(Image *ima, const std::string &export_dir, const bool allow_overwrite, ReportList *reports)
static void get_absolute_path(const Image *ima, char *r_path)
static void copy_tiled_textures(Image *ima, const std::string &dest_dir, const bool allow_overwrite, ReportList *reports)
static void export_texture(const USDExporterContext &usd_export_context, bNode *node)
static void create_usd_preview_surface_material(const USDExporterContext &usd_export_context, Material *material, pxr::UsdShadeMaterial &usd_material, const std::string &active_uvmap_name, ReportList *reports)
static const InputSpecMap & preview_surface_input_map()
static bNodeLink * traverse_channel(bNodeSocket *input, short target_type)
bool asset_exists(const std::string &path)
blender::Map< StringRef, InputSpec > InputSpecMap
static bool is_packed_texture(const Image *ima)
std::string get_relative_path(const std::string &path, const std::string &anchor)
static void create_usd_viewport_material(const USDExporterContext &usd_export_context, const Material *material, const pxr::UsdShadeMaterial &usd_material)
static pxr::TfToken get_node_tex_image_color_space(const bNode *node)
bool write_to_path(const void *data, size_t size, const std::string &path, ReportList *reports)
static bool is_in_memory_texture(Image *ima)
bool paths_equal(const std::string &path1, const std::string &path2)
pxr::TfToken token_for_input(const StringRef input_name)
static pxr::UsdShadeShader create_usd_preview_shader(const USDExporterContext &usd_export_context, const pxr::UsdShadeMaterial &material, const StringRef name, int type)
static bool has_generated_tiles(const Image *ima)
static std::string get_in_memory_texture_filename(Image *ima)
static void export_in_memory_imbuf(ImBuf *imbuf, const std::string &export_dir, const char image_abs_path[FILE_MAX], const char file_name[FILE_MAX], const bool allow_overwrite, ReportList *reports)
static bNode * find_displacement_node(Material *material)
static std::string get_tex_image_asset_filepath(const USDExporterContext &usd_export_context, bNode *node)
void USD_path_abs(char *path, const char *basepath, bool for_import)
std::string make_safe_name(const StringRef name, bool allow_unicode)
std::string get_export_textures_dir(const pxr::UsdStageRefPtr stage)
static bNode * find_bsdf_node(Material *material)
static void export_in_memory_texture(Image *ima, const std::string &export_dir, const bool allow_overwrite, ReportList *reports)
static void copy_single_file(const Image *ima, const std::string &dest_dir, const bool allow_overwrite, ReportList *reports)
static void create_transform2d_shader(const USDExporterContext &usd_export_context, bNodeLink *mapping_link, pxr::UsdShadeMaterial &usd_material, pxr::UsdShadeInput &usd_input, const std::string &uvmap_name, ReportList *reports)
static void process_inputs(const USDExporterContext &usd_export_context, pxr::UsdShadeMaterial &usd_material, pxr::UsdShadeShader &shader, const bNode *node, const std::string &active_uvmap_name, ReportList *reports)
static pxr::TfToken get_node_tex_image_wrap(const bNode *node)
void create_input(pxr::UsdShadeShader &shader, const InputSpec &spec, const void *value, float scale)
static void create_uv_input(const USDExporterContext &usd_export_context, bNodeSocket *input_socket, pxr::UsdShadeMaterial &usd_material, pxr::UsdShadeInput &usd_input, const std::string &active_uvmap_name, ReportList *reports)
pxr::UsdShadeMaterial create_usd_material(const USDExporterContext &usd_export_context, pxr::SdfPath usd_path, Material *material, const std::string &active_uvmap_name, ReportList *reports)
void call_material_export_hooks(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, const USDExportParams &export_params, ReportList *reports)
static pxr::UsdShadeShader create_primvar_reader_shader(const USDExporterContext &usd_export_context, const pxr::UsdShadeMaterial &material, const pxr::TfToken &primvar_type, const bNode *node)
void set_normal_texture_range(pxr::UsdShadeShader &usd_shader, const InputSpec &input_spec)
std::string get_usd_source_path(ID *id)
static void set_scale_bias(pxr::UsdShadeShader &usd_shader, const pxr::GfVec4f scale, const pxr::GfVec4f bias)
static void create_uvmap_shader(const USDExporterContext &usd_export_context, const bNodeLink *uvmap_link, const pxr::UsdShadeMaterial &usd_material, const pxr::UsdShadeInput &usd_input, const std::string &active_uvmap_name, ReportList *reports)
MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *material, const ExportParams &export_params)
static const pxr::TfToken sRGB("sRGB", pxr::TfToken::Immortal)
static const pxr::TfToken emissive_color("emissiveColor", pxr::TfToken::Immortal)
static const pxr::TfToken st("st", pxr::TfToken::Immortal)
static const pxr::TfToken primvar_vector("UsdPrimvarReader_vector", pxr::TfToken::Immortal)
static const pxr::TfToken bias("bias", pxr::TfToken::Immortal)
static const pxr::TfToken opacity("opacity", pxr::TfToken::Immortal)
static const pxr::TfToken preview_shader("previewShader", pxr::TfToken::Immortal)
static const pxr::TfToken sourceColorSpace("sourceColorSpace", pxr::TfToken::Immortal)
static const pxr::TfToken clearcoat("clearcoat", pxr::TfToken::Immortal)
static const pxr::TfToken varname("varname", pxr::TfToken::Immortal)
static const pxr::TfToken surface("surface", pxr::TfToken::Immortal)
static const pxr::TfToken r("r", pxr::TfToken::Immortal)
static const pxr::TfToken primvar_float("UsdPrimvarReader_float", pxr::TfToken::Immortal)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static const pxr::TfToken rotation("rotation", pxr::TfToken::Immortal)
static const pxr::TfToken ior("ior", pxr::TfToken::Immortal)
static const pxr::TfToken primvar_float3("UsdPrimvarReader_float3", pxr::TfToken::Immortal)
static const pxr::TfToken translation("translation", pxr::TfToken::Immortal)
static const pxr::TfToken result("result", pxr::TfToken::Immortal)
static const pxr::TfToken raw("raw", pxr::TfToken::Immortal)
static const pxr::TfToken g("g", pxr::TfToken::Immortal)
static const pxr::TfToken in("in", pxr::TfToken::Immortal)
static const pxr::TfToken clearcoatRoughness("clearcoatRoughness", pxr::TfToken::Immortal)
static const pxr::TfToken scale("scale", pxr::TfToken::Immortal)
static const pxr::TfToken file("file", pxr::TfToken::Immortal)
static const pxr::TfToken mirror("mirror", pxr::TfToken::Immortal)
static const pxr::TfToken opacityThreshold("opacityThreshold", pxr::TfToken::Immortal)
static const pxr::TfToken normal("normal", pxr::TfToken::Immortal)
static const pxr::TfToken clamp("clamp", pxr::TfToken::Immortal)
static const pxr::TfToken black("black", pxr::TfToken::Immortal)
static const pxr::TfToken UsdTransform2d("UsdTransform2d", pxr::TfToken::Immortal)
static const pxr::TfToken displacement("displacement", pxr::TfToken::Immortal)
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
static const pxr::TfToken repeat("repeat", pxr::TfToken::Immortal)
static const pxr::TfToken metallic("metallic", pxr::TfToken::Immortal)
static const pxr::TfToken specular("specular", pxr::TfToken::Immortal)
static const pxr::TfToken diffuse_color("diffuseColor", pxr::TfToken::Immortal)
static const pxr::TfToken primvar_float2("UsdPrimvarReader_float2", pxr::TfToken::Immortal)
static const pxr::TfToken uv_texture("UsdUVTexture", pxr::TfToken::Immortal)
static const pxr::TfToken wrapS("wrapS", pxr::TfToken::Immortal)
static const pxr::TfToken rgb("rgb", pxr::TfToken::Immortal)
static const pxr::TfToken wrapT("wrapT", pxr::TfToken::Immortal)
static const pxr::TfToken a("a", pxr::TfToken::Immortal)
static const pxr::TfToken preview_surface("UsdPreviewSurface", pxr::TfToken::Immortal)
float wrap(float value, float max, float min)
static void image_abs_path(Main *bmain, Library *owner_library, const char *filepath, char *r_filepath_abs)
struct ListBase packedfiles
ColorManagedColorspaceSettings colorspace_settings
struct bNodeTree * nodetree
bool generate_preview_surface
bool generate_materialx_network
wmJobWorkerStatus * worker_status
const USDExportParams & export_params
const pxr::UsdStageRefPtr stage