[B3D] Schneeflocken

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ToeB

Betreff: [B3D] Schneeflocken

BeitragSa, Okt 18, 2008 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Nachdem mein andere Beitrag gelöscht wurde, aus einem grund den ich immernoch nicht verstehe, mach ich hier einen neuen Threath auf mit verbessertem Code.

Folgende Functionen und Constante meiner Engine könnt ihr nutzen (Die anderen auch, haben aber nix mit der Engine zu tun Wink ) :

Functionen (Könnte man verändern, wenn man sachen anders haben will)

CreateSnow(Anzahl=1)
Anzahl - Anzahl der Schneeflocken
Erstellt Schneeflocken, ist ratsam städig aufzurufen mit einer kleinen azhal an schneeflocken (dann kommen immer wieder welche dazu)

UpdateSnow( )
Bewegt bzw. Malt die ganzen Schnee-Particle. Immer vor RenderWorld aufrufen (In der Schleife)

CountSnow( )
Gibt die aktuelle anbzahl aller schnee-Particle wieder. Sollte nicht bei zu hiher particlezahl verwendet werden, geht sehr auf die Geschwindigkeit

CountSnowRendered
Macht das gleiche wie CountSnow nur das es nur die Particle zählt, die gerendert worden sind.

Constanten (Veränderbar / der gegebenheit anpassbar)

MaxSnow - Maximale anzahl an Schnee-Particlen
XSnowSize - Maximaler Radius (von 0 an) in X-Richtung. In diesem Radius werden die Particle erstellt
YSnowSize - Maximale Starthöhe der Particle
SnowRange - Maximaler Abstand zur Camera (Danach wird nicht mehr eingezeichet)
YSnowMin - minimale Starthöhe der Particle


Ohne Pix kopier ich nix :
user posted image

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Global CAM = CreateCamera()
CameraRange CAM,0.1,1000
PositionEntity CAM,0,1,0

Global SnowMesh = CreateMesh(CAM)
Global SnowSurf = CreateSurface(SnowMesh)
Global SnowText = CreateSnowTex()
EntityTexture SnowMesh,SnowText
EntityBlend SnowMesh,3
Const MaxSnow = 10000
Const XSnowSize = 25
Const YSnowSize = 25
Const ZSnowSize = 25
Const SnowRange = 100
Const YSnowMin = 0

Dim Snow#(MaxSnow,7)

CameraClsColor CAM,0,100,200

CameraFogMode CAM,1
CameraFogColor CAM,255,255,255
CameraFogRange CAM,10,1100

Global plane = CreatePlane()
   ;PositionEntity plane,0,-10,0
   Global PlaneText = CreatePlaneTex()
   EntityTexture plane,planeText
   
Global SKY = CreateSphere(80)
   ScaleEntity SKY,1000,1000,1000
   FlipMesh SKY
   Global SkyText = CreateSKYTex()
   EntityTexture SKY,SkyText
   
Global NewSnowMs
Const NewSnowTime = 500

Global CountSnowVar,CountSnowRenderedVar,cs_Mls
   



Repeat
   FPS_Tmp = FPS_Tmp + 1
   If FPS_Mls <= MilliSecs() - 999 Then FPS = FPS_Tmp : FPS_Tmp = 0 : FPS_Mls = MilliSecs()
   TurnEntity CAM,MouseYSpeed()/3,0,0
   TurnEntity CAM,0,-MouseXSpeed()/3,0,1
   MoveEntity CAM,0,0,(KeyDown(17) - KeyDown(31)) / 10.0
   MoveMouse 400,300
   If NewSnowMs <= MilliSecs() - NewSnowTime
      CreateSnow(10)
      NewsSnowMs = MilliSecs()
   EndIf
   UpdateSnow()   
   PositionEntity SKY,EntityX(CAM),EntityY(CAM),EntityZ(CAM)   UpdateWorld()
   RenderWorld()
   If cs_Mls <= MilliSecs() - 1000
      CountSnowVar = CountSnow()
      CountSnowRenderedVar = CountSnowRendered()
      cs_Mls = MilliSecs()
   EndIf
   Text 1,1,"FPS:"+FPS+"|SNOW:"+CountSnowVar+"|RENDERED:"+CountSnowRenderedVar
   Flip
Until KeyHit(1)
End

;_________________________________________________________________________


