cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by JATothrim »

Se looppaa, se etsii, se murskaa, se siirtää - se on cbCalc!
Eräänä iltana totesin, että en ole tehnyt CB:lle isompaa projektia vuosiin. Niimpä heitin Code::Blocksin auki ja väkersin tämän yleishyödyllisen DLL:n wanhalle CoolBasicille. DLL on kirjoitettu tavastani poiketen puhtaalla C-kielellä, jonka vuoksi kirjasto hakkaa takuu varmasti tulkin laskuoperaatioissa. Olkaa hyvä ja testatkaa viritelmää. Funktioita on jo yli 34, niin on mahdollista että jokin niistä on susi.
Kirjasto sopinee parhaiten efektien tekemiseen ja esilaskentaan. Postaan tämän esimerkkeihin, koska tällaiset viritelmät on perinteisesti postattu juuri tänne.

cbCalcin virallinen TODO-LIST:
  • Kaikki esitellyt, mutta implementoimattomat asiat valmiiksi + mahdolliset bugit pois
  • Line_intersect, Ray_intersect
  • Bitti operaatiot. Pikselin käsittely operaatioita?
  • 'RPN lasku kernelit' monimutkaisille laskuille, jos kerkeän tänne asti.
Lisää toimintoja saa ehdotaa, mutta ne viivästyttävät sitten tuon 'RPN lasku kernel':en toteutusta.

cbCalc_test ohjelmalla DLL:n saa "avautumaan" (haha.. :D ). Listaa kaikki .DLL:n puolella toteutetut funktiot.
cbCalc_example1 esittelee DLL:n tehoa siinä missä cbCalc nopein: tiukoissa loopeissa.
cbCalc_example2 on nätti efekti pläjäys ja esittelee miten kirjastoa käytetään.

Ja jos joku väittää että .7z paketti ei aukea, hänellä on erittäin huono pakkaus/purku ohjelma. 7zipllä toimii. ;)
EDIT:

Eäh. Tärkein unohtui - jos osaatte koodata C:tä voitte tehdä itse funktioita cbCalc:iin. Updateenkin oli vielä pesiytynyt päivämäärä typo?? *eääh* :roll:
Update 20.4.2011: PixelsToRGBf, RGBfToPixels ja kaksi apu funktiota. DLL:n header lisätty. (joka on varsin siivoton) Uutena esimerkinä valoefekti.

Attachments
cbCalcLib.7z
(29.73 KiB) Downloaded 345 times
Last edited by JATothrim on Thu Apr 28, 2011 4:54 pm, edited 3 times in total.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by MaGetzUb »

Tässä aikoinaan kirjoittamani kuvan piirto läpinäkyvyyden ja maskivärin kanssa;

Code: Select all

map = LoadImage("Media\Map.BMP")
img = LoadImage("Media\grass.BMP")

a = 127.5
Repeat 

    a = a + MouseMoveZ()

    DrawImage map,0,0

    DrawABImage(img,MouseX(),MouseY(), a)

    Text 0,0, FPS()
    DrawScreen Not MouseDown(1)
Forever 







Function DrawABImage(img,x,y,ab,maskr = 0, maskg = 0, maskb = 0)
    Lock SCREEN()
    Lock Image(img)
    If ab>0 Then 
        For i = 0 To ImageWidth(img)-1
            For j = 0 To ImageHeight(img)-1
                pix = GetPixel2(i,j,Image(img))
                r = ((pix Shl 8) Shr 24)
                g = ((pix Shl 16) Shr 24)
                b = ((pix Shl 24) Shr 24)
                If pix <> (maskr + (maskr Shl 8) + (maskg Shl 16) + (255 Shl 24)) Then
                    scrpix = GetPixel2(x+i,y+j,SCREEN())            
                    sr = ((scrpix Shl 8) Shr 24)
                    sg = ((scrpix Shl 16) Shr 24)
                    sb = ((scrpix Shl 24) Shr 24)            
                    _red = Int(Float(sr) + (Float(r) - Float(sr)) / 255 * ab)
                    _green = Int(Float(sg) + (Float(g) - Float(sg)) / 255 * ab)
                    _blue =  Int(Float(sb) + (Float(b) - Float(sb)) / 255 * ab)
                    If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight() Then
                        PutPixel2 x+i,y+j, _blue + (_green Shl 8) + (_red Shl 16) + (255 Shl 24), SCREEN()
                    EndIf 
                EndIf 
            Next j
        Next i
    EndIf 
    Unlock Image(img)
    Unlock SCREEN()
