fade in/out grafiki w multicolorze
fade in/out grafiki w multicolorze
Mam pytanie do koderów
Jak sie robi fade in/out grafiki w multicolorze.
tzn to co mi przychodzi do głowy to czytanie bajta po bajcie z $0400 i z $d800 sprawdzenie koloru a potem pobranie z tablicy fadeów koloru o niższym poziomie? tak to chyba powinno działać ale pytanie jest czy są na to jakieś triki które koderzy wypracowali?
Jak sie robi fade in/out grafiki w multicolorze.
tzn to co mi przychodzi do głowy to czytanie bajta po bajcie z $0400 i z $d800 sprawdzenie koloru a potem pobranie z tablicy fadeów koloru o niższym poziomie? tak to chyba powinno działać ale pytanie jest czy są na to jakieś triki które koderzy wypracowali?
c64portal.pl, retronavigator.com
Dobre pytanie 
Też jestem ciekaw, jakie są "podejścia" do tego tematu.
Najgorsza jest zabawa z nibblami (półbajty) - bo informacja o kolorze 1 i 2 zawarta jest razem w pojednyńczych bajtach (kolor 0 to d021, a kolor 3 pochodzi z obaszaru $d800-dbe7).
Ja robię tak:
Tablica Fade-ingu dla każdego z 16 kolorów (zależna od stopni zanikania, ale załóżmy maks 16) czyli 16x16 =256 bajtów (chociaż czarny możemy oczywiście pominąć) w notacji bajtów $KOLOR|KOLOR, czyl np czerwony to $22, druga tabelka na indeks dla koloeu w tabeli zanikania - czyli w tym przypadku kolor*16, dla 16 kolorow to 16 elementów - można nawet na stronę zerową wyrzucić.
Wzorzec dla kolorów (i ten dla mapy i ten dla $d800) proponuje oczywiście umieścić w pamięci gdzieś oddzielnie, bo na jego podstawie i konkretniej fazy zaniku będziemy ustalać kolejne kolory (samomodyfikacja pożerałaby masę czasu) dla kwadratów 8x8px.
No i niestety najlepiej to wykonywać jakimś efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komórek mapy koloru, +1000 dla $d800, i obsłużyć to wszystko w jedej ramce nie jest chyba nawet możliwe.
Oczywiście można też dodać jakieś warunki przyspieszające (np pomijać od razu kolor czarny).
Kawałek kodu:

