diff --git a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc index da053e1c..6d559fa8 100644 --- a/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc +++ b/src/experimental/usd/plugins/mjcf/mujoco_to_usd.cc @@ -91,6 +91,7 @@ TF_DEFINE_PRIVATE_TOKENS(kTokens, ((inputsWrapS, "inputs:wrapS")) ((inputsWrapT, "inputs:wrapT")) ((inputsDiffuseColor, "inputs:diffuseColor")) + ((inputsEmissiveColor, "inputs:emissiveColor")) ((outputsRgb, "outputs:rgb")) ((outputsR, "outputs:r")) ((outputsG, "outputs:g")) @@ -794,6 +795,26 @@ class ModelWriter { } } + // Connect an emissive texture if specified. + if (mjTEXROLE_EMISSIVE < textures.size()) { + std::string emissive_texture_name = textures[mjTEXROLE_EMISSIVE]; + mjsTexture *emissive_texture = mjs_asTexture( + mjs_findElement(spec_, mjOBJ_TEXTURE, emissive_texture_name.c_str())); + if (emissive_texture) { + pxr::SdfPath emissive_attr = CreateAttributeSpec( + data_, preview_surface_shader_path, kTokens->inputsEmissiveColor, + pxr::SdfValueTypeNames->Color3f); + const std::vector emissive_map_output_attrs = + AddTextureShader(material_path, emissive_texture->file->c_str(), + pxr::TfToken("emissive"), uvmap_st_output_attr, + {kTokens->outputsRgb}); + if (emissive_map_output_attrs.size() == 1) { + AddAttributeConnection(data_, emissive_attr, + emissive_map_output_attrs[0]); + } + } + } + pxr::SdfPath diffuse_color_attr = CreateAttributeSpec( data_, preview_surface_shader_path, kTokens->inputsDiffuseColor, pxr::SdfValueTypeNames->Color3f); diff --git a/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc b/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc index 446f009e..41bd3ea3 100644 --- a/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc +++ b/test/experimental/usd/plugins/mjcf/mjcf_file_format_test.cc @@ -192,6 +192,16 @@ TEST_F(MjcfSdfFileFormatPluginTest, TestMaterials) { stage, "/mesh_test/Materials/material_layered/orm_packed.inputs:file", pxr::SdfAssetPath("textures/orm.png")); + EXPECT_PRIM_VALID(stage, "/mesh_test/Materials/material_layered/emissive"); + ExpectAttributeHasConnection( + stage, + "/mesh_test/Materials/material_layered/" + "PreviewSurface.inputs:emissiveColor", + "/mesh_test/Materials/material_layered/emissive.outputs:rgb"); + ExpectAttributeEqual( + stage, "/mesh_test/Materials/material_layered/emissive.inputs:file", + pxr::SdfAssetPath("textures/emissive.png")); + EXPECT_PRIM_VALID(stage, "/mesh_test/Materials/material_metallic"); EXPECT_PRIM_VALID(stage, "/mesh_test/Materials/material_metallic/PreviewSurface"); diff --git a/test/experimental/usd/plugins/mjcf/testdata/materials.xml b/test/experimental/usd/plugins/mjcf/testdata/materials.xml index 175c3ec8..dfb869d4 100644 --- a/test/experimental/usd/plugins/mjcf/testdata/materials.xml +++ b/test/experimental/usd/plugins/mjcf/testdata/materials.xml @@ -3,6 +3,7 @@ + @@ -10,6 +11,7 @@ + 2d texture="diffuse" normal="normal" /> diff --git a/test/experimental/usd/plugins/mjcf/testdata/textures/emissive.png b/test/experimental/usd/plugins/mjcf/testdata/textures/emissive.png new file mode 100644 index 00000000..8c244eca Binary files /dev/null and b/test/experimental/usd/plugins/mjcf/testdata/textures/emissive.png differ