Exemplo n.º 1
0
        // boneGroups = springBone.Springs.Select(x => x.ToGltf(nodes, springBone.Colliders)).ToList(),

        public static VrmProtobuf.SpringBone.Types.BoneGroup ToGltf(this SpringBone self, List <Node> nodes, List <SpringBoneColliderGroup> colliders)
        {
            var boneGroup = new VrmProtobuf.SpringBone.Types.BoneGroup
            {
                Name         = self.Comment,
                Center       = nodes.IndexOfNullable(self.Origin),
                DragForce    = self.DragForce,
                GravityPower = self.GravityPower,
                HitRadius    = self.HitRadius,
                Stiffness    = self.Stiffness,
            };

            boneGroup.GravityDir.Add(self.GravityDir.X);
            boneGroup.GravityDir.Add(self.GravityDir.Y);
            boneGroup.GravityDir.Add(self.GravityDir.Z);
            foreach (var x in self.Colliders)
            {
                boneGroup.ColliderGroups.Add(colliders.IndexOfThrow(x));
            }
            foreach (var x in self.Bones)
            {
                boneGroup.Bones.Add(nodes.IndexOfThrow(x));
            }
            return(boneGroup);
        }
Exemplo n.º 2
0
        public SpringBoneManager CreateVrmSpringBone(List <Node> nodes)
        {
            var gltfVrm = Gltf.Extensions.VRMCSpringBone;

            if ((gltfVrm is null))
            {
                return(null);
            }

            var springBone = new SpringBoneManager();

            // springs
            foreach (var group in gltfVrm.Springs.GroupBy(x => x.Setting.Value))
            {
                var sb = new SpringBone();
                sb.Comment   = group.First().Name;
                sb.HitRadius = group.First().HitRadius.Value;
                var setting = gltfVrm.Settings[group.Key];
                sb.DragForce    = setting.DragForce.Value;
                sb.GravityDir   = setting.GravityDir.ToVector3();
                sb.GravityPower = setting.GravityPower.Value;
                sb.Stiffness    = setting.Stiffness.Value;

                foreach (var spring in group)
                {
                    // root
                    sb.Bones.Add(nodes[spring.SpringRoot.Value]);
                    // collider
                    foreach (var colliderNode in spring.Colliders)
                    {
                        var collider = springBone.Colliders.FirstOrDefault(x => x.Node == nodes[colliderNode]);
                        if (collider == null)
                        {
                            collider = new SpringBoneColliderGroup(nodes[colliderNode], Gltf.Nodes[colliderNode].Extensions.VRMCNodeCollider.Shapes.Select(x =>
                            {
                                if (x.Sphere != null)
                                {
                                    return(VrmSpringBoneCollider.CreateSphere(x.Sphere.Offset.ToVector3(), x.Sphere.Radius.Value));
                                }
                                else if (x.Capsule != null)
                                {
                                    return(VrmSpringBoneCollider.CreateCapsule(x.Capsule.Offset.ToVector3(), x.Capsule.Radius.Value, x.Capsule.Tail.ToVector3()));
                                }
                                else
                                {
                                    throw new NotImplementedException();
                                }
                            }));
                            springBone.Colliders.Add(collider);
                        }
                        sb.Colliders.Add(collider);
                    }
                }

                springBone.Springs.Add(sb);
            }

            return(springBone);
        }
Exemplo n.º 3
0
    void DrawGizmoRecursive(SpringBone bone)
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(bone.transform.position, bone.radius);

        if (bone.childNode != null)
        {
            DrawGizmoRecursive(bone.childNode);
        }
    }
