Voxelgrafik mit Purebasic.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Voxelgrafik mit Purebasic.

Beitrag von Fluid Byte »

super_spacken hat geschrieben:na denn..., ich bin mal gespannt...
Auf was? Das der "Arbeiterabgrund" dir hilft?
super_spacken hat geschrieben:Gruss
Erstick dran :allright:
Windows 10 Pro, 64-Bit / Outtakes | Derek
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Voxelgrafik mit Purebasic.

Beitrag von Nino »

c4s hat geschrieben:Wann sehen wir dein erstes Ergebnis?
Sobald er hier fertigen Code zum Kopieren findet. :lol: :lol:
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Voxelgrafik mit Purebasic.

Beitrag von super_castle »

ich habe foxel-code von freebasic, welches kurzen und knackigen asm-code erzeugt.

purebasic wird da wohl zu langsam für sein.
das "StartDrawing(...)" ist die bremse, weil es zu oft aufgerufen werden muss in der dynamik.

steuerbar mit den pfeiltasten (freebasic) :

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)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Voxelgrafik mit Purebasic.

Beitrag von STARGÅTE »

purebasic wird da wohl zu langsam für sein.
das "StartDrawing(...)" ist die bremse, weil es zu oft aufgerufen werden muss in der dynamik.
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.)!
Deine Aussage ist also falsch!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Voxelgrafik mit Purebasic.

Beitrag von c4s »

STARGÅTE hat geschrieben:Deine Aussage ist also falsch!
Lass ihn blubbern und quaken was er will... bei manchen Leuten hat es leider keinen Sinn mehr.
Er lacht sich doch sowieso ins Fäustchen, dass er hier auf meistens auf höchst beleidigendem Niveau herumtrollt und trotzdem jede Hilfe bekommt, die er erwartet.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Voxelgrafik mit Purebasic.

Beitrag von Nino »

Nino hat geschrieben:
c4s hat geschrieben:Wann sehen wir dein erstes Ergebnis?
Sobald er hier fertigen Code zum Kopieren findet. :lol: :lol:
Ich muss mich korrigieren:
Sobald er hier oder woanders fertigen Code zum Kopieren findet. :lol: :lol:
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Voxelgrafik mit Purebasic.

Beitrag von Kukulkan »

purebasic wird da wohl zu langsam für sein.
das "StartDrawing(...)" ist die bremse, weil es zu oft aufgerufen werden muss in der dynamik.
Normalerweise wird das maximal einmal je Frame aufgerufen. Wenn nicht, machst Du was falsch...

PureBasic-Hilfe:
Der FlipBuffers() Befehl muss stets außerhalb eines StartDrawing() : ... : StopDrawing() Programmblocks aufgerufen werden.
Also jeden Frame einmal. Ich hab damit aber gute Erfahrung. Der StartDrawing() Befehl wird bei Voxelgrafik sowieso den wenigsten Teil beanspruchen...

Grüße,

Kukulkan
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Voxelgrafik mit Purebasic.

Beitrag von super_castle »

Kukulkan, da hast du recht, es reicht wahrscheinlich aus "pro Frame".

Wenn ich es in Freebasic laufen lassen und ein Sleep in die For-schleife reinsetze, sehe ich jede einzelne Pixeländerung auf dem Screen, was ja bei Purebasic nicht sofort sichtbar wird , sondern erst nach dem Flip.

Da wird wohl auch die Flipperei ausreichen ohne sichtbaren Geschwindigkeitsverlust.

gruss
Antworten