[Bf-blender-cvs] [d742007c8e5] universal-scene-description: USD export: convert active UV map to st.
Michael Kowalski
noreply at git.blender.org
Wed Apr 13 00:19:37 CEST 2022
Commit: d742007c8e5c25cba3bfe835e3a44289177a5163
Author: Michael Kowalski
Date: Tue Apr 12 18:17:13 2022 -0400
Branches: universal-scene-description
https://developer.blender.org/rBd742007c8e5c25cba3bfe835e3a44289177a5163
USD export: convert active UV map to st.
Updated the logic of the convert_uv_to_st option to rename the
active UV set to 'st', to allow specifying the default UV set
when there are multiple UVs. Previously, this option assumed
a single UV set.
===================================================================
M source/blender/editors/io/io_usd.c
M source/blender/io/usd/intern/usd_writer_abstract.cc
M source/blender/io/usd/intern/usd_writer_mesh.cc
M source/blender/io/usd/intern/usd_writer_mesh.h
===================================================================
diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c
index a98b4f23f83..fa76a0dc529 100644
--- a/source/blender/editors/io/io_usd.c
+++ b/source/blender/editors/io/io_usd.c
@@ -698,8 +698,7 @@ void WM_OT_usd_export(struct wmOperatorType *ot)
"convert_uv_to_st",
false,
"Convert uv to st",
- "When checked, the USD exporter will convert all uv map names to interchangeable 'st'"
- "(Assumes one uv layout per mesh)");
+ "Export the active uv map as USD primvar named 'st'");
RNA_def_boolean(ot->srna,
"convert_orientation",
diff --git a/source/blender/io/usd/intern/usd_writer_abstract.cc b/source/blender/io/usd/intern/usd_writer_abstract.cc
index 30dd640f3a5..b12c0106506 100644
--- a/source/blender/io/usd/intern/usd_writer_abstract.cc
+++ b/source/blender/io/usd/intern/usd_writer_abstract.cc
@@ -236,6 +236,9 @@ pxr::UsdShadeMaterial USDAbstractWriter::ensure_usd_material(const HierarchyCont
}
if (material->use_nodes && this->usd_export_context_.export_params.generate_preview_surface) {
std::string active_uv = get_mesh_active_uvlayer_name(context.object);
+ if (usd_export_context_.export_params.convert_uv_to_st && !active_uv.empty()) {
+ active_uv = "st";
+ }
create_usd_preview_surface_material(
this->usd_export_context_, material, usd_material, active_uv);
}
diff --git a/source/blender/io/usd/intern/usd_writer_mesh.cc b/source/blender/io/usd/intern/usd_writer_mesh.cc
index b94251dd174..ba3b2897fec 100644
--- a/source/blender/io/usd/intern/usd_writer_mesh.cc
+++ b/source/blender/io/usd/intern/usd_writer_mesh.cc
@@ -193,10 +193,18 @@ struct USDMeshData {
void USDGenericMeshWriter::write_custom_data(const Mesh *mesh, pxr::UsdGeomMesh usd_mesh)
{
const CustomData *ldata = &mesh->ldata;
+
+ /* Index of the UV layer to be renamed "st", set to the active UV layer index if
+ * the convert_uv_to_st option is enabled and set to -1 otherwise. */
+ const int st_layer_idx = usd_export_context_.export_params.convert_uv_to_st ?
+ CustomData_get_active_layer_index(ldata, CD_MLOOPUV) :
+ -1;
+
for (int layer_idx = 0; layer_idx < ldata->totlayer; layer_idx++) {
const CustomDataLayer *layer = &ldata->layers[layer_idx];
if (layer->type == CD_MLOOPUV && usd_export_context_.export_params.export_uvmaps) {
- write_uv_maps(mesh, usd_mesh, layer);
+ const char *name_override = st_layer_idx == layer_idx ? "st" : nullptr;
+ write_uv_maps(mesh, usd_mesh, layer, name_override);
}
else if (layer->type == CD_MLOOPCOL &&
usd_export_context_.export_params.export_vertex_colors) {
@@ -207,7 +215,8 @@ void USDGenericMeshWriter::write_custom_data(const Mesh *mesh, pxr::UsdGeomMesh
void USDGenericMeshWriter::write_uv_maps(const Mesh *mesh,
pxr::UsdGeomMesh usd_mesh,
- const CustomDataLayer *layer)
+ const CustomDataLayer *layer,
+ const char *name_override)
{
pxr::UsdTimeCode timecode = get_export_time_code();
@@ -215,7 +224,8 @@ void USDGenericMeshWriter::write_uv_maps(const Mesh *mesh,
* The primvar name is the same as the UV Map name. This is to allow the standard name "st"
* for texture coordinates by naming the UV Map as such, without having to guess which UV Map
* is the "standard" one. */
- pxr::TfToken primvar_name(pxr::TfMakeValidIdentifier(layer->name));
+ pxr::TfToken primvar_name(name_override ? name_override :
+ pxr::TfMakeValidIdentifier(layer->name));
if (usd_export_context_.export_params.author_blender_name) {
// Store original layer name in blender
@@ -228,9 +238,6 @@ void USDGenericMeshWriter::write_uv_maps(const Mesh *mesh,
.Set(std::string(layer->name), pxr::UsdTimeCode::Default());
}
- if (usd_export_context_.export_params.convert_uv_to_st)
- primvar_name = pxr::TfToken("st");
-
pxr::UsdGeomPrimvar uv_coords_primvar = usd_mesh.CreatePrimvar(
primvar_name, pxr::SdfValueTypeNames->TexCoord2fArray, pxr::UsdGeomTokens->faceVarying);
diff --git a/source/blender/io/usd/intern/usd_writer_mesh.h b/source/blender/io/usd/intern/usd_writer_mesh.h
index 286f585ed66..f285b6c73ce 100644
--- a/source/blender/io/usd/intern/usd_writer_mesh.h
+++ b/source/blender/io/usd/intern/usd_writer_mesh.h
@@ -34,7 +34,9 @@ class USDGenericMeshWriter : public USDAbstractWriter {
pxr::UsdGeomMesh usd_mesh,
const MaterialFaceGroups &usd_face_groups);
void write_custom_data(const Mesh *mesh, pxr::UsdGeomMesh usd_mesh);
- void write_uv_maps(const Mesh *mesh, pxr::UsdGeomMesh usd_mesh, const CustomDataLayer *layer);
+ void write_uv_maps(const Mesh *mesh, pxr::UsdGeomMesh usd_mesh,
+ const CustomDataLayer *layer,
+ const char *name_override = nullptr);
void write_vertex_colors(const Mesh *mesh,
pxr::UsdGeomMesh usd_mesh,
const CustomDataLayer *layer);
More information about the Bf-blender-cvs
mailing list