added var resetting;
triangles now can be scaled and rotated by dragging their edges
This commit is contained in:
		@ -316,15 +316,15 @@ type
 | 
				
			|||||||
    cmap: TColorMap;
 | 
					    cmap: TColorMap;
 | 
				
			||||||
    PreviewDensity: double;
 | 
					    PreviewDensity: double;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // --Z--
 | 
					 | 
				
			||||||
    viewDragMode, viewDragged: boolean;
 | 
					    viewDragMode, viewDragged: boolean;
 | 
				
			||||||
    editMode, oldMode: (modeNone, modeMove, modeRotate, modeScale, modePick);
 | 
					    editMode, oldMode: (modeNone, modeMove, modeRotate, modeScale, modePick);
 | 
				
			||||||
 | 
					    modeHack: boolean; // for mouseOverEdge...
 | 
				
			||||||
    modeKey: word;
 | 
					    modeKey: word;
 | 
				
			||||||
    key_handled: boolean;
 | 
					    key_handled: boolean;
 | 
				
			||||||
    updating: boolean;
 | 
					    updating: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MousePos: TPoint; // in screen coordinates
 | 
					    MousePos: TPoint; // in screen coordinates
 | 
				
			||||||
    mouseOverTriangle, mouseOverCorner: integer;
 | 
					    mouseOverTriangle, mouseOverEdge, mouseOverCorner: integer;
 | 
				
			||||||
    mouseOverPos: TSPoint;
 | 
					    mouseOverPos: TSPoint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    varDragMode: boolean;
 | 
					    varDragMode: boolean;
 | 
				
			||||||
