コード例 #1
0
        private ShapeMaterial RestoreShapeMaterial(ShapeMaterial currentShapeMaterial, agx.Material material)
        {
            if (material == null)
            {
                return(null);
            }

            var materialNode = m_tree.GetNode(material.getUuid());
            // If another shape material has been assigned to the object it's
            // possible to detect that here, e.g.;
            //     materialNode.Asset != null &&
            //     currentShapeMaterial != null &&
            //     materialNode.Assset != currentShapeMaterial
            // For now we're taking the node's asset because the material UUID
            // references the object we're currently processing.
            var refMaterial = materialNode.Asset != null ?
                              materialNode.Asset as ShapeMaterial :
                              currentShapeMaterial;

            return(FileInfo.ObjectDb.GetOrCreateAsset(refMaterial,
                                                      FindName(material.getName(),
                                                               materialNode.Type.ToString()),
                                                      m =>
            {
                m.RestoreLocalDataFrom(material);
                materialNode.Asset = m;
            }));
        }
コード例 #2
0
ファイル: RigidBodyTool.cs プロジェクト: LLS-Itzhakp/AGXUnity
        private void AssignShapeMaterialToAllShapes(ShapeMaterial shapeMaterial)
        {
            Shape[] shapes = RigidBody.GetComponentsInChildren <Shape>();
            foreach (var shape in shapes)
            {
                shape.Material = shapeMaterial;
            }

            RigidBody.UpdateMassProperties();
        }
コード例 #3
0
 public override void addMaterial(string name, ShapeMaterial materialDesc)
 {
     throw new NotImplementedException();
 }
