Efektit

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
User avatar
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Re: Efektit

Post by Someday coder » Sat Jan 09, 2010 11:53 pm

Peliin tuli väännettyä meteoriitteja ja räjähdyksiä,

Code: Select all

FrameLimit 45
SCREEN 600,400
Dim meteors(5,3)
Dim exp(30,3)

For i=0 To 1
    meteors(i,0)=Rand(100,-300)
    meteors(i,1)=Rand(0,-300)
    meteors(i,2)=-45
    meteors(i,3)=Rand(14,20)
Next i

Repeat
 
    For i=0 To 1
        x#=meteors(i,0)
        y#=meteors(i,1)
        a#=meteors(i,2)
        s#=meteors(i,3)
        If x# > 600 Or y# > 300+((s#-14)/6)*40 Then 
            If y# > 300+((s#-14)/6)*40 Then explosive(x#,y#,-a#,s#*2)
            meteors(i,0)=Rand(100,-300)
            meteors(i,1)=Rand(0,-300)
            meteors(i,2)=-45
            meteors(i,3)=Rand(14,20)
            x#=meteors(i,0)
            y#=meteors(i,1)
            a#=meteors(i,2)
            s#=meteors(i,3)
        EndIf
        x#=x#+Cos(a#)*s#
        y#=y#-Sin(a#)*s#
        x2#=x#+Cos(WrapAngle(a#-180))*(s#/2)
        y2#=y#-Sin(WrapAngle(a#-180))*(s#/2)
        x3#=x2#+Cos(WrapAngle(a#-180))*s#
        y3#=y2#-Sin(WrapAngle(a#-180))*s#
        Color cbred
        Line x#,y#,x2#,y2#
        Color cbyellow
        Line x2#,y2#,x3#,y3#
        If s# > 15 Then 
            add#=Cos(WrapAngle(a#-90))*1.41
            add2#=-Sin(WrapAngle(a#-90))*1.41
            Color cbred
            Line x#+add#,y#+add2#,x2#+add#,y2#+add2#
            Color cbyellow
            Line x2#+add#,y2#+add2#,x3#+add#,y3#+add2#
        EndIf
        If s# > 17 Then 
            add#=Cos(WrapAngle(a#-90))*2.8
            add2#=-Sin(WrapAngle(a#-90))*2.8
            Color cbred
            Line x#+add#,y#+add2#,x2#+add#,y2#+add2#
            Color cbyellow
            Line x2#+add#,y2#+add2#,x3#+add#,y3#+add2#
        EndIf
        meteors(i,0)=x#
        meteors(i,1)=y#
    Next i
    
    For i=0 To 30
        x#=exp(i,0)
        y#=exp(i,1)
        d#=exp(i,2)
        p#=exp(i,3)
        s#=p/85
        x=x+Cos(d)*s#
        y=y-Sin(d)*s#
        x2#=x+Cos(d)*s#
        y2#=y-Sin(d)*s#
        d-10
        Color s#/15*255,s#/15*255,s#/15*255
        Line x,y,x2,y2
        exp(i,0)=x2
        exp(i,1)=y2
        exp(i,3)=exp(i,3)/(1.5/s#+1)
    Next i
    Line 0,300,600,300
    Color cbwhite
    Text 10,370,"Magic shield productions"

    DrawScreen
Forever 

Function explosive(x#,y#,d#,p#)
    For i=0 To 30
        exp(i,0)=Rand(x-p/20+Cos(d)*Rand(0,p/10),x+p/20+Cos(d)*Rand(0,p/10))
        exp(i,1)=Rand(y-p/2-Sin(d)*Rand(0,p),y+p/2-Sin(d)*Rand(0,p))
        exp(i,2)=Rand(d-p*2,d+p)
        exp(i,3)=Rand(p*3,p*p)
    Next i
EndFunction

DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Efektit

Post by DatsuniG » Sun Jan 10, 2010 4:10 pm

Kämänen liekki-efekti:

Code: Select all

Const MAXPARTICLES = 150
Const PARTICLEMAXSIZE = 40

Global gEmitterAmount, gParticleAmount

Type FireEmitter
    Field x#
    Field y#
    Field w#
    Field duration
    Field timerr
    Field Amount
EndType

Type FireParticles
    Field x#
    Field y#
    Field r#
    Field g#
    Field b#
    Field size#
    Field targ#
EndType

Repeat
    If MouseHit(1) Then CreateFireEmitter(MouseX(),MouseY(),100,10000)
    UpdateFireEmitters()
    UpdateFireParticles()
    DrawScreen
Forever 

Function CreateFireEmitter(x#,y#,w#,duration)
    neu.FireEmitter = New(FireEmitter)
    neu\x = x
    neu\y = y
    neu\w = w
    neu\duration = duration
    neu\timerr = Timer()
    gEmitterAmount + 1
EndFunction 

Function UpdateFireEmitters()
    For neu.FireEmitter = Each FireEmitter
        If neu\amount < MAXPARTICLES / gEmitterAmount And gParticleAmount < MAXPARTICLES Then 
            uusi.FireParticles = New(FireParticles)
            uusi\x = neu\x + Rnd(neu\w)
            uusi\y = neu\y
            uusi\r = 255
            uusi\g = 255
            uusi\b = 255
            uusi\targ = neu\x + neu\w / 2
            uusi\size = PARTICLEMAXSIZE
            gParticleAmount + 1
        EndIf 
        If Timer() - neu\timerr > neu\duration Then 
            Delete neu
            gEmitterAmount - 1
        EndIf 
    Next neu
EndFunction 

Function UpdateFireParticles()
    For uusi.FireParticles = Each FireParticles
        uusi\y = uusi\y - 2
        If uusi\x > uusi\targ Then uusi\x - 0.2 Else uusi\x + 0.2
        uusi\g = Max(0,uusi\g - 2)
        uusi\b = max(0,uusi\b - 5)
        uusi\size - 0.4
        Color uusi\r,uusi\g,uusi\b
        Circle uusi\x,uusi\y,uusi\size
        If (uusi\b = 0 And uusi\g = 0) Or uusi\x < 0 Or uusi\x > ScreenWidth() Or uusi\y < 0 Or uusi\y > ScreenHeight() Or uusi\size < 2 Then Delete uusi : gParticleAmount - 1
    Next uusi
EndFunction 
        
Hengität nyt manuaalisesti.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Mon Jan 11, 2010 7:46 pm

3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
    Field x1
    Field y1
    Field x2
    Field y2
    Field x3
    Field y3
    Field r
    Field g
    Field b
EndType

Type kgl_matrix
    Field a#
    Field b#
    Field c#
    Field d#
    
    Field e#
    Field f#
    Field g#
    Field h#
    
    Field i#
    Field j#
    Field k#
    Field l#
    
    Field m#
    Field n#
    Field o#
    Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
    kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+z*z)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction

Function kgl_gettranslation(x#, y#, z#)
    m.kgl_matrix = New(kgl_matrix)
    m\a=1:m\b=0:m\c=0:m\d=0
    m\e=0:m\f=1:m\g=0:m\h=0
    m\i=0:m\j=0:m\k=1:m\l=0
    m\m=x:m\n=y:m\o=z:m\p=1
    Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)
    
    m.kgl_matrix = New(kgl_matrix)
    m1.kgl_matrix = ConvertToType(m1_id)
    m2.kgl_matrix = ConvertToType(m2_id)
    
    m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
    m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
    m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
    m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
    
    m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
    m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
    m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
    m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
    
    m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
    m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
    m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
    m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
    
    m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
    m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
    m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
    m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
    
    Return ConvertToInteger(m)
EndFunction

Function render()
    kgl_used_triangles = kgl_used_triangles - 1
    If(kgl_used_triangles >1) Then sort()
    Lock
        For i = 0 To kgl_used_triangles
            t.kgl_tris = ConvertToType(kgl_t_id(i))
            filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
            Delete t
        Next i
    Unlock
    kgl_used_triangles = 0
EndFunction

Function sort()
    changes = 1
    gap# = kgl_used_triangles
    Repeat
        gap = gap/1.247330950103979
        If gap = 10 Or gap = 9
            gap = 11
        EndIf
        If gap<=1 Then gap = 1
        changes = 0
        For i = 0 To (kgl_used_triangles-gap)
            igap = i + gap
            If (kgl_t_z(i)<kgl_t_z(igap)) Then
                tempz# = kgl_t_z(i)
                tempid% = kgl_t_id(i)
                kgl_t_z(i) = kgl_t_z(igap)
                kgl_t_id(i) = kgl_t_id(igap)
                kgl_t_z(igap) = tempz#
                kgl_t_id(igap) = tempid%
                changes = 1
            EndIf
        Next i
    Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
    Color r, g, b
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    If(Int(y1)<Int(y2)) Then
        For i = y1 To y2
            Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
        Next i
    EndIf
    If(Int(y2)<Int(y3)) Then
        For i = y2 To y3
            Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
        Next i
    EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
    
    m.kgl_matrix = ConvertToType(kgl_curmatrix)
    
    nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
    ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
    nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
    x1 = nx1: y1 = ny1: z1 = nz1
    
    nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
    ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
    nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
    x2 = nx2: y2 = ny2: z2 = nz2
    
    nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
    ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
    nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
    x3 = nx3: y3 = ny3: z3 = nz3
    
    If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
    s1# = (1.0/z1#)*cop
    s2# = (1.0/z2#)*cop
    s3# = (1.0/z3#)*cop
    t.kgl_tris = New(kgl_tris)
    t\x1 = Int(s1*x1+w)
    t\y1 = Int((-s1)*y1+h)
    t\x2 = Int(s2*x2+w)
    t\y2 = Int((-s2)*y2+h)
    t\x3 = Int(s3*x3+w)
    t\y3 = Int((-s3)*y3+h)
    If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
    If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
    t\r = r
    t\g = g
    t\b = b
    kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
    kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
    kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat
    
    ang# = ang# - 1.0
    For j = 0 To 3
        kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
        For i = 0 To 4
            kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
            col = 50+i*20
            drawcube(col, col, col)
        Next i
    Next j
    
    render()
    
    Color 255, 255, 255
    Text 10, 10, Str(FPS())
    
    DrawScreen
    
Forever

User avatar
Ruuttu
Devoted Member
Posts: 687
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: Efektit

Post by Ruuttu » Mon Jan 11, 2010 11:32 pm

Wow, jopas pyöri hyvin - FPS 60. Hienosti animoitukin vielä :P. Tästä voi kuule tulla jotain suurta ja mahtavaa...tai sitten ei. CBC, folks.

WOW......

Re: Efektit

Post by WOW...... » Tue Jan 12, 2010 9:27 am

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
    Field x1
    Field y1
    Field x2
    Field y2
    Field x3
    Field y3
    Field r
    Field g
    Field b
EndType

Type kgl_matrix
    Field a#
    Field b#
    Field c#
    Field d#
    
    Field e#
    Field f#
    Field g#
    Field h#
    
    Field i#
    Field j#
    Field k#
    Field l#
    
    Field m#
    Field n#
    Field o#
    Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
    kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+z*z)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction

Function kgl_gettranslation(x#, y#, z#)
    m.kgl_matrix = New(kgl_matrix)
    m\a=1:m\b=0:m\c=0:m\d=0
    m\e=0:m\f=1:m\g=0:m\h=0
    m\i=0:m\j=0:m\k=1:m\l=0
    m\m=x:m\n=y:m\o=z:m\p=1
    Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)
    
    m.kgl_matrix = New(kgl_matrix)
    m1.kgl_matrix = ConvertToType(m1_id)
    m2.kgl_matrix = ConvertToType(m2_id)
    
    m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
    m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
    m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
    m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
    
    m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
    m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
    m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
    m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
    
    m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
    m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
    m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
    m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
    
    m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
    m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
    m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
    m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
    
    Return ConvertToInteger(m)
EndFunction

Function render()
    kgl_used_triangles = kgl_used_triangles - 1
    If(kgl_used_triangles >1) Then sort()
    Lock
        For i = 0 To kgl_used_triangles
            t.kgl_tris = ConvertToType(kgl_t_id(i))
            filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
            Delete t
        Next i
    Unlock
    kgl_used_triangles = 0
EndFunction

Function sort()
    changes = 1
    gap# = kgl_used_triangles
    Repeat
        gap = gap/1.247330950103979
        If gap = 10 Or gap = 9
            gap = 11
        EndIf
        If gap<=1 Then gap = 1
        changes = 0
        For i = 0 To (kgl_used_triangles-gap)
            igap = i + gap
            If (kgl_t_z(i)<kgl_t_z(igap)) Then
                tempz# = kgl_t_z(i)
                tempid% = kgl_t_id(i)
                kgl_t_z(i) = kgl_t_z(igap)
                kgl_t_id(i) = kgl_t_id(igap)
                kgl_t_z(igap) = tempz#
                kgl_t_id(igap) = tempid%
                changes = 1
            EndIf
        Next i
    Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
    Color r, g, b
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    If(Int(y1)<Int(y2)) Then
        For i = y1 To y2
            Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
        Next i
    EndIf
    If(Int(y2)<Int(y3)) Then
        For i = y2 To y3
            Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
        Next i
    EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
    
    m.kgl_matrix = ConvertToType(kgl_curmatrix)
    
    nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
    ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
    nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
    x1 = nx1: y1 = ny1: z1 = nz1
    
    nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
    ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
    nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
    x2 = nx2: y2 = ny2: z2 = nz2
    
    nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
    ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
    nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
    x3 = nx3: y3 = ny3: z3 = nz3
    
    If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
    s1# = (1.0/z1#)*cop
    s2# = (1.0/z2#)*cop
    s3# = (1.0/z3#)*cop
    t.kgl_tris = New(kgl_tris)
    t\x1 = Int(s1*x1+w)
    t\y1 = Int((-s1)*y1+h)
    t\x2 = Int(s2*x2+w)
    t\y2 = Int((-s2)*y2+h)
    t\x3 = Int(s3*x3+w)
    t\y3 = Int((-s3)*y3+h)
    If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
    If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
    t\r = r
    t\g = g
    t\b = b
    kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
    kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
    kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat
    
    ang# = ang# - 1.0
    For j = 0 To 3
        kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
        For i = 0 To 4
            kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
            col = 50+i*20
            drawcube(col, col, col)
        Next i
    Next j
    
    render()
    
    Color 255, 255, 255
    Text 10, 10, Str(FPS())
    
    DrawScreen
    
Forever
Wow, Voitko tehdä esimerkin, jossa on neliö jota voi liikutttaa nuolilla.

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Efektit

Post by JATothrim » Tue Jan 12, 2010 2:25 pm

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

... vau. matriiseja...
Hieno 3D-moottorin alku! (Upeaa grafiikkaa) Muistipaloilla saisi kenties vieläkin enemmän nopeutta irti, kun objekti käännetään kokonaisuudessaan mahdollisiman nopeasti piirrettäväksi. (vähän kuin glLists + glCompile) Silmiin pisti hieman kuution piirtotapa: uusi instanssi luodaan ja poistetaan joka kierroksella?
-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
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: Efektit

Post by Pate5 » Tue Jan 12, 2010 3:39 pm

koodaaja wrote:3D-systeemi edistyy. Valaistujen kartioiden sijaan tällä kertaa pientä matriisikikkailua. Jos rupeatte koodia tutkimaan niin havaitsette todennäköisesti muutamassakin kohdassa lyhenteen 'kgl', joka on ogl:stä suoraan apinoituna "koodaaja's graphic library". Ei tästä tosin ainakaan tällaisenaan vielä mitään kirjastoa saa aikaan, mutta ehkäpä joskus (todennäköisesti ei, seuraava coolbasic painaa niin nopeasti päälle että sillä kannattaa mieluummin alkaa sitten kehitellä)

Code: Select all

Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Type kgl_tris
    Field x1
    Field y1
    Field x2
    Field y2
    Field x3
    Field y3
    Field r
    Field g
    Field b
EndType

Type kgl_matrix
    Field a#
    Field b#
    Field c#
    Field d#
    
    Field e#
    Field f#
    Field g#
    Field h#
    
    Field i#
    Field j#
    Field k#
    Field l#
    
    Field m#
    Field n#
    Field o#
    Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
    kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+z*z)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction

