@srsergio/taptapp-ar 1.0.85 → 1.0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/compiler/node-worker.js +5 -18
  2. package/dist/compiler/offline-compiler.d.ts +0 -48
  3. package/dist/compiler/offline-compiler.js +12 -208
  4. package/dist/{compiler → core}/detector/detector-lite.d.ts +6 -0
  5. package/dist/{compiler → core}/detector/detector-lite.js +9 -9
  6. package/dist/{compiler → core}/matching/matching.js +1 -1
  7. package/dist/core/protocol.d.ts +43 -0
  8. package/dist/core/protocol.js +195 -0
  9. package/dist/{compiler → core}/tracker/tracker.js +3 -2
  10. package/dist/index.d.ts +3 -2
  11. package/dist/index.js +3 -2
  12. package/dist/react/use-ar.js +1 -1
  13. package/dist/{compiler → runtime}/controller.d.ts +10 -6
  14. package/dist/{compiler → runtime}/controller.js +76 -22
  15. package/dist/{compiler → runtime}/controller.worker.js +33 -3
  16. package/dist/runtime/index.d.ts +4 -0
  17. package/dist/runtime/index.js +4 -0
  18. package/dist/{compiler → runtime}/simple-ar.js +1 -1
  19. package/package.json +1 -1
  20. package/src/compiler/node-worker.js +5 -19
  21. package/src/compiler/offline-compiler.ts +12 -241
  22. package/src/{compiler → core}/detector/detector-lite.js +10 -10
  23. package/src/{compiler → core}/matching/matching.js +1 -1
  24. package/src/core/protocol.ts +223 -0
  25. package/src/{compiler → core}/tracker/tracker.js +3 -2
  26. package/src/index.ts +3 -2
  27. package/src/react/use-ar.ts +2 -2
  28. package/src/{compiler → runtime}/controller.ts +85 -24
  29. package/src/{compiler → runtime}/controller.worker.js +45 -3
  30. package/src/runtime/index.ts +4 -0
  31. package/src/{compiler → runtime}/simple-ar.ts +1 -1
  32. package/dist/compiler/utils/fourier-encoder.d.ts +0 -25
  33. package/dist/compiler/utils/fourier-encoder.js +0 -47
  34. package/src/compiler/utils/fourier-encoder.ts +0 -53
  35. /package/dist/compiler/{index.d.ts → offline-compiler-browsertest.d.ts} +0 -0
  36. /package/dist/compiler/{index.js → offline-compiler-browsertest.js} +0 -0
  37. /package/dist/{compiler → core}/detector/crop-detector.d.ts +0 -0
  38. /package/dist/{compiler → core}/detector/crop-detector.js +0 -0
  39. /package/dist/{compiler → core}/detector/freak.d.ts +0 -0
  40. /package/dist/{compiler → core}/detector/freak.js +0 -0
  41. /package/dist/{compiler → core}/estimation/estimate.d.ts +0 -0
  42. /package/dist/{compiler → core}/estimation/estimate.js +0 -0
  43. /package/dist/{compiler → core}/estimation/estimator.d.ts +0 -0
  44. /package/dist/{compiler → core}/estimation/estimator.js +0 -0
  45. /package/dist/{compiler → core}/estimation/refine-estimate.d.ts +0 -0
  46. /package/dist/{compiler → core}/estimation/refine-estimate.js +0 -0
  47. /package/dist/{compiler → core}/estimation/utils.d.ts +0 -0
  48. /package/dist/{compiler → core}/estimation/utils.js +0 -0
  49. /package/dist/{compiler → core}/features/auto-rotation-feature.d.ts +0 -0
  50. /package/dist/{compiler → core}/features/auto-rotation-feature.js +0 -0
  51. /package/dist/{compiler → core}/features/crop-detection-feature.d.ts +0 -0
  52. /package/dist/{compiler → core}/features/crop-detection-feature.js +0 -0
  53. /package/dist/{compiler → core}/features/feature-base.d.ts +0 -0
  54. /package/dist/{compiler → core}/features/feature-base.js +0 -0
  55. /package/dist/{compiler → core}/features/feature-manager.d.ts +0 -0
  56. /package/dist/{compiler → core}/features/feature-manager.js +0 -0
  57. /package/dist/{compiler → core}/features/one-euro-filter-feature.d.ts +0 -0
  58. /package/dist/{compiler → core}/features/one-euro-filter-feature.js +0 -0
  59. /package/dist/{compiler → core}/features/temporal-filter-feature.d.ts +0 -0
  60. /package/dist/{compiler → core}/features/temporal-filter-feature.js +0 -0
  61. /package/dist/{compiler → core}/image-list.d.ts +0 -0
  62. /package/dist/{compiler → core}/image-list.js +0 -0
  63. /package/dist/{compiler → core}/input-loader.d.ts +0 -0
  64. /package/dist/{compiler → core}/input-loader.js +0 -0
  65. /package/dist/{compiler → core}/matching/hamming-distance.d.ts +0 -0
  66. /package/dist/{compiler → core}/matching/hamming-distance.js +0 -0
  67. /package/dist/{compiler → core}/matching/hierarchical-clustering.d.ts +0 -0
  68. /package/dist/{compiler → core}/matching/hierarchical-clustering.js +0 -0
  69. /package/dist/{compiler → core}/matching/hough.d.ts +0 -0
  70. /package/dist/{compiler → core}/matching/hough.js +0 -0
  71. /package/dist/{compiler → core}/matching/matcher.d.ts +0 -0
  72. /package/dist/{compiler → core}/matching/matcher.js +0 -0
  73. /package/dist/{compiler → core}/matching/matching.d.ts +0 -0
  74. /package/dist/{compiler → core}/matching/ransacHomography.d.ts +0 -0
  75. /package/dist/{compiler → core}/matching/ransacHomography.js +0 -0
  76. /package/dist/{compiler → core}/tracker/extract-utils.d.ts +0 -0
  77. /package/dist/{compiler → core}/tracker/extract-utils.js +0 -0
  78. /package/dist/{compiler → core}/tracker/extract.d.ts +0 -0
  79. /package/dist/{compiler → core}/tracker/extract.js +0 -0
  80. /package/dist/{compiler → core}/tracker/tracker.d.ts +0 -0
  81. /package/dist/{compiler → core}/utils/cumsum.d.ts +0 -0
  82. /package/dist/{compiler → core}/utils/cumsum.js +0 -0
  83. /package/dist/{compiler → core}/utils/geometry.d.ts +0 -0
  84. /package/dist/{compiler → core}/utils/geometry.js +0 -0
  85. /package/dist/{compiler → core}/utils/gpu-compute.d.ts +0 -0
  86. /package/dist/{compiler → core}/utils/gpu-compute.js +0 -0
  87. /package/dist/{compiler → core}/utils/homography.d.ts +0 -0
  88. /package/dist/{compiler → core}/utils/homography.js +0 -0
  89. /package/dist/{compiler → core}/utils/images.d.ts +0 -0
  90. /package/dist/{compiler → core}/utils/images.js +0 -0
  91. /package/dist/{compiler → core}/utils/lsh-binarizer.d.ts +0 -0
  92. /package/dist/{compiler → core}/utils/lsh-binarizer.js +0 -0
  93. /package/dist/{compiler → core}/utils/lsh-direct.d.ts +0 -0
  94. /package/dist/{compiler → core}/utils/lsh-direct.js +0 -0
  95. /package/dist/{compiler → core}/utils/projection.d.ts +0 -0
  96. /package/dist/{compiler → core}/utils/projection.js +0 -0
  97. /package/dist/{compiler → core}/utils/randomizer.d.ts +0 -0
  98. /package/dist/{compiler → core}/utils/randomizer.js +0 -0
  99. /package/dist/{compiler → core}/utils/worker-pool.d.ts +0 -0
  100. /package/dist/{compiler → core}/utils/worker-pool.js +0 -0
  101. /package/dist/{compiler → runtime}/aframe.d.ts +0 -0
  102. /package/dist/{compiler → runtime}/aframe.js +0 -0
  103. /package/dist/{compiler → runtime}/controller.worker.d.ts +0 -0
  104. /package/dist/{compiler → runtime}/simple-ar.d.ts +0 -0
  105. /package/dist/{compiler → runtime}/three.d.ts +0 -0
  106. /package/dist/{compiler → runtime}/three.js +0 -0
  107. /package/src/compiler/{index.js → offline-compiler-browsertest.js} +0 -0
  108. /package/src/{compiler → core}/detector/crop-detector.js +0 -0
  109. /package/src/{compiler → core}/detector/freak.js +0 -0
  110. /package/src/{compiler → core}/estimation/estimate.js +0 -0
  111. /package/src/{compiler → core}/estimation/estimator.js +0 -0
  112. /package/src/{compiler → core}/estimation/refine-estimate.js +0 -0
  113. /package/src/{compiler → core}/estimation/utils.js +0 -0
  114. /package/src/{compiler → core}/features/auto-rotation-feature.ts +0 -0
  115. /package/src/{compiler → core}/features/crop-detection-feature.ts +0 -0
  116. /package/src/{compiler → core}/features/feature-base.ts +0 -0
  117. /package/src/{compiler → core}/features/feature-manager.ts +0 -0
  118. /package/src/{compiler → core}/features/one-euro-filter-feature.ts +0 -0
  119. /package/src/{compiler → core}/features/temporal-filter-feature.ts +0 -0
  120. /package/src/{compiler → core}/image-list.js +0 -0
  121. /package/src/{compiler → core}/input-loader.js +0 -0
  122. /package/src/{compiler → core}/matching/hamming-distance.js +0 -0
  123. /package/src/{compiler → core}/matching/hierarchical-clustering.js +0 -0
  124. /package/src/{compiler → core}/matching/hough.js +0 -0
  125. /package/src/{compiler → core}/matching/matcher.js +0 -0
  126. /package/src/{compiler → core}/matching/ransacHomography.js +0 -0
  127. /package/src/{compiler → core}/tracker/extract-utils.js +0 -0
  128. /package/src/{compiler → core}/tracker/extract.js +0 -0
  129. /package/src/{compiler → core}/utils/cumsum.js +0 -0
  130. /package/src/{compiler → core}/utils/geometry.js +0 -0
  131. /package/src/{compiler → core}/utils/gpu-compute.js +0 -0
  132. /package/src/{compiler → core}/utils/homography.js +0 -0
  133. /package/src/{compiler → core}/utils/images.js +0 -0
  134. /package/src/{compiler → core}/utils/lsh-binarizer.js +0 -0
  135. /package/src/{compiler → core}/utils/lsh-direct.js +0 -0
  136. /package/src/{compiler → core}/utils/projection.js +0 -0
  137. /package/src/{compiler → core}/utils/randomizer.js +0 -0
  138. /package/src/{compiler → core}/utils/worker-pool.js +0 -0
  139. /package/src/{compiler → runtime}/aframe.js +0 -0
  140. /package/src/{compiler → runtime}/three.js +0 -0
