manifold-3d
Version:
Geometry library for topological robustness
108 lines • 3.48 kB
JavaScript
// Copyright 2025 The Manifold Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
const memoryRegistry = Array();
// manifold static methods (that return a new manifold)
const manifoldStaticFunctions = [
'cube', 'cylinder', 'sphere', 'tetrahedron', 'extrude', 'revolve', 'compose',
'union', 'difference', 'intersection', 'levelSet', 'smooth', 'ofMesh', 'hull'
];
// manifold member functions (that return a new manifold)
const manifoldMemberFunctions = [
'add',
'subtract',
'intersect',
'decompose',
'warp',
'transform',
'translate',
'rotate',
'scale',
'mirror',
'calculateCurvature',
'calculateNormals',
'smoothByNormals',
'smoothOut',
'refine',
'refineToLength',
'refineToTolerance',
'setProperties',
'setTolerance',
'simplify',
'asOriginal',
'trimByPlane',
'split',
'splitByPlane',
'slice',
'project',
'hull'
];
// CrossSection static methods (that return a new cross-section)
const crossSectionStaticFunctions = [
'square', 'circle', 'union', 'difference', 'intersection', 'compose',
'ofPolygons', 'hull'
];
// CrossSection member functions (that return a new cross-section)
const crossSectionMemberFunctions = [
'add', 'subtract', 'intersect', 'rectClip', 'decompose', 'transform',
'translate', 'rotate', 'scale', 'mirror', 'simplify', 'offset', 'hull'
];
/**
* Delete any objects tagged for garbage collection.
*/
export const cleanup = () => {
for (const obj of memoryRegistry) {
// decompose result is an array of manifolds
if (obj instanceof Array)
for (const elem of obj)
elem.delete();
else
obj.delete();
}
memoryRegistry.length = 0;
};
/**
* Intercept function calls for garbage collection.
*
* The returned object of the call will be added to the garbage collection list.
* When `cleanup()` called, the `delete()` method on that object will be called.
*
* @param originalFn
* @returns
*/
export const garbageCollectFunction = (originalFn) => {
return (...args) => {
//@ts-ignore
const result = originalFn(...args);
memoryRegistry.push(result);
return result;
};
};
const interceptMethods = (target, methodNames) => {
for (const name of methodNames) {
const originalFn = target[name];
target[name] = garbageCollectFunction(originalFn);
}
};
/**
* Set up garbage collection for a white listed set of methods belonging
* to the Manifold WASM module.
*/
export const garbageCollectManifold = (target) => {
interceptMethods(target.Manifold, manifoldStaticFunctions);
interceptMethods(target.Manifold.prototype, manifoldMemberFunctions);
interceptMethods(target.CrossSection, crossSectionStaticFunctions);
interceptMethods(target.CrossSection.prototype, crossSectionMemberFunctions);
return target;
};
//# sourceMappingURL=garbage-collector.js.map