Function kgl_gettranslation(x#, y#, z#)
    m.kgl_matrix = New(kgl_matrix)
    m\a=1:m\b=0:m\c=0:m\d=0
    m\e=0:m\f=1:m\g=0:m\h=0
    m\i=0:m\j=0:m\k=1:m\l=0
    m\m=x:m\n=y:m\o=z:m\p=1
    Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)
    
    m.kgl_matrix = New(kgl_matrix)
    m1.kgl_matrix = ConvertToType(m1_id)
    m2.kgl_matrix = ConvertToType(m2_id)
    
    m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
    m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
    m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
    m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
    
    m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
    m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
    m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
    m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
    
    m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
    m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
    m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
    m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
    
    m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
    m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
    m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
    m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
    
    Return ConvertToInteger(m)
EndFunction

Function render()
    kgl_used_triangles = kgl_used_triangles - 1
    If(kgl_used_triangles >1) Then sort()
    Lock
        For i = 0 To kgl_used_triangles
            t.kgl_tris = ConvertToType(kgl_t_id(i))
            filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
            Delete t
        Next i
    Unlock
    kgl_used_triangles = 0
EndFunction

Function sort()
    changes = 1
    gap# = kgl_used_triangles
    Repeat
        gap = gap/1.247330950103979
        If gap = 10 Or gap = 9
            gap = 11
        EndIf
        If gap<=1 Then gap = 1
        changes = 0
        For i = 0 To (kgl_used_triangles-gap)
            igap = i + gap
            If (kgl_t_z(i)<kgl_t_z(igap)) Then
                tempz# = kgl_t_z(i)
                tempid% = kgl_t_id(i)
                kgl_t_z(i) = kgl_t_z(igap)
                kgl_t_id(i) = kgl_t_id(igap)
                kgl_t_z(igap) = tempz#
                kgl_t_id(igap) = tempid%
                changes = 1
            EndIf
        Next i
    Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
    Color r, g, b
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    If(Int(y1)<Int(y2)) Then
        For i = y1 To y2
            Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
        Next i
    EndIf
    If(Int(y2)<Int(y3)) Then
        For i = y2 To y3
            Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
        Next i
    EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
    
    m.kgl_matrix = ConvertToType(kgl_curmatrix)
    
    nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
    ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
    nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
    x1 = nx1: y1 = ny1: z1 = nz1
    
    nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
    ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
    nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
    x2 = nx2: y2 = ny2: z2 = nz2
    
    nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
    ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
    nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
    x3 = nx3: y3 = ny3: z3 = nz3
    
    If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
    s1# = (1.0/z1#)*cop
    s2# = (1.0/z2#)*cop
    s3# = (1.0/z3#)*cop
    t.kgl_tris = New(kgl_tris)
    t\x1 = Int(s1*x1+w)
    t\y1 = Int((-s1)*y1+h)
    t\x2 = Int(s2*x2+w)
    t\y2 = Int((-s2)*y2+h)
    t\x3 = Int(s3*x3+w)
    t\y3 = Int((-s3)*y3+h)
    If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
    If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
    t\r = r
    t\g = g
    t\b = b
    kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
    kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
    kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat
    
    ang# = ang# - 1.0
    For j = 0 To 3
        kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
        For i = 0 To 4
            kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
            col = 50+i*20
            drawcube(col, col, col)
        Next i
    Next j
    
    render()
    
    Color 255, 255, 255
    Text 10, 10, Str(FPS())
    
    DrawScreen
    