コード例 #4
0
        private void Generate(Node node)
        {
            if (node == null)
            {
                return;
            }

            switch (node.Type)
            {
            case Node.NodeType.Assembly:
                agx.Frame frame = m_tree.GetAssembly(node.Uuid);
                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName("", node.Type.ToString());

                node.GameObject.transform.position = frame.getTranslate().ToHandedVector3();
                node.GameObject.transform.rotation = frame.getRotate().ToHandedQuaternion();

                node.GameObject.GetOrCreateComponent <Assembly>();

                break;

            case Node.NodeType.RigidBody:
                agx.RigidBody nativeRb = m_tree.GetRigidBody(node.Uuid);
                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeRb.getName(), node.Type.ToString());


                node.GameObject.transform.position = nativeRb.getPosition().ToHandedVector3();
                node.GameObject.transform.rotation = nativeRb.getRotation().ToHandedQuaternion();

                node.GameObject.GetOrCreateComponent <RigidBody>().RestoreLocalDataFrom(nativeRb);

                break;

            case Node.NodeType.Geometry:
                // Ignoring geometries - handling Shape == Geometry.
                // The shapes are children to this node.
                break;

            case Node.NodeType.Shape:
                var nativeGeometry  = m_tree.GetGeometry(node.Parent.Uuid);
                var nativeShape     = m_tree.GetShape(node.Uuid);
                var nativeShapeType = (agxCollide.Shape.Type)nativeShape.getType();

                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeGeometry.getName() +
                                                "_" +
                                                nativeShapeType.ToString().ToLower().FirstCharToUpperCase(),
                                                node.Type.ToString());

                node.GameObject.transform.position = nativeShape.getTransform().getTranslate().ToHandedVector3();
                node.GameObject.transform.rotation = nativeShape.getTransform().getRotate().ToHandedQuaternion();

                if (!CreateShape(node))
                {
                    GameObject.DestroyImmediate(node.GameObject);
                }

                break;

            case Node.NodeType.Material:
                // Ignoring materials - the referenced materials should have been restored
                // by now using RestoreShapeMaterial.
                break;

            case Node.NodeType.ContactMaterial:
                var           materialNodes = node.GetReferences(Node.NodeType.Material);
                Func <string> contactMaterialMaterialNames = () =>
                {
                    return(m_tree.GetMaterial(materialNodes[0].Uuid).getName() + " <-> " +
                           m_tree.GetMaterial(materialNodes[1].Uuid).getName());
                };
                if (materialNodes.Length == 0)
                {
                    Debug.LogWarning("No materials referenced to ContactMaterial node - ignoring contact material.");
                    break;
                }
                else if (materialNodes.Length > 2)
                {
                    Debug.LogWarning("More than two materials referenced to contact material - first two will be used: " +
                                     contactMaterialMaterialNames());
                }

                var materials = new ShapeMaterial[2]
                {
                    materialNodes[0].Asset as ShapeMaterial,
                    materialNodes.Length > 1 ?
                    materialNodes[1].Asset as ShapeMaterial :
                    materialNodes[0].Asset as ShapeMaterial
                };

                var nativeContactMaterial = m_tree.GetContactMaterial(node.Uuid);
                var nativeFrictionModel   = nativeContactMaterial.getFrictionModel();
                if (materials[0] == null || materials[1] == null)
                {
                    Debug.LogWarning($"Unreferenced ShapeMaterial(s) in ContactMaterial: {contactMaterialMaterialNames()} - ignoring contact material.");
                    break;
                }
                Predicate <ContactMaterial> materialsMatcher = cm => (cm.Material1 == materials[0] && cm.Material2 == materials[1]) ||
                                                               (cm.Material2 == materials[0] && cm.Material1 == materials[1]);
                var contactMaterial = FileInfo.ObjectDb.GetOrCreateAsset(materialsMatcher,
                                                                         FindName($"ContactMaterial_{materials[ 0 ].name}_{materials[ 1 ].name}",
                                                                                  node.Type.ToString()),
                                                                         cm =>
                {
                    cm.Material1 = materials[0];
                    cm.Material2 = materials[1];
                    cm.RestoreLocalDataFrom(nativeContactMaterial);
                });
                if (nativeFrictionModel != null)
                {
                    contactMaterial.FrictionModel = FileInfo.ObjectDb.GetOrCreateAsset(contactMaterial.FrictionModel,
                                                                                       $"FrictionModel_{contactMaterial.name}",
                                                                                       fm => fm.RestoreLocalDataFrom(nativeFrictionModel));
                }

                node.Asset = contactMaterial;

                break;

            case Node.NodeType.Constraint:
                var nativeConstraint = m_tree.GetConstraint(node.Uuid);

                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeConstraint.getName(),
                                                "AGXUnity." + Constraint.FindType(nativeConstraint));

                if (!CreateConstraint(node))
                {
                    GameObject.DestroyImmediate(node.GameObject);
                }

                break;

            case Node.NodeType.Wire:
                var nativeWire = m_tree.GetWire(node.Uuid);

                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeWire.getName(), "AGXUnity.Wire");

                if (!CreateWire(node))
                {
                    GameObject.DestroyImmediate(node.GameObject);
                }

                break;

            case Node.NodeType.Cable:
                var nativeCable = m_tree.GetCable(node.Uuid);

                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeCable.getName(), "AGXUnity.Cable");

                if (!CreateCable(node))
                {
                    GameObject.DestroyImmediate(node.GameObject);
                }

                break;

            case Node.NodeType.ObserverFrame:
                var nativeObserverFrame = m_tree.GetObserverFrame(node.Uuid);

                node.GameObject      = GetOrCreateGameObject(node);
                node.GameObject.name = FindName(nativeObserverFrame.getName(), "AGXUnity.ObserverFrame");

                var rbNode = node.GetReferences(Node.NodeType.RigidBody).FirstOrDefault();
                node.GameObject.GetOrCreateComponent <ObserverFrame>().RestoreLocalDataFrom(nativeObserverFrame,
                                                                                            rbNode != null ? rbNode.GameObject : null);

                break;
            }

            foreach (var child in node.Children)
            {
                Generate(child);
            }
        }
コード例 #5
0
 /// <summary>
 /// Add a material to the repository.
 /// </summary>
 /// <param name="name">The name of the material.</param>
 /// <param name="material">The material itself.</param>
 public abstract void addMaterial(String name, ShapeMaterial materialDesc);