BoxLineGeometry.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {
  2. BufferGeometry,
  3. Float32BufferAttribute
  4. } from 'three';
  5. /**
  6. * A special type of box geometry intended for {@link LineSegments}.
  7. *
  8. * ```js
  9. * const geometry = new THREE.BoxLineGeometry();
  10. * const material = new THREE.LineBasicMaterial( { color: 0x00ff00 } );
  11. * const lines = new THREE.LineSegments( geometry, material );
  12. * scene.add( lines );
  13. * ```
  14. *
  15. * @augments BufferGeometry
  16. * @three_import import { BoxLineGeometry } from 'three/addons/geometries/BoxLineGeometry.js';
  17. */
  18. class BoxLineGeometry extends BufferGeometry {
  19. /**
  20. * Constructs a new box line geometry.
  21. *
  22. * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.
  23. * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.
  24. * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.
  25. * @param {number} [widthSegments=1] - Number of segmented rectangular sections along the width of the sides.
  26. * @param {number} [heightSegments=1] - Number of segmented rectangular sections along the height of the sides.
  27. * @param {number} [depthSegments=1] - Number of segmented rectangular sections along the depth of the sides.
  28. */
  29. constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {
  30. super();
  31. widthSegments = Math.floor( widthSegments );
  32. heightSegments = Math.floor( heightSegments );
  33. depthSegments = Math.floor( depthSegments );
  34. const widthHalf = width / 2;
  35. const heightHalf = height / 2;
  36. const depthHalf = depth / 2;
  37. const segmentWidth = width / widthSegments;
  38. const segmentHeight = height / heightSegments;
  39. const segmentDepth = depth / depthSegments;
  40. const vertices = [];
  41. let x = - widthHalf;
  42. let y = - heightHalf;
  43. let z = - depthHalf;
  44. for ( let i = 0; i <= widthSegments; i ++ ) {
  45. vertices.push( x, - heightHalf, - depthHalf, x, heightHalf, - depthHalf );
  46. vertices.push( x, heightHalf, - depthHalf, x, heightHalf, depthHalf );
  47. vertices.push( x, heightHalf, depthHalf, x, - heightHalf, depthHalf );
  48. vertices.push( x, - heightHalf, depthHalf, x, - heightHalf, - depthHalf );
  49. x += segmentWidth;
  50. }
  51. for ( let i = 0; i <= heightSegments; i ++ ) {
  52. vertices.push( - widthHalf, y, - depthHalf, widthHalf, y, - depthHalf );
  53. vertices.push( widthHalf, y, - depthHalf, widthHalf, y, depthHalf );
  54. vertices.push( widthHalf, y, depthHalf, - widthHalf, y, depthHalf );
  55. vertices.push( - widthHalf, y, depthHalf, - widthHalf, y, - depthHalf );
  56. y += segmentHeight;
  57. }
  58. for ( let i = 0; i <= depthSegments; i ++ ) {
  59. vertices.push( - widthHalf, - heightHalf, z, - widthHalf, heightHalf, z );
  60. vertices.push( - widthHalf, heightHalf, z, widthHalf, heightHalf, z );
  61. vertices.push( widthHalf, heightHalf, z, widthHalf, - heightHalf, z );
  62. vertices.push( widthHalf, - heightHalf, z, - widthHalf, - heightHalf, z );
  63. z += segmentDepth;
  64. }
  65. this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  66. }
  67. }
  68. export { BoxLineGeometry };