three-stdlib 2.28.11 → 2.29.0
Sign up to get free protection for your applications and to get access to all the features.
- package/controls/ArcballControls.cjs.map +1 -1
- package/controls/ArcballControls.js.map +1 -1
- package/controls/DeviceOrientationControls.cjs.map +1 -1
- package/controls/DeviceOrientationControls.js.map +1 -1
- package/controls/DragControls.cjs.map +1 -1
- package/controls/DragControls.js.map +1 -1
- package/controls/FlyControls.cjs +1 -1
- package/controls/FlyControls.cjs.map +1 -1
- package/controls/FlyControls.js +1 -1
- package/controls/FlyControls.js.map +1 -1
- package/controls/OrbitControls.cjs.map +1 -1
- package/controls/OrbitControls.js.map +1 -1
- package/controls/PointerLockControls.cjs.map +1 -1
- package/controls/PointerLockControls.js.map +1 -1
- package/controls/TrackballControls.cjs +0 -2
- package/controls/TrackballControls.cjs.map +1 -1
- package/controls/TrackballControls.js +0 -2
- package/controls/TrackballControls.js.map +1 -1
- package/controls/TransformControls.cjs +2 -2
- package/controls/TransformControls.cjs.map +1 -1
- package/controls/TransformControls.js +2 -2
- package/controls/TransformControls.js.map +1 -1
- package/controls/experimental/CameraControls.cjs.map +1 -1
- package/controls/experimental/CameraControls.js.map +1 -1
- package/lines/LineGeometry.cjs +23 -10
- package/lines/LineGeometry.cjs.map +1 -1
- package/lines/LineGeometry.js +23 -10
- package/lines/LineGeometry.js.map +1 -1
- package/lines/LineMaterial.cjs +29 -11
- package/lines/LineMaterial.cjs.map +1 -1
- package/lines/LineMaterial.js +29 -11
- package/lines/LineMaterial.js.map +1 -1
- package/lines/LineSegmentsGeometry.cjs +4 -4
- package/lines/LineSegmentsGeometry.cjs.map +1 -1
- package/lines/LineSegmentsGeometry.d.ts +1 -1
- package/lines/LineSegmentsGeometry.js +4 -4
- package/lines/LineSegmentsGeometry.js.map +1 -1
- package/loaders/FontLoader.cjs.map +1 -1
- package/loaders/FontLoader.js.map +1 -1
- package/loaders/HDRCubeTextureLoader.cjs +3 -1
- package/loaders/HDRCubeTextureLoader.cjs.map +1 -1
- package/loaders/HDRCubeTextureLoader.d.ts +1 -1
- package/loaders/HDRCubeTextureLoader.js +3 -1
- package/loaders/HDRCubeTextureLoader.js.map +1 -1
- package/modifiers/CurveModifier.cjs.map +1 -1
- package/modifiers/CurveModifier.js.map +1 -1
- package/modifiers/TessellateModifier.cjs.map +1 -1
- package/modifiers/TessellateModifier.js.map +1 -1
- package/package.json +1 -1
- package/postprocessing/BloomPass.cjs.map +1 -1
- package/postprocessing/BloomPass.d.ts +16 -3
- package/postprocessing/BloomPass.js.map +1 -1
- package/postprocessing/DotScreenPass.cjs.map +1 -1
- package/postprocessing/DotScreenPass.d.ts +3 -2
- package/postprocessing/DotScreenPass.js.map +1 -1
- package/postprocessing/FilmPass.cjs.map +1 -1
- package/postprocessing/FilmPass.d.ts +3 -2
- package/postprocessing/FilmPass.js.map +1 -1
- package/postprocessing/GlitchPass.cjs.map +1 -1
- package/postprocessing/GlitchPass.d.ts +3 -2
- package/postprocessing/GlitchPass.js.map +1 -1
- package/postprocessing/WaterPass.cjs +2 -2
- package/postprocessing/WaterPass.cjs.map +1 -1
- package/postprocessing/WaterPass.d.ts +7 -2
- package/postprocessing/WaterPass.js +3 -3
- package/postprocessing/WaterPass.js.map +1 -1
- package/webxr/OculusHandModel.cjs.map +1 -1
- package/webxr/OculusHandModel.js.map +1 -1
package/lines/LineMaterial.cjs
CHANGED
@@ -25,7 +25,6 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
25
25
|
/* glsl */
|
26
26
|
`
|
27
27
|
#include <common>
|
28
|
-
#include <color_pars_vertex>
|
29
28
|
#include <fog_pars_vertex>
|
30
29
|
#include <logdepthbuf_pars_vertex>
|
31
30
|
#include <clipping_planes_pars_vertex>
|
@@ -36,8 +35,15 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
36
35
|
attribute vec3 instanceStart;
|
37
36
|
attribute vec3 instanceEnd;
|
38
37
|
|
39
|
-
|
40
|
-
|
38
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
39
|
+
varying vec4 vLineColor;
|
40
|
+
attribute vec4 instanceColorStart;
|
41
|
+
attribute vec4 instanceColorEnd;
|
42
|
+
#else
|
43
|
+
varying vec3 vLineColor;
|
44
|
+
attribute vec3 instanceColorStart;
|
45
|
+
attribute vec3 instanceColorEnd;
|
46
|
+
#endif
|
41
47
|
|
42
48
|
#ifdef WORLD_UNITS
|
43
49
|
|
@@ -83,11 +89,7 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
83
89
|
|
84
90
|
void main() {
|
85
91
|
|
86
|
-
|
87
|
-
|
88
|
-
vColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
89
|
-
|
90
|
-
#endif
|
92
|
+
vLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
91
93
|
|
92
94
|
#ifdef USE_DASH
|
93
95
|
|
@@ -289,11 +291,16 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
289
291
|
#endif
|
290
292
|
|
291
293
|
#include <common>
|
292
|
-
#include <color_pars_fragment>
|
293
294
|
#include <fog_pars_fragment>
|
294
295
|
#include <logdepthbuf_pars_fragment>
|
295
296
|
#include <clipping_planes_pars_fragment>
|
296
297
|
|
298
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
299
|
+
varying vec4 vLineColor;
|
300
|
+
#else
|
301
|
+
varying vec3 vLineColor;
|
302
|
+
#endif
|
303
|
+
|
297
304
|
vec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {
|
298
305
|
|
299
306
|
float mua;
|
@@ -402,11 +409,15 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
402
409
|
#endif
|
403
410
|
|
404
411
|
vec4 diffuseColor = vec4( diffuse, alpha );
|
412
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
413
|
+
diffuseColor *= vLineColor;
|
414
|
+
#else
|
415
|
+
diffuseColor.rgb *= vLineColor;
|
416
|
+
#endif
|
405
417
|
|
406
418
|
#include <logdepthbuf_fragment>
|
407
|
-
#include <color_fragment>
|
408
419
|
|
409
|
-
gl_FragColor =
|
420
|
+
gl_FragColor = diffuseColor;
|
410
421
|
|
411
422
|
#include <tonemapping_fragment>
|
412
423
|
#include <${parseInt(THREE.REVISION.replace(/\D+/g, "")) >= 154 ? "colorspace_fragment" : "encodings_fragment"}>
|
@@ -420,6 +431,13 @@ class LineMaterial extends THREE.ShaderMaterial {
|
|
420
431
|
// required for clipping support
|
421
432
|
});
|
422
433
|
this.isLineMaterial = true;
|
434
|
+
this.onBeforeCompile = function() {
|
435
|
+
if (this.transparent) {
|
436
|
+
this.defines.USE_LINE_COLOR_ALPHA = "1";
|
437
|
+
} else {
|
438
|
+
delete this.defines.USE_LINE_COLOR_ALPHA;
|
439
|
+
}
|
440
|
+
};
|
423
441
|
Object.defineProperties(this, {
|
424
442
|
color: {
|
425
443
|
enumerable: true,
|
@@ -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 <color_pars_vertex>\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\tattribute vec3 instanceColorStart;\n\t\t\t\tattribute vec3 instanceColorEnd;\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\tvColor.xyz = ( 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 <color_pars_fragment>\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\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\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\t\t\t\t\t#include <color_fragment>\n\n\t\t\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\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 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,MAqOzB;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;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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 * 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_LINE_COLOR_ALPHA\n\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\tattribute vec3 instanceColorEnd;\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\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\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_LINE_COLOR_ALPHA\n\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vLineColor;\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_LINE_COLOR_ALPHA\n\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\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,MAuOzB;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;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"}
|
package/lines/LineMaterial.js
CHANGED
@@ -23,7 +23,6 @@ class LineMaterial extends ShaderMaterial {
|
|
23
23
|
/* glsl */
|
24
24
|
`
|
25
25
|
#include <common>
|
26
|
-
#include <color_pars_vertex>
|
27
26
|
#include <fog_pars_vertex>
|
28
27
|
#include <logdepthbuf_pars_vertex>
|
29
28
|
#include <clipping_planes_pars_vertex>
|
@@ -34,8 +33,15 @@ class LineMaterial extends ShaderMaterial {
|
|
34
33
|
attribute vec3 instanceStart;
|
35
34
|
attribute vec3 instanceEnd;
|
36
35
|
|
37
|
-
|
38
|
-
|
36
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
37
|
+
varying vec4 vLineColor;
|
38
|
+
attribute vec4 instanceColorStart;
|
39
|
+
attribute vec4 instanceColorEnd;
|
40
|
+
#else
|
41
|
+
varying vec3 vLineColor;
|
42
|
+
attribute vec3 instanceColorStart;
|
43
|
+
attribute vec3 instanceColorEnd;
|
44
|
+
#endif
|
39
45
|
|
40
46
|
#ifdef WORLD_UNITS
|
41
47
|
|
@@ -81,11 +87,7 @@ class LineMaterial extends ShaderMaterial {
|
|
81
87
|
|
82
88
|
void main() {
|
83
89
|
|
84
|
-
|
85
|
-
|
86
|
-
vColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
87
|
-
|
88
|
-
#endif
|
90
|
+
vLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
89
91
|
|
90
92
|
#ifdef USE_DASH
|
91
93
|
|
@@ -287,11 +289,16 @@ class LineMaterial extends ShaderMaterial {
|
|
287
289
|
#endif
|
288
290
|
|
289
291
|
#include <common>
|
290
|
-
#include <color_pars_fragment>
|
291
292
|
#include <fog_pars_fragment>
|
292
293
|
#include <logdepthbuf_pars_fragment>
|
293
294
|
#include <clipping_planes_pars_fragment>
|
294
295
|
|
296
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
297
|
+
varying vec4 vLineColor;
|
298
|
+
#else
|
299
|
+
varying vec3 vLineColor;
|
300
|
+
#endif
|
301
|
+
|
295
302
|
vec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {
|
296
303
|
|
297
304
|
float mua;
|
@@ -400,11 +407,15 @@ class LineMaterial extends ShaderMaterial {
|
|
400
407
|
#endif
|
401
408
|
|
402
409
|
vec4 diffuseColor = vec4( diffuse, alpha );
|
410
|
+
#ifdef USE_LINE_COLOR_ALPHA
|
411
|
+
diffuseColor *= vLineColor;
|
412
|
+
#else
|
413
|
+
diffuseColor.rgb *= vLineColor;
|
414
|
+
#endif
|
403
415
|
|
404
416
|
#include <logdepthbuf_fragment>
|
405
|
-
#include <color_fragment>
|
406
417
|
|
407
|
-
gl_FragColor =
|
418
|
+
gl_FragColor = diffuseColor;
|
408
419
|
|
409
420
|
#include <tonemapping_fragment>
|
410
421
|
#include <${parseInt(REVISION.replace(/\D+/g, "")) >= 154 ? "colorspace_fragment" : "encodings_fragment"}>
|
@@ -418,6 +429,13 @@ class LineMaterial extends ShaderMaterial {
|
|
418
429
|
// required for clipping support
|
419
430
|
});
|
420
431
|
this.isLineMaterial = true;
|
432
|
+
this.onBeforeCompile = function() {
|
433
|
+
if (this.transparent) {
|
434
|
+
this.defines.USE_LINE_COLOR_ALPHA = "1";
|
435
|
+
} else {
|
436
|
+
delete this.defines.USE_LINE_COLOR_ALPHA;
|
437
|
+
}
|
438
|
+
};
|
421
439
|
Object.defineProperties(this, {
|
422
440
|
color: {
|
423
441
|
enumerable: true,
|
@@ -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 <color_pars_vertex>\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\tattribute vec3 instanceColorStart;\n\t\t\t\tattribute vec3 instanceColorEnd;\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\tvColor.xyz = ( 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 <color_pars_fragment>\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\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\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\t\t\t\t\t#include <color_fragment>\n\n\t\t\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\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 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,MAqOzB;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,iBA0JhB,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,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 * 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_LINE_COLOR_ALPHA\n\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t\tattribute vec4 instanceColorStart;\n\t\t\t\t\tattribute vec4 instanceColorEnd;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vLineColor;\n\t\t\t\t\tattribute vec3 instanceColorStart;\n\t\t\t\t\tattribute vec3 instanceColorEnd;\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\tvLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\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_LINE_COLOR_ALPHA\n\t\t\t\t\tvarying vec4 vLineColor;\n\t\t\t\t#else\n\t\t\t\t\tvarying vec3 vLineColor;\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_LINE_COLOR_ALPHA\n\t\t\t\t\t\tdiffuseColor *= vLineColor;\n\t\t\t\t\t#else\n\t\t\t\t\t\tdiffuseColor.rgb *= vLineColor;\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,MAuOzB;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;AA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"}
|
@@ -45,16 +45,16 @@ class LineSegmentsGeometry extends THREE.InstancedBufferGeometry {
|
|
45
45
|
this.computeBoundingSphere();
|
46
46
|
return this;
|
47
47
|
}
|
48
|
-
setColors(array) {
|
48
|
+
setColors(array, itemSize = 3) {
|
49
49
|
let colors;
|
50
50
|
if (array instanceof Float32Array) {
|
51
51
|
colors = array;
|
52
52
|
} else if (Array.isArray(array)) {
|
53
53
|
colors = new Float32Array(array);
|
54
54
|
}
|
55
|
-
const instanceColorBuffer = new THREE.InstancedInterleavedBuffer(colors,
|
56
|
-
this.setAttribute("instanceColorStart", new THREE.InterleavedBufferAttribute(instanceColorBuffer,
|
57
|
-
this.setAttribute("instanceColorEnd", new THREE.InterleavedBufferAttribute(instanceColorBuffer,
|
55
|
+
const instanceColorBuffer = new THREE.InstancedInterleavedBuffer(colors, itemSize * 2, 1);
|
56
|
+
this.setAttribute("instanceColorStart", new THREE.InterleavedBufferAttribute(instanceColorBuffer, itemSize, 0));
|
57
|
+
this.setAttribute("instanceColorEnd", new THREE.InterleavedBufferAttribute(instanceColorBuffer, itemSize, 3));
|
58
58
|
return this;
|
59
59
|
}
|
60
60
|
fromWireframeGeometry(geometry) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineSegmentsGeometry.cjs","sources":["../../src/lines/LineSegmentsGeometry.js"],"sourcesContent":["import {\n Box3,\n Float32BufferAttribute,\n InstancedBufferGeometry,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Sphere,\n Vector3,\n WireframeGeometry,\n} from 'three'\n\nconst _box = new Box3()\nconst _vector = new Vector3()\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n constructor() {\n super()\n\n this.isLineSegmentsGeometry = true\n\n this.type = 'LineSegmentsGeometry'\n\n const positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0]\n const uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2]\n const index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]\n\n this.setIndex(index)\n this.setAttribute('position', new Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new Float32BufferAttribute(uvs, 2))\n }\n\n applyMatrix4(matrix) {\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined) {\n start.applyMatrix4(matrix)\n\n end.applyMatrix4(matrix)\n\n start.needsUpdate = true\n }\n\n if (this.boundingBox !== null) {\n this.computeBoundingBox()\n }\n\n if (this.boundingSphere !== null) {\n this.computeBoundingSphere()\n }\n\n return this\n }\n\n setPositions(array) {\n let lineSegments\n\n if (array instanceof Float32Array) {\n lineSegments = array\n } else if (Array.isArray(array)) {\n lineSegments = new Float32Array(array)\n }\n\n const instanceBuffer = new InstancedInterleavedBuffer(lineSegments, 6, 1) // xyz, xyz\n\n this.setAttribute('instanceStart', new InterleavedBufferAttribute(instanceBuffer, 3, 0)) // xyz\n this.setAttribute('instanceEnd', new InterleavedBufferAttribute(instanceBuffer, 3, 3)) // xyz\n\n //\n\n this.computeBoundingBox()\n this.computeBoundingSphere()\n\n return this\n }\n\n setColors(array) {\n let colors\n\n if (array instanceof Float32Array) {\n colors = array\n } else if (Array.isArray(array)) {\n colors = new Float32Array(array)\n }\n\n const instanceColorBuffer = new InstancedInterleavedBuffer(colors,
|
1
|
+
{"version":3,"file":"LineSegmentsGeometry.cjs","sources":["../../src/lines/LineSegmentsGeometry.js"],"sourcesContent":["import {\n Box3,\n Float32BufferAttribute,\n InstancedBufferGeometry,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Sphere,\n Vector3,\n WireframeGeometry,\n} from 'three'\n\nconst _box = new Box3()\nconst _vector = new Vector3()\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n constructor() {\n super()\n\n this.isLineSegmentsGeometry = true\n\n this.type = 'LineSegmentsGeometry'\n\n const positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0]\n const uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2]\n const index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]\n\n this.setIndex(index)\n this.setAttribute('position', new Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new Float32BufferAttribute(uvs, 2))\n }\n\n applyMatrix4(matrix) {\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined) {\n start.applyMatrix4(matrix)\n\n end.applyMatrix4(matrix)\n\n start.needsUpdate = true\n }\n\n if (this.boundingBox !== null) {\n this.computeBoundingBox()\n }\n\n if (this.boundingSphere !== null) {\n this.computeBoundingSphere()\n }\n\n return this\n }\n\n setPositions(array) {\n let lineSegments\n\n if (array instanceof Float32Array) {\n lineSegments = array\n } else if (Array.isArray(array)) {\n lineSegments = new Float32Array(array)\n }\n\n const instanceBuffer = new InstancedInterleavedBuffer(lineSegments, 6, 1) // xyz, xyz\n\n this.setAttribute('instanceStart', new InterleavedBufferAttribute(instanceBuffer, 3, 0)) // xyz\n this.setAttribute('instanceEnd', new InterleavedBufferAttribute(instanceBuffer, 3, 3)) // xyz\n\n //\n\n this.computeBoundingBox()\n this.computeBoundingSphere()\n\n return this\n }\n\n setColors(array, itemSize = 3) {\n let colors\n\n if (array instanceof Float32Array) {\n colors = array\n } else if (Array.isArray(array)) {\n colors = new Float32Array(array)\n }\n\n const instanceColorBuffer = new InstancedInterleavedBuffer(colors, itemSize * 2, 1) // rgb(a), rgb(a)\n\n this.setAttribute('instanceColorStart', new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 0)) // rgb(a)\n this.setAttribute('instanceColorEnd', new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 3)) // rgb(a)\n\n return this\n }\n\n fromWireframeGeometry(geometry) {\n this.setPositions(geometry.attributes.position.array)\n\n return this\n }\n\n fromEdgesGeometry(geometry) {\n this.setPositions(geometry.attributes.position.array)\n\n return this\n }\n\n fromMesh(mesh) {\n this.fromWireframeGeometry(new WireframeGeometry(mesh.geometry))\n\n // set colors, maybe\n\n return this\n }\n\n fromLineSegments(lineSegments) {\n const geometry = lineSegments.geometry\n\n this.setPositions(geometry.attributes.position.array) // assumes non-indexed\n\n // set colors, maybe\n\n return this\n }\n\n computeBoundingBox() {\n if (this.boundingBox === null) {\n this.boundingBox = new Box3()\n }\n\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined && end !== undefined) {\n this.boundingBox.setFromBufferAttribute(start)\n\n _box.setFromBufferAttribute(end)\n\n this.boundingBox.union(_box)\n }\n }\n\n computeBoundingSphere() {\n if (this.boundingSphere === null) {\n this.boundingSphere = new Sphere()\n }\n\n if (this.boundingBox === null) {\n this.computeBoundingBox()\n }\n\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined && end !== undefined) {\n const center = this.boundingSphere.center\n\n this.boundingBox.getCenter(center)\n\n let maxRadiusSq = 0\n\n for (let i = 0, il = start.count; i < il; i++) {\n _vector.fromBufferAttribute(start, i)\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector))\n\n _vector.fromBufferAttribute(end, i)\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector))\n }\n\n this.boundingSphere.radius = Math.sqrt(maxRadiusSq)\n\n if (isNaN(this.boundingSphere.radius)) {\n console.error(\n 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.',\n this,\n )\n }\n }\n }\n\n toJSON() {\n // todo\n }\n\n applyMatrix(matrix) {\n console.warn('THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().')\n\n return this.applyMatrix4(matrix)\n }\n}\n\nexport { LineSegmentsGeometry }\n"],"names":["Box3","Vector3","InstancedBufferGeometry","Float32BufferAttribute","InstancedInterleavedBuffer","InterleavedBufferAttribute","WireframeGeometry","Sphere"],"mappings":"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"}
|
@@ -11,6 +11,6 @@ export class LineSegmentsGeometry extends InstancedBufferGeometry {
|
|
11
11
|
fromLineSegments(lineSegments: LineSegments): this
|
12
12
|
fromMesh(mesh: Mesh): this
|
13
13
|
fromWireframeGeometry(geometry: WireframeGeometry): this
|
14
|
-
setColors(array: number[] | Float32Array): this
|
14
|
+
setColors(array: number[] | Float32Array, itemSize?: 3 | 4): this
|
15
15
|
setPositions(array: number[] | Float32Array): this
|
16
16
|
}
|
@@ -43,16 +43,16 @@ class LineSegmentsGeometry extends InstancedBufferGeometry {
|
|
43
43
|
this.computeBoundingSphere();
|
44
44
|
return this;
|
45
45
|
}
|
46
|
-
setColors(array) {
|
46
|
+
setColors(array, itemSize = 3) {
|
47
47
|
let colors;
|
48
48
|
if (array instanceof Float32Array) {
|
49
49
|
colors = array;
|
50
50
|
} else if (Array.isArray(array)) {
|
51
51
|
colors = new Float32Array(array);
|
52
52
|
}
|
53
|
-
const instanceColorBuffer = new InstancedInterleavedBuffer(colors,
|
54
|
-
this.setAttribute("instanceColorStart", new InterleavedBufferAttribute(instanceColorBuffer,
|
55
|
-
this.setAttribute("instanceColorEnd", new InterleavedBufferAttribute(instanceColorBuffer,
|
53
|
+
const instanceColorBuffer = new InstancedInterleavedBuffer(colors, itemSize * 2, 1);
|
54
|
+
this.setAttribute("instanceColorStart", new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 0));
|
55
|
+
this.setAttribute("instanceColorEnd", new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 3));
|
56
56
|
return this;
|
57
57
|
}
|
58
58
|
fromWireframeGeometry(geometry) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LineSegmentsGeometry.js","sources":["../../src/lines/LineSegmentsGeometry.js"],"sourcesContent":["import {\n Box3,\n Float32BufferAttribute,\n InstancedBufferGeometry,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Sphere,\n Vector3,\n WireframeGeometry,\n} from 'three'\n\nconst _box = new Box3()\nconst _vector = new Vector3()\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n constructor() {\n super()\n\n this.isLineSegmentsGeometry = true\n\n this.type = 'LineSegmentsGeometry'\n\n const positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0]\n const uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2]\n const index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]\n\n this.setIndex(index)\n this.setAttribute('position', new Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new Float32BufferAttribute(uvs, 2))\n }\n\n applyMatrix4(matrix) {\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined) {\n start.applyMatrix4(matrix)\n\n end.applyMatrix4(matrix)\n\n start.needsUpdate = true\n }\n\n if (this.boundingBox !== null) {\n this.computeBoundingBox()\n }\n\n if (this.boundingSphere !== null) {\n this.computeBoundingSphere()\n }\n\n return this\n }\n\n setPositions(array) {\n let lineSegments\n\n if (array instanceof Float32Array) {\n lineSegments = array\n } else if (Array.isArray(array)) {\n lineSegments = new Float32Array(array)\n }\n\n const instanceBuffer = new InstancedInterleavedBuffer(lineSegments, 6, 1) // xyz, xyz\n\n this.setAttribute('instanceStart', new InterleavedBufferAttribute(instanceBuffer, 3, 0)) // xyz\n this.setAttribute('instanceEnd', new InterleavedBufferAttribute(instanceBuffer, 3, 3)) // xyz\n\n //\n\n this.computeBoundingBox()\n this.computeBoundingSphere()\n\n return this\n }\n\n setColors(array) {\n let colors\n\n if (array instanceof Float32Array) {\n colors = array\n } else if (Array.isArray(array)) {\n colors = new Float32Array(array)\n }\n\n const instanceColorBuffer = new InstancedInterleavedBuffer(colors,
|
1
|
+
{"version":3,"file":"LineSegmentsGeometry.js","sources":["../../src/lines/LineSegmentsGeometry.js"],"sourcesContent":["import {\n Box3,\n Float32BufferAttribute,\n InstancedBufferGeometry,\n InstancedInterleavedBuffer,\n InterleavedBufferAttribute,\n Sphere,\n Vector3,\n WireframeGeometry,\n} from 'three'\n\nconst _box = new Box3()\nconst _vector = new Vector3()\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n constructor() {\n super()\n\n this.isLineSegmentsGeometry = true\n\n this.type = 'LineSegmentsGeometry'\n\n const positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0]\n const uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2]\n const index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]\n\n this.setIndex(index)\n this.setAttribute('position', new Float32BufferAttribute(positions, 3))\n this.setAttribute('uv', new Float32BufferAttribute(uvs, 2))\n }\n\n applyMatrix4(matrix) {\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined) {\n start.applyMatrix4(matrix)\n\n end.applyMatrix4(matrix)\n\n start.needsUpdate = true\n }\n\n if (this.boundingBox !== null) {\n this.computeBoundingBox()\n }\n\n if (this.boundingSphere !== null) {\n this.computeBoundingSphere()\n }\n\n return this\n }\n\n setPositions(array) {\n let lineSegments\n\n if (array instanceof Float32Array) {\n lineSegments = array\n } else if (Array.isArray(array)) {\n lineSegments = new Float32Array(array)\n }\n\n const instanceBuffer = new InstancedInterleavedBuffer(lineSegments, 6, 1) // xyz, xyz\n\n this.setAttribute('instanceStart', new InterleavedBufferAttribute(instanceBuffer, 3, 0)) // xyz\n this.setAttribute('instanceEnd', new InterleavedBufferAttribute(instanceBuffer, 3, 3)) // xyz\n\n //\n\n this.computeBoundingBox()\n this.computeBoundingSphere()\n\n return this\n }\n\n setColors(array, itemSize = 3) {\n let colors\n\n if (array instanceof Float32Array) {\n colors = array\n } else if (Array.isArray(array)) {\n colors = new Float32Array(array)\n }\n\n const instanceColorBuffer = new InstancedInterleavedBuffer(colors, itemSize * 2, 1) // rgb(a), rgb(a)\n\n this.setAttribute('instanceColorStart', new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 0)) // rgb(a)\n this.setAttribute('instanceColorEnd', new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 3)) // rgb(a)\n\n return this\n }\n\n fromWireframeGeometry(geometry) {\n this.setPositions(geometry.attributes.position.array)\n\n return this\n }\n\n fromEdgesGeometry(geometry) {\n this.setPositions(geometry.attributes.position.array)\n\n return this\n }\n\n fromMesh(mesh) {\n this.fromWireframeGeometry(new WireframeGeometry(mesh.geometry))\n\n // set colors, maybe\n\n return this\n }\n\n fromLineSegments(lineSegments) {\n const geometry = lineSegments.geometry\n\n this.setPositions(geometry.attributes.position.array) // assumes non-indexed\n\n // set colors, maybe\n\n return this\n }\n\n computeBoundingBox() {\n if (this.boundingBox === null) {\n this.boundingBox = new Box3()\n }\n\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined && end !== undefined) {\n this.boundingBox.setFromBufferAttribute(start)\n\n _box.setFromBufferAttribute(end)\n\n this.boundingBox.union(_box)\n }\n }\n\n computeBoundingSphere() {\n if (this.boundingSphere === null) {\n this.boundingSphere = new Sphere()\n }\n\n if (this.boundingBox === null) {\n this.computeBoundingBox()\n }\n\n const start = this.attributes.instanceStart\n const end = this.attributes.instanceEnd\n\n if (start !== undefined && end !== undefined) {\n const center = this.boundingSphere.center\n\n this.boundingBox.getCenter(center)\n\n let maxRadiusSq = 0\n\n for (let i = 0, il = start.count; i < il; i++) {\n _vector.fromBufferAttribute(start, i)\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector))\n\n _vector.fromBufferAttribute(end, i)\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector))\n }\n\n this.boundingSphere.radius = Math.sqrt(maxRadiusSq)\n\n if (isNaN(this.boundingSphere.radius)) {\n console.error(\n 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.',\n this,\n )\n }\n }\n }\n\n toJSON() {\n // todo\n }\n\n applyMatrix(matrix) {\n console.warn('THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().')\n\n return this.applyMatrix4(matrix)\n }\n}\n\nexport { LineSegmentsGeometry }\n"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FontLoader.cjs","sources":["../../src/loaders/FontLoader.ts"],"sourcesContent":["import { Loader, FileLoader, ShapePath } from 'three'\n\nimport type { LoadingManager, Shape } from 'three'\n\ntype Options = {\n lineHeight: number\n letterSpacing: number\n}\n\nexport class FontLoader extends Loader {\n constructor(manager?: LoadingManager) {\n super(manager)\n }\n\n public load(\n url: string,\n onLoad?: (responseFont: Font) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void,\n ): void {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n (response) => {\n if (typeof response !== 'string') throw new Error('unsupported data type')\n\n const json = JSON.parse(response)\n\n const font = this.parse(json)\n\n if (onLoad) onLoad(font)\n },\n onProgress,\n onError,\n )\n }\n\n loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Font> {\n // @ts-ignore\n return super.loadAsync(url, onProgress)\n }\n\n public parse(json: FontData): Font {\n return new Font(json)\n }\n}\n\ntype Glyph = {\n _cachedOutline: string[]\n ha: number\n o: string\n}\n\ntype FontData = {\n boundingBox: { yMax: number; yMin: number }\n familyName: string\n glyphs: { [k: string]: Glyph }\n resolution: number\n underlineThickness: number\n}\n\nexport class Font {\n public data: FontData\n public static isFont: true\n public static type: 'Font'\n\n constructor(data: FontData) {\n this.data = data\n }\n\n public generateShapes(text: string, size = 100, _options?: Partial<Options>): Shape[] {\n const shapes: Shape[] = []\n const options = { letterSpacing: 0, lineHeight: 1, ..._options }\n const paths = createPaths(text, size, this.data, options)\n for (let p = 0, pl = paths.length; p < pl; p++) {\n Array.prototype.push.apply(shapes, paths[p].toShapes(false))\n }\n return shapes\n }\n}\n\nfunction createPaths(text: string, size: number, data: FontData, options: Options): ShapePath[] {\n const chars = Array.from(text)\n const scale = size / data.resolution\n const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale\n\n const paths: ShapePath[] = []\n\n let offsetX = 0,\n offsetY = 0\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n\n if (char === '\\n') {\n offsetX = 0\n offsetY -= line_height * options.lineHeight\n } else {\n const ret = createPath(char, scale, offsetX, offsetY, data)\n if (ret) {\n offsetX += ret.offsetX + options.letterSpacing\n paths.push(ret.path)\n }\n }\n }\n\n return paths\n}\n\nfunction createPath(\n char: string,\n scale: number,\n offsetX: number,\n offsetY: number,\n data: FontData,\n): { offsetX: number; path: ShapePath } | undefined {\n const glyph = data.glyphs[char] || data.glyphs['?']\n\n if (!glyph) {\n console.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.')\n return\n }\n\n const path = new ShapePath()\n\n let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2\n\n if (glyph.o) {\n const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '))\n\n for (let i = 0, l = outline.length; i < l; ) {\n const action = outline[i++]\n\n switch (action) {\n case 'm': // moveTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.moveTo(x, y)\n\n break\n\n case 'l': // lineTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.lineTo(x, y)\n\n break\n\n case 'q': // quadraticCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n\n path.quadraticCurveTo(cpx1, cpy1, cpx, cpy)\n\n break\n\n case 'b': // bezierCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n cpx2 = parseInt(outline[i++]) * scale + offsetX\n cpy2 = parseInt(outline[i++]) * scale + offsetY\n\n path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy)\n\n break\n }\n }\n }\n\n return { offsetX: glyph.ha * scale, path }\n}\n"],"names":["Loader","FileLoader","ShapePath"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FontLoader.cjs","sources":["../../src/loaders/FontLoader.ts"],"sourcesContent":["import { Loader, FileLoader, ShapePath } from 'three'\n\nimport type { LoadingManager, Shape } from 'three'\n\ntype Options = {\n lineHeight: number\n letterSpacing: number\n}\n\nexport class FontLoader extends Loader {\n constructor(manager?: LoadingManager) {\n super(manager)\n }\n\n public load(\n url: string,\n onLoad?: (responseFont: Font) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void,\n ): void {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n (response) => {\n if (typeof response !== 'string') throw new Error('unsupported data type')\n\n const json = JSON.parse(response)\n\n const font = this.parse(json)\n\n if (onLoad) onLoad(font)\n },\n onProgress,\n onError as (event: unknown) => void,\n )\n }\n\n loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Font> {\n // @ts-ignore\n return super.loadAsync(url, onProgress)\n }\n\n public parse(json: FontData): Font {\n return new Font(json)\n }\n}\n\ntype Glyph = {\n _cachedOutline: string[]\n ha: number\n o: string\n}\n\ntype FontData = {\n boundingBox: { yMax: number; yMin: number }\n familyName: string\n glyphs: { [k: string]: Glyph }\n resolution: number\n underlineThickness: number\n}\n\nexport class Font {\n public data: FontData\n public static isFont: true\n public static type: 'Font'\n\n constructor(data: FontData) {\n this.data = data\n }\n\n public generateShapes(text: string, size = 100, _options?: Partial<Options>): Shape[] {\n const shapes: Shape[] = []\n const options = { letterSpacing: 0, lineHeight: 1, ..._options }\n const paths = createPaths(text, size, this.data, options)\n for (let p = 0, pl = paths.length; p < pl; p++) {\n Array.prototype.push.apply(shapes, paths[p].toShapes(false))\n }\n return shapes\n }\n}\n\nfunction createPaths(text: string, size: number, data: FontData, options: Options): ShapePath[] {\n const chars = Array.from(text)\n const scale = size / data.resolution\n const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale\n\n const paths: ShapePath[] = []\n\n let offsetX = 0,\n offsetY = 0\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n\n if (char === '\\n') {\n offsetX = 0\n offsetY -= line_height * options.lineHeight\n } else {\n const ret = createPath(char, scale, offsetX, offsetY, data)\n if (ret) {\n offsetX += ret.offsetX + options.letterSpacing\n paths.push(ret.path)\n }\n }\n }\n\n return paths\n}\n\nfunction createPath(\n char: string,\n scale: number,\n offsetX: number,\n offsetY: number,\n data: FontData,\n): { offsetX: number; path: ShapePath } | undefined {\n const glyph = data.glyphs[char] || data.glyphs['?']\n\n if (!glyph) {\n console.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.')\n return\n }\n\n const path = new ShapePath()\n\n let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2\n\n if (glyph.o) {\n const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '))\n\n for (let i = 0, l = outline.length; i < l; ) {\n const action = outline[i++]\n\n switch (action) {\n case 'm': // moveTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.moveTo(x, y)\n\n break\n\n case 'l': // lineTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.lineTo(x, y)\n\n break\n\n case 'q': // quadraticCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n\n path.quadraticCurveTo(cpx1, cpy1, cpx, cpy)\n\n break\n\n case 'b': // bezierCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n cpx2 = parseInt(outline[i++]) * scale + offsetX\n cpy2 = parseInt(outline[i++]) * scale + offsetY\n\n path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy)\n\n break\n }\n }\n }\n\n return { offsetX: glyph.ha * scale, path }\n}\n"],"names":["Loader","FileLoader","ShapePath"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FontLoader.js","sources":["../../src/loaders/FontLoader.ts"],"sourcesContent":["import { Loader, FileLoader, ShapePath } from 'three'\n\nimport type { LoadingManager, Shape } from 'three'\n\ntype Options = {\n lineHeight: number\n letterSpacing: number\n}\n\nexport class FontLoader extends Loader {\n constructor(manager?: LoadingManager) {\n super(manager)\n }\n\n public load(\n url: string,\n onLoad?: (responseFont: Font) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void,\n ): void {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n (response) => {\n if (typeof response !== 'string') throw new Error('unsupported data type')\n\n const json = JSON.parse(response)\n\n const font = this.parse(json)\n\n if (onLoad) onLoad(font)\n },\n onProgress,\n onError,\n )\n }\n\n loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Font> {\n // @ts-ignore\n return super.loadAsync(url, onProgress)\n }\n\n public parse(json: FontData): Font {\n return new Font(json)\n }\n}\n\ntype Glyph = {\n _cachedOutline: string[]\n ha: number\n o: string\n}\n\ntype FontData = {\n boundingBox: { yMax: number; yMin: number }\n familyName: string\n glyphs: { [k: string]: Glyph }\n resolution: number\n underlineThickness: number\n}\n\nexport class Font {\n public data: FontData\n public static isFont: true\n public static type: 'Font'\n\n constructor(data: FontData) {\n this.data = data\n }\n\n public generateShapes(text: string, size = 100, _options?: Partial<Options>): Shape[] {\n const shapes: Shape[] = []\n const options = { letterSpacing: 0, lineHeight: 1, ..._options }\n const paths = createPaths(text, size, this.data, options)\n for (let p = 0, pl = paths.length; p < pl; p++) {\n Array.prototype.push.apply(shapes, paths[p].toShapes(false))\n }\n return shapes\n }\n}\n\nfunction createPaths(text: string, size: number, data: FontData, options: Options): ShapePath[] {\n const chars = Array.from(text)\n const scale = size / data.resolution\n const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale\n\n const paths: ShapePath[] = []\n\n let offsetX = 0,\n offsetY = 0\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n\n if (char === '\\n') {\n offsetX = 0\n offsetY -= line_height * options.lineHeight\n } else {\n const ret = createPath(char, scale, offsetX, offsetY, data)\n if (ret) {\n offsetX += ret.offsetX + options.letterSpacing\n paths.push(ret.path)\n }\n }\n }\n\n return paths\n}\n\nfunction createPath(\n char: string,\n scale: number,\n offsetX: number,\n offsetY: number,\n data: FontData,\n): { offsetX: number; path: ShapePath } | undefined {\n const glyph = data.glyphs[char] || data.glyphs['?']\n\n if (!glyph) {\n console.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.')\n return\n }\n\n const path = new ShapePath()\n\n let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2\n\n if (glyph.o) {\n const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '))\n\n for (let i = 0, l = outline.length; i < l; ) {\n const action = outline[i++]\n\n switch (action) {\n case 'm': // moveTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.moveTo(x, y)\n\n break\n\n case 'l': // lineTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.lineTo(x, y)\n\n break\n\n case 'q': // quadraticCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n\n path.quadraticCurveTo(cpx1, cpy1, cpx, cpy)\n\n break\n\n case 'b': // bezierCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n cpx2 = parseInt(outline[i++]) * scale + offsetX\n cpy2 = parseInt(outline[i++]) * scale + offsetY\n\n path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy)\n\n break\n }\n }\n }\n\n return { offsetX: glyph.ha * scale, path }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"FontLoader.js","sources":["../../src/loaders/FontLoader.ts"],"sourcesContent":["import { Loader, FileLoader, ShapePath } from 'three'\n\nimport type { LoadingManager, Shape } from 'three'\n\ntype Options = {\n lineHeight: number\n letterSpacing: number\n}\n\nexport class FontLoader extends Loader {\n constructor(manager?: LoadingManager) {\n super(manager)\n }\n\n public load(\n url: string,\n onLoad?: (responseFont: Font) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void,\n ): void {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n (response) => {\n if (typeof response !== 'string') throw new Error('unsupported data type')\n\n const json = JSON.parse(response)\n\n const font = this.parse(json)\n\n if (onLoad) onLoad(font)\n },\n onProgress,\n onError as (event: unknown) => void,\n )\n }\n\n loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Font> {\n // @ts-ignore\n return super.loadAsync(url, onProgress)\n }\n\n public parse(json: FontData): Font {\n return new Font(json)\n }\n}\n\ntype Glyph = {\n _cachedOutline: string[]\n ha: number\n o: string\n}\n\ntype FontData = {\n boundingBox: { yMax: number; yMin: number }\n familyName: string\n glyphs: { [k: string]: Glyph }\n resolution: number\n underlineThickness: number\n}\n\nexport class Font {\n public data: FontData\n public static isFont: true\n public static type: 'Font'\n\n constructor(data: FontData) {\n this.data = data\n }\n\n public generateShapes(text: string, size = 100, _options?: Partial<Options>): Shape[] {\n const shapes: Shape[] = []\n const options = { letterSpacing: 0, lineHeight: 1, ..._options }\n const paths = createPaths(text, size, this.data, options)\n for (let p = 0, pl = paths.length; p < pl; p++) {\n Array.prototype.push.apply(shapes, paths[p].toShapes(false))\n }\n return shapes\n }\n}\n\nfunction createPaths(text: string, size: number, data: FontData, options: Options): ShapePath[] {\n const chars = Array.from(text)\n const scale = size / data.resolution\n const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale\n\n const paths: ShapePath[] = []\n\n let offsetX = 0,\n offsetY = 0\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n\n if (char === '\\n') {\n offsetX = 0\n offsetY -= line_height * options.lineHeight\n } else {\n const ret = createPath(char, scale, offsetX, offsetY, data)\n if (ret) {\n offsetX += ret.offsetX + options.letterSpacing\n paths.push(ret.path)\n }\n }\n }\n\n return paths\n}\n\nfunction createPath(\n char: string,\n scale: number,\n offsetX: number,\n offsetY: number,\n data: FontData,\n): { offsetX: number; path: ShapePath } | undefined {\n const glyph = data.glyphs[char] || data.glyphs['?']\n\n if (!glyph) {\n console.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.')\n return\n }\n\n const path = new ShapePath()\n\n let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2\n\n if (glyph.o) {\n const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '))\n\n for (let i = 0, l = outline.length; i < l; ) {\n const action = outline[i++]\n\n switch (action) {\n case 'm': // moveTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.moveTo(x, y)\n\n break\n\n case 'l': // lineTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.lineTo(x, y)\n\n break\n\n case 'q': // quadraticCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n\n path.quadraticCurveTo(cpx1, cpy1, cpx, cpy)\n\n break\n\n case 'b': // bezierCurveTo\n cpx = parseInt(outline[i++]) * scale + offsetX\n cpy = parseInt(outline[i++]) * scale + offsetY\n cpx1 = parseInt(outline[i++]) * scale + offsetX\n cpy1 = parseInt(outline[i++]) * scale + offsetY\n cpx2 = parseInt(outline[i++]) * scale + offsetX\n cpy2 = parseInt(outline[i++]) * scale + offsetY\n\n path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy)\n\n break\n }\n }\n }\n\n return { offsetX: glyph.ha * scale, path }\n}\n"],"names":[],"mappings":"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"}
|
@@ -9,7 +9,9 @@ class HDRCubeTextureLoader extends THREE.Loader {
|
|
9
9
|
this.type = THREE.HalfFloatType;
|
10
10
|
}
|
11
11
|
load(urls, onLoad, onProgress, onError) {
|
12
|
-
if (
|
12
|
+
if (typeof urls === "string") {
|
13
|
+
urls = [urls];
|
14
|
+
} else if (!Array.isArray(urls)) {
|
13
15
|
console.warn("THREE.HDRCubeTextureLoader signature has changed. Use .setDataType() instead.");
|
14
16
|
this.setDataType(urls);
|
15
17
|
urls = onLoad;
|