Advertisement
yskang

threejs-viewer-26

May 12th, 2021
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Add IfcLoader.js
  2. import * as WebIFC from 'https://unpkg.com/web-ifc/web-ifc-api.js';
  3.  
  4. class IfcLoader extends THREE.Loader {
  5.     constructor(manager) {
  6.         super(manager);
  7.  
  8.         this.ifcAPI = new WebIFC.IfcAPI();
  9.         this.ifcAPI.Init();
  10.         this.modelID = null;
  11.         this.geometryByMaterials = {};
  12.     }
  13.  
  14.     load(url, onLoad, onProgress, onError) {
  15.         const loader = new THREE.FileLoader(this.manager);
  16.         loader.setPath(this.path);
  17.         loader.setResponseType('arraybuffer');
  18.         loader.setRequestHeader(this.requestHeader);
  19.         loader.setWithCredentials(this.withCredentials);
  20.         loader.load(
  21.             url,
  22.             (buffer) => {
  23.                 try {
  24.                     onLoad(this.parse(buffer));
  25.                 } catch (e) {
  26.                     if (onError) {
  27.                         onError(e);
  28.                     } else {
  29.                         console.error(e);
  30.                     }
  31.  
  32.                     this.manager.itemError(url);
  33.                 }
  34.             },
  35.             onProgress,
  36.             onError
  37.         );
  38.     }
  39.  
  40.     getIfcItemInformation(expressID) {
  41.         return this.ifcAPI.GetLine(this.modelID, expressID);
  42.     }
  43.  
  44.     parse(buffer) {
  45.         const ifcAPI = this.ifcAPI;
  46.         const materials = this.geometryByMaterials;
  47.         var data = new Uint8Array(buffer);
  48.         this.modelID = ifcAPI.OpenModel('example.ifc', data);
  49.         return loadAllGeometry(this.modelID);
  50.  
  51.         function loadAllGeometry(modelID) {
  52.             var flatMeshes = getFlatMeshes(modelID);
  53.             var mainObject = new THREE.Object3D();
  54.             for (var i = 0; i < flatMeshes.size(); i++) {
  55.                 var placedGeometries = flatMeshes.get(i).geometries;
  56.                 for (var j = 0; j < placedGeometries.size(); j++) {
  57.                     const mesh = getPlacedGeometry(modelID, placedGeometries.get(j))
  58.                     mesh.expressID = flatMeshes.get(i).expressID;
  59.                     mainObject.add(mesh);
  60.                 }
  61.             }
  62.             return mainObject;
  63.         }
  64.  
  65.         function getFlatMeshes(modelID) {
  66.             var flatMeshes = ifcAPI.LoadAllGeometry(modelID);
  67.             return flatMeshes;
  68.         }
  69.  
  70.         function getPlacedGeometry(modelID, placedGeometry) {
  71.             var geometry = getBufferGeometry(modelID, placedGeometry);
  72.             var material = getMaterial(placedGeometry.color);
  73.             var mesh = new THREE.Mesh(geometry, material);
  74.             mesh.expressID = placedGeometry.expressID;
  75.             mesh.matrix = getMeshMatrix(placedGeometry.flatTransformation);
  76.             mesh.matrixAutoUpdate = false;
  77.             return mesh;
  78.         }
  79.  
  80.         function getBufferGeometry(modelID, placedGeometry) {
  81.             var geometry = ifcAPI.GetGeometry(modelID, placedGeometry.geometryExpressID);
  82.             var verts = ifcAPI.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());
  83.             var indices = ifcAPI.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize());
  84.             var bufferGeometry = ifcGeometryToBuffer(verts, indices);
  85.             return bufferGeometry;
  86.         }
  87.  
  88.         function getMeshMatrix(matrix) {
  89.             var mat = new THREE.Matrix4();
  90.             mat.fromArray(matrix);
  91.             return mat;
  92.         }
  93.  
  94.         function ifcGeometryToBuffer(vertexData, indexData) {
  95.             var geometry = new THREE.BufferGeometry();
  96.             var { vertices, normals } = extractVertexData(vertexData);
  97.             geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
  98.             geometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
  99.             geometry.setIndex(new THREE.BufferAttribute(indexData, 1));
  100.             return geometry;
  101.         }
  102.  
  103.         function extractVertexData(vertexData) {
  104.             var vertices = [],
  105.                 normals = [];
  106.             var isNormalData = false;
  107.             for (var i = 0; i < vertexData.length; i++) {
  108.                 isNormalData ? normals.push(vertexData[i]) : vertices.push(vertexData[i]);
  109.                 if ((i + 1) % 3 == 0) isNormalData = !isNormalData;
  110.             }
  111.             return { vertices, normals };
  112.         }
  113.  
  114.         function getMaterial(color) {
  115.             var id = `${color.x}${color.y}${color.z}${color.w}`;
  116.             if (!materials[id]) {
  117.                 var col = new THREE.Color(color.x, color.y, color.z);
  118.                 var newMaterial = new THREE.MeshPhongMaterial({ color: col, side: THREE.DoubleSide });
  119.                 newMaterial.transparent = color.w !== 1;
  120.                 if (newMaterial.transparent) newMaterial.opacity = color.w;
  121.                 materials[id] = newMaterial;
  122.             }
  123.             return materials[id];
  124.         }
  125.     }
  126. }
  127.  
  128. window.IfcLoader = IfcLoader;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement