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); } }
private void PrePaint(Texture2D canvas, P3D_Rect rect) { if (canvas == TargetTexture) { prePaintCoverage = CalculateCoverage(canvas, rect); } }
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); }
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; } }
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); }
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; } } } }
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));
public void Add(P3D_Rect rect) { this.Add(rect.XMin, rect.XMax, rect.YMin, rect.YMax); }