@@ -5,27 +5,14 @@
5
5
  * Usa JavaScript puro para máxima velocidad.
6
6
  */
7
7
  import { parentPort } from 'node:worker_threads';
8
- import { extractTrackingFeatures } from './tracker/extract-utils.js';
9
- import { buildTrackingImageList } from './image-list.js';
10
- import { DetectorLite } from './detector/detector-lite.js';
11
- import { build as hierarchicalClusteringBuild } from './matching/hierarchical-clustering.js';
8
+ import { extractTrackingFeatures } from '../core/tracker/extract-utils.js';
9
+ import { buildTrackingImageList } from '../core/image-list.js';
10
+ import { DetectorLite } from '../core/detector/detector-lite.js';
11
+ import { build as hierarchicalClusteringBuild } from '../core/matching/hierarchical-clustering.js';
12
+ import { getMorton } from '../core/protocol.js';
12
13
  if (!parentPort) {
13
14
  throw new Error('This file must be run as a worker thread.');
14
15
  }
15
- // Helper for Morton Order sorting inside worker
16
- function getMorton(x, y) {
17
- let x_int = x | 0;
18
- let y_int = y | 0;
19
- x_int = (x_int | (x_int << 8)) & 0x00FF00FF;
20
- x_int = (x_int | (x_int << 4)) & 0x0F0F0F0F;
21
- x_int = (x_int | (x_int << 2)) & 0x33333333;
22
- x_int = (x_int | (x_int << 1)) & 0x55555555;
23
- y_int = (y_int | (y_int << 8)) & 0x00FF00FF;
24
- y_int = (y_int | (y_int << 4)) & 0x0F0F0F0F;
25
- y_int = (y_int | (y_int << 2)) & 0x33333333;
26
- y_int = (y_int | (y_int << 1)) & 0x55555555;
27
- return x_int | (y_int << 1);
28
- }
29
16
  const mortonCache = new Int32Array(2048); // Cache for sorting stability
