Alexandria.Engines.Sciagi.Resources.PictureRenderer.DrawPatternAt C# (CSharp) Метод

DrawPatternAt() публичный Метод

Draw a pattern.
public DrawPatternAt ( Vector2i position ) : void
position Vector2i
Результат void
        public void DrawPatternAt(Vector2i position)
        {
            int size = PatternSize;
            int sx = Math.Max(position.X - size, 0);
            int sy = Math.Max(position.Y - size, 0);
            int ex = Math.Min(sx + size * 2 + 1, Canvas.Resolution.X - 1);
            int ey = Math.Min(sy + size * 2 + 1, Canvas.Resolution.Y - 1);
            int baseTextureOffset = PatternTextureOffsets[PatternNumber];
            int textureOffset = baseTextureOffset / 8;
            int textureBit = 7 - baseTextureOffset % 8, textureValue = PatternTextures[textureOffset % PatternTextures.Length];
            byte[] circleData = PatternCircles[size];
            int circleOffset = 1;
            int circleValue = circleData[0];
            int circleBit = 7;

            bool useRectangle = (PatternFlags & PicturePatternFlags.Rectangle) != 0;
            bool usePattern = (PatternFlags & PicturePatternFlags.UsePattern) != 0;

            Canvas.Visual.DitherBlendOverride = false;

            for (int y = sy; y <= ey; y++) {
                for (int x = sx; x <= ex; x++) {
                    if (textureBit < 0) {
                        textureValue = PatternTextures[textureOffset++ % PatternTextures.Length];
                        textureBit = 7;
                    }

                    bool textureOn = usePattern ? (textureValue & (1 << textureBit)) != 0 : true;

                    if (useRectangle) {
                        if (usePattern) {
                            if (textureOn)
                                DrawPixel(x, y);
                            textureBit--;
                        }
                    } else {
                        bool circleOn = (circleValue & 1) != 0;
                        circleValue >>= 1;
                        if (circleBit-- == 0) {
                            circleBit = 7;
                            circleValue = circleOffset >= circleData.Length ? 0 : circleData[circleOffset++];
                        }

                        if (circleOn) {
                            if (textureOn)
                                DrawPixel(x, y);
                            textureBit--;
                        }
                    }
                }
            }

            Canvas.Visual.DitherBlendOverride = false;
        }

Usage Example

Пример #1
0
 /// <summary>Render the instruction by drawing the patterns.</summary>
 /// <param name="renderer"></param>
 public override void Render(PictureRenderer renderer)
 {
     foreach (PicturePatternDrawLocation location in DrawLocations)
     {
         if ((PatternFlags & PicturePatternFlags.UsePattern) != 0)
         {
             renderer.PatternNumber = location.PatternNumber;
         }
         renderer.DrawPatternAt(location.Position);
     }
 }
All Usage Examples Of Alexandria.Engines.Sciagi.Resources.PictureRenderer::DrawPatternAt