@ -1274,37 +1274,55 @@ end;
 | 
				
			|||||||
        a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]);
 | 
					        a := ToScreen(MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]);
 | 
				
			||||||
        Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4);
 | 
					        Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4);
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      else if (mouseOverTriangle>=0) and (mouseOverCorner >= 0) then // highlight corner under cursor
 | 
					      else if (mouseOverTriangle>=0) then
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
        case mouseOverCorner of
 | 
					        if (mouseOverCorner >= 0) then // highlight corner under cursor
 | 
				
			||||||
          0: brush.Color:=clRed;
 | 
					        begin
 | 
				
			||||||
          2: brush.Color:=clBlue;
 | 
					          case mouseOverCorner of
 | 
				
			||||||
          else brush.Color:=clSilver;
 | 
					            0: brush.Color:=clRed;
 | 
				
			||||||
        end;
 | 
					            2: brush.Color:=clBlue;
 | 
				
			||||||
 | 
					            else brush.Color:=clSilver;
 | 
				
			||||||
        a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverCorner], MainTriangles[mouseOverTriangle].y[mouseOverCorner]);
 | 
					 | 
				
			||||||
        Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // hmm... TODO: optimize
 | 
					 | 
				
			||||||
        if HelpersEnabled then begin
 | 
					 | 
				
			||||||
          pen.Color := HelpersColor;
 | 
					 | 
				
			||||||
          pen.Mode := pmMerge;
 | 
					 | 
				
			||||||
          pen.Style := psDot;
 | 
					 | 
				
			||||||
          brush.Style := bsClear;
 | 
					 | 
				
			||||||
          if (editMode = modeRotate) then
 | 
					 | 
				
			||||||
          begin
 | 
					 | 
				
			||||||
            i := integer(round(olddist * sc));
 | 
					 | 
				
			||||||
            if i > 4 then begin
 | 
					 | 
				
			||||||
              a := ToScreen(pivot.x, pivot.y);
 | 
					 | 
				
			||||||
              Ellipse(a.x - i, a.y - i, a.x + i, a.y + i);
 | 
					 | 
				
			||||||
            end;
 | 
					 | 
				
			||||||
          end
 | 
					 | 
				
			||||||
          else if editMode = modeScale then
 | 
					 | 
				
			||||||
          begin
 | 
					 | 
				
			||||||
            dx := MainTriangles[mouseOverTriangle].x[mouseOverCorner] - Pivot.x;
 | 
					 | 
				
			||||||
            dy := MainTriangles[mouseOverTriangle].y[mouseOverCorner] - Pivot.y;
 | 
					 | 
				
			||||||
            LineDxDy;
 | 
					 | 
				
			||||||
          end;
 | 
					          end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverCorner], MainTriangles[mouseOverTriangle].y[mouseOverCorner]);
 | 
				
			||||||
 | 
					          Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // hmm... TODO: optimize
 | 
				
			||||||
 | 
					          if HelpersEnabled then begin
 | 
				
			||||||
 | 
					            pen.Color := HelpersColor;
 | 
				
			||||||
 | 
					            pen.Mode := pmMerge;
 | 
				
			||||||
 | 
					            pen.Style := psDot;
 | 
				
			||||||
 | 
					            brush.Style := bsClear;
 | 
				
			||||||
 | 
					            if (editMode = modeRotate) then
 | 
				
			||||||
 | 
					            begin
 | 
				
			||||||
 | 
					              i := integer(round(olddist * sc));
 | 
				
			||||||
 | 
					              if i > 4 then begin
 | 
				
			||||||
 | 
					                a := ToScreen(pivot.x, pivot.y);
 | 
				
			||||||
 | 
					                Ellipse(a.x - i, a.y - i, a.x + i, a.y + i);
 | 
				
			||||||
 | 
					              end;
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					            else if editMode = modeScale then
 | 
				
			||||||
 | 
					            begin
 | 
				
			||||||
 | 
					              dx := MainTriangles[mouseOverTriangle].x[mouseOverCorner] - Pivot.x;
 | 
				
			||||||
 | 
					              dy := MainTriangles[mouseOverTriangle].y[mouseOverCorner] - Pivot.y;
 | 
				
			||||||
 | 
					              LineDxDy;
 | 
				
			||||||
 | 
					            end;
 | 
				
			||||||
 | 
					          end;
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
 | 
					        if (mouseOverTriangle>=0) and (mouseOverEdge >= 0) then // highlight edge under cursor
 | 
				
			||||||
 | 
					        begin
 | 
				
			||||||
 | 
					          i := (mouseOverEdge + 1) mod 3;
 | 
				
			||||||
 | 
					          a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverEdge], MainTriangles[mouseOverTriangle].y[mouseOverEdge]);
 | 
				
			||||||
 | 
					          b := ToScreen(MainTriangles[mouseOverTriangle].x[i], MainTriangles[mouseOverTriangle].y[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          pen.Width:=4;
 | 
				
			||||||
 | 
					          Pen.Color:=GetTriangleColor(mouseOverTriangle) shr 1 and $7f7f7f;
 | 
				
			||||||
 | 
					          Pen.Mode:=pmMerge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          MoveTo(a.X, a.Y);
 | 
				
			||||||
 | 
					          LineTo(b.X, b.Y);
 | 
				
			||||||
 | 
					          pen.Mode:=pmCopy;
 | 
				
			||||||
 | 
					          pen.Width:=1;
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1413,6 +1431,7 @@ begin
 | 
				
			|||||||
  TriangleCaught := False;
 | 
					  TriangleCaught := False;
 | 
				
			||||||
  mouseOverTriangle := -1;
 | 
					  mouseOverTriangle := -1;
 | 
				
			||||||
  mouseOverCorner := -1;
 | 
					  mouseOverCorner := -1;
 | 
				
			||||||
 | 
					  mouseOverEdge := -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for i := 0 to NRVAR-1 do
 | 
					  for i := 0 to NRVAR-1 do
 | 
				
			||||||
    VarsCache[i] := MinDouble;
 | 
					    VarsCache[i] := MinDouble;
 | 
				
			||||||
@ -1422,7 +1441,7 @@ procedure TEditForm.TriangleViewMouseMove(Sender: TObject; Shift: TShiftState;
 | 
				
			|||||||
  X, Y: integer);
 | 
					  X, Y: integer);
 | 
				
			||||||
var
 | 
					var
 | 
				
			||||||
  vx, vy, fx, fy: double;
 | 
					  vx, vy, fx, fy: double;
 | 
				
			||||||
  mt, mc: integer;
 | 
					  mt, mc, me: integer;
 | 
				
			||||||
  a, t: double;
 | 
					  a, t: double;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  i, j: integer;
 | 
					  i, j: integer;
 | 
				
			||||||
@ -1446,6 +1465,7 @@ begin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  mt:=mouseOverTriangle;
 | 
					  mt:=mouseOverTriangle;
 | 
				
			||||||
  mc:=MouseOverCorner;
 | 
					  mc:=MouseOverCorner;
 | 
				
			||||||
 | 
					  me:=mouseOverEdge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if not (CornerCaught or TriangleCaught) then // look for a point under cursor
 | 
					  if not (CornerCaught or TriangleCaught) then // look for a point under cursor
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
@ -1460,7 +1480,8 @@ begin
 | 
				
			|||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for i := i1 downto i0 do
 | 
					    for i := i1 downto i0 do
 | 
				
			||||||
      for j := 0 to 2 do
 | 
					    begin
 | 
				
			||||||
 | 
					      for j := 0 to 2 do // -- detect point hit first
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
        d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]);
 | 
					        d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]);
 | 
				
			||||||
        if (d * GraphZoom * 50) < 4 then
 | 
					        if (d * GraphZoom * 50) < 4 then
 | 
				
			||||||