30
17
  function sortPoints(points) {
31
18
  if (points.length <= 1)
@@ -5,10 +5,8 @@
5
5
  * que NO depende de TensorFlow, eliminando todos los problemas de
6
6
  * inicialización, bloqueos y compatibilidad.
7
7
  */
8
- import { FourierEncoder } from "./utils/fourier-encoder.js";
9
8
  export declare class OfflineCompiler {
10
9
  data: any;
11
- fourierEncoder: FourierEncoder;
12
10
  constructor();
13
11
  compileImageTargets(images: any[], progressCallback: (p: number) => void): Promise<any>;
14
12
  _compileTarget(targetImages: any[], progressCallback: (p: number) => void): Promise<{
@@ -112,55 +110,9 @@ export declare class OfflineCompiler {
112
110
  scale: any;
113
111
  }[][]>;
114
112
  exportData(): Uint8Array<ArrayBuffer>;
115
- _getMorton(x: number, y: number): number;
116
- _columnarize(points: any[], tree: any, width: number, height: number): {
117
- x: Uint16Array<ArrayBuffer>;
118
- y: Uint16Array<ArrayBuffer>;
119
- a: Int16Array<ArrayBuffer>;
120
- s: Uint8Array<ArrayBuffer>;
121
- d: Uint32Array<ArrayBuffer>;
122
- f: Int8Array<ArrayBuffer>;
123
- t: any;
124
- };
125
- _compactTree(node: any): any;
126
113
  importData(buffer: ArrayBuffer | Uint8Array): {
127
114
  version: any;
128
115
  dataList: any;
129
116
  };
130
- _unpackKeyframe(kf: any): {
131
- width: any;
132
- height: any;
133
- scale: any;
134
- maximaPoints: {
135
- x: number;
136
- y: number;
137
- angle: any;
138
- scale: any;
139
- descriptors: any;
140
- }[];
141
- minimaPoints: {
142
- x: number;
143
- y: number;
144
- angle: any;
145
- scale: any;
146
- descriptors: any;
147
- }[];
148
- maximaPointsCluster: {
149
- rootNode: any;
150
- };
151
- minimaPointsCluster: {
152
- rootNode: any;
153
- };
154
- };
155
- _decolumnarize(col: any, width: number, height: number): {
156
- x: number;
157
- y: number;
158
- angle: any;
159
- scale: any;
160
- descriptors: any;
161
- }[];
162
- _expandTree(node: any): any;
163
117
  destroy(): Promise<void>;
164
- _pack4Bit(data: Uint8Array): Uint8Array<ArrayBufferLike>;
165
- _unpack4Bit(packed: Uint8Array, width: number, height: number): Uint8Array<ArrayBuffer>;
166
118
  }
@@ -5,20 +5,17 @@
5
5
  * que NO depende de TensorFlow, eliminando todos los problemas de
6
6
  * inicialización, bloqueos y compatibilidad.
7
7
  */
8
- import { buildTrackingImageList, buildImageList } from "./image-list.js";
9
- import { extractTrackingFeatures } from "./tracker/extract-utils.js";
10
- import { DetectorLite } from "./detector/detector-lite.js";
11
- import { build as hierarchicalClusteringBuild } from "./matching/hierarchical-clustering.js";
12
- import { FourierEncoder } from "./utils/fourier-encoder.js";
13
- import * as msgpack from "@msgpack/msgpack";
8
+ import { buildTrackingImageList, buildImageList } from "../core/image-list.js";
9
+ import { extractTrackingFeatures } from "../core/tracker/extract-utils.js";
10
+ import { DetectorLite } from "../core/detector/detector-lite.js";
11
+ import { build as hierarchicalClusteringBuild } from "../core/matching/hierarchical-clustering.js";
12
+ import * as protocol from "../core/protocol.js";
14
13
  // Detect environment
15
14
  const isNode = typeof process !== "undefined" &&
16
15
  process.versions != null &&
17
16
  process.versions.node != null;
18
- const CURRENT_VERSION = 7; // Protocol v7: Moonshot - 4-bit Packed Tracking Data
19
17
  export class OfflineCompiler {
20
18
  data = null;
21
- fourierEncoder = new FourierEncoder(4);
22
19
  constructor() {
23
20
  console.log("⚡ OfflineCompiler: Main thread mode (no workers)");
24
21
  }
@@ -78,7 +75,7 @@ export class OfflineCompiler {
78
75
  const percentPerImageScale = percentPerImage / imageList.length;
79
76
  const keyframes = [];
80
77
  for (const image of imageList) {
81
- const detector = new DetectorLite(image.width, image.height, { useLSH: true });
78
+ const detector = new DetectorLite(image.width, image.height, { useLSH: true, maxFeaturesPerBucket: 20 });
82
79
  const { featurePoints: ps } = detector.detect(image.data);
83
80
  const maximaPoints = ps.filter((p) => p.maxima);
84
81
  const minimaPoints = ps.filter((p) => !p.maxima);
@@ -157,212 +154,19 @@ export class OfflineCompiler {
157
154
  w: kf.width,
158
155
  h: kf.height,
159
156
  s: kf.scale,
160
- max: this._columnarize(kf.maximaPoints, kf.maximaPointsCluster, kf.width, kf.height),
161
- min: this._columnarize(kf.minimaPoints, kf.minimaPointsCluster, kf.width, kf.height),
157
+ max: protocol.columnarize(kf.maximaPoints, kf.maximaPointsCluster, kf.width, kf.height),
158
+ min: protocol.columnarize(kf.minimaPoints, kf.minimaPointsCluster, kf.width, kf.height),
162
159
  })),
163
160
  };
164
161
  });
