Explorar el Código

#258 fix extreme deformation

circular17 hace 3 años
padre
commit
a88f8dcfbe
Se han modificado 1 ficheros con 26 adiciones y 0 borrados
  1. 26 0
      lazpaint/tools/utooldeformationgrid.pas

+ 26 - 0
lazpaint/tools/utooldeformationgrid.pas

@@ -1090,6 +1090,32 @@ begin
                   DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]],backupLayer,dmDrawWithTransparency);
             gridDone[yb,xb] := true;
           end;
+      //drawing zones that are inverted
+      for yb := gridMinY to gridMaxY-1 do
+        for xb := gridMinX to gridMaxX-1 do
+          if not gridDone[yb,xb] and
+             not IsMostlyClockwise([DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+                DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]]) then
+          begin
+            layer.FillQuadLinearMapping(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+                  DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb],backupLayer,
+                  DeformationGridTexCoord[yb,xb],DeformationGridTexCoord[yb,xb+1],DeformationGridTexCoord[yb+1,xb+1],
+                  DeformationGridTexCoord[yb+1,xb],true, fcKeepCW);
+            gridDone[yb,xb] := true;
+          end;
+      //drawing zones that are intersecting
+      for yb := gridMinY to gridMaxY-1 do
+        for xb := gridMinX to gridMaxX-1 do
+          if not gridDone[yb,xb] and
+             DoesQuadIntersect(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+                DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb]) then
+          begin
+            layer.FillQuadLinearMapping(DeformationGrid[yb,xb],DeformationGrid[yb,xb+1],
+                  DeformationGrid[yb+1,xb+1],DeformationGrid[yb+1,xb],backupLayer,
+                  DeformationGridTexCoord[yb,xb],DeformationGridTexCoord[yb,xb+1],DeformationGridTexCoord[yb+1,xb+1],
+                  DeformationGridTexCoord[yb+1,xb],true, fcKeepCW);
+            gridDone[yb,xb] := true;
+          end;
       //drawing zones that are concave
       for yb := gridMinY to gridMaxY-1 do
         for xb := gridMinX to gridMaxX-1 do