This is the plugin file. This function is supposed to take all the touching points and group them into ATPAs... But the problem is, is that it outputs it like a tpa instead. It will list every single point instead of a list of every tpa... Even though the type is a atpa
IF ANYONE CAN ACTUALLY UNDERSTAND THIS PLEASE HELP! (benland lol)
yes i tested this in scar, it works perfectly (just a tad slow
)
SCAR Code:
//SCAR Plugin. Created for SCAR Divi by Kaitnieks & Freddy1990
//Check "Accessable SCAR Functions.txt" for which functions you can call from SCAR
library TestPlugin;
uses
FastShareMem,
SysUtils,
Classes,
Windows,
Graphics;
{$R *.res}
type
TPointArray = array of TPoint;
T2DPointArray = array of TPointArray;
TBoolArray = array of boolean;
T2DBoolArray = array of TBoolArray;
//---------------------------------------
// Functions to be called from SCAR
//demonstration of procedure
function TPATo2DBoolean(TPA : TPointArray; SizeX, SizeY : Integer) : T2DBoolArray;
var i : integer;
begin
SetLength(result, SizeX + 2);
for i := 0 to SizeX + 1 do
SetLength(Result[i], SizeY + 2);
for i := 0 to High(TPA) do
result[TPA[i].x][TPA[i].y] := true;
end;
function PointLeft(Bools : T2DBoolArray) : TPoint;
var i, j : integer;
begin
for i := 0 to High(Bools) do
for j := 0 to High(Bools[i]) do
if Bools[i][j] then
begin
result.x := i;
result.y := j;
exit;
end;
result.x := -1;
result.y := -1;
end;
function ConnectedPoints2(TPA1 : TPointArray; StartX, StartY, SizeX, SizeY : Integer) : T2DPointArray; stdcall;
var IsPoint : T2DBoolArray;
j, k : integer;
TPA2 : TPointArray;
begin
IsPoint := TPATo2DBoolean(TPA1, SizeX, SizeY);
SetLength(TPA2, 1);
k := 0;
if Length(TPA1) > 0 then
begin
TPA2[0] := PointLeft(IsPoint);
repeat
k := k + 1;
SetLength(Result, k);
IsPoint[TPA2[0].x- StartX][TPA2[0].y - StartY] := false;
for j := 0 to high(TPA2) do
begin
if IsPoint[TPA2[j].x+1 - StartX][TPA2[j].y - StartY] then
begin
IsPoint[TPA2[j].x+1 - StartX][TPA2[j].y - StartY] := false;
SetLength(TPA2, Length(TPA2)+1);
TPA2[high(TPA2)].x := TPA2[j].x + 1;
TPA2[high(TPA2)].y := TPA2[j].y;
end;
if IsPoint[TPA2[j].x-1 - StartX][TPA2[j].y - StartY] then
begin
IsPoint[TPA2[j].x-1 - StartX][TPA2[j].y - StartY] := false;
SetLength(TPA2, Length(TPA2)+1);
TPA2[high(TPA2)].x := TPA2[j].x - 1;
TPA2[high(TPA2)].y := TPA2[j].y;
end;
if IsPoint[TPA2[j].x - StartX][TPA2[j].y+1 - StartY] then
begin
IsPoint[TPA2[j].x - StartX][TPA2[j].y+1 - StartY] := false;
SetLength(TPA2, Length(TPA2)+1);
TPA2[high(TPA2)].x := TPA2[j].x;
TPA2[high(TPA2)].y := TPA2[j].y + 1;
end;
if IsPoint[TPA2[j].x - StartX][TPA2[j].y-1 - StartY] then
begin
IsPoint[TPA2[j].x - StartX][TPA2[j].y-1 - StartY] := false;
SetLength(TPA2, Length(TPA2)+1);
TPA2[high(TPA2)].x := TPA2[j].x;
TPA2[high(TPA2)].y := TPA2[j].y - 1;
end;
end;
Result[k-1] := TPA2;
SetLength(TPA2, 1);
TPA2[0] := PointLeft(IsPoint);
until (TPA2[0].x = -1) and (TPA2[0].y = -1)
end;
end;
//********************************
// Change this accordingly to your function count
function GetFunctionCount(): Integer; stdcall; export;
begin
Result := 1;
end;
//*******************************
// Change this accordingly to your function definitions
function GetFunctionInfo(x: Integer; var ProcAddr: Pointer; var ProcDef: PChar): Integer; stdcall;
begin
case x of
0:
begin
ProcAddr := @ConnectedPoints2;
StrPCopy(ProcDef, 'function ConnectedPoints2(TPA1 : TPointArray; StartX, StartY, SizeX, SizeY : Integer) : T2DPointArray;');
end;
else
x := -1;
end;
Result := x;
end;
//***************************
// Don't change below this
exports GetFunctionCount;
exports GetFunctionInfo;
end.