@babylonjs/materials 9.9.2 → 9.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,27 @@ const name = "gridPixelShader";
11
11
  const shader = `#extension GL_OES_standard_derivatives : enable
12
12
  #define SQRT2 1.41421356
13
13
  #define PI 3.14159
14
- precision highp float;uniform float visibility;uniform vec3 mainColor;uniform vec3 lineColor;uniform vec4 gridControl;uniform vec3 gridOffset;varying vec3 vPosition;varying vec3 vNormal;
14
+ #define MAX_OCTAVES 8
15
+ #define LINE_WIDTH_SCREEN_FRACTION 0.004
16
+ #define HORIZON_FADE_EXPONENT 400.0
17
+ #define ORIGIN_MARKER_SPAN 10000000.0
18
+ #define ORIGIN_MARKER_WIDTH_SCALE 0.00000015
19
+ #define ORIGIN_MARKER_THRESHOLD 0.0001
20
+ #define TRANSPARENT_MIN_OPACITY 0.08
21
+ precision highp float;uniform float visibility;uniform vec3 mainColor;uniform vec3 lineColor;uniform vec4 gridControl;uniform vec3 gridOffset;uniform float gridThicknessModifier;
22
+ #ifdef MULTI_SCALE
23
+ uniform float minGridSpacing;uniform float gridOctaves;
24
+ #endif
25
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
26
+ uniform vec3 cameraPosition;uniform vec2 viewportSize;
27
+ #endif
28
+ #ifdef BELOW_LINE_COLOR
29
+ uniform vec3 belowLineColor;
30
+ #endif
31
+ varying vec3 vPosition;varying vec3 vNormal;
32
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
33
+ varying vec3 vWorldPos;
34
+ #endif
15
35
  #ifdef LOGARITHMICDEPTH
16
36
  #extension GL_EXT_frag_depth : enable
17
37
  #endif
@@ -34,37 +54,61 @@ return result;
34
54
  return abs(fractionPartOfPosition)<SQRT2/4. ? 1. : 0.;
35
55
  #endif
36
56
  }
37
- float contributionOnAxis(float position) {float differentialLength=length(vec2(dFdx(position),dFdy(position)));differentialLength*=SQRT2;
38
- float result=isPointOnLine(position,differentialLength);float dynamicVisibility=getDynamicVisibility(position);result*=dynamicVisibility;float anisotropicAttenuation=getAnisotropicAttenuation(differentialLength);result*=anisotropicAttenuation;return result;}
57
+ float contributionOnAxis(float position,float tcLineWidthCap,float thicknessModifier) {float dPosDx=dFdx(position);float dPosDy=dFdy(position);float differentialLength=length(vec2(dPosDx,dPosDy))*SQRT2;if (tcLineWidthCap>0.0) {differentialLength=max(differentialLength,tcLineWidthCap);}
58
+ float lineWidth=differentialLength*thicknessModifier;float result=isPointOnLine(position,lineWidth);result*=getDynamicVisibility(position);result*=getAnisotropicAttenuation(differentialLength);return result;}
39
59
  float normalImpactOnAxis(float x) {float normalImpact=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}
40
60
  #define CUSTOM_FRAGMENT_DEFINITIONS
41
61
  void main(void) {
42
62
  #define CUSTOM_FRAGMENT_MAIN_BEGIN
43
63
  #include<clipPlaneFragment>
44
- float gridRatio=gridControl.x;vec3 gridPos=(vPosition+gridOffset.xyz)/gridRatio;float x=contributionOnAxis(gridPos.x);float y=contributionOnAxis(gridPos.y);float z=contributionOnAxis(gridPos.z);vec3 normal=normalize(vNormal);x*=normalImpactOnAxis(normal.x);y*=normalImpactOnAxis(normal.y);z*=normalImpactOnAxis(normal.z);
64
+ vec3 normal=normalize(vNormal);float horizonFade=1.0;float tcLineWidthCap=0.0;
65
+ #if defined(HORIZON_FADE) || defined(ORIGIN_MARKER)
66
+ float tc=length(vWorldPos-cameraPosition);
67
+ #endif
68
+ #ifdef HORIZON_FADE
69
+ tcLineWidthCap=LINE_WIDTH_SCREEN_FRACTION*tc/viewportSize.y;vec3 rd=normalize(vWorldPos-cameraPosition);if (abs(rd.y)>0.99) {horizonFade=1.0;} else {vec3 flatRayDir=normalize(vec3(rd.x,0.0,rd.z));horizonFade=-pow(abs(dot(rd,flatRayDir)),HORIZON_FADE_EXPONENT)+1.0;}
70
+ #endif
71
+ float grid=0.0;
72
+ #ifdef MULTI_SCALE
73
+ for (int i=0; i<MAX_OCTAVES; i++) {if (i>=int(gridOctaves)) break;float scale=minGridSpacing*pow(10.0,float(i));vec3 gridPos=(vPosition+gridOffset.xyz)/scale;float gx=contributionOnAxis(gridPos.x,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.x);float gy=contributionOnAxis(gridPos.y,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.y);float gz=contributionOnAxis(gridPos.z,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.z);
45
74
  #ifdef MAX_LINE
46
- float grid=clamp(max(max(x,y),z),0.,1.);
75
+ grid=max(grid,clamp(max(max(gx,gy),gz),0.,1.));
47
76
  #else
48
- float grid=clamp(x+y+z,0.,1.);
77
+ grid=max(grid,clamp(gx+gy+gz,0.,1.));
49
78
  #endif
50
- vec3 color=mix(mainColor,lineColor,grid);
79
+ }
80
+ #else
81
+ float gridRatio=gridControl.x;vec3 gridPos=(vPosition+gridOffset.xyz)/gridRatio;float x=contributionOnAxis(gridPos.x,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.x);float y=contributionOnAxis(gridPos.y,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.y);float z=contributionOnAxis(gridPos.z,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.z);
82
+ #ifdef MAX_LINE
83
+ grid=clamp(max(max(x,y),z),0.,1.);
84
+ #else
85
+ grid=clamp(x+y+z,0.,1.);
86
+ #endif
87
+ #endif
88
+ grid*=horizonFade;
89
+ #ifdef ORIGIN_MARKER
90
+ float tcOrigin=ORIGIN_MARKER_WIDTH_SCALE*tc/viewportSize.y;float ox=contributionOnAxis(vWorldPos.x/ORIGIN_MARKER_SPAN,tcOrigin,gridThicknessModifier);float oz=contributionOnAxis(vWorldPos.z/ORIGIN_MARKER_SPAN,tcOrigin,gridThicknessModifier);float originMask=clamp(ox+oz,0.0,1.0)*horizonFade;if (originMask>ORIGIN_MARKER_THRESHOLD) grid=originMask;
91
+ #endif
92
+ #ifdef BELOW_LINE_COLOR
93
+ bool belowSurface=cameraPosition.y<vWorldPos.y;vec3 effectiveLineColor=belowSurface ? belowLineColor : lineColor;
94
+ #else
95
+ vec3 effectiveLineColor=lineColor;
96
+ #endif
97
+ vec3 color=mix(mainColor,effectiveLineColor,grid);
51
98
  #ifdef FOG
52
99
  #include<fogFragment>
53
100
  #endif
54
- float opacity=1.0;
55
- #ifdef TRANSPARENT
56
- opacity=clamp(grid,0.08,gridControl.w*grid);
101
+ float opacity=gridControl.w;
102
+ #ifdef LINES_ONLY
103
+ if (grid<0.01) discard;opacity=clamp(grid,TRANSPARENT_MIN_OPACITY,gridControl.w*grid);
57
104
  #endif
58
105
  #ifdef OPACITY
59
106
  opacity*=texture2D(opacitySampler,vOpacityUV).a;
60
107
  #endif
61
108
  gl_FragColor=vec4(color.rgb,opacity*visibility);
62
- #ifdef TRANSPARENT
63
109
  #ifdef PREMULTIPLYALPHA
64
110
  gl_FragColor.rgb*=opacity;
65
111
  #endif
66
- #else
67
- #endif
68
112
  #include<logDepthFragment>
69
113
  #include<imageProcessingCompatibility>
70
114
  #define CUSTOM_FRAGMENT_MAIN_END
@@ -1 +1 @@
1
- {"version":3,"file":"grid.fragment.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/grid.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AACxG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AAExG,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Dd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,4BAA4B,CAAC,CAAC;AAC7K,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclaration } from \"core/Shaders/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclaration } from \"core/Shaders/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclaration } from \"core/Shaders/ShadersInclude/fogFragmentDeclaration\";\nimport { clipPlaneFragment } from \"core/Shaders/ShadersInclude/clipPlaneFragment\";\nimport { fogFragment } from \"core/Shaders/ShadersInclude/fogFragment\";\nimport { logDepthFragment } from \"core/Shaders/ShadersInclude/logDepthFragment\";\nimport { imageProcessingCompatibility } from \"core/Shaders/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"gridPixelShader\";\nconst shader = `#extension GL_OES_standard_derivatives : enable\n#define SQRT2 1.41421356\n#define PI 3.14159\nprecision highp float;uniform float visibility;uniform vec3 mainColor;uniform vec3 lineColor;uniform vec4 gridControl;uniform vec3 gridOffset;varying vec3 vPosition;varying vec3 vNormal;\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#ifdef OPACITY\nvarying vec2 vOpacityUV;uniform sampler2D opacitySampler;uniform vec2 vOpacityInfos;\n#endif\nfloat getDynamicVisibility(float position) {float majorGridFrequency=gridControl.y;if (floor(position+0.5)==floor(position/majorGridFrequency+0.5)*majorGridFrequency)\n{return 1.0;}\nreturn gridControl.z;}\nfloat getAnisotropicAttenuation(float differentialLength) {const float maxNumberOfLines=10.0;return clamp(1.0/(differentialLength+1.0)-1.0/maxNumberOfLines,0.0,1.0);}\nfloat isPointOnLine(float position,float differentialLength) {float fractionPartOfPosition=position-floor(position+0.5); \nfractionPartOfPosition/=differentialLength; \n#ifdef ANTIALIAS\nfractionPartOfPosition=clamp(fractionPartOfPosition,-1.,1.);float result=0.5+0.5*cos(fractionPartOfPosition*PI); \nreturn result;\n#else\nreturn abs(fractionPartOfPosition)<SQRT2/4. ? 1. : 0.;\n#endif\n}\nfloat contributionOnAxis(float position) {float differentialLength=length(vec2(dFdx(position),dFdy(position)));differentialLength*=SQRT2; \nfloat result=isPointOnLine(position,differentialLength);float dynamicVisibility=getDynamicVisibility(position);result*=dynamicVisibility;float anisotropicAttenuation=getAnisotropicAttenuation(differentialLength);result*=anisotropicAttenuation;return result;}\nfloat normalImpactOnAxis(float x) {float normalImpact=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nfloat gridRatio=gridControl.x;vec3 gridPos=(vPosition+gridOffset.xyz)/gridRatio;float x=contributionOnAxis(gridPos.x);float y=contributionOnAxis(gridPos.y);float z=contributionOnAxis(gridPos.z);vec3 normal=normalize(vNormal);x*=normalImpactOnAxis(normal.x);y*=normalImpactOnAxis(normal.y);z*=normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\nfloat grid=clamp(max(max(x,y),z),0.,1.);\n#else\nfloat grid=clamp(x+y+z,0.,1.);\n#endif\nvec3 color=mix(mainColor,lineColor,grid);\n#ifdef FOG\n#include<fogFragment>\n#endif\nfloat opacity=1.0;\n#ifdef TRANSPARENT\nopacity=clamp(grid,0.08,gridControl.w*grid);\n#endif\n#ifdef OPACITY\nopacity*=texture2D(opacitySampler,vOpacityUV).a;\n#endif\ngl_FragColor=vec4(color.rgb,opacity*visibility);\n#ifdef TRANSPARENT\n#ifdef PREMULTIPLYALPHA\ngl_FragColor.rgb*=opacity;\n#endif\n#else\n#endif\n#include<logDepthFragment>\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclaration, logDepthDeclaration, fogFragmentDeclaration, clipPlaneFragment, fogFragment, logDepthFragment, imageProcessingCompatibility];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridPixelShader = { name, shader };\n"]}
1
+ {"version":3,"file":"grid.fragment.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/grid.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AACxG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,0DAA0D,CAAC;AAExG,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,4BAA4B,CAAC,CAAC;AAC7K,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclaration } from \"core/Shaders/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclaration } from \"core/Shaders/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclaration } from \"core/Shaders/ShadersInclude/fogFragmentDeclaration\";\nimport { clipPlaneFragment } from \"core/Shaders/ShadersInclude/clipPlaneFragment\";\nimport { fogFragment } from \"core/Shaders/ShadersInclude/fogFragment\";\nimport { logDepthFragment } from \"core/Shaders/ShadersInclude/logDepthFragment\";\nimport { imageProcessingCompatibility } from \"core/Shaders/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"gridPixelShader\";\nconst shader = `#extension GL_OES_standard_derivatives : enable\n#define SQRT2 1.41421356\n#define PI 3.14159\n#define MAX_OCTAVES 8\n#define LINE_WIDTH_SCREEN_FRACTION 0.004\n#define HORIZON_FADE_EXPONENT 400.0\n#define ORIGIN_MARKER_SPAN 10000000.0\n#define ORIGIN_MARKER_WIDTH_SCALE 0.00000015\n#define ORIGIN_MARKER_THRESHOLD 0.0001\n#define TRANSPARENT_MIN_OPACITY 0.08\nprecision highp float;uniform float visibility;uniform vec3 mainColor;uniform vec3 lineColor;uniform vec4 gridControl;uniform vec3 gridOffset;uniform float gridThicknessModifier;\n#ifdef MULTI_SCALE\nuniform float minGridSpacing;uniform float gridOctaves;\n#endif\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nuniform vec3 cameraPosition;uniform vec2 viewportSize;\n#endif\n#ifdef BELOW_LINE_COLOR\nuniform vec3 belowLineColor;\n#endif\nvarying vec3 vPosition;varying vec3 vNormal;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvarying vec3 vWorldPos;\n#endif\n#ifdef LOGARITHMICDEPTH\n#extension GL_EXT_frag_depth : enable\n#endif\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#ifdef OPACITY\nvarying vec2 vOpacityUV;uniform sampler2D opacitySampler;uniform vec2 vOpacityInfos;\n#endif\nfloat getDynamicVisibility(float position) {float majorGridFrequency=gridControl.y;if (floor(position+0.5)==floor(position/majorGridFrequency+0.5)*majorGridFrequency)\n{return 1.0;}\nreturn gridControl.z;}\nfloat getAnisotropicAttenuation(float differentialLength) {const float maxNumberOfLines=10.0;return clamp(1.0/(differentialLength+1.0)-1.0/maxNumberOfLines,0.0,1.0);}\nfloat isPointOnLine(float position,float differentialLength) {float fractionPartOfPosition=position-floor(position+0.5); \nfractionPartOfPosition/=differentialLength; \n#ifdef ANTIALIAS\nfractionPartOfPosition=clamp(fractionPartOfPosition,-1.,1.);float result=0.5+0.5*cos(fractionPartOfPosition*PI); \nreturn result;\n#else\nreturn abs(fractionPartOfPosition)<SQRT2/4. ? 1. : 0.;\n#endif\n}\nfloat contributionOnAxis(float position,float tcLineWidthCap,float thicknessModifier) {float dPosDx=dFdx(position);float dPosDy=dFdy(position);float differentialLength=length(vec2(dPosDx,dPosDy))*SQRT2;if (tcLineWidthCap>0.0) {differentialLength=max(differentialLength,tcLineWidthCap);}\nfloat lineWidth=differentialLength*thicknessModifier;float result=isPointOnLine(position,lineWidth);result*=getDynamicVisibility(position);result*=getAnisotropicAttenuation(differentialLength);return result;}\nfloat normalImpactOnAxis(float x) {float normalImpact=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvec3 normal=normalize(vNormal);float horizonFade=1.0;float tcLineWidthCap=0.0;\n#if defined(HORIZON_FADE) || defined(ORIGIN_MARKER)\nfloat tc=length(vWorldPos-cameraPosition);\n#endif\n#ifdef HORIZON_FADE\ntcLineWidthCap=LINE_WIDTH_SCREEN_FRACTION*tc/viewportSize.y;vec3 rd=normalize(vWorldPos-cameraPosition);if (abs(rd.y)>0.99) {horizonFade=1.0;} else {vec3 flatRayDir=normalize(vec3(rd.x,0.0,rd.z));horizonFade=-pow(abs(dot(rd,flatRayDir)),HORIZON_FADE_EXPONENT)+1.0;}\n#endif\nfloat grid=0.0;\n#ifdef MULTI_SCALE\nfor (int i=0; i<MAX_OCTAVES; i++) {if (i>=int(gridOctaves)) break;float scale=minGridSpacing*pow(10.0,float(i));vec3 gridPos=(vPosition+gridOffset.xyz)/scale;float gx=contributionOnAxis(gridPos.x,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.x);float gy=contributionOnAxis(gridPos.y,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.y);float gz=contributionOnAxis(gridPos.z,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\ngrid=max(grid,clamp(max(max(gx,gy),gz),0.,1.));\n#else\ngrid=max(grid,clamp(gx+gy+gz,0.,1.));\n#endif\n}\n#else\nfloat gridRatio=gridControl.x;vec3 gridPos=(vPosition+gridOffset.xyz)/gridRatio;float x=contributionOnAxis(gridPos.x,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.x);float y=contributionOnAxis(gridPos.y,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.y);float z=contributionOnAxis(gridPos.z,tcLineWidthCap,gridThicknessModifier)*normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\ngrid=clamp(max(max(x,y),z),0.,1.);\n#else\ngrid=clamp(x+y+z,0.,1.);\n#endif\n#endif\ngrid*=horizonFade;\n#ifdef ORIGIN_MARKER\nfloat tcOrigin=ORIGIN_MARKER_WIDTH_SCALE*tc/viewportSize.y;float ox=contributionOnAxis(vWorldPos.x/ORIGIN_MARKER_SPAN,tcOrigin,gridThicknessModifier);float oz=contributionOnAxis(vWorldPos.z/ORIGIN_MARKER_SPAN,tcOrigin,gridThicknessModifier);float originMask=clamp(ox+oz,0.0,1.0)*horizonFade;if (originMask>ORIGIN_MARKER_THRESHOLD) grid=originMask;\n#endif\n#ifdef BELOW_LINE_COLOR\nbool belowSurface=cameraPosition.y<vWorldPos.y;vec3 effectiveLineColor=belowSurface ? belowLineColor : lineColor;\n#else\nvec3 effectiveLineColor=lineColor;\n#endif\nvec3 color=mix(mainColor,effectiveLineColor,grid);\n#ifdef FOG\n#include<fogFragment>\n#endif\nfloat opacity=gridControl.w;\n#ifdef LINES_ONLY\nif (grid<0.01) discard;opacity=clamp(grid,TRANSPARENT_MIN_OPACITY,gridControl.w*grid);\n#endif\n#ifdef OPACITY\nopacity*=texture2D(opacitySampler,vOpacityUV).a;\n#endif\ngl_FragColor=vec4(color.rgb,opacity*visibility);\n#ifdef PREMULTIPLYALPHA\ngl_FragColor.rgb*=opacity;\n#endif\n#include<logDepthFragment>\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclaration, logDepthDeclaration, fogFragmentDeclaration, clipPlaneFragment, fogFragment, logDepthFragment, imageProcessingCompatibility];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridPixelShader = { name, shader };\n"]}
@@ -21,6 +21,9 @@ attribute vec2 uv2;
21
21
  #include<instancesDeclaration>
