1 line
8.2 KiB
Plaintext
1 line
8.2 KiB
Plaintext
|
|
{"version":3,"file":"TubePainter.cjs","sources":["../../src/misc/TubePainter.js"],"sourcesContent":["import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DynamicDrawUsage,\n Matrix4,\n Mesh,\n MeshStandardMaterial,\n Vector3,\n} from 'three'\n\nfunction TubePainter() {\n const BUFFER_SIZE = 1000000 * 3\n\n const positions = new BufferAttribute(new Float32Array(BUFFER_SIZE), 3)\n positions.usage = DynamicDrawUsage\n\n const normals = new BufferAttribute(new Float32Array(BUFFER_SIZE), 3)\n normals.usage = DynamicDrawUsage\n\n const colors = new BufferAttribute(new Float32Array(BUFFER_SIZE), 3)\n colors.usage = DynamicDrawUsage\n\n const geometry = new BufferGeometry()\n geometry.setAttribute('position', positions)\n geometry.setAttribute('normal', normals)\n geometry.setAttribute('color', colors)\n geometry.drawRange.count = 0\n\n const material = new MeshStandardMaterial({\n vertexColors: true,\n })\n\n const mesh = new Mesh(geometry, material)\n mesh.frustumCulled = false\n\n //\n\n function getPoints(size) {\n const PI2 = Math.PI * 2\n\n const sides = 10\n const array = []\n const radius = 0.01 * size\n\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * PI2\n array.push(new Vector3(Math.sin(angle) * radius, Math.cos(angle) * radius, 0))\n }\n\n return array\n }\n\n //\n\n const vector1 = new Vector3()\n const vector2 = new Vector3()\n const vector3 = new Vector3()\n const vector4 = new Vector3()\n\n const color = new Color(0xffffff)\n let size = 1\n\n function stroke(position1, position2, matrix1, matrix2) {\n if (position1.distanceToSquared(position2) === 0) return\n\n let count = geometry.drawRange.count\n\n const points = getPoints(size)\n\n for (let i = 0, il = points.length; i < il; i++) {\n const vertex1 = points[i]\n const vertex2 = points[(i + 1) % il]\n\n // positions\n\n vector1.copy(vertex1).applyMatrix4(matrix2).add(position2)\n vector2.copy(vertex2).applyMatrix4(matrix2).add(position2)\n vector3.copy(vertex2).applyMatrix4(matrix1).add(position1)\n vector4.copy(vertex1).applyMatrix4(matrix1).add(position1)\n\n vector1.toArray(positions.array, (count + 0) * 3)\n vector2.toArray(positions.array, (count + 1) * 3)\n vector4.toArray(positions.array, (count + 2) * 3)\n\n vector2.toArray(positions.array, (count + 3) * 3)\n vector3.toArray(positions.array, (count + 4) * 3)\n vector4.toArray(positions.array, (count + 5) * 3)\n\n // normals\n\n vector1.copy(vertex1).applyMatrix4(matrix2).normalize()\n vector2.copy(vertex2).applyMatrix4(matrix2).normalize()\n vector3.copy(vertex2).applyMatrix4(matrix1).normalize()\n vector4.copy(vertex1).applyMatrix4(matrix1).normalize()\n\n vector1.toArray(normals.array, (count + 0) * 3)\n vector2.toArray(normals.array, (count + 1) * 3)\n vector4.toArray(normals.array, (count + 2) * 3)\n\n vector2.toArray(normals.array, (count + 3) * 3)\n vector3.toArray(normals.array, (count + 4) * 3)\n vector4.toArray(normals.array, (count + 5) * 3)\n\n // colors\n\n color.toArray(colors.array, (count + 0) * 3)\n color.toArray(colors.array, (count + 1) * 3)\n color.toArray(colors.array, (count + 2) * 3)\n\n color.toArray(colors.array, (count + 3) * 3)\n color.toArray(colors.array, (count + 4) * 3)\n color.toArray(colors.array, (count + 5) * 3)\n\n count += 6\n }\n\n geometry.drawRange.count = count\n }\n\n //\n\n const up = new Vector3(0, 1, 0)\n\n const point1 = new Vector3()\n const point2 = new Vector3()\n\n const matrix1 = new Matrix4()\n const matrix2 = new Matrix4()\n\n function moveTo(position) {\n point1.copy(position)\n matrix1.lookAt(point2, point1, up)\n\n point2.copy(position)\n matrix2.copy(matrix1)\n }\n\n function lineTo(position) {\n point1.copy(position)\n matrix1.lookAt(point2, point1, up)\n\n stroke(point1, point2, matrix1, matrix2)\n\n point2.copy(point1)\n matrix2.copy(matrix1)\n
|