export declare const vertexShader = "\n  varying vec3 localPosition;\n  varying vec4 worldPosition;\n\n  uniform vec3 worldCamProjPosition;\n\tuniform vec3 worldPlanePosition;\n\tuniform float fadeDistance;\n\tuniform bool infiniteGrid;\n\tuniform bool followCamera;\n\n\tuniform int coord0;\n\tuniform int coord1;\n\tuniform int coord2;\n\n\tvoid main() {\n\t\tlocalPosition = vec3(\n\t\t  position[coord0],\n\t\t\tposition[coord1],\n\t\t\tposition[coord2]\n\t\t);\n\n\t\tif (infiniteGrid) {\n\t\t  localPosition *= 1.0 + fadeDistance;\n\t\t}\n\n\t\tworldPosition = modelMatrix * vec4(localPosition, 1.0);\n\t\tif (followCamera) {\n\t\t  worldPosition.xyz += (worldCamProjPosition - worldPlanePosition);\n      localPosition = (inverse(modelMatrix) * worldPosition).xyz;\n\t\t}\n\n\t\tgl_Position = projectionMatrix * viewMatrix * worldPosition;\n\t}\n";
export declare const fragmentShader = "\n  #define PI 3.141592653589793\n\n\tvarying vec3 localPosition;\n\tvarying vec4 worldPosition;\n\n\tuniform vec3 worldCamProjPosition;\n\tuniform float cellSize;\n\tuniform float sectionSize;\n\tuniform vec3 cellColor;\n\tuniform vec3 sectionColor;\n\tuniform float fadeDistance;\n\tuniform float fadeStrength;\n\tuniform vec3 fadeOrigin;\n\tuniform float cellThickness;\n\tuniform float sectionThickness;\n\tuniform vec3 backgroundColor;\n\tuniform float backgroundOpacity;\n\n\tuniform bool infiniteGrid;\n\n\tuniform int coord0;\n\tuniform int coord1;\n\tuniform int coord2;\n\n\t// 0 - default; 1 - lines; 2 - circles; 3 - polar\n\tuniform int gridType;\n\n  // lineGrid coord for lines\n\tuniform int lineGridCoord;\n\n\t// circlegrid max radius\n\tuniform float circleGridMaxRadius;\n\n\t// polar grid dividers\n\tuniform float polarCellDividers;\n\tuniform float polarSectionDividers;\n\n\tfloat getSquareGrid(float size, float thickness, vec3 localPos) {\n\t\tvec2 coord = localPos.xy / size;\n\n\t\tvec2 grid = abs(fract(coord - 0.5) - 0.5) / fwidth(coord);\n\t\tfloat line = min(grid.x, grid.y) + 1.0 - thickness;\n\n\t\treturn 1.0 - min(line, 1.0);\n\t}\n\n\tfloat getLinesGrid(float size, float thickness, vec3 localPos) {\n\t\tfloat coord = localPos[lineGridCoord] / size;\n\t\tfloat line = abs(fract(coord - 0.5) - 0.5) / fwidth(coord) - thickness * 0.2;\n\n\t\treturn 1.0 - min(line, 1.0);\n\t}\n\n\tfloat getRadiusMask(float radius) {\n\t\tif (infiniteGrid || circleGridMaxRadius <= 0.0) {\n\t\t\treturn 1.0;\n\t\t}\n\n\t\tfloat width = max(fwidth(radius), 0.0001);\n\t\treturn 1.0 - smoothstep(circleGridMaxRadius, circleGridMaxRadius + width, radius);\n\t}\n\n\tfloat getPolarDividerMask(float radius) {\n\t\tif (infiniteGrid || circleGridMaxRadius <= 0.0) {\n\t\t\treturn 1.0;\n\t\t}\n\n\t\tfloat width = max(fwidth(radius), 0.0001);\n\t\treturn 1.0 - smoothstep(circleGridMaxRadius - width, circleGridMaxRadius, radius);\n\t}\n\n\tfloat getCirclesGrid(float size, float thickness, float radius) {\n\t\tfloat coord = radius / size;\n\t\tfloat line = abs(fract(coord - 0.5) - 0.5) / fwidth(coord) - thickness * 0.2;\n\n\t\treturn 1.0 - min(line, 1.0);\n\t}\n\n\tfloat getPolarGrid(float size, float thickness, float polarDividers, vec3 localPos, float radius) {\n\t\tif (polarDividers <= 0.0) {\n\t\t\treturn getCirclesGrid(size, thickness, radius);\n\t\t}\n\n\t\tfloat rad = radius / size;\n\t\tvec2 coord = vec2(rad, atan(localPos.x, localPos.y) * polarDividers / PI) ;\n\n\t\tvec2 wrapped = vec2(coord.x, fract(coord.y / (2.0 * polarDividers)) * (2.0 * polarDividers));\n\t\tvec2 coordWidth = fwidth(coord);\n\t\tvec2 wrappedWidth = fwidth(wrapped);\n\t\tvec2 width = (coord.y < -polarDividers * 0.5 || coord.y > polarDividers * 0.5 ? wrappedWidth : coordWidth) * (1.+thickness*0.25);\n\n\t\t// Compute anti-aliased world-space grid lines\n\t\tvec2 grid = abs(fract(coord - 0.5) - 0.5) / width;\n\t\tfloat circle = 1.0 - min(grid.x, 1.0);\n\t\tfloat divider = 1.0 - min(grid.y, 1.0);\n\n\t\treturn max(circle, divider * getPolarDividerMask(radius));\n\t}\n\n\tvoid main() {\n\t\tfloat g1 = 0.0;\n\t\tfloat g2 = 0.0;\n\n\t\tvec3 localPos = vec3(localPosition[coord0], localPosition[coord1], localPosition[coord2]);\n\t\tfloat radiusMask = 1.0;\n\n\t\tif (gridType == 0) {\n\t\t\tg1 = getSquareGrid(cellSize, cellThickness, localPos);\n\t\t\tg2 = getSquareGrid(sectionSize, sectionThickness, localPos);\n\n\t\t} else if (gridType == 1) {\n\t\t\tg1 = getLinesGrid(cellSize, cellThickness, localPos);\n\t\t\tg2 = getLinesGrid(sectionSize, sectionThickness, localPos);\n\n\t\t} else if (gridType == 2) {\n\t\t\tfloat radius = length(localPos.xy);\n\t\t\tg1 = getCirclesGrid(cellSize, cellThickness, radius);\n\t\t\tg2 = getCirclesGrid(sectionSize, sectionThickness, radius);\n\t\t\tradiusMask = getRadiusMask(radius);\n\n\t\t} else if (gridType == 3) {\n\t\t\tfloat radius = length(localPos.xy);\n\t\t\tg1 = getPolarGrid(cellSize, cellThickness, polarCellDividers, localPos, radius);\n\t\t\tg2 = getPolarGrid(sectionSize, sectionThickness, polarSectionDividers, localPos, radius);\n\t\t\tradiusMask = getRadiusMask(radius);\n\t\t}\n\n\t\tfloat dist = distance(fadeOrigin, worldPosition.xyz);\n\t\tfloat d = 1.0 - min(dist / fadeDistance, 1.0);\n\t\tfloat fadeFactor = pow(d, fadeStrength) * 0.95;\n\n\t\tvec3 color = mix(cellColor, sectionColor, min(1.0, sectionThickness * g2));\n\n\t\tif (backgroundOpacity > 0.0) {\n\t\t\tfloat linesAlpha = clamp((g1 + g2) * fadeFactor, 0.0,1.0);\n\t\t\tvec3 finalColor = mix(backgroundColor, color, linesAlpha);\n\t\t\tfloat blendedAlpha = max(linesAlpha, backgroundOpacity * fadeFactor);\n\t\t\tgl_FragColor = vec4(finalColor, blendedAlpha);\n\n\t\t} else {\n\t\t\tgl_FragColor = vec4(color, (g1 + g2) * pow(d, fadeStrength));\n\t\t\tgl_FragColor.a = mix(0.75 * gl_FragColor.a, gl_FragColor.a, g2);\n\t\t}\n\n\t\tgl_FragColor.a *= radiusMask;\n\n\t\tif (gl_FragColor.a <= 0.0) {\n\t\t  discard;\n\t\t}\n\n\t\t#include <tonemapping_fragment>\n\t\t#include <colorspace_fragment>\n\t}\n";