165
- return msgpack.encode({
166
- v: CURRENT_VERSION,
167
- dataList,
168
- });
169
- }
170
- _getMorton(x, y) {
171
- let x_int = x | 0;
172
- let y_int = y | 0;
173
- x_int = (x_int | (x_int << 8)) & 0x00FF00FF;
174
- x_int = (x_int | (x_int << 4)) & 0x0F0F0F0F;
175
- x_int = (x_int | (x_int << 2)) & 0x33333333;
176
- x_int = (x_int | (x_int << 1)) & 0x55555555;
177
- y_int = (y_int | (y_int << 8)) & 0x00FF00FF;
178
- y_int = (y_int | (y_int << 4)) & 0x0F0F0F0F;
179
- y_int = (y_int | (y_int << 2)) & 0x33333333;
180
- y_int = (y_int | (y_int << 1)) & 0x55555555;
181
- return x_int | (y_int << 1);
182
- }
183
- // Keyframe packing is now minimal, most work moved to Workers
184
- _columnarize(points, tree, width, height) {
185
- const count = points.length;
186
- const x = new Uint16Array(count);
187
- const y = new Uint16Array(count);
188
- const angle = new Int16Array(count);
189
- const scale = new Uint8Array(count);
190
- const descriptors = new Uint32Array(count * 2);
191
- const fourier = new Int8Array(count * 16); // 4 frequencies * 4 components (sin/cos x/y)
192
- for (let i = 0; i < count; i++) {
193
- x[i] = Math.round((points[i].x / width) * 65535);
194
- y[i] = Math.round((points[i].y / height) * 65535);
195
- angle[i] = Math.round((points[i].angle / Math.PI) * 32767);
196
- scale[i] = Math.round(Math.log2(points[i].scale || 1));
197
- if (points[i].descriptors && points[i].descriptors.length >= 2) {
198
- descriptors[i * 2] = points[i].descriptors[0];
199
- descriptors[(i * 2) + 1] = points[i].descriptors[1];
200
- }
201
- // 🚀 MOONSHOT: Fourier Positional Encoding
202
- const feat = this.fourierEncoder.encode(points[i].x / width, points[i].y / height);
203
- for (let j = 0; j < 16; j++) {
204
- fourier[i * 16 + j] = Math.round(feat[j] * 127);
205
- }
206
- }
207
- return {
208
- x,
209
- y,
210
- a: angle,
211
- s: scale,
212
- d: descriptors,
213
- f: fourier,
214
- t: this._compactTree(tree.rootNode),
215
- };
216
- }
217
- _compactTree(node) {
218
- if (node.leaf) {
219
- return [1, node.centerPointIndex || 0, node.pointIndexes];
220
- }
221
- return [0, node.centerPointIndex || 0, node.children.map((c) => this._compactTree(c))];
162
+ return protocol.encodeTaar(dataList);
222
163
  }
