UNPKG

three

Version:

JavaScript 3D library

184 lines (146 loc) 4.47 kB
import { Color, ShaderMaterial, UniformsLib, UniformsUtils, } from 'three'; /** * A special line material for meshes loaded via {@link LDrawLoader}. * * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer}, * import the class from `LDrawConditionalLineNodeMaterial.js`. * * @augments ShaderMaterial * @three_import import { LDrawConditionalLineMaterial } from 'three/addons/materials/LDrawConditionalLineMaterial.js'; */ class LDrawConditionalLineMaterial extends ShaderMaterial { static get type() { return 'LDrawConditionalLineMaterial'; } /** * Constructs a new conditional line material. * * @param {Object} [parameters] - An object with one or more properties * defining the material's appearance. Any property of the material * (including any property from inherited materials) can be passed * in here. Color values can be passed any type of value accepted * by {@link Color#set}. */ constructor( parameters ) { super( { uniforms: UniformsUtils.merge( [ UniformsLib.fog, { diffuse: { value: new Color() }, opacity: { value: 1.0 } } ] ), vertexShader: /* glsl */` attribute vec3 control0; attribute vec3 control1; attribute vec3 direction; varying float discardFlag; #include <common> #include <color_pars_vertex> #include <fog_pars_vertex> #include <logdepthbuf_pars_vertex> #include <clipping_planes_pars_vertex> void main() { #include <color_vertex> vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); gl_Position = projectionMatrix * mvPosition; // Transform the line segment ends and control points into camera clip space vec4 c0 = projectionMatrix * modelViewMatrix * vec4( control0, 1.0 ); vec4 c1 = projectionMatrix * modelViewMatrix * vec4( control1, 1.0 ); vec4 p0 = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); vec4 p1 = projectionMatrix * modelViewMatrix * vec4( position + direction, 1.0 ); c0.xy /= c0.w; c1.xy /= c1.w; p0.xy /= p0.w; p1.xy /= p1.w; // Get the direction of the segment and an orthogonal vector vec2 dir = p1.xy - p0.xy; vec2 norm = vec2( -dir.y, dir.x ); // Get control point directions from the line vec2 c0dir = c0.xy - p1.xy; vec2 c1dir = c1.xy - p1.xy; // If the vectors to the controls points are pointed in different directions away // from the line segment then the line should not be drawn. float d0 = dot( normalize( norm ), normalize( c0dir ) ); float d1 = dot( normalize( norm ), normalize( c1dir ) ); discardFlag = float( sign( d0 ) != sign( d1 ) ); #include <logdepthbuf_vertex> #include <clipping_planes_vertex> #include <fog_vertex> } `, fragmentShader: /* glsl */` uniform vec3 diffuse; uniform float opacity; varying float discardFlag; #include <common> #include <color_pars_fragment> #include <fog_pars_fragment> #include <logdepthbuf_pars_fragment> #include <clipping_planes_pars_fragment> void main() { if ( discardFlag > 0.5 ) discard; #include <clipping_planes_fragment> vec3 outgoingLight = vec3( 0.0 ); vec4 diffuseColor = vec4( diffuse, opacity ); #include <logdepthbuf_fragment> #include <color_fragment> outgoingLight = diffuseColor.rgb; // simple shader gl_FragColor = vec4( outgoingLight, diffuseColor.a ); #include <tonemapping_fragment> #include <colorspace_fragment> #include <fog_fragment> #include <premultiplied_alpha_fragment> } `, } ); Object.defineProperties( this, { /** * The material's opacity. * * @name LDrawConditionalLineMaterial#opacity * @type {number} * @default 1 */ opacity: { get: function () { return this.uniforms.opacity.value; }, set: function ( value ) { this.uniforms.opacity.value = value; } }, /** * The material's color. * * @name LDrawConditionalLineMaterial#color * @type {Color} * @default (1,1,1) */ color: { get: function () { return this.uniforms.diffuse.value; } } } ); this.setValues( parameters ); /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isLDrawConditionalLineMaterial = true; } } export { LDrawConditionalLineMaterial };