public void SetUp() { var fbxPath = AssetDatabase.GUIDToAssetPath(fbxGUID); var asset = AssetDatabase.LoadAssetAtPath <GameObject>(fbxPath); fbxRoot = PrefabUtility.InstantiatePrefab(asset) as GameObject; InitUsd.Initialize(); var usdPath = Path.GetFullPath(AssetDatabase.GUIDToAssetPath(usdGUID)); var stage = pxr.UsdStage.Open(usdPath, pxr.UsdStage.InitialLoadSet.LoadNone); var scene = Scene.Open(stage); var importOptions = new SceneImportOptions(); importOptions.changeHandedness = BasisTransformation.SlowAndSafeAsFBX; importOptions.scale = 0.01f; importOptions.materialImportMode = MaterialImportMode.ImportDisplayColor; usdRoot = USD.UsdMenu.ImportSceneAsGameObject(scene, importOptions); scene.Close(); }
void Update() { m_usdFile = m_usdFile.Replace("\"", ""); if (!System.IO.Path.IsPathRooted(m_usdFile)) { m_usdFile = Application.dataPath + "/" + m_usdFile; } if (string.IsNullOrEmpty(m_usdFile)) { if (m_scene == null) { return; } m_scene.Close(); m_scene = null; UnloadGameObjects(); return; } // Is the stage already loaded? if (m_scene != null && m_scene.FilePath == m_usdFile && m_lastTime == m_usdTime) { return; } try { // Does the path exist? if (!System.IO.File.Exists(m_usdFile)) { throw new System.IO.FileNotFoundException(m_usdFile); } m_lastTime = m_usdTime; // Clear out the old scene. UnloadGameObjects(); // Import the new scene. m_scene = Scene.Open(m_usdFile); if (m_scene == null) { throw new Exception("Failed to import"); } // Set the time at which to read samples from USD. m_scene.Time = m_usdTime; // When converting right handed (USD) to left handed (Unity), there are two options: // // 1) Add an inversion at the root of the scene, leaving the points right-handed. // 2) Convert all transforms and points to left-handed (deep change of basis). // // Option (2) is more computationally expensive, but results in fewer down stream // surprises. var importOptions = new SceneImportOptions(); importOptions.changeHandedness = m_changeHandedness; importOptions.materialMap.DisplayColorMaterial = m_material; importOptions.enableGpuInstancing = m_enableGpuInstancing; // The root object at which the USD scene will be reconstructed. // It may need a Z-up to Y-up conversion and a right- to left-handed change of basis. var rootXf = new GameObject("root"); rootXf.transform.SetParent(this.transform, worldPositionStays: false); m_primMap = SceneImporter.BuildScene(m_scene, rootXf, importOptions, new PrimMap(), composingSubtree: false); // Ensure the file and the identifier match. m_usdFile = m_scene.FilePath; } catch { enabled = false; throw; } }
/// <summary> /// ScriptedImporter API. /// https://docs.unity3d.com/Manual/ScriptedImporters.html /// </summary> public override void OnImportAsset(AssetImportContext ctx) { var usdFilePath = File.ReadAllText(ctx.assetPath); var importOptions = new SceneImportOptions(); importOptions.materialImportMode = MaterialImportMode.ImportDisplayColor; importOptions.assetImportPath = Path.GetDirectoryName(ctx.assetPath); importOptions.changeHandedness = BasisTransformation.SlowAndSafe; importOptions.materialMap.SpecularWorkflowMaterial = new Material(Shader.Find("Standard (Specular setup)")); importOptions.materialMap.MetallicWorkflowMaterial = new Material(Shader.Find("Standard (Roughness setup)")); importOptions.materialMap.FallbackMasterMaterial = new Material(Shader.Find("USD/StandardVertexColor")); var time = 1.0f; var go = new GameObject(); UsdAssetImporter.ImportUsd(go, usdFilePath, time, importOptions); var usdImporter = go.AddComponent <UsdAssetImporter>(); usdImporter.m_usdFile = usdFilePath; usdImporter.m_usdTime = time; usdImporter.OptionsToState(importOptions); var meshes = new HashSet <Mesh>(); var materials = new HashSet <Material>(); ctx.AddObjectToAsset(go.GetInstanceID().ToString(), go); ctx.SetMainObject(go); int objIndex = 0; foreach (var mf in go.GetComponentsInChildren <MeshFilter>()) { if (meshes.Add(mf.sharedMesh)) { ctx.AddObjectToAsset(mf.name + "_mesh_" + objIndex++, mf.sharedMesh); } } foreach (var mf in go.GetComponentsInChildren <MeshRenderer>()) { foreach (var mat in mf.sharedMaterials) { if (!materials.Add(mat)) { continue; } ctx.AddObjectToAsset(mf.name + "_mat_" + objIndex++, mat); } } foreach (var mf in go.GetComponentsInChildren <SkinnedMeshRenderer>()) { if (meshes.Add(mf.sharedMesh)) { ctx.AddObjectToAsset(mf.name + "_mesh_" + objIndex++, mf.sharedMesh); } } foreach (var mf in go.GetComponentsInChildren <SkinnedMeshRenderer>()) { foreach (var mat in mf.sharedMaterials) { if (!materials.Add(mat)) { continue; } ctx.AddObjectToAsset(mf.name + "_mat_" + objIndex++, mat); } } }