UNPKG

@inweb/viewer-three

Version:

JavaScript library for rendering CAD and BIM files in a browser using Three.js

100 lines (83 loc) 3.23 kB
/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// import { BufferGeometry, DoubleSide, Float32BufferAttribute, Line, LineBasicMaterial, Mesh, MeshBasicMaterial, Object3D, Plane, Vector3, } from "three"; class PlaneHelper extends Line { public plane: Plane; public size: number; public offset: Vector3; public helper: Object3D; constructor(plane: Plane, size = 1, color = 0xffff00, offset: Vector3 = new Vector3()) { // const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0]; const positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0]; const geometry = new BufferGeometry(); geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); geometry.computeBoundingSphere(); super(geometry, new LineBasicMaterial({ color, toneMapped: false })); (this as any).type = "PlaneHelper"; this.plane = plane; this.size = size; this.offset = offset; const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]; const geometry2 = new BufferGeometry(); geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3)); geometry2.computeBoundingSphere(); this.helper = new Mesh( geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false, side: DoubleSide, }) ); this.add(this.helper); } dispose() { this.geometry.dispose(); (this.material as any).dispose(); (this.children[0] as any).geometry.dispose(); (this.children[0] as any).material.dispose(); } override updateMatrixWorld(force: boolean) { this.position.set(0, 0, 0); this.lookAt(this.plane.normal); this.position.copy(this.offset); this.translateZ(-(this.offset.dot(this.plane.normal) + this.plane.constant)); this.scale.set(0.5 * this.size, 0.5 * this.size, 1); super.updateMatrixWorld(force); } } export { PlaneHelper };