88 lines
2.8 KiB
JavaScript
88 lines
2.8 KiB
JavaScript
import { TextureLoader, Box3, Vector3, Group } from "three";
|
|
|
|
function assignParams(mesh, params){
|
|
['scale', 'rotation', 'position'].forEach(p=>params[p] && mesh[p].fromArray(params[p]));
|
|
[
|
|
'visible', 'name', 'fontSize', 'color', 'lineHeight',
|
|
'maxWidth', 'anchorX', 'anchorY', 'outlineColor', 'outlineWidth', 'textAlign'
|
|
].forEach(p=>{
|
|
if (params[p]!==undefined) mesh[p] = params[p];
|
|
});
|
|
}
|
|
|
|
function assignMaterial(mesh, params){
|
|
if (params.name && params.material){
|
|
//let mp = params.material.metalness ? new MeshStandardMaterial(params.material) : new MeshBasicMaterial(params.material)
|
|
Object.assign(mesh.material, params.material)
|
|
if (params.dm){
|
|
var dm = new TextureLoader().setPath(params.path).load(params.dm);
|
|
mesh.material.map = dm;
|
|
}
|
|
if (params.nm){
|
|
mesh.material.normalMap = new TextureLoader().setPath(params.path).load(params.nm);
|
|
}
|
|
if (params.em) {
|
|
mesh.material.emissiveMap = new TextureLoader().setPath(params.path).load(params.em);
|
|
}
|
|
//mesh.material = mp;
|
|
mesh.material.needsUpdate = true;
|
|
}
|
|
}
|
|
|
|
function getBoundingBox(object){
|
|
return new Box3().setFromObject(object);
|
|
}
|
|
|
|
function getBoundingBoxSize(bb){
|
|
return new Vector3(bb.max.x - bb.min.x, bb.max.y - bb.min.y, bb.max.z - bb.min.z);
|
|
}
|
|
|
|
function getBoundingBoxMaxLength(bb){
|
|
let size = getBoundingBoxSize(bb)
|
|
return Math.max(size.x, size.y, size.z)
|
|
}
|
|
|
|
function getBoundingBoxCenterPoint(bb, relativeTo){
|
|
relativeTo = relativeTo || new Vector3(0,0,0)
|
|
let size = getBoundingBoxSize(bb)
|
|
return new Vector3(
|
|
bb.min.x + (size.x)/2 - relativeTo.x,
|
|
bb.min.y + (size.y)/2 - relativeTo.y,
|
|
bb.min.z + (size.z)/2 - relativeTo.z
|
|
)
|
|
}
|
|
|
|
function autoScale(object, mk = 1) {
|
|
if (mk === null) return;
|
|
let bb = getBoundingBox(object);
|
|
let k = getBoundingBoxMaxLength(bb);
|
|
object.scale.multiplyScalar(mk / k);
|
|
}
|
|
|
|
function wrapInGroup(object){
|
|
if (object.isWrapper) return object;
|
|
let group = new Group();
|
|
group.userData.bbox = getBoundingBox(object);
|
|
group.add(object);
|
|
group.userData.object = object;
|
|
group.isWrapper = true;
|
|
return group;
|
|
}
|
|
|
|
function centerOrigin(object){
|
|
let group = wrapInGroup(object);
|
|
let position = getBoundingBoxCenterPoint(group.userData.bbox, object.position).negate();
|
|
object.position.copy(position)
|
|
return group;
|
|
}
|
|
|
|
function bottomOrigin(object){
|
|
let group = centerOrigin(object);
|
|
group.userData.object.position.y = -group.userData.bbox.min.y
|
|
return group;
|
|
}
|
|
|
|
export {
|
|
assignParams, assignMaterial, autoScale, centerOrigin, wrapInGroup, bottomOrigin,
|
|
getBoundingBox, getBoundingBoxSize, getBoundingBoxMaxLength, getBoundingBoxCenterPoint
|
|
} |