Forever

Mahtavaa työtä! Uskomattoman hieno, ja pyörii hyvällä FPS:llä(n. 30-40)

Kuutioihin voisi varmaan lisätä vähän enemmän kolmiulotteisuuden tuntua värjäämällä eri sivut hiukan eri värisiksi? Tähän tyyliin:

Code: Select all

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5,Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, Min(r+20, 255), Min(g+20, 255),  Min(b+20, 255))
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, Min(r+20, 255), Min(g+20, 255),  Min(b+20, 255))
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, Min(r+10, 255), Min(g+10, 255),  Min(b+10, 255))
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, Max(r-10, 0), Max(g-10, 0),  Max(b-10, 0))
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, Max(r-10, 0), Max(g-10, 0),  Max(b-10, 0))
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction
Täysi feikkihän tuo olisi, mutta näin kuutiot eivät näytä pyöreäkulmaisilta.
CoolBasic henkilökuntaa
Graafikko

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Efektit

Post by MaGetzUb » Tue Jan 12, 2010 4:36 pm

Ei muutakuin teksturoimaan Aavesoturin GL:ä, niin ei veisi CB:n piirtokomennot tehoja koneelta.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Tue Jan 12, 2010 5:16 pm

@Jatothrim: Juu, optimointia on vielä tehtävissä paljonkin, mikäli haluaa rutistaa ne viimeiset FPS:t irti. Olennaisinta olisi tallennella matriisien välivaiheita vähän enemmän kuin nyt teen, laskemisosuus pienenisi huomattavasti. Kolmioiden uudelleenluonti joka framella on siinä mielessä kiva ettei niistä tarvitse funktioita käytettäessä pitää mitään lukua, toimii samaan tapaan kuin piirtokomennot. Ja pullonkaula ei todellakaan ole sorttaus tai tyypin jäsenten luonti ja poistelu, kyllä se trifill vie ehdottomasti eniten aikaa vaikka lukittuna piirtääkin.

