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); } } }
public async Task <AvatarLayer> UpdateLayerAsync(AvatarLayer layer) { VerifyManagementPermission(); layer.SiteId = GetCurrentSiteId(); return(await _avatarLayerRepository.UpdateSaveAsync( GetClaimId(ClaimType.UserId), layer)); }
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); }
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); }