Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        public static VrmProtobuf.SpringBone ToGltf(this SpringBoneManager self, List <Node> nodes)
        {
            if (self == null)
            {
                return(null);
            }

            var springBone = new VrmProtobuf.SpringBone();

            foreach (var x in self.Colliders)
            {
                springBone.ColliderGroups.Add(x.ToGltf(nodes));
            }
            foreach (var x in self.Springs)
            {
                springBone.BoneGroups.Add(x.ToGltf(nodes, self.Colliders));
            }

            return(springBone);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
 public void ExportVrmSpringBone(SpringBoneManager springBone, List <Node> nodes)
 {
     Storage.gltfVrmSpringBone = springBone.ToGltf(nodes, Storage.Gltf.nodes);
 }
Ejemplo n.º 6
0
        public static VRMC_springBone ToGltf(this SpringBoneManager self, List <Node> nodes,
                                             List <glTFNode> gltfNodes)
        {
            if (self == null)
            {
                return(null);
            }

            var springBone = new VRMC_springBone();

            //
            // VRMC_node_collider
            //
            foreach (var x in self.Colliders)
            {
                var index    = nodes.IndexOfThrow(x.Node);
                var collider = new VRMC_node_collider();
                foreach (var y in x.Colliders)
                {
                    switch (y.ColliderType)
                    {
                    case VrmSpringBoneColliderTypes.Sphere:
                    {
                        var sphere = new ColliderShapeSphere
                        {
                            Radius = y.Radius,
                            Offset = y.Offset.ToFloat3(),
                        };
                        collider.Shapes.Add(new ColliderShape
                            {
                                Sphere = sphere,
                            });
                        break;
                    }

                    case VrmSpringBoneColliderTypes.Capsule:
                    {
                        var capsule = new ColliderShapeCapsule
                        {
                            Radius = y.Radius,
                            Offset = y.Offset.ToFloat3(),
                            Tail   = y.CapsuleTail.ToFloat3(),
                        };
                        collider.Shapes.Add(new ColliderShape
                            {
                                Capsule = capsule,
                            });
                    }
                    break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                //
                // add to node.extensions
                //
                UniGLTF.Extensions.VRMC_node_collider.GltfSerializer.SerializeTo(ref gltfNodes[index].extensions, collider);
            }

            //
            // VRMC_springBone
            //
            foreach (var x in self.Springs)
            {
                var settingIndex = springBone.Settings.Count;
                springBone.Settings.Add(x.ToGltf(nodes));
                foreach (var bone in x.Bones)
                {
                    var spring = new Spring
                    {
                        Name       = x.Comment,
                        HitRadius  = x.HitRadius,
                        SpringRoot = nodes.IndexOfThrow(bone),
                        Setting    = settingIndex,
                        Colliders  = x.Colliders.Select(y => nodes.IndexOfThrow(y.Node)).ToArray(),
                    };
                    springBone.Springs.Add(spring);
                }
            }

            return(springBone);
        }
Ejemplo n.º 7
0
 public void ExportVrmSpringBone(SpringBoneManager springBone, List <Node> nodes)
 {
     Gltf.Extensions.VRMCVrm.SpringBone = springBone.ToGltf(nodes);
 }
Ejemplo n.º 8
0
        public static VRMC_springBone ToGltf(this SpringBoneManager self, List <Node> nodes,
                                             List <glTFNode> gltfNodes)
        {
            if (self == null)
            {
                return(null);
            }

            var springBone = new VRMC_springBone();

            //
            // VRMC_node_collider
            //
            foreach (var nodeCollider in self.Springs.SelectMany(x => x.Colliders))
            {
                var index        = nodes.IndexOfThrow(nodeCollider.Node);
                var gltfCollider = new VRMC_node_collider();
                foreach (var y in nodeCollider.Colliders)
                {
                    switch (y.ColliderType)
                    {
                    case VrmSpringBoneColliderTypes.Sphere:
                    {
                        var sphere = new ColliderShapeSphere
                        {
                            Radius = y.Radius,
                            Offset = y.Offset.ToFloat3(),
                        };
                        gltfCollider.Shapes.Add(new ColliderShape
                            {
                                Sphere = sphere,
                            });
                        break;
                    }

                    case VrmSpringBoneColliderTypes.Capsule:
                    {
                        var capsule = new ColliderShapeCapsule
                        {
                            Radius = y.Radius,
                            Offset = y.Offset.ToFloat3(),
                            Tail   = y.CapsuleTail.ToFloat3(),
                        };
                        gltfCollider.Shapes.Add(new ColliderShape
                            {
                                Capsule = capsule,
                            });
                    }
                    break;

                    default:
                        throw new NotImplementedException();
                    }
                }

                //
                // add to node.extensions
                //
                UniGLTF.Extensions.VRMC_node_collider.GltfSerializer.SerializeTo(ref gltfNodes[index].extensions, gltfCollider);
            }

            //
            // VRMC_springBone
            //
            foreach (var x in self.Springs)
            {
                var spring = new Spring
                {
                    Name      = x.Comment,
                    Colliders = x.Colliders.Select(y => nodes.IndexOfThrow(y.Node)).ToArray(),
                };

                foreach (var y in x.Joints)
                {
                    spring.Joints.Add(new SpringBoneJoint
                    {
                        HitRadius    = y.HitRadius,
                        DragForce    = y.DragForce,
                        GravityDir   = y.GravityDir.ToFloat3(),
                        GravityPower = y.GravityPower,
                        Stiffness    = y.Stiffness,
                    });
                }

                springBone.Springs.Add(spring);
            }

            return(springBone);
        }
Ejemplo n.º 9
0
        public static VrmProtobuf.VRMCSpringBone ToGltf(this SpringBoneManager self, List <Node> nodes,
                                                        pbc::RepeatedField <global::VrmProtobuf.Node> protoNodes)
        {
            if (self == null)
            {
                return(null);
            }

            var springBone = new VrmProtobuf.VRMCSpringBone();

            //
            // VRMC_node_collider
            //
            foreach (var x in self.Colliders)
            {
                var index    = nodes.IndexOfThrow(x.Node);
                var collider = new VrmProtobuf.VRMC_node_collider();
                foreach (var y in x.Colliders)
                {
                    switch (y.ColliderType)
                    {
                    case VrmSpringBoneColliderTypes.Sphere:
                    {
                        var sphere = new VrmProtobuf.Sphere
                        {
                            Radius = y.Radius,
                        };
                        sphere.Offset.Add(y.Offset.X);
                        sphere.Offset.Add(y.Offset.Y);
                        sphere.Offset.Add(y.Offset.Z);
                        collider.Shapes.Add(new VrmProtobuf.ColliderShape
                            {
                                Sphere = sphere,
                            });
                        break;
                    }

                    case VrmSpringBoneColliderTypes.Capsule:
                    {
                        var capsule = new VrmProtobuf.Capsule
                        {
                            Radius = y.Radius,
                        };
                        capsule.Offset.Add(y.Offset.X);
                        capsule.Offset.Add(y.Offset.Y);
                        capsule.Offset.Add(y.Offset.Z);
                        capsule.Tail.Add(y.CapsuleTail.X);
                        capsule.Tail.Add(y.CapsuleTail.Y);
                        capsule.Tail.Add(y.CapsuleTail.Z);
                        collider.Shapes.Add(new VrmProtobuf.ColliderShape
                            {
                                Capsule = capsule,
                            });
                    }
                    break;

                    default:
                        throw new NotImplementedException();
                    }
                }
                protoNodes[index].Extensions.VRMCNodeCollider = collider;
            }

            //
            // VRMC_springBone
            //
            foreach (var x in self.Springs)
            {
                var settingIndex = springBone.Settings.Count;
                springBone.Settings.Add(x.ToGltf(nodes));
                foreach (var bone in x.Bones)
                {
                    var spring = new VrmProtobuf.Spring
                    {
                        Name       = x.Comment,
                        HitRadius  = x.HitRadius,
                        SpringRoot = nodes.IndexOfThrow(bone),
                        Setting    = settingIndex,
                    };
                    foreach (var y in x.Colliders)
                    {
                        spring.Colliders.Add(nodes.IndexOfThrow(y.Node));
                    }
                    springBone.Springs.Add(spring);
                }
            }

            return(springBone);
        }