@@ -55,14 +55,27 @@ function TKDTree.InitBranch(): Integer;
5555function TKDTree.Copy(): TKDTree;
5656procedure TKDTree.Init(const AData: TKDItems);
5757function TKDTree.IndexOf(const Value: TSingleArray): Integer;
58- function TKDTree.KNearest(Vector: TSingleArray; K: Integer; NotEqual: Boolean = False ): TKDItems;
59- function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; NotEqual: Boolean = False ): TIntegerArray;
60- function TKDTree.RangeQuery(Low, High: TSingleArray): TKDItems;
61- function TKDTree.RangeQueryEx(Center: TSingleArray; Radii: TSingleArray; Hide: Boolean ): TKDItems;
58+ function TKDTree.KNearest(Vector: TSingleArray; K: Integer; Setting: TTreeSettings=[]; WorkingRef:Int32=NONE ): TKDItems;
59+ function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; Setting: TTreeSettings=[]; WorkingRef:Int32=NONE ): TIntegerArray;
60+ function TKDTree.RangeQuery(Low, High: TSingleArray; Setting: TTreeSettings = []; WorkingRef: Integer = NONE ): TKDItems;
61+ function TKDTree.RangeQueryEx(Center: TSingleArray; Radii: TSingleArray; Setting: TTreeSettings = []; WorkingRef: Integer = NONE ): TKDItems;
6262function TKDTree.KNearestClassify(Vector: TSingleArray; K: Integer): Integer;
6363function TKDTree.WeightedKNearestClassify(Vector: TSingleArray; K: Integer): Integer;
6464function TKDTree.Clusters(Radii: TSingleArray): T2DKDItems;
6565```
66+
67+ The flags you can set:
68+ ```
69+ ETreeSetting = (
70+ tsNotEqual, // if this exact vector is matched it should be ignored and not returned
71+ tsHideResult, // hides all the resulting nodes if this flag is set
72+ tsRefSensitive, // you may pass a reference group and only scan within it's ID
73+ tsIgnoreHidden // ignores that the node is hidden
74+ );
75+
76+ TTreeSettings = set of ETreeSetting;
77+ ```
78+
6679*)
6780
6881(*
@@ -128,33 +141,42 @@ procedure _LapeKDTreeIndexOf(const Params: PParamArray; const Result: Pointer);
128141 PInteger(Result)^ := TKDTree(Params^[0 ]^).IndexOf(TSingleArray(Params^[1 ]^));
129142end ;
130143
144+ (*
145+ TKDTree.KNearest
146+ ---------------------
147+ ```
148+ function TKDTree.KNearest(Vector: TSingleArray; K: Integer; Setting: TTreeSettings=[]; WorkingRef:Int32=NONE): TIntegerArray;
149+ ```
150+
151+ Returns an array that with the k elements (vectors) that are nearby the given vector.
152+ *)
131153procedure _LapeKDTreeKNearest (const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
132154begin
133- TKDItems(Result^) := TKDTree(Params^[0 ]^).KNearest(TSingleArray(Params^[1 ]^), Integer(Params^[2 ]^), Boolean (Params^[3 ]^));
155+ TKDItems(Result^) := TKDTree(Params^[0 ]^).KNearest(TSingleArray(Params^[1 ]^), Integer(Params^[2 ]^), TTreeSettings (Params^[3 ]^), Integer(Params^[ 4 ]^));
134156end ;
135157
136158(*
137159TKDTree.KNearestIndex
138160---------------------
139161```
140- function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; NotEqual: Boolean = False ): TIntegerArray;
162+ function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; Setting: TTreeSettings=[]; WorkingRef:Int32=NONE ): TIntegerArray;
141163```
142164
143165Returns an array that with indices that can be used to access the kdtree data directly if needed. As an alterantive to getting the vector itself.
144166*)
145167procedure _LapeKDTreeKNearestIndex (const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
146168begin
147- TIntegerArray(Result^) := TKDTree(Params^[0 ]^).KNearestIndex(TSingleArray(Params^[1 ]^), Integer(Params^[2 ]^), Boolean (Params^[3 ]^));
169+ TIntegerArray(Result^) := TKDTree(Params^[0 ]^).KNearestIndex(TSingleArray(Params^[1 ]^), Integer(Params^[2 ]^), TTreeSettings (Params^[3 ]^), Integer(Params^[ 4 ]^));
148170end ;
149171
150172procedure _LapeKDTreeRangeQuery (const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
151173begin
152- TKDItems(Result^) := TKDTree(Params^[0 ]^).RangeQuery(TSingleArray(Params^[1 ]^), TSingleArray(Params^[2 ]^));
174+ TKDItems(Result^) := TKDTree(Params^[0 ]^).RangeQuery(TSingleArray(Params^[1 ]^), TSingleArray(Params^[2 ]^), TTreeSettings(Params^[ 3 ]^), Integer(Params^[ 4 ]^) );
153175end ;
154176
155177procedure _LapeKDTreeRangeQueryEx (const Params: PParamArray; const Result: Pointer); LAPE_WRAPPER_CALLING_CONV
156178begin
157- TKDItems(Result^) := TKDTree(Params^[0 ]^).RangeQueryEx(TSingleArray(Params^[1 ]^), TSingleArray(Params^[2 ]^), Boolean (Params^[3 ]^));
179+ TKDItems(Result^) := TKDTree(Params^[0 ]^).RangeQueryEx(TSingleArray(Params^[1 ]^), TSingleArray(Params^[2 ]^), TTreeSettings (Params^[3 ]^), Integer(Params^[ 4 ]^));
158180end ;
159181
160182(*
@@ -224,6 +246,8 @@ procedure ImportKDTree(Script: TSimbaScript);
224246 with Script.Compiler do
225247 begin
226248 // DumpSection := 'KDTree';
249+ addGlobalType(' (NotEqual, HideResult, RefSensitive, IgnoreHidden);' , ' ETreeSetting' );
250+ addGlobalType(' set of ETreeSetting;' , ' TTreeSettings' );
227251
228252 addGlobalType(' record Ref: Integer; Vector: TSingleArray; end;' , ' TKDItem' );
229253 addGlobalType(' record Split: TKDItem; L, R: Integer; Hidden: Boolean; end;' , ' TKDNode' );
@@ -237,10 +261,10 @@ procedure ImportKDTree(Script: TSimbaScript);
237261
238262 addGlobalFunc(' function TKDTree.Copy(): TKDTree;' , @_LapeKDTreeCopy);
239263 addGlobalFunc(' function TKDTree.IndexOf(const Value: TSingleArray): Integer;' , @_LapeKDTreeIndexOf);
240- addGlobalFunc(' function TKDTree.KNearest(Vector: TSingleArray; K: Integer; NotEqual: Boolean = False ): TKDItems;' , @_LapeKDTreeKNearest);
241- addGlobalFunc(' function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; NotEqual: Boolean = False ): TIntegerArray;' , @_LapeKDTreeKNearestIndex);
242- addGlobalFunc(' function TKDTree.RangeQuery(Low, High: TSingleArray): TKDItems;' , @_LapeKDTreeRangeQuery);
243- addGlobalFunc(' function TKDTree.RangeQueryEx(Center: TSingleArray; Radii: TSingleArray; Hide: Boolean ): TKDItems;' , @_LapeKDTreeRangeQueryEx);
264+ addGlobalFunc(' function TKDTree.KNearest(Vector: TSingleArray; K: Integer; Setting: TTreeSettings = []; WorkingRef: Integer = -1 ): TKDItems;' , @_LapeKDTreeKNearest);
265+ addGlobalFunc(' function TKDTree.KNearestIndex(Vector: TSingleArray; K: Integer; Setting: TTreeSettings = []; WorkingRef: Integer = -1 ): TIntegerArray;' , @_LapeKDTreeKNearestIndex);
266+ addGlobalFunc(' function TKDTree.RangeQuery(Low, High: TSingleArray; Setting: TTreeSettings = []; WorkingRef: Integer = -1 ): TKDItems;' , @_LapeKDTreeRangeQuery);
267+ addGlobalFunc(' function TKDTree.RangeQueryEx(Center: TSingleArray; Radii: TSingleArray; Setting: TTreeSettings = []; WorkingRef: Integer = -1 ): TKDItems;' , @_LapeKDTreeRangeQueryEx);
244268 addGlobalFunc(' function TKDTree.KNearestClassify(Vector: TSingleArray; K: Integer): Integer;' , @_LapeKDTreeKNearestClassify);
245269 addGlobalFunc(' function TKDTree.WeightedKNearestClassify(Vector: TSingleArray; K: Integer): Integer;' , @_LapeKDTreeWeightedKNearestClassify);
246270 addGlobalFunc(' function TKDTree.Clusters(Radii: TSingleArray): T2DKDItems;' , @_LapeKDTreeClusters);
0 commit comments