private void FinalizeImport(AlembicStream stream, GameObject newGo, AlembicStreamDescriptor streamDescr)
        {
            if (m_GeneratePrefab)
            {
                var prefabPath = "Assets/" + newGo.name + ".prefab";

                var prefab = PrefabUtility.CreatePrefab(prefabPath, newGo);
                AssetDatabase.SaveAssets();

                if (m_ImportMode > AlembicImportMode.NoSupportForStreaming)
                {
                    AssetDatabase.AddObjectToAsset(streamDescr, prefabPath);
                    AssetDatabase.SaveAssets();

                    if (m_ImportMode == AlembicImportMode.AutomaticStreamingSetup)
                    {
                        var streamDescrAsset =
                            AssetDatabase.LoadAssetAtPath(prefabPath, typeof(AlembicStreamDescriptor)) as AlembicStreamDescriptor;
                        var player = prefab.GetComponent <AlembicStreamPlayer>();
                        player.m_StreamDescriptor = streamDescrAsset;
                    }
                }
                AssetDatabase.SaveAssets();

                SetDefaultMaterial(prefab, prefab.transform);

                AssetDatabase.SaveAssets();
            }
        }
示例#2
0
        private void GenerateSubAssets(AssetImportContext ctx, AlembicTreeNode root, AlembicStreamDescriptor streamDescr)
        {
            var material = new Material(Shader.Find("Standard"));

            AddObjectToAsset(ctx, "Default Material", material);

            if (streamDescr.Duration > 0)
            {
                Keyframe[] frames = new Keyframe[2];
                frames[0].value       = 0.0f;
                frames[0].time        = 0.0f;
                frames[0].tangentMode = (int)AnimationUtility.TangentMode.Linear;
                frames[0].outTangent  = 1.0f;
                frames[1].value       = streamDescr.Duration;
                frames[1].time        = streamDescr.Duration;
                frames[1].tangentMode = (int)AnimationUtility.TangentMode.Linear;
                frames[1].inTangent   = 1.0f;
                AnimationCurve curve         = new AnimationCurve(frames);
                var            animationClip = new AnimationClip();
                animationClip.SetCurve("", typeof(AlembicStreamPlayer), "currentTime", curve);
                animationClip.name = root.linkedGameObj.name + "_Clip";

                AddObjectToAsset(ctx, "Default Animation", animationClip);
            }
            varyingTopologyMeshNames = new List <string>();
            splittingMeshNames       = new List <string>();

            CollectSubAssets(ctx, root, material);

            streamDescr.hasVaryingTopology = varyingTopologyMeshNames.Count > 0;
        }
示例#3
0
        private void GenerateSubAssets(Subassets subassets, AlembicTreeNode root, AlembicStreamDescriptor streamDescr)
        {
            if (streamDescr.duration > 0)
            {
                var frames = new Keyframe[2];
                frames[0].value      = 0.0f;
                frames[0].time       = 0.0f;
                frames[0].outTangent = 1.0f;
                frames[1].value      = (float)streamDescr.duration;
                frames[1].time       = (float)streamDescr.duration;
                frames[1].inTangent  = 1.0f;

                var curve = new AnimationCurve(frames);
                AnimationUtility.SetKeyLeftTangentMode(curve, 0, AnimationUtility.TangentMode.Linear);
                AnimationUtility.SetKeyRightTangentMode(curve, 1, AnimationUtility.TangentMode.Linear);

                var animationClip = new AnimationClip();
                animationClip.SetCurve("", typeof(AlembicStreamPlayer), "currentTime", curve);
                animationClip.name      = root.gameObject.name + "_Clip";
                animationClip.hideFlags = HideFlags.NotEditable;

                subassets.Add("Default Animation", animationClip);
            }
            varyingTopologyMeshNames = new List <string>();
            splittingMeshNames       = new List <string>();

            CollectSubAssets(subassets, root);

            streamDescr.hasVaryingTopology = varyingTopologyMeshNames.Count > 0;
        }
        internal static GameObject Import(AlembicImportMode importMode, AlembicImportSettings importSettings, AlembicDiagnosticSettings diagSettings, Action <AlembicStream, GameObject, AlembicStreamDescriptor> customAction)
        {
            var fileName = System.IO.Path.GetFileNameWithoutExtension(importSettings.m_pathToAbc);
            var go       = new GameObject(fileName);

            using (var abcStream = new AlembicStream(go, importSettings, new AlembicPlaybackSettings(), diagSettings))
            {
                abcStream.AbcLoad(true);

                AlembicStreamDescriptor streamDescr = null;
                if (importMode > AlembicImportMode.NoSupportForStreaming)
                {
                    streamDescr                  = ScriptableObject.CreateInstance <AlembicStreamDescriptor>();
                    streamDescr.name             = "AlembicStream: " + go.name;
                    streamDescr.m_ImportSettings = importSettings;
                    streamDescr.m_importMode     = importMode;
                }

                if (importMode == AlembicImportMode.AutomaticStreamingSetup)
                {
                    var dynStream = go.AddComponent <AlembicStreamPlayer>();
                    dynStream.m_PlaybackSettings = new AlembicPlaybackSettings()
                    {
                        m_startTime = abcStream.AbcStartTime,
                        m_endTime   = abcStream.AbcEndTime
                    };
                    dynStream.m_StreamDescriptor = streamDescr;
                    dynStream.enabled            = true;
                }

                customAction.Invoke(abcStream, go, streamDescr);
            }

            return(go);
        }