@ -1470,36 +1491,54 @@ begin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// -- from MouseDown -- for highlighting:
 | 
					// -- from MouseDown -- for highlighting:
 | 
				
			||||||
// TODO: optimize...
 | 
					// TODO: optimize...
 | 
				
			||||||
    if (j = 1) then //and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then
 | 
					          if (j = 1) then //and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then
 | 
				
			||||||
    begin
 | 
					          begin
 | 
				
			||||||
      if PivotMode = pivotLocal then begin
 | 
					            if PivotMode = pivotLocal then begin
 | 
				
			||||||
        Pivot.x := 0;
 | 
					              Pivot.x := 0;
 | 
				
			||||||
        Pivot.y := 0;
 | 
					              Pivot.y := 0;
 | 
				
			||||||
      end
 | 
					            end
 | 
				
			||||||
      else Pivot := GetPivot;
 | 
					            else Pivot := GetPivot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      LocalAxisLocked := true;
 | 
					            LocalAxisLocked := true;
 | 
				
			||||||
    end
 | 
					          end
 | 
				
			||||||
    else begin
 | 
					          else begin
 | 
				
			||||||
      Pivot := GetPivot(mouseOverTriangle);
 | 
					            Pivot := GetPivot(mouseOverTriangle);
 | 
				
			||||||
      LocalAxisLocked := false;
 | 
					            LocalAxisLocked := false;
 | 
				
			||||||
    end;
 | 
					          end;
 | 
				
			||||||
    oldx := MainTriangles[mouseOverTriangle].x[j] - Pivot.X;
 | 
					          oldx := MainTriangles[mouseOverTriangle].x[j] - Pivot.X;
 | 
				
			||||||
    oldy := MainTriangles[mouseOverTriangle].y[j] - Pivot.Y;
 | 
					          oldy := MainTriangles[mouseOverTriangle].y[j] - Pivot.Y;
 | 
				
			||||||
    olddist := Hypot(oldx, oldy);
 | 
					          olddist := Hypot(oldx, oldy);
 | 
				
			||||||
// --
 | 
					// --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// -- for Pick Pivot
 | 
					// -- for Pick Pivot
 | 
				
			||||||
    if editMode = modePick then
 | 
					          if editMode = modePick then
 | 
				
			||||||
    begin
 | 
					          begin
 | 
				
			||||||
      mouseOverPos.x := MainTriangles[mouseOverTriangle].x[mouseOverCorner];
 | 
					            mouseOverPos.x := MainTriangles[mouseOverTriangle].x[mouseOverCorner];
 | 
				
			||||||
      mouseOverPos.y := MainTriangles[mouseOverTriangle].y[mouseOverCorner];
 | 
					            mouseOverPos.y := MainTriangles[mouseOverTriangle].y[mouseOverCorner];
 | 
				
			||||||
    end;
 | 
					          end;
 | 
				
			||||||
