UNPKG

@babylonjs/core

Version:

Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.

183 lines (155 loc) 8.68 kB
/** * Returns WGSL custom shader code * @param shaderType vertex or fragment * @param cameraFacing is in camera facing mode? * @returns WGSL custom shader code */ /** @internal */ export function GetCustomCode(shaderType, cameraFacing) { if (shaderType === "vertex") { const obj = { CUSTOM_VERTEX_DEFINITIONS: ` attribute grl_widths: f32; attribute grl_colorPointers: f32; varying grlCounters: f32; varying grlColorPointer: f32; #ifdef GREASED_LINE_USE_OFFSETS attribute grl_offsets: vec3f; #endif #ifdef GREASED_LINE_CAMERA_FACING attribute grl_previousAndSide : vec4f; attribute grl_nextAndCounters : vec4f; fn grlFix(i: vec4f, aspect: f32) -> vec2f { var res = i.xy / i.w; res.x *= aspect; return res; } #else attribute grl_slopes: f32; attribute grl_counters: f32; #endif `, CUSTOM_VERTEX_UPDATE_POSITION: ` #ifdef GREASED_LINE_USE_OFFSETS var grlPositionOffset: vec3f = input.grl_offsets; #else var grlPositionOffset = vec3f(0.); #endif #ifdef GREASED_LINE_CAMERA_FACING positionUpdated += grlPositionOffset; #else positionUpdated = (positionUpdated + grlPositionOffset) + (input.grl_slopes * input.grl_widths); #endif `, CUSTOM_VERTEX_MAIN_END: ` vertexOutputs.grlColorPointer = input.grl_colorPointers; #ifdef GREASED_LINE_CAMERA_FACING let grlAspect: f32 = uniforms.grl_aspect_resolution_lineWidth.x; let grlBaseWidth: f32 = uniforms.grl_aspect_resolution_lineWidth.w; let grlPrevious: vec3f = input.grl_previousAndSide.xyz; let grlSide: f32 = input.grl_previousAndSide.w; let grlNext: vec3f = input.grl_nextAndCounters.xyz; vertexOutputs.grlCounters = input.grl_nextAndCounters.w; let grlWidth: f32 = grlBaseWidth * input.grl_widths; let worldDir: vec3f = normalize(grlNext - grlPrevious); let nearPosition: vec3f = positionUpdated + (worldDir * 0.01); let grlMatrix: mat4x4f = uniforms.viewProjection * finalWorld; let grlFinalPosition: vec4f = grlMatrix * vec4f(positionUpdated, 1.0); let screenNearPos: vec4f = grlMatrix * vec4(nearPosition, 1.0); let grlLinePosition: vec2f = grlFix(grlFinalPosition, grlAspect); let grlLineNearPosition: vec2f = grlFix(screenNearPos, grlAspect); let grlDir: vec2f = normalize(grlLineNearPosition - grlLinePosition); var grlNormal: vec4f = vec4f(-grlDir.y, grlDir.x, 0.0, 1.0); let grlHalfWidth: f32 = 0.5 * grlWidth; #if defined(GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM) grlNormal.x *= -grlHalfWidth; grlNormal.y *= -grlHalfWidth; #else grlNormal.x *= grlHalfWidth; grlNormal.y *= grlHalfWidth; #endif grlNormal *= uniforms.grl_projection; #if defined(GREASED_LINE_SIZE_ATTENUATION) grlNormal.x *= grlFinalPosition.w; grlNormal.y *= grlFinalPosition.w; let pr = vec4f(uniforms.grl_aspect_resolution_lineWidth.yz, 0.0, 1.0) * uniforms.grl_projection; grlNormal.x /= pr.x; grlNormal.y /= pr.y; #endif vertexOutputs.position = vec4f(grlFinalPosition.xy + grlNormal.xy * grlSide, grlFinalPosition.z, grlFinalPosition.w); vertexOutputs.vPositionW = vertexOutputs.position.xyz; #else vertexOutputs.grlCounters = input.grl_counters; #endif `, }; if (cameraFacing) { obj["!vertexOutputs\\.position\\s=\\sscene\\.viewProjection\\s\\*\\sworldPos;"] = "//"; // not needed for camera facing GRL } // eslint-disable-next-line @typescript-eslint/no-unsafe-return return obj; } if (shaderType === "fragment") { return { CUSTOM_FRAGMENT_DEFINITIONS: ` #ifdef PBR #define grlFinalColor finalColor #else #define grlFinalColor color #endif varying grlCounters: f32; varying grlColorPointer: 32; var grl_colors: texture_2d<f32>; var grl_colorsSampler: sampler; `, CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: ` let grlColorMode: f32 = uniforms.grl_colorMode_visibility_colorsWidth_useColors.x; let grlVisibility: f32 = uniforms.grl_colorMode_visibility_colorsWidth_useColors.y; let grlColorsWidth: f32 = uniforms.grl_colorMode_visibility_colorsWidth_useColors.z; let grlUseColors: f32 = uniforms.grl_colorMode_visibility_colorsWidth_useColors.w; let grlUseDash: f32 = uniforms.grl_dashOptions.x; let grlDashArray: f32 = uniforms.grl_dashOptions.y; let grlDashOffset: f32 = uniforms.grl_dashOptions.z; let grlDashRatio: f32 = uniforms.grl_dashOptions.w; grlFinalColor.a *= step(fragmentInputs.grlCounters, grlVisibility); if (grlFinalColor.a == 0.0) { discard; } if (grlUseDash == 1.0) { let dashPosition = (fragmentInputs.grlCounters + grlDashOffset) % grlDashArray; grlFinalColor.a *= ceil(dashPosition - (grlDashArray * grlDashRatio)); if (grlFinalColor.a == 0.0) { discard; } } #ifdef GREASED_LINE_HAS_COLOR if (grlColorMode == ${0 /* GreasedLineMeshColorMode.COLOR_MODE_SET */}.) { grlFinalColor = vec4f(uniforms.grl_singleColor, grlFinalColor.a); } else if (grlColorMode == ${1 /* GreasedLineMeshColorMode.COLOR_MODE_ADD */}.) { grlFinalColor += vec4f(uniforms.grl_singleColor, grlFinalColor.a); } else if (grlColorMode == ${2 /* GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY */}.) { grlFinalColor *= vec4f(uniforms.grl_singleColor, grlFinalColor.a); } #else if (grlUseColors == 1.) { #ifdef GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE let grlColor: vec4f = textureSample(grl_colors, grl_colorsSampler, vec2f(fragmentInputs.grlCounters, 0.)); #else let lookup: vec2f = vec2(fract(fragmentInputs.grlColorPointer / uniforms.grl_textureSize.x), 1.0 - floor(fragmentInputs.grlColorPointer / uniforms.grl_textureSize.x) / max(uniforms.grl_textureSize.y - 1.0, 1.0)); let grlColor: vec4f = textureSample(grl_colors, grl_colorsSampler, lookup); #endif if (grlColorMode == ${0 /* GreasedLineMeshColorMode.COLOR_MODE_SET */}.) { grlFinalColor = grlColor; } else if (grlColorMode == ${1 /* GreasedLineMeshColorMode.COLOR_MODE_ADD */}.) { grlFinalColor += grlColor; } else if (grlColorMode == ${2 /* GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY */}.) { grlFinalColor *= grlColor; } } #endif `, }; } return null; } //# sourceMappingURL=greasedLinePluginMaterialShadersWGSL.js.map