Der Filter arbeitet auf dem Sprite-Rechteck; Filter.padding ist in GraphShader (src/viewport/shaders.ts) nicht gesetzt. Alles, was ueber den Rand hinaus zeichnen will (Outline, Glow, Blur, Schatten), wird abgeschnitten.
Heute irrelevant: kein Node im Katalog kann Nachbarpixel lesen. Es wird relevant mit dem ersten Sample-Node (Sample texture at UV, Blur).
Vorschlag
Wenn Sample-Nodes kommen: padding aus dem Graph ableiten (maximaler Offset der Sample-Nodes), nicht als globale Konstante. Bis dahin ein Satz im Wiki, dass der Shader nicht ueber das Sprite hinaus zeichnen kann.
## Befund
Der Filter arbeitet auf dem Sprite-Rechteck; `Filter.padding` ist in `GraphShader` (`src/viewport/shaders.ts`) nicht gesetzt. Alles, was ueber den Rand hinaus zeichnen will (Outline, Glow, Blur, Schatten), wird abgeschnitten.
Heute irrelevant: kein Node im Katalog kann Nachbarpixel lesen. Es wird relevant mit dem ersten Sample-Node (`Sample texture at UV`, Blur).
## Vorschlag
Wenn Sample-Nodes kommen: `padding` aus dem Graph ableiten (maximaler Offset der Sample-Nodes), nicht als globale Konstante. Bis dahin ein Satz im Wiki, dass der Shader nicht ueber das Sprite hinaus zeichnen kann.
Gebaut, aber anders als im Issue-Text: Der ist überholt. Seit #77 ist der Shader kein Filter mehr, Filter.padding gibt es nicht. Die Grenze war die Geometrie (ein Quad genau in Sprite-Größe), und Sample texture gibt es seit #78, eine Outline wurde also wirklich abgeschnitten.
Was sich ändert
Padding am Output-Node, neben Edge (Antwort 1): so viele Pixel des Bildes Rand je Seite (Antwort 2), in den der Shader mitzeichnet. Standard 0 = wie bisher, höchstens 256.
Das Bild bleibt, wo und wie groß es ist. Im Rand laufen die UV einfach weiter, bei Padding 8 auf einem 32-Pixel-Bild von -0,25 bis 1,25.
Neuer Edge-Modus Transparent (Antwort 3): Außerhalb des Bildes ist nichts. Edge gilt überall gleich, auch für Texture color, Texture alpha und unverbundene Eingänge.
Hinweis am Output „Padding with Clamp smears the border“, solange Padding über 0 und Edge auf Clamp steht (Antwort 3). Der Shader kompiliert trotzdem.
Alle vier Träger (Antwort 4):
Sprite: Pixel des Frames.
9-Slice: ein Ring um die neun Felder, die Felder selbst bleiben stehen.
Text: Einheiten des Texts.
Partikel: Rand um jedes einzelne Partikel.
Die Vorschau im Shader-Tab zeigt den Rand und lässt ihm Platz.
Anklicken, Auswahlrahmen, Größe und Collider bleiben beim Rechteck ohne Rand.
Was ich selbst festgelegt habe
Ohne Bild zählt ein Pixel als eine Einheit der eigenen Größe (Sprite) bzw. der Partikelgröße.
9-Slice: Der Ring ist so breit wie so viele Randpixel, also mal Nine-slice scale.
Der Hinweis kommt auch, wenn Clamp bewusst gewählt ist. Standard und Auswahl lassen sich nicht unterscheiden.
Transparent schneidet hart an der Bildkante, ohne weichen Übergang.
Ein Objekt mit Padding wird nie ausgeblendet, auch wenn sein Rechteck außerhalb des Bildes liegt. Sonst würde der Rand am Bildschirmrand plötzlich verschwinden.
Partikel nehmen jetzt den Edge-Modus ihres Shaders. Bisher war er an Partikeln wirkungslos.
Im Wiki gestrichen: der veraltete Satz „Only sprites wear shaders; text objects do not“.
Eine Falle beim Benutzen
Soll ein verschobenes Sample texture im Rand sichtbar sein, muss auch sein alpha an den Output. Die Deckkraft des eigenen Pixels ist im Rand bei Transparent null. Das steht so im Wiki.
Under the hood
paddingOf und der Modus transparent in src/core/shader/nodes.ts. Der Compiler gibt padding und hints mit zurück.
Jede Bildlesung läuft über texelAt. Bei Transparent schneidet diese Funktion im Fragment, deshalb braucht der Modus keine eigene Kopie des Bildes mit eigenem Adressmodus.
src/viewport/quadPadding.ts (neu, ohne Pixi): Das Quad und seine UV wachsen um denselben Anteil. sliceGeometry bekommt den Ring.
Partikel: Uniform uPad im Vertex-Stage, Ecken und UV wachsen um die Mitte.
WorldViewport nimmt Träger eines Shaders mit Padding vom Ausblenden aus.
Tests (auf melektaus-atx)
Gate → 216 Files, 3336 Tests, CHECK EXIT 0 (3319 + 17, direkt vor dem Commit)
e2e 28,30,31,37,41 → ALL PASSED – 178 checks (Endstand)
e2e 1-37,47,48,58 → ALL PASSED – 1281 checks (vor der letzten Änderung)
17 neue Unit-Tests: Compiler (Padding, Transparent, Hinweis) und Geometrie (Quad, 9-Slice-Ring).
Sieben neue e2e-Checks: vier am Sprite (Modul 28), je einer für Text, Partikel und 9-Slice.
Die Kette lief vor der letzten Änderung (Objekte mit Padding nicht ausblenden, plus ein Check dazu). Danach liefen nur das Gate und die Module oben.
Alle 17 Unit-Gegenproben greifen.
Alle drei Browser-Gegenproben greifen: Rand wird nirgends gezeichnet (5 Checks fallen), Transparent und Hinweis aus (3), Ausblenden wie bisher (1).
Drei Screenshots angesehen: Sprite mit Clamp und Rand in der Szene, die Vorschau im Shader-Tab, der Text.
Die e2e-Summe 1687 ist gerechnet (1680 + 7). Volle Suite und Smokes liefen nicht, das macht der CI-Lauf.
Nicht geprüft:
der Hinweis am Node im Bild (nur per Hook gelesen)
Partikel und 9-Slice im Bild (die Screenshots kamen leer an)
die Game-Ansicht im Play, alle Messungen liefen in der Scene-Ansicht
Sprites ohne Bild, und Vector-/Pixel-Art-Bilder
alles nach dem Build
Nicht dabei
Der Rand wird nicht aus dem Graph abgeleitet, wie das Issue vorschlug. Das ginge nur bei festen Zahlen als Versatz.
Die Suite zu 46c620a war in einem Check rot: e2e 41, „a body dragged while playing hangs where the pointer holds it and is let go at rest“. Der Körper hing richtig und fiel aus der Ruhe. Gefallen ist der Check an seiner eigenen Grenze von 30 Frames während des Haltens: Der Lauf zeichnete in der Sekunde nur 21, die grünen Läufe des Tages 37 bis 54.
e066613 misst stattdessen die Zeit (800 ms zwischen erstem und letztem Messpunkt vor dem Loslassen, mindestens fünf Messpunkte). Das ist nicht der Wackler aus #282 noch einmal: Dort ging es darum, wann gemessen wird, hier darum, wie viele Frames ein Runner schafft. Warum der Lauf so langsam war, weiß ich nicht. Eine Gegenprobe gibt es nicht, einen so langsamen Lauf habe ich nicht nachgestellt.
Commits: e933fad (#69), e066613 (e2e 41). Wiki: Shaders (neuer Abschnitt „Room around the picture“) und Development (Summe).
Gebaut, aber anders als im Issue-Text: Der ist überholt. Seit #77 ist der Shader kein Filter mehr, `Filter.padding` gibt es nicht. Die Grenze war die Geometrie (ein Quad genau in Sprite-Größe), und `Sample texture` gibt es seit #78, eine Outline wurde also wirklich abgeschnitten.
## Was sich ändert
- **`Padding` am Output-Node**, neben `Edge` (Antwort 1): so viele Pixel des Bildes Rand je Seite (Antwort 2), in den der Shader mitzeichnet. Standard 0 = wie bisher, höchstens 256.
- **Das Bild bleibt, wo und wie groß es ist.** Im Rand laufen die UV einfach weiter, bei Padding 8 auf einem 32-Pixel-Bild von -0,25 bis 1,25.
- **Neuer Edge-Modus `Transparent`** (Antwort 3): Außerhalb des Bildes ist nichts. `Edge` gilt überall gleich, auch für `Texture color`, `Texture alpha` und unverbundene Eingänge.
- **Hinweis am Output** „Padding with Clamp smears the border“, solange Padding über 0 und Edge auf *Clamp* steht (Antwort 3). Der Shader kompiliert trotzdem.
- **Alle vier Träger** (Antwort 4):
- Sprite: Pixel des Frames.
- 9-Slice: ein Ring um die neun Felder, die Felder selbst bleiben stehen.
- Text: Einheiten des Texts.
- Partikel: Rand um jedes einzelne Partikel.
- **Die Vorschau im Shader-Tab** zeigt den Rand und lässt ihm Platz.
- **Anklicken, Auswahlrahmen, Größe und Collider** bleiben beim Rechteck ohne Rand.
## Was ich selbst festgelegt habe
- **Ohne Bild** zählt ein Pixel als eine Einheit der eigenen Größe (Sprite) bzw. der Partikelgröße.
- **9-Slice:** Der Ring ist so breit wie so viele Randpixel, also mal *Nine-slice scale*.
- **Der Hinweis kommt auch, wenn *Clamp* bewusst gewählt ist.** Standard und Auswahl lassen sich nicht unterscheiden.
- **`Transparent` schneidet hart an der Bildkante**, ohne weichen Übergang.
- **Ein Objekt mit Padding wird nie ausgeblendet**, auch wenn sein Rechteck außerhalb des Bildes liegt. Sonst würde der Rand am Bildschirmrand plötzlich verschwinden.
- **Partikel nehmen jetzt den Edge-Modus ihres Shaders.** Bisher war er an Partikeln wirkungslos.
- **Im Wiki gestrichen:** der veraltete Satz „Only sprites wear shaders; text objects do not“.
## Eine Falle beim Benutzen
Soll ein verschobenes `Sample texture` im Rand sichtbar sein, muss auch sein `alpha` an den Output. Die Deckkraft des eigenen Pixels ist im Rand bei *Transparent* null. Das steht so im Wiki.
## Under the hood
- `paddingOf` und der Modus `transparent` in `src/core/shader/nodes.ts`. Der Compiler gibt `padding` und `hints` mit zurück.
- Jede Bildlesung läuft über `texelAt`. Bei *Transparent* schneidet diese Funktion im Fragment, deshalb braucht der Modus keine eigene Kopie des Bildes mit eigenem Adressmodus.
- `src/viewport/quadPadding.ts` (neu, ohne Pixi): Das Quad und seine UV wachsen um denselben Anteil. `sliceGeometry` bekommt den Ring.
- Partikel: Uniform `uPad` im Vertex-Stage, Ecken und UV wachsen um die Mitte.
- `WorldViewport` nimmt Träger eines Shaders mit Padding vom Ausblenden aus.
## Tests (auf `melektaus-atx`)
```
Gate → 216 Files, 3336 Tests, CHECK EXIT 0 (3319 + 17, direkt vor dem Commit)
e2e 28,30,31,37,41 → ALL PASSED – 178 checks (Endstand)
e2e 1-37,47,48,58 → ALL PASSED – 1281 checks (vor der letzten Änderung)
```
- **17 neue Unit-Tests:** Compiler (Padding, Transparent, Hinweis) und Geometrie (Quad, 9-Slice-Ring).
- **Sieben neue e2e-Checks:** vier am Sprite (Modul 28), je einer für Text, Partikel und 9-Slice.
- **Die Kette lief vor der letzten Änderung** (Objekte mit Padding nicht ausblenden, plus ein Check dazu). Danach liefen nur das Gate und die Module oben.
- **Alle 17 Unit-Gegenproben greifen.**
- **Alle drei Browser-Gegenproben greifen:** Rand wird nirgends gezeichnet (5 Checks fallen), *Transparent* und Hinweis aus (3), Ausblenden wie bisher (1).
- **Drei Screenshots angesehen:** Sprite mit *Clamp* und Rand in der Szene, die Vorschau im Shader-Tab, der Text.
- Die e2e-Summe **1687** ist gerechnet (1680 + 7). Volle Suite und Smokes liefen nicht, das macht der CI-Lauf.
- **Nicht geprüft:**
- der Hinweis am Node im Bild (nur per Hook gelesen)
- Partikel und 9-Slice im Bild (die Screenshots kamen leer an)
- die Game-Ansicht im Play, alle Messungen liefen in der Scene-Ansicht
- Sprites ohne Bild, und Vector-/Pixel-Art-Bilder
- alles nach dem Build
## Nicht dabei
- Der Rand wird nicht aus dem Graph abgeleitet, wie das Issue vorschlug. Das ginge nur bei festen Zahlen als Versatz.
- #79 (Vertex-Graph) bleibt offen.
## Daneben: der rote CI-Lauf zu #294
Die Suite zu `46c620a` war in einem Check rot: e2e 41, „a body dragged while playing hangs where the pointer holds it and is let go at rest“. Der Körper hing richtig und fiel aus der Ruhe. Gefallen ist der Check an seiner eigenen Grenze von 30 Frames während des Haltens: Der Lauf zeichnete in der Sekunde nur 21, die grünen Läufe des Tages 37 bis 54.
`e066613` misst stattdessen die Zeit (800 ms zwischen erstem und letztem Messpunkt vor dem Loslassen, mindestens fünf Messpunkte). Das ist nicht der Wackler aus #282 noch einmal: Dort ging es darum, wann gemessen wird, hier darum, wie viele Frames ein Runner schafft. Warum der Lauf so langsam war, weiß ich nicht. Eine Gegenprobe gibt es nicht, einen so langsamen Lauf habe ich nicht nachgestellt.
Commits: `e933fad` (#69), `e066613` (e2e 41). Wiki: *Shaders* (neuer Abschnitt „Room around the picture“) und *Development* (Summe).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Befund
Der Filter arbeitet auf dem Sprite-Rechteck;
Filter.paddingist inGraphShader(src/viewport/shaders.ts) nicht gesetzt. Alles, was ueber den Rand hinaus zeichnen will (Outline, Glow, Blur, Schatten), wird abgeschnitten.Heute irrelevant: kein Node im Katalog kann Nachbarpixel lesen. Es wird relevant mit dem ersten Sample-Node (
Sample texture at UV, Blur).Vorschlag
Wenn Sample-Nodes kommen:
paddingaus dem Graph ableiten (maximaler Offset der Sample-Nodes), nicht als globale Konstante. Bis dahin ein Satz im Wiki, dass der Shader nicht ueber das Sprite hinaus zeichnen kann.Gebaut, aber anders als im Issue-Text: Der ist überholt. Seit #77 ist der Shader kein Filter mehr,
Filter.paddinggibt es nicht. Die Grenze war die Geometrie (ein Quad genau in Sprite-Größe), undSample texturegibt es seit #78, eine Outline wurde also wirklich abgeschnitten.Was sich ändert
Paddingam Output-Node, nebenEdge(Antwort 1): so viele Pixel des Bildes Rand je Seite (Antwort 2), in den der Shader mitzeichnet. Standard 0 = wie bisher, höchstens 256.Transparent(Antwort 3): Außerhalb des Bildes ist nichts.Edgegilt überall gleich, auch fürTexture color,Texture alphaund unverbundene Eingänge.Was ich selbst festgelegt habe
Transparentschneidet hart an der Bildkante, ohne weichen Übergang.Eine Falle beim Benutzen
Soll ein verschobenes
Sample textureim Rand sichtbar sein, muss auch seinalphaan den Output. Die Deckkraft des eigenen Pixels ist im Rand bei Transparent null. Das steht so im Wiki.Under the hood
paddingOfund der Modustransparentinsrc/core/shader/nodes.ts. Der Compiler gibtpaddingundhintsmit zurück.texelAt. Bei Transparent schneidet diese Funktion im Fragment, deshalb braucht der Modus keine eigene Kopie des Bildes mit eigenem Adressmodus.src/viewport/quadPadding.ts(neu, ohne Pixi): Das Quad und seine UV wachsen um denselben Anteil.sliceGeometrybekommt den Ring.uPadim Vertex-Stage, Ecken und UV wachsen um die Mitte.WorldViewportnimmt Träger eines Shaders mit Padding vom Ausblenden aus.Tests (auf
melektaus-atx)Nicht dabei
Daneben: der rote CI-Lauf zu #294
Die Suite zu
46c620awar in einem Check rot: e2e 41, „a body dragged while playing hangs where the pointer holds it and is let go at rest“. Der Körper hing richtig und fiel aus der Ruhe. Gefallen ist der Check an seiner eigenen Grenze von 30 Frames während des Haltens: Der Lauf zeichnete in der Sekunde nur 21, die grünen Läufe des Tages 37 bis 54.e066613misst stattdessen die Zeit (800 ms zwischen erstem und letztem Messpunkt vor dem Loslassen, mindestens fünf Messpunkte). Das ist nicht der Wackler aus #282 noch einmal: Dort ging es darum, wann gemessen wird, hier darum, wie viele Frames ein Runner schafft. Warum der Lauf so langsam war, weiß ich nicht. Eine Gegenprobe gibt es nicht, einen so langsamen Lauf habe ich nicht nachgestellt.Commits:
e933fad(#69),e066613(e2e 41). Wiki: Shaders (neuer Abschnitt „Room around the picture“) und Development (Summe).