Exemplo n.º 1
0
        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);
                }
            });
        }
Exemplo n.º 2
0
        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;
            }
        }