Też jestem ciekaw, jakie są "podejścia" do tego tematu.
Najgorsza jest zabawa z nibblami (półbajty) - bo informacja o kolorze 1 i 2 zawarta jest razem w pojednyńczych bajtach (kolor 0 to d021, a kolor 3 pochodzi z obaszaru $d800-dbe7).
Ja robię tak:
Tablica Fade-ingu dla każdego z 16 kolorów (zależna od stopni zanikania, ale załóżmy maks 16) czyli 16x16 =256 bajtów (chociaż czarny możemy oczywiście pominąć) w notacji bajtów $KOLOR|KOLOR, czyl np czerwony to $22, druga tabelka na indeks dla koloeu w tabeli zanikania - czyli w tym przypadku kolor*16, dla 16 kolorow to 16 elementów - można nawet na stronę zerową wyrzucić.
Wzorzec dla kolorów (i ten dla mapy i ten dla $d800) proponuje oczywiście umieścić w pamięci gdzieś oddzielnie, bo na jego podstawie i konkretniej fazy zaniku będziemy ustalać kolejne kolory (samomodyfikacja pożerałaby masę czasu) dla kwadratów 8x8px.
No i niestety najlepiej to wykonywać jakimś efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komórek mapy koloru, +1000 dla $d800, i obsłużyć to wszystko w jedej ramce nie jest chyba nawet możliwe.
Oczywiście można też dodać jakieś warunki przyspieszające (np pomijać od razu kolor czarny).
Kawałek kodu:
Kod: Zaznacz cały
ldy ColorCell ;dla danej komórki koloru
lda MapC_colorsSpecimen,y ;pobierz kolor (para) oryginalny
beq + ;jeśli 'pusty' to -> bierz się za nastepny
and #%00001111 ;najpierw młodszy nibble
;wpierw badamy młodszy nibble
beq l_starszy-2 ;jak czarny to dalej
tax
lda _multiTab,x ;pomnóż przez 16
ora FadePhase
tax
lda _FullFadeTable,x ;i weź odpowiadający dla fazy kolor
and #%00001111 ;tylko dla młodszego nibble
sta _cTmp2+1 ;zapamiętaj dalej (dla OR)
l_starszy
lda MapC_colorsSpecimen,y ;pobierz kolor (para) oryginalny
and #%11110000 ;teraz starszy nibble
beq _cTmp2 ;czarny ?
ora FadePhase
tax
lda _FullFadeTable,x
and #%11110000
_cTmp2 ora #$00 ;składamy młodszy i starszy nibble
sta Colors_map,y ;i na ekran
+ iny ;następna komórka
Bo pecet to zwykły banan...
Nie pamiętam dokładnie ale wydaje mi się to jak najbardziej możliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiście korzystać z tabelki z kolorami do wygaszania)skull pisze: No i niestety najlepiej to wykonywać jakimś efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komórek mapy koloru, +1000 dla $d800, i obsłużyć to wszystko w jedej ramce nie jest chyba nawet możliwe.
Oczywiście można też dodać jakieś warunki przyspieszające (np pomijać od razu kolor czarny).
Co do kolorów to najlepiej fadeout robić poprzez zgrupowanie kolorów pod względem jasności czyli z białego do czarnego nie przechodzimy w 15 kropkach ale w 8. Imo lepiej to wygląda.
Reasumując to co pisał apropo fadeout Carrion jest jak najbardziej OK i nie da się raczej inaczej tego zrobic.
Co do Fade-in to tutaj musimy rozbijać na dwie 4bitowe wartości i pobierać dane z tabelki wiec będzie wolniej ale w 50fps chyba da się radę to zrobić
[quote="zielok"]
Nie pamiętam dokładnie ale wydaje mi się to jak najbardziej możliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiście korzystać z tabelki z kolorami do wygaszania)
/quote]
Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
To czy w jednej ramce da się obsłużyć efekt, zależy też oczywiście od wielkości obrazka, jednak chcąc obłużyć każdą komórkę wydaje się to nie możliwe - bo zmienić każdą komórkę z tych 2000 to chyba tylko "lda sta" zostaje.
312 linii (PAL) * 63 cykle = 19656
- 25*40 (BadLines)
daje to 18656 / 2000 = 9,32 cykla na obsługę jedej komórki pamięci (nie wpominając o tych z mapy koloru gdzie trzeba rozdzielac na nibble), głupie lda sta to 8 cykli, a co z jakaś muzyczka w tle.
Tłumacz bo ja na razie tego nadal nie widze.
Nie pamiętam dokładnie ale wydaje mi się to jak najbardziej możliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiście korzystać z tabelki z kolorami do wygaszania)
/quote]
Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
To czy w jednej ramce da się obsłużyć efekt, zależy też oczywiście od wielkości obrazka, jednak chcąc obłużyć każdą komórkę wydaje się to nie możliwe - bo zmienić każdą komórkę z tych 2000 to chyba tylko "lda sta" zostaje.
312 linii (PAL) * 63 cykle = 19656
- 25*40 (BadLines)
daje to 18656 / 2000 = 9,32 cykla na obsługę jedej komórki pamięci (nie wpominając o tych z mapy koloru gdzie trzeba rozdzielac na nibble), głupie lda sta to 8 cykli, a co z jakaś muzyczka w tle.
Tłumacz bo ja na razie tego nadal nie widze.
Bo pecet to zwykły banan...
Mój fader działa na zasadzie przedstawionej w tym wątku i zdecydowanie nie jest to mój najlepszy kawałek kodu, bodajże o 3'ciej w nocy był napisany.
Przedstawię ideę na coś ciekawszego, poprawcie mnie jeśli coś przeoczyłem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla każdej chcemy uzyskać liczbę w której oba nible zostaną w jakiś sposób zmodyfikowane. Cóż za problem postawić 256 look-up tabelkę.
Przykładowo, wartości w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i się zapętla tak więc nie trzeba nic sprawdzać.
Można to spokojnie dostosować do fade'owania po luminancji.
Przedstawię ideę na coś ciekawszego, poprawcie mnie jeśli coś przeoczyłem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla każdej chcemy uzyskać liczbę w której oba nible zostaną w jakiś sposób zmodyfikowane. Cóż za problem postawić 256 look-up tabelkę.
Przykładowo, wartości w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i się zapętla tak więc nie trzeba nic sprawdzać.
Można to spokojnie dostosować do fade'owania po luminancji.
Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)Nitro pisze:Mój fader działa na zasadzie przedstawionej w tym wątku i zdecydowanie nie jest to mój najlepszy kawałek kodu, bodajże o 3'ciej w nocy był napisany.
Przedstawię ideę na coś ciekawszego, poprawcie mnie jeśli coś przeoczyłem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla każdej chcemy uzyskać liczbę w której oba nible zostaną w jakiś sposób zmodyfikowane. Cóż za problem postawić 256 look-up tabelkę.
Przykładowo, wartości w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i się zapętla tak więc nie trzeba nic sprawdzać.
Można to spokojnie dostosować do fade'owania po luminancji.
No i teraz zdałem sobie sprawę, że można "animować" zanik na rejestrze $d018 (mapy kolorów), tyle że trzeba przed samym efektem wiliczyć 8 map kolorów (zasada analogiczna do FLI) dla każdej fazy zaniku, a potem tylko co ramkę przełączać rejestr - zostaje jeszcze kwestia $d800, ale tu już nie powinno byc problemu z wyrobieniem się. Oczywisty minus tej metody to pamieciożerność.
Bo pecet to zwykły banan...
Proste:Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)
ldx $0400
lda lut,x
sta $0400
Również skuteczna metoda, zawsze coś musi być zjedzone, czy to pamięć czy to proc
No i teraz zdałem sobie sprawę, że można "animować" zanik na rejestrze $d018 (mapy kolorów), tyle że trzeba przed samym efektem wiliczyć 8 map kolorów (zasada analogiczna do FLI) dla każdej fazy zaniku, a potem tylko co ramkę przełączać rejestr - zostaje jeszcze kwestia $d800, ale tu już nie powinno byc problemu z wyrobieniem się. Oczywisty minus tej metody to pamieciożerność.

