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; })); }
private void AssignShapeMaterialToAllShapes(ShapeMaterial shapeMaterial) { Shape[] shapes = RigidBody.GetComponentsInChildren <Shape>(); foreach (var shape in shapes) { shape.Material = shapeMaterial; } RigidBody.UpdateMassProperties(); }
public override void addMaterial(string name, ShapeMaterial materialDesc) { throw new NotImplementedException(); }
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); } }
/// <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);