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(); } }
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; }
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); }
public AlembicStream(GameObject rootGo, AlembicStreamDescriptor streamDesc) { m_config.SetDefaults(); m_abcTreeRoot = new AlembicTreeNode() { stream = this, gameObject = rootGo }; m_streamDesc = streamDesc; }
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; }
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 } }