- Sebaloz/Lepsi.De
- Posty: 3964
- Rejestracja: 14 wrz 2008, 00:02
Ja generowalem 7 zestawow z kolorami ekranu obrazka oraz generowalem tabelke z kolorami d800 obrazka:
*=$8000
siedem przejsc koloru d800 od najciemniejszego do najjasniejszego,
*=$8000+7
siedem przejsc koloru d801 od najciemniejszego do najjasniejszego,
*=$8000+14
siedem przejsc koloru d802 od najciemniejszego do najjasniejszego,
itd
Potem tylko przelaczalem wygenerowane ekrany od najciemniejszego do najjasnieszego, po pokazaniu sie calego obrazka przelaczalem wygenerowane ekrany od najjasniejszego do najciemniejszego, a po kazdym przelaczeniu ekranu puszczalem przepisanie d800, ktore spokojnie miescilo sie w jednej ramce, mozna bylo puscic na przerwaniach a w tle uzywac loadera KM'a.
ldx #$00
jsr przelacz-ekran
jsr przepisanied800
inx
cpx #$07
bne *-9
ldx #$05
jsr przelacz-ekran
jsr przepisanied800
dex
cpx #$ff
bne *-9
przepisanied800:
(procedurka zajmuje $1770 pamieci, mozna ja skrocic pomijajac miejsca z czarnym kolorem)
lda $8000,x
sta $d800
lda $8000+7,x
sta $d800+1
lda $8000+14,x
sta $d800+2
itd..
rts
*=$8000
siedem przejsc koloru d800 od najciemniejszego do najjasniejszego,
*=$8000+7
siedem przejsc koloru d801 od najciemniejszego do najjasniejszego,
*=$8000+14
siedem przejsc koloru d802 od najciemniejszego do najjasniejszego,
itd
Potem tylko przelaczalem wygenerowane ekrany od najciemniejszego do najjasnieszego, po pokazaniu sie calego obrazka przelaczalem wygenerowane ekrany od najjasniejszego do najciemniejszego, a po kazdym przelaczeniu ekranu puszczalem przepisanie d800, ktore spokojnie miescilo sie w jednej ramce, mozna bylo puscic na przerwaniach a w tle uzywac loadera KM'a.
ldx #$00
jsr przelacz-ekran
jsr przepisanied800
inx
cpx #$07
bne *-9
ldx #$05
jsr przelacz-ekran
jsr przepisanied800
dex
cpx #$ff
bne *-9
przepisanied800:
(procedurka zajmuje $1770 pamieci, mozna ja skrocic pomijajac miejsca z czarnym kolorem)
lda $8000,x
sta $d800
lda $8000+7,x
sta $d800+1
lda $8000+14,x
sta $d800+2
itd..
rts
__________________________
Socjopatyczna Legia Commodore
Socjopatyczna Legia Commodore
kilka spostrzeżeń po tych postach:
1. przełączanie banków / obrazków jest ok jak chcemy zrobić fade całego obrazka - gdy chcemy zrobić np fade wg jakiegoś wzoru już to nie zadziała.
2. Fade co ramkę nie koniecznie jest wymogiem.
po zrobieniu tablicy fade'u mamy 8 odcieni koloru gdy zaczynamy od białego. zmiana odcienia co ramkę poskutkuje takim błyskiem, którego nawet nie da się zauważyć
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
btw:
skodowałem to wg mojego pierwotnego pomysłu i nawet działa.
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
ps. wzięło mnie na kodowanie dla odmiany jak by kto pytał
1. przełączanie banków / obrazków jest ok jak chcemy zrobić fade całego obrazka - gdy chcemy zrobić np fade wg jakiegoś wzoru już to nie zadziała.
2. Fade co ramkę nie koniecznie jest wymogiem.
po zrobieniu tablicy fade'u mamy 8 odcieni koloru gdy zaczynamy od białego. zmiana odcienia co ramkę poskutkuje takim błyskiem, którego nawet nie da się zauważyć

