public AutoColliderModel(MVRScript script, AutoCollider autoCollider, ColliderPreviewConfig config) : base(script, autoCollider, $"[au] {NameHelper.Simplify(autoCollider.name)}") { _initialCollisionEnabled = autoCollider.collisionEnabled; _initialColliderLength = autoCollider.colliderLength; _initialColliderRadius = autoCollider.colliderRadius; _initialHardColliderBuffer = autoCollider.hardColliderBuffer; _initialColliderLookOffset = autoCollider.colliderLookOffset; _initialColliderUpOffset = autoCollider.colliderUpOffset; _initialColliderRightOffset = autoCollider.colliderRightOffset; _initialAutoLengthBuffer = autoCollider.autoLengthBuffer; _initialAutoRadiusBuffer = autoCollider.autoRadiusBuffer; _initialAutoRadiusMultiplier = _lastAutoRadiusMultiplier = autoCollider.autoRadiusMultiplier; if (Component.hardCollider != null) { _ownedColliders.Add(ColliderModel.CreateTyped(script, autoCollider.hardCollider, config)); } if (Component.jointCollider != null) { _ownedColliders.Add(ColliderModel.CreateTyped(script, Component.jointCollider, config)); } }
public static EditablesList Build(MVRScript script, ColliderPreviewConfig config) { var containingAtom = script.containingAtom; var groups = containingAtom.type == "Person" ? new List <Group> { new Group("Head / Ears", @"^((AutoCollider(Female)?)?AutoColliders)?(s?[Hh]ead|lowerJaw|[Tt]ongue|neck|s?Face|_?Collider(Lip|Ear|Nose))"), new Group("Left arm", @"^l(Shldr|ForeArm)"), new Group("Left hand", @"^l(Index|Mid|Ring|Pinky|Thumb|Carpal|Hand)[0-9]?$"), new Group("Right arm", @"^r(Shldr|ForeArm)"), new Group("Right hand", @"^r(Index|Mid|Ring|Pinky|Thumb|Carpal|Hand)[0-9]?$"), new Group("Chest", @"^(chest|(AutoCollider)?FemaleAutoColliderschest|MaleAutoColliderschest)"), new Group("Left breast", @"l((Pectoral)|Nipple)"), new Group("Right breast", @"r((Pectoral)|Nipple)"), new Group("Abdomen / Belly / Back", @"^((AutoCollider)?FemaleAutoColliders)?abdomen"), new Group("Hip / Pelvis", @"^((Female)?AutoColliders?|MaleAutoColliders)?(hip|pelvis)"), new Group("Glute", @"^((AutoCollider)?FemaleAutoColliders)?[LR]Glute"), new Group("Anus", @"^_JointA[rl]"), new Group("V****a", @"^_Joint(Gr|Gl|B)"), new Group("Penis", @"^((AutoCollider)?Gen[1-3])|Testes"), new Group("Left leg", @"^((AutoCollider)?(FemaleAutoColliders)?)?l(Thigh|Shin)"), new Group("Left foot", @"^l(Foot|Toe|BigToe|SmallToe)"), new Group("Right leg", @"^((AutoCollider)?(FemaleAutoColliders)?)?r(Thigh|Shin)"), new Group("Right foot", @"^r(Foot|Toe|BigToe|SmallToe)"), new Group("Other", @"^.+$") } : new List <Group> { new Group("All", @"^.+$"), }; // AutoColliders var autoColliderDuplicates = new HashSet <string>(); var autoColliders = containingAtom.GetComponentsInChildren <AutoCollider>() .Select(autoCollider => new AutoColliderModel(script, autoCollider, config)) .Where(model => { if (!autoColliderDuplicates.Add(model.Id)) { model.IsDuplicate = true; return(false); } else { return(true); } }) .ForEach(model => model.Group = groups.FirstOrDefault(g => g.Test(model.AutoCollider.name))) .ToList(); var autoCollidersRigidBodies = new HashSet <Rigidbody>(autoColliders.SelectMany(x => x.GetRigidbodies())); var autoCollidersColliders = new HashSet <Collider>(autoColliders.SelectMany(x => x.GetColliders()).Select(x => x.Collider)); var autoCollidersMap = autoColliders.ToDictionary(x => x.AutoCollider); MatchMirror <AutoColliderModel, AutoCollider>(autoColliders); // AutoColliderGroups var autoColliderGroupDuplicates = new HashSet <string>(); var autoColliderGroups = containingAtom.GetComponentsInChildren <AutoColliderGroup>() .Select(autoColliderGroup => { var childAutoColliders = autoColliderGroup.GetAutoColliders().Where(acg => autoCollidersMap.ContainsKey(acg)).Select(acg => autoCollidersMap[acg]).ToList(); var model = new AutoColliderGroupModel(script, autoColliderGroup, childAutoColliders); childAutoColliders.ForEach(ac => ac.AutoColliderGroup = model); return(model); }) .Where(model => { if (!autoColliderGroupDuplicates.Add(model.Id)) { model.IsDuplicate = true; return(false); } else { return(true); } }) .ForEach(model => model.Group = groups.FirstOrDefault(g => g.Test(model.AutoColliderGroup.name))) .ToList(); MatchMirror <AutoColliderGroupModel, AutoColliderGroup>(autoColliderGroups); // Rigidbodies var rigidbodyDuplicates = new HashSet <string>(); var controllerRigidbodies = new HashSet <Rigidbody>(containingAtom.freeControllers.SelectMany(fc => fc.GetComponents <Rigidbody>())); var rigidbodies = containingAtom.GetComponentsInChildren <Rigidbody>(true) .Where(rigidbody => !autoCollidersRigidBodies.Contains(rigidbody)) .Where(rigidbody => !controllerRigidbodies.Contains(rigidbody)) .Where(rigidbody => IsRigidbodyIncluded(rigidbody)) .Select(rigidbody => new RigidbodyModel(script, rigidbody)) .Where(model => { if (!rigidbodyDuplicates.Add(model.Id)) { model.IsDuplicate = true; return(false); } else { return(true); } }) .ForEach(model => model.Group = groups.FirstOrDefault(g => g.Test(model.Rigidbody.name))) .ToList(); var rigidbodiesDict = rigidbodies.ToDictionary(x => x.Id); MatchMirror <RigidbodyModel, Rigidbody>(rigidbodies); // Colliders var colliderDuplicates = new HashSet <string>(); var colliders = containingAtom.GetComponentsInChildren <Collider>(true) .Where(collider => collider.gameObject.activeInHierarchy) .Where(collider => !autoCollidersColliders.Contains(collider)) .Where(collider => collider.attachedRigidbody == null || IsRigidbodyIncluded(collider.attachedRigidbody)) .Where(collider => IsColliderIncluded(collider)) .Select(collider => ColliderModel.CreateTyped(script, collider, config)) .Where(model => { if (!colliderDuplicates.Add(model.Id)) { model.IsDuplicate = true; return(false); } else { return(true); } }) .ToList(); MatchMirror <ColliderModel, Collider>(colliders); // Attach colliders to rigidbodies foreach (var colliderModel in colliders) { if (colliderModel.Collider.attachedRigidbody != null) { RigidbodyModel rigidbodyModel; if (rigidbodiesDict.TryGetValue(colliderModel.Collider.attachedRigidbody.Uuid(), out rigidbodyModel)) { colliderModel.RigidbodyModel = rigidbodyModel; rigidbodyModel.Colliders.Add(colliderModel); colliderModel.Group = rigidbodyModel.Group; } else { SuperController.LogError($"Could not find a matching rigidbody for collider '{colliderModel.Id}', rigidbody '{colliderModel.Collider.attachedRigidbody.Uuid()}'."); colliderModel.Group = groups.FirstOrDefault(g => g.Test(colliderModel.Collider.name)); } } else { colliderModel.Group = groups.FirstOrDefault(g => g.Test(colliderModel.Collider.name)); } } rigidbodies.RemoveAll(model => model.Colliders.Count == 0); // All Editables var all = colliders.Cast <IModel>() .Concat(autoColliderGroups.Cast <IModel>()) .Concat(autoColliders.Cast <IModel>()) .Concat(rigidbodies.Cast <IModel>()) .ToList(); return(new EditablesList(groups, all)); }