图寻-隐藏街景车和指南针

去除图寻街景车。使用Shift+K切换指南针。移植自GeoNoCar by 2020, drparse。

目前为 2024-06-02 提交的版本。查看 最新版本

// ==UserScript==
// @name     TuxunNoCar
// @name:zh-CN   图寻-隐藏街景车和指南针
// @description  Redacts the car from tuxun, the Chinese geoguessr. Shift-K to toggle compass. Transplanted from GeoNoCar by 2020, drparse.
// @description:zh-CN 去除图寻街景车。使用Shift+K切换指南针。移植自GeoNoCar by 2020, drparse。
// @namespace    https://tuxun.fun/
// @version      0.1.3
// @author       strombooli
// @match        https://tuxun.fun/solo/*
// @exclude      https://tuxun.fun/replay-pano?*
// @exclude      https://tuxun.fun/wonders
// @exclude      https://tuxun.fun/random
// @grant    unsafeWindow
// @run-at       document-start
// @license      GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @noframes
// ==/UserScript==

(function() {
    'use strict';

    function injected() {
    const OPTIONS = {
        colorR: 0.5,
        colorG: 0.5,
        colorB: 0.5,
    };

    // If the script breaks, search devtools for "BINTULU" and replace these lines with the new one
    const vertexOld = "const float f=3.1415926;varying vec3 a;uniform vec4 b;attribute vec3 c;attribute vec2 d;uniform mat4 e;void main(){vec4 g=vec4(c,1);gl_Position=e*g;a=vec3(d.xy*b.xy+b.zw,1);a*=length(c);}";
    const fragOld = "precision highp float;const float h=3.1415926;varying vec3 a;uniform vec4 b;uniform float f;uniform sampler2D g;void main(){vec4 i=vec4(texture2DProj(g,a).rgb,f);gl_FragColor=i;}";

    const vertexNew = `
const float f=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
attribute vec3 c;
attribute vec2 d;
uniform mat4 e;
void main(){
    vec4 g=vec4(c,1);
    gl_Position=e*g;
    a = vec3(d.xy * b.xy + b.zw,1);
    a *= length(c);

    potato = vec3(d.xy, 1.0) * length(c);
}`;
    const fragNewBaidu = `precision highp float;
const float h=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
uniform float f;
uniform sampler2D g;
void main(){

vec2 aD = potato.xy / a.z;
float thetaD = aD.y;

float thresholdD1 = 0.61;
float thresholdD2 = 0.61;

float x = aD.x;
float y = abs(4.0*x - 2.0);
float phiD = smoothstep(0.0, 1.0, y > 1.0 ? 2.0 - y : y);

vec4 i = vec4(
  thetaD > mix(thresholdD1, thresholdD2, phiD)
  ? vec3(float(${OPTIONS.colorR}), float(${OPTIONS.colorG}), float(${OPTIONS.colorB})) // texture2DProj(g,a).rgb * 0.25
  : texture2DProj(g,a).rgb
,f);
gl_FragColor=i;
}`;

    const fragNew = `precision highp float;
const float h=3.1415926;
varying vec3 a;
varying vec3 potato;
uniform vec4 b;
uniform float f;
uniform sampler2D g;
void main(){

vec2 aD = potato.xy / a.z;
float thetaD = aD.y;

float thresholdD1 = 0.6;
float thresholdD2 = 0.7;

float x = aD.x;
float y = abs(4.0*x - 2.0);
float phiD = smoothstep(0.0, 1.0, y > 1.0 ? 2.0 - y : y);

vec4 i = vec4(
  thetaD > mix(thresholdD1, thresholdD2, phiD)
  ? vec3(float(${OPTIONS.colorR}), float(${OPTIONS.colorG}), float(${OPTIONS.colorB})) // texture2DProj(g,a).rgb * 0.25
  : texture2DProj(g,a).rgb
,f);
gl_FragColor=i;
}`;

    function isBaidu(){
        return document.getElementsByClassName("panorama___kKSrn")[0].children.length == 2;
    }

    var _send = XMLHttpRequest.prototype.send;
    var isBaiduP = false;
    XMLHttpRequest.prototype.send = function(value) {
        this.addEventListener('load', function() {
        if (this.responseURL && this.responseURL.includes('https://tuxun.fun/api/v0/tuxun/mapProxy/getPanoInfo?pano=') && this.responseURL.length == 84) {
            isBaiduP = true;
        }
        }, false);
        _send.call(this, value);
    };


    function installShaderSource(ctx) {
        const g = ctx.shaderSource;
        function shaderSource() {
        if (typeof arguments[1] === 'string') {
            let glsl = arguments[1];
            //console.log('BINTULU shader', glsl);

            if (glsl === vertexOld) glsl = vertexNew;
            else if (glsl === fragOld){
            //if (isBaidu()) glsl = fragNewBaidu;
            //else glsl = fragNew;
                if (isBaiduP) glsl = fragNewBaidu;
                else glsl = fragNew;
            //glsl = fragNewBaidu;
            }
            return g.call(this, arguments[0], glsl);
        }
        return g.apply(this, arguments);
        }
        shaderSource.bestcity = 'bintulu';
        ctx.shaderSource = shaderSource;
    }
    function installGetContext(el) {
        const g = el.getContext;
        el.getContext = function() {
        if (arguments[0] === 'webgl' || arguments[0] === 'webgl2') {
            const ctx = g.apply(this, arguments);
            if (ctx && ctx.shaderSource && ctx.shaderSource.bestcity !== 'bintulu') {
            installShaderSource(ctx);
            }
            return ctx;
        }
        return g.apply(this, arguments);
        };
    }
    const f = document.createElement;
    document.createElement = function() {
        if (arguments[0] === 'canvas' || arguments[0] === 'CANVAS') {
        const el = f.apply(this, arguments);
        installGetContext(el);
        return el;
        }
        return f.apply(this, arguments);
    };
    function addCompassStyle() {
        let style = document.createElement('style');
        style.id = 'bintulu_nocompass';
        style.innerHTML = '.gmnoprint.gm-bundled-control.gm-bundled-control-on-bottom { display: none }';
        document.head.appendChild(style);
    }
    addCompassStyle();
    document.addEventListener('keydown', (evt) => {
        if (!evt.repeat && evt.code === 'KeyK' && evt.shiftKey && !evt.altKey && !evt.ctrlKey && !evt.metaKey) {
        let style = document.getElementById('bintulu_nocompass');
        if (!style) {
            addCompassStyle();
        } else {
            style.remove();
        }
        }
    });
    }

    unsafeWindow.eval(`(${injected.toString()})()`);

})();