scopedvr-map-core/shaders/selection_outline.gdshader
2026-11-01 19:31:33 +01:00

40 lines
1.5 KiB
Text

shader_type spatial;
render_mode unshaded, cull_front, shadows_disabled, blend_mix;
// Außenhüllen-Kontur (U6, Karte t_639135dd): dezente Auswahl-Markierung
// statt Vollflächen-Orange. Das Grundmaterial (inkl. Textur) bleibt komplett
// sichtbar — die Kontur lebt als eigene Hülle um das Modell:
//
// VERTEX += NORMAL * breite_m bläht das Volumen entlang der Normalen auf,
// cull_front rendert nur die RÜCKseiten der Hülle. Sichtbar bleibt darum
// genau der schmale Saum, der außerhalb der Silhouette liegt (der Rest
// wird vom Objekt selbst per Tiefentest verdeckt) — die klassische
// Inverted-Hull-Outline-Technik.
//
// Farbton, Deckkraft und Breite kommen aus dem Theme (theme/editor_theme.tres,
// Abschnitt "Editor") — der Shader selbst kennt keine festen Farben.
//
// Gestrichelte Variante (Spiegel-Zwilling): streifen_hz > 0 unterteilt die
// Kontur in Bänder entlang der Welthöhe — dünn + gestrichelt statt voll.
uniform vec4 linien_farbe : source_color = vec4(1.0, 0.6, 0.15, 0.95);
uniform float breite_m : hint_range(0.0, 1.0) = 0.08;
uniform float streifen_hz : hint_range(0.0, 40.0) = 0.0;
varying vec3 welt_pos;
void vertex() {
VERTEX += NORMAL * breite_m;
welt_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
}
void fragment() {
if (streifen_hz > 0.5) {
// Gestrichelt (Zwilling): Bänder entlang der Welthöhe, ~55 % Strich.
if (fract(welt_pos.y * streifen_hz) > 0.55) {
discard;
}
}
ALBEDO = linien_farbe.rgb;
ALPHA = linien_farbe.a;
}