// ---
 | 
					// ---
 | 
				
			||||||
          goto FoundCorner;
 | 
					          goto FoundCorner;
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
    mouseOverCorner:=-1;
 | 
					
 | 
				
			||||||
 | 
					      if oldMode = modeNone then {hmm} for j := 0 to 2 do // -- detect edge hit
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        if abs(line_dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j],
 | 
				
			||||||
 | 
					                              MainTriangles[i].x[(j+1) mod 3], MainTriangles[i].y[(j+1) mod 3])
 | 
				
			||||||
 | 
					                    ) * GraphZoom * 50 < 2 then
 | 
				
			||||||
 | 
					        begin
 | 
				
			||||||
 | 
					          mouseOverTriangle:=i;
 | 
				
			||||||
 | 
					          mouseOverEdge := j;
 | 
				
			||||||
 | 
					          mouseOverCorner:= -1;
 | 
				
			||||||
 | 
					          mouseOverPos.x := fx;
 | 
				
			||||||
 | 
					          mouseOverPos.y := fy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          goto FoundCorner;
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					    mouseOverEdge := -1;
 | 
				
			||||||
 | 
					    mouseOverCorner:= -1;
 | 
				
			||||||
    mouseOverPos.x := fx;
 | 
					    mouseOverPos.x := fx;
 | 
				
			||||||
    mouseOverPos.y := fy;
 | 
					    mouseOverPos.y := fy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1511,6 +1550,13 @@ FoundCorner:
 | 
				
			|||||||
  end;
 | 
					  end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mouseOverTriangle >= 0) or (SelectMode = false) or (oldMode <> modeNone) then
 | 
					  if (mouseOverTriangle >= 0) or (SelectMode = false) or (oldMode <> modeNone) then
 | 
				
			||||||
 | 
					    if mouseOverEdge >= 0 then begin // kinda hack, not good...
 | 
				
			||||||
 | 
					      if mouseOverEdge = 2 then
 | 
				
			||||||
 | 
					        TriangleView.Cursor := crEditScale
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        TriangleView.Cursor := crEditRotate;
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
    case editMode of
 | 
					    case editMode of
 | 
				
			||||||
      modeMove:
 | 
					      modeMove:
 | 
				
			||||||
        TriangleView.Cursor := crEditMove;
 | 
					        TriangleView.Cursor := crEditMove;
 | 
				
			||||||
@ -1718,7 +1764,7 @@ Skip2:
 | 
				
			|||||||
    StatusBar.Refresh;
 | 
					    StatusBar.Refresh;
 | 
				
			||||||
    exit;
 | 
					    exit;
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
  if ((mt <> mouseOverTriangle) or (mc <> MouseOverCorner)) then
 | 
					  if ((mt <> mouseOverTriangle) or (mc <> MouseOverCorner) or (me <> MouseOverEdge)) then
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
    if (mouseOverTriangle >= 0) then
 | 
					    if (mouseOverTriangle >= 0) then
 | 
				
			||||||
      StatusBar.Panels[2].Text := Format('Transform #%d', [mouseOverTriangle+1])
 | 
					      StatusBar.Panels[2].Text := Format('Transform #%d', [mouseOverTriangle+1])
 | 
				
			||||||
