Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
 /// <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()));
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 8
0
        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);
                }
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }