private static MemoryTexture _GetResourceTexture(GraphicsDevice Device, ResourceType.GuiGraphic Graphic) { MemoryTexture r = null; var rawAsset = AssetManager.GetContentTexture(Graphic.AssetPath); if (Graphic.Palette != "None" && DwarfSprites.LayerLibrary.FindPalette(Graphic.Palette).HasValue(out var palette)) { r = TextureTool.CropAndColorSprite(Device, rawAsset, Graphic.FrameSize, Graphic.Frame, DwarfSprites.LayerLibrary.BasePalette.CachedPalette, palette.CachedPalette); } else { r = TextureTool.CropSprite(Device, rawAsset, Graphic.FrameSize, Graphic.Frame); } if (Graphic.NextLayer != null) { TextureTool.AlphaBlit(_GetResourceTexture(Device, Graphic.NextLayer), new Rectangle(0, 0, Graphic.NextLayer.FrameSize.X, Graphic.NextLayer.FrameSize.Y), r, new Point(0, 0)); } return(r); }
public override void CreateCosmeticChildren(ComponentManager manager) { base.CreateCosmeticChildren(manager); if (Resource.Gui_NewStyle) { var sheetName = String.Format("{0}&{1}-{2}&{3}", Resource.Gui_Graphic.AssetPath, Resource.Gui_Graphic.Frame.X, Resource.Gui_Graphic.Frame.Y, Resource.Gui_Palette); var tiledInstanceGroup = Manager.World.Renderer.InstanceRenderer.GetCombinedTiledInstance(); Texture2D fixedTex = null; if (!tiledInstanceGroup.DoesInstanceSheetExist(sheetName)) { if (DwarfSprites.LayerLibrary.FindPalette(Resource.Gui_Palette).HasValue(out var palette)) { fixedTex = TextureTool.CropAndColorSprite(manager.World.Renderer.GraphicsDevice, AssetManager.GetContentTexture(Resource.Gui_Graphic.AssetPath), Resource.Gui_Graphic.FrameSize, Resource.Gui_Graphic.Frame, DwarfSprites.LayerLibrary.BasePalette.CachedPalette, palette.CachedPalette); } } var sheet = new SpriteSheet(fixedTex) { FrameWidth = Resource.Gui_Graphic.FrameSize.X, FrameHeight = Resource.Gui_Graphic.FrameSize.Y, AssetName = sheetName }; var sprite = AddChild(new SimpleBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f), sheet, Point.Zero, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f)) as Tinter; sprite.LocalTransform = Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f); sprite.LightRamp = Resource.Tint; sprite.SetFlag(Flag.ShouldSerialize, false); } else { var compositeLayers = Resource.CompositeLayers; var tint = Resource.Tint; Tinter sprite = null; // Minor optimization for single layer resources. if (compositeLayers.Count == 1) { var layer = compositeLayers[0]; sprite = AddChild(new SimpleBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f), new SpriteSheet(layer.Asset, layer.FrameSize.X, layer.FrameSize.Y), layer.Frame, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f) { OrientationType = SimpleSprite.OrientMode.Spherical, WorldHeight = 0.75f, WorldWidth = 0.75f, }) as Tinter; sprite.LocalTransform = Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f); } else { var layers = new List <LayeredSimpleSprite.Layer>(); foreach (var layer in compositeLayers) { layers.Add(new LayeredSimpleSprite.Layer { Sheet = new SpriteSheet(layer.Asset, layer.FrameSize.X, layer.FrameSize.Y), Frame = layer.Frame }); } sprite = AddChild(new LayeredBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f), layers, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f) { OrientationType = LayeredSimpleSprite.OrientMode.Spherical, WorldHeight = 0.75f, WorldWidth = 0.75f, }) as Tinter; } sprite.LightRamp = tint; sprite.SetFlag(Flag.ShouldSerialize, false); } }