Function CreateSnow(anz=1)
   For i = 1 To anz
      akt = -1
      For sn = 0 To MaxSnow
         If Snow(sn,0) = 0 akt = sn : Exit
      Next
      If akt = -1 Then akt = Rand(0,MaxSnow)
      Snow(akt,0) = 1 ;ON
      SnowWinkl = Rand(360)
      Snow(akt,1) = Sin(SnowWinkl) * Rnd(0,XSnowSize) ; X
      Snow(akt,2) = Rnd(YSnowMin,YSnowSize) ; Y
      Snow(akt,3) = Cos(SnowWinkl) * Rnd(0,ZSnowSize)      ; Z
      Snow(akt,4) = Rnd(-0.01,-0.005) ;SY
      Snow(akt,5) = Rand(0,0) ;Bild
      Snow(akt,6) = Rnd(0.0101,0.0501) ; Scale
   Next
End Function

Function UpdateSnow()
   ClearSurface SnowSurf
   For i = 0 To MaxSnow
      If Snow(i,0) = 1
         XX# = Snow(i,1)
         YY# = Snow(i,2)
         ZZ# = Snow(i,3)
         SY# = Snow(i,4)
         Bild= Snow(i,5)
         SC# = Snow(i,6)
         XX# = XX# + Rnd(-0.01,0.01)
         YY# = YY# + SY#
         ZZ# = ZZ# + Rnd(-0.01,0.01)   
         Snow(i,1) = XX#
         Snow(i,2) = YY#
         Snow(i,3) = ZZ#      
         TFormPoint(XX,YY,ZZ,0,CAM)
         snow(i,7) = 0
         ZZ# = TFormedZ()
         If ZZ > 0 And ZZ < SnowRange
            XX# = TFormedX()
            If XX# < ZZ*2 And XX > -ZZ*2            
               YY# = TFormedY()
               If YY < ZZ*2 And YY > -ZZ*2         
                  ;If Bild = 0 Then
                  ;uv_U1# = 0:uv_V1# = 0:uv_U2# = 0.5:uv_V2# = 0.5
                  AddSnow(XX,YY,ZZ,SC)
                  snow(i,7) = 1
               EndIf
            EndIf
         EndIf
         If Snow(i,2) < 0 Snow(i,0) = 0
      EndIf
   Next
End Function

;_________________________________________________________________________


Function CountSnowRendered()
   Local SnowAnz = 0
   For i = 1 To MaxSnow
      If snow(i,0) = 1
         If snow(i,7) = 1 SnowAnz = SnowAnz + 1
      EndIf
   Next
   Return SnowAnz
End Function

Function CountSnow()
   Local SnowAnz = 0
   For i = 0 To MaxSnow
      If Snow(i,0) = 1 SnowAnz = SnowAnz + 1
   Next
   Return SnowAnz
End Function 



;_________________________________________________________________________

