private void DrawAsset(List <AvatarAsset> buildQueue, Image <Rgba32> bodyCanvas, Image <Rgba32> faceCanvas, Image <Rgba32> drinkCanvas, AvatarAsset asset) { var graphicsOptions = new GraphicsOptions(); graphicsOptions.ColorBlendingMode = PixelColorBlendingMode.Normal; using (var image = SixLabors.ImageSharp.Image.Load <Rgba32>(asset.FileName)) { if (buildQueue.Count(x => x.Set.HiddenLayers.Contains(asset.Part.Type)) > 0) { return; } if (asset.Part.Type != "ey") { if (asset.Part.HexColor != null) { TintImage(image, asset.Part.HexColor, 255); } if (asset.Part.Colorable) { string[] parts = asset.Parts; if (parts.Length > 2 && !IsOldFigure) { var paletteId = int.Parse(parts[2]); if (!FiguredataReader.FigureSetTypes.ContainsKey(parts[0])) { return; } var figureTypeSet = FiguredataReader.FigureSetTypes[parts[0]]; var palette = FiguredataReader.FigurePalettes[figureTypeSet.PaletteId]; var colourData = palette.FirstOrDefault(x => x.ColourId == parts[2]); if (colourData == null) { return; } TintImage(image, colourData.HexColor, 255); } } } else { TintImage(image, "FFFFFF", 255); } try { if (this.IsHead(asset.Part.Type)) { faceCanvas.Mutate(ctx => { ctx.DrawImage(image, new SixLabors.ImageSharp.Point(faceCanvas.Width - asset.ImageX, faceCanvas.Height - asset.ImageY), graphicsOptions); }); } else { if (!asset.IsDrinkCanvas) { bodyCanvas.Mutate(ctx => { ctx.DrawImage(image, new SixLabors.ImageSharp.Point(bodyCanvas.Width - asset.ImageX, bodyCanvas.Height - asset.ImageY), graphicsOptions); }); } else { drinkCanvas.Mutate(ctx => { ctx.DrawImage(image, new SixLabors.ImageSharp.Point(bodyCanvas.Width - asset.ImageX, bodyCanvas.Height - asset.ImageY), graphicsOptions); }); } } } catch { } } }
private AvatarAsset LoadFigureAsset(string[] parts, FigurePart part, FigureSet set) { var key = part.Type + (IsSmall ? "_sh" : "_h"); var document = FigureExtractor.Parts.ContainsKey(key) ? FigureExtractor.Parts[key] : null; if (document == null) { return(null); } int direction; string gesture; if (IsHead(part.Type)) { direction = HeadDirection; gesture = Gesture; if (HeadDirection == 4) { direction = 2; } if (HeadDirection == 6) { direction = 0; } if (HeadDirection == 5) { direction = 1; } } else { direction = BodyDirection; gesture = Action; if (BodyDirection == 4) { direction = 2; } if (BodyDirection == 6) { direction = 0; } if (BodyDirection == 5) { direction = 1; } } // Hide left arm on side view if (direction == 1 && part.Type == "ls") { return(null); } if (Action == "lay") { if (BodyDirection == 4) { direction = 2; } } if (CarryDrink > 0 && Action != "lay" && Action != "drk") { var partsForAction = new string[] { "ls", "lh" }; if (partsForAction.Contains(part.Type)) { gesture = "std"; } } AvatarAsset asset = null; if (CarryDrink > 0 && (part.Type == "rs" || part.Type == "rh") && Action != "drk" && Action != "crr") { asset = LocateAsset((this.IsSmall ? "sh" : "h") + "_" + "crr" + "_" + part.Type + "_" + part.Id + "_" + direction + "_0", document, parts, part, set); } if (asset == null) { asset = LocateAsset((this.IsSmall ? "sh" : "h") + "_" + gesture + "_" + part.Type + "_" + part.Id + "_" + direction + "_" + Frame, document, parts, part, set); } if (asset == null) { asset = LocateAsset((this.IsSmall ? "sh" : "h") + "_" + "std" + "_" + part.Type + "_" + part.Id + "_" + direction + "_" + Frame, document, parts, part, set); } if (asset == null) { asset = LocateAsset((this.IsSmall ? "sh" : "h") + "_" + "std" + "_" + part.Type + "_" + part.Id + "_" + direction + "_0", document, parts, part, set); } if (IsSmall) { if (asset == null) { asset = LocateAsset((this.IsSmall ? "sh" : "h") + "_" + "std" + "_" + part.Type + "_" + 1 + "_" + direction + "_" + Frame, document, parts, part, set); } } return(asset); }