223
164
  importData(buffer) {
224
- const content = msgpack.decode(new Uint8Array(buffer));
225
- const version = content.v || 0;
226
- if (version !== CURRENT_VERSION && version !== 5) {
227
- console.error(`Incompatible .taar version: ${version}. This engine only supports Protocol V5/V6.`);
228
- return { version, dataList: [] };
229
- }
230
- const dataList = content.dataList;
231
- for (let i = 0; i < dataList.length; i++) {
232
- const item = dataList[i];
233
- for (const td of item.trackingData) {
234
- let px = td.px;
235
- let py = td.py;
236
- if (px instanceof Uint8Array) {
237
- px = new Float32Array(px.buffer.slice(px.byteOffset, px.byteOffset + px.byteLength));
238
- }
239
- if (py instanceof Uint8Array) {
240
- py = new Float32Array(py.buffer.slice(py.byteOffset, py.byteOffset + py.byteLength));
241
- }
242
- td.px = px;
243
- td.py = py;
244
- // No longer unpacking 4-bit, keeping original data
245
- if (td.data && td.data.length === (td.width * td.height) / 2) {
246
- td.data = this._unpack4Bit(td.data, td.width, td.height);
247
- }
248
- if (td.d && td.d.length === (td.w * td.h) / 2) {
249
- td.d = this._unpack4Bit(td.d, td.w, td.h);
250
- }
251
- }
252
- for (const kf of item.matchingData) {
253
- for (const col of [kf.max, kf.min]) {
254
- let xRaw = col.x;
255
- let yRaw = col.y;
256
- if (xRaw instanceof Uint8Array) {
257
- xRaw = new Uint16Array(xRaw.buffer.slice(xRaw.byteOffset, xRaw.byteOffset + xRaw.byteLength));
258
- }
259
- if (yRaw instanceof Uint8Array) {
260
- yRaw = new Uint16Array(yRaw.buffer.slice(yRaw.byteOffset, yRaw.byteOffset + yRaw.byteLength));
261
- }
262
- const count = xRaw.length;
263
- const x = new Float32Array(count);
264
- const y = new Float32Array(count);
265
- for (let k = 0; k < count; k++) {
266
- x[k] = (xRaw[k] / 65535) * kf.w;
267
- y[k] = (yRaw[k] / 65535) * kf.h;
268
- }
269
- col.x = x;
270
- col.y = y;
271
- if (col.a instanceof Uint8Array) {
272
- const aRaw = new Int16Array(col.a.buffer.slice(col.a.byteOffset, col.a.byteOffset + col.a.byteLength));
273
- const a = new Float32Array(count);
274
- for (let k = 0; k < count; k++) {
275
- a[k] = (aRaw[k] / 32767) * Math.PI;
276
- }
277
- col.a = a;
278
- }
279
- if (col.s instanceof Uint8Array) {
280
- const sRaw = col.s;
281
- const s = new Float32Array(count);
282
- for (let k = 0; k < count; k++) {
283
- s[k] = Math.pow(2, sRaw[k]);
284
- }
285
- col.s = s;
286
- }
287
- if (col.d instanceof Uint8Array) {
288
- col.d = new Uint32Array(col.d.buffer.slice(col.d.byteOffset, col.d.byteOffset + col.d.byteLength));
289
- }
290
- if (col.f instanceof Uint8Array) {
291
- col.f = new Int8Array(col.f.buffer.slice(col.f.byteOffset, col.f.byteOffset + col.f.byteLength));
292
- }
293
- }
294
- }
295
- }
296
- this.data = dataList;
297
- return { version, dataList };
298
- }
299
- _unpackKeyframe(kf) {
300
- return {
301
- width: kf.w,
302
- height: kf.h,
303
- scale: kf.s,
304
- maximaPoints: this._decolumnarize(kf.max, kf.w, kf.h),
305
- minimaPoints: this._decolumnarize(kf.min, kf.w, kf.h),
306
- maximaPointsCluster: { rootNode: this._expandTree(kf.max.t) },
307
- minimaPointsCluster: { rootNode: this._expandTree(kf.min.t) },
308
- };
309
- }
310
- _decolumnarize(col, width, height) {
311
- const points = [];
312
- const count = col.x.length;
313
- const descSize = col.d.length / count;
314
- for (let i = 0; i < count; i++) {
315
- points.push({
316
- x: (col.x[i] / 65535) * width,
317
- y: (col.y[i] / 65535) * height,
318
- angle: col.a[i],
319
- scale: col.s ? col.s[i] : 1.0,
320
- descriptors: col.d.slice(i * descSize, (i + 1) * descSize),
321
- });
322
- }
323
- return points;
324
- }
325
- _expandTree(node) {
326
- const isLeaf = node[0] === 1;
327
- if (isLeaf) {
328
- return {
329
- leaf: true,
330
- centerPointIndex: node[1],
331
- pointIndexes: node[2],
332
- };
333
- }
334
- return {
335
- leaf: false,
336
- centerPointIndex: node[1],
337
- children: node[2].map((c) => this._expandTree(c)),
338
- };
165
+ const result = protocol.decodeTaar(buffer);
166
+ this.data = result.dataList;
167
+ return result;
339
168
  }