@Pate5, kyllä vaan, tuo näyttää jo huomattavasti paremmalta (: tietysti ne voisi laskea ihan pintojen normaaleista kuten olin aiemmassa kartiosysteemissä tehnyt, voisin kohta väsäillä sellaisen version.

EDIT:tässäpä tätä.

Code: Select all

Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Global ldirx As Float
Global ldiry As Float
Global ldirz As Float

ldirx=-1.0
ldiry=2.0
ldirz=-4.0

ldirL# = Sqrt(ldirx*ldirx+ldiry*ldiry+ldirz*ldirz)

ldirx = ldirx/ldirL#
ldiry = ldiry/ldirL#
ldirz = ldirz/ldirL#

Type kgl_tris
    Field x1
    Field y1
    Field x2
    Field y2
    Field x3
    Field y3
    Field r
    Field g
    Field b
EndType

Type kgl_matrix
    Field a#
    Field b#
    Field c#
    Field d#
    
    Field e#
    Field f#
    Field g#
    Field h#
    
    Field i#
    Field j#
    Field k#
    Field l#
    
    Field m#
    Field n#
    Field o#
    Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
    kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+z*z)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction

Function kgl_gettranslation(x#, y#, z#)
    m.kgl_matrix = New(kgl_matrix)
    m\a=1:m\b=0:m\c=0:m\d=0
    m\e=0:m\f=1:m\g=0:m\h=0
    m\i=0:m\j=0:m\k=1:m\l=0
    m\m=x:m\n=y:m\o=z:m\p=1
    Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)
    
    m.kgl_matrix = New(kgl_matrix)
    m1.kgl_matrix = ConvertToType(m1_id)
    m2.kgl_matrix = ConvertToType(m2_id)
    
    m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
    m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
    m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
    m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
    
    m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
    m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
    m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
    m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
    
    m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
    m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
    m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
    m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
    
    m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
    m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
    m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
    m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
    
    Return ConvertToInteger(m)
EndFunction

Function render()
    kgl_used_triangles = kgl_used_triangles - 1
    If(kgl_used_triangles >1) Then sort()
    Lock
        For i = 0 To kgl_used_triangles
            t.kgl_tris = ConvertToType(kgl_t_id(i))
            filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
            Delete t
        Next i
    Unlock
    kgl_used_triangles = 0
EndFunction

