Пример #1
0
    private static bool GetRectAndInvertMatrix(ref P3D_Matrix matrix, ref P3D_Rect rect, int canvasW, int canvasH)
    {
        // Grab transformed corners
        var a = matrix.MultiplyPoint(0.0f, 0.0f);
        var b = matrix.MultiplyPoint(1.0f, 0.0f);
        var c = matrix.MultiplyPoint(0.0f, 1.0f);
        var d = matrix.MultiplyPoint(1.0f, 1.0f);

        // Find min/max x/y
        var xMin = Mathf.Min(Mathf.Min(a.x, b.x), Mathf.Min(c.x, d.x));
        var xMax = Mathf.Max(Mathf.Max(a.x, b.x), Mathf.Max(c.x, d.x));
        var yMin = Mathf.Min(Mathf.Min(a.y, b.y), Mathf.Min(c.y, d.y));
        var yMax = Mathf.Max(Mathf.Max(a.y, b.y), Mathf.Max(c.y, d.y));

        // Has volume?
        if (xMin < xMax && yMin < yMax)
        {
            // Make sure rect doesn't go outside canvas
            rect.XMin = Mathf.Clamp(Mathf.FloorToInt(xMin), 0, canvasW);
            rect.XMax = Mathf.Clamp(Mathf.CeilToInt(xMax), 0, canvasW);
            rect.YMin = Mathf.Clamp(Mathf.FloorToInt(yMin), 0, canvasH);
            rect.YMax = Mathf.Clamp(Mathf.CeilToInt(yMax), 0, canvasH);

            matrix = matrix.Inverse;

            return(true);
        }

        return(false);
    }
 private void PrePaint(Texture2D canvas, P3D_Rect rect)
 {
     if (canvas == TargetTexture)
     {
         CalculateCoverage(canvas, rect, ref prePaintCoverageA, ref prePaintCoverageB, ref prePaintCoverageC, ref prePaintCoverageD);
     }
 }
Пример #3
0
 private void PrePaint(Texture2D canvas, P3D_Rect rect)
 {
     if (canvas == TargetTexture)
     {
         prePaintCoverage = CalculateCoverage(canvas, rect);
     }
 }
Пример #4
0
    public bool Overlaps(P3D_Rect other)
    {
        if (IsSet == false || other.IsSet == false)
        {
            return(false);
        }

        if (XMax <= other.XMin)
        {
            return(false);
        }
        if (XMin >= other.XMax)
        {
            return(false);
        }

        if (YMax <= other.YMin)
        {
            return(false);
        }
        if (YMin >= other.YMax)
        {
            return(false);
        }

        return(true);
    }
Пример #5
0
    private void PostPaint(Texture2D canvas, P3D_Rect rect)
    {
        if (canvas == TargetTexture)
        {
            var postPaintCoverage = CalculateCoverage(canvas, rect);

            TotalCoverage += postPaintCoverage - prePaintCoverage;
        }
    }
    private void PostPaint(Texture2D canvas, P3D_Rect rect)
    {
        if (canvas == TargetTexture)
        {
            var postPaintCoverageA = 0;
            var postPaintCoverageB = 0;
            var postPaintCoverageC = 0;
            var postPaintCoverageD = 0;

            CalculateCoverage(canvas, rect, ref postPaintCoverageA, ref postPaintCoverageB, ref postPaintCoverageC, ref postPaintCoverageD);

            TotalCoverageA += postPaintCoverageA - prePaintCoverageA;
            TotalCoverageB += postPaintCoverageB - prePaintCoverageB;
            TotalCoverageC += postPaintCoverageC - prePaintCoverageC;
            TotalCoverageD += postPaintCoverageD - prePaintCoverageD;
        }
    }
Пример #7
0
    private int CalculateCoverage(Texture2D canvas, P3D_Rect rect)
    {
        var coverage = 0;

        for (var x = rect.XMin; x < rect.XMax; x++)
        {
            for (var y = rect.YMin; y < rect.YMax; y++)
            {
                var pixel = canvas.GetPixel(x, y);

                if (pixel.a > CutOff)
                {
                    coverage += 1;
                }
            }
        }

        return(coverage);
    }
Пример #8
0
    private bool CalculateRect(ref P3D_Rect rect)
    {
        Vector2 vector  = matrix.MultiplyPoint(0f, 0f);
        Vector2 vector2 = matrix.MultiplyPoint(1f, 0f);
        Vector2 vector3 = matrix.MultiplyPoint(0f, 1f);
        Vector2 vector4 = matrix.MultiplyPoint(1f, 1f);
        float   f       = Mathf.Min(Mathf.Min(vector.x, vector2.x), Mathf.Min(vector3.x, vector4.x));
        float   num2    = Mathf.Max(Mathf.Max(vector.x, vector2.x), Mathf.Max(vector3.x, vector4.x));
        float   num3    = Mathf.Min(Mathf.Min(vector.y, vector2.y), Mathf.Min(vector3.y, vector4.y));
        float   num4    = Mathf.Max(Mathf.Max(vector.y, vector2.y), Mathf.Max(vector3.y, vector4.y));

        if ((f >= num2) || (num3 >= num4))
        {
            return(false);
        }
        rect.XMin = Mathf.Clamp(Mathf.FloorToInt(f), 0, canvasW);
        rect.XMax = Mathf.Clamp(Mathf.CeilToInt(num2), 0, canvasW);
        rect.YMin = Mathf.Clamp(Mathf.FloorToInt(num3), 0, canvasH);
        rect.YMax = Mathf.Clamp(Mathf.CeilToInt(num4), 0, canvasH);
        return(true);
    }
    private void CalculateCoverage(Texture2D canvas, P3D_Rect rect, ref int coverageA, ref int coverageB, ref int coverageC, ref int coverageD)
    {
        coverageA = 0;
        coverageB = 0;
        coverageC = 0;
        coverageD = 0;

        for (var x = rect.XMin; x < rect.XMax; x++)
        {
            for (var y = rect.YMin; y < rect.YMax; y++)
            {
                var pixel      = canvas.GetPixel(x, y);
                var highestIdx = -1;
                var highestVal = CutOff;

                for (var i = 0; i < 4; i++)
                {
                    var val = pixel[i];

                    if (val >= highestVal)
                    {
                        highestIdx = i;
                        highestVal = val;
                    }
                }

                switch (highestIdx)
                {
                case 0: coverageA += 1; break;

                case 1: coverageB += 1; break;

                case 2: coverageC += 1; break;

                case 3: coverageD += 1; break;
                }
            }
        }
    }
Пример #10
0
 public bool Overlaps(P3D_Rect other) =>
 this.IsSet && (other.IsSet && ((this.XMax > other.XMin) ? ((this.XMin < other.XMax) ? ((this.YMax > other.YMin) ? (this.YMin < other.YMax) : false) : false) : false));
Пример #11
0
 public void Add(P3D_Rect rect)
 {
     this.Add(rect.XMin, rect.XMax, rect.YMin, rect.YMax);
 }