Exemple #1
0
        public static VrmProtobuf.VRMCSpringBone ToGltf(this SpringBoneManager self, List <Node> nodes)
        {
            if (self == null)
            {
                return(null);
            }

            var springBone = new VrmProtobuf.VRMCSpringBone();

            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);
        }
Exemple #2
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);
        }