mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-02 20:06:06 +01:00 
			
		
		
		
	1. change function comments to the minimal [tsdoc](https://tsdoc.org/) style. This has the benefit of making editors show the doc string in tooltips when the function is hovered: <img width="521" height="110" alt="image" src="https://github.com/user-attachments/assets/b966f4f1-8239-433a-a456-5bd5c05d69ef" /> 2. disable eslint `multiline-comment-style` as it conflicts with tsdoc. --------- Signed-off-by: silverwind <me@silverwind.io>
		
			
				
	
	
		
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import type {FileRenderPlugin} from '../plugin.ts';
 | 
						|
import {extname} from '../../utils.ts';
 | 
						|
 | 
						|
// support common 3D model file formats, use online-3d-viewer library for rendering
 | 
						|
 | 
						|
/* a simple text STL file example:
 | 
						|
solid SimpleTriangle
 | 
						|
  facet normal 0 0 1
 | 
						|
    outer loop
 | 
						|
      vertex 0 0 0
 | 
						|
      vertex 1 0 0
 | 
						|
      vertex 0 1 0
 | 
						|
    endloop
 | 
						|
  endfacet
 | 
						|
endsolid SimpleTriangle
 | 
						|
*/
 | 
						|
 | 
						|
export function newRenderPlugin3DViewer(): FileRenderPlugin {
 | 
						|
  // Some extensions are text-based formats:
 | 
						|
  // .3mf .amf .brep: XML
 | 
						|
  // .fbx: XML or BINARY
 | 
						|
  // .dae .gltf: JSON
 | 
						|
  // .ifc, .igs, .iges, .stp, .step are: TEXT
 | 
						|
  // .stl .ply: TEXT or BINARY
 | 
						|
  // .obj .off .wrl: TEXT
 | 
						|
  // So we need to be able to render when the file is recognized as plaintext file by backend.
 | 
						|
  //
 | 
						|
  // It needs more logic to make it overall right (render a text 3D model automatically):
 | 
						|
  // we need to distinguish the ambiguous filename extensions.
 | 
						|
  // For example: "*.obj, *.off, *.step" might be or not be a 3D model file.
 | 
						|
  // So when it is a text file, we can't assume that "we only render it by 3D plugin",
 | 
						|
  // otherwise the end users would be impossible to view its real content when the file is not a 3D model.
 | 
						|
  const SUPPORTED_EXTENSIONS = [
 | 
						|
    '.3dm', '.3ds', '.3mf', '.amf', '.bim', '.brep',
 | 
						|
    '.dae', '.fbx', '.fcstd', '.glb', '.gltf',
 | 
						|
    '.ifc', '.igs', '.iges', '.stp', '.step',
 | 
						|
    '.stl', '.obj', '.off', '.ply', '.wrl',
 | 
						|
  ];
 | 
						|
 | 
						|
  return {
 | 
						|
    name: '3d-model-viewer',
 | 
						|
 | 
						|
    canHandle(filename: string, _mimeType: string): boolean {
 | 
						|
      const ext = extname(filename).toLowerCase();
 | 
						|
      return SUPPORTED_EXTENSIONS.includes(ext);
 | 
						|
    },
 | 
						|
 | 
						|
    async render(container: HTMLElement, fileUrl: string): Promise<void> {
 | 
						|
      // TODO: height and/or max-height?
 | 
						|
      const OV = await import(/* webpackChunkName: "online-3d-viewer" */'online-3d-viewer');
 | 
						|
      const viewer = new OV.EmbeddedViewer(container, {
 | 
						|
        backgroundColor: new OV.RGBAColor(59, 68, 76, 0),
 | 
						|
        defaultColor: new OV.RGBColor(65, 131, 196),
 | 
						|
        edgeSettings: new OV.EdgeSettings(false, new OV.RGBColor(0, 0, 0), 1),
 | 
						|
      });
 | 
						|
      viewer.LoadModelFromUrlList([fileUrl]);
 | 
						|
    },
 | 
						|
  };
 | 
						|
}
 |