@ -1734,6 +1780,8 @@ var
 | 
				
			|||||||
  d, fx, fy: double;
 | 
					  d, fx, fy: double;
 | 
				
			||||||
  i, j: integer;
 | 
					  i, j: integer;
 | 
				
			||||||
  i0, i1: integer;
 | 
					  i0, i1: integer;
 | 
				
			||||||
 | 
					label
 | 
				
			||||||
 | 
					  FoundTriangle;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  TWinControl(Sender).SetFocus;
 | 
					  TWinControl(Sender).SetFocus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1741,35 +1789,35 @@ begin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  Scale(fx, fy, x, y);
 | 
					  Scale(fx, fy, x, y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if editMode = modePick then
 | 
					 | 
				
			||||||
  begin
 | 
					 | 
				
			||||||
    if (mouseOverCorner >= 0) then // snap to point
 | 
					 | 
				
			||||||
    begin
 | 
					 | 
				
			||||||
      fx := MainTriangles[mouseOverTriangle].x[mouseOverCorner];
 | 
					 | 
				
			||||||
      fy := MainTriangles[mouseOverTriangle].y[mouseOverCorner];
 | 
					 | 
				
			||||||
    end;
 | 
					 | 
				
			||||||
    if PivotMode = pivotLocal then
 | 
					 | 
				
			||||||
    with MainTriangles[SelectedTriangle] do begin
 | 
					 | 
				
			||||||
      LocalPivot.x :=
 | 
					 | 
				
			||||||
        ((fx - x[1]) - (x[2]-x[1])/(y[2]-y[1])*(fy - y[1]))/
 | 
					 | 
				
			||||||
        ((x[0]-x[1]) - (x[2]-x[1])/(y[2]-y[1])*(y[0]-y[1]));
 | 
					 | 
				
			||||||
      LocalPivot.y :=
 | 
					 | 
				
			||||||
        ((fy - y[1]) - (y[0]-y[1])*LocalPivot.x)/(y[2]-y[1]);
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    else begin
 | 
					 | 
				
			||||||
      WorldPivot.x := fx;
 | 
					 | 
				
			||||||
      WorldPivot.y := fy;
 | 
					 | 
				
			||||||
    end;
 | 
					 | 
				
			||||||
    editMode := oldMode;
 | 
					 | 
				
			||||||
    oldMode := modeNone;
 | 
					 | 
				
			||||||
    btnPickPivot.Down := false;
 | 
					 | 
				
			||||||
    ShowSelectedInfo;
 | 
					 | 
				
			||||||
    TriangleView.Invalidate;
 | 
					 | 
				
			||||||
    exit;
 | 
					 | 
				
			||||||
  end;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if Button = mbLeft then
 | 
					  if Button = mbLeft then
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
 | 
					    if editMode = modePick then
 | 
				
			||||||
 | 
					    begin
 | 
				
			||||||
 | 
					      if (mouseOverCorner >= 0) then // snap to point
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        fx := MainTriangles[mouseOverTriangle].x[mouseOverCorner];
 | 
				
			||||||
 | 
					        fy := MainTriangles[mouseOverTriangle].y[mouseOverCorner];
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					      if PivotMode = pivotLocal then
 | 
				
			||||||
 | 
					      with MainTriangles[SelectedTriangle] do begin
 | 
				
			||||||
 | 
					        LocalPivot.x :=
 | 
				
			||||||
 | 
					          ((fx - x[1]) - (x[2]-x[1])/(y[2]-y[1])*(fy - y[1]))/
 | 
				
			||||||
 | 
					          ((x[0]-x[1]) - (x[2]-x[1])/(y[2]-y[1])*(y[0]-y[1]));
 | 
				
			||||||
 | 
					        LocalPivot.y :=
 | 
				
			||||||
 | 
					          ((fy - y[1]) - (y[0]-y[1])*LocalPivot.x)/(y[2]-y[1]);
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      else begin
 | 
				
			||||||
 | 
					        WorldPivot.x := fx;
 | 
				
			||||||
 | 
					        WorldPivot.y := fy;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					      editMode := oldMode;
 | 
				
			||||||
 | 
					      oldMode := modeNone;
 | 
				
			||||||
 | 
					      btnPickPivot.Down := false;
 | 
				
			||||||
 | 
					      ShowSelectedInfo;
 | 
				
			||||||
 | 
					      TriangleView.Invalidate;
 | 
				
			||||||
 | 
					      exit;
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Shift := Shift - [ssLeft];
 | 
					    Shift := Shift - [ssLeft];
 | 
				
			||||||
    if SelectMode then
 | 
					    if SelectMode then
 | 
				
			||||||
    begin
 | 
					    begin
 | 
				
			||||||
@ -1781,9 +1829,9 @@ begin
 | 
				
			|||||||
      i1:=i0;
 | 
					      i1:=i0;
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Find a corner
 | 
					 | 
				
			||||||
    for i := i1 downto i0 do
 | 
					    for i := i1 downto i0 do
 | 
				
			||||||
      for j := 0 to 2 do
 | 
					    begin
 | 
				
			||||||
 | 
					      for j := 0 to 2 do // detect corner hit
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
        d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]);
 | 
					        d := dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j]);
 | 
				
			||||||
        if (d * GraphZoom * 50) < 4 then
 | 
					        if (d * GraphZoom * 50) < 4 then
 | 
				
			||||||
@ -1818,6 +1866,23 @@ begin
 | 
				
			|||||||
          exit;
 | 
					          exit;
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					      if oldMode = modeNone then {hmm} for j := 0 to 2 do // -- detect edge hit
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        if abs(line_dist(fx, fy, MainTriangles[i].x[j], MainTriangles[i].y[j],
 | 
				
			||||||
 | 
					                              MainTriangles[i].x[(j+1) mod 3], MainTriangles[i].y[(j+1) mod 3])
 | 
				
			||||||
 | 
					                    ) * GraphZoom * 50 < 2 then
 | 
				
			||||||
 | 
					        begin
 | 
				
			||||||
 | 
					          SelectedTriangle := i;
 | 
				
			||||||
 | 
					          modeHack := true;
 | 
				
			||||||
 | 
					          oldMode := editMode;
 | 
				
			||||||
 | 
					          if j = 2 then
 | 
				
			||||||
 | 
					            editMode := modeScale
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            editMode := modeRotate;
 | 
				
			||||||
 | 
					          goto FoundTriangle;
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // so user hasn't selected any corners,
 | 
					    // so user hasn't selected any corners,
 | 
				
			||||||
    // let's check for triangles then!
 | 
					    // let's check for triangles then!
 | 
				
			||||||
@ -1829,6 +1894,7 @@ begin
 | 
				
			|||||||
      else
 | 
					      else
 | 
				
			||||||
        if (oldMode = modeNone) and not(ssShift in Shift) then exit;
 | 
					        if (oldMode = modeNone) and not(ssShift in Shift) then exit;
 | 
				
			||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					FoundTriangle:
 | 
				
			||||||
    TriangleCaught := True;
 | 
					    TriangleCaught := True;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OldTriangle := MainTriangles[SelectedTriangle];
 | 
					    OldTriangle := MainTriangles[SelectedTriangle];
 | 
				
			||||||
