Re: Voxelgrafik mit Purebasic.
Verfasst: 26.01.2011 01:14
Auf was? Das der "Arbeiterabgrund" dir hilft?super_spacken hat geschrieben:na denn..., ich bin mal gespannt...
Erstick dransuper_spacken hat geschrieben:Gruss

Auf was? Das der "Arbeiterabgrund" dir hilft?super_spacken hat geschrieben:na denn..., ich bin mal gespannt...
Erstick dransuper_spacken hat geschrieben:Gruss
Sobald er hier fertigen Code zum Kopieren findet.c4s hat geschrieben:Wann sehen wir dein erstes Ergebnis?
Code: Alles auswählen
Dim Shared As single posx, posy, posz
Dim Shared As Single x, y, z
Dim Shared As Single dd, de, dx, dy, dz, dyi, dxi
Dim Shared As Single horiz, sdz, p, d, h
Dim Shared As Integer hei(4096 - 1), col(4096 - 1)
Dim Shared As Integer sx,i
Dim Shared As Single sinang,cosang,ang, r160
Screen 13
'Generate palette
For z = 0 To 63
Palette z, Rgb(z / 2, z, z)
Next z
For z = 0 To 63
Palette z + 64, Rgb(z, z, z \ 2)
Next z
'Generate interesting height & color maps
p = 0
For y = 0 To 63
For x = 0 To 63
d = 15 * 15 - ((x And 31) - 16) ^ 2 - ((y And 31) - 16) ^ 2
If d > 0 And ((x Xor y) And 32) Then
hei(p) = 64 - Sqr(d)
col(p) = (x + y) * .5
Else
hei(p) = 64
col(p) = (Cos(x * .2) + Sin(y * .3)) * 3 + 88
End If
p = p + 1
Next x
Next y
'Initialize starting position
posx = 0
posy = 0
posz = 40 * 65536
ang = 0
horiz = -50
r160 = 1 / 160
dd = 65536 * r160 'Increment size
de = dd * 128 'Scan out 128 units
sdz = (100 - horiz) * 65536 * r160
Do
cosang = Cos(ang) * 65536
sinang = Sin(ang) * 65536
dx = sinang + cosang
dxi = -sinang * r160
dy = sinang - cosang
dyi = cosang * r160
'For each column in 320*200 mode...
For sx = 0 To 319
'Fast ray trace! No *'s or /'s in here (\ 65536 is a shift)
x = posx
y = posy
z = posz
dz = sdz
p = sx + 63680
For d = 0 To de Step dd
x += dx
y += dy
z += dz
i = (((x * 64) And &HFC00000) + (y And &H3F0000)) \ 65536
h = hei(i) * 65536
Do While h < z
PSet (p Mod 320, p \ 320), col(i)
p -= 320
z -= d
dz -= dd
Loop
Next d
dx += dxi
dy += dyi
'Finish off rest of line
Do While p >= 19200
PSet (p Mod 320, p \ 320), 0
p = p - 320
Loop
Next sx
'Move position & angle
If Multikey(&h50) Then
posx -= cosang * 4
posy -= sinang * 4
End If
If Multikey(&h48) Then
posx += cosang * 4
posy += sinang * 4
End If
If Multikey(&h1E) And posz < 2621440 Then posz += 1 * 65536
If Multikey(&h10) And posz > 0 Then posz -= 1 * 65536
If Multikey(&h4B) Then ang -= .04
If Multikey(&h4D) Then ang += .04
Sleep 1
Loop Until Multikey(&h01)
Wie ich dir schon mehrmals gesagt habe, musst du StartDrawing() bei der richtigen Benutzung nur ein mal zur Laufzeit aufrufen (also vor allen Schleifen usw.)!purebasic wird da wohl zu langsam für sein.
das "StartDrawing(...)" ist die bremse, weil es zu oft aufgerufen werden muss in der dynamik.
Lass ihn blubbern und quaken was er will... bei manchen Leuten hat es leider keinen Sinn mehr.STARGÅTE hat geschrieben:Deine Aussage ist also falsch!
Ich muss mich korrigieren:Nino hat geschrieben:Sobald er hier fertigen Code zum Kopieren findet.c4s hat geschrieben:Wann sehen wir dein erstes Ergebnis?![]()
Normalerweise wird das maximal einmal je Frame aufgerufen. Wenn nicht, machst Du was falsch...purebasic wird da wohl zu langsam für sein.
das "StartDrawing(...)" ist die bremse, weil es zu oft aufgerufen werden muss in der dynamik.
Also jeden Frame einmal. Ich hab damit aber gute Erfahrung. Der StartDrawing() Befehl wird bei Voxelgrafik sowieso den wenigsten Teil beanspruchen...Der FlipBuffers() Befehl muss stets außerhalb eines StartDrawing() : ... : StopDrawing() Programmblocks aufgerufen werden.