Esempio n. 1
0
        private IEnumerable <AvatarLayer> GenerateLayer(Bone bone, Point position)
        {
            position.Offset(bone.Position);
            foreach (Skin skin in bone.Skins)
            {
                var layer = new AvatarLayer();
                layer.Bitmap   = skin.Image.Bitmap;
                layer.Position = new Point(position.X + skin.Offset.X - skin.Image.Origin.X,
                                           position.Y + skin.Offset.Y - skin.Image.Origin.Y);
                layer.ZIndex = this.ZMap.IndexOf(skin.Z);
                if (layer.ZIndex < 0)
                {
                    layer.ZIndex = this.ZMap.Count;
                }
                yield return(layer);
            }

            foreach (var child in bone.Children)
            {
                foreach (var layer in GenerateLayer(child, position))
                {
                    yield return(layer);
                }
            }
        }
Esempio n. 2
0
 public async Task <AvatarLayer> UpdateLayerAsync(AvatarLayer layer)
 {
     VerifyManagementPermission();
     layer.SiteId = GetCurrentSiteId();
     return(await _avatarLayerRepository.UpdateSaveAsync(
                GetClaimId(ClaimType.UserId), layer));
 }
Esempio n. 3
0
        public async Task <AvatarLayer> AddLayerAsync(AvatarLayer layer)
        {
            VerifyManagementPermission();
            layer.SiteId = GetCurrentSiteId();
            var currentLayer = await _avatarLayerRepository.AddSaveAsync(
                GetClaimId(ClaimType.UserId), layer);

            foreach (var text in layer.Texts)
            {
                var languageId = await _languageService.GetLanguageIdAsync(text.Language);

                if (languageId != default)
                {
                    await _avatarLayerRepository.AddAvatarLayerTextAsync(currentLayer.Id,
                                                                         languageId,
                                                                         text);
                }
            }
            await _avatarLayerRepository.SaveAsync();

            var layerData = _avatarLayerRepository.GetNameAndLabelByLanguageId(currentLayer.Id,
                                                                               await _languageService.GetDefaultLanguageIdAsync());

            currentLayer.Name = layerData["Name"];
            return(currentLayer);
        }
Esempio n. 4
0
        private List <AvatarLayer> GenerateLayer(Bone bone)
        {
            var layers = new List <AvatarLayer>();

            //计算角色原点,用于翻转偏移
            var   rootBone = bone.FindChild("@root");
            Point rootPos  = Point.Empty;
            {
                var temp = rootBone;
                while (temp != null)
                {
                    rootPos.Offset(temp.Position);
                    temp = temp.Parent;
                }
            }

            Action <Bone, Point> func = null;

            func = (parent, pos) =>
            {
                pos.Offset(parent.Position);
                var prop = parent.Property;

                foreach (Skin skin in parent.Skins)
                {
                    var layer    = new AvatarLayer();
                    var bmp      = skin.Image.Bitmap;
                    var position = new Point(pos.X + skin.Offset.X - skin.Image.Origin.X,
                                             pos.Y + skin.Offset.Y - skin.Image.Origin.Y);

                    //计算身体旋转和反转
                    if (parent.Group == BoneGroup.Character && prop != null)
                    {
                        Bitmap    bmp2;
                        Rectangle rect2;
                        if (RotateFlipImage(bmp, new Rectangle(position, bmp.Size),
                                            prop.Flip, prop.Rotate, prop.Move, rootPos,
                                            out bmp2, out rect2))
                        {
                            if (bmp2 != null)
                            {
                                bmp = bmp2;
                            }
                            position = rect2.Location;
                        }
                    }

                    layer.Bitmap   = bmp;
                    layer.Position = position;
                    if (!string.IsNullOrEmpty(skin.Z))
                    {
                        layer.ZIndex = this.ZMap.IndexOf(skin.Z);
                        if (layer.ZIndex < 0)
                        {
                            layer.ZIndex = this.ZMap.Count;
                        }
                    }
                    else
                    {
                        layer.ZIndex = (skin.ZIndex < 0) ? (this.ZMap.Count - skin.ZIndex) : (-1 - skin.ZIndex);
                    }
                    layers.Add(layer);
                }

                foreach (var child in parent.Children)
                {
                    func(child, pos);
                }
            };

            func(bone, Point.Empty);
            return(layers);
        }