three-stdlib 2.30.5 → 2.31.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lines/LineMaterial.cjs.map +1 -1
- package/lines/LineMaterial.js.map +1 -1
- package/lines/LineSegments2.cjs +20 -7
- package/lines/LineSegments2.cjs.map +1 -1
- package/lines/LineSegments2.js +21 -8
- package/lines/LineSegments2.js.map +1 -1
- package/lines/Wireframe.cjs +8 -0
- package/lines/Wireframe.cjs.map +1 -1
- package/lines/Wireframe.js +9 -1
- package/lines/Wireframe.js.map +1 -1
- package/package.json +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineMaterial.cjs","sources":["../../src/lines/LineMaterial.js"],"sourcesContent":["/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * resolution: <Vector2>, // to be set by renderer\n * }\n */\n\nimport { ShaderMaterial, UniformsLib, UniformsUtils, Vector2, REVISION } from 'three'\n\nclass LineMaterial extends ShaderMaterial {\n constructor(parameters) {\n super({\n type: 'LineMaterial',\n\n uniforms: UniformsUtils.clone(\n UniformsUtils.merge([\n UniformsLib.common,\n UniformsLib.fog,\n {\n worldUnits: { value: 1 },\n linewidth: { value: 1 },\n resolution: { value: new Vector2(1, 1) },\n dashOffset: { value: 0 },\n dashScale: { value: 1 },\n dashSize: { value: 1 },\n gapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n },\n ]),\n ),\n\n vertexShader: /* glsl */ `\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\n\t\t\t\tuniform float linewidth;\n\t\t\t\tuniform vec2 resolution;\n\n\t\t\t\tattribute vec3 instanceStart;\n\t\t\t\tattribute vec3 instanceEnd;\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\t\tattribute vec3 instanceColorEnd;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashScale;\n\t\t\t\t\tattribute float instanceDistanceStart;\n\t\t\t\t\tattribute float instanceDistanceEnd;\n\t\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#endif\n\n\t\t\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t\t\t// conservative estimate of the near plane\n\t\t\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#ifdef USE_COLOR\n\n\t\t\t\t\t\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t\t\t// camera space\n\t\t\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\tworldStart = start.xyz;\n\t\t\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\t\t\tif ( perspective ) {\n\n\t\t\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// clip space\n\t\t\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t\t\t// ndc space\n\t\t\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t\t\t// direction\n\t\t\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t\t\t// account for clip-space aspect ratio\n\t\t\t\t\tdir.x *= aspect;\n\t\t\t\t\tdir = normalize( dir );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\t\t\tvec3 offset;\n\t\t\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t\t\t// set the world position\n\t\t\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t\t\t// project the worldpos\n\t\t\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t\t\t// segments overlap neatly\n\t\t\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\t\t\tdir.x /= aspect;\n\t\t\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset += - dir;\n\n\t\t\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\t\t\toffset += dir;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth;\n\n\t\t\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t\t\t// select end\n\t\t\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t\t\t// back to clip space\n\t\t\t\t\t\toffset *= clip.w;\n\n\t\t\t\t\t\tclip.xy += offset;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tgl_Position = clip;\n\n\t\t\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n fragmentShader: /* glsl */ `\n\t\t\t\tuniform vec3 diffuse;\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform float linewidth;\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashOffset;\n\t\t\t\t\tuniform float dashSize;\n\t\t\t\t\tuniform float gapSize;\n\n\t\t\t\t#endif\n\n\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_fragment>\n\t\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t\t#include <clipping_planes_pars_fragment>\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\t\t\tfloat mua;\n\t\t\t\t\tfloat mub;\n\n\t\t\t\t\tvec3 p13 = p1 - p3;\n\t\t\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\t\t\tmua = numer / denom;\n\t\t\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\t\t\treturn vec2( mua, mub );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat alpha = opacity;\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\t\t\tfloat len = length( delta );\n\t\t\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\t\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\t\t\tgl_FragColor = diffuseColor;\n\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <${parseInt(REVISION.replace(/\\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\t\t\t\t\t#include <fog_fragment>\n\t\t\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t\t\t}\n\t\t\t`,\n clipping: true, // required for clipping support\n })\n\n this.isLineMaterial = true\n\n this.onBeforeCompile = function () {\n if (this.transparent) {\n this.defines.USE_LINE_COLOR_ALPHA = '1'\n } else {\n delete this.defines.USE_LINE_COLOR_ALPHA\n }\n }\n\n Object.defineProperties(this, {\n color: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.diffuse.value\n },\n\n set: function (value) {\n this.uniforms.diffuse.value = value\n },\n },\n\n worldUnits: {\n enumerable: true,\n\n get: function () {\n return 'WORLD_UNITS' in this.defines\n },\n\n set: function (value) {\n if (value === true) {\n this.defines.WORLD_UNITS = ''\n } else {\n delete this.defines.WORLD_UNITS\n }\n },\n },\n\n linewidth: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.linewidth.value\n },\n\n set: function (value) {\n this.uniforms.linewidth.value = value\n },\n },\n\n dashed: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_DASH' in this.defines)\n },\n\n set(value) {\n if (Boolean(value) !== Boolean('USE_DASH' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_DASH = ''\n } else {\n delete this.defines.USE_DASH\n }\n },\n },\n\n dashScale: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashScale.value\n },\n\n set: function (value) {\n this.uniforms.dashScale.value = value\n },\n },\n\n dashSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashSize.value\n },\n\n set: function (value) {\n this.uniforms.dashSize.value = value\n },\n },\n\n dashOffset: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashOffset.value\n },\n\n set: function (value) {\n this.uniforms.dashOffset.value = value\n },\n },\n\n gapSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.gapSize.value\n },\n\n set: function (value) {\n this.uniforms.gapSize.value = value\n },\n },\n\n opacity: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.opacity.value\n },\n\n set: function (value) {\n this.uniforms.opacity.value = value\n },\n },\n\n resolution: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.resolution.value\n },\n\n set: function (value) {\n this.uniforms.resolution.value.copy(value)\n },\n },\n\n alphaToCoverage: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)\n },\n\n set: function (value) {\n if (Boolean(value) !== Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_ALPHA_TO_COVERAGE = ''\n this.extensions.derivatives = true\n } else {\n delete this.defines.USE_ALPHA_TO_COVERAGE\n this.extensions.derivatives = false\n }\n },\n },\n })\n\n this.setValues(parameters)\n }\n}\n\nexport { LineMaterial }\n"],"names":["ShaderMaterial","UniformsUtils","UniformsLib","Vector2","REVISION"],"mappings":";;;AAeA,MAAM,qBAAqBA,MAAAA,eAAe;AAAA,EACxC,YAAY,YAAY;AACtB,UAAM;AAAA,MACJ,MAAM;AAAA,MAEN,UAAUC,MAAa,cAAC;AAAA,QACtBA,MAAAA,cAAc,MAAM;AAAA,UAClBC,MAAAA,YAAY;AAAA,UACZA,MAAAA,YAAY;AAAA,UACZ;AAAA,YACE,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,YAAY,EAAE,OAAO,IAAIC,MAAO,QAAC,GAAG,CAAC,EAAG;AAAA,YACxC,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,UAAU,EAAE,OAAO,EAAG;AAAA,YACtB,SAAS,EAAE,OAAO,EAAG;AAAA;AAAA,UACtB;AAAA,QACX,CAAS;AAAA,MACF;AAAA,MAED;AAAA;AAAA,QAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6OzB;AAAA;AAAA,QAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}
|
1
|
+
{"version":3,"file":"LineMaterial.cjs","sources":["../../src/lines/LineMaterial.js"],"sourcesContent":["/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * }\n */\n\nimport { ShaderMaterial, UniformsLib, UniformsUtils, Vector2, REVISION } from 'three'\n\nclass LineMaterial extends ShaderMaterial {\n constructor(parameters) {\n super({\n type: 'LineMaterial',\n\n uniforms: UniformsUtils.clone(\n UniformsUtils.merge([\n UniformsLib.common,\n UniformsLib.fog,\n {\n worldUnits: { value: 1 },\n linewidth: { value: 1 },\n resolution: { value: new Vector2(1, 1) },\n dashOffset: { value: 0 },\n dashScale: { value: 1 },\n dashSize: { value: 1 },\n gapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n },\n ]),\n ),\n\n vertexShader: /* glsl */ `\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\n\t\t\t\tuniform float linewidth;\n\t\t\t\tuniform vec2 resolution;\n\n\t\t\t\tattribute vec3 instanceStart;\n\t\t\t\tattribute vec3 instanceEnd;\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\t\tattribute vec3 instanceColorEnd;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashScale;\n\t\t\t\t\tattribute float instanceDistanceStart;\n\t\t\t\t\tattribute float instanceDistanceEnd;\n\t\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#endif\n\n\t\t\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t\t\t// conservative estimate of the near plane\n\t\t\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#ifdef USE_COLOR\n\n\t\t\t\t\t\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t\t\t// camera space\n\t\t\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\tworldStart = start.xyz;\n\t\t\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\t\t\tif ( perspective ) {\n\n\t\t\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// clip space\n\t\t\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t\t\t// ndc space\n\t\t\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t\t\t// direction\n\t\t\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t\t\t// account for clip-space aspect ratio\n\t\t\t\t\tdir.x *= aspect;\n\t\t\t\t\tdir = normalize( dir );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\t\t\tvec3 offset;\n\t\t\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t\t\t// set the world position\n\t\t\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t\t\t// project the worldpos\n\t\t\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t\t\t// segments overlap neatly\n\t\t\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\t\t\tdir.x /= aspect;\n\t\t\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset += - dir;\n\n\t\t\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\t\t\toffset += dir;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth;\n\n\t\t\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t\t\t// select end\n\t\t\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t\t\t// back to clip space\n\t\t\t\t\t\toffset *= clip.w;\n\n\t\t\t\t\t\tclip.xy += offset;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tgl_Position = clip;\n\n\t\t\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n fragmentShader: /* glsl */ `\n\t\t\t\tuniform vec3 diffuse;\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform float linewidth;\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashOffset;\n\t\t\t\t\tuniform float dashSize;\n\t\t\t\t\tuniform float gapSize;\n\n\t\t\t\t#endif\n\n\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_fragment>\n\t\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t\t#include <clipping_planes_pars_fragment>\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\t\t\tfloat mua;\n\t\t\t\t\tfloat mub;\n\n\t\t\t\t\tvec3 p13 = p1 - p3;\n\t\t\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\t\t\tmua = numer / denom;\n\t\t\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\t\t\treturn vec2( mua, mub );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat alpha = opacity;\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\t\t\tfloat len = length( delta );\n\t\t\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\t\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\t\t\tgl_FragColor = diffuseColor;\n\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <${parseInt(REVISION.replace(/\\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\t\t\t\t\t#include <fog_fragment>\n\t\t\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t\t\t}\n\t\t\t`,\n clipping: true, // required for clipping support\n })\n\n this.isLineMaterial = true\n\n this.onBeforeCompile = function () {\n if (this.transparent) {\n this.defines.USE_LINE_COLOR_ALPHA = '1'\n } else {\n delete this.defines.USE_LINE_COLOR_ALPHA\n }\n }\n\n Object.defineProperties(this, {\n color: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.diffuse.value\n },\n\n set: function (value) {\n this.uniforms.diffuse.value = value\n },\n },\n\n worldUnits: {\n enumerable: true,\n\n get: function () {\n return 'WORLD_UNITS' in this.defines\n },\n\n set: function (value) {\n if (value === true) {\n this.defines.WORLD_UNITS = ''\n } else {\n delete this.defines.WORLD_UNITS\n }\n },\n },\n\n linewidth: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.linewidth.value\n },\n\n set: function (value) {\n this.uniforms.linewidth.value = value\n },\n },\n\n dashed: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_DASH' in this.defines)\n },\n\n set(value) {\n if (Boolean(value) !== Boolean('USE_DASH' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_DASH = ''\n } else {\n delete this.defines.USE_DASH\n }\n },\n },\n\n dashScale: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashScale.value\n },\n\n set: function (value) {\n this.uniforms.dashScale.value = value\n },\n },\n\n dashSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashSize.value\n },\n\n set: function (value) {\n this.uniforms.dashSize.value = value\n },\n },\n\n dashOffset: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashOffset.value\n },\n\n set: function (value) {\n this.uniforms.dashOffset.value = value\n },\n },\n\n gapSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.gapSize.value\n },\n\n set: function (value) {\n this.uniforms.gapSize.value = value\n },\n },\n\n opacity: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.opacity.value\n },\n\n set: function (value) {\n this.uniforms.opacity.value = value\n },\n },\n\n resolution: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.resolution.value\n },\n\n set: function (value) {\n this.uniforms.resolution.value.copy(value)\n },\n },\n\n alphaToCoverage: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)\n },\n\n set: function (value) {\n if (Boolean(value) !== Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_ALPHA_TO_COVERAGE = ''\n this.extensions.derivatives = true\n } else {\n delete this.defines.USE_ALPHA_TO_COVERAGE\n this.extensions.derivatives = false\n }\n },\n },\n })\n\n this.setValues(parameters)\n }\n}\n\nexport { LineMaterial }\n"],"names":["ShaderMaterial","UniformsUtils","UniformsLib","Vector2","REVISION"],"mappings":";;;AAcA,MAAM,qBAAqBA,MAAAA,eAAe;AAAA,EACxC,YAAY,YAAY;AACtB,UAAM;AAAA,MACJ,MAAM;AAAA,MAEN,UAAUC,MAAa,cAAC;AAAA,QACtBA,MAAAA,cAAc,MAAM;AAAA,UAClBC,MAAAA,YAAY;AAAA,UACZA,MAAAA,YAAY;AAAA,UACZ;AAAA,YACE,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,YAAY,EAAE,OAAO,IAAIC,MAAO,QAAC,GAAG,CAAC,EAAG;AAAA,YACxC,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,UAAU,EAAE,OAAO,EAAG;AAAA,YACtB,SAAS,EAAE,OAAO,EAAG;AAAA;AAAA,UACtB;AAAA,QACX,CAAS;AAAA,MACF;AAAA,MAED;AAAA;AAAA,QAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6OzB;AAAA;AAAA,QAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineMaterial.js","sources":["../../src/lines/LineMaterial.js"],"sourcesContent":["/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * resolution: <Vector2>, // to be set by renderer\n * }\n */\n\nimport { ShaderMaterial, UniformsLib, UniformsUtils, Vector2, REVISION } from 'three'\n\nclass LineMaterial extends ShaderMaterial {\n constructor(parameters) {\n super({\n type: 'LineMaterial',\n\n uniforms: UniformsUtils.clone(\n UniformsUtils.merge([\n UniformsLib.common,\n UniformsLib.fog,\n {\n worldUnits: { value: 1 },\n linewidth: { value: 1 },\n resolution: { value: new Vector2(1, 1) },\n dashOffset: { value: 0 },\n dashScale: { value: 1 },\n dashSize: { value: 1 },\n gapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n },\n ]),\n ),\n\n vertexShader: /* glsl */ `\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\n\t\t\t\tuniform float linewidth;\n\t\t\t\tuniform vec2 resolution;\n\n\t\t\t\tattribute vec3 instanceStart;\n\t\t\t\tattribute vec3 instanceEnd;\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\t\tattribute vec3 instanceColorEnd;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashScale;\n\t\t\t\t\tattribute float instanceDistanceStart;\n\t\t\t\t\tattribute float instanceDistanceEnd;\n\t\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#endif\n\n\t\t\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t\t\t// conservative estimate of the near plane\n\t\t\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#ifdef USE_COLOR\n\n\t\t\t\t\t\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t\t\t// camera space\n\t\t\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\tworldStart = start.xyz;\n\t\t\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\t\t\tif ( perspective ) {\n\n\t\t\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// clip space\n\t\t\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t\t\t// ndc space\n\t\t\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t\t\t// direction\n\t\t\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t\t\t// account for clip-space aspect ratio\n\t\t\t\t\tdir.x *= aspect;\n\t\t\t\t\tdir = normalize( dir );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\t\t\tvec3 offset;\n\t\t\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t\t\t// set the world position\n\t\t\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t\t\t// project the worldpos\n\t\t\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t\t\t// segments overlap neatly\n\t\t\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\t\t\tdir.x /= aspect;\n\t\t\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset += - dir;\n\n\t\t\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\t\t\toffset += dir;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth;\n\n\t\t\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t\t\t// select end\n\t\t\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t\t\t// back to clip space\n\t\t\t\t\t\toffset *= clip.w;\n\n\t\t\t\t\t\tclip.xy += offset;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tgl_Position = clip;\n\n\t\t\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n fragmentShader: /* glsl */ `\n\t\t\t\tuniform vec3 diffuse;\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform float linewidth;\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashOffset;\n\t\t\t\t\tuniform float dashSize;\n\t\t\t\t\tuniform float gapSize;\n\n\t\t\t\t#endif\n\n\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_fragment>\n\t\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t\t#include <clipping_planes_pars_fragment>\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\t\t\tfloat mua;\n\t\t\t\t\tfloat mub;\n\n\t\t\t\t\tvec3 p13 = p1 - p3;\n\t\t\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\t\t\tmua = numer / denom;\n\t\t\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\t\t\treturn vec2( mua, mub );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat alpha = opacity;\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\t\t\tfloat len = length( delta );\n\t\t\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\t\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\t\t\tgl_FragColor = diffuseColor;\n\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <${parseInt(REVISION.replace(/\\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\t\t\t\t\t#include <fog_fragment>\n\t\t\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t\t\t}\n\t\t\t`,\n clipping: true, // required for clipping support\n })\n\n this.isLineMaterial = true\n\n this.onBeforeCompile = function () {\n if (this.transparent) {\n this.defines.USE_LINE_COLOR_ALPHA = '1'\n } else {\n delete this.defines.USE_LINE_COLOR_ALPHA\n }\n }\n\n Object.defineProperties(this, {\n color: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.diffuse.value\n },\n\n set: function (value) {\n this.uniforms.diffuse.value = value\n },\n },\n\n worldUnits: {\n enumerable: true,\n\n get: function () {\n return 'WORLD_UNITS' in this.defines\n },\n\n set: function (value) {\n if (value === true) {\n this.defines.WORLD_UNITS = ''\n } else {\n delete this.defines.WORLD_UNITS\n }\n },\n },\n\n linewidth: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.linewidth.value\n },\n\n set: function (value) {\n this.uniforms.linewidth.value = value\n },\n },\n\n dashed: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_DASH' in this.defines)\n },\n\n set(value) {\n if (Boolean(value) !== Boolean('USE_DASH' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_DASH = ''\n } else {\n delete this.defines.USE_DASH\n }\n },\n },\n\n dashScale: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashScale.value\n },\n\n set: function (value) {\n this.uniforms.dashScale.value = value\n },\n },\n\n dashSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashSize.value\n },\n\n set: function (value) {\n this.uniforms.dashSize.value = value\n },\n },\n\n dashOffset: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashOffset.value\n },\n\n set: function (value) {\n this.uniforms.dashOffset.value = value\n },\n },\n\n gapSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.gapSize.value\n },\n\n set: function (value) {\n this.uniforms.gapSize.value = value\n },\n },\n\n opacity: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.opacity.value\n },\n\n set: function (value) {\n this.uniforms.opacity.value = value\n },\n },\n\n resolution: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.resolution.value\n },\n\n set: function (value) {\n this.uniforms.resolution.value.copy(value)\n },\n },\n\n alphaToCoverage: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)\n },\n\n set: function (value) {\n if (Boolean(value) !== Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_ALPHA_TO_COVERAGE = ''\n this.extensions.derivatives = true\n } else {\n delete this.defines.USE_ALPHA_TO_COVERAGE\n this.extensions.derivatives = false\n }\n },\n },\n })\n\n this.setValues(parameters)\n }\n}\n\nexport { LineMaterial }\n"],"names":[],"mappings":";AAeA,MAAM,qBAAqB,eAAe;AAAA,EACxC,YAAY,YAAY;AACtB,UAAM;AAAA,MACJ,MAAM;AAAA,MAEN,UAAU,cAAc;AAAA,QACtB,cAAc,MAAM;AAAA,UAClB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,YACE,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,YAAY,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAG;AAAA,YACxC,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,UAAU,EAAE,OAAO,EAAG;AAAA,YACtB,SAAS,EAAE,OAAO,EAAG;AAAA;AAAA,UACtB;AAAA,QACX,CAAS;AAAA,MACF;AAAA,MAED;AAAA;AAAA,QAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6OzB;AAAA;AAAA,QAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAuKhB,SAAS,SAAS,QAAQ,QAAQ,EAAE,CAAC,KAAK,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMnF,UAAU;AAAA;AAAA,IAChB,CAAK;AAED,SAAK,iBAAiB;AAEtB,SAAK,kBAAkB,WAAY;AACjC,UAAI,KAAK,aAAa;AACpB,aAAK,QAAQ,uBAAuB;AAAA,MAC5C,OAAa;AACL,eAAO,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAED,WAAO,iBAAiB,MAAM;AAAA,MAC5B,OAAO;AAAA,QACL,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,QAAQ;AAAA,QAC9B;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,QAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,MAED,YAAY;AAAA,QACV,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,iBAAiB,KAAK;AAAA,QAC9B;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,cAAI,UAAU,MAAM;AAClB,iBAAK,QAAQ,cAAc;AAAA,UACvC,OAAiB;AACL,mBAAO,KAAK,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MAED,WAAW;AAAA,QACT,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,UAAU;AAAA,QAChC;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,UAAU,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,MAED,QAAQ;AAAA,QACN,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,QAAQ,cAAc,KAAK,OAAO;AAAA,QAC1C;AAAA,QAED,IAAI,OAAO;AACT,cAAI,QAAQ,KAAK,MAAM,QAAQ,cAAc,KAAK,OAAO,GAAG;AAC1D,iBAAK,cAAc;AAAA,UACpB;AAED,cAAI,UAAU,MAAM;AAClB,iBAAK,QAAQ,WAAW;AAAA,UACpC,OAAiB;AACL,mBAAO,KAAK,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MAED,WAAW;AAAA,QACT,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,UAAU;AAAA,QAChC;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,UAAU,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,MAED,UAAU;AAAA,QACR,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,SAAS;AAAA,QAC/B;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,SAAS,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,MAED,YAAY;AAAA,QACV,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,WAAW;AAAA,QACjC;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,WAAW,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,MAED,SAAS;AAAA,QACP,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,QAAQ;AAAA,QAC9B;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,QAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,MAED,SAAS;AAAA,QACP,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,QAAQ;AAAA,QAC9B;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,QAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,MAED,YAAY;AAAA,QACV,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,KAAK,SAAS,WAAW;AAAA,QACjC;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,eAAK,SAAS,WAAW,MAAM,KAAK,KAAK;AAAA,QAC1C;AAAA,MACF;AAAA,MAED,iBAAiB;AAAA,QACf,YAAY;AAAA,QAEZ,KAAK,WAAY;AACf,iBAAO,QAAQ,2BAA2B,KAAK,OAAO;AAAA,QACvD;AAAA,QAED,KAAK,SAAU,OAAO;AACpB,cAAI,QAAQ,KAAK,MAAM,QAAQ,2BAA2B,KAAK,OAAO,GAAG;AACvE,iBAAK,cAAc;AAAA,UACpB;AAED,cAAI,UAAU,MAAM;AAClB,iBAAK,QAAQ,wBAAwB;AACrC,iBAAK,WAAW,cAAc;AAAA,UAC1C,OAAiB;AACL,mBAAO,KAAK,QAAQ;AACpB,iBAAK,WAAW,cAAc;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACP,CAAK;AAED,SAAK,UAAU,UAAU;AAAA,EAC1B;AACH;"}
|
1
|
+
{"version":3,"file":"LineMaterial.js","sources":["../../src/lines/LineMaterial.js"],"sourcesContent":["/**\n * parameters = {\n * color: <hex>,\n * linewidth: <float>,\n * dashed: <boolean>,\n * dashScale: <float>,\n * dashSize: <float>,\n * dashOffset: <float>,\n * gapSize: <float>,\n * }\n */\n\nimport { ShaderMaterial, UniformsLib, UniformsUtils, Vector2, REVISION } from 'three'\n\nclass LineMaterial extends ShaderMaterial {\n constructor(parameters) {\n super({\n type: 'LineMaterial',\n\n uniforms: UniformsUtils.clone(\n UniformsUtils.merge([\n UniformsLib.common,\n UniformsLib.fog,\n {\n worldUnits: { value: 1 },\n linewidth: { value: 1 },\n resolution: { value: new Vector2(1, 1) },\n dashOffset: { value: 0 },\n dashScale: { value: 1 },\n dashSize: { value: 1 },\n gapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n },\n ]),\n ),\n\n vertexShader: /* glsl */ `\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\n\t\t\t\tuniform float linewidth;\n\t\t\t\tuniform vec2 resolution;\n\n\t\t\t\tattribute vec3 instanceStart;\n\t\t\t\tattribute vec3 instanceEnd;\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\t\tattribute vec3 instanceColorEnd;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashScale;\n\t\t\t\t\tattribute float instanceDistanceStart;\n\t\t\t\t\tattribute float instanceDistanceEnd;\n\t\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#endif\n\n\t\t\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t\t\t// conservative estimate of the near plane\n\t\t\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#ifdef USE_COLOR\n\n\t\t\t\t\t\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t\t\t// camera space\n\t\t\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\tworldStart = start.xyz;\n\t\t\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\t\t\tif ( perspective ) {\n\n\t\t\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// clip space\n\t\t\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t\t\t// ndc space\n\t\t\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t\t\t// direction\n\t\t\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t\t\t// account for clip-space aspect ratio\n\t\t\t\t\tdir.x *= aspect;\n\t\t\t\t\tdir = normalize( dir );\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\t\t\tvec3 offset;\n\t\t\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t\t\t// set the world position\n\t\t\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t\t\t// project the worldpos\n\t\t\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t\t\t// segments overlap neatly\n\t\t\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\t\t\tdir.x /= aspect;\n\t\t\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t\t\t// sign flip\n\t\t\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t\t\t// endcaps\n\t\t\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\t\t\toffset += - dir;\n\n\t\t\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\t\t\toffset += dir;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// adjust for linewidth\n\t\t\t\t\t\toffset *= linewidth;\n\n\t\t\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t\t\t// select end\n\t\t\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t\t\t// back to clip space\n\t\t\t\t\t\toffset *= clip.w;\n\n\t\t\t\t\t\tclip.xy += offset;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tgl_Position = clip;\n\n\t\t\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n fragmentShader: /* glsl */ `\n\t\t\t\tuniform vec3 diffuse;\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform float linewidth;\n\n\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\tuniform float dashOffset;\n\t\t\t\t\tuniform float dashSize;\n\t\t\t\t\tuniform float gapSize;\n\n\t\t\t\t#endif\n\n\t\t\t\tvarying float vLineDistance;\n\n\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\tvarying vec4 worldPos;\n\t\t\t\t\tvarying vec3 worldStart;\n\t\t\t\t\tvarying vec3 worldEnd;\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#else\n\n\t\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\t#endif\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_fragment>\n\t\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t\t#include <clipping_planes_pars_fragment>\n\n\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\t#endif\n\t\t\t\t#endif\n\n\t\t\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\t\t\tfloat mua;\n\t\t\t\t\tfloat mub;\n\n\t\t\t\t\tvec3 p13 = p1 - p3;\n\t\t\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\t\t\tmua = numer / denom;\n\t\t\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\t\t\treturn vec2( mua, mub );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t\t\t#ifdef USE_DASH\n\n\t\t\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tfloat alpha = opacity;\n\n\t\t\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\t\t\tfloat len = length( delta );\n\t\t\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#else\n\n\t\t\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\t\t\t\t\t#ifdef USE_COLOR\n\t\t\t\t\t\t#ifdef USE_LINE_COLOR_ALPHA\n\t\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t\t#else\n\t\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t#endif\n\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\t\t\tgl_FragColor = diffuseColor;\n\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <${parseInt(REVISION.replace(/\\D+/g, '')) >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\t\t\t\t\t#include <fog_fragment>\n\t\t\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t\t\t}\n\t\t\t`,\n clipping: true, // required for clipping support\n })\n\n this.isLineMaterial = true\n\n this.onBeforeCompile = function () {\n if (this.transparent) {\n this.defines.USE_LINE_COLOR_ALPHA = '1'\n } else {\n delete this.defines.USE_LINE_COLOR_ALPHA\n }\n }\n\n Object.defineProperties(this, {\n color: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.diffuse.value\n },\n\n set: function (value) {\n this.uniforms.diffuse.value = value\n },\n },\n\n worldUnits: {\n enumerable: true,\n\n get: function () {\n return 'WORLD_UNITS' in this.defines\n },\n\n set: function (value) {\n if (value === true) {\n this.defines.WORLD_UNITS = ''\n } else {\n delete this.defines.WORLD_UNITS\n }\n },\n },\n\n linewidth: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.linewidth.value\n },\n\n set: function (value) {\n this.uniforms.linewidth.value = value\n },\n },\n\n dashed: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_DASH' in this.defines)\n },\n\n set(value) {\n if (Boolean(value) !== Boolean('USE_DASH' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_DASH = ''\n } else {\n delete this.defines.USE_DASH\n }\n },\n },\n\n dashScale: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashScale.value\n },\n\n set: function (value) {\n this.uniforms.dashScale.value = value\n },\n },\n\n dashSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashSize.value\n },\n\n set: function (value) {\n this.uniforms.dashSize.value = value\n },\n },\n\n dashOffset: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.dashOffset.value\n },\n\n set: function (value) {\n this.uniforms.dashOffset.value = value\n },\n },\n\n gapSize: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.gapSize.value\n },\n\n set: function (value) {\n this.uniforms.gapSize.value = value\n },\n },\n\n opacity: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.opacity.value\n },\n\n set: function (value) {\n this.uniforms.opacity.value = value\n },\n },\n\n resolution: {\n enumerable: true,\n\n get: function () {\n return this.uniforms.resolution.value\n },\n\n set: function (value) {\n this.uniforms.resolution.value.copy(value)\n },\n },\n\n alphaToCoverage: {\n enumerable: true,\n\n get: function () {\n return Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)\n },\n\n set: function (value) {\n if (Boolean(value) !== Boolean('USE_ALPHA_TO_COVERAGE' in this.defines)) {\n this.needsUpdate = true\n }\n\n if (value === true) {\n this.defines.USE_ALPHA_TO_COVERAGE = ''\n this.extensions.derivatives = true\n } else {\n delete this.defines.USE_ALPHA_TO_COVERAGE\n this.extensions.derivatives = false\n }\n },\n },\n })\n\n this.setValues(parameters)\n }\n}\n\nexport { LineMaterial }\n"],"names":[],"mappings":";AAcA,MAAM,qBAAqB,eAAe;AAAA,EACxC,YAAY,YAAY;AACtB,UAAM;AAAA,MACJ,MAAM;AAAA,MAEN,UAAU,cAAc;AAAA,QACtB,cAAc,MAAM;AAAA,UAClB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,YACE,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,YAAY,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAG;AAAA,YACxC,YAAY,EAAE,OAAO,EAAG;AAAA,YACxB,WAAW,EAAE,OAAO,EAAG;AAAA,YACvB,UAAU,EAAE,OAAO,EAAG;AAAA,YACtB,SAAS,EAAE,OAAO,EAAG;AAAA;AAAA,UACtB;AAAA,QACX,CAAS;AAAA,MACF;AAAA,MAED;AAAA;AAAA,QAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6OzB;AAAA;AAAA,QAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}
|
package/lines/LineSegments2.cjs
CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const THREE = require("three");
|
4
4
|
const LineSegmentsGeometry = require("./LineSegmentsGeometry.cjs");
|
5
5
|
const LineMaterial = require("./LineMaterial.cjs");
|
6
|
+
const _viewport = new THREE.Vector4();
|
6
7
|
const _start = new THREE.Vector3();
|
7
8
|
const _end = new THREE.Vector3();
|
8
9
|
const _start4 = new THREE.Vector4();
|
@@ -15,7 +16,7 @@ const _closestPoint = new THREE.Vector3();
|
|
15
16
|
const _box = new THREE.Box3();
|
16
17
|
const _sphere = new THREE.Sphere();
|
17
18
|
const _clipToWorldVector = new THREE.Vector4();
|
18
|
-
let _ray,
|
19
|
+
let _ray, _lineWidth;
|
19
20
|
function getWorldSpaceHalfWidth(camera, distance, resolution) {
|
20
21
|
_clipToWorldVector.set(0, 0, -distance, 1).applyMatrix4(camera.projectionMatrix);
|
21
22
|
_clipToWorldVector.multiplyScalar(1 / _clipToWorldVector.w);
|
@@ -26,9 +27,15 @@ function getWorldSpaceHalfWidth(camera, distance, resolution) {
|
|
26
27
|
return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y));
|
27
28
|
}
|
28
29
|
function raycastWorldUnits(lineSegments, intersects) {
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
const matrixWorld = lineSegments.matrixWorld;
|
31
|
+
const geometry = lineSegments.geometry;
|
32
|
+
const instanceStart = geometry.attributes.instanceStart;
|
33
|
+
const instanceEnd = geometry.attributes.instanceEnd;
|
34
|
+
const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);
|
35
|
+
for (let i = 0, l = segmentCount; i < l; i++) {
|
36
|
+
_line.start.fromBufferAttribute(instanceStart, i);
|
37
|
+
_line.end.fromBufferAttribute(instanceEnd, i);
|
38
|
+
_line.applyMatrix4(matrixWorld);
|
32
39
|
const pointOnLine = new THREE.Vector3();
|
33
40
|
const point = new THREE.Vector3();
|
34
41
|
_ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine);
|
@@ -55,6 +62,7 @@ function raycastScreenSpace(lineSegments, camera, intersects) {
|
|
55
62
|
const geometry = lineSegments.geometry;
|
56
63
|
const instanceStart = geometry.attributes.instanceStart;
|
57
64
|
const instanceEnd = geometry.attributes.instanceEnd;
|
65
|
+
const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);
|
58
66
|
const near = -camera.near;
|
59
67
|
_ray.at(1, _ssOrigin);
|
60
68
|
_ssOrigin.w = 1;
|
@@ -66,7 +74,7 @@ function raycastScreenSpace(lineSegments, camera, intersects) {
|
|
66
74
|
_ssOrigin.z = 0;
|
67
75
|
_ssOrigin3.copy(_ssOrigin);
|
68
76
|
_mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld);
|
69
|
-
for (let i = 0, l =
|
77
|
+
for (let i = 0, l = segmentCount; i < l; i++) {
|
70
78
|
_start4.fromBufferAttribute(instanceStart, i);
|
71
79
|
_end4.fromBufferAttribute(instanceEnd, i);
|
72
80
|
_start4.w = 1;
|
@@ -161,8 +169,6 @@ class LineSegments2 extends THREE.Mesh {
|
|
161
169
|
const geometry = this.geometry;
|
162
170
|
const material = this.material;
|
163
171
|
_lineWidth = material.linewidth + threshold;
|
164
|
-
_instanceStart = geometry.attributes.instanceStart;
|
165
|
-
_instanceEnd = geometry.attributes.instanceEnd;
|
166
172
|
if (geometry.boundingSphere === null) {
|
167
173
|
geometry.computeBoundingSphere();
|
168
174
|
}
|
@@ -199,6 +205,13 @@ class LineSegments2 extends THREE.Mesh {
|
|
199
205
|
raycastScreenSpace(this, camera, intersects);
|
200
206
|
}
|
201
207
|
}
|
208
|
+
onBeforeRender(renderer) {
|
209
|
+
const uniforms = this.material.uniforms;
|
210
|
+
if (uniforms && uniforms.resolution) {
|
211
|
+
renderer.getViewport(_viewport);
|
212
|
+
this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);
|
213
|
+
}
|
214
|
+
}
|
202
215
|
}
|
203
216
|
exports.LineSegments2 = LineSegments2;
|
204
217
|
//# sourceMappingURL=LineSegments2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineSegments2.cjs","sources":["../../src/lines/LineSegments2.js"],"sourcesContent":["import {\n Box3,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Line3,\n MathUtils,\n Matrix4,\n Mesh,\n Sphere,\n Vector3,\n Vector4,\n} from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nconst _start4 = new Vector4()\nconst _end4 = new Vector4()\n\nconst _ssOrigin = new Vector4()\nconst _ssOrigin3 = new Vector3()\nconst _mvMatrix = new Matrix4()\nconst _line = new Line3()\nconst _closestPoint = new Vector3()\n\nconst _box = new Box3()\nconst _sphere = new Sphere()\nconst _clipToWorldVector = new Vector4()\n\nlet _ray, _instanceStart, _instanceEnd, _lineWidth\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth(camera, distance, resolution) {\n // transform into clip space, adjust the x and y values by the pixel width offset, then\n // transform back into world space to get world offset. Note clip space is [-1, 1] so full\n // width does not need to be halved.\n _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n _clipToWorldVector.x = _lineWidth / resolution.width\n _clipToWorldVector.y = _lineWidth / resolution.height\n _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n\n return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y))\n}\n\nfunction raycastWorldUnits(lineSegments, intersects) {\n for (let i = 0, l = _instanceStart.count; i < l; i++) {\n _line.start.fromBufferAttribute(_instanceStart, i)\n _line.end.fromBufferAttribute(_instanceEnd, i)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n const isInside = point.distanceTo(pointOnLine) < _lineWidth * 0.5\n\n if (isInside) {\n intersects.push({\n point,\n pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nfunction raycastScreenSpace(lineSegments, camera, intersects) {\n const projectionMatrix = camera.projectionMatrix\n const material = lineSegments.material\n const resolution = material.resolution\n const matrixWorld = lineSegments.matrixWorld\n\n const geometry = lineSegments.geometry\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n\n const near = -camera.near\n\n //\n\n // pick a point 1 unit out along the ray to avoid the ray origin\n // sitting at the camera origin which will cause \"w\" to be 0 when\n // applying the projection matrix.\n _ray.at(1, _ssOrigin)\n\n // ndc space [ - 1.0, 1.0 ]\n _ssOrigin.w = 1\n _ssOrigin.applyMatrix4(camera.matrixWorldInverse)\n _ssOrigin.applyMatrix4(projectionMatrix)\n _ssOrigin.multiplyScalar(1 / _ssOrigin.w)\n\n // screen space\n _ssOrigin.x *= resolution.x / 2\n _ssOrigin.y *= resolution.y / 2\n _ssOrigin.z = 0\n\n _ssOrigin3.copy(_ssOrigin)\n\n _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld)\n\n for (let i = 0, l = instanceStart.count; i < l; i++) {\n _start4.fromBufferAttribute(instanceStart, i)\n _end4.fromBufferAttribute(instanceEnd, i)\n\n _start4.w = 1\n _end4.w = 1\n\n // camera space\n _start4.applyMatrix4(_mvMatrix)\n _end4.applyMatrix4(_mvMatrix)\n\n // skip the segment if it's entirely behind the camera\n const isBehindCameraNear = _start4.z > near && _end4.z > near\n if (isBehindCameraNear) {\n continue\n }\n\n // trim the segment if it extends behind camera near\n if (_start4.z > near) {\n const deltaDist = _start4.z - _end4.z\n const t = (_start4.z - near) / deltaDist\n _start4.lerp(_end4, t)\n } else if (_end4.z > near) {\n const deltaDist = _end4.z - _start4.z\n const t = (_end4.z - near) / deltaDist\n _end4.lerp(_start4, t)\n }\n\n // clip space\n _start4.applyMatrix4(projectionMatrix)\n _end4.applyMatrix4(projectionMatrix)\n\n // ndc space [ - 1.0, 1.0 ]\n _start4.multiplyScalar(1 / _start4.w)\n _end4.multiplyScalar(1 / _end4.w)\n\n // screen space\n _start4.x *= resolution.x / 2\n _start4.y *= resolution.y / 2\n\n _end4.x *= resolution.x / 2\n _end4.y *= resolution.y / 2\n\n // create 2d segment\n _line.start.copy(_start4)\n _line.start.z = 0\n\n _line.end.copy(_end4)\n _line.end.z = 0\n\n // get closest point on ray to segment\n const param = _line.closestPointToPointParameter(_ssOrigin3, true)\n _line.at(param, _closestPoint)\n\n // check if the intersection point is within clip space\n const zPos = MathUtils.lerp(_start4.z, _end4.z, param)\n const isInClipSpace = zPos >= -1 && zPos <= 1\n\n const isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5\n\n if (isInClipSpace && isInside) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.start.applyMatrix4(matrixWorld)\n _line.end.applyMatrix4(matrixWorld)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n\n intersects.push({\n point: point,\n pointOnLine: pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nclass LineSegments2 extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isLineSegments2 = true\n\n this.type = 'LineSegments2'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n raycast(raycaster, intersects) {\n const worldUnits = this.material.worldUnits\n const camera = raycaster.camera\n\n if (camera === null && !worldUnits) {\n console.error(\n 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.',\n )\n }\n\n const threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0\n\n _ray = raycaster.ray\n\n const matrixWorld = this.matrixWorld\n const geometry = this.geometry\n const material = this.material\n\n _lineWidth = material.linewidth + threshold\n\n _instanceStart = geometry.attributes.instanceStart\n _instanceEnd = geometry.attributes.instanceEnd\n\n // check if we intersect the sphere bounds\n if (geometry.boundingSphere === null) {\n geometry.computeBoundingSphere()\n }\n\n _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld)\n\n // increase the sphere bounds by the worst case line screen space width\n let sphereMargin\n if (worldUnits) {\n sphereMargin = _lineWidth * 0.5\n } else {\n const distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin))\n sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution)\n }\n\n _sphere.radius += sphereMargin\n\n if (_ray.intersectsSphere(_sphere) === false) {\n return\n }\n\n // check if we intersect the box bounds\n if (geometry.boundingBox === null) {\n geometry.computeBoundingBox()\n }\n\n _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld)\n\n // increase the box bounds by the worst case line width\n let boxMargin\n if (worldUnits) {\n boxMargin = _lineWidth * 0.5\n } else {\n const distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin))\n boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution)\n }\n\n _box.expandByScalar(boxMargin)\n\n if (_ray.intersectsBox(_box) === false) {\n return\n }\n\n if (worldUnits) {\n raycastWorldUnits(this, intersects)\n } else {\n raycastScreenSpace(this, camera, intersects)\n }\n }\n}\n\nexport { LineSegments2 }\n"],"names":["Vector3","Vector4","Matrix4","Line3","Box3","Sphere","MathUtils","Mesh","LineSegmentsGeometry","LineMaterial","InstancedInterleavedBuffer","InterleavedBufferAttribute"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"LineSegments2.cjs","sources":["../../src/lines/LineSegments2.js"],"sourcesContent":["import {\n Box3,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Line3,\n MathUtils,\n Matrix4,\n Mesh,\n Sphere,\n Vector3,\n Vector4,\n} from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _viewport = new Vector4();\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nconst _start4 = new Vector4()\nconst _end4 = new Vector4()\n\nconst _ssOrigin = new Vector4()\nconst _ssOrigin3 = new Vector3()\nconst _mvMatrix = new Matrix4()\nconst _line = new Line3()\nconst _closestPoint = new Vector3()\n\nconst _box = new Box3()\nconst _sphere = new Sphere()\nconst _clipToWorldVector = new Vector4()\n\nlet _ray, _lineWidth\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth(camera, distance, resolution) {\n // transform into clip space, adjust the x and y values by the pixel width offset, then\n // transform back into world space to get world offset. Note clip space is [-1, 1] so full\n // width does not need to be halved.\n _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n _clipToWorldVector.x = _lineWidth / resolution.width\n _clipToWorldVector.y = _lineWidth / resolution.height\n _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n\n return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y))\n}\n\nfunction raycastWorldUnits(lineSegments, intersects) {\n\n const matrixWorld = lineSegments.matrixWorld;\n const geometry = lineSegments.geometry;\n const instanceStart = geometry.attributes.instanceStart;\n const instanceEnd = geometry.attributes.instanceEnd;\n const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);\n\n for (let i = 0, l = segmentCount; i < l; i++) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.applyMatrix4(matrixWorld);\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n const isInside = point.distanceTo(pointOnLine) < _lineWidth * 0.5\n\n if (isInside) {\n intersects.push({\n point,\n pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nfunction raycastScreenSpace(lineSegments, camera, intersects) {\n const projectionMatrix = camera.projectionMatrix\n const material = lineSegments.material\n const resolution = material.resolution\n const matrixWorld = lineSegments.matrixWorld\n\n const geometry = lineSegments.geometry\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);\n\n const near = -camera.near\n\n //\n\n // pick a point 1 unit out along the ray to avoid the ray origin\n // sitting at the camera origin which will cause \"w\" to be 0 when\n // applying the projection matrix.\n _ray.at(1, _ssOrigin)\n\n // ndc space [ - 1.0, 1.0 ]\n _ssOrigin.w = 1\n _ssOrigin.applyMatrix4(camera.matrixWorldInverse)\n _ssOrigin.applyMatrix4(projectionMatrix)\n _ssOrigin.multiplyScalar(1 / _ssOrigin.w)\n\n // screen space\n _ssOrigin.x *= resolution.x / 2\n _ssOrigin.y *= resolution.y / 2\n _ssOrigin.z = 0\n\n _ssOrigin3.copy(_ssOrigin)\n\n _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld)\n\n for (let i = 0, l = segmentCount; i < l; i++) {\n _start4.fromBufferAttribute(instanceStart, i)\n _end4.fromBufferAttribute(instanceEnd, i)\n\n _start4.w = 1\n _end4.w = 1\n\n // camera space\n _start4.applyMatrix4(_mvMatrix)\n _end4.applyMatrix4(_mvMatrix)\n\n // skip the segment if it's entirely behind the camera\n const isBehindCameraNear = _start4.z > near && _end4.z > near\n if (isBehindCameraNear) {\n continue\n }\n\n // trim the segment if it extends behind camera near\n if (_start4.z > near) {\n const deltaDist = _start4.z - _end4.z\n const t = (_start4.z - near) / deltaDist\n _start4.lerp(_end4, t)\n } else if (_end4.z > near) {\n const deltaDist = _end4.z - _start4.z\n const t = (_end4.z - near) / deltaDist\n _end4.lerp(_start4, t)\n }\n\n // clip space\n _start4.applyMatrix4(projectionMatrix)\n _end4.applyMatrix4(projectionMatrix)\n\n // ndc space [ - 1.0, 1.0 ]\n _start4.multiplyScalar(1 / _start4.w)\n _end4.multiplyScalar(1 / _end4.w)\n\n // screen space\n _start4.x *= resolution.x / 2\n _start4.y *= resolution.y / 2\n\n _end4.x *= resolution.x / 2\n _end4.y *= resolution.y / 2\n\n // create 2d segment\n _line.start.copy(_start4)\n _line.start.z = 0\n\n _line.end.copy(_end4)\n _line.end.z = 0\n\n // get closest point on ray to segment\n const param = _line.closestPointToPointParameter(_ssOrigin3, true)\n _line.at(param, _closestPoint)\n\n // check if the intersection point is within clip space\n const zPos = MathUtils.lerp(_start4.z, _end4.z, param)\n const isInClipSpace = zPos >= -1 && zPos <= 1\n\n const isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5\n\n if (isInClipSpace && isInside) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.start.applyMatrix4(matrixWorld)\n _line.end.applyMatrix4(matrixWorld)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n\n intersects.push({\n point: point,\n pointOnLine: pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nclass LineSegments2 extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isLineSegments2 = true\n\n this.type = 'LineSegments2'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n raycast(raycaster, intersects) {\n const worldUnits = this.material.worldUnits\n const camera = raycaster.camera\n\n if (camera === null && !worldUnits) {\n console.error(\n 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.',\n )\n }\n\n const threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0\n\n _ray = raycaster.ray\n\n const matrixWorld = this.matrixWorld\n const geometry = this.geometry\n const material = this.material\n\n _lineWidth = material.linewidth + threshold\n\n // check if we intersect the sphere bounds\n if (geometry.boundingSphere === null) {\n geometry.computeBoundingSphere()\n }\n\n _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld)\n\n // increase the sphere bounds by the worst case line screen space width\n let sphereMargin\n if (worldUnits) {\n sphereMargin = _lineWidth * 0.5\n } else {\n const distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin))\n sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution)\n }\n\n _sphere.radius += sphereMargin\n\n if (_ray.intersectsSphere(_sphere) === false) {\n return\n }\n\n // check if we intersect the box bounds\n if (geometry.boundingBox === null) {\n geometry.computeBoundingBox()\n }\n\n _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld)\n\n // increase the box bounds by the worst case line width\n let boxMargin\n if (worldUnits) {\n boxMargin = _lineWidth * 0.5\n } else {\n const distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin))\n boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution)\n }\n\n _box.expandByScalar(boxMargin)\n\n if (_ray.intersectsBox(_box) === false) {\n return\n }\n\n if (worldUnits) {\n raycastWorldUnits(this, intersects)\n } else {\n raycastScreenSpace(this, camera, intersects)\n }\n }\n\n onBeforeRender(renderer) {\n\n const uniforms = this.material.uniforms;\n\n if (uniforms && uniforms.resolution) {\n\n renderer.getViewport(_viewport);\n this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);\n\n }\n\n }\n}\n\nexport { LineSegments2 }\n"],"names":["Vector4","Vector3","Matrix4","Line3","Box3","Sphere","MathUtils","Mesh","LineSegmentsGeometry","LineMaterial","InstancedInterleavedBuffer","InterleavedBufferAttribute"],"mappings":"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"}
|
package/lines/LineSegments2.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
import {
|
1
|
+
import { Vector4, Vector3, Matrix4, Line3, Box3, Sphere, Mesh, InstancedInterleavedBuffer, InterleavedBufferAttribute, MathUtils } from "three";
|
2
2
|
import { LineSegmentsGeometry } from "./LineSegmentsGeometry.js";
|
3
3
|
import { LineMaterial } from "./LineMaterial.js";
|
4
|
+
const _viewport = new Vector4();
|
4
5
|
const _start = new Vector3();
|
5
6
|
const _end = new Vector3();
|
6
7
|
const _start4 = new Vector4();
|
@@ -13,7 +14,7 @@ const _closestPoint = new Vector3();
|
|
13
14
|
const _box = new Box3();
|
14
15
|
const _sphere = new Sphere();
|
15
16
|
const _clipToWorldVector = new Vector4();
|
16
|
-
let _ray,
|
17
|
+
let _ray, _lineWidth;
|
17
18
|
function getWorldSpaceHalfWidth(camera, distance, resolution) {
|
18
19
|
_clipToWorldVector.set(0, 0, -distance, 1).applyMatrix4(camera.projectionMatrix);
|
19
20
|
_clipToWorldVector.multiplyScalar(1 / _clipToWorldVector.w);
|
@@ -24,9 +25,15 @@ function getWorldSpaceHalfWidth(camera, distance, resolution) {
|
|
24
25
|
return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y));
|
25
26
|
}
|
26
27
|
function raycastWorldUnits(lineSegments, intersects) {
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
const matrixWorld = lineSegments.matrixWorld;
|
29
|
+
const geometry = lineSegments.geometry;
|
30
|
+
const instanceStart = geometry.attributes.instanceStart;
|
31
|
+
const instanceEnd = geometry.attributes.instanceEnd;
|
32
|
+
const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);
|
33
|
+
for (let i = 0, l = segmentCount; i < l; i++) {
|
34
|
+
_line.start.fromBufferAttribute(instanceStart, i);
|
35
|
+
_line.end.fromBufferAttribute(instanceEnd, i);
|
36
|
+
_line.applyMatrix4(matrixWorld);
|
30
37
|
const pointOnLine = new Vector3();
|
31
38
|
const point = new Vector3();
|
32
39
|
_ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine);
|
@@ -53,6 +60,7 @@ function raycastScreenSpace(lineSegments, camera, intersects) {
|
|
53
60
|
const geometry = lineSegments.geometry;
|
54
61
|
const instanceStart = geometry.attributes.instanceStart;
|
55
62
|
const instanceEnd = geometry.attributes.instanceEnd;
|
63
|
+
const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);
|
56
64
|
const near = -camera.near;
|
57
65
|
_ray.at(1, _ssOrigin);
|
58
66
|
_ssOrigin.w = 1;
|
@@ -64,7 +72,7 @@ function raycastScreenSpace(lineSegments, camera, intersects) {
|
|
64
72
|
_ssOrigin.z = 0;
|
65
73
|
_ssOrigin3.copy(_ssOrigin);
|
66
74
|
_mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld);
|
67
|
-
for (let i = 0, l =
|
75
|
+
for (let i = 0, l = segmentCount; i < l; i++) {
|
68
76
|
_start4.fromBufferAttribute(instanceStart, i);
|
69
77
|
_end4.fromBufferAttribute(instanceEnd, i);
|
70
78
|
_start4.w = 1;
|
@@ -159,8 +167,6 @@ class LineSegments2 extends Mesh {
|
|
159
167
|
const geometry = this.geometry;
|
160
168
|
const material = this.material;
|
161
169
|
_lineWidth = material.linewidth + threshold;
|
162
|
-
_instanceStart = geometry.attributes.instanceStart;
|
163
|
-
_instanceEnd = geometry.attributes.instanceEnd;
|
164
170
|
if (geometry.boundingSphere === null) {
|
165
171
|
geometry.computeBoundingSphere();
|
166
172
|
}
|
@@ -197,6 +203,13 @@ class LineSegments2 extends Mesh {
|
|
197
203
|
raycastScreenSpace(this, camera, intersects);
|
198
204
|
}
|
199
205
|
}
|
206
|
+
onBeforeRender(renderer) {
|
207
|
+
const uniforms = this.material.uniforms;
|
208
|
+
if (uniforms && uniforms.resolution) {
|
209
|
+
renderer.getViewport(_viewport);
|
210
|
+
this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);
|
211
|
+
}
|
212
|
+
}
|
200
213
|
}
|
201
214
|
export {
|
202
215
|
LineSegments2
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineSegments2.js","sources":["../../src/lines/LineSegments2.js"],"sourcesContent":["import {\n Box3,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Line3,\n MathUtils,\n Matrix4,\n Mesh,\n Sphere,\n Vector3,\n Vector4,\n} from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nconst _start4 = new Vector4()\nconst _end4 = new Vector4()\n\nconst _ssOrigin = new Vector4()\nconst _ssOrigin3 = new Vector3()\nconst _mvMatrix = new Matrix4()\nconst _line = new Line3()\nconst _closestPoint = new Vector3()\n\nconst _box = new Box3()\nconst _sphere = new Sphere()\nconst _clipToWorldVector = new Vector4()\n\nlet _ray, _instanceStart, _instanceEnd, _lineWidth\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth(camera, distance, resolution) {\n // transform into clip space, adjust the x and y values by the pixel width offset, then\n // transform back into world space to get world offset. Note clip space is [-1, 1] so full\n // width does not need to be halved.\n _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n _clipToWorldVector.x = _lineWidth / resolution.width\n _clipToWorldVector.y = _lineWidth / resolution.height\n _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n\n return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y))\n}\n\nfunction raycastWorldUnits(lineSegments, intersects) {\n for (let i = 0, l = _instanceStart.count; i < l; i++) {\n _line.start.fromBufferAttribute(_instanceStart, i)\n _line.end.fromBufferAttribute(_instanceEnd, i)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n const isInside = point.distanceTo(pointOnLine) < _lineWidth * 0.5\n\n if (isInside) {\n intersects.push({\n point,\n pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nfunction raycastScreenSpace(lineSegments, camera, intersects) {\n const projectionMatrix = camera.projectionMatrix\n const material = lineSegments.material\n const resolution = material.resolution\n const matrixWorld = lineSegments.matrixWorld\n\n const geometry = lineSegments.geometry\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n\n const near = -camera.near\n\n //\n\n // pick a point 1 unit out along the ray to avoid the ray origin\n // sitting at the camera origin which will cause \"w\" to be 0 when\n // applying the projection matrix.\n _ray.at(1, _ssOrigin)\n\n // ndc space [ - 1.0, 1.0 ]\n _ssOrigin.w = 1\n _ssOrigin.applyMatrix4(camera.matrixWorldInverse)\n _ssOrigin.applyMatrix4(projectionMatrix)\n _ssOrigin.multiplyScalar(1 / _ssOrigin.w)\n\n // screen space\n _ssOrigin.x *= resolution.x / 2\n _ssOrigin.y *= resolution.y / 2\n _ssOrigin.z = 0\n\n _ssOrigin3.copy(_ssOrigin)\n\n _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld)\n\n for (let i = 0, l = instanceStart.count; i < l; i++) {\n _start4.fromBufferAttribute(instanceStart, i)\n _end4.fromBufferAttribute(instanceEnd, i)\n\n _start4.w = 1\n _end4.w = 1\n\n // camera space\n _start4.applyMatrix4(_mvMatrix)\n _end4.applyMatrix4(_mvMatrix)\n\n // skip the segment if it's entirely behind the camera\n const isBehindCameraNear = _start4.z > near && _end4.z > near\n if (isBehindCameraNear) {\n continue\n }\n\n // trim the segment if it extends behind camera near\n if (_start4.z > near) {\n const deltaDist = _start4.z - _end4.z\n const t = (_start4.z - near) / deltaDist\n _start4.lerp(_end4, t)\n } else if (_end4.z > near) {\n const deltaDist = _end4.z - _start4.z\n const t = (_end4.z - near) / deltaDist\n _end4.lerp(_start4, t)\n }\n\n // clip space\n _start4.applyMatrix4(projectionMatrix)\n _end4.applyMatrix4(projectionMatrix)\n\n // ndc space [ - 1.0, 1.0 ]\n _start4.multiplyScalar(1 / _start4.w)\n _end4.multiplyScalar(1 / _end4.w)\n\n // screen space\n _start4.x *= resolution.x / 2\n _start4.y *= resolution.y / 2\n\n _end4.x *= resolution.x / 2\n _end4.y *= resolution.y / 2\n\n // create 2d segment\n _line.start.copy(_start4)\n _line.start.z = 0\n\n _line.end.copy(_end4)\n _line.end.z = 0\n\n // get closest point on ray to segment\n const param = _line.closestPointToPointParameter(_ssOrigin3, true)\n _line.at(param, _closestPoint)\n\n // check if the intersection point is within clip space\n const zPos = MathUtils.lerp(_start4.z, _end4.z, param)\n const isInClipSpace = zPos >= -1 && zPos <= 1\n\n const isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5\n\n if (isInClipSpace && isInside) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.start.applyMatrix4(matrixWorld)\n _line.end.applyMatrix4(matrixWorld)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n\n intersects.push({\n point: point,\n pointOnLine: pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nclass LineSegments2 extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isLineSegments2 = true\n\n this.type = 'LineSegments2'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n raycast(raycaster, intersects) {\n const worldUnits = this.material.worldUnits\n const camera = raycaster.camera\n\n if (camera === null && !worldUnits) {\n console.error(\n 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.',\n )\n }\n\n const threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0\n\n _ray = raycaster.ray\n\n const matrixWorld = this.matrixWorld\n const geometry = this.geometry\n const material = this.material\n\n _lineWidth = material.linewidth + threshold\n\n _instanceStart = geometry.attributes.instanceStart\n _instanceEnd = geometry.attributes.instanceEnd\n\n // check if we intersect the sphere bounds\n if (geometry.boundingSphere === null) {\n geometry.computeBoundingSphere()\n }\n\n _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld)\n\n // increase the sphere bounds by the worst case line screen space width\n let sphereMargin\n if (worldUnits) {\n sphereMargin = _lineWidth * 0.5\n } else {\n const distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin))\n sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution)\n }\n\n _sphere.radius += sphereMargin\n\n if (_ray.intersectsSphere(_sphere) === false) {\n return\n }\n\n // check if we intersect the box bounds\n if (geometry.boundingBox === null) {\n geometry.computeBoundingBox()\n }\n\n _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld)\n\n // increase the box bounds by the worst case line width\n let boxMargin\n if (worldUnits) {\n boxMargin = _lineWidth * 0.5\n } else {\n const distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin))\n boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution)\n }\n\n _box.expandByScalar(boxMargin)\n\n if (_ray.intersectsBox(_box) === false) {\n return\n }\n\n if (worldUnits) {\n raycastWorldUnits(this, intersects)\n } else {\n raycastScreenSpace(this, camera, intersects)\n }\n }\n}\n\nexport { LineSegments2 }\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"LineSegments2.js","sources":["../../src/lines/LineSegments2.js"],"sourcesContent":["import {\n Box3,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Line3,\n MathUtils,\n Matrix4,\n Mesh,\n Sphere,\n Vector3,\n Vector4,\n} from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _viewport = new Vector4();\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nconst _start4 = new Vector4()\nconst _end4 = new Vector4()\n\nconst _ssOrigin = new Vector4()\nconst _ssOrigin3 = new Vector3()\nconst _mvMatrix = new Matrix4()\nconst _line = new Line3()\nconst _closestPoint = new Vector3()\n\nconst _box = new Box3()\nconst _sphere = new Sphere()\nconst _clipToWorldVector = new Vector4()\n\nlet _ray, _lineWidth\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth(camera, distance, resolution) {\n // transform into clip space, adjust the x and y values by the pixel width offset, then\n // transform back into world space to get world offset. Note clip space is [-1, 1] so full\n // width does not need to be halved.\n _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n _clipToWorldVector.x = _lineWidth / resolution.width\n _clipToWorldVector.y = _lineWidth / resolution.height\n _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse)\n _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w)\n\n return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y))\n}\n\nfunction raycastWorldUnits(lineSegments, intersects) {\n\n const matrixWorld = lineSegments.matrixWorld;\n const geometry = lineSegments.geometry;\n const instanceStart = geometry.attributes.instanceStart;\n const instanceEnd = geometry.attributes.instanceEnd;\n const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);\n\n for (let i = 0, l = segmentCount; i < l; i++) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.applyMatrix4(matrixWorld);\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n const isInside = point.distanceTo(pointOnLine) < _lineWidth * 0.5\n\n if (isInside) {\n intersects.push({\n point,\n pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nfunction raycastScreenSpace(lineSegments, camera, intersects) {\n const projectionMatrix = camera.projectionMatrix\n const material = lineSegments.material\n const resolution = material.resolution\n const matrixWorld = lineSegments.matrixWorld\n\n const geometry = lineSegments.geometry\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const segmentCount = Math.min(geometry.instanceCount, instanceStart.count);\n\n const near = -camera.near\n\n //\n\n // pick a point 1 unit out along the ray to avoid the ray origin\n // sitting at the camera origin which will cause \"w\" to be 0 when\n // applying the projection matrix.\n _ray.at(1, _ssOrigin)\n\n // ndc space [ - 1.0, 1.0 ]\n _ssOrigin.w = 1\n _ssOrigin.applyMatrix4(camera.matrixWorldInverse)\n _ssOrigin.applyMatrix4(projectionMatrix)\n _ssOrigin.multiplyScalar(1 / _ssOrigin.w)\n\n // screen space\n _ssOrigin.x *= resolution.x / 2\n _ssOrigin.y *= resolution.y / 2\n _ssOrigin.z = 0\n\n _ssOrigin3.copy(_ssOrigin)\n\n _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld)\n\n for (let i = 0, l = segmentCount; i < l; i++) {\n _start4.fromBufferAttribute(instanceStart, i)\n _end4.fromBufferAttribute(instanceEnd, i)\n\n _start4.w = 1\n _end4.w = 1\n\n // camera space\n _start4.applyMatrix4(_mvMatrix)\n _end4.applyMatrix4(_mvMatrix)\n\n // skip the segment if it's entirely behind the camera\n const isBehindCameraNear = _start4.z > near && _end4.z > near\n if (isBehindCameraNear) {\n continue\n }\n\n // trim the segment if it extends behind camera near\n if (_start4.z > near) {\n const deltaDist = _start4.z - _end4.z\n const t = (_start4.z - near) / deltaDist\n _start4.lerp(_end4, t)\n } else if (_end4.z > near) {\n const deltaDist = _end4.z - _start4.z\n const t = (_end4.z - near) / deltaDist\n _end4.lerp(_start4, t)\n }\n\n // clip space\n _start4.applyMatrix4(projectionMatrix)\n _end4.applyMatrix4(projectionMatrix)\n\n // ndc space [ - 1.0, 1.0 ]\n _start4.multiplyScalar(1 / _start4.w)\n _end4.multiplyScalar(1 / _end4.w)\n\n // screen space\n _start4.x *= resolution.x / 2\n _start4.y *= resolution.y / 2\n\n _end4.x *= resolution.x / 2\n _end4.y *= resolution.y / 2\n\n // create 2d segment\n _line.start.copy(_start4)\n _line.start.z = 0\n\n _line.end.copy(_end4)\n _line.end.z = 0\n\n // get closest point on ray to segment\n const param = _line.closestPointToPointParameter(_ssOrigin3, true)\n _line.at(param, _closestPoint)\n\n // check if the intersection point is within clip space\n const zPos = MathUtils.lerp(_start4.z, _end4.z, param)\n const isInClipSpace = zPos >= -1 && zPos <= 1\n\n const isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5\n\n if (isInClipSpace && isInside) {\n _line.start.fromBufferAttribute(instanceStart, i)\n _line.end.fromBufferAttribute(instanceEnd, i)\n\n _line.start.applyMatrix4(matrixWorld)\n _line.end.applyMatrix4(matrixWorld)\n\n const pointOnLine = new Vector3()\n const point = new Vector3()\n\n _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine)\n\n intersects.push({\n point: point,\n pointOnLine: pointOnLine,\n distance: _ray.origin.distanceTo(point),\n object: lineSegments,\n face: null,\n faceIndex: i,\n uv: null,\n uv2: null,\n })\n }\n }\n}\n\nclass LineSegments2 extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isLineSegments2 = true\n\n this.type = 'LineSegments2'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n raycast(raycaster, intersects) {\n const worldUnits = this.material.worldUnits\n const camera = raycaster.camera\n\n if (camera === null && !worldUnits) {\n console.error(\n 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.',\n )\n }\n\n const threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0\n\n _ray = raycaster.ray\n\n const matrixWorld = this.matrixWorld\n const geometry = this.geometry\n const material = this.material\n\n _lineWidth = material.linewidth + threshold\n\n // check if we intersect the sphere bounds\n if (geometry.boundingSphere === null) {\n geometry.computeBoundingSphere()\n }\n\n _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld)\n\n // increase the sphere bounds by the worst case line screen space width\n let sphereMargin\n if (worldUnits) {\n sphereMargin = _lineWidth * 0.5\n } else {\n const distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin))\n sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution)\n }\n\n _sphere.radius += sphereMargin\n\n if (_ray.intersectsSphere(_sphere) === false) {\n return\n }\n\n // check if we intersect the box bounds\n if (geometry.boundingBox === null) {\n geometry.computeBoundingBox()\n }\n\n _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld)\n\n // increase the box bounds by the worst case line width\n let boxMargin\n if (worldUnits) {\n boxMargin = _lineWidth * 0.5\n } else {\n const distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin))\n boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution)\n }\n\n _box.expandByScalar(boxMargin)\n\n if (_ray.intersectsBox(_box) === false) {\n return\n }\n\n if (worldUnits) {\n raycastWorldUnits(this, intersects)\n } else {\n raycastScreenSpace(this, camera, intersects)\n }\n }\n\n onBeforeRender(renderer) {\n\n const uniforms = this.material.uniforms;\n\n if (uniforms && uniforms.resolution) {\n\n renderer.getViewport(_viewport);\n this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);\n\n }\n\n }\n}\n\nexport { LineSegments2 }\n"],"names":[],"mappings":";;;AAeA,MAAM,YAAY,IAAI;AAEtB,MAAM,SAAS,IAAI,QAAS;AAC5B,MAAM,OAAO,IAAI,QAAS;AAE1B,MAAM,UAAU,IAAI,QAAS;AAC7B,MAAM,QAAQ,IAAI,QAAS;AAE3B,MAAM,YAAY,IAAI,QAAS;AAC/B,MAAM,aAAa,IAAI,QAAS;AAChC,MAAM,YAAY,IAAI,QAAS;AAC/B,MAAM,QAAQ,IAAI,MAAO;AACzB,MAAM,gBAAgB,IAAI,QAAS;AAEnC,MAAM,OAAO,IAAI,KAAM;AACvB,MAAM,UAAU,IAAI,OAAQ;AAC5B,MAAM,qBAAqB,IAAI,QAAS;AAExC,IAAI,MAAM;AAIV,SAAS,uBAAuB,QAAQ,UAAU,YAAY;AAI5D,qBAAmB,IAAI,GAAG,GAAG,CAAC,UAAU,CAAG,EAAE,aAAa,OAAO,gBAAgB;AACjF,qBAAmB,eAAe,IAAM,mBAAmB,CAAC;AAC5D,qBAAmB,IAAI,aAAa,WAAW;AAC/C,qBAAmB,IAAI,aAAa,WAAW;AAC/C,qBAAmB,aAAa,OAAO,uBAAuB;AAC9D,qBAAmB,eAAe,IAAM,mBAAmB,CAAC;AAE5D,SAAO,KAAK,IAAI,KAAK,IAAI,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;AACtE;AAEA,SAAS,kBAAkB,cAAc,YAAY;AAEnD,QAAM,cAAc,aAAa;AACjC,QAAM,WAAW,aAAa;AAC9B,QAAM,gBAAgB,SAAS,WAAW;AAC1C,QAAM,cAAc,SAAS,WAAW;AACxC,QAAM,eAAe,KAAK,IAAI,SAAS,eAAe,cAAc,KAAK;AAEzE,WAAS,IAAI,GAAG,IAAI,cAAc,IAAI,GAAG,KAAK;AAC5C,UAAM,MAAM,oBAAoB,eAAe,CAAC;AAChD,UAAM,IAAI,oBAAoB,aAAa,CAAC;AAE5C,UAAM,aAAa,WAAW;AAE9B,UAAM,cAAc,IAAI,QAAS;AACjC,UAAM,QAAQ,IAAI,QAAS;AAE3B,SAAK,oBAAoB,MAAM,OAAO,MAAM,KAAK,OAAO,WAAW;AACnE,UAAM,WAAW,MAAM,WAAW,WAAW,IAAI,aAAa;AAE9D,QAAI,UAAU;AACZ,iBAAW,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,UAAU,KAAK,OAAO,WAAW,KAAK;AAAA,QACtC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,KAAK;AAAA,MACb,CAAO;AAAA,IACF;AAAA,EACF;AACH;AAEA,SAAS,mBAAmB,cAAc,QAAQ,YAAY;AAC5D,QAAM,mBAAmB,OAAO;AAChC,QAAM,WAAW,aAAa;AAC9B,QAAM,aAAa,SAAS;AAC5B,QAAM,cAAc,aAAa;AAEjC,QAAM,WAAW,aAAa;AAC9B,QAAM,gBAAgB,SAAS,WAAW;AAC1C,QAAM,cAAc,SAAS,WAAW;AACxC,QAAM,eAAe,KAAK,IAAI,SAAS,eAAe,cAAc,KAAK;AAEzE,QAAM,OAAO,CAAC,OAAO;AAOrB,OAAK,GAAG,GAAG,SAAS;AAGpB,YAAU,IAAI;AACd,YAAU,aAAa,OAAO,kBAAkB;AAChD,YAAU,aAAa,gBAAgB;AACvC,YAAU,eAAe,IAAI,UAAU,CAAC;AAGxC,YAAU,KAAK,WAAW,IAAI;AAC9B,YAAU,KAAK,WAAW,IAAI;AAC9B,YAAU,IAAI;AAEd,aAAW,KAAK,SAAS;AAEzB,YAAU,iBAAiB,OAAO,oBAAoB,WAAW;AAEjE,WAAS,IAAI,GAAG,IAAI,cAAc,IAAI,GAAG,KAAK;AAC5C,YAAQ,oBAAoB,eAAe,CAAC;AAC5C,UAAM,oBAAoB,aAAa,CAAC;AAExC,YAAQ,IAAI;AACZ,UAAM,IAAI;AAGV,YAAQ,aAAa,SAAS;AAC9B,UAAM,aAAa,SAAS;AAG5B,UAAM,qBAAqB,QAAQ,IAAI,QAAQ,MAAM,IAAI;AACzD,QAAI,oBAAoB;AACtB;AAAA,IACD;AAGD,QAAI,QAAQ,IAAI,MAAM;AACpB,YAAM,YAAY,QAAQ,IAAI,MAAM;AACpC,YAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,cAAQ,KAAK,OAAO,CAAC;AAAA,IAC3B,WAAe,MAAM,IAAI,MAAM;AACzB,YAAM,YAAY,MAAM,IAAI,QAAQ;AACpC,YAAM,KAAK,MAAM,IAAI,QAAQ;AAC7B,YAAM,KAAK,SAAS,CAAC;AAAA,IACtB;AAGD,YAAQ,aAAa,gBAAgB;AACrC,UAAM,aAAa,gBAAgB;AAGnC,YAAQ,eAAe,IAAI,QAAQ,CAAC;AACpC,UAAM,eAAe,IAAI,MAAM,CAAC;AAGhC,YAAQ,KAAK,WAAW,IAAI;AAC5B,YAAQ,KAAK,WAAW,IAAI;AAE5B,UAAM,KAAK,WAAW,IAAI;AAC1B,UAAM,KAAK,WAAW,IAAI;AAG1B,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,MAAM,IAAI;AAEhB,UAAM,IAAI,KAAK,KAAK;AACpB,UAAM,IAAI,IAAI;AAGd,UAAM,QAAQ,MAAM,6BAA6B,YAAY,IAAI;AACjE,UAAM,GAAG,OAAO,aAAa;AAG7B,UAAM,OAAO,UAAU,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK;AACrD,UAAM,gBAAgB,QAAQ,MAAM,QAAQ;AAE5C,UAAM,WAAW,WAAW,WAAW,aAAa,IAAI,aAAa;AAErE,QAAI,iBAAiB,UAAU;AAC7B,YAAM,MAAM,oBAAoB,eAAe,CAAC;AAChD,YAAM,IAAI,oBAAoB,aAAa,CAAC;AAE5C,YAAM,MAAM,aAAa,WAAW;AACpC,YAAM,IAAI,aAAa,WAAW;AAElC,YAAM,cAAc,IAAI,QAAS;AACjC,YAAM,QAAQ,IAAI,QAAS;AAE3B,WAAK,oBAAoB,MAAM,OAAO,MAAM,KAAK,OAAO,WAAW;AAEnE,iBAAW,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,UAAU,KAAK,OAAO,WAAW,KAAK;AAAA,QACtC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,KAAK;AAAA,MACb,CAAO;AAAA,IACF;AAAA,EACF;AACH;AAEA,MAAM,sBAAsB,KAAK;AAAA,EAC/B,YAAY,WAAW,IAAI,qBAAsB,GAAE,WAAW,IAAI,aAAa,EAAE,OAAO,KAAK,WAAW,SAAU,CAAA,GAAG;AACnH,UAAM,UAAU,QAAQ;AAExB,SAAK,kBAAkB;AAEvB,SAAK,OAAO;AAAA,EACb;AAAA;AAAA,EAID,uBAAuB;AACrB,UAAM,WAAW,KAAK;AAEtB,UAAM,gBAAgB,SAAS,WAAW;AAC1C,UAAM,cAAc,SAAS,WAAW;AACxC,UAAM,gBAAgB,IAAI,aAAa,IAAI,cAAc,KAAK;AAE9D,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,cAAc,OAAO,IAAI,GAAG,KAAK,KAAK,GAAG;AAClE,aAAO,oBAAoB,eAAe,CAAC;AAC3C,WAAK,oBAAoB,aAAa,CAAC;AAEvC,oBAAc,CAAC,IAAI,MAAM,IAAI,IAAI,cAAc,IAAI,CAAC;AACpD,oBAAc,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,OAAO,WAAW,IAAI;AAAA,IACjE;AAED,UAAM,yBAAyB,IAAI,2BAA2B,eAAe,GAAG,CAAC;AAEjF,aAAS,aAAa,yBAAyB,IAAI,2BAA2B,wBAAwB,GAAG,CAAC,CAAC;AAC3G,aAAS,aAAa,uBAAuB,IAAI,2BAA2B,wBAAwB,GAAG,CAAC,CAAC;AAEzG,WAAO;AAAA,EACR;AAAA,EAED,QAAQ,WAAW,YAAY;AAC7B,UAAM,aAAa,KAAK,SAAS;AACjC,UAAM,SAAS,UAAU;AAEzB,QAAI,WAAW,QAAQ,CAAC,YAAY;AAClC,cAAQ;AAAA,QACN;AAAA,MACD;AAAA,IACF;AAED,UAAM,YAAY,UAAU,OAAO,UAAU,SAAY,UAAU,OAAO,MAAM,aAAa,IAAI;AAEjG,WAAO,UAAU;AAEjB,UAAM,cAAc,KAAK;AACzB,UAAM,WAAW,KAAK;AACtB,UAAM,WAAW,KAAK;AAEtB,iBAAa,SAAS,YAAY;AAGlC,QAAI,SAAS,mBAAmB,MAAM;AACpC,eAAS,sBAAuB;AAAA,IACjC;AAED,YAAQ,KAAK,SAAS,cAAc,EAAE,aAAa,WAAW;AAG9D,QAAI;AACJ,QAAI,YAAY;AACd,qBAAe,aAAa;AAAA,IAClC,OAAW;AACL,YAAM,mBAAmB,KAAK,IAAI,OAAO,MAAM,QAAQ,gBAAgB,KAAK,MAAM,CAAC;AACnF,qBAAe,uBAAuB,QAAQ,kBAAkB,SAAS,UAAU;AAAA,IACpF;AAED,YAAQ,UAAU;AAElB,QAAI,KAAK,iBAAiB,OAAO,MAAM,OAAO;AAC5C;AAAA,IACD;AAGD,QAAI,SAAS,gBAAgB,MAAM;AACjC,eAAS,mBAAoB;AAAA,IAC9B;AAED,SAAK,KAAK,SAAS,WAAW,EAAE,aAAa,WAAW;AAGxD,QAAI;AACJ,QAAI,YAAY;AACd,kBAAY,aAAa;AAAA,IAC/B,OAAW;AACL,YAAM,gBAAgB,KAAK,IAAI,OAAO,MAAM,KAAK,gBAAgB,KAAK,MAAM,CAAC;AAC7E,kBAAY,uBAAuB,QAAQ,eAAe,SAAS,UAAU;AAAA,IAC9E;AAED,SAAK,eAAe,SAAS;AAE7B,QAAI,KAAK,cAAc,IAAI,MAAM,OAAO;AACtC;AAAA,IACD;AAED,QAAI,YAAY;AACd,wBAAkB,MAAM,UAAU;AAAA,IACxC,OAAW;AACL,yBAAmB,MAAM,QAAQ,UAAU;AAAA,IAC5C;AAAA,EACF;AAAA,EAED,eAAe,UAAU;AAEvB,UAAM,WAAW,KAAK,SAAS;AAE/B,QAAI,YAAY,SAAS,YAAY;AAEnC,eAAS,YAAY,SAAS;AAC9B,WAAK,SAAS,SAAS,WAAW,MAAM,IAAI,UAAU,GAAG,UAAU,CAAC;AAAA,IAErE;AAAA,EAEF;AACH;"}
|
package/lines/Wireframe.cjs
CHANGED
@@ -5,6 +5,7 @@ const LineSegmentsGeometry = require("./LineSegmentsGeometry.cjs");
|
|
5
5
|
const LineMaterial = require("./LineMaterial.cjs");
|
6
6
|
const _start = new THREE.Vector3();
|
7
7
|
const _end = new THREE.Vector3();
|
8
|
+
const _viewport = new THREE.Vector4();
|
8
9
|
class Wireframe extends THREE.Mesh {
|
9
10
|
constructor(geometry = new LineSegmentsGeometry.LineSegmentsGeometry(), material = new LineMaterial.LineMaterial({ color: Math.random() * 16777215 })) {
|
10
11
|
super(geometry, material);
|
@@ -28,6 +29,13 @@ class Wireframe extends THREE.Mesh {
|
|
28
29
|
geometry.setAttribute("instanceDistanceEnd", new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1));
|
29
30
|
return this;
|
30
31
|
}
|
32
|
+
onBeforeRender(renderer) {
|
33
|
+
const uniforms = this.material.uniforms;
|
34
|
+
if (uniforms && uniforms.resolution) {
|
35
|
+
renderer.getViewport(_viewport);
|
36
|
+
this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);
|
37
|
+
}
|
38
|
+
}
|
31
39
|
}
|
32
40
|
exports.Wireframe = Wireframe;
|
33
41
|
//# sourceMappingURL=Wireframe.cjs.map
|
package/lines/Wireframe.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Wireframe.cjs","sources":["../../src/lines/Wireframe.js"],"sourcesContent":["import { InstancedInterleavedBuffer, InterleavedBufferAttribute, Mesh, Vector3 } from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nclass Wireframe extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isWireframe = true\n\n this.type = 'Wireframe'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n}\n\nexport { Wireframe }\n"],"names":["Vector3","Mesh","LineSegmentsGeometry","LineMaterial","InstancedInterleavedBuffer","InterleavedBufferAttribute"],"mappings":";;;;;AAIA,MAAM,SAAS,IAAIA,MAAAA,QAAS;AAC5B,MAAM,OAAO,IAAIA,MAAAA,QAAS;
|
1
|
+
{"version":3,"file":"Wireframe.cjs","sources":["../../src/lines/Wireframe.js"],"sourcesContent":["import { InstancedInterleavedBuffer, InterleavedBufferAttribute, Mesh, Vector3, Vector4 } from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\nconst _viewport = new Vector4();\n\nclass Wireframe extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isWireframe = true\n\n this.type = 'Wireframe'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n onBeforeRender(renderer) {\n\n const uniforms = this.material.uniforms;\n\n if (uniforms && uniforms.resolution) {\n\n renderer.getViewport(_viewport);\n this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);\n\n }\n\n }\n}\n\nexport { Wireframe }\n"],"names":["Vector3","Vector4","Mesh","LineSegmentsGeometry","LineMaterial","InstancedInterleavedBuffer","InterleavedBufferAttribute"],"mappings":";;;;;AAIA,MAAM,SAAS,IAAIA,MAAAA,QAAS;AAC5B,MAAM,OAAO,IAAIA,MAAAA,QAAS;AAC1B,MAAM,YAAY,IAAIC,MAAAA;AAEtB,MAAM,kBAAkBC,MAAAA,KAAK;AAAA,EAC3B,YAAY,WAAW,IAAIC,0CAAsB,GAAE,WAAW,IAAIC,aAAAA,aAAa,EAAE,OAAO,KAAK,WAAW,SAAU,CAAA,GAAG;AACnH,UAAM,UAAU,QAAQ;AAExB,SAAK,cAAc;AAEnB,SAAK,OAAO;AAAA,EACb;AAAA;AAAA,EAID,uBAAuB;AACrB,UAAM,WAAW,KAAK;AAEtB,UAAM,gBAAgB,SAAS,WAAW;AAC1C,UAAM,cAAc,SAAS,WAAW;AACxC,UAAM,gBAAgB,IAAI,aAAa,IAAI,cAAc,KAAK;AAE9D,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,cAAc,OAAO,IAAI,GAAG,KAAK,KAAK,GAAG;AAClE,aAAO,oBAAoB,eAAe,CAAC;AAC3C,WAAK,oBAAoB,aAAa,CAAC;AAEvC,oBAAc,CAAC,IAAI,MAAM,IAAI,IAAI,cAAc,IAAI,CAAC;AACpD,oBAAc,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,OAAO,WAAW,IAAI;AAAA,IACjE;AAED,UAAM,yBAAyB,IAAIC,MAAAA,2BAA2B,eAAe,GAAG,CAAC;AAEjF,aAAS,aAAa,yBAAyB,IAAIC,MAA0B,2BAAC,wBAAwB,GAAG,CAAC,CAAC;AAC3G,aAAS,aAAa,uBAAuB,IAAIA,MAA0B,2BAAC,wBAAwB,GAAG,CAAC,CAAC;AAEzG,WAAO;AAAA,EACR;AAAA,EAED,eAAe,UAAU;AAEvB,UAAM,WAAW,KAAK,SAAS;AAE/B,QAAI,YAAY,SAAS,YAAY;AAEnC,eAAS,YAAY,SAAS;AAC9B,WAAK,SAAS,SAAS,WAAW,MAAM,IAAI,UAAU,GAAG,UAAU,CAAC;AAAA,IAErE;AAAA,EAEF;AACH;;"}
|
package/lines/Wireframe.js
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
import { Vector3, Mesh, InstancedInterleavedBuffer, InterleavedBufferAttribute } from "three";
|
1
|
+
import { Vector3, Vector4, Mesh, InstancedInterleavedBuffer, InterleavedBufferAttribute } from "three";
|
2
2
|
import { LineSegmentsGeometry } from "./LineSegmentsGeometry.js";
|
3
3
|
import { LineMaterial } from "./LineMaterial.js";
|
4
4
|
const _start = new Vector3();
|
5
5
|
const _end = new Vector3();
|
6
|
+
const _viewport = new Vector4();
|
6
7
|
class Wireframe extends Mesh {
|
7
8
|
constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 16777215 })) {
|
8
9
|
super(geometry, material);
|
@@ -26,6 +27,13 @@ class Wireframe extends Mesh {
|
|
26
27
|
geometry.setAttribute("instanceDistanceEnd", new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1));
|
27
28
|
return this;
|
28
29
|
}
|
30
|
+
onBeforeRender(renderer) {
|
31
|
+
const uniforms = this.material.uniforms;
|
32
|
+
if (uniforms && uniforms.resolution) {
|
33
|
+
renderer.getViewport(_viewport);
|
34
|
+
this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);
|
35
|
+
}
|
36
|
+
}
|
29
37
|
}
|
30
38
|
export {
|
31
39
|
Wireframe
|
package/lines/Wireframe.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Wireframe.js","sources":["../../src/lines/Wireframe.js"],"sourcesContent":["import { InstancedInterleavedBuffer, InterleavedBufferAttribute, Mesh, Vector3 } from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\n\nclass Wireframe extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isWireframe = true\n\n this.type = 'Wireframe'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n}\n\nexport { Wireframe }\n"],"names":[],"mappings":";;;AAIA,MAAM,SAAS,IAAI,QAAS;AAC5B,MAAM,OAAO,IAAI,QAAS;
|
1
|
+
{"version":3,"file":"Wireframe.js","sources":["../../src/lines/Wireframe.js"],"sourcesContent":["import { InstancedInterleavedBuffer, InterleavedBufferAttribute, Mesh, Vector3, Vector4 } from 'three'\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry'\nimport { LineMaterial } from '../lines/LineMaterial'\n\nconst _start = new Vector3()\nconst _end = new Vector3()\nconst _viewport = new Vector4();\n\nclass Wireframe extends Mesh {\n constructor(geometry = new LineSegmentsGeometry(), material = new LineMaterial({ color: Math.random() * 0xffffff })) {\n super(geometry, material)\n\n this.isWireframe = true\n\n this.type = 'Wireframe'\n }\n\n // for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n computeLineDistances() {\n const geometry = this.geometry\n\n const instanceStart = geometry.attributes.instanceStart\n const instanceEnd = geometry.attributes.instanceEnd\n const lineDistances = new Float32Array(2 * instanceStart.count)\n\n for (let i = 0, j = 0, l = instanceStart.count; i < l; i++, j += 2) {\n _start.fromBufferAttribute(instanceStart, i)\n _end.fromBufferAttribute(instanceEnd, i)\n\n lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1]\n lineDistances[j + 1] = lineDistances[j] + _start.distanceTo(_end)\n }\n\n const instanceDistanceBuffer = new InstancedInterleavedBuffer(lineDistances, 2, 1) // d0, d1\n\n geometry.setAttribute('instanceDistanceStart', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)) // d0\n geometry.setAttribute('instanceDistanceEnd', new InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)) // d1\n\n return this\n }\n\n onBeforeRender(renderer) {\n\n const uniforms = this.material.uniforms;\n\n if (uniforms && uniforms.resolution) {\n\n renderer.getViewport(_viewport);\n this.material.uniforms.resolution.value.set(_viewport.z, _viewport.w);\n\n }\n\n }\n}\n\nexport { Wireframe }\n"],"names":[],"mappings":";;;AAIA,MAAM,SAAS,IAAI,QAAS;AAC5B,MAAM,OAAO,IAAI,QAAS;AAC1B,MAAM,YAAY,IAAI;AAEtB,MAAM,kBAAkB,KAAK;AAAA,EAC3B,YAAY,WAAW,IAAI,qBAAsB,GAAE,WAAW,IAAI,aAAa,EAAE,OAAO,KAAK,WAAW,SAAU,CAAA,GAAG;AACnH,UAAM,UAAU,QAAQ;AAExB,SAAK,cAAc;AAEnB,SAAK,OAAO;AAAA,EACb;AAAA;AAAA,EAID,uBAAuB;AACrB,UAAM,WAAW,KAAK;AAEtB,UAAM,gBAAgB,SAAS,WAAW;AAC1C,UAAM,cAAc,SAAS,WAAW;AACxC,UAAM,gBAAgB,IAAI,aAAa,IAAI,cAAc,KAAK;AAE9D,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,cAAc,OAAO,IAAI,GAAG,KAAK,KAAK,GAAG;AAClE,aAAO,oBAAoB,eAAe,CAAC;AAC3C,WAAK,oBAAoB,aAAa,CAAC;AAEvC,oBAAc,CAAC,IAAI,MAAM,IAAI,IAAI,cAAc,IAAI,CAAC;AACpD,oBAAc,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,OAAO,WAAW,IAAI;AAAA,IACjE;AAED,UAAM,yBAAyB,IAAI,2BAA2B,eAAe,GAAG,CAAC;AAEjF,aAAS,aAAa,yBAAyB,IAAI,2BAA2B,wBAAwB,GAAG,CAAC,CAAC;AAC3G,aAAS,aAAa,uBAAuB,IAAI,2BAA2B,wBAAwB,GAAG,CAAC,CAAC;AAEzG,WAAO;AAAA,EACR;AAAA,EAED,eAAe,UAAU;AAEvB,UAAM,WAAW,KAAK,SAAS;AAE/B,QAAI,YAAY,SAAS,YAAY;AAEnC,eAAS,YAAY,SAAS;AAC9B,WAAK,SAAS,SAAS,WAAW,MAAM,IAAI,UAAU,GAAG,UAAU,CAAC;AAAA,IAErE;AAAA,EAEF;AACH;"}
|