EndFunction 
Saisiko tuota nopeutettua kirjastollasi? Miten? :D
offtopic: Meni hermot tämän viestin kanssa piti monta kertaa editata, code tagitkin puuttui yhdessä välissä ja sen jälkeen puuttui alusta pikku brieffingi.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by MetalRain »

MaGetzUb wrote:Tässä aikoinaan kirjoittamani kuvan piirto läpinäkyvyyden ja maskivärin kanssa; [koodia] Saisiko tuota nopeutettua kirjastollasi? Miten? :D
Kokeilinpa tuon porttaamista cbCalcille, sain pari FPS enemmän. Ilman cbCalcia 10-11 FPS, cbCalcin kanssa 12-13 FPS. Tässä tapauksessa siis huomataan erityisesti että kun piirtämiseen/kuvapikselien hakuun kuluu paljon aikaa niin cbCalcin käyttö ei hyödytä juurikaan.

Code: Select all

Include "cbCalc.CB"

map = LoadImage("Map.BMP")
img = LoadImage("grass.BMP")

cbCalc_InitDLL()

w = ImageWidth(img)
h = ImageHeight(img)

size = w*h*4
count = w*h

source = MakeMEMBlock(size*3)
over = MakeMEMBlock(size*3)
target = MakeMEMBlock(size*3)

Lock Image(img)
    For i = 0 To w-1
        For j = 0 To h-1
        
            pix = GetPixel2(i,j,Image(img))
            
            pointer = (j*w+i)*4
            
            If pix <> (maskr + (maskg Shl 8) + (maskg Shl 16) + (255 Shl 24)) Then
                        
                PokeFloat over,pointer,((pix Shl 8) Shr 24)
                PokeFloat over,pointer+size,((pix Shl 16) Shr 24)
                PokeFloat over,pointer+size*2,((pix Shl 24) Shr 24)
    
            EndIf 
            
        Next j
    Next i
Unlock Image(img)

ab = 127.5
Repeat 

    ab = ab + MouseMoveZ()
    
    x=MouseX()
    y=MouseY()
    
    DrawImage map,0,0
    
    
    If ab>0 Then 
        Lock SCREEN()
        
        For i = 0 To w-1
            For j = 0 To h-1
            
                If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
                    
                    pointer = (j*w+i)*4

                    scrpix = GetPixel2(x+i,y+j,SCREEN())  
                
                    PokeFloat source,pointer,((scrpix Shl 8) Shr 24)
                    PokeFloat source,pointer+size,((scrpix Shl 16) Shr 24)
                    PokeFloat source,pointer+size*2,((scrpix Shl 24) Shr 24)
                    
                EndIf 
            Next j
        Next i
        
        // target = over + (over - source) / 255.0 * ab
        //--------------------
        // target = over
        // target = target - source
        // target = target/255.0
        // target = target*ab
        // target = target + over
        
        
        // target = over
        cbCalc_memadvcpy(over, target, 0, 4, count*3, 4, 0, 4)
        
        // target = target - source
        cbCalc_subtraction(source, target, count*3)
        
        // target = target/255.0
        cbCalc_div_by(target, 255.0, count*3)
     
     
        // target = target*ab
        cbCalc_mult_by(target, Float(ab), count*3)
        
        // target = target + over
        cbCalc_addition(over, target, count*3)


        For i = 0 To w-1
            For j = 0 To h-1 

                If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
                    
                    pointer = (j*w+i)*4

                    tr = PeekFloat(target,pointer)
                    tg = PeekFloat(target,pointer+size)
                    tb = PeekFloat(target,pointer+size*2)
 
                    PutPixel2 x+i,y+j, tb + (tg Shl 8) + (tr Shl 16) + (255 Shl 24), SCREEN()
                EndIf 
            Next j
        Next i

        Unlock SCREEN()
    EndIf 
    
    

    Text 0,0, FPS()+" "+ab
    DrawScreen Not MouseDown(1)
