Mozaika trafia na biurko: kafle Mossaic w Animate Studio
Kiedy pokazywaliśmy Mossaic, wspólną mozaikę budowaną kafel po kaflu, najczęstsze pytanie nie dotyczyło ani kształtów, ani terminów. Brzmiało tak: „a skąd mam wiedzieć, co narysował sąsiad?"
To jest właściwe pytanie, bo w mozaice cała trudność siedzi na krawędziach. Kafel sam w sobie może być świetny i i tak zepsuć obraz, jeśli linia horyzontu urwie się o pół centymetra od linii sąsiada, a ciepły piasek zderzy się z zimnym błękitem. Przeglądarka radziła sobie z tym półśrodkami: można było pobrać szablon, obejrzeć sąsiadów w osobnej karcie, przełączać się tam i z powrotem. Działało. Nie było wygodne.
Dziś kafel można wziąć na warsztat tam, gdzie i tak się rysuje — w Moonlight Animate Studio.
Kafel jako dokument, a nie jako plik do wysłania
Na ekranie startowym pojawiła się zakładka „Moje kafle". Widać w niej wszystkie miejsca, które zająłeś — we wszystkich mozaikach naraz, bo z perspektywy artysty to jedna kolejka rzeczy do zrobienia, a nie kilka osobnych światów.
Jedna decyzja wymaga wyjaśnienia. Kafel, na którego kolej jeszcze nie przyszła, też jest na tej liście. Można było go po prostu ukryć — mniej kodu, czystszy widok. Ale człowiek, który tydzień temu zajął miejsce w mozaice, chce wiedzieć, czy nadal jest jego. Ukryty kafel odpowiada na to pytanie najgorszą z możliwych odpowiedzi: ciszą. Więc kafel jest widoczny, wyszarzony, a podpowiedź mówi wprost, na kogo czekasz — z imienia. Czekasz na osobę, nie na system.
Kliknięcie aktywnego kafla zakłada dokument o dokładnych wymiarach z mozaiki i od razu przycina go maską w kształcie tego konkretnego kafla. „Tego konkretnego" nie jest tu ozdobnikiem: w mozaice trójkątnej co drugi kafel jest odwrócony, w rombowej występują trzy obroty. Maska przychodzi z serwera razem z orientacją, więc dostajesz swój kafel, a nie kafel domyślny.
Efekt uboczny jest przyjemniejszy, niż się spodziewaliśmy: nie da się wyjechać poza figurę. Wcześniej obcięcie następowało dopiero po wysłaniu i człowiek dowiadywał się o nim, patrząc na wynik. Teraz pędzel po prostu kończy się tam, gdzie kończy się kafel.
Sąsiedzi dookoła płótna
Najważniejsza część to nowa warstwa — „Sąsiedzi mozaiki". Kafle, które twoi sąsiedzi już oddali, leżą dookoła twojego płótna dokładnie tam, gdzie się z nim stykają. Jeżdżą razem z zoomem i przesuwaniem, bo siedzą w tym samym układzie współrzędnych co dokument. Możesz podjechać do samej krawędzi i dobrać kolor piksel w piksel.
Warstwa jest przypięta na wierzch i nie da się jej ruszyć — nowe warstwy powstają pod nią. To nie jest kaprys, tylko konsekwencja tego, po co ona jest: warstwa, którą można sobie przypadkiem zasłonić własnym rysunkiem, przestaje pełnić swoją rolę dokładnie w momencie, w którym jest najbardziej potrzebna. Nie można też po niej malować. Sterowanie ma jedno: ikonę oka, tę samą co wszędzie indziej. Podgląd włączony albo wyłączony, koniec listy.
Dalsze pierścienie sąsiadów są słabiej widoczne od bezpośrednich. Kafel, którego krawędź dotyka twojej, to informacja. Kafel trzy pola dalej to już tylko kontekst — i tak powinien wyglądać.
To nie jest twój rysunek
Ta warstwa zawiera cudzą pracę. Jedno przeoczone miejsce w kodzie — eksport, spłaszczenie, scalenie warstw, zapis do pliku — i cudzy rysunek wyszedłby na świat jako twój kafel.
Takiego błędu nie wyłapuje się testem po fakcie, bo on nie wygląda na błąd. Wygląda na obrazek. Dlatego zamiast dopisywać ten sam warunek w ośmiu miejscach i liczyć, że nie zapomnieliśmy o dziewiątym, warunek dostał nazwę — jedno pojęcie „nakładka prywatna", wspólne z istniejącą tablicą referencji. Nowa nakładka tego rodzaju dopisuje się w jednym miejscu i od razu jest wyłączona wszędzie tam, gdzie powinna być wyłączona.
Ta sama zasada dotyczy zapisu. Podgląd nie trafia do pliku .mart — jest zrzutem z serwera, więc przy
kolejnym otwarciu kafla pobiera się na nowo i jest zawsze aktualny. Zapisany zdążyłby się zdezaktualizować,
a przy okazji ważyłby tyle, co kilka cudzych obrazków. Pominięcie go przy zapisie ma jeszcze jedną
zaletę: wersja formatu pliku się nie zmienia, więc starsze wersje programu czytają te pliki
dokładnie tak jak dotąd.
Wysyłka
Plik → Eksportuj → Do Moonlight: kafel mozaiki (PNG). Dokument składa się z pominięciem podglądu, rozmiar jest sprawdzany jeszcze przed wysłaniem (żeby nie czekać na odmowę po przesłaniu kilku megabajtów), a pasek stanu pokazuje, ile czasu zostało na poprawki. Do końca tego okna można wysłać kafel ponownie i podmienić rysunek — dopiero potem kafel jest przyjęty i odblokowuje sąsiadów.
Wszystkie reguły — czyja kolej, ile czasu zostało, czy mozaika nie jest zamrożona — liczy serwer, ten sam, który obsługuje przeglądarkę. Aplikacja o nic się nie domyśla. Gdyby miała własną kopię tych reguł, wystarczyłaby jedna zmiana po stronie serwisu, żeby zaczęła mówić ludziom nieprawdę.
Przy okazji: dwa stare błędy
Grzebiąc w oknie „Nowy" natknęliśmy się na dwie rzeczy, które siedziały tam od dawna i po cichu robiły coś innego, niż użytkownik wybrał.
Otwarcie okna „na Projekcie komiksu" ładowało w rzeczywistości Nieskończone płótno — wartość typu
była przycinana o jeden za wcześnie. A wybór „Projekt komiksu" w Plik → Nowy tworzył zwykłą
ilustrację zamiast projektu na dysku. W obu przypadkach nie było żadnego komunikatu; program po prostu
dawał coś innego. Naprawione.
Mozaika ma sens tylko wtedy, gdy krawędzie się schodzą. Wszystko powyżej służy jednej rzeczy: żeby dopasowanie się do sąsiada przestało być zgadywanką.