ComputerGraphics/20210129/demo/js/loader.js

102 lines
2.6 KiB
JavaScript

BIMLoader = function(json)
{
// 解析材质
var materials = new Array();
json.materials.forEach(element => {
var material = ParseMaterial(element);
materials.push(material);
});
// 解析网格
var meshes = new Array();
json.meshes.forEach(element => {
var geometry = ParseGeometry(element);
var material = materials[element.material];
var mesh = new THREE.Mesh(geometry, material);
meshes.push(mesh);
});
// 解析物体
var scene = new THREE.Scene();
json.instances.forEach(element => {
var object = ParseInstance(element, meshes, element.mesh);
scene.add(object);
});
return scene;
function ParseMaterial(materialJson)
{
var material = new THREE.MeshPhongMaterial();
if(materialJson.color)
material.color.setStyle(materialJson.color);
if(materialJson.transparent)
{
material.transparent = true;
material.opacity = materialJson.transparent;
}
return material;
}
function ParseGeometry(geometryJson)
{
var geometry = new THREE.BufferGeometry();
geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(geometryJson.vertices), 3));
geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(geometryJson.indices), 1));
geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometryJson.normals), 3));
return geometry;
}
function ParseInstance(instanceJson, meshes, index)
{
var obj = new THREE.Object3D();
if(instanceJson.id)
obj.name = instanceJson.id;
if(instanceJson.transform)
{
var matrix4 = new THREE.Matrix4();
matrix4.fromArray(instanceJson.transform);
obj.matrixAutoUpdate = false;
obj.matrix.copy(matrix4);
obj.matrixWorldNeedsUpdate = true;
}
if(instanceJson.visible)
obj.visible = instanceJson.visible;
if(instanceJson.info)
obj.userData = instanceJson.info;
if(Array.isArray(index))
{
index.forEach(element => {
PutMesh(meshes[element], obj);
});
}
else
{
PutMesh(meshes[index], obj);
}
return obj;
}
function PutMesh(mesh, obj)
{
var edges = new THREE.EdgesGeometry(mesh.geometry);
var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({color: 0xff0000}));
obj.add(mesh);
obj.add(line);
}
}