3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
btw:
skodowałem to wg mojego pierwotnego pomysłu i nawet działa.
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
ps. wzięło mnie na kodowanie dla odmiany jak by kto pytał

c64portal.pl, retronavigator.com
Musisz skądś znać koordynaty okręgu plus wziąć pod uwagę wychodzenie części okręgu poza ekran. Tak więc polecam prekalk i potem te dane ładujesz do swojej procedurki.
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
IMHO 16 kolorów fade co ramkę to standard.
2. Fade co ramkę nie koniecznie jest wymogiem.
po zrobieniu tablicy fade'u mamy 8 odcieni koloru gdy zaczynamy od białego. zmiana odcienia co ramkę poskutkuje takim błyskiem, którego nawet nie da się zauważyć
Od tego są przerwania, pozwalają wykonać kod powtarzający się łatwo i przyjemnie. Nie ładujesz do przerwań kodu, który nie powinien się zatrzymywać tylko działać non stop kiedy go przerwania nie stopują.
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
no ale jesli ma się to wykonać dla każdej komórki, oraz dla colorRamu to nadal nie wystarcza czasu w jednej ramce -patrz wylicznia wyżej.Nitro pisze: Proste:
ldx $0400
lda lut,x
sta $0400
nie dawno wykorzystałem (z powodzeniem) to:
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
Kod: Zaznacz cały
xcircle i ycircle - współrzędne środka
R=30
XC=0:YC=R
FX=0:FY=8*R:FS=4*R+3
WHILE FX<FY
splot8 //splot8 are eight plotz around the circle
XC=XC+1
FX=FX+8
IF FS>0
FS=FS-FX-4
ELSE
YC=YC-1
FY=FY-8
FS=FS-FX-4+FY
ENDIF
WEND
splot8
plot xcircle+XC,ycircle+YC
plot xcircle+XC,ycircle-YC
plot xcircle-XC,ycircle-YC
plot xcircle-XC,ycircle+YC
plot xcircle+YC,ycircle+XC
plot xcircle+YC,ycircle-XC
plot xcircle-YC,ycircle-XC
plot xcircle-YC,ycircle+XC
2. Fade co ramkę nie koniecznie jest wymogiem...
No to właśnie zależy od tego, czy ma być to raz na ramkę czy nie, jeśli nie to nie umieszczaj w przerwaniu, bo muzyczka będzie Ci się cieła.
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
@Kutfa Nitro daj tu jednak całą procedurę tego fadingu
@Sebaloz, czyli wykonaleś to dokładnie tak, jak napisałem post wcześniej.
Bo pecet to zwykły banan...
Unrollowac kody czyli wygenerować kod który leci ciurkiem zamiast korzystać z pętli czyliskull pisze: Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
lda $xxxx
sta $yyyy
Poza tym nie mogę tego sprawdzić bo jestem w pracy a nie mam w głowie ile cykli lda czy sta zajmuje (w końcu jestem co najwyżej przeciętniakiem (c) Ramos).
Kolejna kwestia to swoją wiedzę opierałem na efekcie który kiedyś napisałem i w około 0,5 ramki zmieniam cały obszar od $0400 do $07e8 (zaznaczę, że NIE PAMIĘTAM dokładnie ile to trwa bo całkiem możliwe, że trochę dłużej niż 0,5 frame).
A gdzie słowo proszę ?skull pisze: Tłumacz bo ja na razie tego nadal nie widze.

