Revision control

++ // Copyright (C) 2024 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #define PI 3.1415926
++ float grid;
++ vec3 gridDiff;
++
++ float CalculateGrid(vec3 dist, vec3 normal, vec3 pos, vec3 worldPos)
++ {
++ //only show grid on intended normal plane
++ dist = clamp(dist + abs(normal), 0,1);
++ //dont show grid on category axes
++ dist = clamp(dist + abs(normal.zyx) *
++ vec3(float(xCategory), 0, float(zCategory)),
++ 0,1);
++ //dont show grid on bottom if gridOnTop
++ dist = clamp(dist + abs(normal.y) * step(worldPos.y, 0.5) * float(gridOnTop), 0, 1);
++
++ vec3 diffX = dFdx(worldPos);
++ vec3 diffY = dFdy(worldPos);
++ vec3 posDeriv = vec3(
++ length(vec2(diffX.x, diffY.x)),
++ length(vec2(diffX.y, diffY.y)),
++ length(vec2(diffX.z, diffY.z)));
++
++ vec3 lineWidth = vec3(gridWidth / 10.0f);
++ if (polar) {
++ //keep angle line width more constant
++ float angleWidth = lineWidth.x * min(scale.x, scale.z)/ PI;
++ lineWidth.x = angleWidth / max(pos.z, angleWidth);
++ lineWidth.z = lineWidth.z * min(scale.x, scale.z) ;
++ dist.x += step(1, pos.z);
++ dist.z += step(1.05,pos.z);
++ }
++ vec3 drawWidth = max(lineWidth, posDeriv);
++ vec3 lineAA = lineWidth * 0.5 + vec3(length(posDeriv)) * 1.5;
++ vec3 grid3 = smoothstep(min(drawWidth + lineAA, 1), drawWidth - lineAA, dist);
++ grid3 *= clamp(lineWidth.x / drawWidth.x, 0,1);
++
++ float linesXZ = mix(grid3.x, 1.0, grid3.z);
++ float lines = mix(linesXZ, 1.0, grid3.y) * float(gridVisible);
++
++ return lines;
++ }
++
++ void MAIN()
++ {
++ vec3 worldPos = VAR_WORLD_POSITION / rootScale;
++ vec3 pos = worldPos / (2 * scale) + 0.5;
++ if (polar) {
++ pos.xz = worldPos.xz / min(scale.x, scale.z);
++ float radius = sqrt((pos.x * pos.x) + (pos.z * pos.z));
++ float theta = fract((atan(pos.z, pos.x) / PI) / 2.0 + 0.5) + 0.75;
++ pos = vec3(theta , pos.y, radius);
++ }
++
++ vec3 dist = vec3(
++ 1 - texture(gridTex, vec2(pos.x, 0.1)).x,
++ 1 - texture(gridTex, vec2(pos.y, 0.1)).y,
++ 1 - texture(gridTex, vec2(pos.z, 0.1)).z
++ );
++ float gridLines = CalculateGrid(dist, NORMAL, pos, worldPos);
++
++
++ vec3 subDist = vec3(
++ 1 - texture(gridTex, vec2(pos.x, 0.9)).x,
++ 1 - texture(gridTex, vec2(pos.y, 0.9)).y,
++ 1 - texture(gridTex, vec2(pos.z, 0.9)).z
++ );
++
++ float subgridLines = CalculateGrid(subDist, NORMAL, pos, worldPos);
++
++ // combine grid and subgrid
++ float totalGrid = min(gridLines + subgridLines, 1);
++ float overlap = ceil(gridLines + subgridLines - 1);
++
++ vec3 subColor = mix(baseColor.rgb, subgridLineColor.rgb, min(subgridLines + overlap, 1));
++ vec3 gridColor = mix(subColor, gridLineColor.rgb, gridLines);
++
++ //keep grid factor const if background not visible
++ grid = mix(step(0.1, totalGrid), totalGrid, float(baseVisible));
++
++ float alpha = mix(float(baseVisible),float(gridVisible), totalGrid);
++ vec3 color = mix(baseColor.rgb, gridColor.rgb, grid);
++
++ //remove backround from top grid
++ if ((1 - totalGrid) * step(0.5, worldPos.y * abs(NORMAL.y) * float(gridOnTop)) > 0.3)
++ discard;
++
++ if (alpha < 0.8)
++ discard;
++
++ gridDiff = color.rgb;
++ BASE_COLOR = vec4(color.rgb, alpha);
++ EMISSIVE_COLOR = color.rgb * 0.3;
++ ROUGHNESS = 0.3;
++ }
++
++ void POST_PROCESS()
++ {
++ vec3 sumBack = vec3(DIFFUSE.rgb + SPECULAR + EMISSIVE);
++ vec3 sumGrid = gridDiff;
++ COLOR_SUM = vec4(mix(sumBack, sumGrid, grid), DIFFUSE.a);
++ }