Function sort()
    changes = 1
    gap# = kgl_used_triangles
    Repeat
        gap = gap/1.247330950103979
        If gap = 10 Or gap = 9
            gap = 11
        EndIf
        If gap<=1 Then gap = 1
        changes = 0
        For i = 0 To (kgl_used_triangles-gap)
            igap = i + gap
            If (kgl_t_z(i)<kgl_t_z(igap)) Then
                tempz# = kgl_t_z(i)
                tempid% = kgl_t_id(i)
                kgl_t_z(i) = kgl_t_z(igap)
                kgl_t_id(i) = kgl_t_id(igap)
                kgl_t_z(igap) = tempz#
                kgl_t_id(igap) = tempid%
                changes = 1
            EndIf
        Next i
    Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
    Color r, g, b
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    If(Int(y1)<Int(y2)) Then
        For i = y1 To y2
            Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
        Next i
    EndIf
    If(Int(y2)<Int(y3)) Then
        For i = y2 To y3
            Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
        Next i
    EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
    
    m.kgl_matrix = ConvertToType(kgl_curmatrix)
    
    nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
    ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
    nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
    x1 = nx1: y1 = ny1: z1 = nz1
    
    nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
    ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
    nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
    x2 = nx2: y2 = ny2: z2 = nz2
    
    nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
    ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
    nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
    x3 = nx3: y3 = ny3: z3 = nz3
    
    If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
    s1# = (1.0/z1#)*cop
    s2# = (1.0/z2#)*cop
    s3# = (1.0/z3#)*cop
    
    t.kgl_tris = New(kgl_tris)
    
    t\x1 = Int(s1*x1+w)
    t\y1 = Int((-s1)*y1+h)
    t\x2 = Int(s2*x2+w)
    t\y2 = Int((-s2)*y2+h)
    t\x3 = Int(s3*x3+w)
    t\y3 = Int((-s3)*y3+h)
    If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
    If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
    
    nx1# = x2-x1
    nx2# = x3-x1
    ny1# = y2-y1
    ny2# = y3-y1
    nz1# = z2-z1
    nz2# = z3-z1
    
    normx# = ny1*nz2-nz1*ny2
    normy# = nz1*nx2-nx1*nz2
    normz# = nx1*ny2-ny1*nx2
    
    normL# = Sqrt(normx*normx+normy*normy+normz*normz)
    
    normx = normx / normL
    normy = normy / normL
    normz = normz / normL
    
    light# = Max(0, normx*ldirx+normy*ldiry+normz*ldirz)
    
    t\r = light*Float(r)
    t\g = light*Float(g)
    t\b = light*Float(b)
    
    kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
    kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
    kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

Repeat
    
    ang# = ang# - 1.0
    For j = 0 To 3
        kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(40*Cos(ang), 1.0, 0.0, 0.0), kgl_getrotation(j*90+ang, 0.0, 1.0, 0.0)), kgl_gettranslation(0, 0, 20) ))
        For i = 0 To 4
            kgl_setworldmatrix(kgl_multiply_matrix(kgl_multiply_matrix(kgl_getrotation(20*Sin(ang+90), 0, 1, 0), kgl_gettranslation(0, 0, 1.5+.5*Sin(ang*2))), kgl_curmatrix))
            col = 50+i*20
            drawcube(col, col, col)
        Next i
    Next j
    
    render()
    
    Color 255, 255, 255
    Text 10, 10, Str(FPS())
    
    DrawScreen
    
Forever
@MaGetzUb, tässä on pointtina juurikin CB:n omien tehojen mittailu, ulkoisella DLL:llähän saisi aikaan vaikka mitä graafisia hulppeuksia.

Tein muuten yksinkertaista lentelysysteemiä (nuolet+w/s+x), jos tästä vaikka jonkun shmupin vääntäisi.

WOW......

Re: Efektit

Post by WOW...... » Tue Jan 12, 2010 5:45 pm

Mitä helvettiä, toi on sairaan makee. Voisitko tehdä pienen tollasen esimerkin, niin voisin koittaa tehdä jotain 3d juttuja.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Tue Jan 12, 2010 5:52 pm

WOW...... wrote:Mitä helvettiä, toi on sairaan makee. Voisitko tehdä pienen tollasen esimerkin, niin voisin koittaa tehdä jotain 3d juttuja.
Kirjoittelin aikanaan tuton, joka löytyypi edelleen täältä.

Tässäpä näppäimin (nuolet, w/s) liikkuva kuutio, näitä funktioita käyttämällä tämä ei mitään salatiedettä ole vaikka niitä kirjoitellessa parit harmaat hiukset tulikin kasvatettua.

Code: Select all

Const w = 400
Const h = 300
Const cop = 800 // w*2

SCREEN w*2, h*2

Global ldirx As Float
Global ldiry As Float
Global ldirz As Float

ldirx=-1.0
ldiry=2.0
ldirz=-4.0

ldirL# = Sqrt(ldirx*ldirx+ldiry*ldiry+ldirz*ldirz)

ldirx = ldirx/ldirL#
ldiry = ldiry/ldirL#
ldirz = ldirz/ldirL#

Type kgl_tris
    Field x1
    Field y1
    Field x2
    Field y2
    Field x3
    Field y3
    Field r
    Field g
    Field b
EndType

Type kgl_matrix
    Field a#
    Field b#
    Field c#
    Field d#
    
    Field e#
    Field f#
    Field g#
    Field h#
    
    Field i#
    Field j#
    Field k#
    Field l#
    
    Field m#
    Field n#
    Field o#
    Field p#
EndType

Dim kgl_t_id(999)
Dim kgl_t_z(999) As Float
Global kgl_used_triangles%
Global kgl_curmatrix%
Global kgl_identity
kgl_used_triangles = 0

kgl_tmp_identity.kgl_matrix = New(kgl_matrix)
kgl_tmp_identity\a = 1:kgl_tmp_identity\b = 0:kgl_tmp_identity\c = 0:kgl_tmp_identity\d = 0
kgl_tmp_identity\e = 0:kgl_tmp_identity\f = 1:kgl_tmp_identity\g = 0:kgl_tmp_identity\h = 0
kgl_tmp_identity\i = 0:kgl_tmp_identity\j = 0:kgl_tmp_identity\k = 1:kgl_tmp_identity\l = 0
kgl_tmp_identity\m = 0:kgl_tmp_identity\n = 0:kgl_tmp_identity\o = 0:kgl_tmp_identity\p = 1

kgl_identity = ConvertToInteger(kgl_tmp_identity.kgl_matrix)

kgl_curmatrix = kgl_identity

