@vci/quick-three
Version:
quick three
68 lines (63 loc) • 2.01 kB
JavaScript
import MaterialPatch from "./MaterialPatch";
import { release } from "@vci/helper";
export default class O3DisposerHelper {
/**
* 销毁几何体的材质
* @param material 材质
* @param onlyDisposeMap 是否只释放材质贴图
* @param enableDisposeImage 是否只释放材质贴图对应的image
*/
static DisposeMaterial(material, onlyDisposeMap = false, enableDisposeImage = false) {
Object.keys(material).forEach(mk => {
if (material[mk] && material[mk].isTexture) {
const texture = material[mk];
if (texture.image && enableDisposeImage) {
if (texture.image instanceof ImageBitmap) texture.image.close();
else {
texture.image.remove();
URL.revokeObjectURL(texture.image.src);
texture.image.src = "";
}
}
texture.dispose && texture.dispose();
}
});
!onlyDisposeMap && material.dispose();
}
/**
* 销毁几何体的材质
* @param o3 Object3D实例
*/
static DisposeMaterialOfO3(o3) {
MaterialPatch.TraverseMaterials(o3, material => O3DisposerHelper.DisposeMaterial(material));
}
/**
* 销毁几何体
* @param o3 Object3D实例
*/
static DisposeObject3DHandle(o3) {
o3.material && O3DisposerHelper.DisposeMaterialOfO3(o3);
o3.geometry && o3.geometry.dispose();
}
/**
* 销毁某个几何体下的所有子实例
* @param o3s 集合体实例数组
* @param parentO3 父级几何体
* @constructor
*/
static DisposeObject3D(o3s = [], parentO3) {
const removes = [];
!Array.isArray(o3s) && (o3s = [o3s]);
for (let i = 0; i < o3s.length; i++) {
const o3 = o3s[i];
if (o3.children && o3.children.length > 0) O3DisposerHelper.DisposeObject3D(o3.children, o3);
O3DisposerHelper.DisposeObject3DHandle(o3);
removes.push(o3);
}
removes.forEach(ro => {
parentO3.remove(ro);
release(ro);
});
removes.length = 0;
}
}