340
169
  async destroy() {
341
170
  // No workers to destroy
342
171
  }
343
- _pack4Bit(data) {
344
- const length = data.length;
345
- if (length % 2 !== 0)
346
- return data; // Only pack even lengths
347
- const packed = new Uint8Array(length / 2);
348
- for (let i = 0; i < length; i += 2) {
349
- // Take top 4 bits of each byte
350
- const p1 = (data[i] & 0xF0) >> 4;
351
- const p2 = (data[i + 1] & 0xF0) >> 4;
352
- packed[i / 2] = (p1 << 4) | p2;
353
- }
354
- return packed;
355
- }
356
- _unpack4Bit(packed, width, height) {
357
- const length = width * height;
358
- const data = new Uint8Array(length);
359
- for (let i = 0; i < packed.length; i++) {
360
- const byte = packed[i];
361
- const p1 = (byte & 0xF0); // First pixel (already in high position)
362
- const p2 = (byte & 0x0F) << 4; // Second pixel (move to high position)
363
- data[i * 2] = p1;
364
- data[i * 2 + 1] = p2;
365
- }
366
- return data;
367
- }
368
172
  }
@@ -8,6 +8,7 @@ export class DetectorLite {
8
8
  height: any;
9
9
  useGPU: any;
10
10
  useLSH: any;
11
+ maxFeaturesPerBucket: any;
11
12
  numOctaves: number;
12
13
  /**
13
14
  * Detecta características en una imagen en escala de grises
@@ -25,6 +26,11 @@ export class DetectorLite {
25
26
  width: any;
26
27
  height: any;
27
28
  }[][];
29
+ _pyramidBuffers: {
30
+ width: any;
31
+ height: any;
32
+ temp: Float32Array<ArrayBuffer>;
33
+ } | undefined;
28
34
  /**
29
35
  * Aplica un filtro gaussiano binomial [1,4,6,4,1] - Optimizado
30
36
  */
@@ -15,7 +15,7 @@ import { computeLSH64, computeFullFREAK, packLSHIntoDescriptor } from "../utils/
15
15
  const PYRAMID_MIN_SIZE = 4; // Restored to 4 for better small-scale detection
16
16
  // PYRAMID_MAX_OCTAVE ya no es necesario, el límite lo da PYRAMID_MIN_SIZE
17
17
  const NUM_BUCKETS_PER_DIMENSION = 10;
18
- const MAX_FEATURES_PER_BUCKET = 30; // Maximized to ensure robustness in Moonshot mode
18
+ const DEFAULT_MAX_FEATURES_PER_BUCKET = 8;
19
19
  const ORIENTATION_NUM_BINS = 36;
20
20
  const FREAK_EXPANSION_FACTOR = 7.0;
21
21
  // Global GPU mode flag
@@ -37,6 +37,7 @@ export class DetectorLite {
37
37
  this.useGPU = options.useGPU !== undefined ? options.useGPU : globalUseGPU;
38
38
  // Protocol V6 (Moonshot): 64-bit LSH is the standard descriptor format
39
39
  this.useLSH = options.useLSH !== undefined ? options.useLSH : true;
40
+ this.maxFeaturesPerBucket = options.maxFeaturesPerBucket !== undefined ? options.maxFeaturesPerBucket : DEFAULT_MAX_FEATURES_PER_BUCKET;
40
41
  let numOctaves = 0;
41
42
  let w = width, h = height;
42
43
  while (w >= PYRAMID_MIN_SIZE && h >= PYRAMID_MIN_SIZE) {
@@ -87,7 +88,7 @@ export class DetectorLite {
87
88
  y: ext.y * scale + scale * 0.5 - 0.5,
88
89
  scale: scale,
89
90
  angle: ext.angle || 0,
90
- descriptors: (this.useLSH && ext.lsh) ? ext.descriptors : (ext.descriptors || [])
91
+ descriptors: (this.useLSH && ext.lsh) ? ext.lsh : (ext.descriptors || [])
91
92
  };
92
93
  });
93
94
  return { featurePoints, pyramid: pyramidImages };
@@ -118,22 +119,21 @@ export class DetectorLite {
118
119
  console.warn("GPU pyramid failed, falling back to CPU:", e.message);
119
120
  }
120
121
  }