22
22
  #include<__decl__sceneVertex>
23
23
  varying vec3 vPosition;varying vec3 vNormal;
24
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
25
+ varying vec3 vWorldPos;
26
+ #endif
24
27
  #include<logDepthDeclaration>
25
28
  #include<fogVertexDeclaration>
26
29
  #ifdef OPACITY
@@ -49,6 +52,9 @@ else
49
52
  #include<clipPlaneVertex>
50
53
  #include<logDepthVertex>
51
54
  vPosition=position;vNormal=normal;
55
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
56
+ vWorldPos=worldPos.xyz;
57
+ #endif
52
58
  #define CUSTOM_VERTEX_MAIN_END
53
59
  }`;
54
60
  // Sideeffect
@@ -1 +1 @@
1
- {"version":3,"file":"grid.vertex.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/grid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;AACzN,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { instancesDeclaration } from \"core/Shaders/ShadersInclude/instancesDeclaration\";\nimport { sceneVertexDeclaration } from \"core/Shaders/ShadersInclude/sceneVertexDeclaration\";\nimport { sceneUboDeclaration } from \"core/Shaders/ShadersInclude/sceneUboDeclaration\";\nimport { logDepthDeclaration } from \"core/Shaders/ShadersInclude/logDepthDeclaration\";\nimport { fogVertexDeclaration } from \"core/Shaders/ShadersInclude/fogVertexDeclaration\";\nimport { clipPlaneVertexDeclaration } from \"core/Shaders/ShadersInclude/clipPlaneVertexDeclaration\";\nimport { instancesVertex } from \"core/Shaders/ShadersInclude/instancesVertex\";\nimport { fogVertex } from \"core/Shaders/ShadersInclude/fogVertex\";\nimport { clipPlaneVertex } from \"core/Shaders/ShadersInclude/clipPlaneVertex\";\nimport { logDepthVertex } from \"core/Shaders/ShadersInclude/logDepthVertex\";\n\nconst name = \"gridVertexShader\";\nconst shader = `precision highp float;attribute vec3 position;attribute vec3 normal;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#include<instancesDeclaration>\n#include<__decl__sceneVertex>\nvarying vec3 vPosition;varying vec3 vNormal;\n#include<logDepthDeclaration>\n#include<fogVertexDeclaration>\n#ifdef OPACITY\nvarying vec2 vOpacityUV;uniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#include<clipPlaneVertexDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include<instancesVertex>\nvec4 worldPos=finalWorld*vec4(position,1.0);\n#include<fogVertex>\nvec4 cameraSpacePosition=view*worldPos;gl_Position=projection*cameraSpacePosition;\n#ifdef OPACITY\n#ifndef UV1\nvec2 uv=vec2(0.,0.);\n#endif\n#ifndef UV2\nvec2 uv2=vec2(0.,0.);\n#endif\nif (vOpacityInfos.x==0.)\n{vOpacityUV=vec2(opacityMatrix*vec4(uv,1.0,0.0));}\nelse\n{vOpacityUV=vec2(opacityMatrix*vec4(uv2,1.0,0.0));}\n#endif \n#include<clipPlaneVertex>\n#include<logDepthVertex>\nvPosition=position;vNormal=normal;\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [instancesDeclaration, sceneVertexDeclaration, sceneUboDeclaration, logDepthDeclaration, fogVertexDeclaration, clipPlaneVertexDeclaration, instancesVertex, fogVertex, clipPlaneVertex, logDepthVertex];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridVertexShader = { name, shader };\n"]}
1
+ {"version":3,"file":"grid.vertex.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/grid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6Cb,CAAC;AACH,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;AACzN,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { instancesDeclaration } from \"core/Shaders/ShadersInclude/instancesDeclaration\";\nimport { sceneVertexDeclaration } from \"core/Shaders/ShadersInclude/sceneVertexDeclaration\";\nimport { sceneUboDeclaration } from \"core/Shaders/ShadersInclude/sceneUboDeclaration\";\nimport { logDepthDeclaration } from \"core/Shaders/ShadersInclude/logDepthDeclaration\";\nimport { fogVertexDeclaration } from \"core/Shaders/ShadersInclude/fogVertexDeclaration\";\nimport { clipPlaneVertexDeclaration } from \"core/Shaders/ShadersInclude/clipPlaneVertexDeclaration\";\nimport { instancesVertex } from \"core/Shaders/ShadersInclude/instancesVertex\";\nimport { fogVertex } from \"core/Shaders/ShadersInclude/fogVertex\";\nimport { clipPlaneVertex } from \"core/Shaders/ShadersInclude/clipPlaneVertex\";\nimport { logDepthVertex } from \"core/Shaders/ShadersInclude/logDepthVertex\";\n\nconst name = \"gridVertexShader\";\nconst shader = `precision highp float;attribute vec3 position;attribute vec3 normal;\n#ifdef UV1\nattribute vec2 uv;\n#endif\n#ifdef UV2\nattribute vec2 uv2;\n#endif\n#include<instancesDeclaration>\n#include<__decl__sceneVertex>\nvarying vec3 vPosition;varying vec3 vNormal;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvarying vec3 vWorldPos;\n#endif\n#include<logDepthDeclaration>\n#include<fogVertexDeclaration>\n#ifdef OPACITY\nvarying vec2 vOpacityUV;uniform mat4 opacityMatrix;uniform vec2 vOpacityInfos;\n#endif\n#include<clipPlaneVertexDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include<instancesVertex>\nvec4 worldPos=finalWorld*vec4(position,1.0);\n#include<fogVertex>\nvec4 cameraSpacePosition=view*worldPos;gl_Position=projection*cameraSpacePosition;\n#ifdef OPACITY\n#ifndef UV1\nvec2 uv=vec2(0.,0.);\n#endif\n#ifndef UV2\nvec2 uv2=vec2(0.,0.);\n#endif\nif (vOpacityInfos.x==0.)\n{vOpacityUV=vec2(opacityMatrix*vec4(uv,1.0,0.0));}\nelse\n{vOpacityUV=vec2(opacityMatrix*vec4(uv2,1.0,0.0));}\n#endif \n#include<clipPlaneVertex>\n#include<logDepthVertex>\nvPosition=position;vNormal=normal;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvWorldPos=worldPos.xyz;\n#endif\n#define CUSTOM_VERTEX_MAIN_END\n}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\nconst includes = [instancesDeclaration, sceneVertexDeclaration, sceneUboDeclaration, logDepthDeclaration, fogVertexDeclaration, clipPlaneVertexDeclaration, instancesVertex, fogVertex, clipPlaneVertex, logDepthVertex];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStore[inc.name]) {\n ShaderStore.IncludesShadersStore[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridVertexShader = { name, shader };\n"]}
@@ -1,5 +1,6 @@
1
1
  import { type Matrix, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
2
2
  import { Color3 } from "@babylonjs/core/Maths/math.color.js";
3
+ import { type Nullable } from "@babylonjs/core/types.js";
3
4
  import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
4
5
  import { PushMaterial } from "@babylonjs/core/Materials/pushMaterial.js";
5
6
  import { type AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh.js";
@@ -36,13 +37,53 @@ export declare class GridMaterial extends PushMaterial {
36
37
  */
37
38
  minorUnitVisibility: number;
38
39
  /**
39
- * The grid opacity outside of the lines.
40
+ * Overall mesh opacity. In linesOnly mode this also scales the maximum line alpha.
40
41
  */
41
42
  opacity: number;
42
43
  /**
43
44
  * Whether to antialias the grid
44
45
  */
45
46
  antialias: boolean;
47
+ /**
48
+ * Color of grid lines when the camera is below the surface.
49
+ * When set, lineColor acts as the above-surface color.
50
+ */
51
+ get belowLineColor(): Nullable<Color3>;
52
+ set belowLineColor(value: Nullable<Color3>);
53
+ private _belowLineColor;
54
+ /**
55
+ * Enable multi-scale logarithmic grid LOD. Number of octaves is controlled by gridOctaves.
56
+ */
57
+ useMultiScale: boolean;
58
+ /**
59
+ * World-unit spacing of the finest octave. Default 0.001.
60
+ */
61
+ minGridSpacing: number;
62
+ /**
63
+ * Number of logarithmic octaves rendered (1–8). Default 4.
64
+ */
65
+ gridOctaves: number;
66
+ /**
67
+ * Enable camera-distance-aware horizon (grazing-angle) fade.
68
+ */
69
+ useHorizonFade: boolean;
70
+ /**
71
+ * Render an ultra-fine crosshair at the world origin.
72
+ */
73
+ useOriginMarker: boolean;
74
+ /**
75
+ * When true, only grid lines are visible — non-grid pixels are discarded.
76
+ * Puts the material in the alpha-blend queue and enables a depth pre-pass so grid lines
77
+ * correctly occlude translucent objects (e.g. Gaussian splats). Set mesh.alphaIndex to a
78
+ * value lower than other transparent objects so the depth pre-pass fires first.
79
+ */
80
+ get linesOnly(): boolean;
81
+ set linesOnly(value: boolean);
82
+ private _linesOnly;
83
+ /**
84
+ * Scales grid line width. Values \> 1 produce thicker lines. Default 1.0.
85
+ */
86
+ gridThicknessModifier: number;
46
87
  /**
47
88
  * Determine RBG output is premultiplied by alpha value.
48
89
  */
@@ -57,6 +98,7 @@ export declare class GridMaterial extends PushMaterial {
57
98
  */
58
99
  opacityTexture: BaseTexture;
59
100
  private _gridControl;
101
+ private _viewportSize;
60
102
  /**
61
103
  * constructor
62
104
  * @param name The name given to the material in order to identify it afterwards.
@@ -80,5 +122,12 @@ export declare class GridMaterial extends PushMaterial {
80
122
  clone(name: string): GridMaterial;
81
123
  serialize(): any;
82
124
  getClassName(): string;
125
+ /**
126
+ * Parse a JSON input to create back a grid material.
127
+ * @param source the JSON data to parse
128
+ * @param scene defines the hosting scene
129
+ * @param rootUrl defines the root URL to use to load textures and relative dependencies
130
+ * @returns a new grid material
131
+ */
83
132
  static Parse(source: any, scene: Scene, rootUrl: string): GridMaterial;
84
133
  }
@@ -2,7 +2,7 @@ import { __decorate } from "@babylonjs/core/tslib.es6.js";
2
2
  /* eslint-disable @typescript-eslint/naming-convention */
3
3
  import { serializeAsTexture, serialize, expandToProperty, serializeAsColor3, serializeAsVector3 } from "@babylonjs/core/Misc/decorators.js";
4
4
  import { SerializationHelper } from "@babylonjs/core/Misc/decorators.serialization.js";
5
- import { Vector4, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
5
+ import { Vector4, Vector2, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
6
6
  import { Color3 } from "@babylonjs/core/Maths/math.color.js";
7
7
  import { MaterialDefines } from "@babylonjs/core/Materials/materialDefines.js";
8
8
  import { PushMaterial } from "@babylonjs/core/Materials/pushMaterial.js";
@@ -22,7 +22,7 @@ class GridMaterialDefines extends MaterialDefines {
22
22
  this.CLIPPLANE6 = false;
23
23
  this.OPACITY = false;
24
24
  this.ANTIALIAS = false;
25
- this.TRANSPARENT = false;
25
+ this.LINES_ONLY = false;
26
26
  this.FOG = false;
27
27
  this.PREMULTIPLYALPHA = false;
28
28
  this.MAX_LINE = false;
@@ -33,6 +33,10 @@ class GridMaterialDefines extends MaterialDefines {
33
33
  this.IMAGEPROCESSINGPOSTPROCESS = false;
34
34
  this.SKIPFINALCOLORCLAMP = false;
35
35
  this.LOGARITHMICDEPTH = false;
36
+ this.MULTI_SCALE = false;
37
+ this.HORIZON_FADE = false;
38
+ this.BELOW_LINE_COLOR = false;
39
+ this.ORIGIN_MARKER = false;
36
40
  this.rebuild();
37
41
  }
38
42
  }
@@ -41,6 +45,37 @@ class GridMaterialDefines extends MaterialDefines {
41
45
  * Colors are customizable.
42
46
  */
43
47
  export class GridMaterial extends PushMaterial {
48
+ /**
49
+ * Color of grid lines when the camera is below the surface.
50
+ * When set, lineColor acts as the above-surface color.
51
+ */
52
+ get belowLineColor() {
53
+ return this._belowLineColor;
54
+ }
55
+ set belowLineColor(value) {
56
+ if (this._belowLineColor === value) {
57
+ return;
58
+ }
59
+ this._belowLineColor = value;
60
+ this._markAllSubMeshesAsMiscDirty();
61
+ }
62
+ /**
63
+ * When true, only grid lines are visible — non-grid pixels are discarded.
64
+ * Puts the material in the alpha-blend queue and enables a depth pre-pass so grid lines
65
+ * correctly occlude translucent objects (e.g. Gaussian splats). Set mesh.alphaIndex to a
66
+ * value lower than other transparent objects so the depth pre-pass fires first.
67
+ */
68
+ get linesOnly() {
69
+ return this._linesOnly;
70
+ }
71
+ set linesOnly(value) {
72
+ if (this._linesOnly === value) {
73
+ return;
74
+ }
75
+ this._linesOnly = value;
76
+ this.needDepthPrePass = value;
77
+ this._markAllSubMeshesAsMiscDirty();
78
+ }
44
79
  /**
45
80
  * constructor
46
81
  * @param name The name given to the material in order to identify it afterwards.
@@ -74,13 +109,39 @@ export class GridMaterial extends PushMaterial {
74
109
  */
75
110
  this.minorUnitVisibility = 0.33;
76
111
  /**
77
- * The grid opacity outside of the lines.
112
+ * Overall mesh opacity. In linesOnly mode this also scales the maximum line alpha.
78
113
  */
79
114
  this.opacity = 1.0;
80
115
  /**
81
116
  * Whether to antialias the grid
82
117
  */
83
118
  this.antialias = true;
119
+ this._belowLineColor = null;
120
+ /**
121
+ * Enable multi-scale logarithmic grid LOD. Number of octaves is controlled by gridOctaves.
122
+ */
123
+ this.useMultiScale = false;
124
+ /**
125
+ * World-unit spacing of the finest octave. Default 0.001.
126
+ */
127
+ this.minGridSpacing = 0.001;
128
+ /**
129
+ * Number of logarithmic octaves rendered (1–8). Default 4.
130
+ */
131
+ this.gridOctaves = 4;
132
+ /**
133
+ * Enable camera-distance-aware horizon (grazing-angle) fade.
134
+ */
135
+ this.useHorizonFade = false;
136
+ /**
137
+ * Render an ultra-fine crosshair at the world origin.
138
+ */
139
+ this.useOriginMarker = false;
140
+ this._linesOnly = false;
141
+ /**
142
+ * Scales grid line width. Values \> 1 produce thicker lines. Default 1.0.
143
+ */
144
+ this.gridThicknessModifier = 1.0;
84
145
  /**
85
146
  * Determine RBG output is premultiplied by alpha value.
86
147
  */
@@ -90,13 +151,14 @@ export class GridMaterial extends PushMaterial {
90
151
  */
91
152
  this.useMaxLine = false;
92
153
  this._gridControl = new Vector4(this.gridRatio, this.majorUnitFrequency, this.minorUnitVisibility, this.opacity);
154
+ this._viewportSize = new Vector2();
93
155
  this._shadersLoaded = false;
94
156
  }
95
157
  /**
96
158
  * @returns whether or not the grid requires alpha blending.
97
159
  */
98
160
  needAlphaBlending() {
99
- return this.opacity < 1.0 || (this._opacityTexture && this._opacityTexture.isReady());
161
+ return this.linesOnly || this.opacity < 1.0 || (this._opacityTexture && this._opacityTexture.isReady());
100
162
  }
101
163
  needAlphaBlendingForMesh(mesh) {
102
164
  return mesh.visibility < 1.0 || this.needAlphaBlending();
@@ -116,8 +178,8 @@ export class GridMaterial extends PushMaterial {
116
178
  if (this._isReadyForSubMesh(subMesh)) {
117
179
  return true;
118
180
  }
119
- if (defines.TRANSPARENT !== this.opacity < 1.0) {
120
- defines.TRANSPARENT = !defines.TRANSPARENT;
181
+ if (defines.LINES_ONLY !== this.linesOnly) {
182
+ defines.LINES_ONLY = this.linesOnly;
121
183
  defines.markAsUnprocessed();
122
184
  }
123
185
  if (defines.PREMULTIPLYALPHA != this.preMultiplyAlpha) {
@@ -129,7 +191,24 @@ export class GridMaterial extends PushMaterial {
129
191
  defines.markAsUnprocessed();
130
192
  }
131
193
  if (defines.ANTIALIAS !== this.antialias) {
132
- defines.ANTIALIAS = !defines.ANTIALIAS;
194
+ defines.ANTIALIAS = this.antialias;
195
+ defines.markAsUnprocessed();
196
+ }
197
+ if (defines.MULTI_SCALE !== this.useMultiScale) {
198
+ defines.MULTI_SCALE = this.useMultiScale;
199
+ defines.markAsUnprocessed();
200
+ }
201
+ if (defines.HORIZON_FADE !== this.useHorizonFade) {
202
+ defines.HORIZON_FADE = this.useHorizonFade;
203
+ defines.markAsUnprocessed();
204
+ }
205
+ const wantsBelowColor = this._belowLineColor !== null;
206
+ if (defines.BELOW_LINE_COLOR !== wantsBelowColor) {
207
+ defines.BELOW_LINE_COLOR = wantsBelowColor;
208
+ defines.markAsUnprocessed();
209
+ }
210
+ if (defines.ORIGIN_MARKER !== this.useOriginMarker) {
211
+ defines.ORIGIN_MARKER = this.useOriginMarker;
133
212
  defines.markAsUnprocessed();
134
213
  }
135
214
  // Textures
@@ -179,7 +258,17 @@ export class GridMaterial extends PushMaterial {
179
258
  "vOpacityInfos",
180
259
  "visibility",
181
260
  "logarithmicDepthConstant",
261
+ "gridThicknessModifier",
182
262
  ];
263
+ if (defines.MULTI_SCALE) {
264
+ uniforms.push("minGridSpacing", "gridOctaves");
265
+ }
266
+ if (defines.HORIZON_FADE || defines.BELOW_LINE_COLOR || defines.ORIGIN_MARKER) {
267
+ uniforms.push("cameraPosition", "viewportSize");
268
+ }
269
+ if (defines.BELOW_LINE_COLOR) {
270
+ uniforms.push("belowLineColor");
271
+ }
183
272
  // Defines
184
273
  const join = defines.toString();
185
274
  AddClipPlaneUniforms(uniforms);
@@ -242,6 +331,14 @@ export class GridMaterial extends PushMaterial {
242
331
  this._gridControl.z = this.minorUnitVisibility;
243
332
  this._gridControl.w = this.opacity;
244
333
  this._activeEffect.setVector4("gridControl", this._gridControl);
334
+ this._activeEffect.setFloat("gridThicknessModifier", this.gridThicknessModifier);
335
+ if (defines.BELOW_LINE_COLOR && this._belowLineColor) {
336
+ this._activeEffect.setColor3("belowLineColor", this._belowLineColor);
337
+ }
338
+ if (defines.MULTI_SCALE) {
339
+ this._activeEffect.setFloat("minGridSpacing", this.minGridSpacing);
340
+ this._activeEffect.setFloat("gridOctaves", Math.max(1, Math.min(8, Math.round(this.gridOctaves))));
341
+ }
245
342
  if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {
246
343
  this._activeEffect.setTexture("opacitySampler", this._opacityTexture);
247
344
  this._activeEffect.setFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);
@@ -256,6 +353,17 @@ export class GridMaterial extends PushMaterial {
256
353
  }
257
354
  // Fog
258
355
  BindFogParameters(scene, mesh, this._activeEffect);
356
+ // Camera uniforms — must be updated every frame
357
+ if (defines.HORIZON_FADE || defines.BELOW_LINE_COLOR || defines.ORIGIN_MARKER) {
358
+ const cam = scene.activeCamera;
359
+ if (cam) {
360
+ this._activeEffect.setVector3("cameraPosition", cam.globalPosition);
361
+ const engine = scene.getEngine();
362
+ this._viewportSize.x = engine.getRenderWidth();
363
+ this._viewportSize.y = engine.getRenderHeight();
364
+ this._activeEffect.setVector2("viewportSize", this._viewportSize);
365
+ }
366
+ }
259
367
  this._afterBind(mesh, this._activeEffect, subMesh);
260
368
  }
261
369
  /**
@@ -276,6 +384,13 @@ export class GridMaterial extends PushMaterial {
276
384
  getClassName() {
277
385
  return "GridMaterial";
278
386
  }
387
+ /**
388
+ * Parse a JSON input to create back a grid material.
389
+ * @param source the JSON data to parse
390
+ * @param scene defines the hosting scene
391
+ * @param rootUrl defines the root URL to use to load textures and relative dependencies
392
+ * @returns a new grid material
393
+ */
279
394
  static Parse(source, scene, rootUrl) {
280
395
  return SerializationHelper.Parse(() => new GridMaterial(source.name, scene), source, scene, rootUrl);
281
396
  }
@@ -304,6 +419,30 @@ __decorate([
304
419
  __decorate([
305
420
  serialize()
306
421
  ], GridMaterial.prototype, "antialias", void 0);
422
+ __decorate([
423
+ serializeAsColor3()
424
+ ], GridMaterial.prototype, "belowLineColor", null);
425
+ __decorate([
426
+ serialize()
427
+ ], GridMaterial.prototype, "useMultiScale", void 0);
428
+ __decorate([
429
+ serialize()
430
+ ], GridMaterial.prototype, "minGridSpacing", void 0);
431
+ __decorate([
432
+ serialize()
433
+ ], GridMaterial.prototype, "gridOctaves", void 0);
434
+ __decorate([
435
+ serialize()
436
+ ], GridMaterial.prototype, "useHorizonFade", void 0);
437
+ __decorate([
438
+ serialize()
439
+ ], GridMaterial.prototype, "useOriginMarker", void 0);
440
+ __decorate([
441
+ serialize()
442
+ ], GridMaterial.prototype, "linesOnly", null);
443
+ __decorate([
444
+ serialize()
445
+ ], GridMaterial.prototype, "gridThicknessModifier", void 0);
307
446
  __decorate([
308
447
  serialize()
309
448
  ], GridMaterial.prototype, "preMultiplyAlpha", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"gridMaterial.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/gridMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serializeAsTexture, serialize, expandToProperty, serializeAsColor3, serializeAsVector3 } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector4, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { MaterialFlags } from \"core/Materials/materialFlags\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n} from \"core/Materials/materialHelper.functions\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"core/Materials/clipPlaneMaterialHelper\";\r\n\r\nclass GridMaterialDefines extends MaterialDefines {\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public OPACITY = false;\r\n public ANTIALIAS = false;\r\n public TRANSPARENT = false;\r\n public FOG = false;\r\n public PREMULTIPLYALPHA = false;\r\n public MAX_LINE = false;\r\n public UV1 = false;\r\n public UV2 = false;\r\n public INSTANCES = false;\r\n public THIN_INSTANCES = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public LOGARITHMICDEPTH = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * The grid materials allows you to wrap any shape with a grid.\r\n * Colors are customizable.\r\n */\r\nexport class GridMaterial extends PushMaterial {\r\n /**\r\n * Main color of the grid (e.g. between lines)\r\n */\r\n @serializeAsColor3()\r\n public mainColor = Color3.Black();\r\n\r\n /**\r\n * Color of the grid lines.\r\n */\r\n @serializeAsColor3()\r\n public lineColor = Color3.Teal();\r\n\r\n /**\r\n * The scale of the grid compared to unit.\r\n */\r\n @serialize()\r\n public gridRatio = 1.0;\r\n\r\n /**\r\n * Allows setting an offset for the grid lines.\r\n */\r\n @serializeAsVector3()\r\n public gridOffset = Vector3.Zero();\r\n\r\n /**\r\n * The frequency of thicker lines.\r\n */\r\n @serialize()\r\n public majorUnitFrequency = 10;\r\n\r\n /**\r\n * The visibility of minor units in the grid.\r\n */\r\n @serialize()\r\n public minorUnitVisibility = 0.33;\r\n\r\n /**\r\n * The grid opacity outside of the lines.\r\n */\r\n @serialize()\r\n public opacity = 1.0;\r\n\r\n /**\r\n * Whether to antialias the grid\r\n */\r\n @serialize()\r\n public antialias = true;\r\n\r\n /**\r\n * Determine RBG output is premultiplied by alpha value.\r\n */\r\n @serialize()\r\n public preMultiplyAlpha = false;\r\n\r\n /**\r\n * Determines if the max line value will be used instead of the sum wherever grid lines intersect.\r\n */\r\n @serialize()\r\n public useMaxLine = false;\r\n\r\n @serializeAsTexture(\"opacityTexture\")\r\n private _opacityTexture: BaseTexture;\r\n /**\r\n * Texture to define opacity of the grid\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public opacityTexture: BaseTexture;\r\n\r\n private _gridControl: Vector4 = new Vector4(this.gridRatio, this.majorUnitFrequency, this.minorUnitVisibility, this.opacity);\r\n\r\n /**\r\n * constructor\r\n * @param name The name given to the material in order to identify it afterwards.\r\n * @param scene The scene the material is used in.\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, undefined, forceGLSL);\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n /**\r\n * @returns whether or not the grid requires alpha blending.\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return this.opacity < 1.0 || (this._opacityTexture && this._opacityTexture.isReady());\r\n }\r\n\r\n public override needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n return mesh.visibility < 1.0 || this.needAlphaBlending();\r\n }\r\n\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new GridMaterialDefines();\r\n }\r\n\r\n const defines = <GridMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n if (defines.TRANSPARENT !== this.opacity < 1.0) {\r\n defines.TRANSPARENT = !defines.TRANSPARENT;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.PREMULTIPLYALPHA != this.preMultiplyAlpha) {\r\n defines.PREMULTIPLYALPHA = !defines.PREMULTIPLYALPHA;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.MAX_LINE !== this.useMaxLine) {\r\n defines.MAX_LINE = !defines.MAX_LINE;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.ANTIALIAS !== this.antialias) {\r\n defines.ANTIALIAS = !defines.ANTIALIAS;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n // Textures\r\n if (defines._areTexturesDirty) {\r\n defines._needUVs = false;\r\n if (scene.texturesEnabled) {\r\n if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {\r\n if (!this._opacityTexture.isReady()) {\r\n return false;\r\n } else {\r\n defines._needUVs = true;\r\n defines.OPACITY = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, false, this.fogEnabled, false, defines, undefined, undefined, undefined, this._isVertexOutputInvariant);\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, scene.getEngine(), this, defines, !!useInstances);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n // Attributes\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n const uniforms = [\r\n \"projection\",\r\n \"mainColor\",\r\n \"lineColor\",\r\n \"gridControl\",\r\n \"gridOffset\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"world\",\r\n \"view\",\r\n \"opacityMatrix\",\r\n \"vOpacityInfos\",\r\n \"visibility\",\r\n \"logarithmicDepthConstant\",\r\n ];\r\n // Defines\r\n const join = defines.toString();\r\n AddClipPlaneUniforms(uniforms);\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n \"grid\",\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [\"Scene\"],\r\n samplers: [\"opacitySampler\"],\r\n defines: join,\r\n fallbacks: null,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"./wgsl/grid.vertex\"), import(\"./wgsl/grid.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"./grid.vertex\"), import(\"./grid.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n },\r\n },\r\n scene.getEngine()\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = !!useInstances;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GridMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n this._activeEffect.setFloat(\"visibility\", mesh.visibility);\r\n\r\n // Matrices\r\n if (!defines.INSTANCES || defines.THIN_INSTANCE) {\r\n this.bindOnlyWorldMatrix(world);\r\n }\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n\r\n // Uniforms\r\n if (this._mustRebind(scene, effect, subMesh)) {\r\n this._activeEffect.setColor3(\"mainColor\", this.mainColor);\r\n this._activeEffect.setColor3(\"lineColor\", this.lineColor);\r\n\r\n this._activeEffect.setVector3(\"gridOffset\", this.gridOffset);\r\n\r\n this._gridControl.x = this.gridRatio;\r\n this._gridControl.y = Math.round(this.majorUnitFrequency);\r\n this._gridControl.z = this.minorUnitVisibility;\r\n this._gridControl.w = this.opacity;\r\n this._activeEffect.setVector4(\"gridControl\", this._gridControl);\r\n\r\n if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {\r\n this._activeEffect.setTexture(\"opacitySampler\", this._opacityTexture);\r\n this._activeEffect.setFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);\r\n this._activeEffect.setMatrix(\"opacityMatrix\", this._opacityTexture.getTextureMatrix());\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n // Log. depth\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n }\r\n // Fog\r\n BindFogParameters(scene, mesh, this._activeEffect);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Dispose the material and its associated resources.\r\n * @param forceDisposeEffect will also dispose the used effect when true\r\n */\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): GridMaterial {\r\n return SerializationHelper.Clone(() => new GridMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GridMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"GridMaterial\";\r\n }\r\n\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GridMaterial {\r\n return SerializationHelper.Parse(() => new GridMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GridMaterial\", GridMaterial);\r\n"]}
1
+ {"version":3,"file":"gridMaterial.js","sourceRoot":"","sources":["../../../../dev/materials/src/grid/gridMaterial.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9H,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAe,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,EAC7B,2BAA2B,EAC3B,iCAAiC,EACjC,qBAAqB,GACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAE7F,MAAM,mBAAoB,SAAQ,eAAe;IAyB7C;QACI,KAAK,EAAE,CAAC;QAzBL,cAAS,GAAG,KAAK,CAAC;QAClB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,YAAO,GAAG,KAAK,CAAC;QAChB,cAAS,GAAG,KAAK,CAAC;QAClB,eAAU,GAAG,KAAK,CAAC;QACnB,QAAG,GAAG,KAAK,CAAC;QACZ,qBAAgB,GAAG,KAAK,CAAC;QACzB,aAAQ,GAAG,KAAK,CAAC;QACjB,QAAG,GAAG,KAAK,CAAC;QACZ,QAAG,GAAG,KAAK,CAAC;QACZ,cAAS,GAAG,KAAK,CAAC;QAClB,mBAAc,GAAG,KAAK,CAAC;QACvB,+BAA0B,GAAG,KAAK,CAAC;QACnC,wBAAmB,GAAG,KAAK,CAAC;QAC5B,qBAAgB,GAAG,KAAK,CAAC;QACzB,gBAAW,GAAG,KAAK,CAAC;QACpB,iBAAY,GAAG,KAAK,CAAC;QACrB,qBAAgB,GAAG,KAAK,CAAC;QACzB,kBAAa,GAAG,KAAK,CAAC;QAIzB,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IAiD1C;;;OAGG;IAEH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IACD,IAAW,cAAc,CAAC,KAAuB;QAC7C,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACxC,CAAC;IAiCD;;;;;OAKG;IAEH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACxC,CAAC;IAgCD;;;;;OAKG;IACH,YAAY,IAAY,EAAE,KAAa,EAAE,SAAS,GAAG,KAAK;QACtD,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAvJ7C;;WAEG;QAEI,cAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAElC;;WAEG;QAEI,cAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAEjC;;WAEG;QAEI,cAAS,GAAG,GAAG,CAAC;QAEvB;;WAEG;QAEI,eAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEnC;;WAEG;QAEI,uBAAkB,GAAG,EAAE,CAAC;QAE/B;;WAEG;QAEI,wBAAmB,GAAG,IAAI,CAAC;QAElC;;WAEG;QAEI,YAAO,GAAG,GAAG,CAAC;QAErB;;WAEG;QAEI,cAAS,GAAG,IAAI,CAAC;QAiBhB,oBAAe,GAAqB,IAAI,CAAC;QAEjD;;WAEG;QAEI,kBAAa,GAAY,KAAK,CAAC;QAEtC;;WAEG;QAEI,mBAAc,GAAW,KAAK,CAAC;QAEtC;;WAEG;QAEI,gBAAW,GAAW,CAAC,CAAC;QAE/B;;WAEG;QAEI,mBAAc,GAAY,KAAK,CAAC;QAEvC;;WAEG;QAEI,oBAAe,GAAY,KAAK,CAAC;QAoBhC,eAAU,GAAG,KAAK,CAAC;QAE3B;;WAEG;QAEI,0BAAqB,GAAW,GAAG,CAAC;QAE3C;;WAEG;QAEI,qBAAgB,GAAG,KAAK,CAAC;QAEhC;;WAEG;QAEI,eAAU,GAAG,KAAK,CAAC;QAUlB,iBAAY,GAAY,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrH,kBAAa,GAAY,IAAI,OAAO,EAAE,CAAC;QAYvC,mBAAc,GAAG,KAAK,CAAC;IAF/B,CAAC;IAID;;OAEG;IACa,iBAAiB;QAC7B,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5G,CAAC;IAEe,wBAAwB,CAAC,IAAkB;QACvD,OAAO,IAAI,CAAC,UAAU,GAAG,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7D,CAAC;IAEe,iBAAiB,CAAC,IAAkB,EAAE,OAAgB,EAAE,YAAsB;QAC1F,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;QAEzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,mBAAmB,IAAI,WAAW,CAAC,4BAA4B,KAAK,YAAY,EAAE,CAAC;gBACrH,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAwB,OAAO,CAAC,eAAe,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YACpC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpD,OAAO,CAAC,gBAAgB,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACrD,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YACrC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;QACtD,IAAI,OAAO,CAAC,gBAAgB,KAAK,eAAe,EAAE,CAAC;YAC/C,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;YAC3C,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,WAAW;QACX,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;YACzB,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,eAAe,IAAI,aAAa,CAAC,qBAAqB,EAAE,CAAC;oBAC9D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;wBAClC,OAAO,KAAK,CAAC;oBACjB,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;wBACxB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC3B,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEtK,kDAAkD;QAClD,iCAAiC,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QAE3F,qBAAqB;QACrB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAE5B,aAAa;YACb,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YAErE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,CAAC,0BAA0B,GAAG,KAAK,CAAC,4BAA4B,CAAC,kBAAkB,CAAC;YAE3F,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG;gBACb,YAAY;gBACZ,WAAW;gBACX,WAAW;gBACX,aAAa;gBACb,YAAY;gBACZ,WAAW;gBACX,WAAW;gBACX,OAAO;gBACP,MAAM;gBACN,eAAe;gBACf,eAAe;gBACf,YAAY;gBACZ,0BAA0B;gBAC1B,uBAAuB;aAC1B,CAAC;YACF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC5E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YACD,UAAU;YACV,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,CAAC,SAAS,CACb,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAC1B,MAAM,EACN;gBACI,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,QAAQ;gBACvB,mBAAmB,EAAE,CAAC,OAAO,CAAC;gBAC9B,QAAQ,EAAE,CAAC,gBAAgB,CAAC;gBAC5B,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,cAAc,EAAE,IAAI,CAAC,eAAe;gBACpC,yBAAyB,EAAE,IAAI,CAAC,cAAc;oBAC1C,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,KAAK,IAAI,EAAE;wBACP,IAAI,IAAI,CAAC,cAAc,gCAAwB,EAAE,CAAC;4BAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;wBACtF,CAAC;6BAAM,CAAC;4BACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;wBAC5E,CAAC;wBAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC/B,CAAC;aACV,EACD,KAAK,CAAC,SAAS,EAAE,CACpB,EACD,OAAO,EACP,IAAI,CAAC,gBAAgB,CACxB,CAAC;QACN,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,4BAA4B,GAAG,CAAC,CAAC,YAAY,CAAC;QAE1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,cAAc,CAAC,KAAa,EAAE,IAAU,EAAE,OAAgB;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAwB,OAAO,CAAC,eAAe,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAE5B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3D,WAAW;QACX,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9C,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEhC,WAAW;QACX,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAE1D,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAE7D,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEjF,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACvG,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,IAAI,aAAa,CAAC,qBAAqB,EAAE,CAAC;gBAC9D,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBACtE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBACjH,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC3F,CAAC;YAED,aAAa;YACb,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACnC,aAAa;YACb,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QACD,MAAM;QACN,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEnD,gDAAgD;QAChD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;YAC/B,IAAI,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;gBAChD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACa,OAAO,CAAC,kBAA4B;QAChD,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,IAAY;QAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1F,CAAC;IAEe,SAAS;QACrB,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9C,mBAAmB,CAAC,UAAU,GAAG,sBAAsB,CAAC;QACxD,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAEe,YAAY;QACxB,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAU,KAAK,CAAC,MAAW,EAAE,KAAY,EAAE,OAAe;QACnE,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;CACJ;AA5bU;IADN,iBAAiB,EAAE;+CACc;AAM3B;IADN,iBAAiB,EAAE;+CACa;AAM1B;IADN,SAAS,EAAE;+CACW;AAMhB;IADN,kBAAkB,EAAE;gDACc;AAM5B;IADN,SAAS,EAAE;wDACmB;AAMxB;IADN,SAAS,EAAE;yDACsB;AAM3B;IADN,SAAS,EAAE;6CACS;AAMd;IADN,SAAS,EAAE;+CACY;AAOxB;IADC,iBAAiB,EAAE;kDAGnB;AAcM;IADN,SAAS,EAAE;mDAC0B;AAM/B;IADN,SAAS,EAAE;oDAC0B;AAM/B;IADN,SAAS,EAAE;iDACmB;AAMxB;IADN,SAAS,EAAE;oDAC2B;AAMhC;IADN,SAAS,EAAE;qDAC4B;AASxC;IADC,SAAS,EAAE;6CAGX;AAeM;IADN,SAAS,EAAE;2DAC+B;AAMpC;IADN,SAAS,EAAE;sDACoB;AAMzB;IADN,SAAS,EAAE;gDACc;AAGlB;IADP,kBAAkB,CAAC,gBAAgB,CAAC;qDACA;AAK9B;IADN,gBAAgB,CAAC,kCAAkC,CAAC;oDAClB;AAuTvC,aAAa,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serializeAsTexture, serialize, expandToProperty, serializeAsColor3, serializeAsVector3 } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector4, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { MaterialFlags } from \"core/Materials/materialFlags\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n} from \"core/Materials/materialHelper.functions\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"core/Materials/clipPlaneMaterialHelper\";\r\n\r\nclass GridMaterialDefines extends MaterialDefines {\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public OPACITY = false;\r\n public ANTIALIAS = false;\r\n public LINES_ONLY = false;\r\n public FOG = false;\r\n public PREMULTIPLYALPHA = false;\r\n public MAX_LINE = false;\r\n public UV1 = false;\r\n public UV2 = false;\r\n public INSTANCES = false;\r\n public THIN_INSTANCES = false;\r\n public IMAGEPROCESSINGPOSTPROCESS = false;\r\n public SKIPFINALCOLORCLAMP = false;\r\n public LOGARITHMICDEPTH = false;\r\n public MULTI_SCALE = false;\r\n public HORIZON_FADE = false;\r\n public BELOW_LINE_COLOR = false;\r\n public ORIGIN_MARKER = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * The grid materials allows you to wrap any shape with a grid.\r\n * Colors are customizable.\r\n */\r\nexport class GridMaterial extends PushMaterial {\r\n /**\r\n * Main color of the grid (e.g. between lines)\r\n */\r\n @serializeAsColor3()\r\n public mainColor = Color3.Black();\r\n\r\n /**\r\n * Color of the grid lines.\r\n */\r\n @serializeAsColor3()\r\n public lineColor = Color3.Teal();\r\n\r\n /**\r\n * The scale of the grid compared to unit.\r\n */\r\n @serialize()\r\n public gridRatio = 1.0;\r\n\r\n /**\r\n * Allows setting an offset for the grid lines.\r\n */\r\n @serializeAsVector3()\r\n public gridOffset = Vector3.Zero();\r\n\r\n /**\r\n * The frequency of thicker lines.\r\n */\r\n @serialize()\r\n public majorUnitFrequency = 10;\r\n\r\n /**\r\n * The visibility of minor units in the grid.\r\n */\r\n @serialize()\r\n public minorUnitVisibility = 0.33;\r\n\r\n /**\r\n * Overall mesh opacity. In linesOnly mode this also scales the maximum line alpha.\r\n */\r\n @serialize()\r\n public opacity = 1.0;\r\n\r\n /**\r\n * Whether to antialias the grid\r\n */\r\n @serialize()\r\n public antialias = true;\r\n\r\n /**\r\n * Color of grid lines when the camera is below the surface.\r\n * When set, lineColor acts as the above-surface color.\r\n */\r\n @serializeAsColor3()\r\n public get belowLineColor(): Nullable<Color3> {\r\n return this._belowLineColor;\r\n }\r\n public set belowLineColor(value: Nullable<Color3>) {\r\n if (this._belowLineColor === value) {\r\n return;\r\n }\r\n this._belowLineColor = value;\r\n this._markAllSubMeshesAsMiscDirty();\r\n }\r\n private _belowLineColor: Nullable<Color3> = null;\r\n\r\n /**\r\n * Enable multi-scale logarithmic grid LOD. Number of octaves is controlled by gridOctaves.\r\n */\r\n @serialize()\r\n public useMultiScale: boolean = false;\r\n\r\n /**\r\n * World-unit spacing of the finest octave. Default 0.001.\r\n */\r\n @serialize()\r\n public minGridSpacing: number = 0.001;\r\n\r\n /**\r\n * Number of logarithmic octaves rendered (1–8). Default 4.\r\n */\r\n @serialize()\r\n public gridOctaves: number = 4;\r\n\r\n /**\r\n * Enable camera-distance-aware horizon (grazing-angle) fade.\r\n */\r\n @serialize()\r\n public useHorizonFade: boolean = false;\r\n\r\n /**\r\n * Render an ultra-fine crosshair at the world origin.\r\n */\r\n @serialize()\r\n public useOriginMarker: boolean = false;\r\n\r\n /**\r\n * When true, only grid lines are visible — non-grid pixels are discarded.\r\n * Puts the material in the alpha-blend queue and enables a depth pre-pass so grid lines\r\n * correctly occlude translucent objects (e.g. Gaussian splats). Set mesh.alphaIndex to a\r\n * value lower than other transparent objects so the depth pre-pass fires first.\r\n */\r\n @serialize()\r\n public get linesOnly(): boolean {\r\n return this._linesOnly;\r\n }\r\n public set linesOnly(value: boolean) {\r\n if (this._linesOnly === value) {\r\n return;\r\n }\r\n this._linesOnly = value;\r\n this.needDepthPrePass = value;\r\n this._markAllSubMeshesAsMiscDirty();\r\n }\r\n private _linesOnly = false;\r\n\r\n /**\r\n * Scales grid line width. Values \\> 1 produce thicker lines. Default 1.0.\r\n */\r\n @serialize()\r\n public gridThicknessModifier: number = 1.0;\r\n\r\n /**\r\n * Determine RBG output is premultiplied by alpha value.\r\n */\r\n @serialize()\r\n public preMultiplyAlpha = false;\r\n\r\n /**\r\n * Determines if the max line value will be used instead of the sum wherever grid lines intersect.\r\n */\r\n @serialize()\r\n public useMaxLine = false;\r\n\r\n @serializeAsTexture(\"opacityTexture\")\r\n private _opacityTexture: BaseTexture;\r\n /**\r\n * Texture to define opacity of the grid\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public opacityTexture: BaseTexture;\r\n\r\n private _gridControl: Vector4 = new Vector4(this.gridRatio, this.majorUnitFrequency, this.minorUnitVisibility, this.opacity);\r\n private _viewportSize: Vector2 = new Vector2();\r\n\r\n /**\r\n * constructor\r\n * @param name The name given to the material in order to identify it afterwards.\r\n * @param scene The scene the material is used in.\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(name: string, scene?: Scene, forceGLSL = false) {\r\n super(name, scene, undefined, forceGLSL);\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n /**\r\n * @returns whether or not the grid requires alpha blending.\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return this.linesOnly || this.opacity < 1.0 || (this._opacityTexture && this._opacityTexture.isReady());\r\n }\r\n\r\n public override needAlphaBlendingForMesh(mesh: AbstractMesh): boolean {\r\n return mesh.visibility < 1.0 || this.needAlphaBlending();\r\n }\r\n\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new GridMaterialDefines();\r\n }\r\n\r\n const defines = <GridMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n if (defines.LINES_ONLY !== this.linesOnly) {\r\n defines.LINES_ONLY = this.linesOnly;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.PREMULTIPLYALPHA != this.preMultiplyAlpha) {\r\n defines.PREMULTIPLYALPHA = !defines.PREMULTIPLYALPHA;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.MAX_LINE !== this.useMaxLine) {\r\n defines.MAX_LINE = !defines.MAX_LINE;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.ANTIALIAS !== this.antialias) {\r\n defines.ANTIALIAS = this.antialias;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.MULTI_SCALE !== this.useMultiScale) {\r\n defines.MULTI_SCALE = this.useMultiScale;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.HORIZON_FADE !== this.useHorizonFade) {\r\n defines.HORIZON_FADE = this.useHorizonFade;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n const wantsBelowColor = this._belowLineColor !== null;\r\n if (defines.BELOW_LINE_COLOR !== wantsBelowColor) {\r\n defines.BELOW_LINE_COLOR = wantsBelowColor;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (defines.ORIGIN_MARKER !== this.useOriginMarker) {\r\n defines.ORIGIN_MARKER = this.useOriginMarker;\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n // Textures\r\n if (defines._areTexturesDirty) {\r\n defines._needUVs = false;\r\n if (scene.texturesEnabled) {\r\n if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {\r\n if (!this._opacityTexture.isReady()) {\r\n return false;\r\n } else {\r\n defines._needUVs = true;\r\n defines.OPACITY = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, false, this.fogEnabled, false, defines, undefined, undefined, undefined, this._isVertexOutputInvariant);\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, scene.getEngine(), this, defines, !!useInstances);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n // Attributes\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n const uniforms = [\r\n \"projection\",\r\n \"mainColor\",\r\n \"lineColor\",\r\n \"gridControl\",\r\n \"gridOffset\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"world\",\r\n \"view\",\r\n \"opacityMatrix\",\r\n \"vOpacityInfos\",\r\n \"visibility\",\r\n \"logarithmicDepthConstant\",\r\n \"gridThicknessModifier\",\r\n ];\r\n if (defines.MULTI_SCALE) {\r\n uniforms.push(\"minGridSpacing\", \"gridOctaves\");\r\n }\r\n if (defines.HORIZON_FADE || defines.BELOW_LINE_COLOR || defines.ORIGIN_MARKER) {\r\n uniforms.push(\"cameraPosition\", \"viewportSize\");\r\n }\r\n if (defines.BELOW_LINE_COLOR) {\r\n uniforms.push(\"belowLineColor\");\r\n }\r\n // Defines\r\n const join = defines.toString();\r\n AddClipPlaneUniforms(uniforms);\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n \"grid\",\r\n {\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [\"Scene\"],\r\n samplers: [\"opacitySampler\"],\r\n defines: join,\r\n fallbacks: null,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"./wgsl/grid.vertex\"), import(\"./wgsl/grid.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"./grid.vertex\"), import(\"./grid.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n },\r\n },\r\n scene.getEngine()\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = !!useInstances;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GridMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n this._activeEffect.setFloat(\"visibility\", mesh.visibility);\r\n\r\n // Matrices\r\n if (!defines.INSTANCES || defines.THIN_INSTANCE) {\r\n this.bindOnlyWorldMatrix(world);\r\n }\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n\r\n // Uniforms\r\n if (this._mustRebind(scene, effect, subMesh)) {\r\n this._activeEffect.setColor3(\"mainColor\", this.mainColor);\r\n this._activeEffect.setColor3(\"lineColor\", this.lineColor);\r\n\r\n this._activeEffect.setVector3(\"gridOffset\", this.gridOffset);\r\n\r\n this._gridControl.x = this.gridRatio;\r\n this._gridControl.y = Math.round(this.majorUnitFrequency);\r\n this._gridControl.z = this.minorUnitVisibility;\r\n this._gridControl.w = this.opacity;\r\n this._activeEffect.setVector4(\"gridControl\", this._gridControl);\r\n this._activeEffect.setFloat(\"gridThicknessModifier\", this.gridThicknessModifier);\r\n\r\n if (defines.BELOW_LINE_COLOR && this._belowLineColor) {\r\n this._activeEffect.setColor3(\"belowLineColor\", this._belowLineColor);\r\n }\r\n\r\n if (defines.MULTI_SCALE) {\r\n this._activeEffect.setFloat(\"minGridSpacing\", this.minGridSpacing);\r\n this._activeEffect.setFloat(\"gridOctaves\", Math.max(1, Math.min(8, Math.round(this.gridOctaves))));\r\n }\r\n\r\n if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {\r\n this._activeEffect.setTexture(\"opacitySampler\", this._opacityTexture);\r\n this._activeEffect.setFloat2(\"vOpacityInfos\", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);\r\n this._activeEffect.setMatrix(\"opacityMatrix\", this._opacityTexture.getTextureMatrix());\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n // Log. depth\r\n if (this._useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n }\r\n // Fog\r\n BindFogParameters(scene, mesh, this._activeEffect);\r\n\r\n // Camera uniforms — must be updated every frame\r\n if (defines.HORIZON_FADE || defines.BELOW_LINE_COLOR || defines.ORIGIN_MARKER) {\r\n const cam = scene.activeCamera;\r\n if (cam) {\r\n this._activeEffect.setVector3(\"cameraPosition\", cam.globalPosition);\r\n const engine = scene.getEngine();\r\n this._viewportSize.x = engine.getRenderWidth();\r\n this._viewportSize.y = engine.getRenderHeight();\r\n this._activeEffect.setVector2(\"viewportSize\", this._viewportSize);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Dispose the material and its associated resources.\r\n * @param forceDisposeEffect will also dispose the used effect when true\r\n */\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): GridMaterial {\r\n return SerializationHelper.Clone(() => new GridMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GridMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"GridMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a grid material.\r\n * @param source the JSON data to parse\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new grid material\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GridMaterial {\r\n return SerializationHelper.Parse(() => new GridMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GridMaterial\", GridMaterial);\r\n"]}
@@ -10,7 +10,27 @@ import { imageProcessingCompatibilityWGSL } from "@babylonjs/core/ShadersWGSL/Sh
10
10
  const name = "gridPixelShader";
11
11
  const shader = `#define SQRT2 1.41421356
12
12
  #define PI 3.14159
13
- uniform visibility: f32;uniform mainColor: vec3f;uniform lineColor: vec3f;uniform gridControl: vec4f;uniform gridOffset: vec3f;varying vPosition: vec3f;varying vNormal: vec3f;
13
+ #define MAX_OCTAVES 8
14
+ #define LINE_WIDTH_SCREEN_FRACTION 0.004
15
+ #define HORIZON_FADE_EXPONENT 400.0
16
+ #define ORIGIN_MARKER_SPAN 10000000.0
17
+ #define ORIGIN_MARKER_WIDTH_SCALE 0.00000015
18
+ #define ORIGIN_MARKER_THRESHOLD 0.0001
19
+ #define TRANSPARENT_MIN_OPACITY 0.08
20
+ uniform visibility: f32;uniform mainColor: vec3f;uniform lineColor: vec3f;uniform gridControl: vec4f;uniform gridOffset: vec3f;uniform gridThicknessModifier: f32;
21
+ #ifdef MULTI_SCALE
22
+ uniform minGridSpacing: f32;uniform gridOctaves: f32;
23
+ #endif
24
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
25
+ uniform cameraPosition: vec3f;uniform viewportSize: vec2f;
26
+ #endif
27
+ #ifdef BELOW_LINE_COLOR
28
+ uniform belowLineColor: vec3f;
29
+ #endif
30
+ varying vPosition: vec3f;varying vNormal: vec3f;
31
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
32
+ varying vWorldPos: vec3f;
33
+ #endif
14
34
  #include<clipPlaneFragmentDeclaration>
15
35
  #include<logDepthDeclaration>
16
36
  #include<fogFragmentDeclaration>
@@ -29,37 +49,64 @@ if (abs(fractionPartOfPosition)<SQRT2/4.) {return 1.;}
29
49
  return 0.;
30
50
  #endif
31
51
  }
32
- fn contributionOnAxis(position: f32)->f32 {var differentialLength: f32=length( vec2f(dpdx(position),dpdy(position)));differentialLength=differentialLength*SQRT2;var result: f32=isPointOnLine(position,differentialLength);var dynamicVisibility: f32=getDynamicVisibility(position);result=result*dynamicVisibility;var anisotropicAttenuation: f32=getAnisotropicAttenuation(differentialLength);result=result*anisotropicAttenuation;return result;}
52
+ fn contributionOnAxis(position: f32,tcLineWidthCap: f32,thicknessModifier: f32)->f32 {let dPosDx: f32=dpdx(position);let dPosDy: f32=dpdy(position);var differentialLength: f32=length(vec2f(dPosDx,dPosDy))*SQRT2;if (tcLineWidthCap>0.0) {differentialLength=max(differentialLength,tcLineWidthCap);}
53
+ let lineWidth: f32=differentialLength*thicknessModifier;var result: f32=isPointOnLine(position,lineWidth);result=result*getDynamicVisibility(position);result=result*getAnisotropicAttenuation(differentialLength);return result;}
33
54
  fn normalImpactOnAxis(x: f32)->f32 {var normalImpact: f32=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}
34
55
  #define CUSTOM_FRAGMENT_DEFINITIONS
35
56
  @fragment
36
57
  fn main(input: FragmentInputs)->FragmentOutputs {
37
58
  #define CUSTOM_FRAGMENT_MAIN_BEGIN
38
59
  #include<clipPlaneFragment>
39
- var gridRatio: f32=uniforms.gridControl.x;var gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/gridRatio;var x: f32=contributionOnAxis(gridPos.x);var y: f32=contributionOnAxis(gridPos.y);var z: f32=contributionOnAxis(gridPos.z);var normal: vec3f=normalize(fragmentInputs.vNormal);x=x*normalImpactOnAxis(normal.x);y=y*normalImpactOnAxis(normal.y);z=z*normalImpactOnAxis(normal.z);
60
+ var normal: vec3f=normalize(fragmentInputs.vNormal);var horizonFade: f32=1.0;var tcLineWidthCap: f32=0.0;
61
+ #if defined(HORIZON_FADE) || defined(ORIGIN_MARKER)
62
+ var tc: f32=length(fragmentInputs.vWorldPos-uniforms.cameraPosition);
63
+ #ifdef HORIZON_FADE
64
+ tcLineWidthCap=LINE_WIDTH_SCREEN_FRACTION*tc/uniforms.viewportSize.y;let rd: vec3f=normalize(fragmentInputs.vWorldPos-uniforms.cameraPosition);if (abs(rd.y)>0.99) {horizonFade=1.0;} else {let flatRayDir: vec3f=normalize(vec3f(rd.x,0.0,rd.z));horizonFade=-pow(abs(dot(rd,flatRayDir)),HORIZON_FADE_EXPONENT)+1.0;}
65
+ #endif
66
+ #endif
67
+ var grid: f32=0.0;
68
+ #ifdef MULTI_SCALE
69
+ for (var i: i32=0; i<MAX_OCTAVES; i++) {if (i>=i32(uniforms.gridOctaves)) { break; }
70
+ let scale: f32=uniforms.minGridSpacing*pow(10.0,f32(i));let gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/scale;let gx: f32=contributionOnAxis(gridPos.x,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.x);let gy: f32=contributionOnAxis(gridPos.y,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.y);let gz: f32=contributionOnAxis(gridPos.z,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.z);
40
71
  #ifdef MAX_LINE
41
- var grid: f32=clamp(max(max(x,y),z),0.,1.);
72
+ grid=max(grid,clamp(max(max(gx,gy),gz),0.,1.));
42
73
  #else
43
- var grid: f32=clamp(x+y+z,0.,1.);
74
+ grid=max(grid,clamp(gx+gy+gz,0.,1.));
44
75
  #endif
45
- var color: vec4f=vec4f(mix(uniforms.mainColor,uniforms.lineColor,vec3f(grid)),1.0);
76
+ }
77
+ #else
78
+ let gridRatio: f32=uniforms.gridControl.x;let gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/gridRatio;let x: f32=contributionOnAxis(gridPos.x,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.x);let y: f32=contributionOnAxis(gridPos.y,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.y);let z: f32=contributionOnAxis(gridPos.z,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.z);
79
+ #ifdef MAX_LINE
80
+ grid=clamp(max(max(x,y),z),0.,1.);
81
+ #else
82
+ grid=clamp(x+y+z,0.,1.);
83
+ #endif
84
+ #endif
85
+ grid=grid*horizonFade;
86
+ #ifdef ORIGIN_MARKER
87
+ let tcOrigin: f32=ORIGIN_MARKER_WIDTH_SCALE*tc/uniforms.viewportSize.y;let ox: f32=contributionOnAxis(fragmentInputs.vWorldPos.x/ORIGIN_MARKER_SPAN,tcOrigin,uniforms.gridThicknessModifier);let oz: f32=contributionOnAxis(fragmentInputs.vWorldPos.z/ORIGIN_MARKER_SPAN,tcOrigin,uniforms.gridThicknessModifier);let originMask: f32=clamp(ox+oz,0.0,1.0)*horizonFade;if (originMask>ORIGIN_MARKER_THRESHOLD) { grid=originMask; }
88
+ #endif
89
+ #ifdef BELOW_LINE_COLOR
90
+ let belowSurface: bool=uniforms.cameraPosition.y<fragmentInputs.vWorldPos.y;let effectiveLineColor: vec3f=select(uniforms.lineColor,uniforms.belowLineColor,belowSurface);
91
+ #else
92
+ let effectiveLineColor: vec3f=uniforms.lineColor;
93
+ #endif
94
+ var color: vec4f=vec4f(mix(uniforms.mainColor,effectiveLineColor,vec3f(grid)),1.0);
46
95
  #ifdef FOG
47
96
  #include<fogFragment>
48
97
  #endif
49
- var opacity: f32=1.0;
50
- #ifdef TRANSPARENT
51
- opacity=clamp(grid,0.08,uniforms.gridControl.w*grid);
98
+ var opacity: f32=uniforms.gridControl.w;
99
+ #ifdef LINES_ONLY
100
+ if (grid<0.01) { discard; }
101
+ opacity=clamp(grid,TRANSPARENT_MIN_OPACITY,uniforms.gridControl.w*grid);
52
102
  #endif
53
103
  #ifdef OPACITY
54
104
  opacity=opacity*textureSample(opacitySampler,opacitySamplerSampler,fragmentInputs.vOpacityUV).a;
55
105
  #endif
56
- fragmentOutputs.color= vec4f(color.rgb,opacity*uniforms.visibility);
57
- #ifdef TRANSPARENT
106
+ fragmentOutputs.color=vec4f(color.rgb,opacity*uniforms.visibility);
58
107
  #ifdef PREMULTIPLYALPHA
59
108
  fragmentOutputs.color=vec4f(fragmentOutputs.color.rgb*opacity,fragmentOutputs.color.a);
60
109
  #endif
61
- #else
62
- #endif
63
110
  #include<logDepthFragment>
64
111
  #include<imageProcessingCompatibility>
65
112
  #define CUSTOM_FRAGMENT_MAIN_END
@@ -1 +1 @@
1
- {"version":3,"file":"grid.fragment.js","sourceRoot":"","sources":["../../../../../dev/materials/src/grid/wgsl/grid.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAEhH,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,gCAAgC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB,EAAE,gCAAgC,CAAC,CAAC;AACzM,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\nimport { clipPlaneFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragment\";\nimport { fogFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragment\";\nimport { logDepthFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthFragment\";\nimport { imageProcessingCompatibilityWGSL } from \"core/ShadersWGSL/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"gridPixelShader\";\nconst shader = `#define SQRT2 1.41421356\n#define PI 3.14159\nuniform visibility: f32;uniform mainColor: vec3f;uniform lineColor: vec3f;uniform gridControl: vec4f;uniform gridOffset: vec3f;varying vPosition: vec3f;varying vNormal: vec3f;\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#ifdef OPACITY\nvarying vOpacityUV: vec2f;var opacitySamplerSampler: sampler;var opacitySampler: texture_2d<f32>;uniform vOpacityInfos: vec2f;\n#endif\nfn getDynamicVisibility(position: f32)->f32 {var majorGridFrequency: f32=uniforms.gridControl.y;if (floor(position+0.5)==floor(position/majorGridFrequency+0.5)*majorGridFrequency)\n{return 1.0;}\nreturn uniforms.gridControl.z;}\nfn getAnisotropicAttenuation(differentialLength: f32)->f32 {let maxNumberOfLines: f32=10.0;return clamp(1.0/(differentialLength+1.0)-1.0/maxNumberOfLines,0.0,1.0);}\nfn isPointOnLine(position: f32,differentialLength: f32)->f32 {var fractionPartOfPosition: f32=position-floor(position+0.5);fractionPartOfPosition=fractionPartOfPosition/differentialLength;\n#ifdef ANTIALIAS\nfractionPartOfPosition=clamp(fractionPartOfPosition,-1.,1.);var result: f32=0.5+0.5*cos(fractionPartOfPosition*PI);return result;\n#else\nif (abs(fractionPartOfPosition)<SQRT2/4.) {return 1.;}\nreturn 0.;\n#endif\n}\nfn contributionOnAxis(position: f32)->f32 {var differentialLength: f32=length( vec2f(dpdx(position),dpdy(position)));differentialLength=differentialLength*SQRT2;var result: f32=isPointOnLine(position,differentialLength);var dynamicVisibility: f32=getDynamicVisibility(position);result=result*dynamicVisibility;var anisotropicAttenuation: f32=getAnisotropicAttenuation(differentialLength);result=result*anisotropicAttenuation;return result;}\nfn normalImpactOnAxis(x: f32)->f32 {var normalImpact: f32=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}\n#define CUSTOM_FRAGMENT_DEFINITIONS\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvar gridRatio: f32=uniforms.gridControl.x;var gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/gridRatio;var x: f32=contributionOnAxis(gridPos.x);var y: f32=contributionOnAxis(gridPos.y);var z: f32=contributionOnAxis(gridPos.z);var normal: vec3f=normalize(fragmentInputs.vNormal);x=x*normalImpactOnAxis(normal.x);y=y*normalImpactOnAxis(normal.y);z=z*normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\nvar grid: f32=clamp(max(max(x,y),z),0.,1.);\n#else\nvar grid: f32=clamp(x+y+z,0.,1.);\n#endif\nvar color: vec4f=vec4f(mix(uniforms.mainColor,uniforms.lineColor,vec3f(grid)),1.0);\n#ifdef FOG\n#include<fogFragment>\n#endif\nvar opacity: f32=1.0;\n#ifdef TRANSPARENT\nopacity=clamp(grid,0.08,uniforms.gridControl.w*grid);\n#endif\n#ifdef OPACITY\nopacity=opacity*textureSample(opacitySampler,opacitySamplerSampler,fragmentInputs.vOpacityUV).a;\n#endif\nfragmentOutputs.color= vec4f(color.rgb,opacity*uniforms.visibility);\n#ifdef TRANSPARENT\n#ifdef PREMULTIPLYALPHA\nfragmentOutputs.color=vec4f(fragmentOutputs.color.rgb*opacity,fragmentOutputs.color.a);\n#endif\n#else\n#endif\n#include<logDepthFragment>\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclarationWGSL, logDepthDeclarationWGSL, fogFragmentDeclarationWGSL, clipPlaneFragmentWGSL, fogFragmentWGSL, logDepthFragmentWGSL, imageProcessingCompatibilityWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridPixelShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"grid.fragment.js","sourceRoot":"","sources":["../../../../../dev/materials/src/grid/wgsl/grid.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kDAAkD,CAAC;AACxF,OAAO,EAAE,gCAAgC,EAAE,MAAM,8DAA8D,CAAC;AAEhH,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,gCAAgC,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB,EAAE,gCAAgC,CAAC,CAAC;AACzM,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { clipPlaneFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogFragmentDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\nimport { clipPlaneFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneFragment\";\nimport { fogFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/fogFragment\";\nimport { logDepthFragmentWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthFragment\";\nimport { imageProcessingCompatibilityWGSL } from \"core/ShadersWGSL/ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"gridPixelShader\";\nconst shader = `#define SQRT2 1.41421356\n#define PI 3.14159\n#define MAX_OCTAVES 8\n#define LINE_WIDTH_SCREEN_FRACTION 0.004\n#define HORIZON_FADE_EXPONENT 400.0\n#define ORIGIN_MARKER_SPAN 10000000.0\n#define ORIGIN_MARKER_WIDTH_SCALE 0.00000015\n#define ORIGIN_MARKER_THRESHOLD 0.0001\n#define TRANSPARENT_MIN_OPACITY 0.08\nuniform visibility: f32;uniform mainColor: vec3f;uniform lineColor: vec3f;uniform gridControl: vec4f;uniform gridOffset: vec3f;uniform gridThicknessModifier: f32;\n#ifdef MULTI_SCALE\nuniform minGridSpacing: f32;uniform gridOctaves: f32;\n#endif\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nuniform cameraPosition: vec3f;uniform viewportSize: vec2f;\n#endif\n#ifdef BELOW_LINE_COLOR\nuniform belowLineColor: vec3f;\n#endif\nvarying vPosition: vec3f;varying vNormal: vec3f;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvarying vWorldPos: vec3f;\n#endif\n#include<clipPlaneFragmentDeclaration>\n#include<logDepthDeclaration>\n#include<fogFragmentDeclaration>\n#ifdef OPACITY\nvarying vOpacityUV: vec2f;var opacitySamplerSampler: sampler;var opacitySampler: texture_2d<f32>;uniform vOpacityInfos: vec2f;\n#endif\nfn getDynamicVisibility(position: f32)->f32 {var majorGridFrequency: f32=uniforms.gridControl.y;if (floor(position+0.5)==floor(position/majorGridFrequency+0.5)*majorGridFrequency)\n{return 1.0;}\nreturn uniforms.gridControl.z;}\nfn getAnisotropicAttenuation(differentialLength: f32)->f32 {let maxNumberOfLines: f32=10.0;return clamp(1.0/(differentialLength+1.0)-1.0/maxNumberOfLines,0.0,1.0);}\nfn isPointOnLine(position: f32,differentialLength: f32)->f32 {var fractionPartOfPosition: f32=position-floor(position+0.5);fractionPartOfPosition=fractionPartOfPosition/differentialLength;\n#ifdef ANTIALIAS\nfractionPartOfPosition=clamp(fractionPartOfPosition,-1.,1.);var result: f32=0.5+0.5*cos(fractionPartOfPosition*PI);return result;\n#else\nif (abs(fractionPartOfPosition)<SQRT2/4.) {return 1.;}\nreturn 0.;\n#endif\n}\nfn contributionOnAxis(position: f32,tcLineWidthCap: f32,thicknessModifier: f32)->f32 {let dPosDx: f32=dpdx(position);let dPosDy: f32=dpdy(position);var differentialLength: f32=length(vec2f(dPosDx,dPosDy))*SQRT2;if (tcLineWidthCap>0.0) {differentialLength=max(differentialLength,tcLineWidthCap);}\nlet lineWidth: f32=differentialLength*thicknessModifier;var result: f32=isPointOnLine(position,lineWidth);result=result*getDynamicVisibility(position);result=result*getAnisotropicAttenuation(differentialLength);return result;}\nfn normalImpactOnAxis(x: f32)->f32 {var normalImpact: f32=clamp(1.0-3.0*abs(x*x*x),0.0,1.0);return normalImpact;}\n#define CUSTOM_FRAGMENT_DEFINITIONS\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\n#include<clipPlaneFragment>\nvar normal: vec3f=normalize(fragmentInputs.vNormal);var horizonFade: f32=1.0;var tcLineWidthCap: f32=0.0;\n#if defined(HORIZON_FADE) || defined(ORIGIN_MARKER)\nvar tc: f32=length(fragmentInputs.vWorldPos-uniforms.cameraPosition);\n#ifdef HORIZON_FADE\ntcLineWidthCap=LINE_WIDTH_SCREEN_FRACTION*tc/uniforms.viewportSize.y;let rd: vec3f=normalize(fragmentInputs.vWorldPos-uniforms.cameraPosition);if (abs(rd.y)>0.99) {horizonFade=1.0;} else {let flatRayDir: vec3f=normalize(vec3f(rd.x,0.0,rd.z));horizonFade=-pow(abs(dot(rd,flatRayDir)),HORIZON_FADE_EXPONENT)+1.0;}\n#endif\n#endif\nvar grid: f32=0.0;\n#ifdef MULTI_SCALE\nfor (var i: i32=0; i<MAX_OCTAVES; i++) {if (i>=i32(uniforms.gridOctaves)) { break; }\nlet scale: f32=uniforms.minGridSpacing*pow(10.0,f32(i));let gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/scale;let gx: f32=contributionOnAxis(gridPos.x,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.x);let gy: f32=contributionOnAxis(gridPos.y,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.y);let gz: f32=contributionOnAxis(gridPos.z,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\ngrid=max(grid,clamp(max(max(gx,gy),gz),0.,1.));\n#else\ngrid=max(grid,clamp(gx+gy+gz,0.,1.));\n#endif\n}\n#else\nlet gridRatio: f32=uniforms.gridControl.x;let gridPos: vec3f=(fragmentInputs.vPosition+uniforms.gridOffset.xyz)/gridRatio;let x: f32=contributionOnAxis(gridPos.x,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.x);let y: f32=contributionOnAxis(gridPos.y,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.y);let z: f32=contributionOnAxis(gridPos.z,tcLineWidthCap,uniforms.gridThicknessModifier)*normalImpactOnAxis(normal.z);\n#ifdef MAX_LINE\ngrid=clamp(max(max(x,y),z),0.,1.);\n#else\ngrid=clamp(x+y+z,0.,1.);\n#endif\n#endif\ngrid=grid*horizonFade;\n#ifdef ORIGIN_MARKER\nlet tcOrigin: f32=ORIGIN_MARKER_WIDTH_SCALE*tc/uniforms.viewportSize.y;let ox: f32=contributionOnAxis(fragmentInputs.vWorldPos.x/ORIGIN_MARKER_SPAN,tcOrigin,uniforms.gridThicknessModifier);let oz: f32=contributionOnAxis(fragmentInputs.vWorldPos.z/ORIGIN_MARKER_SPAN,tcOrigin,uniforms.gridThicknessModifier);let originMask: f32=clamp(ox+oz,0.0,1.0)*horizonFade;if (originMask>ORIGIN_MARKER_THRESHOLD) { grid=originMask; }\n#endif\n#ifdef BELOW_LINE_COLOR\nlet belowSurface: bool=uniforms.cameraPosition.y<fragmentInputs.vWorldPos.y;let effectiveLineColor: vec3f=select(uniforms.lineColor,uniforms.belowLineColor,belowSurface);\n#else\nlet effectiveLineColor: vec3f=uniforms.lineColor;\n#endif\nvar color: vec4f=vec4f(mix(uniforms.mainColor,effectiveLineColor,vec3f(grid)),1.0);\n#ifdef FOG\n#include<fogFragment>\n#endif\nvar opacity: f32=uniforms.gridControl.w;\n#ifdef LINES_ONLY\nif (grid<0.01) { discard; }\nopacity=clamp(grid,TRANSPARENT_MIN_OPACITY,uniforms.gridControl.w*grid);\n#endif\n#ifdef OPACITY\nopacity=opacity*textureSample(opacitySampler,opacitySamplerSampler,fragmentInputs.vOpacityUV).a;\n#endif\nfragmentOutputs.color=vec4f(color.rgb,opacity*uniforms.visibility);\n#ifdef PREMULTIPLYALPHA\nfragmentOutputs.color=vec4f(fragmentOutputs.color.rgb*opacity,fragmentOutputs.color.a);\n#endif\n#include<logDepthFragment>\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [clipPlaneFragmentDeclarationWGSL, logDepthDeclarationWGSL, fogFragmentDeclarationWGSL, clipPlaneFragmentWGSL, fogFragmentWGSL, logDepthFragmentWGSL, imageProcessingCompatibilityWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridPixelShaderWGSL = { name, shader };\n"]}
@@ -20,6 +20,9 @@ attribute uv2: vec2f;
20
20
  #include<instancesDeclaration>
21
21
  #include<sceneUboDeclaration>
22
22
  varying vPosition: vec3f;varying vNormal: vec3f;
23
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
24
+ varying vWorldPos: vec3f;
25
+ #endif
23
26
  #include<logDepthDeclaration>
24
27
  #include<fogVertexDeclaration>
25
28
  #ifdef OPACITY
@@ -53,6 +56,9 @@ else
53
56
  #include<clipPlaneVertex>
54
57
  #include<logDepthVertex>
55
58
  vertexOutputs.vPosition=vertexInputs.position;vertexOutputs.vNormal=vertexInputs.normal;
59
+ #if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)
60
+ vertexOutputs.vWorldPos=worldPos.xyz;
61
+ #endif
56
62
  #define CUSTOM_VERTEX_MAIN_END
57
63
  }
58
64
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"grid.vertex.js","sourceRoot":"","sources":["../../../../../dev/materials/src/grid/wgsl/grid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAChG,OAAO,EAAE,8BAA8B,EAAE,MAAM,4DAA4D,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAEpF,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Cd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;AACrO,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { instancesDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/instancesDeclaration\";\nimport { sceneUboDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogVertexDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogVertexDeclaration\";\nimport { clipPlaneVertexDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\nimport { instancesVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/instancesVertex\";\nimport { fogVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/fogVertex\";\nimport { clipPlaneVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneVertex\";\nimport { logDepthVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthVertex\";\n\nconst name = \"gridVertexShader\";\nconst shader = `attribute position: vec3f;attribute normal: vec3f;\n#ifdef UV1\nattribute uv: vec2f;\n#endif\n#ifdef UV2\nattribute uv2: vec2f;\n#endif\n#include<instancesDeclaration>\n#include<sceneUboDeclaration>\nvarying vPosition: vec3f;varying vNormal: vec3f;\n#include<logDepthDeclaration>\n#include<fogVertexDeclaration>\n#ifdef OPACITY\nvarying vOpacityUV: vec2f;uniform opacityMatrix: mat4x4f;uniform vOpacityInfos: vec2f;\n#endif\n#include<clipPlaneVertexDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\n@vertex\nfn main(input : VertexInputs)->FragmentInputs {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include<instancesVertex>\nvar worldPos: vec4f=finalWorld* vec4f(vertexInputs.position,1.0);\n#include<fogVertex>\nvar cameraSpacePosition: vec4f=scene.view*worldPos;vertexOutputs.position=scene.projection*cameraSpacePosition;\n#ifdef OPACITY\n#ifndef UV1\nvar uv: vec2f= vec2f(0.,0.);\n#else\nvar uv: vec2f=vertexInputs.uv;\n#endif\n#ifndef UV2\nvar uv2: vec2f= vec2f(0.,0.);\n#else\nvar uv2: vec2f=vertexInputs.uv2;\n#endif\nif (uniforms.vOpacityInfos.x==0.)\n{vertexOutputs.vOpacityUV=(uniforms.opacityMatrix* vec4f(uv,1.0,0.0)).xy;}\nelse\n{vertexOutputs.vOpacityUV=(uniforms.opacityMatrix* vec4f(uv2,1.0,0.0)).xy;}\n#endif\n#include<clipPlaneVertex>\n#include<logDepthVertex>\nvertexOutputs.vPosition=vertexInputs.position;vertexOutputs.vNormal=vertexInputs.normal;\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [instancesDeclarationWGSL, sceneUboDeclarationWGSL, logDepthDeclarationWGSL, fogVertexDeclarationWGSL, clipPlaneVertexDeclarationWGSL, instancesVertexWGSL, fogVertexWGSL, clipPlaneVertexWGSL, logDepthVertexWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridVertexShaderWGSL = { name, shader };\n"]}
1
+ {"version":3,"file":"grid.vertex.js","sourceRoot":"","sources":["../../../../../dev/materials/src/grid/wgsl/grid.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAChG,OAAO,EAAE,8BAA8B,EAAE,MAAM,4DAA4D,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAEpF,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AACD,MAAM,QAAQ,GAAG,CAAC,wBAAwB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;AACrO,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,WAAW,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport { instancesDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/instancesDeclaration\";\nimport { sceneUboDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\nimport { logDepthDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthDeclaration\";\nimport { fogVertexDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/fogVertexDeclaration\";\nimport { clipPlaneVertexDeclarationWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\nimport { instancesVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/instancesVertex\";\nimport { fogVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/fogVertex\";\nimport { clipPlaneVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/clipPlaneVertex\";\nimport { logDepthVertexWGSL } from \"core/ShadersWGSL/ShadersInclude/logDepthVertex\";\n\nconst name = \"gridVertexShader\";\nconst shader = `attribute position: vec3f;attribute normal: vec3f;\n#ifdef UV1\nattribute uv: vec2f;\n#endif\n#ifdef UV2\nattribute uv2: vec2f;\n#endif\n#include<instancesDeclaration>\n#include<sceneUboDeclaration>\nvarying vPosition: vec3f;varying vNormal: vec3f;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvarying vWorldPos: vec3f;\n#endif\n#include<logDepthDeclaration>\n#include<fogVertexDeclaration>\n#ifdef OPACITY\nvarying vOpacityUV: vec2f;uniform opacityMatrix: mat4x4f;uniform vOpacityInfos: vec2f;\n#endif\n#include<clipPlaneVertexDeclaration>\n#define CUSTOM_VERTEX_DEFINITIONS\n@vertex\nfn main(input : VertexInputs)->FragmentInputs {\n#define CUSTOM_VERTEX_MAIN_BEGIN\n#include<instancesVertex>\nvar worldPos: vec4f=finalWorld* vec4f(vertexInputs.position,1.0);\n#include<fogVertex>\nvar cameraSpacePosition: vec4f=scene.view*worldPos;vertexOutputs.position=scene.projection*cameraSpacePosition;\n#ifdef OPACITY\n#ifndef UV1\nvar uv: vec2f= vec2f(0.,0.);\n#else\nvar uv: vec2f=vertexInputs.uv;\n#endif\n#ifndef UV2\nvar uv2: vec2f= vec2f(0.,0.);\n#else\nvar uv2: vec2f=vertexInputs.uv2;\n#endif\nif (uniforms.vOpacityInfos.x==0.)\n{vertexOutputs.vOpacityUV=(uniforms.opacityMatrix* vec4f(uv,1.0,0.0)).xy;}\nelse\n{vertexOutputs.vOpacityUV=(uniforms.opacityMatrix* vec4f(uv2,1.0,0.0)).xy;}\n#endif\n#include<clipPlaneVertex>\n#include<logDepthVertex>\nvertexOutputs.vPosition=vertexInputs.position;vertexOutputs.vNormal=vertexInputs.normal;\n#if defined(HORIZON_FADE) || defined(BELOW_LINE_COLOR) || defined(ORIGIN_MARKER)\nvertexOutputs.vWorldPos=worldPos.xyz;\n#endif\n#define CUSTOM_VERTEX_MAIN_END\n}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\nconst includes = [instancesDeclarationWGSL, sceneUboDeclarationWGSL, logDepthDeclarationWGSL, fogVertexDeclarationWGSL, clipPlaneVertexDeclarationWGSL, instancesVertexWGSL, fogVertexWGSL, clipPlaneVertexWGSL, logDepthVertexWGSL];\nfor (const inc of includes) {\n if (!ShaderStore.IncludesShadersStoreWGSL[inc.name]) {\n ShaderStore.IncludesShadersStoreWGSL[inc.name] = inc.shader;\n }\n}\n\n/** @internal */\nexport const gridVertexShaderWGSL = { name, shader };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/materials",
3
- "version": "9.9.2",
3
+ "version": "9.10.1",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "devDependencies": {
21
- "@babylonjs/core": "9.9.2",
21
+ "@babylonjs/core": "9.10.1",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@dev/materials": "^1.0.0"
24
24
  },