Forever 
EDIT: Knoy, en sitten tiedä johtuiko tuo funktiokutsun poistamisesta ja lähdekuvan kuvapikseliden esilaskemisesta. Voi myös olla ettei maskiväri enää toimi kunnolla, vaan enpä jäänyt sitä miettimään.

Pikselinkäsittelyyn olisi kiva jos itse pikseliarvolle voisi tehdä suoraan laskutoimituksia kuin ne olisivat RGB arvoja. Esimerkki:

Code: Select all

img= LoadImage("media/cow.bmp")

w = ImageWidth(img)
h = ImageHeight(img)

mem = MakeMEMBlock(w*h)

Lock Image(img)
    For y=0 To h-1
        For x=0 To w-1
            p = GetPixel2(x,y,Image(Img))
            PokeFloat mem, (y*w+x)*4, p
        Next x
    Next y
Unlock Image(img)

//tällä saataisiin pikselien väriarvo
//puolitettua eli RGB=(255,0,0) -> (128,0,0)
//jolloin saataisiin kuvaa nopeasti tummennettua
//tätä tulisi voida käyttää myös toisen muistipalan
//kanssa jolloin voidaan kuvia sulauttaa toisiinsa.
cbCalc_pixel_mult_by(mem, 0.5, w*h)
Last edited by MetalRain on Sun Apr 03, 2011 11:38 am, edited 5 times in total.
User avatar
Knoy
Active Member
Posts: 187
Joined: Fri Feb 12, 2010 10:50 pm

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by Knoy »

Tuohan on kuitenkin prosentuaalisesti aika mukava nousu.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by MaGetzUb »

Tämäkirjastohan voisi vähän parantaa nopeutta jos tätä käyttäisi yhtäaikaa cbSDL/cbOpenGL:n kanssa?

Eidt:
MetalRain wrote:

Code: Select all

img= LoadImage("media/cow.bmp")

w = ImageWidth(img)
h = ImageHeight(img)

mem = MakeMEMBlock(w*h)

Lock Image(img)
    For y=0 To h-1
        For x=0 To w-1
            p = GetPixel2(x,y,Image(Img))
            PokeFloat mem, (y*w+x)*4, p
        Next x
    Next y
Unlock Image(img)

//tällä saataisiin pikselien väriarvo
//puolitettua eli RGB=(255,0,0) -> (128,0,0)
//jolloin saataisiin kuvaa nopeasti tummennettua
//tätä tulisi voida käyttää myös toisen muistipalan
//kanssa jolloin voidaan kuvia sulauttaa toisiinsa.
cbCalc_pixel_mult_by(mem, 0.5, w*h)
Eikös tuola kun luodaan muistipala 'mem = MakeMEMBlock(w*h)' pitäisi olla näin: 'mem = MakeMEMBlock((w*h)*4)', koska kyseiseen muistipalaan tallennetaan nelitavuisia arvoja?
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by JATothrim »

MetalRain wrote:
MaGetzUb wrote:Tässä aikoinaan kirjoittamani kuvan piirto läpinäkyvyyden ja maskivärin kanssa; [koodia] Saisiko tuota nopeutettua kirjastollasi? Miten? :D
Kokeilinpa tuon porttaamista cbCalcille, sain pari FPS enemmän. Ilman cbCalcia 10-11 FPS, cbCalcin kanssa 12-13 FPS. Tässä tapauksessa siis huomataan erityisesti että kun piirtämiseen/kuvapikselien hakuun kuluu paljon aikaa niin cbCalcin käyttö ei hyödytä juurikaan.