@ -1860,6 +1926,14 @@ procedure TEditForm.TriangleViewMouseUp(Sender: TObject; Button: TMouseButton;
 | 
				
			|||||||
begin
 | 
					begin
 | 
				
			||||||
  if Button = mbLeft then
 | 
					  if Button = mbLeft then
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
 | 
					    if modeHack then begin
 | 
				
			||||||
 | 
					      assert(oldMode <> modeNone);
 | 
				
			||||||
 | 
					      editMode := oldMode;
 | 
				
			||||||
 | 
					      oldMode := modeNone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      modeHack := false;
 | 
				
			||||||
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CornerCaught := False;
 | 
					    CornerCaught := False;
 | 
				
			||||||
    TriangleCaught := False;
 | 
					    TriangleCaught := False;
 | 
				
			||||||
    if HasChanged then
 | 
					    if HasChanged then
 | 
				
			||||||
@ -2330,11 +2404,12 @@ var
 | 
				
			|||||||
  i: integer;
 | 
					  i: integer;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  MainForm.UpdateUndo;
 | 
					  MainForm.UpdateUndo;
 | 
				
			||||||
  for i := -1 to Transforms - 1 do
 | 
					  for i := -1 to Transforms do
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
    MainTriangles[i] := FlipTriangleVertical(MainTriangles[i]);
 | 
					    MainTriangles[i] := FlipTriangleVertical(MainTriangles[i]);
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
  //cp.TrianglesFromCP(MainTriangles);
 | 
					  cp.GetFromTriangles(MainTriangles, Transforms);
 | 
				
			||||||
 | 
					  cp.TrianglesFromCP(MainTriangles);
 | 
				
			||||||
  AutoZoom;
 | 
					  AutoZoom;
 | 
				
			||||||
  UpdateFlame(True);
 | 
					  UpdateFlame(True);
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
@ -2344,11 +2419,12 @@ var
 | 
				
			|||||||
  i: integer;
 | 
					  i: integer;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  MainForm.UpdateUndo;
 | 
					  MainForm.UpdateUndo;
 | 
				
			||||||
  for i := -1 to Transforms - 1 do
 | 
					  for i := -1 to Transforms do
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
    MainTriangles[i] := FlipTriangleHorizontal(MainTriangles[i]);
 | 
					    MainTriangles[i] := FlipTriangleHorizontal(MainTriangles[i]);
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
  //cp.TrianglesFromCP(MainTriangles);
 | 
					  cp.GetFromTriangles(MainTriangles, Transforms);
 | 
				
			||||||
 | 
					  cp.TrianglesFromCP(MainTriangles);
 | 
				
			||||||
  AutoZoom;
 | 
					  AutoZoom;
 | 
				
			||||||
  UpdateFlame(True);
 | 
					  UpdateFlame(True);
 | 
				
			||||||
end;
 | 
					end;
 | 
				
			||||||
@ -2847,8 +2923,8 @@ begin
 | 
				
			|||||||
end;
 | 
					end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
procedure TEditForm.VEVarsDblClick(Sender: TObject);
 | 
					procedure TEditForm.VEVarsDblClick(Sender: TObject);
 | 
				
			||||||
var
 | 
					//var
 | 
				
			||||||
  v: double;
 | 
					//  v: double;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  if (TValueListEditor(Sender).Values[VarNames(varDragIndex)] = '0') or
 | 
					  if (TValueListEditor(Sender).Values[VarNames(varDragIndex)] = '0') or
 | 
				
			||||||
     (varDragOld >=  TValueListEditor(Sender).ColWidths[0]) then exit;
 | 
					     (varDragOld >=  TValueListEditor(Sender).ColWidths[0]) then exit;
 | 
				
			||||||
@ -2860,9 +2936,9 @@ begin
 | 
				
			|||||||
    VEVars.Values[VarNames(varDragIndex)] := '0';
 | 
					    VEVars.Values[VarNames(varDragIndex)] := '0';
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  else begin
 | 
					  else begin
 | 
				
			||||||
    v := 0; // hmm
 | 
					    //v := 0; // hmm
 | 
				
			||||||
    cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[varDragIndex+1], v);
 | 
					    cp.xform[SelectedTriangle].ResetVariable(vleVariables.Keys[varDragIndex+1]);
 | 
				
			||||||
    vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := '0';
 | 
					    //vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := '0';
 | 
				
			||||||
  end;
 | 
					  end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UpdateFlame(true);
 | 
					  UpdateFlame(true);
 | 
				
			||||||
@ -3384,7 +3460,7 @@ var
 | 
				
			|||||||
  i: integer;
 | 
					  i: integer;
 | 
				
			||||||
