Citat:
@Aleksandar Ružičić Dali ova zadnja verzija engina moze da se kompajluje sa 0.18.3 ? I izgleda da je vasa inicijativa i moja popravka fbgfx-a uticala na ljude iz fb-a da malo srede kod :)
99% sam siguran da ce da se komapjlira i sa 0.18.3
Citat:
Mozes li me malo uputiti oko ovoga sa ucitavanjem alfa kanala iz png-a, jer se u kodu pominje i 8-bitna slika i rekonstrukcija alfa kanala ukoliko isti nije sacuvan pa mi nije bas jasno sta se tu desava Iskreno, nisam se bas ni udubio u kod ali bi bilo lepo da mi malo pojasnis situaciju. A mogao bi i neke upute da nam napises, ako imas vremena naravno, cisto oko toga za sta koja f-ja sluzi, jer me je malo smorilo ono prelistavanje svih datoteka u potrazi za f-jom u kojoj ce pisati screenres 640,480 ...
ucitavanje alfa kanala se vrsi iteracijom kroz sve pixele koji su tipa Uinteger i u ta 32bajta prva dva (MSB) predstavljaju alpha vrednost tog pixela.
a niz pixela slike (tj pointer na prvi clan tog niza) mozes da dobijes ovako
Dim As UInteger Pointer imagePixels = imagePointer + SizeOf(FB.IMAGE) gde ti je
imagePointer pointer koji si dobio kao rezultat poziva
ImageCreate ili neke druge kompatibilne fje (kao sto je
PNG_Load)
a za iteraciju i popunjavanje niza koristis
BPP i
Pitch clanove
FB.IMAGE strukture:
Code:
Dim As Any Pointer image = PNG_Load("slika.png")
Dim As UByte alphaChannel(0 To Cast(FB.IMAGE Pointer, image)->Width - 1, 0 To Cast(FB.IMAGE Pointer, image)->Height - 1)
Dim As Uinteger pitch = Cast(FB.IMAGE Pointer, image)->Pitch
Dim As Uinteger bpp = Cast(FB.IMAGE Pointer, image)->BPP
For X As Integer = 0 To Cast(FB.IMAGE Pointer, image)->Width - 1
For Y As Integer = 0 To Cast(FB.IMAGE Pointer, image)->Height - 1
alphaChannel(X, Y) = *Cast(UByte Pointer, image + SizeOf(FB.IMAGE) + Y * pitch + X * bpp + 3)
Next
Next
inace ovo bpp je
bytes
per
pixel a ja sam mislio da je bits per pixel pa sam zato ono imao problema sa alfa kanalom :)
a 8-bitna slika se nigde ne pominje u kodu vec se bpp mnozi sa 8 da bi se dobio color-depth te slike, recimo 32bitna slika ima bpp 4 (mnozenjem sa 8 dobijes 32)
a sto se tice uputa, bice manual (objasnjenje sta koja fja radi i za sta se koristi) kad zavrsim engine :) (tj kad bude bar u beta verziji)
a sto se tice pitanja u vezi screenres, ti (tj korisnik engine-a) ne poziva screenres nikad, vec pozove Engine.Initialize funkciju (koja poziva screenres)...
Citat:
Takodje se pri 16 bpp nista ne desava, tacnije samo crnilo, tj. mislim da tu negde zakazuje ovo oko dirt tehnike ili nesto drugo. A i ako je vec ispravljen taj bug u gfxlib-u mozda bi bolje bilo da se koristi double buffer, jer se onda sigurno nece desiti da neki deo ekrana ostane "prljav".
cekaj, 16bit png?? jer je samo png podrzan, ne i bmp... (i ako se ja pitam ni bmp i jpg ne bih ubacivao, png je najbolje resenje)
a sto se tice dirty rectangles, trenutno se ta tehnika ne koristi :) (i engine te ne tera da koristis tu tehniku, dovoljno je samo da pozoves Engine.MarkDirty bez argumenata da bi se pozvao onPaint dogadjaj) hocu prvo da zavrsim Math "modul" koji ce imati fje za "stapanje" vise regiona (pravougaonika) pa cu tad optimizovati ovu "podrsku" za didrty rectangles (tu mislim na pracenje regiona kojim je prosao kursor jer je to jedino sto engine radi, ostalo zavisi od korisnika enginea)
Citat:
BTW:
Znate li kako lepo izgleda kada se umesto slika iz test primera stave MAC OS Panther pozadina i SilverLight logo umesto lopte, prava bombonica .
znaci ovo sto sam ja nacrtao nevalja? dobro, dobro...
Citat:
I da umalo da zaboravim, Krcko kolizija je toliko dobro odradjena da sam se pola sata cudio i divio istoj!!! Jer je to pixel perfect ili ta po bejzirovim krivima? Posebno me je impresioniralo sto ista reaguje cak i na alpha kanal!
ovaaaj... detekcije kolizije nema jos uvek :)
trenutno postoji samo
MouseOverObject fja koja vraca true ukoliko se mis nalazi iznad "objekta", objekat je Bitmap tip, tj slika i detekcija se vrsi na sledeci nacin: prvo se proveri da li se kursor nalazi unutar pravougaonika koji ta slika zauzima, ukoliko je taj uslov zadovoljen onda se uzme lokacija kursora relativna u odnosu na X,Y pravougaonika, tj lokacija kursora na ekranu se svodi na lokaciju kursora unutar slike, onda se uzme pixel sa slike koji se nalazi na toj lokaciji i u zavisnosti od
mode parametra se iz tog pixela "cupa" odredjena informacija, ukoliko je
mode = AlphaValue (sto je default) onda se uzima alpha vrednost tog pixela i uporedjuje se sa trecim parametrom prosledjenim [MouseOverObject funkciji (to je
value parametar), ukoliko je alpha vrednost pixela manja ili jednaka vrednosti
value parametra (default je 30) onda funkcija zakljucuje da se kursor ne nalazi iznad objekta i vraca false (u suprotnom vraca true). e a ukoliko je
mode = TransColor onda se uzima RGB vrednost pixela i uporedjuje se sa trecim parametrom
value koji u ovom slucaju predstavlja RGB vrednost (recimo &HFF00FF ili
Color.Magenta konstanta), ukoliko su te dve vrednosti jednake onda se kursor nalazi iznad "providnog" dela slike pa fja vraca false
a kolizije ce biti, i bice vector-based, pixel-perfect moze da bude sporo u vecini slucajeva...
[Ovu poruku je menjao Aleksandar Ružičić dana 22.04.2008. u 08:04 GMT+1]