Function kgl_setworldmatrix(newmatrix)
    kgl_curmatrix = newmatrix
EndFunction

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+z*z)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction

Function kgl_gettranslation(x#, y#, z#)
    m.kgl_matrix = New(kgl_matrix)
    m\a=1:m\b=0:m\c=0:m\d=0
    m\e=0:m\f=1:m\g=0:m\h=0
    m\i=0:m\j=0:m\k=1:m\l=0
    m\m=x:m\n=y:m\o=z:m\p=1
    Return ConvertToInteger(m)
EndFunction

Function kgl_multiply_matrix(m1_id, m2_id)
    
    m.kgl_matrix = New(kgl_matrix)
    m1.kgl_matrix = ConvertToType(m1_id)
    m2.kgl_matrix = ConvertToType(m2_id)
    
    m\a = m1\a*m2\a + m1\b*m2\e + m1\c*m2\i + m1\d*m2\m
    m\b = m1\a*m2\b + m1\b*m2\f + m1\c*m2\j + m1\d*m2\n
    m\c = m1\a*m2\c + m1\b*m2\g + m1\c*m2\k + m1\d*m2\o
    m\d = m1\a*m2\d + m1\b*m2\h + m1\c*m2\l + m1\d*m2\p
    
    m\e = m1\e*m2\a + m1\f*m2\e + m1\g*m2\i + m1\h*m2\m
    m\f = m1\e*m2\b + m1\f*m2\f + m1\g*m2\j + m1\h*m2\n
    m\g = m1\e*m2\c + m1\f*m2\g + m1\g*m2\k + m1\h*m2\o
    m\h = m1\e*m2\d + m1\f*m2\h + m1\g*m2\l + m1\h*m2\p
    
    m\i = m1\i*m2\a + m1\j*m2\e + m1\k*m2\i + m1\l*m2\m
    m\j = m1\i*m2\b + m1\j*m2\f + m1\k*m2\j + m1\l*m2\n
    m\k = m1\i*m2\c + m1\j*m2\g + m1\k*m2\k + m1\l*m2\o
    m\l = m1\i*m2\d + m1\j*m2\h + m1\k*m2\l + m1\l*m2\p
    
    m\m = m1\m*m2\a + m1\n*m2\e + m1\o*m2\i + m1\p*m2\m
    m\n = m1\m*m2\b + m1\n*m2\f + m1\o*m2\j + m1\p*m2\n
    m\o = m1\m*m2\c + m1\n*m2\g + m1\o*m2\k + m1\p*m2\o
    m\p = m1\m*m2\d + m1\n*m2\h + m1\o*m2\l + m1\p*m2\p
    
    Return ConvertToInteger(m)
EndFunction

Function render()
    kgl_used_triangles = kgl_used_triangles - 1
    If(kgl_used_triangles >1) Then sort()
    Lock
        For i = 0 To kgl_used_triangles
            t.kgl_tris = ConvertToType(kgl_t_id(i))
            filltriangle(t\x1, t\y1, t\x2, t\y2, t\x3, t\y3, t\r, t\g, t\b)
            Delete t
        Next i
    Unlock
    kgl_used_triangles = 0
EndFunction

Function sort()
    changes = 1
    gap# = kgl_used_triangles
    Repeat
        gap = gap/1.247330950103979
        If gap = 10 Or gap = 9
            gap = 11
        EndIf
        If gap<=1 Then gap = 1
        changes = 0
        For i = 0 To (kgl_used_triangles-gap)
            igap = i + gap
            If (kgl_t_z(i)<kgl_t_z(igap)) Then
                tempz# = kgl_t_z(i)
                tempid% = kgl_t_id(i)
                kgl_t_z(i) = kgl_t_z(igap)
                kgl_t_id(i) = kgl_t_id(igap)
                kgl_t_z(igap) = tempz#
                kgl_t_id(igap) = tempid%
                changes = 1
            EndIf
        Next i
    Until changes = 0 And gap=1
EndFunction

Function filltriangle(x1#, y1#, x2#, y2#, x3#, y3#, r%, g%, b%)
    Color r, g, b
    If (y1>y2) Then
        tmpy = y1
        tmpx = x1
        y1 = y2
        x1 = x2
        y2 = tmpy
        x2 = tmpx
    EndIf
    If (y1>y3) Then
        tmpy = y1
        tmpx = x1
        y1 = y3
        x1 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If (y2>y3) Then
        tmpy = y2
        tmpx = x2
        y2 = y3
        x2 = x3
        y3 = tmpy
        x3 = tmpx
    EndIf
    If(y2=y1) Then y1-0.001
    If(y3=y2) Then y3+0.001
    slp1# = (x3-x1)/(y3-y1)
    slp2# = (x2-x1)/(y2-y1)
    slp3# = (x3-x2)/(y3-y2)
    If(Int(y1)<Int(y2)) Then
        For i = y1 To y2
            Line x1+slp1*(i-y1), i, x2+slp2*(i-y2), i
        Next i
    EndIf
    If(Int(y2)<Int(y3)) Then
        For i = y2 To y3
            Line x1+slp1*(i-y1), i, x3+slp3*(i-y3), i
        Next i
    EndIf
EndFunction

Function tri3D(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#, r%, g%, b%, cull = 1)
    
    m.kgl_matrix = ConvertToType(kgl_curmatrix)
    
    nx1# = x1*m\a+y1*m\e+z1*m\i+m\m
    ny1# = x1*m\b+y1*m\f+z1*m\j+m\n
    nz1# = x1*m\c+y1*m\g+z1*m\k+m\o
    x1 = nx1: y1 = ny1: z1 = nz1
    
    nx2# = x2*m\a+y2*m\e+z2*m\i+m\m
    ny2# = x2*m\b+y2*m\f+z2*m\j+m\n
    nz2# = x2*m\c+y2*m\g+z2*m\k+m\o
    x2 = nx2: y2 = ny2: z2 = nz2
    
    nx3# = x3*m\a+y3*m\e+z3*m\i+m\m
    ny3# = x3*m\b+y3*m\f+z3*m\j+m\n
    nz3# = x3*m\c+y3*m\g+z3*m\k+m\o
    x3 = nx3: y3 = ny3: z3 = nz3
    
    If(z1<=1)Or(z2<=1)Or(z3<=1) Then Return 0
    s1# = (1.0/z1#)*cop
    s2# = (1.0/z2#)*cop
    s3# = (1.0/z3#)*cop
    
    t.kgl_tris = New(kgl_tris)
    
    t\x1 = Int(s1*x1+w)
    t\y1 = Int((-s1)*y1+h)
    t\x2 = Int(s2*x2+w)
    t\y2 = Int((-s2)*y2+h)
    t\x3 = Int(s3*x3+w)
    t\y3 = Int((-s3)*y3+h)
    If (((t\x2-t\x1)*(t\y3-t\y1))-((t\x3-t\x1)*(t\y2-t\y1))<=0.0)And cull Then Delete t:Return 0
    If (t\x1<0 And t\x2<0 And t\x3<0) Or (t\x1>2*w And t\x2>2*w And t\x3>2*w) Then Delete t:Return 0
    
    nx1# = x2-x1
    nx2# = x3-x1
    ny1# = y2-y1
    ny2# = y3-y1
    nz1# = z2-z1
    nz2# = z3-z1
    
    normx# = ny1*nz2-nz1*ny2
    normy# = nz1*nx2-nx1*nz2
    normz# = nx1*ny2-ny1*nx2
    
    normL# = Sqrt(normx*normx+normy*normy+normz*normz)
    
    normx = normx / normL
    normy = normy / normL
    normz = normz / normL
    
    light# = .2+.8*Max(0, normx*ldirx+normy*ldiry+normz*ldirz)
    
    t\r = light*Float(r)
    t\g = light*Float(g)
    t\b = light*Float(b)
    
    kgl_t_id(kgl_used_triangles) = ConvertToInteger(t.kgl_tris)
    kgl_t_z(kgl_used_triangles) = (z1# + z2# + z3#)/3.0
    kgl_used_triangles = kgl_used_triangles + 1
EndFunction

Function drawcube(r, g, b)
    tri3D( .5, .5, .5, .5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5, .5, .5, .5,-.5,-.5, .5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5,-.5, .5, .5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5,-.5, .5,-.5,-.5,-.5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5, .5, .5, .5, .5, .5, .5, .5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5, .5,-.5,-.5,-.5, r, g, b)
    tri3D( .5,-.5, .5,-.5,-.5, .5, .5,-.5,-.5, r, g, b)
    tri3D( .5,-.5,-.5,-.5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D( .5, .5,-.5, .5,-.5,-.5,-.5, .5,-.5, r, g, b)
    tri3D(-.5,-.5, .5, .5,-.5, .5,-.5, .5, .5, r, g, b)
    tri3D( .5,-.5, .5, .5, .5, .5,-.5, .5, .5, r, g, b)
EndFunction

pz# = 8.0

Repeat
    
    px# = px# + (RightKey()-LeftKey())*0.1
    py# = py# + (UpKey()-DownKey())*0.1
    pz# = pz# + (KeyDown(17)-KeyDown(31))*0.1
    
    kgl_setworldmatrix(kgl_gettranslation(px, py, pz))
    
    drawcube(255, 100, 100)
    
    render()
    
    Color 255, 255, 255
    Text 10, 10, Str(FPS())
    
    DrawScreen
    
Forever

User avatar
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Efektit

Post by Wingman » Thu Jan 14, 2010 6:56 pm

pistäppä tuohon lentely.exeen vielä Ilmurin vanhahko ilotikku-dll niin että tota ohjataan joystickillä, ois mahtavaa :D

EDIT: muokkailimpas koodiasi, sain tikun liitettyä, mutta onkos tossa kuutiossa joku kääntö vaikka z-akselin ympäri?
- - - -

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Thu Jan 14, 2010 9:20 pm

Itse olen demonstraatiotarkoituksessa kääntänyt yleensä esineitä y-akselin ympäri, mutta kgl_getrotation( kulma, x, y, z ) kääntää matriisia kulman verran vektorin x, y, z ympäri eli jotain tyyliin kgl_getrotation( ang, 0, 0, 1 ) kääntäisi z-akselin ympäri. Se pitää tosin kertoa jo olemassa olevan matriisin kanssa, joten kgl_setworldmatrix(kgl_gettranslation(px, py, pz)) muuttuu muotoon kgl_setworldmatrix(kgl_multiply_matrix(kgl_getrotation(ang, 0, 0, 1), kgl_gettranslation(px, py, pz))). Tämän lisättyäsi huomaat pienen bugin, joka minulta oli jäänyt kgl_getrotation()iin. Kyseinen bugi vääristää kaiken z-akselin ympäri tapahtuvan pyörityksen, toimiva versio onpi tässä (qz sijaan oli pelkkä z, pitänee ruveta tuota force variable declarationia käyttämään)

Code: Select all

Function kgl_getrotation(ang#, axx#, axy#, axz#)
    
    sina# = Sin(ang*.5)
    qx# = axx#*sina#
    qy# = axy#*sina#
    qz# = axz#*sina#
    qw# = Cos(ang*.5)
    
    L# = Sqrt(qx*qx+qy*qy+qz*qz+qw*qw)
    qx=qx/L:qy=qy/L:qz=qz/L:qw=qw/L
    
    m.kgl_matrix = New(kgl_matrix)
    
    m\a = 1-2*(qy*qy+qz*qz)
    m\b = 2*(qx*qy-qz*qw)
    m\c = 2*(qx*qz+qy*qw)
    m\d = 0
    
    m\e = 2*(qx*qy+qz*qw)
    m\f = 1-2*(qx*qx+qz*qz)
    m\g = 2*(qy*qz-qx*qw)
    m\h = 0
    
    m\i = 2*(qx*qz-qy*qw)
    m\j = 2*(qy*qz+qx*qw)
    m\k = 1-2*(qx*qx+qy*qy)
    m\l = 0
    
    m\m = 0
    m\n = 0
    m\o = 0
    m\p = 1
    
    Return ConvertToInteger(m)
    
EndFunction
Sinänsä siis hienoa että kysyit juuri z-akselia, olisi voinut muuten jäädä huomaamatta.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Efektit

Post by SPuntte » Fri Jan 15, 2010 12:11 am

Anteeksi offtopic, mutta miksi ihmeessä muutat tuossa funktiossa kulma+akselivektori -parin ensin kvaternioksi ja sitten sen edelleen matriisiksi? On nimittäin helppoa luoda kiertomatriisi pyörittämiseen mielivaltaisen akselin (=yksikkövektorin) ympäri, mutta onko tuo tosiaan nopeampi tehdä noin?
EDIT:

Noniin, tietysti se itse asia jäi sitten kommentoimatta. Todella hieno ja toimivan tuntuinen kirjasto. Itsekin joskus kehittelin matriisikirjastoa toisaalta ihan mielenkiinnosta ja toisaalta jotain 3D-juttuja varten, mutten loppujenlopuksi oikein saanut mitään kunnolla aikaan, kun kaikki mahdolliset eri koordinaatistojärjestelmät ja matriisien vektorijärjestykset sekoitti asioita aika pahasti. Netistä oli paha katsoa mitään mallia, kun kaikki oli tehty keskenään eri tavalla.

CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Fri Jan 15, 2010 1:08 am

Matrix and Quaternion FAQ:sta aikanaan lueskelin tuon tavan tehdä se, enpä ole koskaan edes miettinyt että nopeampi/helpompi tapa voisi olla olemassa :D Kerro toki miten tekisit tuon muunnoksen, nopeammin toimivasta koodista ei koskaan ole haittaa. Tuohon matrix_multiplyhyn pitäisi muutenkin lisätä valinnainen parametri jolla voisi säilyttää jommankumman tai vaikka molemmat matriisit että ei tarvitsisi kaikkea lennosta laskea, melko monet matriisit kun voisi laskea valmiiksikin.

Mutta kiitosta vaan, kyllähän tätä on tullut hetki kirjoiteltua ja sitäkin ennen aiheeseen perehdyttyä :>

Tein muuten uuden version eeppisestä lentokonetestistä, linxlinx.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Efektit

Post by SPuntte » Fri Jan 15, 2010 1:49 am

No periaatteessahan tuo kvaternion kautta kiertävä kaavasi palautuu tähän (anteeksi huono kuvanlaatu), joka ulkoasunsa perusteella voisi olla hieman nopeampi. Kannattaa varmaan laskea valmiiksi sini, kosini ja kosinin ykkösen komplementti (1 - cos θ).

Kaava on kotoisin kirjasta "3D Math Primer for Graphics and Game Developement" sivulta 109. Huomaa, että kyseinen kirja käyttää (muuten niin loistava ja sitten sortuu tällaiseen :E) vasenkätistä koordinaatistoa ja rivivektoreita.

Eli olettaen, että käytät oikeakätistä koordinaatistoa ja sarakevektoreita, joudut ensin transponoimaan matriisin (rivivektorit sarakkeiksi) ja sitten vielä muuttamaan vektorin z-komponentin etumerkin (vektorin koordinaatistokorjaus) sekä kulman etumerkin (kulman koordinaatistokorjaus). Tosin en ole tuostakaan ihan satavarma. Kokeile :D

Niin ja tietenkin n_x, n_y ja n_z ovat pyöritysakselina toimivan yksikkövektorin komponentteja.

Ja viimeinen mieleen tuleva mahdollinen ongelma tässä on se, etten ole varma onko kirjassa annettu kaava kordinaatiston itsensä, vai siinä sijaitsevan pisteen pyörittäimstä varten. Tämä on kuitenkin helppo todeta ja korjata vain kulman etumerkkiä muuttamalla.

En tiedä, oliko tästä loppujen lopuksi apua, mutta nyt taas muistan, miksi omasta matriisikirjastostani ei tullut mitään :D

ÄRR! En saa toimimaan kumpaakaan noista "lentelyistä" winellä >:€
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Fri Jan 15, 2010 3:07 am

Kas, pitänee huomenna hieman pirteämpänä tutustua ja tehdä nopeustestejä, se vaikuttaisi olevan suunnilleen ellei peräti täsmälleen sama kaava kuin tämänhetkinen vähemmillä väliarvoilla.

Nuo nyt eivät ole mitään kovin kummoista, lentokoneella voi liikkua 2D-tasossa joka liikkuu vakionopeudella eteenpäin. Eiköhän tuosta joku väistely/ammuskelupeli tule.

Pistetään nyt skriiniä kaikille, joilla ei toimi (nyyh, img-tagi ei osannut käyttää widthiä ja heightiä, tulee nyt sitten kokonaisuudessansa) :

Image

Maisema on vielä vähän autio mutta lisäilen sinne kiviä, puita, pilviä tai jotain muuta hauskaa myöhemmin (:

User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 3:40 pm
Location: Lempäälä

Re: Efektit

Post by kaneli2000 » Fri Jan 15, 2010 8:36 am

Koodaaja, joset tuosta tee peliä niin olet jotenkin häiriintynyt. Tuo on hieno.
I see the rainbow rising

User avatar
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Efektit

Post by Wingman » Fri Jan 15, 2010 4:58 pm

koodaaja wrote:Tein muuten uuden version eeppisestä lentokonetestistä, linxlinx.
:shock: Eeppinen lentokonetesti FTW!! ihan sairaan hieno, tähtiä vielä taivaalle :)

EDIT: pistetäämpäs vielä ilotikulle muokkaamani "esimerkki", vähintään X-,Y- ja Z-akseliselle joystickille, jossa olisi vähintään 4 nappia
CbIlo.rar
Koodaajan 3d-kuutio esimerkki modattuna joystickille käyttäen Ilmurin CbIlo-kirjastoa.
(90.17 KiB) Downloaded 132 times
(mukana kaikki tarvittava, avaat vain 3d Boxi.CBn ja ajat ohjelman Joystick liitettynä)
- - - -

User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 3:40 pm
Location: Lempäälä

Re: Efektit

Post by kaneli2000 » Fri Jan 15, 2010 5:43 pm

Nyt koodaaja alat tekemään peliä tuosta \o7. Mahtavuutta ja sulavaa näytölle piirtoa.
I see the rainbow rising

Post Reply