begin
 | 
					begin
 | 
				
			||||||
  MainForm.UpdateUndo;
 | 
					  MainForm.UpdateUndo;
 | 
				
			||||||
  for i := 0 to Transforms-1 do cp.xform[i].Clear;//density := 0;
 | 
					  for i := 0 to Transforms do cp.xform[i].Clear;
 | 
				
			||||||
  cp.xform[0].vars[0] := 1;
 | 
					  cp.xform[0].vars[0] := 1;
 | 
				
			||||||
  cp.xform[0].density := 0.5;
 | 
					  cp.xform[0].density := 0.5;
 | 
				
			||||||
  cp.xform[1].vars[0] := 1;
 | 
					  cp.xform[1].vars[0] := 1;
 | 
				
			||||||
@ -3399,36 +3475,7 @@ begin
 | 
				
			|||||||
  MainTriangles[2] := MainTriangles[-1];
 | 
					  MainTriangles[2] := MainTriangles[-1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert(cp.HasFinalXForm = false);
 | 
					  assert(cp.HasFinalXForm = false);
 | 
				
			||||||
{  with cp.xform[0] do begin
 | 
					
 | 
				
			||||||
    density := 0.5;
 | 
					 | 
				
			||||||
    color := 0;
 | 
					 | 
				
			||||||
    symmetry := 0;
 | 
					 | 
				
			||||||
    vars[0] := 1;
 | 
					 | 
				
			||||||
    p[0, 0] := 1;
 | 
					 | 
				
			||||||
    p[0, 1] := 0;
 | 
					 | 
				
			||||||
    p[1, 0] := 0;
 | 
					 | 
				
			||||||
    p[1, 1] := 1;
 | 
					 | 
				
			||||||
    p[2, 0] := 0;
 | 
					 | 
				
			||||||
    p[2, 1] := 0;
 | 
					 | 
				
			||||||
  end;
 | 
					 | 
				
			||||||
  with cp.xform[1] do begin
 | 
					 | 
				
			||||||
    density := 0.5;
 | 
					 | 
				
			||||||
    color := 1;
 | 
					 | 
				
			||||||
    symmetry := 0;
 | 
					 | 
				
			||||||
    vars[0] := 1;
 | 
					 | 
				
			||||||
    p[0, 0] := 1;
 | 
					 | 
				
			||||||
    p[0, 1] := 0;
 | 
					 | 
				
			||||||
    p[1, 0] := 0;
 | 
					 | 
				
			||||||
    p[1, 1] := 1;
 | 
					 | 
				
			||||||
    p[2, 0] := 0;
 | 
					 | 
				
			||||||
    p[2, 1] := 0;
 | 
					 | 
				
			||||||
  end;
 | 
					 | 
				
			||||||
  for i := 1 to NRVAR - 1 do
 | 
					 | 
				
			||||||
  begin
 | 
					 | 
				
			||||||
    cp.xform[0].vars[i] := 0;
 | 
					 | 
				
			||||||
    cp.xform[1].vars[i] := 0;
 | 
					 | 
				
			||||||
  end;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
  cbTransforms.clear;
 | 
					  cbTransforms.clear;
 | 
				
			||||||
  cbTransforms.Items.Add('1');
 | 
					  cbTransforms.Items.Add('1');
 | 
				
			||||||
  cbTransforms.Items.Add('2');
 | 
					  cbTransforms.Items.Add('2');
 | 
				
			||||||
@ -3901,7 +3948,7 @@ var
 | 
				
			|||||||
begin
 | 
					begin
 | 
				
			||||||
  if (Sender = pnlWeight) then
 | 
					  if (Sender = pnlWeight) then
 | 
				
			||||||
  begin
 | 
					  begin
 | 
				
			||||||
    if SelectedTriangle = LastTriangle then exit; // hmm
 | 
					    if SelectedTriangle >= Transforms then exit; // hmm
 | 
				
			||||||
    pValue := @cp.xform[SelectedTriangle].density;
 | 
					    pValue := @cp.xform[SelectedTriangle].density;
 | 
				
			||||||
    if pValue^ = 0.5 then exit;
 | 
					    if pValue^ = 0.5 then exit;
 | 
				
			||||||
    pValue^ := 0.5;
 | 
					    pValue^ := 0.5;
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user