he,he i po co te nerwy... wszystko właśnie wyjaśniłeś, i się nawet zgadza, 0,5 frame na colormap i teraz jeszcze pół frame na color ram = 1 ramka, przy jak nazwałeś "unrolowaniu". No ale taki efekt moim zdaniem "za dużo kosztuje", i wykonanie jego będzie najwyżej "na styk" - może trzeba się będzie nawet pożegnać z playerem od muzyczki.zielok pisze: Unrollowac kody czyli wygenerować kod który leci ciurkiem zamiast korzystać z pętli czyli
lda $xxxx
sta $yyyy
Poza tym nie mogę tego sprawdzić bo jestem w pracy a nie mam w głowie ile cykli lda czy sta zajmuje (w końcu jestem co najwyżej przeciętniakiem (c) Ramos).
Kolejna kwestia to swoją wiedzę opierałem na efekcie który kiedyś napisałem i w około 0,5 ramki zmieniam cały obszar od $0400 do $07e8 (zaznaczę, że NIE PAMIĘTAM dokładnie ile to trwa bo całkiem możliwe, że trochę dłużej niż 0,5 frame).
Na samym początku napisałem, że mnie właśnie ciekawi podejście do tego tematu, bo uważam go zwyczajnie za trudny do prostego wykonania.
skull pisze: Tłumacz bo ja na razie tego nadal nie widze.
proście, a będziecie prości.zielok pisze: A gdzie słowo proszę ?
Bo pecet to zwykły banan...
Prawda, choć nie wziąłeś jednego sposobu pod uwagę, puszczenia kodu od dolnej ramki, za każdym razem będzie się troche zwiększać ale powinno wystarczyć na cały fade.no ale jesli ma się to wykonać dla każdej komórki, oraz dla colorRamu to nadal nie wystarcza czasu w jednej ramce -patrz wylicznia wyżej.
Ogólnie mówię cały czas o fade oucie który jest prostszy bo wartości wyjściowe wszystkich komórek są jednakowe.
Co do fadeinu, to metoda na całkowity precalc screenramów będzie najlepszym rozwiązaniem, do dwóch banków bitmapy i voila, mamy 16'o kolorowy fade.
Mówisz o fadeoucie? Jak wyżej.Kutfa Nitro daj tu jednak całą procedurę tego fadingu
- Sebaloz/Lepsi.De
- Posty: 3964
- Rejestracja: 14 wrz 2008, 00:02
Trzeba bylo wrzucic linka do calosciskull pisze:nie dawno wykorzystałem (z powodzeniem) to:
http://atariarea.krap.pl/forum/viewtopi ... 75#p104175
__________________________
Socjopatyczna Legia Commodore
Socjopatyczna Legia Commodore
hehe, ale ja wykorzystałem tylko to co wkleiłemSebaloz/Lepsi.De pisze:Trzeba bylo wrzucic linka do calosciskull pisze:nie dawno wykorzystałem (z powodzeniem) to:
http://atariarea.krap.pl/forum/viewtopi ... 75#p104175

Bo pecet to zwykły banan...