Exemplo n.º 4
0
        void ExportSpringBone()
        {
            Object[] objects = targetModel.GetComponentsInChildren <SpringBone>();

            //gizmo以外はエクスポート 
            //transformは名前をエクスポートする(インポート時にFindで探す)
            for (int j = 0; j < objects.Length; j++)
            {
                SpringBone springbone = (SpringBone)objects[j];

                SpringBoneSetting exportData
                    = ScriptableObject.CreateInstance <SpringBoneSetting>();

                exportData.m_AttachObject = m_Utility.GetHierarchyPath(springbone.gameObject.transform);

                exportData.m_comment        = springbone.m_comment;
                exportData.m_stiffnessForce = springbone.m_stiffnessForce;
                exportData.m_gravityPower   = springbone.m_gravityPower;
                exportData.m_gravityDir     = springbone.m_gravityDir;
                exportData.m_dragForce      = springbone.m_dragForce;
                if (springbone.m_center != null)
                {
                    exportData.m_center = m_Utility.GetHierarchyPath(springbone.m_center.transform);
                }
                exportData.RootBones = new string[springbone.RootBones.Count];
                for (int i = 0; i < springbone.RootBones.Count; i++)
                {
                    exportData.RootBones[i] = m_Utility.GetHierarchyPath(springbone.RootBones[i].transform);
                }
                exportData.m_hitRadius = springbone.m_hitRadius;

                exportData.ColliderGroups = new string[springbone.ColliderGroups.Length];
                for (int i = 0; i < springbone.ColliderGroups.Length; i++)
                {
                    exportData.ColliderGroups[i]
                        = m_Utility.GetHierarchyPath(springbone.ColliderGroups[i].transform);

                    if (ColliderTergetName.Count == 0)
                    {
                        ColliderTergetName.Add(exportData.ColliderGroups[i]);
                    }
                    else
                    {
                        if (ColliderTergetName.IndexOf(exportData.ColliderGroups[i]) == -1)
                        {
                            ColliderTergetName.Add(exportData.ColliderGroups[i]);
                        }
                        ;
                    }
                }

                AssetDatabase.CreateAsset(
                    exportData, "Assets/Models/Resources/SpringBoneData/SpringBone/SpringBoneData_" + j + ".asset");
            }
        }
Exemplo n.º 5
0
        public static SpringSetting ToGltf(this SpringBone self, List <Node> nodes)
        {
            var setting = new SpringSetting
            {
                DragForce    = self.DragForce,
                GravityPower = self.GravityPower,
                Stiffness    = self.Stiffness,
                GravityDir   = self.GravityDir.ToFloat3(),
            };

            return(setting);
        }
Exemplo n.º 6
0
        public static VrmProtobuf.SpringSetting ToGltf(this SpringBone self, List <Node> nodes)
        {
            var setting = new VrmProtobuf.SpringSetting
            {
                DragForce    = self.DragForce,
                GravityPower = self.GravityPower,
                Stiffness    = self.Stiffness,
            };

            setting.GravityDir.Add(self.GravityDir.X);
            setting.GravityDir.Add(self.GravityDir.Y);
            setting.GravityDir.Add(self.GravityDir.Z);

            return(setting);
        }
Exemplo n.º 7
0
        void ApplySpringBone()
        {
            //gizmo以外は設定を反映
            //transformはFind後したTransformを反映)
            for (int j = 0; j < boneObjects.Length; j++)
            {
                //設定データ
                SpringBoneSetting settingData = (SpringBoneSetting)boneObjects[j];

                //対象のボーン
                //m_Utility.ChangeRootPath 設定されたパスをターゲット対象に変更する
                GameObject targetObject
                    = GameObject.Find(m_Utility.ChangeRootPath(settingData.m_AttachObject, targetModel.name));

                SpringBone springbone = targetObject.AddComponent <SpringBone>();

                springbone.m_comment        = settingData.m_comment;
                springbone.m_stiffnessForce = settingData.m_stiffnessForce;
                springbone.m_gravityPower   = settingData.m_gravityPower;
                springbone.m_gravityDir     = settingData.m_gravityDir;
                springbone.m_dragForce      = settingData.m_dragForce;
                if (settingData.m_center != null)
                {
                    GameObject findObject = GameObject.Find(settingData.m_center);
                    if (findObject != null)
                    {
                        springbone.m_center = findObject.GetComponent <Transform>();
                    }
                }
                springbone.RootBones = new List <Transform>();
                for (int i = 0; i < settingData.RootBones.Length; i++)
                {
                    GameObject findObject
                        = GameObject.Find(m_Utility.ChangeRootPath(settingData.RootBones[i], targetModel.name));

                    springbone.RootBones.Add(findObject.GetComponent <Transform>());
                }
                springbone.m_hitRadius    = settingData.m_hitRadius;
                springbone.ColliderGroups = new SpringBoneColliderGroup[settingData.ColliderGroups.Length];
                for (int i = 0; i < settingData.ColliderGroups.Length; i++)
                {
                    GameObject findObject
                        = GameObject.Find(m_Utility.ChangeRootPath(settingData.ColliderGroups[i], targetModel.name));

                    springbone.ColliderGroups[i] = findObject.GetComponent <SpringBoneColliderGroup>();
                }
            }
        }
