123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- 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 };
|