@womp/mesh-editor 0.1.0

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.
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # @womp/mesh-editor
2
+
3
+ Framework-independent browser mesh editing for Womp products.
4
+
5
+ This package is publicly downloadable but remains proprietary. No license is
6
+ granted for external use.
7
+
8
+ The package contains the `EditableMesh` model, the `PortableMeshEditor`
9
+ engine, Three.js conversion helpers, and the edit-only reference session. It
10
+ does not include rigging clients, provider integrations, backend platforms, or
11
+ Python workers.
12
+
13
+ ```ts
14
+ import { open_edit_session } from "@womp/mesh-editor/session";
15
+
16
+ await open_edit_session({
17
+ title: "Edit mesh",
18
+ editable_mesh,
19
+ root_class: "product-mesh-editor-theme",
20
+ on_commit: async ({ mesh }) => {
21
+ await persist_mesh(mesh);
22
+ },
23
+ });
24
+ ```
25
+
26
+ `root_class` scopes the semantic `--womp-mesh-editor-*` theme tokens documented
27
+ in `docs/ui-theming.md`. Omit it to retain the default appearance.
28
+
29
+ The reference session prepares Dense tessellation before editing, falls back to
30
+ Standard when required by mesh limits, and hides tessellation controls. The
31
+ prepared mesh is the clean session baseline and is returned on commit.
32
+
33
+ `three@0.184.0` is a peer dependency and must be supplied by the host.
@@ -0,0 +1,603 @@
1
+ import { SculptNormalWorkerPool } from "./sculpt_normal_workers.js";
2
+ import type { EditableMaterial, EditableMesh, EditableMeshBounds, EditableTexture, Vec2, Vec3 } from "./types.js";
3
+ type ThreeModule = any;
4
+ type ThreeObject = any;
5
+ type UpdateRange = {
6
+ start: number;
7
+ count: number;
8
+ };
9
+ export type MeshTessellationFrequency = 2 | 3;
10
+ export interface MeshTessellationEstimate {
11
+ frequency: MeshTessellationFrequency;
12
+ vertexCount: number;
13
+ triangleCount: number;
14
+ geometryByteLength: number;
15
+ withinLimits: boolean;
16
+ }
17
+ export interface InitialMeshTessellationResult {
18
+ mesh: EditableMesh;
19
+ frequency: MeshTessellationFrequency | null;
20
+ }
21
+ export interface MeshEditorSymmetryOptions {
22
+ enabled?: boolean;
23
+ vertical?: boolean;
24
+ horizontal?: boolean;
25
+ }
26
+ export interface MeshEditorOptions {
27
+ THREE: ThreeModule;
28
+ canvas: HTMLCanvasElement;
29
+ symmetryEnabled?: boolean;
30
+ symmetryVertical?: boolean;
31
+ symmetryHorizontal?: boolean;
32
+ onStatus?: (message: string) => void;
33
+ onCommit?: (mesh: EditableMesh) => void;
34
+ onCancel?: () => void;
35
+ onHistoryChange?: (state: MeshEditorHistoryState) => void;
36
+ }
37
+ export interface MeshEditorHistoryState {
38
+ canUndo: boolean;
39
+ canRedo: boolean;
40
+ dirty: boolean;
41
+ }
42
+ export interface MeshEditorVisualOptions {
43
+ showVertices?: boolean;
44
+ showWireframe?: boolean;
45
+ smoothShading?: boolean;
46
+ }
47
+ interface RefreshGeometryOptions {
48
+ rebuildWireframe?: boolean;
49
+ recomputeDerived?: boolean;
50
+ recomputeNormals?: boolean;
51
+ recomputeBounds?: boolean;
52
+ updateStart?: number;
53
+ updateCount?: number;
54
+ updateRanges?: UpdateRange[];
55
+ boundsVertices?: number[];
56
+ updatePositions?: boolean;
57
+ updateColors?: boolean;
58
+ }
59
+ interface OrbitState {
60
+ target: ThreeObject;
61
+ radius: number;
62
+ theta: number;
63
+ phi: number;
64
+ active: boolean;
65
+ pointerId: number | null;
66
+ lastX: number;
67
+ lastY: number;
68
+ mode: "orbit" | "pan";
69
+ }
70
+ interface DragState {
71
+ pointerId: number;
72
+ vertexIndex: number;
73
+ }
74
+ interface BrushStrokeState {
75
+ pointerId: number;
76
+ historyStarted: boolean;
77
+ sourceStamp: number;
78
+ lastCenter: Vec3 | null;
79
+ lastNormal: Vec3 | null;
80
+ lastTriangleIndex: number | undefined;
81
+ lastClientX: number;
82
+ lastClientY: number;
83
+ queuedClientX: number;
84
+ queuedClientY: number;
85
+ distanceSinceSample: number;
86
+ finishRequested: boolean;
87
+ finalizeDerived: boolean;
88
+ movePointerOffset: Vec3;
89
+ moveAppliedOffset: Vec3;
90
+ }
91
+ interface TexturePaintMetric {
92
+ uvRadius: number;
93
+ worldRadius: number;
94
+ worldFromU: Vec3 | null;
95
+ worldFromV: Vec3 | null;
96
+ }
97
+ interface TexturePaintTriangle {
98
+ triangleIndex: number;
99
+ a: number;
100
+ b: number;
101
+ c: number;
102
+ materialIndex: number;
103
+ min: Vec3;
104
+ max: Vec3;
105
+ maxEdge: number;
106
+ }
107
+ interface MeshSnapshotHistoryEntry {
108
+ kind: "snapshot";
109
+ mesh: EditableMesh;
110
+ revision: number;
111
+ byteLength: number;
112
+ }
113
+ interface MeshPositionHistoryEntry {
114
+ kind: "positions";
115
+ vertexIndices: number[] | Uint32Array;
116
+ positions: number[] | Float32Array;
117
+ revision: number;
118
+ byteLength: number;
119
+ }
120
+ type MeshHistoryEntry = MeshSnapshotHistoryEntry | MeshPositionHistoryEntry;
121
+ interface TexturePaintTriangleIndex {
122
+ triangles: TexturePaintTriangle[];
123
+ triangleSlots: Int32Array;
124
+ cells: Map<string, number[]>;
125
+ min: Vec3;
126
+ boundsRadius: number;
127
+ cellSize: number;
128
+ invCellSize: number;
129
+ visited: Uint32Array;
130
+ visitStamp: number;
131
+ queue: Uint32Array;
132
+ }
133
+ interface GpuPaintTextureState {
134
+ textureIndex: number;
135
+ width: number;
136
+ height: number;
137
+ current: ThreeObject;
138
+ next: ThreeObject;
139
+ mask: ThreeObject;
140
+ geometry: ThreeObject | null;
141
+ maskMesh: ThreeObject | null;
142
+ readRect: GpuPaintDirtyRect | null;
143
+ dirty: boolean;
144
+ synced: boolean;
145
+ }
146
+ interface GpuPaintDirtyRect {
147
+ minX: number;
148
+ minY: number;
149
+ maxX: number;
150
+ maxY: number;
151
+ }
152
+ export declare function prepare_initial_mesh_tessellation(mesh: EditableMesh): InitialMeshTessellationResult;
153
+ interface CompactIndexLists {
154
+ offsets: Uint32Array;
155
+ values: Uint32Array;
156
+ }
157
+ declare class VertexSpatialIndex {
158
+ positions: Float32Array;
159
+ vertexCount: number;
160
+ min: Vec3;
161
+ cellSize: number;
162
+ invCellSize: number;
163
+ cells: Map<number, Map<number, Map<number, number[]>>>;
164
+ cellX: Int32Array;
165
+ cellY: Int32Array;
166
+ cellZ: Int32Array;
167
+ cellSlot: Int32Array;
168
+ constructor(positions: Float32Array, bounds: EditableMeshBounds);
169
+ cell_coord(value: number, axis: number): number;
170
+ cell_for(x: number, y: number, z: number, create: boolean): number[] | undefined;
171
+ delete_empty_cell(x: number, y: number, z: number): void;
172
+ insert_vertex(vertexIndex: number): void;
173
+ update_vertices(vertexIndices: number[]): void;
174
+ query_radius(center: ArrayLike<number>, radius: number, output: number[]): number[];
175
+ query_cell_visit_count(center: ArrayLike<number>, radius: number): number;
176
+ should_query_radius(center: ArrayLike<number>, radius: number): boolean;
177
+ }
178
+ declare class GpuTexturePainter {
179
+ editor: PortableMeshEditor;
180
+ THREE: ThreeModule;
181
+ renderer: ThreeObject;
182
+ camera: ThreeObject;
183
+ copyScene: ThreeObject;
184
+ copyMaterial: ThreeObject;
185
+ copyMesh: ThreeObject;
186
+ paintScene: ThreeObject;
187
+ paintMaterial: ThreeObject;
188
+ paintMesh: ThreeObject;
189
+ maskScene: ThreeObject;
190
+ maskMaterial: ThreeObject;
191
+ dilationScene: ThreeObject;
192
+ dilationMaterial: ThreeObject;
193
+ dilationMesh: ThreeObject;
194
+ clearColor: ThreeObject;
195
+ textureStates: Map<number, GpuPaintTextureState>;
196
+ paintVertexCapacity: number;
197
+ paintPositionArray: Float32Array;
198
+ paintUvArray: Float32Array;
199
+ paintWorldArray: Float32Array;
200
+ failed: boolean;
201
+ constructor(editor: PortableMeshEditor);
202
+ can_paint_texture_dimensions(width: number, height: number): boolean;
203
+ texture_target_bytes(width: number, height: number): number;
204
+ allocated_target_bytes(excludedTextureIndex?: number): number;
205
+ can_paint_texture_requests(requests: Array<{
206
+ key: number;
207
+ width: number;
208
+ height: number;
209
+ }>): boolean;
210
+ context_lost(): boolean;
211
+ make_render_target(width: number, height: number, mask: boolean): ThreeObject;
212
+ render_to_target(target: ThreeObject, clear: boolean, rect: GpuPaintDirtyRect | null, callback: () => void): void;
213
+ copy_texture_to_target(sourceTexture: ThreeObject, target: ThreeObject, clear: boolean, rect: GpuPaintDirtyRect | null): void;
214
+ expand_dirty_rect(rect: GpuPaintDirtyRect, width: number, height: number, padding: number): GpuPaintDirtyRect;
215
+ append_repeat_wrapped_triangle(mesh: EditableMesh, a: number, b: number, c: number, paintPositions: number[], paintUvs: number[], worldPositions: number[]): void;
216
+ build_geometry(textureIndex: number): ThreeObject | null;
217
+ ensure_paint_geometry_capacity(vertexCount: number): void;
218
+ repeat_wrapped_triangle_count(mesh: EditableMesh, a: number, b: number, c: number): number;
219
+ write_repeat_wrapped_triangle(mesh: EditableMesh, a: number, b: number, c: number, vertexOffset: number): number;
220
+ update_paint_geometry(textureIndex: number, triangles: TexturePaintTriangle[]): boolean;
221
+ ensure_state(textureIndex: number): GpuPaintTextureState | null;
222
+ render_mask(state: GpuPaintTextureState): void;
223
+ update_preview_texture(textureIndex: number, textureObject: ThreeObject): void;
224
+ dirty_rect_for_triangles(textureIndex: number, triangles: TexturePaintTriangle[], center: Vec3): GpuPaintDirtyRect | null;
225
+ merge_dirty_rect(a: GpuPaintDirtyRect | null, b: GpuPaintDirtyRect): GpuPaintDirtyRect;
226
+ paint(triangles: TexturePaintTriangle[], textureIndices: Set<number>, center: Vec3, radius: number, color: Vec3, exposure: number): number;
227
+ sync_dirty_textures_to_cpu(fullReadback: boolean): void;
228
+ dispose(): void;
229
+ }
230
+ export declare class PortableMeshEditor {
231
+ THREE: ThreeModule;
232
+ canvas: HTMLCanvasElement;
233
+ onStatus: (message: string) => void;
234
+ onCommit: (mesh: EditableMesh) => void;
235
+ onCancel: () => void;
236
+ onHistoryChange: (state: MeshEditorHistoryState) => void;
237
+ tool: string;
238
+ brushRadius: number;
239
+ brushStrength: number;
240
+ brushSoftness: number;
241
+ brushColor: Vec3;
242
+ brushSubMode: boolean;
243
+ symmetryEnabled: boolean;
244
+ symmetryVertical: boolean;
245
+ symmetryHorizontal: boolean;
246
+ symmetryObjectCenter: Vec3;
247
+ showVertices: boolean;
248
+ showWireframe: boolean;
249
+ smoothShading: boolean;
250
+ effectiveShowVertices: boolean;
251
+ effectiveShowWireframe: boolean;
252
+ originalMesh: EditableMesh | null;
253
+ sessionMesh: EditableMesh | null;
254
+ undoStack: MeshHistoryEntry[];
255
+ redoStack: MeshHistoryEntry[];
256
+ pendingHistoryEntry: MeshHistoryEntry | null;
257
+ historyActionChanged: boolean;
258
+ historyPositionStamps: Uint32Array;
259
+ historyReferencePositions: Float32Array;
260
+ historyPositionStamp: number;
261
+ historyTouchedVertices: number[];
262
+ currentRevision: number;
263
+ cleanRevision: number;
264
+ nextRevision: number;
265
+ preparedCommitRevision: number | null;
266
+ sessionBoundsRadius: number;
267
+ brushReferenceRadius: number;
268
+ brushMeanEdgeLength: number;
269
+ spatialIndex: VertexSpatialIndex | null;
270
+ spatialIndexPendingDisplacement: number;
271
+ texturePaintTriangleIndex: TexturePaintTriangleIndex | null;
272
+ usableTextureUvs: boolean | null;
273
+ gpuTexturePainter: GpuTexturePainter | null;
274
+ vertexWeldGroups: CompactIndexLists;
275
+ vertexNeighbors: CompactIndexLists;
276
+ vertexTriangles: CompactIndexLists;
277
+ triangleMaterialIndices: Uint32Array;
278
+ boundaryVertices: Uint8Array;
279
+ spatialQueryResults: number[];
280
+ surfaceCandidateVertices: number[];
281
+ surfaceQueueVertices: number[];
282
+ surfaceCandidateStamps: Uint32Array;
283
+ surfaceVisitedStamps: Uint32Array;
284
+ surfaceQueryStamp: number;
285
+ brushAffectedVertices: number[];
286
+ brushSortVertices: number[];
287
+ brushTouchedVertices: Uint32Array;
288
+ brushTouchedStamp: number;
289
+ brushSourcePositions: Float32Array;
290
+ brushSourceStamps: Uint32Array;
291
+ brushSourceStamp: number;
292
+ nonAccumulatingSourcePositions: Float32Array;
293
+ nonAccumulatingSourceNormals: Float32Array;
294
+ nonAccumulatingInfluences: Float32Array;
295
+ nonAccumulatingSourceStamps: Uint32Array;
296
+ nonAccumulatingSourceStamp: number;
297
+ moveStrokeVertices: number[];
298
+ moveStrokeWeights: number[];
299
+ normalAffectedVertices: number[];
300
+ normalAffectedTriangles: number[];
301
+ normalTouchedVertices: Uint32Array;
302
+ normalTouchedStamp: number;
303
+ normalTriangleStamps: Uint32Array;
304
+ normalTriangleStamp: number;
305
+ triangleNormals: Float32Array;
306
+ sculptNormalWorkers: SculptNormalWorkerPool | null;
307
+ sculptNormalWorkerSetupHandle: number;
308
+ deferSculptNormalRefresh: boolean;
309
+ deferredNormalAffectedVertices: number[];
310
+ deferredNormalAffectedStamps: Uint32Array;
311
+ deferredNormalAffectedStamp: number;
312
+ updateRangeScratch: UpdateRange[];
313
+ singleUpdateRange: UpdateRange;
314
+ singleUpdateRangeList: UpdateRange[];
315
+ pendingDerivedRefresh: boolean;
316
+ derivedRefreshHandle: number;
317
+ pendingBrushPositions: number[];
318
+ brushFrameHandle: number;
319
+ brushFrameProcessing: boolean;
320
+ brushIdleResolvers: Array<() => void>;
321
+ brushFrameBatchDepth: number;
322
+ brushFrameAffectedVertices: number[];
323
+ brushFrameAffectedStamps: Uint32Array;
324
+ brushFrameAffectedStamp: number;
325
+ brushFrameUpdateStart: number;
326
+ brushFrameUpdateEnd: number;
327
+ brushFrameRebuildWireframe: boolean;
328
+ cursorFrameHandle: number;
329
+ queuedCursorClientX: number;
330
+ queuedCursorClientY: number;
331
+ renderSuppressionDepth: number;
332
+ renderPending: boolean;
333
+ dragState: DragState | null;
334
+ brushStrokeState: BrushStrokeState | null;
335
+ pointer: ThreeObject;
336
+ raycaster: ThreeObject;
337
+ boundsTreeRefitBox: ThreeObject;
338
+ boundsTreeRefitNodes: Set<number>;
339
+ boundsTreeRefitCallbacks: ThreeObject;
340
+ boundsTreeRefitPrepared: boolean;
341
+ renderer: ThreeObject;
342
+ scene: ThreeObject;
343
+ camera: ThreeObject;
344
+ meshObject: ThreeObject | null;
345
+ vertexObject: ThreeObject | null;
346
+ selectedVertexObject: ThreeObject | null;
347
+ selectedPositionArray: Float32Array;
348
+ selectedPositionCapacity: number;
349
+ wireObject: ThreeObject | null;
350
+ wireMaterial: ThreeObject;
351
+ brushCursor: ThreeObject;
352
+ symmetryBrushCursors: ThreeObject[];
353
+ brushCursorCenter: ThreeObject;
354
+ brushCursorMaterial: ThreeObject;
355
+ brushCursorAxis: ThreeObject;
356
+ brushCursorNormal: ThreeObject;
357
+ textureObjects: ThreeObject[];
358
+ materialObjects: ThreeObject[];
359
+ selectedVertices: Set<number>;
360
+ dragPlane: ThreeObject;
361
+ dragPoint: ThreeObject;
362
+ dragNextPoint: ThreeObject;
363
+ cameraDirection: ThreeObject;
364
+ projectedVertex: ThreeObject;
365
+ boundsPoint: ThreeObject;
366
+ raycastHits: ThreeObject[];
367
+ brushDirectionScratch: Vec3;
368
+ brushCenterScratch: Vec3;
369
+ brushNormalScratch: Vec3;
370
+ brushVertexNormalScratch: Vec3;
371
+ brushPlanePointScratch: Vec3;
372
+ brushPlaneNormalScratch: Vec3;
373
+ brushPatternTangentScratch: Vec3;
374
+ brushPatternBitangentScratch: Vec3;
375
+ brushStrokeDirectionScratch: Vec3;
376
+ symmetryCenterScratch: Vec3;
377
+ symmetryNormalScratch: Vec3;
378
+ symmetryDirectionScratch: Vec3;
379
+ symmetrySampleCenters: Float64Array;
380
+ symmetrySampleNormals: Float64Array;
381
+ symmetrySampleDirections: Float64Array;
382
+ dragDeltaScratch: Vec3;
383
+ moveDeltaScratch: Vec3;
384
+ pickQueryCenterScratch: Vec3;
385
+ orbit: OrbitState;
386
+ _boundResize: () => void;
387
+ _boundPointerDown: (event: PointerEvent) => void;
388
+ _boundPointerMove: (event: PointerEvent) => void;
389
+ _boundPointerLeave: () => void;
390
+ _boundContextMenu: (event: Event) => void;
391
+ _boundPointerUp: (event: PointerEvent) => void;
392
+ _boundPointerCancel: (event: PointerEvent) => void;
393
+ _boundLostPointerCapture: (event: PointerEvent) => void;
394
+ _boundWindowBlur: () => void;
395
+ _boundWheel: (event: WheelEvent) => void;
396
+ constructor(options: MeshEditorOptions);
397
+ dispose(): void;
398
+ mesh_history_byte_length(mesh: EditableMesh): number;
399
+ create_history_entry(): MeshHistoryEntry | null;
400
+ ensure_history_position_capacity(vertexCount: number): void;
401
+ next_history_position_stamp(): number;
402
+ create_position_history_entry(): MeshPositionHistoryEntry | null;
403
+ create_inverse_position_history_entry(entry: MeshPositionHistoryEntry): MeshPositionHistoryEntry | null;
404
+ finalize_position_history_entry(entry: MeshPositionHistoryEntry): void;
405
+ history_state(): MeshEditorHistoryState;
406
+ notify_history_change(): void;
407
+ is_dirty(): boolean;
408
+ trim_history_memory(): void;
409
+ begin_history_action(): boolean;
410
+ begin_position_history_action(): boolean;
411
+ begin_pointer_history_action(pointerId: number, positionsOnly: boolean): boolean;
412
+ mark_history_changed(): void;
413
+ finish_history_action(): void;
414
+ rollback_history_action(): void;
415
+ restore_history_entry(entry: MeshHistoryEntry): void;
416
+ restore_position_history_entry(entry: MeshPositionHistoryEntry): void;
417
+ undo(): boolean;
418
+ redo(): boolean;
419
+ open(mesh: EditableMesh): void;
420
+ open_with_initial_tessellation(mesh: EditableMesh): MeshTessellationFrequency | null;
421
+ initialize_open_mesh(mesh: EditableMesh): void;
422
+ set_tool(tool: string | undefined): void;
423
+ set_brush_sub_mode(enabled: boolean): void;
424
+ set_brush(radius: number, strength: number, softness?: number): void;
425
+ set_brush_world_radius(radius: number, strength: number, softness?: number): void;
426
+ set_symmetry_vertical(enabled: boolean): void;
427
+ set_symmetry_horizontal(enabled: boolean): void;
428
+ set_symmetry(options: MeshEditorSymmetryOptions): void;
429
+ symmetry_applies_to_active_tool(): boolean;
430
+ append_symmetry_sample(centerX: number, centerY: number, centerZ: number, normalX: number, normalY: number, normalZ: number, directionX: number, directionY: number, directionZ: number, source: ArrayLike<number>, count: number): number;
431
+ build_symmetry_samples(center: ArrayLike<number>, normal: ArrayLike<number>, direction?: ArrayLike<number>): number;
432
+ load_symmetry_sample(index: number): void;
433
+ ensure_symmetry_cursor_capacity(count: number): void;
434
+ hide_brush_cursor(): void;
435
+ position_brush_cursor(cursor: ThreeObject, center: ArrayLike<number>, normal: ArrayLike<number>): boolean;
436
+ show_brush_cursor(center: ArrayLike<number>, normal: ArrayLike<number>): void;
437
+ update_brush_cursor_at(clientX: number, clientY: number): void;
438
+ queue_brush_cursor_update(clientX: number, clientY: number): void;
439
+ set_brush_color(color: ArrayLike<number> | string | undefined): void;
440
+ fill_vertex_colors(): boolean;
441
+ fill_texture_colors(): boolean;
442
+ clamp_color_component(value: number): number;
443
+ color_from_hex_string(color: string): Vec3;
444
+ set_visuals(options: MeshEditorVisualOptions): void;
445
+ tessellation_estimate(frequency: MeshTessellationFrequency): MeshTessellationEstimate;
446
+ tessellation_estimates(): [MeshTessellationEstimate, MeshTessellationEstimate];
447
+ tessellate_all(): EditableMesh;
448
+ tessellate_all_with_frequency(frequency: MeshTessellationFrequency): EditableMesh;
449
+ prepare_commit(): EditableMesh;
450
+ prepare_commit_async(): Promise<EditableMesh>;
451
+ accept_commit(): void;
452
+ commit(): EditableMesh;
453
+ cancel(): EditableMesh | null;
454
+ apply_vertex_delta(vertexIndex: number, delta: ArrayLike<number>): void;
455
+ apply_move_delta(center: ArrayLike<number>, delta: ArrayLike<number>, radius: number, rebuildWireframe?: boolean, strength?: number, softness?: number): number;
456
+ prepare_move_stroke(center: ArrayLike<number>, radius: number, softness: number, seedTriangleIndex?: number): number;
457
+ apply_prepared_move_delta(delta: ArrayLike<number>, strength: number, rebuildWireframe?: boolean): number;
458
+ ensure_brush_vertex_capacity(vertexCount: number): void;
459
+ next_surface_query_stamp(): number;
460
+ next_brush_source_stamp(): number;
461
+ cache_brush_source_vertex(vertexIndex: number, positions: Float32Array, stamp: number): void;
462
+ next_non_accumulating_source_stamp(): number;
463
+ cache_non_accumulating_source_vertex(vertexIndex: number, positions: Float32Array, normal: ArrayLike<number>, stamp: number): void;
464
+ build_brush_pattern_basis(normal: ArrayLike<number>, preferredDirection: ArrayLike<number> | undefined, tangentTarget: Vec3, bitangentTarget: Vec3): void;
465
+ sample_brush_plane(candidateVertices: number[], center: ArrayLike<number>, radius: number, fallbackNormal: ArrayLike<number>, pointTarget: Vec3, normalTarget: Vec3): void;
466
+ surface_normal_for_vertex(vertexIndex: number, fallback: ArrayLike<number>, positions: Float32Array, target: Vec3): Vec3;
467
+ next_brush_touched_stamp(): number;
468
+ query_brush_candidates(center: ArrayLike<number>, radius: number): number[] | null;
469
+ query_surface_brush_candidates(center: ArrayLike<number>, radius: number, seedTriangleIndex?: number): number[];
470
+ ensure_color_buffer(): Float32Array;
471
+ set_mesh_material_vertex_colors(enabled: boolean): void;
472
+ ensure_material_index(materialIndex: number): EditableMaterial;
473
+ isolate_vertices_by_material(): boolean;
474
+ material_indices_for_vertices(vertices: number[]): Set<number>;
475
+ sample_texture_linear(texture: EditableTexture, u: number, v: number, output: Vec3): void;
476
+ create_preview_texture(texture: EditableTexture): ThreeObject;
477
+ refresh_paint_representation(materialIndices: Set<number>): void;
478
+ create_white_texture_pixels(width: number, height: number): Uint8Array;
479
+ texture_reference_count(textureIndex: number): number;
480
+ ensure_texture_data_for_material(materialIndex: number): number;
481
+ ensure_texture_for_material(materialIndex: number, refreshExisting: boolean): number;
482
+ prepare_vertex_paint_representation(materialIndices: Set<number>): boolean;
483
+ prepare_texture_paint_representation(materialIndices: Set<number>): boolean;
484
+ refresh_material_texture(textureIndex: number, materialIndex: number): void;
485
+ gpu_texture_painter(): GpuTexturePainter;
486
+ sync_dirty_gpu_textures_to_cpu(fullReadback: boolean): void;
487
+ restore_cpu_texture_previews(): void;
488
+ invalidate_gpu_texture_painter(syncDirtyTextures: boolean): void;
489
+ update_spatial_vertices_after_edit(affectedVertices: number[]): void;
490
+ flush_spatial_index_updates(): void;
491
+ next_normal_touched_stamp(): number;
492
+ next_normal_triangle_stamp(): number;
493
+ refresh_triangle_normal(triangleIndex: number): void;
494
+ refresh_all_triangle_normals(): void;
495
+ cached_surface_normal_for_vertex(vertexIndex: number, fallback: ArrayLike<number>, target: Vec3): Vec3;
496
+ refresh_affected_normals(affectedVertices: number[]): void;
497
+ refresh_affected_normals_async(affectedVertices: number[]): Promise<void>;
498
+ begin_deferred_sculpt_normal_refresh(): void;
499
+ queue_deferred_sculpt_normal_refresh(affectedVertices: number[]): void;
500
+ end_deferred_sculpt_normal_refresh(): Promise<void>;
501
+ begin_brush_frame_edit_batch(): void;
502
+ queue_brush_frame_position_refresh(affectedVertices: number[], updateStart: number, updateEnd: number, rebuildWireframe: boolean): void;
503
+ end_brush_frame_edit_batch(): void;
504
+ refresh_edited_positions(affectedVertices: number[], updateStart: number, updateEnd: number, rebuildWireframe: boolean, canMutateAffectedVertices: boolean): void;
505
+ refresh_edited_colors(affectedVertices: number[], updateStart: number, updateEnd: number, canMutateAffectedVertices: boolean): void;
506
+ material_index_for_hit(hit: any): number;
507
+ brush_world_radius(): number;
508
+ minimum_world_length(): number;
509
+ recommended_brush_radius_minimum(): number;
510
+ active_brush_world_radius(): number;
511
+ texture_paint_metric_for_hit(hit: any): TexturePaintMetric;
512
+ texture_paint_distance(metric: TexturePaintMetric, deltaU: number, deltaV: number): number;
513
+ repeated_texture_paint_distance(metric: TexturePaintMetric, deltaU: number, deltaV: number): number;
514
+ texture_paint_metric_from_radius(radius: number): TexturePaintMetric;
515
+ texture_paint_triangles(): TexturePaintTriangle[];
516
+ has_usable_texture_uvs(): boolean;
517
+ paint_texture_pixel(texture: {
518
+ width: number;
519
+ height: number;
520
+ pixels: Uint8Array;
521
+ }, offset: number, amount: number): void;
522
+ apply_texture_paint_sample(uv: Vec2, metricOrRadius: TexturePaintMetric | number, materialIndex: number): number;
523
+ paint_texture_triangle_surface(triangle: TexturePaintTriangle, center: Vec3, radius: number, paintedTextureIndices: Set<number>): number;
524
+ rollback_failed_texture_paint(): void;
525
+ apply_texture_paint_surface(center: Vec3, seedTriangleIndex?: number, pathRatio?: number): number;
526
+ apply_symmetric_texture_paint_sample(center: Vec3, normal: Vec3, seedTriangleIndex?: number, pathRatio?: number): number;
527
+ apply_texture_paint_hit(hit: any, pathRatio?: number): number;
528
+ break_brush_stroke_segment(): void;
529
+ clear_selection(): void;
530
+ select_vertex(vertexIndex: number): void;
531
+ is_vertex_selected(vertexIndex: number): boolean;
532
+ apply_brush(center: ArrayLike<number>, direction: ArrayLike<number>, radius: number, strength: number, tool: string | undefined, rebuildWireframe?: boolean, seedTriangleIndex?: number, pathRatio?: number, patternDirection?: ArrayLike<number>): number;
533
+ resize(): void;
534
+ frame_mesh(): void;
535
+ vertex_count(): number;
536
+ update_effective_visuals(): void;
537
+ build_spatial_index(): void;
538
+ build_texture_paint_triangle_index(): TexturePaintTriangleIndex | null;
539
+ query_texture_paint_triangles(center: Vec3, radius: number, seedTriangleIndex?: number): TexturePaintTriangle[];
540
+ configure_sculpt_normal_workers(): void;
541
+ cancel_scheduled_sculpt_normal_workers(): void;
542
+ schedule_sculpt_normal_workers(): void;
543
+ build_topology_maps(): void;
544
+ cancel_scheduled_derived_refresh(): void;
545
+ schedule_derived_refresh(): void;
546
+ flush_pending_derived_refresh(rebuildWireframe: boolean): void;
547
+ sync_geometry_normals_to_session(): void;
548
+ update_ranges_from_vertices(vertexIndices: number[], fallbackStart: number, fallbackCount: number, canMutateVertexIndices: boolean): UpdateRange[];
549
+ set_update_range(index: number, start: number, count: number): void;
550
+ update_point_pixel_ratio(): void;
551
+ clear_scene_mesh(): void;
552
+ rebuild_scene_mesh(): void;
553
+ prepare_mesh_bounds_tree_refit(vertexIndices: number[]): void;
554
+ refit_mesh_bounds_tree(): void;
555
+ rebuild_wireframe(): void;
556
+ ensure_selected_position_capacity(vertexCount: number): void;
557
+ refresh_selection_geometry(): void;
558
+ expand_geometry_bounds(updateRanges: UpdateRange[] | undefined, vertexIndices?: number[]): void;
559
+ refresh_geometry(options: RefreshGeometryOptions | boolean): void;
560
+ handle_pointer_down(event: PointerEvent): void;
561
+ handle_pointer_move(event: PointerEvent): void;
562
+ queue_brush_pointer_position(clientX: number, clientY: number): void;
563
+ queue_brush_pointer_event(event: PointerEvent): void;
564
+ should_use_sculpt_normal_workers(): boolean;
565
+ schedule_brush_frame(): void;
566
+ wait_for_brush_idle(): Promise<void>;
567
+ resolve_brush_idle(): void;
568
+ process_brush_frame_async(): Promise<void>;
569
+ brush_world_per_css_pixel(center: Vec3 | null): number;
570
+ brush_spacing_css_pixels(center: Vec3 | null): number;
571
+ brush_path_ratio_css_pixels(distance: number, center: Vec3 | null): number;
572
+ apply_move_pointer_sample(clientX: number, clientY: number): void;
573
+ apply_surface_brush_pointer_sample(clientX: number, clientY: number, pathRatio: number): void;
574
+ apply_surface_brush_pointer_sample_async(clientX: number, clientY: number, pathRatio: number): Promise<void>;
575
+ apply_pending_brush_events(finalizeStroke?: boolean): void;
576
+ apply_next_pending_brush_dab_async(strokeState: BrushStrokeState, finalizeStroke: boolean): Promise<boolean>;
577
+ apply_pending_brush_events_async(finalizeStroke?: boolean): Promise<void>;
578
+ complete_brush_stroke(strokeState: BrushStrokeState): void;
579
+ release_pointer_capture(pointerId: number): void;
580
+ finish_pointer(pointerId: number, finalizeDerived: boolean): void;
581
+ handle_pointer_up(event: PointerEvent): void;
582
+ handle_pointer_cancel(event: PointerEvent): void;
583
+ handle_lost_pointer_capture(event: PointerEvent): void;
584
+ cancel_active_pointer(): void;
585
+ apply_brush_sample(center: Vec3, normal: Vec3, seedTriangleIndex?: number, pathRatio?: number, patternDirection?: ArrayLike<number>): void;
586
+ apply_brush_sample_async(center: Vec3, normal: Vec3, seedTriangleIndex?: number, pathRatio?: number, patternDirection?: ArrayLike<number>): Promise<void>;
587
+ update_brush_stroke_surface_hit(hit: any): void;
588
+ apply_brush_hit(hit: any, pathRatio?: number): void;
589
+ handle_wheel(event: WheelEvent): void;
590
+ pan_camera(dx: number, dy: number): void;
591
+ pick_mesh(event: PointerEvent): any;
592
+ pick_mesh_at(clientX: number, clientY: number): any;
593
+ pick_vertex(event: PointerEvent, meshHit: any): {
594
+ index: number;
595
+ point: any;
596
+ } | null;
597
+ apply_orbit_camera(): void;
598
+ begin_deferred_render(): void;
599
+ end_deferred_render(): void;
600
+ render(): void;
601
+ set_status(message: string): void;
602
+ }
603
+ export {};