All files / core/src/loaders/utils/mesh createMesh.ts

0% Statements 0/36
0% Branches 0/13
0% Functions 0/6
0% Lines 0/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                                                                                                                                                               
import type { IGeometry, PublicMeshData } from '../../../types';
import { GeometryType, MeshType } from '../../../enums';
import { Mesh } from '../../../cache/classes/Mesh';
import { validateMesh } from './validateMesh';
import vtkMTLReader from '@kitware/vtk.js/IO/Misc/MTLReader';
import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
 
export function createMesh(
  geometryId: string,
  meshData: PublicMeshData
): Promise<IGeometry> {
  // validate the data to make sure it is a valid mesh
  validateMesh(meshData);
 
  const mesh = new Mesh({
    ...meshData,
  });
 
  const geometry: IGeometry = {
    id: geometryId,
    type: GeometryType.MESH,
    data: mesh,
    sizeInBytes: mesh.sizeInBytes,
  };
 
  switch (meshData.format) {
    case MeshType.PLY:
      if (meshData.materialUrl) {
        const img = new Image();
        return new Promise<IGeometry>((resolve, reject) => {
          img.onload = () => {
            try {
              const texture = vtkTexture.newInstance();
              texture.setInterpolate(true);
              texture.setImage(img);
              mesh.defaultActor.addTexture(texture);
              resolve(geometry);
            } catch (error) {
              reject(error);
            }
          };
          img.onerror = (error) => reject(error);
          img.src = meshData.materialUrl;
        });
      }
      return Promise.resolve(geometry);
    case MeshType.OBJ:
      if (meshData.materialUrl) {
        const reader = vtkMTLReader.newInstance();
        return reader
          .setUrl(meshData.materialUrl)
          .then(() => {
            for (let i = 0; i < mesh.actors.length; i++) {
              const actor = mesh.actors[i];
              const mapper = actor.getMapper();
              if (mapper) {
                const inputData = mapper.getInputData();
                if (inputData) {
                  const name = inputData.get('name').name;
                  reader.applyMaterialToActor(name, actor);
                }
              }
            }
            return geometry;
          })
          .catch((error) => {
            throw new Error(`Failed to load material: ${error}`);
          });
      }
      return Promise.resolve(geometry);
    case MeshType.STL:
    case MeshType.VTP:
      return Promise.resolve(geometry);
    default:
      return Promise.reject(
        new Error(`Unsupported format: ${meshData.format}`)
      );
  }
}