Exemplo n.º 8
0
        public SpringBoneManager CreateVrmSpringBone(List <Node> nodes)
        {
            var gltfVrm = Gltf.Extensions.VRMCVrm;

            if ((gltfVrm.SpringBone is null))
            {
                return(null);
            }

            var springBone = new SpringBoneManager();

            // colliders
            springBone.Colliders.AddRange(
                gltfVrm.SpringBone.ColliderGroups.Select(y =>
                                                         new SpringBoneColliderGroup(
                                                             nodes[y.Node],
                                                             y.Colliders.Select(z => new VrmSpringBoneColliderSphere(z.Offset.ToVector3(), z.Radius))
                                                             )
                                                         ));

            // springs
            springBone.Springs.AddRange(gltfVrm.SpringBone.BoneGroups.Select(x =>
            {
                var sb = new SpringBone();
                sb.Bones.AddRange(x.Bones.Select(y => nodes[y]));
                if (x.Center.TryGetValidIndex(nodes.Count, out int centerIndex))
                {
                    sb.Origin = nodes[centerIndex];
                }
                sb.Colliders.AddRange(x.ColliderGroups.Select(y => springBone.Colliders[y]));
                sb.Comment      = x.Name;
                sb.DragForce    = x.DragForce;
                sb.GravityDir   = x.GravityDir.ToVector3();
                sb.GravityPower = x.GravityPower;
                sb.HitRadius    = x.HitRadius;
                sb.Stiffness    = x.Stiffness;
                return(sb);
            }));

            return(springBone);
        }
    public override void OnInspectorGUI()
    {
        sb = (SpringBone)target;

        DrawDefaultInspector();

        GUILayout.Space(10);

        if (GUILayout.Button("Find First Child"))
        {
            sb.child = GetNextChild(false);
        }
        if (GUILayout.Button("Find Next Child"))
        {
            sb.child = GetNextChild(true);
        }

        GUILayout.Space(5);

        GUILayout.TextArea("WARNING: Uses world scale.x to scale the bones and colliders.\nDO NOT SCALE THE GAMEOBJECT NON-UNIFORMLY (Very bad idea with rigidbodies anyway).");
    }
Exemplo n.º 10
0
    static void WriteSpringBone(Component com)
    {
        WriteString("SpringBone");

        SpringBone bone = com as SpringBone;

        if (bone.child)
        {
            WriteString(bone.child.name);
        }
        else
        {
            WriteString("");
        }

        bw.Write(bone.radius);
        bw.Write(bone.stiffnessForce);
        bw.Write(bone.dragForce);
        bw.Write(bone.threshold);
        WriteVector3(bone.boneAxis);
        WriteVector3(bone.springForce);

        int collider_count = bone.colliders.Length;

        bw.Write(collider_count);
        for (int i = 0; i < collider_count; ++i)
        {
            var collider = bone.colliders[i];
            if (collider)
            {
                string path = GetRelativePath(bone.transform, collider.transform);
                WriteString(path);
            }
            else
            {
                WriteString("");
            }
        }
    }
Exemplo n.º 11
0
    private GenericMenu GetWeaponsMenu(SpringBone bone, int current)
    {
        if (!bone)
        {
            return(null);
        }

        var ids = bone.GetSavedWeaponIDs();

        if (ids.Count < 1)
        {
            return(null);
        }

        var menu = new GenericMenu();

        foreach (var id in ids)
        {
            menu.AddItem(new GUIContent(SpringManagerEditor.GetWeaponString(id)), current == id, i => bone.CopyParams((int)i, current), id);
        }

        return(menu);
    }
Exemplo n.º 12
0
        public static bool LoadVrm(this Model self, Gltf gltf)
        {
            var gltfVrm = gltf.extensions?.VRM;

            if (gltfVrm == null)
            {
                return(false);
            }

            var Vrm = new Vrm(gltfVrm.meta.FromGltf(self.Textures), gltfVrm.exporterVersion, gltfVrm.specVersion);

            self.Vrm = Vrm;

            if (gltfVrm.humanoid != null)
            {
                foreach (var humanBone in gltfVrm.humanoid.humanBones)
                {
                    if (humanBone.bone != GltfFormat.HumanoidBones.unknown)
                    {
                        self.Nodes[humanBone.node].HumanoidBone = (VrmLib.HumanoidBones)humanBone.bone;
                    }
                }
            }

            if (!self.CheckVrmHumanoid())
            {
                throw new Exception("duplicate human bone");
            }

            // blendshape
            if (gltfVrm.blendShapeMaster != null &&
                gltfVrm.blendShapeMaster.blendShapeGroups != null &&
                gltfVrm.blendShapeMaster.blendShapeGroups.Any())
            {
                Vrm.BlendShape = gltfVrm.blendShapeMaster.FromGltf(self.MeshGroups, self.Materials, self.Nodes);
            }

            // secondary
            if (!(gltfVrm.secondaryAnimation is null))
            {
                Vrm.SpringBone = new SpringBoneManager();

                // colliders
                Vrm.SpringBone.Colliders.AddRange(
                    gltfVrm.secondaryAnimation.colliderGroups.Select(y =>
                                                                     new SpringBoneColliderGroup(
                                                                         self.Nodes[y.node],
                                                                         y.colliders.Select(z => VrmSpringBoneCollider.CreateSphere(z.offset, z.radius))
                                                                         )
                                                                     ));

                // springs
                Vrm.SpringBone.Springs.AddRange(gltfVrm.secondaryAnimation.boneGroups.Select(x =>
                {
                    var sb = new SpringBone();
                    sb.Bones.AddRange(x.bones.Select(y => self.Nodes[y]));
                    if (x.center >= 0)
                    {
                        sb.Origin = self.Nodes[x.center];
                    }
                    sb.Colliders.AddRange(x.colliderGroups.Select(y => Vrm.SpringBone.Colliders[y]));
                    sb.Comment      = x.comment;
                    sb.DragForce    = x.dragForce;
                    sb.GravityDir   = x.gravityDir;
                    sb.GravityPower = x.gravityPower;
                    sb.HitRadius    = x.hitRadius;
                    sb.Stiffness    = x.stiffiness;
                    return(sb);
                }));
            }

            // material(already replaced)

            if (gltfVrm.firstPerson != null)
            {
                Vrm.FirstPerson = gltfVrm.firstPerson.FromGltf(self.Nodes, self.MeshGroups);
                Vrm.LookAt      = gltfVrm.firstPerson.LookAtFromGltf();
                Vrm.LookAt.OffsetFromHeadBone = gltfVrm.firstPerson.firstPersonBoneOffset;
            }

            return(true);
        }
Exemplo n.º 13
0
        public SpringBoneManager CreateVrmSpringBone(List <Node> nodes)
        {
            if ((gltfVrmSpringBone is null))
            {
                return(null);
            }

            var springBoneManager = new SpringBoneManager();

            // springs
            if (gltfVrmSpringBone.Springs != null)
            {
                foreach (var gltfSpring in gltfVrmSpringBone.Springs)
                {
                    var springBone = new SpringBone();
                    springBone.Comment = gltfSpring.Name;

                    // joint
                    foreach (var gltfJoint in gltfSpring.Joints)
                    {
                        var joint = new SpringJoint(nodes[gltfJoint.Node.Value]);
                        joint.HitRadius    = gltfJoint.HitRadius.Value;
                        joint.DragForce    = gltfJoint.DragForce.Value;
                        joint.GravityDir   = gltfJoint.GravityDir.ToVector3();
                        joint.GravityPower = gltfJoint.GravityPower.Value;
                        joint.Stiffness    = gltfJoint.Stiffness.Value;
                        joint.Exclude      = gltfJoint.Exclude.GetValueOrDefault();
                        springBone.Joints.Add(joint);
                    }

                    // collider
                    springBone.Colliders.AddRange(gltfSpring.Colliders.Select(colliderNode =>
                    {
                        if (UniGLTF.Extensions.VRMC_node_collider.GltfDeserializer.TryGet(Gltf.nodes[colliderNode].extensions,
                                                                                          out UniGLTF.Extensions.VRMC_node_collider.VRMC_node_collider extension))
                        {
                            var collider = new SpringBoneColliderGroup(nodes[colliderNode], extension.Shapes.Select(x =>
                            {
                                if (x.Sphere != null)
                                {
                                    return(VrmSpringBoneCollider.CreateSphere(x.Sphere.Offset.ToVector3(), x.Sphere.Radius.Value));
                                }
                                else if (x.Capsule != null)
                                {
                                    return(VrmSpringBoneCollider.CreateCapsule(x.Capsule.Offset.ToVector3(), x.Capsule.Radius.Value, x.Capsule.Tail.ToVector3()));
                                }
                                else
                                {
                                    throw new NotImplementedException();
                                }
                            }));
                            return(collider);
                        }
                        else
                        {
                            return(null);
                        }
                    }).Where(x => x != null));

                    springBoneManager.Springs.Add(springBone);
                }
            }

            return(springBoneManager);
        }
Exemplo n.º 14
0
 void OnEnable()
 {
     _instance = (SpringBone)target;
 }