示例#5
0
 public AlembicStream(GameObject rootGo, AlembicStreamDescriptor streamDesc)
 {
     m_config.SetDefaults();
     m_abcTreeRoot = new AlembicTreeNode()
     {
         stream = this, gameObject = rootGo
     };
     m_streamDesc = streamDesc;
 }
示例#6
0
 public AlembicStream(GameObject rootGo, AlembicStreamDescriptor streamDesc)
 {
     m_Config.SetDefaults();
     alembicTreeRoot = new AlembicTreeNode()
     {
         streamDescriptor = streamDesc, linkedGameObj = rootGo
     };
     m_StreamDesc = streamDesc;
 }
        void GenerateSubAssets(Subassets subassets, AlembicTreeNode root, AlembicStreamDescriptor streamDescr)
        {
            if (streamDescr.duration > 0)
            {
                // AnimationClip for time
                {
                    var frames = new Keyframe[2];
                    frames[0].value      = 0.0f;
                    frames[0].time       = 0.0f;
                    frames[0].outTangent = 1.0f;
                    frames[1].value      = (float)streamDescr.duration;
                    frames[1].time       = (float)streamDescr.duration;
                    frames[1].inTangent  = 1.0f;

                    var curve = new AnimationCurve(frames);
                    AnimationUtility.SetKeyLeftTangentMode(curve, 0, AnimationUtility.TangentMode.Linear);
                    AnimationUtility.SetKeyRightTangentMode(curve, 1, AnimationUtility.TangentMode.Linear);

                    var clip = new AnimationClip();
                    clip.SetCurve("", typeof(AlembicStreamPlayer), "currentTime", curve);
                    clip.name      = root.gameObject.name + "_Time";
                    clip.hideFlags = HideFlags.NotEditable;

                    subassets.Add("Default Animation", clip);
                }

                // AnimationClip for frame events
                {
                    var abc = root.stream.abcContext;
                    var n   = abc.timeSamplingCount;
                    for (int i = 1; i < n; ++i)
                    {
                        var clip = new AnimationClip();
                        if (AddFrameEvents(clip, abc.GetTimeSampling(i)))
                        {
                            var name = root.gameObject.name + "_Frames";
                            if (n > 2)
                            {
                                name += i.ToString();
                            }
                            clip.name = name;
                            subassets.Add(clip.name, clip);
                        }
                    }
                }
            }
            varyingTopologyMeshNames = new List <string>();
            splittingMeshNames       = new List <string>();

            CollectSubAssets(subassets, root);

            streamDescr.hasVaryingTopology = varyingTopologyMeshNames.Count > 0;
        }
示例#8
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            var shortAssetPath = ctx.assetPath.Replace("Assets", "");

            AlembicStream.DisconnectStreamsWithPath(shortAssetPath);
            var sourcePath    = Application.dataPath + shortAssetPath;
            var destPath      = Application.streamingAssetsPath + shortAssetPath;
            var directoryPath = Path.GetDirectoryName(destPath);

            if (!Directory.Exists(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }
            if (File.Exists(destPath))
            {
                File.SetAttributes(destPath, FileAttributes.Normal);
            }
            File.Copy(sourcePath, destPath, true);

            var fileName = Path.GetFileNameWithoutExtension(destPath);
            var go       = new GameObject(fileName);

            go.transform.localScale *= scaleFactor;

            AlembicStreamDescriptor streamDescriptor = ScriptableObject.CreateInstance <AlembicStreamDescriptor>();

            streamDescriptor.name      = go.name + "_ABCDesc";
            streamDescriptor.pathToAbc = shortAssetPath;
            streamDescriptor.settings  = streamSettings;

            using (var abcStream = new AlembicStream(go, streamDescriptor))
            {
                abcStream.AbcLoad();
                AbcStartTime  = abcStream.AbcStartTime;
                AbcEndTime    = abcStream.AbcEndTime;
                AbcFrameCount = abcStream.AbcFrameCount;

                startFrame = startFrame < 0 ? 0 : startFrame;
                endFrame   = endFrame > AbcFrameCount - 1 ? AbcFrameCount - 1 : endFrame;

                streamDescriptor.minFrame      = startFrame;
                streamDescriptor.maxFrame      = endFrame;
                streamDescriptor.abcFrameCount = AbcFrameCount;
                streamDescriptor.abcDuration   = AbcEndTime - AbcStartTime;
                streamDescriptor.abcStartTime  = AbcStartTime;

                var streamPlayer = go.AddComponent <AlembicStreamPlayer>();
                streamPlayer.streamDescriptor = streamDescriptor;
                streamPlayer.startFrame       = startFrame;
                streamPlayer.endFrame         = endFrame;

                AddObjectToAsset(ctx, streamDescriptor.name, streamDescriptor);
                GenerateSubAssets(ctx, abcStream.alembicTreeRoot, streamDescriptor);

                AlembicStream.ReconnectStreamsWithPath(shortAssetPath);

#if UNITY_2017_3_OR_NEWER
                ctx.AddObjectToAsset(go.name, go);
                ctx.SetMainObject(go);
#else
                ctx.SetMainAsset(go.name, go);
#endif
            }
        }