@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
JavaScript
/**
* 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;
attribute grl_offsets: vec3f;
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;
}
attribute grl_slopes: f32;
attribute grl_counters: f32;
`,
CUSTOM_VERTEX_UPDATE_POSITION: `
var grlPositionOffset: vec3f = input.grl_offsets;
var grlPositionOffset = vec3f(0.);
positionUpdated += grlPositionOffset;
positionUpdated = (positionUpdated + grlPositionOffset) + (input.grl_slopes * input.grl_widths);
`,
CUSTOM_VERTEX_MAIN_END: `
vertexOutputs.grlColorPointer = input.grl_colorPointers;
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;
grlNormal.x *= -grlHalfWidth;
grlNormal.y *= -grlHalfWidth;
grlNormal.x *= grlHalfWidth;
grlNormal.y *= grlHalfWidth;
grlNormal *= uniforms.grl_projection;
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;
vertexOutputs.position = vec4f(grlFinalPosition.xy + grlNormal.xy * grlSide, grlFinalPosition.z, grlFinalPosition.w);
vertexOutputs.vPositionW = vertexOutputs.position.xyz;
vertexOutputs.grlCounters = input.grl_counters;
`,
};
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: `
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;
}
}
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);
}
if (grlUseColors == 1.) {
let grlColor: vec4f = textureSample(grl_colors, grl_colorsSampler, vec2f(fragmentInputs.grlCounters, 0.));
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);
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;
}
}
`,
};
}
return null;
}
//# sourceMappingURL=greasedLinePluginMaterialShadersWGSL.js.map