/// <summary> /// Construct given AGX file info. /// </summary> /// <param name="info">AGX file info.</param> public InputAGXFile(AGXFileInfo info) { if (info == null) { throw new ArgumentNullException("info", "File info object is null."); } else { FileInfo = info; } if (!FileInfo.Exists) { throw new FileNotFoundException("File not found: " + FileInfo.FullName); } if (FileInfo.Type == AGXFileInfo.FileType.Unknown || FileInfo.Type == AGXFileInfo.FileType.AGXPrefab) { throw new AGXUnity.Exception("Unsupported file format: " + FileInfo.FullName); } Successful = false; // Making sure AGX has been initialized before we create a simulation. var nativeHandler = NativeHandler.Instance; Simulation = new agxSDK.Simulation(); }
/// <summary> /// Find asset path (in the data directory) given asset name. /// If asset.name contains '\\', it will be replaced with '_' /// </summary> /// <param name="asset">Asset.</param> /// <returns>Path (relative) including .asset extension.</returns> private string GetAssetPath(Object asset) { // We cannot have \\ in the name asset.name = asset.name.Replace("\\", "_"); return(m_dataDirectory + "/" + (asset != null ? asset.name : "null") + AGXFileInfo.FindAssetExtension(asset.GetType())); }
public ObjectDb(AGXFileInfo fileInfo) { m_dataDirectory = fileInfo.DataDirectory; m_filename = fileInfo.Name; if (fileInfo.PrefabInstance != null) { var uuidGameObjects = fileInfo.PrefabInstance.GetComponentsInChildren <Uuid>(true); foreach (var uuidComponent in uuidGameObjects) { if (!m_gameObjects.ContainsKey(uuidComponent.Native)) { m_gameObjects.Add(uuidComponent.Native, new DbData() { GameObject = uuidComponent.gameObject }); } } } foreach (var fileAssetType in RestoredAssetsRoot.Types) { Initialize(fileAssetType); } }
private static void OnAGXPrefabAdddedToScene(GameObject instance, IO.AGXFileInfo fileInfo) { if (fileInfo.ExistingPrefab == null) { Debug.LogWarning("Unable to load parent prefab from file: " + fileInfo.NameWithExtension); return; } Undo.SetCurrentGroupName("Adding: " + instance.name + " to scene."); var grouId = Undo.GetCurrentGroup(); foreach (var cm in fileInfo.GetAssets <ContactMaterial>()) { TopMenu.GetOrCreateUniqueGameObject <ContactMaterialManager>().Add(cm); } var fileData = fileInfo.ExistingPrefab.GetComponent <AGXUnity.IO.RestoredAGXFile>(); foreach (var disabledPair in fileData.DisabledGroups) { TopMenu.GetOrCreateUniqueGameObject <CollisionGroupsManager>().SetEnablePair(disabledPair.First, disabledPair.Second, false); } var renderDatas = instance.GetComponentsInChildren <AGXUnity.Rendering.ShapeVisual>(); foreach (var renderData in renderDatas) { renderData.hideFlags |= HideFlags.NotEditable; renderData.transform.hideFlags |= HideFlags.NotEditable; } // TODO: Handle fileData.SolverSettings? Undo.CollapseUndoOperations(grouId); }
public static Object ReadAGXFile(IO.AGXFileInfo info) { if (info == null || !info.IsValid) { return(null); } try { Object prefab = null; using (var inputFile = new IO.InputAGXFile(info)) { inputFile.TryLoad(); inputFile.TryParse(); inputFile.TryGenerate(); prefab = inputFile.TryCreatePrefab(); } // Updating scene instances with e.g., shape visual size etc. if (prefab != null) { var restoredFileInstances = Object.FindObjectsOfType <AGXUnity.IO.RestoredAGXFile>(); foreach (var restoredFileInstance in restoredFileInstances) { #if UNITY_2018_3_OR_NEWER var isReadPrefabInstance = PrefabUtility.GetPrefabInstanceStatus(restoredFileInstance.gameObject) == PrefabInstanceStatus.Connected && PrefabUtility.GetCorrespondingObjectFromSource(restoredFileInstance.gameObject) == prefab; #else var isReadPrefabInstance = PrefabUtility.GetPrefabType(restoredFileInstance.gameObject) == PrefabType.PrefabInstance && PrefabUtility.GetCorrespondingObjectFromSource(restoredFileInstance.gameObject) == prefab; #endif if (!isReadPrefabInstance) { continue; } var shapes = restoredFileInstance.GetComponentsInChildren <AGXUnity.Collide.Shape>(); foreach (var shape in shapes) { var visual = AGXUnity.Rendering.ShapeVisual.Find(shape); if (visual != null) { visual.OnSizeUpdated(); } } } } return(prefab); } catch (System.Exception e) { Debug.LogException(e); } return(null); }
public static void GenerateAGXFileAsPrefab() { foreach (var obj in Selection.objects) { var info = new IO.AGXFileInfo(AssetDatabase.GetAssetPath(obj)); if (info.Type != IO.AGXFileInfo.FileType.AGXBinary && info.Type != IO.AGXFileInfo.FileType.AGXAscii) { continue; } AssetPostprocessorHandler.ReadAGXFile(info); } }
/// <summary> /// Callback when a prefab (likely) has been drag-dropped into a scene. /// </summary> /// <param name="instance">Prefab instance.</param> public static void OnPrefabAddedToScene(GameObject instance) { if (AutoUpdateSceneHandler.VerifyPrefabInstance(instance)) { AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } OnSavedPrefabAddedToScene(instance, instance.GetComponent <AGXUnity.IO.SavedPrefabLocalData>()); var fileInfo = new IO.AGXFileInfo(instance); if (fileInfo.IsValid && fileInfo.Type == IO.AGXFileInfo.FileType.AGXPrefab) { OnAGXPrefabAdddedToScene(instance, fileInfo); } }
public UuidObjectDb(AGXFileInfo fileInfo) { if (fileInfo.PrefabInstance == null) { return; } var uuidGameObjects = fileInfo.PrefabInstance.GetComponentsInChildren <AGXUnity.IO.Uuid>(); foreach (var uuidComponent in uuidGameObjects) { if (!m_gameObjects.ContainsKey(uuidComponent.Native)) { m_gameObjects.Add(uuidComponent.Native, uuidComponent.gameObject); } } }
public static void OnPrefabAddedToScene(GameObject instance) { var fileInfo = new IO.AGXFileInfo(instance); if (!fileInfo.IsValid || fileInfo.Type != IO.AGXFileInfo.FileType.AGXPrefab) { return; } if (fileInfo.ExistingPrefab == null) { Debug.LogWarning("Unable to load parent prefab from file: " + fileInfo.NameWithExtension); return; } Undo.SetCurrentGroupName("Adding: " + instance.name + " to scene."); var grouId = Undo.GetCurrentGroup(); foreach (var cm in fileInfo.GetAssets <ContactMaterial>()) { TopMenu.GetOrCreateUniqueGameObject <ContactMaterialManager>().Add(cm); } var fileData = fileInfo.ExistingPrefab.GetComponent <AGXUnity.IO.RestoredAGXFile>(); AddDisabledPairsToManager(fileData.DisabledGroups); var renderDatas = instance.GetComponentsInChildren <AGXUnity.Rendering.ShapeVisual>(); foreach (var renderData in renderDatas) { renderData.hideFlags |= HideFlags.NotEditable; renderData.transform.hideFlags |= HideFlags.NotEditable; } Undo.CollapseUndoOperations(grouId); }
public static UnityEngine.Object ReadAGXFile(IO.AGXFileInfo info) { if (info == null || !info.IsValid) { return(null); } try { UnityEngine.Object prefab = null; using (var inputFile = new IO.InputAGXFile(info)) { inputFile.TryLoad(); inputFile.TryParse(); inputFile.TryGenerate(); prefab = inputFile.TryCreatePrefab(); } return(prefab); } catch (System.Exception e) { Debug.LogException(e); } return(null); }
public void Parse(agxSDK.Simulation simulation, AGXFileInfo fileInfo) { if (simulation == null) { throw new ArgumentNullException("simulation", "agxSDK.Simulation instance is null."); } if (m_roots.Count > 0) { throw new AGXUnity.Exception("Calling InputAGXFileTree::Parse multiple times is not supported."); } // RigidBody nodes. foreach (var nativeRb in simulation.getRigidBodies()) { if (!IsValid(nativeRb.get())) { continue; } // TODO: Recursive assembly creation. var assemblyNode = TryGetOrCreateAssembly(nativeRb.getFrame()); var rbNode = GetOrCreateRigidBody(nativeRb.get(), assemblyNode == null); if (assemblyNode != null) { assemblyNode.AddChild(rbNode); } foreach (var nativeGeometry in nativeRb.getGeometries()) { Parse(nativeGeometry.get(), rbNode); } } // Free Geometry nodes. foreach (var nativeGeometry in simulation.getGeometries()) { if (!IsValid(nativeGeometry.get())) { continue; } // We already have a node for this from reading bodies. if (nativeGeometry.getRigidBody() != null) { if (!m_nodeCache.ContainsKey(nativeGeometry.getUuid())) { Debug.LogWarning("Geometry with rigid body ignored but isn't in present in the tree. Name: " + nativeGeometry.getName()); } continue; } // TODO: Recursive assembly creation. Parse(nativeGeometry.get(), TryGetOrCreateAssembly(nativeGeometry.getFrame())); } // Constraint nodes. foreach (var nativeConstraint in simulation.getConstraints()) { if (!IsValid(nativeConstraint.get())) { continue; } var nativeRb1 = nativeConstraint.getBodyAt(0); var nativeRb2 = nativeConstraint.getBodyAt(1); if (!IsValid(nativeRb1)) { continue; } if (nativeRb2 != null && !IsValid(nativeRb2)) { continue; } var rb1Node = nativeRb1 != null?GetNode(nativeRb1.getUuid()) : null; var rb2Node = nativeRb2 != null?GetNode(nativeRb2.getUuid()) : null; // Could be ignored bodies due to Wire and Cable. if (rb1Node == null && rb2Node == null) { continue; } var constraintNode = GetOrCreateConstraint(nativeConstraint.get()); if (rb1Node != null) { constraintNode.AddReference(rb1Node); } if (rb2Node != null) { constraintNode.AddReference(rb2Node); } } var wires = agxWire.Wire.findAll(simulation); foreach (var wire in wires) { // TODO: Handle wires in assemblies? var wireNode = GetOrCreateWire(wire); if (wire.getMaterial() != null) { var materialNode = GetOrCreateMaterial(wire.getMaterial()); wireNode.AddReference(materialNode); } } var cables = agxCable.Cable.getAll(simulation); foreach (var cable in cables) { var cableNode = GetOrCreateCable(cable); if (cable.getMaterial() != null) { var materialNode = GetOrCreateMaterial(cable.getMaterial()); cableNode.AddReference(materialNode); } var groupsCollection = cable.findGroupIdCollection(); foreach (var name in groupsCollection.getNames()) { cableNode.AddReference(new Node() { Type = NodeType.GroupId, Object = name }); } foreach (var id in groupsCollection.getIds()) { cableNode.AddReference(new Node() { Type = NodeType.GroupId, Object = id.ToString() }); } var it = cable.getSegments().begin(); while (!it.EqualWith(cable.getSegments().end())) { var constraint = it.getConstraint(); if (constraint != null && GetConstraint(constraint.getUuid()) != null) { Debug.LogWarning("Cable constraint has a constraint node in the simulation tree."); } foreach (var attachment in it.getAttachments()) { if (attachment.getConstraint() != null && GetConstraint(attachment.getConstraint().getUuid()) != null) { Debug.LogWarning("Cable attachment has a constraint node in the simulation tree."); } } it.inc(); } } var mm = simulation.getMaterialManager(); foreach (var m1 in m_materials.Values) { foreach (var m2 in m_materials.Values) { var cm = mm.getContactMaterial(m1, m2); if (cm == null) { continue; } var cmNode = GetOrCreateContactMaterial(cm); cmNode.AddReference(GetNode(m1.getUuid())); cmNode.AddReference(GetNode(m2.getUuid())); } } foreach (var observerFrame in simulation.getObserverFrames()) { if (observerFrame.getRigidBody() == null) { continue; } var rbNode = GetNode(observerFrame.getRigidBody().getUuid()); if (rbNode == null) { continue; } var observerFrameNode = GetOrCreateObserverFrame(observerFrame.get()); observerFrameNode.AddReference(rbNode); } // Generating wires, cables and constraints last when all bodies has been generated. m_roots.Add(m_wireRoot); m_roots.Add(m_cableRoot); m_roots.Add(m_constraintRoot); m_roots.Add(m_observerFrameRoot); // Generating assets last since we have to know the references. // Materials aren't parsed, they are generated on the fly when // objects references them. m_roots.Add(m_materialRoot); m_roots.Add(m_contactMaterialRoot); }
public static GameObject Import(string file) { GameObject prefab = null; bool renameRoots = false; var dataDirectory = string.Empty; try { int iteration = 0; while (++iteration < 4) { var fileInfo = new AGXFileInfo(file); using (var inputFile = new InputAGXFile(fileInfo)) { inputFile.TryLoad(); inputFile.TryParse(); var statistics = inputFile.TryGenerate(); renameRoots = renameRoots || (iteration == 1 && statistics.RootsAddedToExistingAssets); prefab = inputFile.TryCreatePrefab(); dataDirectory = fileInfo.DataDirectory; if (!statistics.HasAddedOrRemoved) { break; } } } } catch (System.Exception e) { Debug.LogException(e); return(null); } PropagateChanges(prefab); if (prefab != null && renameRoots && !string.IsNullOrEmpty(dataDirectory)) { Debug.Log($"{prefab.name.Color( Color.green )}: Updating main assets and names in " + dataDirectory.Color(Color.gray) + "."); var roots = Utils.FindAssetsOfType <AGXUnity.IO.RestoredAssetsRoot>(dataDirectory); foreach (var root in roots) { var assets = ObjectDb.GetAssets(dataDirectory, root.Type); var mainAsset = System.Array.Find(assets, asset => AssetDatabase.IsMainAsset(asset)); if (mainAsset == null) { continue; } else if (!(mainAsset is AGXUnity.IO.RestoredAssetsRoot)) { AssetDatabase.SetMainObject(root, AssetDatabase.GetAssetPath(mainAsset)); mainAsset = root; } AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(root), AGXUnity.IO.RestoredAssetsRoot.FindName(prefab.name, root.Type)); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } return(prefab); }