Example #1
0
        public override void PostHook(NodeImporter impoter, Transform trans, VGltf.Types.Node gltfNode)
        {
            if (!GE.ContainsExtensionUsed(impoter.Container.Gltf, AvatarType.ExtensionName))
            {
                return;
            }

            AvatarType extAvatar;

            if (!gltfNode.GetExtension(AvatarType.ExtensionName, out extAvatar))
            {
                return;
            }

            var extHD = extAvatar.HumanDescription;

            var hd = new HumanDescription();

            hd.upperArmTwist = extHD.UpperArmTwist;
            hd.lowerArmTwist = extHD.LowerArmTwist;
            hd.upperLegTwist = extHD.UpperLegTwist;
            hd.lowerLegTwist = extHD.LowerLegTwist;
            hd.armStretch    = extHD.ArmStretch;
            hd.legStretch    = extHD.LegStretch;
            hd.feetSpacing   = extHD.FeetSpacing;

            hd.skeleton = extHD.Skeleton.Select(s =>
            {
                // TODO: Coord
                return(new SkeletonBone
                {
                    name = s.Name,
                    position = PrimitiveImporter.AsVector3(s.Position),
                    rotation = PrimitiveImporter.AsQuaternion(s.Rotation),
                    scale = PrimitiveImporter.AsVector3(s.Scale),
                });
            }).ToArray();

            hd.human = extHD.Human.Select(h =>
            {
                var extLimit = h.Limit;
                var limit    = new HumanLimit
                {
                    useDefaultValues = extLimit.UseDefaultValues,
                    min        = PrimitiveImporter.AsVector3(extLimit.Min),
                    max        = PrimitiveImporter.AsVector3(extLimit.Max),
                    center     = PrimitiveImporter.AsVector3(extLimit.Center),
                    axisLength = extLimit.AxisLength,
                };

                return(new HumanBone
                {
                    boneName = h.BoneName,
                    humanName = h.HumanName,
                    limit = limit,
                });
            }).ToArray();

            var go   = trans.gameObject;
            var anim = go.AddComponent <Animator>();

            anim.avatar = AvatarBuilder.BuildHumanAvatar(go, hd);
        }
Example #2
0
        public override void PostHook(NodeExporter exporter, Transform trans, VGltf.Types.Node gltfNode)
        {
            var go = trans.gameObject;

            var anim = go.GetComponent <Animator>();

            if (anim == null)
            {
                return;
            }

            var extAvatar = new AvatarType();

            var hd    = anim.avatar.humanDescription;
            var extHD = new AvatarType.HumanDescriptionType();

            extHD.UpperArmTwist = hd.upperArmTwist;
            extHD.LowerArmTwist = hd.lowerArmTwist;
            extHD.UpperLegTwist = hd.upperLegTwist;
            extHD.LowerLegTwist = hd.lowerLegTwist;
            extHD.ArmStretch    = hd.armStretch;
            extHD.LegStretch    = hd.legStretch;
            extHD.FeetSpacing   = hd.feetSpacing;

            // Regenerate skeleton by referencing bones to support normalized bones.
            var allNodes = anim.GetComponentsInChildren <Transform>();

            extHD.Skeleton = allNodes.Where(n =>
            {
                return(!(
                           (n.GetComponent <MeshRenderer>() != null) ||
                           (n.GetComponent <SkinnedMeshRenderer>() != null)
                           ));
            }).Select(n =>
            {
                // TODO: Coord
                return(new AvatarType.HumanDescriptionType.SkeletonBone
                {
                    Name = n.name,
                    Position = PrimitiveExporter.AsArray(n.localPosition),
                    Rotation = PrimitiveExporter.AsArray(n.localRotation),
                    Scale = PrimitiveExporter.AsArray(n.localScale),
                });
            }).ToList();

            extHD.Human = hd.human.Select(h =>
            {
                // TODO: Coord
                var extLimit = new AvatarType.HumanDescriptionType.HumanLimit
                {
                    UseDefaultValues = h.limit.useDefaultValues,
                    Min        = PrimitiveExporter.AsArray(h.limit.min),
                    Max        = PrimitiveExporter.AsArray(h.limit.max),
                    Center     = PrimitiveExporter.AsArray(h.limit.center),
                    AxisLength = h.limit.axisLength,
                };

                return(new AvatarType.HumanDescriptionType.HumanBone
                {
                    BoneName = h.boneName,
                    HumanName = h.humanName,
                    Limit = extLimit,
                });
            }).ToList();

            extAvatar.HumanDescription = extHD;

            //
            gltfNode.AddExtension(AvatarType.ExtensionName, extAvatar);

            GE.AddExtensionUsed(exporter.Gltf, AvatarType.ExtensionName);
        }