121
- // Original CPU implementation
122
+ // Buffer management: Reuse arrays if dimensions match to reduce GC
123
+ if (!this._pyramidBuffers || this._pyramidBuffers.width !== width || this._pyramidBuffers.height !== height) {
124
+ this._pyramidBuffers = { width, height, temp: new Float32Array(width * height) };
125
+ }
122
126
  const pyramid = [];
123
127
  let currentData = data;
124
128
  let currentWidth = width;
125
129
  let currentHeight = height;
126
130
  for (let i = 0; i < this.numOctaves; i++) {
127
131
  const img1 = this._applyGaussianFilter(currentData, currentWidth, currentHeight);
128
- // Only need the second blur if we are going to compute DoG with the NEXT layer
129
- // or if we need it for this octave's DoG.
130
- // Actually, for maxOctaves=1, we only need img1 and maybe img2 for one DoG layer.
131
132
  const img2 = this._applyGaussianFilter(img1.data, currentWidth, currentHeight);
132
133
  pyramid.push([
133
134
  { data: img1.data, width: currentWidth, height: currentHeight },
134
135
  { data: img2.data, width: currentWidth, height: currentHeight }
135
136
  ]);
136
- // Downsample para siguiente octava - Only if we have more octaves to go
137
137
  if (i < this.numOctaves - 1) {
138
138
  const downsampled = this._downsample(img2.data, currentWidth, currentHeight);
139
139
  currentData = downsampled.data;
@@ -148,7 +148,7 @@ export class DetectorLite {
148
148
  */
149
149
  _applyGaussianFilter(data, width, height) {
150
150
  const output = new Float32Array(width * height);
151
- const temp = new Float32Array(width * height);
151
+ const temp = this._pyramidBuffers?.temp || new Float32Array(width * height);
152
152
  const k0 = 0.0625, k1 = 0.25, k2 = 0.375; // 1/16, 4/16, 6/16
153
153
  const w1 = width - 1;
154
154
  // Horizontal pass - Speed optimized with manual border handling
@@ -305,7 +305,7 @@ export class DetectorLite {
305
305
  */
306
306
  _applyPrune(extremas) {
307
307
  const nBuckets = NUM_BUCKETS_PER_DIMENSION;
308
- const nFeatures = MAX_FEATURES_PER_BUCKET;
308
+ const nFeatures = this.maxFeaturesPerBucket;
309
309
  // Agrupar por buckets
310
310
  const buckets = [];
311
311
  for (let i = 0; i < nBuckets * nBuckets; i++) {
@@ -8,7 +8,7 @@ const encoder = new FourierEncoder(4);
8
8
  const INLIER_THRESHOLD = 5.0; // Tightened from 10 to 5 for better precision
9
9
  const MIN_NUM_INLIERS = 8; // Restored to 8
10
10
  const CLUSTER_MAX_POP = 20;
11
- const HAMMING_THRESHOLD = 0.8; // Tightened from 0.85 to 0.8 for cleaner matches
11
+ const HAMMING_THRESHOLD = 0.85; // Relaxed from 0.8 back to 0.85
12
12
  // match list of querpoints against pre-built list of keyframes
13
13
  const match = ({ keyframe, querypoints, querywidth, queryheight, debugMode }) => {
14
14
  let debugExtra = {};
@@ -0,0 +1,43 @@
1
+ export declare const CURRENT_VERSION = 7;
2
+ /**
3
+ * Morton Order calculation for spatial sorting
4
+ */
5
+ export declare function getMorton(x: number, y: number): number;
6
+ /**
7
+ * Packs 8-bit image data into 4-bit packed data
8
+ */
9
+ export declare function pack4Bit(data: Uint8Array): Uint8Array;
10
+ /**
11
+ * Unpacks 4-bit data back to 8-bit image data
12
+ */
13
+ export declare function unpack4Bit(packed: Uint8Array, width: number, height: number): Uint8Array;
14
+ /**
15
+ * Columnarizes point data for efficient storage and transfer
16
+ */
17
+ export declare function columnarize(points: any[], tree: any, width: number, height: number): {
18
+ x: Uint16Array<ArrayBuffer>;
19
+ y: Uint16Array<ArrayBuffer>;
20
+ a: Int16Array<ArrayBuffer>;
21
+ s: Uint8Array<ArrayBuffer>;
22
+ d: Uint32Array<ArrayBuffer>;
23
+ t: any;
24
+ };
25
+ /**
26
+ * Compacts hierarchical clustering tree into a minimal array structure
27
+ */
28
+ export declare function compactTree(node: any): any;
29
+ /**
30
+ * Expands a compacted tree back into an object structure
31
+ */
32
+ export declare function expandTree(node: any): any;
33
+ /**
34
+ * Deserializes and normalizes .taar data from a buffer
35
+ */
36
+ export declare function decodeTaar(buffer: ArrayBuffer | Uint8Array): {
37
+ version: any;
38
+ dataList: any;
39
+ };
40
+ /**
41
+ * Serializes target data into a .taar binary buffer
42
+ */
43
+ export declare function encodeTaar(dataList: any[]): Uint8Array<ArrayBuffer>;