Code: Select all

Include "cbCalc.CB"

map = LoadImage("Map.BMP")
img = LoadImage("grass.BMP")

cbCalc_InitDLL()

w = ImageWidth(img)
h = ImageHeight(img)

size = w*h*4
count = w*h

source = MakeMEMBlock(size*3)
over = MakeMEMBlock(size*3)
target = MakeMEMBlock(size*3)

Lock Image(img)
    For i = 0 To w-1
        For j = 0 To h-1
        
            pix = GetPixel2(i,j,Image(img))
            
            pointer = (j*w+i)*4
            
            If pix <> (maskr + (maskg Shl 8) + (maskg Shl 16) + (255 Shl 24)) Then
                        
                PokeFloat over,pointer,((pix Shl 8) Shr 24)
                PokeFloat over,pointer+size,((pix Shl 16) Shr 24)
                PokeFloat over,pointer+size*2,((pix Shl 24) Shr 24)
    
            EndIf 
            
        Next j
    Next i
Unlock Image(img)

ab = 127.5
Repeat 

    ab = ab + MouseMoveZ()
    
    x=MouseX()
    y=MouseY()
    
    DrawImage map,0,0
    
    
    If ab>0 Then 
        Lock SCREEN()
        
        For i = 0 To w-1
            For j = 0 To h-1
            
                If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
                    
                    pointer = (j*w+i)*4

                    scrpix = GetPixel2(x+i,y+j,SCREEN())  
                
                    PokeFloat source,pointer,((scrpix Shl 8) Shr 24)
                    PokeFloat source,pointer+size,((scrpix Shl 16) Shr 24)
                    PokeFloat source,pointer+size*2,((scrpix Shl 24) Shr 24)
                    
                EndIf 
            Next j
        Next i
        
        // target = over + (over - source) / 255.0 * ab
        //--------------------
        // target = over
        // target = target - source
        // target = target/255.0
        // target = target*ab
        // target = target + over
        
        
        // target = over
        cbCalc_memadvcpy(over, target, 0, 4, count*3, 4, 0, 4)
        
        // target = target - source
        cbCalc_subtraction(source, target, count*3)
        
        // target = target/255.0
        cbCalc_div_by(target, 255.0, count*3)
     
     
        // target = target*ab
        cbCalc_mult_by(target, Float(ab), count*3)
        
        // target = target + over
        cbCalc_addition(over, target, count*3)


        For i = 0 To w-1
            For j = 0 To h-1 

                If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
                    
                    pointer = (j*w+i)*4

                    tr = PeekFloat(target,pointer)
                    tg = PeekFloat(target,pointer+size)
                    tb = PeekFloat(target,pointer+size*2)
 
                    PutPixel2 x+i,y+j, tb + (tg Shl 8) + (tr Shl 16) + (255 Shl 24), SCREEN()
                EndIf 
            Next j
        Next i

        Unlock SCREEN()
    EndIf 
    
    

    Text 0,0, FPS()+" "+ab
    DrawScreen Not MouseDown(1)
Forever 
EDIT: Knoy, en sitten tiedä johtuiko tuo funktiokutsun poistamisesta ja lähdekuvan kuvapikseliden esilaskemisesta. Voi myös olla ettei maskiväri enää toimi kunnolla, vaan enpä jäänyt sitä miettimään.

Pikselinkäsittelyyn olisi kiva jos itse pikseliarvolle voisi tehdä suoraan laskutoimituksia kuin ne olisivat RGB arvoja. Esimerkki:

Code: Select all

img= LoadImage("media/cow.bmp")

w = ImageWidth(img)
h = ImageHeight(img)

mem = MakeMEMBlock(w*h)

Lock Image(img)
    For y=0 To h-1
        For x=0 To w-1
            p = GetPixel2(x,y,Image(Img))
            PokeFloat mem, (y*w+x)*4, p
        Next x
    Next y
Unlock Image(img)

