39#include <pxr/base/tf/stringUtils.h>
47# include <pxr/usd/sdf/copyUtils.h>
48# include <pxr/usd/usdMtlx/reader.h>
49# include <pxr/usd/usdMtlx/utils.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_float2(
"UsdPrimvarReader_float2", pxr::TfToken::Immortal);
65static const pxr::TfToken
roughness(
"roughness", pxr::TfToken::Immortal);
66static const pxr::TfToken
specular(
"specular", pxr::TfToken::Immortal);
67static const pxr::TfToken
opacity(
"opacity", pxr::TfToken::Immortal);
69static const pxr::TfToken
surface(
"surface", pxr::TfToken::Immortal);
70static const pxr::TfToken
perspective(
"perspective", pxr::TfToken::Immortal);
71static const pxr::TfToken
orthographic(
"orthographic", pxr::TfToken::Immortal);
72static const pxr::TfToken
rgb(
"rgb", pxr::TfToken::Immortal);
73static const pxr::TfToken
r(
"r", pxr::TfToken::Immortal);
74static const pxr::TfToken
g(
"g", pxr::TfToken::Immortal);
75static const pxr::TfToken
b(
"b", pxr::TfToken::Immortal);
76static const pxr::TfToken
a(
"a", pxr::TfToken::Immortal);
77static const pxr::TfToken
st(
"st", pxr::TfToken::Immortal);
78static const pxr::TfToken
result(
"result", pxr::TfToken::Immortal);
79static const pxr::TfToken
varname(
"varname", pxr::TfToken::Immortal);
80static const pxr::TfToken
out(
"out", pxr::TfToken::Immortal);
81static const pxr::TfToken
normal(
"normal", pxr::TfToken::Immortal);
82static const pxr::TfToken
ior(
"ior", pxr::TfToken::Immortal);
83static const pxr::TfToken
file(
"file", pxr::TfToken::Immortal);
84static const pxr::TfToken
raw(
"raw", pxr::TfToken::Immortal);
85static const pxr::TfToken
scale(
"scale", pxr::TfToken::Immortal);
86static const pxr::TfToken
bias(
"bias", pxr::TfToken::Immortal);
87static const pxr::TfToken
sRGB(
"sRGB", pxr::TfToken::Immortal);
89static const pxr::TfToken
Shader(
"Shader", pxr::TfToken::Immortal);
90static const pxr::TfToken
black(
"black", pxr::TfToken::Immortal);
91static const pxr::TfToken
clamp(
"clamp", pxr::TfToken::Immortal);
92static const pxr::TfToken
repeat(
"repeat", pxr::TfToken::Immortal);
93static const pxr::TfToken
mirror(
"mirror", pxr::TfToken::Immortal);
94static const pxr::TfToken
wrapS(
"wrapS", pxr::TfToken::Immortal);
95static const pxr::TfToken
wrapT(
"wrapT", pxr::TfToken::Immortal);
96static const pxr::TfToken
in(
"in", pxr::TfToken::Immortal);
97static const pxr::TfToken
translation(
"translation", pxr::TfToken::Immortal);
98static const pxr::TfToken
rotation(
"rotation", pxr::TfToken::Immortal);
118 const pxr::UsdShadeMaterial &material,
122 const pxr::UsdShadeMaterial &material,
126 pxr::UsdShadeMaterial &usd_material,
127 pxr::UsdShadeInput &usd_input,
128 const std::string &active_uvmap_name,
144template<
typename T1,
typename T2>
150 const T1 *cast_value =
static_cast<const T1 *
>(value);
156 pxr::UsdShadeMaterial &usd_material,
157 const std::string &active_uvmap_name,
173 usd_export_context, usd_material, node);
182 if (spec ==
nullptr) {
187 float input_scale = 1.0;
195 node,
SOCK_IN,
"Emission Strength");
197 if (!emission_strength_sock) {
203 if (input_scale == 0.0f) {
212 usd_export_context, usd_material, input_node);
215 pxr::TfToken source_name;
216 if (input_spec.
input_type == pxr::SdfValueTypeNames->Float) {
221 if (input_link_sep_color) {
236 usd_shader.CreateOutput(source_name, pxr::SdfValueTypeNames->Float);
240 usd_shader.CreateOutput(
usdtokens::rgb, pxr::SdfValueTypeNames->Float3);
244 pxr::UsdShadeConnectionSourceInfo source_info(
245 usd_shader.ConnectableAPI(), source_name, pxr::UsdShadeAttributeType::Output);
247 .ConnectToSource(source_info);
268 vector_math_node = temp_link->
fromnode;
273 const float *scale_value =
275 const float *bias_value =
278 const pxr::GfVec4f scale(scale_value[0], scale_value[1], scale_value[2], 1.0f);
279 const pxr::GfVec4f bias(bias_value[0], bias_value[1], bias_value[2], 0.0f);
283 scale_attr = usd_shader.CreateInput(
usdtokens::scale, pxr::SdfValueTypeNames->Float4);
285 scale_attr.Set(scale);
289 bias_attr = usd_shader.CreateInput(
usdtokens::bias, pxr::SdfValueTypeNames->Float4);
297 if (pxr::UsdShadeInput st_input = usd_shader.CreateInput(
usdtokens::st,
298 pxr::SdfValueTypeNames->Float2))
301 usd_export_context, socket, usd_material, st_input, active_uvmap_name, reports);
307 float threshold = 0.0f;
311 if (math_link && math_link->
fromnode) {
323 if (math_link && math_link->
fromnode) {
329 math_node,
SOCK_IN,
"Value_001");
337 if (threshold > 0.0f) {
338 pxr::UsdShadeInput opacity_threshold_input = preview_surface.CreateInput(
340 opacity_threshold_input.GetAttr().Set(pxr::VtValue(threshold));
347 switch (sock->type) {
350 preview_surface, input_spec, sock->default_value, input_scale);
354 preview_surface, input_spec, sock->default_value, input_scale);
358 preview_surface, input_spec, sock->default_value, input_scale);
378 pxr::TfToken shader_id;
384 pxr::TfToken colorspace;
386 if (!colorspace_attr || !colorspace_attr.Get(&colorspace) || colorspace !=
usdtokens::raw) {
393 scale_attr = usd_shader.CreateInput(
usdtokens::scale, pxr::SdfValueTypeNames->Float4);
395 scale_attr.Set(pxr::GfVec4f(2.0f, 2.0f, 2.0f, 2.0f));
400 bias_attr = usd_shader.CreateInput(
usdtokens::bias, pxr::SdfValueTypeNames->Float4);
402 bias_attr.Set(pxr::GfVec4f(-1.0f, -1.0f, -1.0f, -1.0f));
408 const pxr::UsdShadeMaterial &usd_material)
412 pxr::UsdShadeShader shader = pxr::UsdShadeShader::Define(usd_export_context.
stage, shader_path);
416 .Set(pxr::GfVec3f(material->r, material->g, material->b));
417 shader.CreateInput(
usdtokens::roughness, pxr::SdfValueTypeNames->Float).Set(material->roughness);
418 shader.CreateInput(
usdtokens::metallic, pxr::SdfValueTypeNames->Float).Set(material->metallic);
421 usd_material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(),
usdtokens::surface);
430 map.add_new(
"Emission Color",
435 map.add_new(
"Specular IOR Level", {
usdtokens::specular, pxr::SdfValueTypeNames->Float,
true});
437 map.add_new(
"IOR", {
usdtokens::ior, pxr::SdfValueTypeNames->Float,
true});
440 map.add_new(
"Normal", {
usdtokens::normal, pxr::SdfValueTypeNames->Normal3f,
false});
442 map.add_new(
"Coat Roughness",
456 const pxr::UsdShadeMaterial &usd_material,
457 const pxr::UsdShadeInput &usd_input,
458 const std::string &active_uvmap_name,
466 const char *shader_name = uv_node ? uv_node->
name :
"uvmap";
469 usd_export_context, usd_material, shader_name,
SH_NODE_UVMAP);
476 std::string uv_name = active_uvmap_name;
477 if (uv_node && uv_node->
storage) {
479 uv_name = shader_uv_map->
uv_map;
487 uv_shader.CreateInput(
usdtokens::varname, pxr::SdfValueTypeNames->String).Set(uv_name);
493 pxr::UsdShadeMaterial &usd_material,
494 pxr::UsdShadeInput &usd_input,
495 const std::string &uvmap_name,
510 create_uv_input(usd_export_context, socket, usd_material, usd_input, uvmap_name, reports);
516 usd_export_context, usd_material, mapping_node);
518 if (!transform2d_shader) {
523 usd_input.ConnectToSource(transform2d_shader.ConnectableAPI(),
usdtokens::result);
525 float scale[3] = {1.0f, 1.0f, 1.0f};
526 float loc[3] = {0.0f, 0.0f, 0.0f};
527 float rot[3] = {0.0f, 0.0f, 0.0f};
548 if (pxr::UsdShadeInput scale_input = transform2d_shader.CreateInput(
551 pxr::GfVec2f scale_val(scale[0], scale[1]);
552 scale_input.Set(scale_val);
555 if (pxr::UsdShadeInput trans_input = transform2d_shader.CreateInput(
558 pxr::GfVec2f trans_val(loc[0], loc[1]);
559 trans_input.Set(trans_val);
563 pxr::SdfValueTypeNames->Float))
566 float rot_val =
rot[2] * 180.0f /
M_PI;
567 rot_input.Set(rot_val);
571 if (pxr::UsdShadeInput in_input = transform2d_shader.CreateInput(
574 create_uv_input(usd_export_context, socket, usd_material, in_input, uvmap_name, reports);
581 pxr::UsdShadeMaterial &usd_material,
582 pxr::UsdShadeInput &usd_input,
583 const std::string &active_uvmap_name,
586 if (!(usd_material && usd_input)) {
595 usd_export_context, mapping_link, usd_material, usd_input, uvmap_name, reports);
603 usd_export_context, uvmap_link, usd_material, usd_input, active_uvmap_name, reports);
624 if (!(is_generated || is_dirty || is_packed)) {
649 SNPRINTF(file_name,
"%s.<UDIM>%s", file_body, file_ext);
656 const std::string &export_dir,
657 const bool allow_overwrite,
690 if (!allow_overwrite &&
BLI_exists(export_path)) {
699 CLOG_INFO(&
LOG, 2,
"Exporting in-memory texture to '%s'", export_path);
703 reports,
RPT_WARNING,
"USD export: couldn't export in-memory texture to %s", export_path);
720 return pxr::TfToken();
723 const Image *ima =
reinterpret_cast<const Image *
>(node->id);
732 return pxr::TfToken();
738 return pxr::TfToken();
741 if (node->storage ==
nullptr) {
742 return pxr::TfToken();
772 if (!(input->link && input->link->fromnode && input->link->fromsock)) {
776 bNode *linked_node = input->link->fromnode;
777 if (linked_node->
type == target_type) {
796 for (
bNode *node : material->nodetree->all_nodes()) {
797 if (
ELEM(node->type, SH_NODE_BSDF_PRINCIPLED, SH_NODE_BSDF_DIFFUSE)) {
807 const pxr::UsdShadeMaterial &material,
811 pxr::SdfPath shader_path = material.GetPath().AppendChild(
813 pxr::UsdShadeShader shader = pxr::UsdShadeShader::Define(usd_export_context.
stage, shader_path);
832 material.CreateSurfaceOutput().ConnectToSource(shader.ConnectableAPI(),
usdtokens::surface);
853 const pxr::UsdShadeMaterial &material,
857 usd_export_context, material, node->name, node->type);
865 if (!imagePath.empty()) {
867 .Set(pxr::SdfAssetPath(imagePath));
871 if (!colorSpace.IsEmpty()) {
876 if (!
wrap.IsEmpty()) {
889 return std::string(filepath);
900 const pxr::UsdStageRefPtr
stage,
903 std::string stage_path =
stage->GetRootLayer()->GetRealPath();
927 else if (ima->
filepath[0] !=
'\0') {
937 const std::string &stage_path,
957 if (stage_path.empty()) {
971 if (stage_path.empty()) {
976 if (rel_path.empty()) {
986 const pxr::UsdStageRefPtr
stage,
989 Image *ima =
reinterpret_cast<Image *
>(node->id);
996 const std::string &dest_dir,
997 const bool allow_overwrite,
1008 CLOG_WARN(&
LOG,
"Unsupported tile format for '%s'", src_path);
1017 src_tile_path, udim_pattern, tile_format,
tile->tile_number);
1025 if (!allow_overwrite &&
BLI_exists(dest_tile_path)) {
1034 CLOG_INFO(&
LOG, 2,
"Copying texture tile from '%s' to '%s'", src_tile_path, dest_tile_path);
1037 if (
BLI_copy(src_tile_path, dest_tile_path) != 0) {
1040 "USD export: could not copy texture tile from %s to %s",
1050 const std::string &dest_dir,
1051 const bool allow_overwrite,
1063 if (!allow_overwrite &&
BLI_exists(dest_path)) {
1072 CLOG_INFO(&
LOG, 2,
"Copying texture from '%s' to '%s'", source_path, dest_path);
1075 if (
BLI_copy(source_path, dest_path) != 0) {
1078 "USD export: could not copy texture from %s to %s",
1085 const pxr::UsdStageRefPtr
stage,
1086 const bool allow_overwrite,
1089 std::string export_path =
stage->GetRootLayer()->GetRealPath();
1090 if (export_path.empty()) {
1106 std::string dest_dir(tex_dir_path);
1108 if (is_generated || is_dirty || is_packed) {
1122 usd_export_context.
stage,
1132 if (spec ==
nullptr) {
1139#ifdef WITH_MATERIALX
1141static std::string materialx_export_image(
1145 ima, usd_export_context.stage, usd_export_context.export_params);
1153static pxr::SdfPath reflow_materialx_paths(pxr::SdfPath input_path,
1154 pxr::SdfPath temp_path,
1155 const pxr::SdfPath &target_path,
1159 const std::string &input_path_string = input_path.GetString();
1163 auto value_lookup_ptr = rename_pairs.
lookup_ptr(input_path_string);
1164 if (value_lookup_ptr) {
1165 input_path = pxr::SdfPath(*value_lookup_ptr);
1168 for (
const auto &pair : rename_pairs.items()) {
1169 if (input_path_string.length() > pair.key.length() &&
1170 pxr::TfStringStartsWith(input_path_string, pair.key) &&
1171 (input_path_string[pair.key.length()] ==
'/' ||
1172 input_path_string[pair.key.length()] ==
'.'))
1174 input_path = input_path.ReplacePrefix(pxr::SdfPath(pair.key), pxr::SdfPath(pair.value));
1180 return input_path.ReplacePrefix(temp_path, target_path);
1184static void create_usd_materialx_material(
const USDExporterContext &usd_export_context,
1185 pxr::SdfPath usd_path,
1187 const std::string &active_uvmap_name,
1188 const pxr::UsdShadeMaterial &usd_material)
1193 (usd_export_context.export_image_fn) ? usd_export_context.export_image_fn :
1194 std::bind(materialx_export_image,
1196 std::placeholders::_1,
1197 std::placeholders::_2,
1198 std::placeholders::_3,
1199 std::placeholders::_4),
1201 (usd_export_context.export_params.rename_uvmaps) ?
"st" : active_uvmap_name,
1205 std::string material_name = usd_path.GetElementString();
1207 usd_export_context.depsgraph, material, material_name, export_params);
1215 Set<std::string> used_names;
1216 auto material_prim = usd_material.GetPrim();
1217 for (
const auto &child : material_prim.GetChildren()) {
1218 used_names.add(child.GetName().GetString());
1230 auto temp_stage = pxr::UsdStage::CreateInMemory();
1231 pxr::UsdMtlxRead(doc, temp_stage, pxr::SdfPath(
"/root"));
1234 auto temp_material_path = pxr::SdfPath(
"/root/Materials");
1235 temp_material_path = temp_material_path.AppendChild(material_prim.GetName());
1236 auto temp_material_prim = temp_stage->GetPrimAtPath(temp_material_path);
1237 if (!temp_material_prim) {
1241 pxr::UsdShadeMaterial temp_material{temp_material_prim};
1242 if (!temp_material) {
1248 Set<std::string> temp_used_names;
1249 for (
const auto &child : temp_material_prim.GetChildren()) {
1250 temp_used_names.add(child.GetName().GetString());
1256 Map<std::string, std::string> rename_pairs;
1257 for (
const auto &temp_material_child : temp_material_prim.GetChildren()) {
1259 const std::string &name = temp_material_child.GetName().GetString();
1260 std::string target_name = name;
1261 while (used_names.contains(target_name)) {
1263 target_name = name +
"_mtlx" + std::to_string(conflict_counter);
1265 while (temp_used_names.contains(target_name)) {
1267 target_name = name +
"_mtlx" + std::to_string(conflict_counter);
1271 if (conflict_counter == 0) {
1275 temp_used_names.add(target_name);
1276 const pxr::SdfPath &temp_material_child_path = temp_material_child.GetPath();
1277 const std::string &original_path = temp_material_child_path.GetString();
1278 const std::string new_path =
1279 temp_material_child.GetPath().ReplaceName(pxr::TfToken(target_name)).GetString();
1281 rename_pairs.add_overwrite(original_path, new_path);
1286 for (
const auto &temp_material_output : temp_material.GetOutputs()) {
1287 pxr::SdfPathVector output_paths;
1289 temp_material_output.GetAttr().GetConnections(&output_paths);
1290 if (output_paths.size() == 1) {
1291 output_paths[0] = reflow_materialx_paths(
1292 output_paths[0], temp_material_path, usd_path, rename_pairs);
1294 auto target_material_output = usd_material.CreateOutput(temp_material_output.GetBaseName(),
1295 temp_material_output.GetTypeName());
1296 target_material_output.GetAttr().SetConnections(output_paths);
1301 for (
const auto &temp_child : temp_material_prim.GetAllDescendants()) {
1303 auto temp_shader = pxr::UsdShadeShader(temp_child);
1309 for (
const auto &shader_input : temp_shader.GetInputs()) {
1310 pxr::SdfPathVector connection_paths;
1311 shader_input.GetAttr().GetConnections(&connection_paths);
1313 if (connection_paths.size() != 1) {
1317 const pxr::SdfPath &connection_path = connection_paths[0];
1319 auto connection_source = pxr::UsdShadeConnectionSourceInfo(temp_stage, connection_path);
1320 auto connection_source_prim = connection_source.source.GetPrim();
1321 if (connection_source_prim == temp_material_prim) {
1327 auto connection_source_attr = temp_stage->GetAttributeAtPath(connection_path);
1328 if (connection_source_attr && shader_input.DisconnectSource()) {
1330 if (connection_source_attr.Get(&val) && !val.IsEmpty()) {
1331 shader_input.GetAttr().Set(val);
1340 connection_paths[0] = reflow_materialx_paths(
1341 connection_paths[0], temp_material_path, usd_path, rename_pairs);
1342 shader_input.GetAttr().SetConnections(connection_paths);
1347 for (
const auto &shader_output : temp_shader.GetOutputs()) {
1348 pxr::SdfPathVector connection_paths;
1349 shader_output.GetAttr().GetConnections(&connection_paths);
1351 if (connection_paths.size() != 1) {
1355 connection_paths[0] = reflow_materialx_paths(
1356 connection_paths[0], temp_material_path, usd_path, rename_pairs);
1357 shader_output.GetAttr().SetConnections(connection_paths);
1362 auto temp_layer = temp_stage->Flatten();
1365 auto target_root_layer = usd_export_context.stage->GetRootLayer();
1366 for (
const auto &temp_material_child : temp_material_prim.GetChildren()) {
1367 auto target_path = reflow_materialx_paths(
1368 temp_material_child.GetPath(), temp_material_path, usd_path, rename_pairs);
1369 pxr::SdfCopySpec(temp_layer, temp_material_child.GetPath(), target_root_layer, target_path);
1375 pxr::SdfPath usd_path,
1377 const std::string &active_uvmap_name,
1380 pxr::UsdShadeMaterial usd_material = pxr::UsdShadeMaterial::Define(usd_export_context.
stage,
1385 usd_export_context, material, usd_material, active_uvmap_name, reports);
1391#ifdef WITH_MATERIALX
1393 create_usd_materialx_material(
1394 usd_export_context, usd_path, material, active_uvmap_name, usd_material);
1400 return usd_material;
1404 const std::string &export_dir,
1405 const bool allow_overwrite,
1409 if (!imapf || !imapf->packedfile || !imapf->packedfile->data || !imapf->packedfile->size) {
1418 if (imapf->filepath[0] !=
'\0') {
1438 char tile_number[6];
1439 SNPRINTF(tile_number,
".%d", imapf->tile_number);
1461 CLOG_INFO(&
LOG, 2,
"Exporting packed texture to '%s'", export_path);
1472 usd_export_context.
stage,
1478 const pxr::UsdStageRefPtr
stage,
1479 const bool allow_overwrite,
1486 Image *ima =
reinterpret_cast<Image *
>(node->id);
1492 if (dest_dir.empty()) {
1493 CLOG_ERROR(&
LOG,
"Couldn't determine textures directory path");
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_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
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()
bool BLI_dir_create_recursive(const char *dirname) ATTR_NONNULL()
#define LISTBASE_FOREACH(type, var, list)
MINLINE void copy_v3_v3(float r[3], const float a[3])
#define BLI_SCOPED_DEFER(function_to_defer)
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(dst, src)
#define STRNCPY_RLEN(dst, src)
#define SNPRINTF(dst, format,...)
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_WARN(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
#define ID_BLEND_PATH_FROM_GLOBAL(_id)
@ 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_ispic_type_from_memory(const unsigned char *buf, size_t buf_size)
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue Hue Saturation Apply a color transformation in the HSV color model Specular Similar to the Principled BSDF node but uses the specular workflow instead of metallic
const Value * lookup_ptr(const Key &key) const
void add_new(const Key &key, const Value &value)
local_group_size(16, 16) .push_constant(Type b
#define pf(_x, _i)
Prefetch 64.
ccl_global const KernelWorkTile * tile
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
bool asset_exists(const char *path)
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)
void call_material_export_hooks(pxr::UsdStageRefPtr stage, Material *material, const pxr::UsdShadeMaterial &usd_material, 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 write_to_path(const void *data, size_t size, const char *path, ReportList *reports)
pxr::TfToken token_for_input(const char *input_name)
bool paths_equal(const char *p1, const char *p2)
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)
std::string make_safe_name(const std::string &name, bool allow_unicode)
static bool is_in_memory_texture(Image *ima)
static std::string get_in_memory_texture_filename(Image *ima)
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 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 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 set_normal_texture_range(pxr::UsdShadeShader &usd_shader, const InputSpec &input_spec)
std::string get_usd_source_path(ID *id)
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)
static pxr::UsdShadeShader create_usd_preview_shader(const USDExporterContext &usd_export_context, const pxr::UsdShadeMaterial &material, const char *name, int type)
MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *material, const std::string &material_name, 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 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 out("out", pxr::TfToken::Immortal)
static const pxr::TfToken clearcoat("clearcoat", pxr::TfToken::Immortal)
static const pxr::TfToken perspective("perspective", 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 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 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 orthographic("orthographic", 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 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)
static const pxr::TfToken Shader("Shader", 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
bool generate_preview_surface
bool generate_materialx_network
wmJobWorkerStatus * worker_status
const USDExportParams & export_params
const pxr::UsdStageRefPtr stage