Exemplo n.º 15
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        // Base Parameter
        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField("Base Parameter", EditorStyles.boldLabel);
        EditorGUI.BeginChangeCheck();
        _instance.stiffnessForce = EditorGUILayout.FloatField("Stiffness", _instance.stiffnessForce);
        _instance.dragForce      = EditorGUILayout.FloatField("Drag Force", _instance.dragForce);
        _instance.springForce    = EditorGUILayout.Vector3Field("Spring Force", _instance.springForce);
        _instance.childNode      = (SpringBone)EditorGUILayout.ObjectField("Child Node", _instance.childNode, typeof(SpringBone), true);
        if (EditorGUI.EndChangeCheck())
        {
            foreach (var subObject in targets)
            {
                var subBone = subObject as SpringBone;

                subBone.stiffnessForce = _instance.stiffnessForce;
                subBone.dragForce      = _instance.dragForce;
                subBone.springForce    = _instance.springForce;

                EditorUtility.SetDirty(subObject);
            }
        }
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Add Children"))
        {
            _instance.DeployChildrenRecursive();
        }
        if (GUILayout.Button("Apply Children"))
        {
            if (Selection.objects.Length > 1)
            {
                for (int i = 0; i < Selection.objects.Length; i++)
                {
                    SpringBone bone;
                    if (Selection.objects[i] is SpringBone)
                    {
                        bone = Selection.objects[i] as SpringBone;
                    }
                    else
                    {
                        bone = (Selection.objects[i] as GameObject).GetComponent <SpringBone>();
                    }
                    bone?.CopySettingRecursive();
                }
            }
            else
            {
                _instance.CopySettingRecursive();
            }
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        // Side Link
        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField("Links", EditorStyles.boldLabel);
        EditorGUI.BeginChangeCheck();
        _instance.sideLinkForce = EditorGUILayout.FloatField("Side Link", _instance.sideLinkForce);
        if (EditorGUI.EndChangeCheck())
        {
            foreach (var subObject in targets)
            {
                var subBone = subObject as SpringBone;

                subBone.sideLinkForce = _instance.sideLinkForce;

                EditorUtility.SetDirty(subObject);
            }
        }
        _instance.sideNodeLeft  = (SpringBone)EditorGUILayout.ObjectField("Left Link Target", _instance.sideNodeLeft, typeof(SpringBone), true);
        _instance.sideNodeRight = (SpringBone)EditorGUILayout.ObjectField("Right Link Target", _instance.sideNodeRight, typeof(SpringBone), true);

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Apply Children"))
        {
            if (Selection.objects.Length > 1)
            {
                for (int i = 0; i < Selection.objects.Length - 1; i++)
                {
                    var        leftObject  = Selection.objects[i] as GameObject;
                    SpringBone leftBone    = leftObject.GetComponent <SpringBone>();
                    var        rightObject = Selection.objects[i + 1] as GameObject;
                    SpringBone rightBone   = rightObject.GetComponent <SpringBone>();
                    if (leftBone == null || rightBone == null)
                    {
                        continue;
                    }

                    leftBone.sideNodeRight = rightBone;
                    rightBone.sideNodeLeft = leftBone;
                    leftBone.SetLinkRecursive();
                }
            }
            else
            {
                _instance.SetLinkRecursive();
            }
        }
        if (GUILayout.Button("Clear"))
        {
            if (Selection.objects.Length > 1)
            {
                for (int i = 0; i < Selection.objects.Length; i++)
                {
                    var        leftObject = Selection.objects[i] as GameObject;
                    SpringBone bone       = leftObject.GetComponent <SpringBone>();
                    bone?.ClearLinkRecursive();
                }
            }
            else
            {
                _instance.ClearLinkRecursive();
            }
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        // Collision
        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField("Collisions", EditorStyles.boldLabel);
        EditorGUI.BeginChangeCheck();
        EditorGUI.indentLevel++;
        _instance.radius = EditorGUILayout.FloatField("Collision Radius", _instance.radius);
        var colliders = serializedObject.FindProperty("colliders");

        if (colliders != null)
        {
            EditorGUILayout.PropertyField(colliders, true);
        }
        EditorGUI.indentLevel--;
        if (EditorGUI.EndChangeCheck())
        {
            foreach (var subObject in targets)
            {
                var subBone = subObject as SpringBone;

                subBone.radius    = _instance.radius;
                subBone.colliders = _instance.colliders;

                EditorUtility.SetDirty(subObject);
            }
        }
        if (GUILayout.Button("Apply Children"))
        {
            if (Selection.objects.Length > 1)
            {
                for (int i = 0; i < Selection.objects.Length; i++)
                {
                    var boneObject = Selection.objects[i] as GameObject;
                    var bone       = boneObject.GetComponent <SpringBone>();
                    bone?.SetCollisionRecursive();
                }
            }
            else
            {
                _instance.SetCollisionRecursive();
            }
        }
        EditorGUILayout.EndVertical();

        serializedObject.ApplyModifiedProperties();
    }