fade in/out grafiki w multicolorze

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
Awatar użytkownika
carrion
Posty: 2331
Rejestracja: 27 lut 2009, 17:38
Kontakt:

fade in/out grafiki w multicolorze

#1 Post autor: carrion »

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?
c64portal.pl, retronavigator.com

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#2 Post autor: skull »

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:

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...

zielok
Posty: 438
Rejestracja: 07 lis 2008, 21:23
Kontakt:

#3 Post autor: zielok »

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).
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)
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ć

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#4 Post autor: skull »

[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.
Bo pecet to zwykły banan...

k.

#5 Post autor: k. »

a nie lepiej w lace zrobić ściemnianie?

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#6 Post autor: Nitro »

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.

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#7 Post autor: skull »

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.
Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)

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...

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#8 Post autor: Nitro »

Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)
Proste:
ldx $0400
lda lut,x
sta $0400


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ść.
Również skuteczna metoda, zawsze coś musi być zjedzone, czy to pamięć czy to proc :)

Awatar użytkownika
Sebaloz/Lepsi.De
Posty: 3949
Rejestracja: 14 wrz 2008, 00:02

#9 Post autor: Sebaloz/Lepsi.De »

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
__________________________
Socjopatyczna Legia Commodore

Awatar użytkownika
carrion
Posty: 2331
Rejestracja: 27 lut 2009, 17:38
Kontakt:

#10 Post autor: carrion »

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ł :)
c64portal.pl, retronavigator.com

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#11 Post autor: Nitro »


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ę.
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.

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ć
IMHO 16 kolorów fade co ramkę to standard.

3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
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ą.

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#12 Post autor: skull »

Nitro pisze: Proste:
ldx $0400
lda lut,x
sta $0400
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.


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ę.
nie dawno wykorzystałem (z powodzeniem) to:

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...

3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
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.

@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...

zielok
Posty: 438
Rejestracja: 07 lis 2008, 21:23
Kontakt:

#13 Post autor: zielok »

skull pisze: Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
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).
skull pisze: Tłumacz bo ja na razie tego nadal nie widze.
A gdzie słowo proszę ? :)

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#14 Post autor: skull »

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).
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.

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.
zielok pisze: A gdzie słowo proszę ? :)
proście, a będziecie prości.
Bo pecet to zwykły banan...

zielok
Posty: 438
Rejestracja: 07 lis 2008, 21:23
Kontakt:

#15 Post autor: zielok »

skull pisze: he,he i po co te nerwy...
To poco się denerwujesz? Bo chyba nie twierdzisz, że ja mam nerwy :)

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#16 Post autor: Nitro »

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.
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.
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.
Kutfa Nitro daj tu jednak całą procedurę tego fadingu
Mówisz o fadeoucie? Jak wyżej.

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#17 Post autor: skull »

dobra juz widze, czyli rewolucji nie bedzie.
Bo pecet to zwykły banan...

zielok
Posty: 438
Rejestracja: 07 lis 2008, 21:23
Kontakt:

#18 Post autor: zielok »

skull pisze:dobra juz widze, czyli rewolucji nie bedzie.
Wykorzystać DMA w REU i będzie rewolucja :)

Awatar użytkownika
Sebaloz/Lepsi.De
Posty: 3949
Rejestracja: 14 wrz 2008, 00:02

#19 Post autor: Sebaloz/Lepsi.De »

skull pisze:nie dawno wykorzystałem (z powodzeniem) to:
Trzeba bylo wrzucic linka do calosci

http://atariarea.krap.pl/forum/viewtopi ... 75#p104175
__________________________
Socjopatyczna Legia Commodore

Awatar użytkownika
skull
Posty: 760
Rejestracja: 15 wrz 2008, 08:18
Grupa: samar

#20 Post autor: skull »

Sebaloz/Lepsi.De pisze:
skull pisze:nie dawno wykorzystałem (z powodzeniem) to:
Trzeba bylo wrzucic linka do calosci

http://atariarea.krap.pl/forum/viewtopi ... 75#p104175
hehe, ale ja wykorzystałem tylko to co wkleiłem :))))
Bo pecet to zwykły banan...

ODPOWIEDZ