Function AddSnow(xx#,yy#,zz#,sc#)   
   v0 = AddVertex(SnowSurf,XX-SC,YY-SC,ZZ,0,0)
   v1 = AddVertex(SnowSurf,XX+SC,YY-SC,ZZ,1,0)
   v2 = AddVertex(SnowSurf,XX-SC,YY+SC,ZZ,0,1)
   v3 = AddVertex(SnowSurf,XX+SC,YY+SC,ZZ,1,1)
   AddTriangle(SnowSurf,v2,v1,v0)
   AddTriangle(SnowSurf,v2,v3,v1)
End Function


;_________________________________________________________________________

Function CreateSnowTex()
   Local SnowTex = CreateTexture(64,64)
   Local TexBuff = TextureBuffer(SnowTex)
   Color 255,255,255
   LockBuffer TexBuff
   For i = 0 To 32 Step 1   
      c = ((32-i)*8)   
      col = 1*$1000000 + c*$10000 + c*$100 + c
      For j = 0 To 360
         WritePixelFast(32-Cos(j)*i,32-Sin(j)*i,col,TexBuff)
      Next
   Next
   UnlockBuffer TexBuff
   Return SnowTex
End Function



Function CreatePlaneTex()
   Local PlTex = CreateTexture(128,128)
   Local PlBuf = TextureBuffer(PlTex)
   LockBuffer PlBuf
   For xx = 0 To 128
      For yy = 0 To 128
         WritePixel xx,yy,(1*$1000000+0*$10000+176*$100+0),PlBuf
      Next
   Next
   For i = 64 To 44 Step -1
      c = i * 4
      col = 1*$1000000+0*$10000+c*$100+0
      For j = 0 To i
         WritePixel 64-i,64-j,col,PlBuf
         WritePixel 64+i,64-j,col,PlBuf
         WritePixel 64-i,64+j,col,PlBuf
         WritePixel 64+i,64+j,col,PlBuf
         WritePixel 64-j,64-i,col,PlBuf
         WritePixel 64-j,64+i,col,PlBuf
         WritePixel 64+j,64-i,col,PlBuf
         WritePixel 64+j,64+i,col,PlBuf
      Next
   Next
   UnlockBuffer PlBuf
   Color 0,255,0
   SetBuffer PlBuf
   Rect 0,0,128,128,0
   SetBuffer BackBuffer()
   Color 255,255,255
   ScaleTexture PlTex,5,5
   Return PlTex
End Function

Function CreateSKYTex()
   Local SkyTex = CreateTexture(1024,1024)
   Local SkyBuf = TextureBuffer(SkyTex)
   SetBuffer SkyBuf
      Color 0,100,200
      Rect 0,0,1024,1024
      Color 255,255,255
      For i = 1 To Rand(5,10)
         xx = Rand(0,1024)
         yy = Rand(0,1024)
         For j = 1 To Rand(5,10)
            r = Rand(-200,200)
            rad = Rand(50,200)
            Oval xx+r,yy+r,rad,rad
         Next
      Next
   SetBuffer BackBuffer()
   Return SkyTex
End Function


Ich hoffe es gefällt euch und dieser Threath wird nicht sofort gelöscht -.-

Wüsste gern auch mal wei schnell das so bei euch laüft (Flip 0)

lg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Tankbuster

BeitragSa, Okt 18, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte es so gemacht, dass man nicht immer neue Flocken per CreateSnow(Anzahl) erstellen muss, sondern, dass man eine Feste Anzahl von Flocken hat, die einfach immer wieder, wenn sie den Boden berührt haben, nach oben gesetzt werden. Wäre praktischer. Also mit CreateSnow(1000) würden immer 1000 Schneeflocken um dich rumschwirren ...
Twitter
Download Jewel Snake!
Windows|Android

ToeB

BeitragSa, Okt 18, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
mhmh.... Okay danke für den Tipp, versuch ich mal Wink

lg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

SYSThern

BeitragSa, Okt 18, 2008 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
bei meiner engine kannst du konstsnt so viele flakes erstelln wie man will
sie werdenauch nicht mehr gelöscht und es gibt auch regen...
ruckelt immer noch

wahrscheinlich wurde dein thread gelöscht weil du sozusagen den code von sparxs kritisiert hast um deinen eigenen besser zustellen_--sorry wenn ich mich da irre


aso fps am anfang 400 dan ganz schnell auf 200

winVista
8600gt
2*1,86ghz
2gb ram
Tools and Programms
--------------------
www.systhern.de

ToeB

BeitragSo, Okt 19, 2008 9:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne der Threath von ihm hat mich nur dazu ANGEREGT, eine schnellere Version zu schreiben. Das ruckeln kann aber auch davov kommen, das ich die X bzw. Z Position immer + eine ZuffallsZahl zähle, d.h. es ist keine Flüssige bewegung, änder ich aber noch.

Danke fürs Testen ^^

lg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Nicdel

BeitragSo, Okt 19, 2008 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir (64Mb Onboard-Karte) läufts bei 10000 Flocken mit 16 FPS...

ToeB

BeitragSo, Okt 19, 2008 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe jetzt Folgendes geändert :

-CreateSnow jetzt VOR der schleife, erstellt z.b. 15000 Schneeflocken und dass wars
-UpdateSnow setzt jetzt die heruntergefallenden Schneeflocken wieder hoch
-Schneflocken werden um die Camera herum erstellt, dadurch gibt es keine schneefreie zone ^^
-Schneeflocken werden jetzt mit Sinus (Sin) gleichmäßig hin und her bewegt, sieht besser aus und ruckelt nicht so Wink

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Global CAM = CreateCamera()
CameraRange CAM,0.1,1000
PositionEntity CAM,0,1,0

Global SnowMesh = CreateMesh(CAM)
Global SnowSurf = CreateSurface(SnowMesh)
Global SnowText = CreateSnowTex()
EntityTexture SnowMesh,SnowText
EntityBlend SnowMesh,3
Global MaxSnow = 1000
Const XSnowSize = 50
Const YSnowSize = 50
Const ZSnowSize = 50
Const SnowRange = 10
Const YSnowMin = 0

Dim Snow#(MaxSnow,7)

CameraClsColor CAM,0,100,200

CameraFogMode CAM,1
CameraFogColor CAM,255,255,255
CameraFogRange CAM,10,110

Global plane = CreatePlane()
   ;PositionEntity plane,0,-10,0
   Global PlaneText = CreatePlaneTex()
   EntityTexture plane,planeText
   
Global SKY = CreateSphere(80)
   ScaleEntity SKY,100,100,100
   FlipMesh SKY
   Global SkyText = CreateSKYTex()
   EntityTexture SKY,SkyText
   
Global NewSnowMs
Const NewSnowTime = 500

Global CountSnowVar,CountSnowRenderedVar,cs_Mls
   
CreateSnow(15000)


Repeat
   FPS_Tmp = FPS_Tmp + 1
   If FPS_Mls <= MilliSecs() - 999 Then FPS = FPS_Tmp : FPS_Tmp = 0 : FPS_Mls = MilliSecs()
   TurnEntity CAM,MouseYSpeed()/3,0,0
   TurnEntity CAM,0,-MouseXSpeed()/3,0,1
   MoveEntity CAM,0,0,(KeyDown(17) - KeyDown(31)) / 10.0
   MoveMouse 400,300   
   UpdateSnow()   
   PositionEntity SKY,EntityX(CAM),EntityY(CAM),EntityZ(CAM)
   UpdateWorld()
   RenderWorld()
   If cs_Mls <= MilliSecs() - 1000
      CountSnowVar = CountSnow()
      CountSnowRenderedVar = CountSnowRendered()
      cs_Mls = MilliSecs()
   EndIf
   Text 1,1,"FPS:"+FPS+"|SNOW:"+CountSnowVar+"|RENDERED:"+CountSnowRenderedVar
   Flip 0
Until KeyHit(1)
End

;_________________________________________________________________________


Function CreateSnow(anz=1000)
   anz = anz - 1
   MaxSnow = anz
   Dim snow(anz,7)
   For i = 0 To anz
      Snow(i,0) = 1 ;ON
      SnowWinkl = Rand(360)
      Snow(i,1) = EntityX(CAM)+Sin(SnowWinkl) * Rnd(0,XSnowSize) ; X
      Snow(i,2) = Rnd(YSnowMin,YSnowSize) ; Y
      Snow(i,3) = EntityZ(CAM)+Cos(SnowWinkl) * Rnd(0,ZSnowSize)      ; Z
      Snow(i,4) = Rnd(-0.01,-0.005) ;SY
      Snow(i,5) = Rand(0,360) ;Bild
      Snow(i,6) = Rnd(0.0101,0.0501) ; Scale
   Next
End Function

Function UpdateSnow()
   ClearSurface SnowSurf
   For i = 0 To MaxSnow
      If Snow(i,0) = 1
         XX# = Snow(i,1)
         YY# = Snow(i,2)
         ZZ# = Snow(i,3)
         SY# = Snow(i,4)         
         SC# = Snow(i,6)
         Snow(i,5)  = (Snow(i,5) + 1) Mod 360
         XX# = XX# + Sin(Snow(i,5))*0.001
         YY# = YY# + SY#
         ZZ# = ZZ# + Sin(Snow(i,5))*0.001;Rnd(-0.01,0.01)   
         Snow(i,1) = XX#
         Snow(i,2) = YY#
         Snow(i,3) = ZZ#   
         TFormPoint(XX,YY,ZZ,0,CAM)
         snow(i,7) = 0
         ZZ# = TFormedZ()
         If ZZ > 0 And ZZ < SnowRange
            XX# = TFormedX()
            If XX# < ZZ*2 And XX > -ZZ*2            
               YY# = TFormedY()
               If YY < ZZ*2 And YY > -ZZ*2         
                  ;If Bild = 0 Then
                  ;uv_U1# = 0:uv_V1# = 0:uv_U2# = 0.5:uv_V2# = 0.5
                  AddSnow(XX,YY,ZZ,SC)
                  snow(i,7) = 1
               EndIf
            EndIf
         EndIf
         If Snow(i,2) < -2.5
            SnowWinkl = Rand(360)
            SnowWinkl = Rand(360)
            Snow(i,1) = EntityX(CAM)+Sin(SnowWinkl) * Rnd(0,XSnowSize)
            Snow(i,2) = Rnd(YSnowMin,YSnowSize)
            Snow(i,3) = EntityZ(CAM)+Cos(SnowWinkl) * Rnd(0,ZSnowSize)
         EndIf
      EndIf
   Next
End Function

;_________________________________________________________________________


Function CountSnowRendered()
   Local SnowAnz = 0
   For i = 1 To MaxSnow
      If snow(i,0) = 1
         If snow(i,7) = 1 SnowAnz = SnowAnz + 1
      EndIf
   Next
   Return SnowAnz
End Function

Function CountSnow()
   Return (MaxSnow+1)
End Function 



;_________________________________________________________________________

Function AddSnow(xx#,yy#,zz#,sc#)   
   v0 = AddVertex(SnowSurf,XX-SC,YY-SC,ZZ,0,0)
   v1 = AddVertex(SnowSurf,XX+SC,YY-SC,ZZ,1,0)
   v2 = AddVertex(SnowSurf,XX-SC,YY+SC,ZZ,0,1)
   v3 = AddVertex(SnowSurf,XX+SC,YY+SC,ZZ,1,1)
   AddTriangle(SnowSurf,v2,v1,v0)
   AddTriangle(SnowSurf,v2,v3,v1)
End Function


;_________________________________________________________________________

Function CreateSnowTex()
   Local SnowTex = CreateTexture(64,64)
   Local TexBuff = TextureBuffer(SnowTex)
   Color 255,255,255
   LockBuffer TexBuff
   For i = 0 To 32 Step 1   
      c = ((32-i)*8)   
      col = 1*$1000000 + c*$10000 + c*$100 + c
      For j = 0 To 360
         WritePixelFast(32-Cos(j)*i,32-Sin(j)*i,col,TexBuff)
      Next
   Next
   UnlockBuffer TexBuff
   Return SnowTex
End Function



Function CreatePlaneTex()
   Local PlTex = CreateTexture(128,128)
   Local PlBuf = TextureBuffer(PlTex)
   LockBuffer PlBuf
   For xx = 0 To 128
      For yy = 0 To 128
         WritePixel xx,yy,(1*$1000000+0*$10000+176*$100+0),PlBuf
      Next
   Next
   For i = 64 To 44 Step -1
      c = i * 4
      col = 1*$1000000+0*$10000+c*$100+0
      For j = 0 To i
         WritePixel 64-i,64-j,col,PlBuf
         WritePixel 64+i,64-j,col,PlBuf
         WritePixel 64-i,64+j,col,PlBuf
         WritePixel 64+i,64+j,col,PlBuf
         WritePixel 64-j,64-i,col,PlBuf
         WritePixel 64-j,64+i,col,PlBuf
         WritePixel 64+j,64-i,col,PlBuf
         WritePixel 64+j,64+i,col,PlBuf
      Next
   Next
   UnlockBuffer PlBuf
   Color 0,255,0
   SetBuffer PlBuf
   Rect 0,0,128,128,0
   SetBuffer BackBuffer()
   Color 255,255,255
   ScaleTexture PlTex,5,5
   Return PlTex
End Function

Function CreateSKYTex()
   Local SkyTex = CreateTexture(1024,1024)
   Local SkyBuf = TextureBuffer(SkyTex)
   SetBuffer SkyBuf
      Color 0,100,200
      Rect 0,0,1024,1024
      Color 255,255,255
      For i = 1 To Rand(5,10)
         xx = Rand(0,1024)
         yy = Rand(0,1024)
         For j = 1 To Rand(5,10)
            r = Rand(-200,200)
            rad = Rand(50,200)
            Oval xx+r,yy+r,rad,rad
         Next
      Next
   SetBuffer BackBuffer()
   Return SkyTex
End Function


Bei mir laüft dieser Code mit ~25 FPS...

lg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
  • Zuletzt bearbeitet von ToeB am So, Okt 19, 2008 10:41, insgesamt einmal bearbeitet

Nicdel

BeitragSo, Okt 19, 2008 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
20 FPS. Wenn man jetzt noch bei jedem Schleifendurchlauf kleine weiße Kreise auf die Bodentextur zeichnet, wirds noch echter...

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group