//tällä saataisiin pikselien väriarvo
//puolitettua eli RGB=(255,0,0) -> (128,0,0)
//jolloin saataisiin kuvaa nopeasti tummennettua
//tätä tulisi voida käyttää myös toisen muistipalan
//kanssa jolloin voidaan kuvia sulauttaa toisiinsa.
cbCalc_pixel_mult_by(mem, 0.5, w*h)
Hmm. cbCalc osaa tällä hetkellä vain float operaatioita, joten taidankin tehdä seuraavaksi pixelin murskaukseen sopivampaa tavaraa. Seuraavat nyt ainakin:
  • cbCalc_PixelToRGBA
  • cbCalc_RGBAToPixel
  • cbCalc_clamp
Jolloin CB:lle jää vain imagen lataus muistipalaan ja siitä pois.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by Latexi95 »

JATothrim wrote:
Hmm. cbCalc osaa tällä hetkellä vain float operaatioita, joten taidankin tehdä seuraavaksi pixelin murskaukseen sopivampaa tavaraa. Seuraavat nyt ainakin:
  • cbCalc_PixelToRGBA
  • cbCalc_RGBAToPixel
  • cbCalc_clamp
Jolloin CB:lle jää vain imagen lataus muistipalaan ja siitä pois.
Siis mihin cbCalc_PixelToRGBAta ja cbCalc_RGBAToPixeliä tarvittaisiin? Pikselissähän vain RGBA on kirjoitettu kokonaisluvun tavuihin ihan vain peräkkäin. Ehdottaisi erilaisten pakkausalgorytmejen kehittämistä cbCalcille, niissä se pääsisi ainakin loistamaan. :P
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by JATothrim »

Latexi95 wrote:
JATothrim wrote:
Hmm. cbCalc osaa tällä hetkellä vain float operaatioita, joten taidankin tehdä seuraavaksi pixelin murskaukseen sopivampaa tavaraa. Seuraavat nyt ainakin:
  • cbCalc_PixelToRGBA
  • cbCalc_RGBAToPixel
  • cbCalc_clamp
Jolloin CB:lle jää vain imagen lataus muistipalaan ja siitä pois.
Siis mihin cbCalc_PixelToRGBAta ja cbCalc_RGBAToPixeliä tarvittaisiin? Pikselissähän vain RGBA on kirjoitettu kokonaisluvun tavuihin ihan vain peräkkäin. Ehdottaisi erilaisten pakkausalgorytmejen kehittämistä cbCalcille, niissä se pääsisi ainakin loistamaan. :P
cbCalc_PixelToRGB(A) ja cbCalc_RGB(A)ToPixel tarvitaan siihen, että CB:n ei tarvitse hajottaa/koota pixeliä itse. Riittää, että Get/PutPixel2:lla siirretään kuvadataa muistipalojen ja kuvien välillä. Nämä funkkarit siis hajottavat pikselin niin, että värikanavana toimii float, eikä byte --> cbCalc:n matikka on käytetävissä.

Btw. teen tuon kuvan blendaus funkkarin suoraan cbCalc:iin. Alpha kanavalla + blendmode, sekä pelkällä blendauksella. :)
EDIT:

Bump!

-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by MaGetzUb »

Et viitsisi laittaa tuota Zipiksi? :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by JATothrim »

MaGetzUb wrote:Et viitsisi laittaa tuota Zipiksi? :)
Tässä fix'd paketti . Jotain häröä olin puuhannu aamulla... -___-
Last edited by JATothrim on Thu Apr 21, 2011 4:04 pm, edited 1 time in total.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: cbCalc kirjasto - Rinnakkais*laskentaa^2 !!

Post by Misthema »

JATothrim wrote:
MaGetzUb wrote:Et viitsisi laittaa tuota Zipiksi? :)
Tässä. :roll:
Höhö, tuossa tuli kyllä kaikkea muutakin kuin pelkkä zippi... =D
En sitten tiedä oliko tarkoituskin, mutta pakettisi sisältää cbCalcLib.7z ja 7zip kansion jossa on cbCalcLib.zip.
Post Reply