Пример #1
0
        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();
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
    /// <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);
            }
        }
    }