public void DrawImmediate(_2DStandaloneSprite sprite) { var effect = this.Effect; if (!FSOEnvironment.DirectX) { Device.Indices = null; //monogame why Device.Indices = SpriteIndices; } PPXDepthEngine.RenderPPXDepth(effect, false, (depth) => { effect.pixelTexture = sprite.Pixel; if (sprite.Depth != null) { effect.depthTexture = sprite.Depth; } if (sprite.Mask != null) { effect.maskTexture = sprite.Mask; } EffectPassCollection passes = effect.CurrentTechnique.Passes; EffectPass pass = passes[Math.Min(passes.Count - 1, WorldConfig.Current.DirPassOffset)]; pass.Apply(); if (sprite.GPUVertices != null) { Device.SetVertexBuffer(sprite.GPUVertices); Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 2); } }); }
public virtual void ValidateSprite(WorldState world) { if (DrawGroup == null) { return; } if (_Dirty.HasFlag(ComponentRenderMode._2D)) { if (_TextureDirty) { Dispose(); Items.Clear(); var direction = (uint)_Direction; /** Compute the direction **/ var image = DrawGroup.GetImage(direction, (uint)world.Zoom, (uint)world.Rotation); int maxX = int.MinValue, maxY = int.MinValue; int minX = int.MaxValue, minY = int.MaxValue; if (image != null) { foreach (var dgrpSprite in image.Sprites) { if (dgrpSprite == null) { continue; } var texture = world._2D.GetWorldTexture(dgrpSprite); if (texture == null || texture.ZBuffer == null) { continue; } var isDynamic = dgrpSprite.SpriteID >= DynamicSpriteBaseID && dgrpSprite.SpriteID < (DynamicSpriteBaseID + NumDynamicSprites); if (isDynamic) { var dynamicIndex = (ushort)(dgrpSprite.SpriteID - DynamicSpriteBaseID); var isVisible = (dynamicIndex > 63) ? ((DynamicSpriteFlags2 & ((ulong)0x1 << (dynamicIndex - 64))) > 0): ((DynamicSpriteFlags & ((ulong)0x1 << dynamicIndex)) > 0); if (!isVisible) { continue; } } var sprite = new _2DStandaloneSprite(); //do not use sprite pool for DGRP, since we can reliably remember our own sprites. sprite.Pixel = texture.Pixel; sprite.Depth = texture.ZBuffer; if (texture.ZBuffer != null) { sprite.RenderMode = _2DBatchRenderMode.Z_BUFFER; sprite.WorldPosition = dgrpSprite.ObjectOffset; } else { sprite.RenderMode = _2DBatchRenderMode.NO_DEPTH; } var pt = ((TextureInfo)sprite.Pixel.Tag).Size; sprite.SrcRect = new Rectangle(0, 0, pt.X, pt.Y); sprite.DestRect = new Rectangle(0, 0, pt.X, pt.Y); sprite.FlipHorizontally = dgrpSprite.Flip; sprite.ObjectID = ObjectID; Items.Add(new DGRPRendererItem { Sprite = sprite, DGRPSprite = dgrpSprite }); var pxX = (world.WorldSpace.CadgeWidth / 2.0f) + dgrpSprite.SpriteOffset.X; var pxY = (world.WorldSpace.CadgeBaseLine - sprite.DestRect.Height) + dgrpSprite.SpriteOffset.Y; if (dgrpSprite.ObjectOffset != Vector3.Zero) { } var centerRelative = dgrpSprite.ObjectOffset * new Vector3(1f / 16f, 1f / 16f, 1f / 5f); centerRelative = Vector3.Transform(centerRelative, Matrix.CreateRotationZ(RadianDirection)); var pxOff = world.WorldSpace.GetScreenFromTile(centerRelative); sprite.DestRect.X = (int)(pxX + pxOff.X); sprite.DestRect.Y = (int)(pxY + pxOff.Y); if (sprite.DestRect.X < minX) { minX = sprite.DestRect.X; } if (sprite.DestRect.Y < minY) { minY = sprite.DestRect.Y; } if (sprite.DestRect.X + sprite.Pixel.Width > maxX) { maxX = sprite.DestRect.X + sprite.Pixel.Width; } if (sprite.DestRect.Y + sprite.Pixel.Height > maxY) { maxY = sprite.DestRect.Y + sprite.Pixel.Height; } sprite.WorldPosition = centerRelative * 3f; var y = sprite.WorldPosition.Z; sprite.WorldPosition.Z = sprite.WorldPosition.Y; sprite.WorldPosition.Y = y; sprite.Room = ((dgrpSprite.Flags & DGRPSpriteFlags.Luminous) > 0 && Room != 65534 && Room != 65533) ? (ushort)65535 : Room; sprite.Floor = Level; } } _TextureDirty = false; Bounding = new Rectangle(minX, minY, maxX - minX, maxY - minY); } Rectangle?bounding = null; foreach (var item in Items) { item.Sprite.AbsoluteDestRect = item.Sprite.DestRect; item.Sprite.AbsoluteDestRect.Offset(world.WorldSpace.GetScreenFromTile(_Position)); if (bounding == null) { bounding = item.Sprite.AbsoluteDestRect; } else { bounding = Rectangle.Union(bounding.Value, item.Sprite.AbsoluteDestRect); } item.Sprite.AbsoluteWorldPosition = item.Sprite.WorldPosition + WorldSpace.GetWorldFromTile(_Position); item.Sprite.PrepareVertices(world.Device); } Bounding = bounding ?? new Rectangle(); _Dirty &= ~ComponentRenderMode._2D; } }